“Amok” is one of those strange words, but I’ll save that for another time.
HamQuest has 74 different items, which sounds like a lot if you’ve ever played the game, but really it isn’t, once you consider what an “item” in HamQuest really is.
An item is an object in which the player can interact. It is not a creature, which moves around and can attack you, it is not terrain, which is there no matter what.
The list of items breaks down into the following groups:
- Doors: 24.
- Keys: 7.
- Weapons: 5.
- Consumables: 3.
- Armors: 5.
- Treasures: 11.
- Chests: 1.
- Hiddens: 3.
- Traps: 3.
- Amulet: 1.
- Tools: 1.
- Megaham: 1.
- Exit: 1.
- Portal: 1.
- Light Sources: 3.
- Shoppes: 4.
Really this isn’t so much, as the various doors exist because there is one for each direction and one for each color, making fully a third of the items.
Also, treasures are really much the same, just giving differing amounts of gold, and so can be considered different subitems of the same item.
Which brought me to the point I found myself: managing a huge xml file with item descriptors, each with numerous xml tags.
At first, this wasn’t so bad, but as the list of items grew, it became more and more difficult to manage. If I added a new property, I had to add it 74 different places in the file. It was easy to lose track of what I did or didn’t do.
So I decided to split these off into their own files, and have the items.xml file point to the files they were in, like so:
<item file=”config/items/weapons/dagger.xml”/>
<item file=”config/items/weapons/shortsword.xml”/>
<item file=”config/items/weapons/longsword.xml”/>
<item file=”config/items/weapons/twohandedsword.xml”/>
And this was pretty neat. I could now more easily manage the items. Yes, it means that I now need to manage more files, but this is still a good idea.
Then I noticed in similar items that there is a lot of duplication in items that are similar.
I had already made it possible to do direct inheritance, because I recursed provided that the file=”” attribute in the file I loaded was there.
And I planned on using it, except that the first items in the list are the doors.
There are some properties shared by all doors: they don’t show up in inventory; they aren’t randomly placed in rooms; you can’t find one in a chest; and so on.
There are some properties shared by doors going east: they are all placed in a certain location.
There are some properties shared by all red doors: they are unlocked by red keys; they have the same messages when bumped into or opened.
So I decided to make it possible to inherit from multiple files, like so:
<item file=”config/items/doors/templates/all.xml,config/items/doors/templates/east.xml,config/items/doors/templates/red.xml,config/items/doors/red/east.xml”/>
<item file=”config/items/doors/templates/all.xml,config/items/doors/templates/north.xml,config/items/doors/templates/red.xml,config/items/doors/red/north.xml”/>
<item file=”config/items/doors/templates/all.xml,config/items/doors/templates/south.xml,config/items/doors/templates/red.xml,config/items/doors/red/south.xml”/>
<item file=”config/items/doors/templates/all.xml,config/items/doors/templates/west.xml,config/items/doors/templates/red.xml,config/items/doors/red/west.xml”/>
The order can be important. If a later loaded file has the same property, it replaces the original.
In this way, I have implemented prototype based multiple inheritance.