With item bitmaps and dyes out of the way, it’s finally time to begin work on paper dolls. The concept of layering cutouts of clothing and other accessories over a figure is centuries old, and a perfect solution for early video games where memory was at a premium. Daggerfall’s paper doll system is easily one of the most extensive to be found in video games of the time.
Before equipping anything to the paper doll, a few key pieces had to be researched.
- Body Morphology. Every bit of armour and clothing has 8 variations to suit the male and female body shapes of Argonians, Elves, Humans, and Khajiit. The correct texture set must be mapped to the correct race and gender.
- Position. The X, Y coordinates of each item on paper doll is coded into their texture files. This is tightly coupled to morphology.
- Draw Order. Every item template has a value to determine the correct item rendering order on paper doll.
- Equip Table. The equipment slots available to player and rules for what is equipped where.
I won’t go into detail about the first three, that information is just managed by the API as part of importing or generating items. The equip table is a little interesting however with a total of 27 slots available. I use the same index setup as Daggerfall itself.
- 00 Amulet0 (amulets, torcs, etc.)
- 01 Amulet1
- 02 Bracelet0
- 03 Bracelet1
- 04 Ring0
- 05 Ring1
- 06 Bracer0
- 07 Bracer1
- 08 Mark0
- 09 Mark1
- 10 Crystal0
- 11 Crystal1
- 12 Head (helms)
- 13 RightArm (right pauldron)
- 14 Cloak1 (casual cloak, formal cloak)
- 15 LeftArm (left pauldron)
- 16 Cloak2
- 17 ChestClothes (shirt, straps, armbands, eodorics, tunics, surcoats, robes, etc.)
- 18 ChestArmor (cuirass)
- 19 RightHand (right-hand weapon, two-hand weapon)
- 20 Gloves (gauntlets)
- 21 LeftHand (left-hand weapon, shield)
- 22 Unknown1
- 23 LegsArmor (greaves)
- 24 LegsClothes (khajiit suits, loincloths, skirts, etc.)
- 25 Unknown2
- 26 Boots (boots, shoes, sandals, etc.)
The two unknowns could just be reserved indices as I was unable to find any equipment Daggerfall mapped to these slots. If there’s more to this, I’m confident it will be found in future testing.
As usual the API handles equipping items for developer, it’s easy as calling EquipItem(item) on the entity’s equip table. If an item of that type is already equipped, it will be dropped in the next compatible slot (if one is free) or swap out an existing item based on swap rules for that item template.
Now that we know which items the player has equipped, the textures to use, and their position and draw order, it’s fairly trivial to start layering down bitmaps onto the paper doll. But as usual, a couple of additional problems must be solved.
First up are cloaks, which have both interior and exterior parts drawn at different stages of the build. The below image shows how the two parts work together.
The interior is drawn first, then the avatar, then the cloak exteriors. It’s actually possible to wear two formal or casual cloaks in Dagerfall (slots 14 and 16). Note: the above image was taken prior to order being fixed which is why the loincloth is slightly eroded in first and third images.
Our next problem is masking. Daggerfall has a special mask index allocated to hide hair that would otherwise be drawn outside of helmets. During the build process, the mask becomes transparent and overwrites anything else in that position. Masking is used for both helmets and hooded robes/cloaks.
Other items can then be drawn based on their draw order. The below animation shows a step-by-step paper doll build after sorting items by draw order.
Now that items are equipped, we need a way of removing them again. Daggerfall allows you to click directly on paper doll itself to remove an item from your avatar. This is accomplished by creating a special selection mask where each pixel is an index mapping to 0-26 on the equip table above. This isn’t actually visible, it’s just an array sampled when player clicks on paper doll. Following is how the selection mask looks when rendered out to an image using grey values to represent indices. Each grey value maps to an item slot on paper doll.
I’m finally nearing the end of initial item support in Daggerfall Unity. There is still much to do (loot tables, shops, dropping items, repairing, storing items, effects, and so on) but those problems can each be tackled in turn. What I want to do now is clean up some code and begin a new test release cycle. This will allow me to fix any early bugs before moving onto the next stage of item support. I will post more news on this soon.