Mod:Save Game Offset List
An editor has requested for this article to be peer reviewed to receive a broader perspective on how it may be improved. Please make any edits as you see fit to help improve the quality of this article. |
Saved games in Battlespire are made up of 4 files: IMAGE.RAW SAVENAME.DAT SAVETREE.DAT SAVEVARS.DAT
Note: This page is currently under (a lot) of construction, cleaning up and converting my documentation into Wiki style tables to fill in each section will take a little time. The current Player/Item sections will be left until those tables are populated.
Contents
IMAGE.RAW[edit]
This is the mini screenshot that is shown while selecting the game to load. The image file is a headerless 80x50 15 bit raw image.
SAVENAME.DAT[edit]
This file is a 32 byte file that just contains the name given to the saved game (not the player).
SAVETREE.DAT[edit]
The SAVETREE.DAT file is the primary save game data file for Battlespire. The file begins with a 4 byte value that may be a file version and then is primarily composed of unordered records with no record index mapping, each record begins following the previous. Trailing that is an additional variable length section that I suspect may be control object related but have not verified yet.
RecordType[edit]
There are 9 known record types. All records of the same type are the same length and begin with a header, followed by the record's actual data.
TypeID | RecordLength | Name | Description |
---|---|---|---|
2 | 820 | Item | All objects that are items (can be picked up, equpped, etc), not the level's 3D objects (table, rug, etc) |
3 | 856 | Player | The player's personal details (attributes, skills, etc)
The player's inventory, known spells, etc are separate records of their specific type and linked to the player in the record header |
6 | 176 | Object | 3D objects such as rugs on floor, doors, levers/switchs, moveable platforms, etc.
Note: NPCs (like Chimere) are considered an object |
7 | 66 | Projectile | Short lived objects that exist for as long as the projectile is in motion/exists |
9 | 184 | Spell | These records are for spells known by the player, enchantments on items, and cast spell effects in some cases |
18 | 856 | Monster | Same length and mostly identical to the player record, with only a few different usages of some values
This will be documented together with the player record type with any known differences noted |
23 | 70 | Options | Believe this is a legacy data type left over from Daggerfall as only one game option appears to be saved here |
51 | 1270 | Automap | Large flag field that indicates what areas on the map have been discovered and should be displayed in the automap |
66 | 514 | Effect | Contains details on active spell effects for most spell's that have an effect with a duration
Confusion/Shield do not use this and store values on the player or monster record instead |
Header[edit]
All record types begin with a 65 byte header. The values are largely the same for all types with a few exceptions.
Offset | DataType | Name | Description |
---|---|---|---|
0 | u32 | RecordLength | Length of record - excludes self (i.e. length 100 would have a total length of 104 including this)
Size is always the same for each record type (possible Automap is variable in interiors, need to doublecheck in L5+) |
4 | u8 | Type | What the record is for, player/NPC share the same structure despite being different types
Enumeration value for |
5 | u16 | ViewPitch | ↕ - Also used for the hoizontal grid size on the automap record (51) |
7 | u16 | ViewYaw | ↔ - Also used for the vertical grid size on the automap record (51) |
9 | u16 | ViewRoll | ↻ - Generally only relevant for 3D objects |
11 | float | PositionX | East/West |
15 | float | PositionY | Up/Down - not North/South |
19 | float | PositionZ | North/South |
23 | u16 | Unknown_017 | Looks to be a flag field though it's usage and value meanings seems to depend on the record type |
25 | u32 | FileID | This is the ID number for the 3D file for objects defined in level BS6
T2/6 - Only set when standard record - content (116) and random are 0 Appears unused for T3/9 - Unknown purpose for T18 |
29 | u32 | Unknown_01D | Unknown |
33 | u32 | RecordID | Unique ID for each record, player is always 50C30000 (50000) |
37 | u32 | Unknown_025 | Timestamp for when used gem reappears |
41 | s16 | LinkID | Looks like it generates a number starting at 0 for each record that has a link - unsure how this actually ties to linked record |
43 | s16 | Unknown_02B | Similar to LinkID, it counts up from 0 but not sure purpose
It is primarily set on records that have links but does not match up with LinkID and counts far higher |
45 | u32 | Unknown_02D | Think this is when you started breathing underwater |
49 | u32 | Unknown_031 | These 3 are definitely related |
53 | u32 | Unknown_035 | but are somewhat odd where they appear to link to every other record |
57 | u32 | Unknown_039 | in an ownership chain (i.e. Creature > Item1 > Sack1 > Sack1Item1 > Sack1Item2) |
61 | u32 | ParentID | RecordID of parent (i.e. things the player is holding and known spells will have 50C30000 here, things in a chest will have the chest's ID)
Objects directly on the map (not carried or in chest/sack/etc) will have 1 (or occasionally 0?) |
Note: Offset is from beginning of the record, not the file.
Item[edit]
Item type objects. Of note, this type is fairly large as it has its own data as well as contains an object and a partial player/monster record type embedded in it as well. Descriptions for the embedded types will be largely skipped and can be found in the relevant record type section except where usage is unique for items.
Offset | DataType | Name | Description |
---|---|---|---|
0 | struct[65] | Header | Common record header structure
|
65 | char[32] | ItemName | Base item name, the added enchantment name is set separately
Note: For armor/clothes, the name is set from a value in the BSI file for that item (i.e. Sandals instead of the item name Boots) |
97 | u16 | ItemID | Enumeration field using ItemList (TBA) |
99 | char[9] | FileName | Only set for armor, clothes, and weapons - pretty sure this is 8 with a NULL terminator
First character is dynamic for male/female - armor numbering and clothes type/number appears to be randomly generated when not hardcoded item |
108 | u32 | Condition | |
112 | u32 | Condition_Max | |
116 | u16 | ModifierID | Multi use field
|
118 | u32 | Weight | Divide by 2 |
122 | s8 | SpellID | Enumeration value using SpellList (TBA) - Used by potions
Note: Enchantment spells are set towards the end |
123 | u32 | Unknown_07B | |
127 | u32 | Quantity | Stackable items (arrows/etc) |
131 | u16 | IsContainer | Boolean value set on sacks/chests/etc - odd it's 2 bytes so maybe 2x u8s but no usage of 2nd byte seen |
133 | u32 | BaseItemTypeID | Start of embedded Object record type |
137 | u32 | Unknown_089 | Usually only set when carried |
141 | u32 | Unknown_08D | Usually only set when carried |
145 | u32 | Unknown_091 | Usually only set when carried |
149 | u32 | Unknown_095 | Usually only set when carried |
153 | u32 | Unknown_099 | Usually only set when carried |
157 | float | UNK_X | |
161 | float | UNK_Y | |
165 | float | UNK_Z | |
169 | float | ItemX | |
173 | float | ItemY | |
177 | float | ItemZ | |
181 | u32 | RotatePitch | |
185 | u32 | RotateYaw | |
189 | u32 | RotateRoll | |
193 | u16 | Unknown_0C1 | May be 2 u8s - second byte is 06 if equipped by player |
195 | u32 | Unknown_0C3 | |
199 | u32 | Unknown_0C7 | |
203 | u32 | Unknown_0CB | |
207 | u32 | Unknown_0CF | |
211 | u32 | Unknown_0D3 | |
215 | u32 | Unknown_0D7 | |
219 | u32 | Unknown_0DB | |
223 | u32 | Unknown_0DF | |
227 | u32 | Unknown_0E3 | |
231 | u32 | Unknown_0E7 | |
235 | u32 | Unknown_0EB | |
239 | u32 | Unknown_0EF | |
243 | u8 | Unknown_0F3 | End of embedded Object record type |
244 | char[33] | EnchantmentName | Partial name that is tacked onto the enchanted item's name (i.e. "of Stupendous Ridiculousness")
Pretty sure this is 32 with a NULL terminator |
277 | u32 | EnchantmentItem | Matches to Item value in enchantment definition txts
As best I can tell:
|
281 | unknown[67] | Unknown_119 | No idea - since this is a partial character record it may be name padding (32) leaving 35 bytes before it or maybe a dummy header with two bytes padding somewhere? |
348 | u32 | Strength | Start of partial Player/Monster object record type data for enchanted items |
352 | u32 | Intelligence | Base values are used when enchanted items alter attributes/skills |
356 | u32 | Willpower | |
360 | u32 | Agility | |
364 | u32 | Endurance | |
368 | u32 | Personality | |
372 | u32 | Speed | |
376 | u32 | Luck | |
380 | u32 | Strength_Base | |
384 | u32 | Intelligence_Base | |
388 | u32 | Willpower_Base | |
392 | u32 | Agility_Base | |
396 | u32 | Endurance_Base | |
400 | u32 | Personality_Base | |
404 | u32 | Speed_Base | |
408 | u32 | Luck_Base | |
412 | u16 | SpellPoints | |
414 | u16 | SpellPoints_Max | |
416 | u16 | SpellPoints_Base | |
418 | u32 | Wounds | |
422 | u32 | Wounds_Max | |
426 | u32 | Wounds_Base | |
430 | u32 | Medical | |
434 | u32 | Medical_Count | |
438 | u32 | Medical_Base | |
442 | u32 | Jumping | |
446 | u32 | Jumping_Count | |
450 | u32 | Jumping_Base | |
454 | u32 | Lockpicking | |
458 | u32 | Lockpicking_Count | |
462 | u32 | Lockpicking_Base | |
466 | u32 | Stealth | |
470 | u32 | Stealth_Count | |
474 | u32 | Stealth_Base | |
478 | u32 | Swimming | |
482 | u32 | Swimming_Count | |
486 | u32 | Swimming_Base | |
490 | u32 | Backstabbing | |
494 | u32 | Backstabbing_Count | |
498 | u32 | Backstabbing_Base | |
502 | u32 | Dodging | |
506 | u32 | Dodging_Count | |
510 | u32 | Dodging_Base | |
514 | u32 | Running | |
518 | u32 | Running_Count | |
522 | u32 | Running_Base | |
526 | u32 | Destruction | |
530 | u32 | Destruction_Count | |
534 | u32 | Destruction_Base | |
538 | u32 | Restoration | |
542 | u32 | Restoration_Count | |
546 | u32 | Restoration_Base | |
550 | u32 | Illusion | |
554 | u32 | Illusion_Count | |
558 | u32 | Illusion_Base | |
562 | u32 | Alteration | |
566 | u32 | Alteration_Count | |
570 | u32 | Alteration_Base | |
574 | u32 | Thaumaturgy | |
578 | u32 | Thaumaturgy_Count | |
582 | u32 | Thaumaturgy_Base | |
586 | u32 | Mysticism | |
590 | u32 | Mysticism_Count | |
594 | u32 | Mysticism_Base | |
598 | u32 | ShortBlade | |
602 | u32 | ShortBlade_Count | |
606 | u32 | ShortBlade_Base | |
610 | u32 | LongBlade | |
614 | u32 | LongBlade_Count | |
618 | u32 | LongBlade_Base | |
622 | u32 | HandToHand | |
626 | u32 | HandToHand_Count | |
630 | u32 | HandToHand_Base | |
634 | u32 | Axe | |
638 | u32 | Axe_Count | |
642 | u32 | Axe_Base | |
646 | u32 | BluntWeapon | |
650 | u32 | BluntWeapon_Count | |
654 | u32 | BluntWeapon_Base | |
658 | u32 | Missile | |
662 | u32 | Missile_Count | |
666 | u32 | Missile_Base | |
670 | u32 | CriticalStrike | |
674 | u32 | CriticalStrike_Count | |
678 | u32 | CriticalStrike_Base | |
682 | char[24] | ClassName | Not set but assuming that's what it is based on location/size |
706 | u8 | Resistance | These do not appear to used when applying an enchantment advantage/disadvantage - base values are used instead |
707 | u8 | Immunity | |
708 | u8 | AcuteHearing | |
709 | u8 | SpellAbsorption | |
710 | u8 | RapidHealing | |
711 | u8 | RegenerateHealth | |
712 | u8 | RegenerateSPs | |
713 | u8 | Athleticism | |
714 | u32 | IncreaseMagery | |
718 | u8 | AdrenalineRush | |
719 | u8 | LowTolerance | |
720 | u8 | CriticalWeakness | |
721 | u8 | NoRegenOfSpellPoints | |
722 | u8 | ForbiddenWeapons | |
723 | u8 | ForbiddenArmor | |
724 | u8 | ForbiddenShield | |
725 | u8 | ForbiddenMaterial | |
726 | char[24] | ClassName_Base | Not set but assuming that's what it is based on location/size |
750 | u8 | Resistance_Base | |
751 | u8 | Immunity_Base | |
752 | u8 | AcuteHearing_Base | |
753 | u8 | SpellAbsorption_Base | |
754 | u8 | RapidHealing_Base | |
755 | u8 | RegenerateHealth_Base | |
756 | u8 | RegenerateSPs_Base | |
757 | u8 | Athleticism_Base | |
758 | u32 | IncreaseMagery_Base | Doesn't appear this will lower the value (i.e. player has 3x and item is 1.5x, player will still have 3x value) |
762 | u8 | AdrenalineRush_Base | |
763 | u8 | LowTolerance_Base | |
764 | u8 | CriticalWeakness_Base | |
765 | u8 | NoRegenOfSpellPoints_Base | |
766 | u8 | ForbiddenWeapons_Base | |
767 | u8 | ForbiddenArmor_Base | |
768 | u8 | ForbiddenShield_Base | |
769 | u8 | ForbiddenMaterial_Base | |
770 | u8 | ArmorValue1 | This and next byte are only set on armor/clothes but not if the item is enchanted? |
771 | u8 | ArmorValue2 | Appears to be the last digit of file name for armor - may make sense based on squirrelly way armor is handled |
772 | u16 | Unknown_304 | Not really sure if 16, assuming from gap till enchantment stuff - FF00 for all except sigils which are 0000 |
774 | u32 | Unknown_306 | |
778 | u32 | Unknown_30A | |
782 | s8 | CastOnEquip | Enumeration field using SpellList (TBA) |
783 | s8 | CastOnUse | Enumeration field using SpellList (TBA) |
784 | s8 | CastOnStrike | Enumeration field using SpellList (TBA) |
785 | s8 | Magnitude | Referred to as that in guide but assuming it's actually the level passed to the spell formula |
786 | s8 | Element | Enumeration field using ElementEnchantmentList (TBA)
Guessing it's just to control the casting animation when set on inapplicable spells |
787 | u32 | EnchantmentCharges | |
791 | u32 | EnchantmentCharges_Max | |
795 | u32 | Unknown_31B | |
799 | u32 | Unknown_31F | |
803 | u32 | EnchantmentID | Refers to ID value in MG0_GEN & MG2_SPC text files |
807 | u32 | Unknown_327 | |
811 | u32 | Unknown_32B | |
815 | u32 | Unknown_32F | |
819 | u8 | Unknown_333 | A few semi-randomly have 96 (150) set, mostly containers but also set on a scroll? |
Player/Monster[edit]
Player and Monster type objects. These are largely the same but instances where they differ are noted.
Offset | DataType | Name | Description |
---|---|---|---|
0 | struct[65] | Header | Common record header structure
|
65 | char[32] | Name | |
97 | u32 | Strength | These are current values with temporary effects (spells, enchanted equipment, etc) applied |
101 | u32 | Intelligence | |
105 | u32 | Willpower | |
109 | u32 | Agility | |
113 | u32 | Endurance | |
117 | u32 | Personality | |
121 | u32 | Speed | |
125 | u32 | Luck | |
129 | u32 | Strength_Base | Base values are the original character values with no temporary effects |
133 | u32 | Intelligence_Base | |
137 | u32 | Willpower_Base | |
141 | u32 | Agility_Base | |
145 | u32 | Endurance_Base | |
149 | u32 | Personality_Base | |
153 | u32 | Speed_Base | |
157 | u32 | Luck_Base | |
161 | u16 | SpellPoints | |
163 | u16 | SpellPoints_Max | Max values should be self explanatory if you have any hope of parsing this mess |
165 | u16 | SpellPoints_Base | |
167 | s32 | Wounds | |
171 | s32 | Wounds_Max | |
175 | s32 | Wounds_Base | |
179 | u32 | Medical | |
183 | u32 | Medical_Count | Count values are just basic counters of how many times the skill has been used to determine when to level it up |
187 | u32 | Medical_Base | |
191 | u32 | Jumping | |
195 | u32 | Jumping_Count | |
199 | u32 | Jumping_Base | |
203 | u32 | Lockpicking | |
207 | u32 | Lockpicking_Count | |
211 | u32 | Lockpicking_Base | |
215 | u32 | Stealth | |
219 | u32 | Stealth_Count | |
223 | u32 | Stealth_Base | |
227 | u32 | Swimming | |
231 | u32 | Swimming_Count | |
235 | u32 | Swimming_Base | |
239 | u32 | Backstabbing | |
243 | u32 | Backstabbing_Count | |
247 | u32 | Backstabbing_Base | |
251 | u32 | Dodging | |
255 | u32 | Dodging_Count | |
259 | u32 | Dodging_Base | |
263 | u32 | Running | |
267 | u32 | Running_Count | |
271 | u32 | Running_Base | |
275 | u32 | Destruction | |
279 | u32 | Destruction_Count | |
283 | u32 | Destruction_Base | |
287 | u32 | Restoration | |
291 | u32 | Restoration_Count | |
295 | u32 | Restoration_Base | |
299 | u32 | Illusion | |
303 | u32 | Illusion_Count | |
307 | u32 | Illusion_Base | |
311 | u32 | Alteration | |
315 | u32 | Alteration_Count | |
319 | u32 | Alteration_Base | |
323 | u32 | Thaumaturgy | |
327 | u32 | Thaumaturgy_Count | |
331 | u32 | Thaumaturgy_Base | |
335 | u32 | Mysticism | |
339 | u32 | Mysticism_Count | |
343 | u32 | Mysticism_Base | |
347 | u32 | ShortBlade | |
351 | u32 | ShortBlade_Count | |
355 | u32 | ShortBlade_Base | |
359 | u32 | LongBlade | |
363 | u32 | LongBlade_Count | |
367 | u32 | LongBlade_Base | |
371 | u32 | HandToHand | |
375 | u32 | HandToHand_Count | |
379 | u32 | HandToHand_Base | |
383 | u32 | Axe | |
387 | u32 | Axe_Count | |
391 | u32 | Axe_Base | |
395 | u32 | BluntWeapon | |
399 | u32 | BluntWeapon_Count | |
403 | u32 | BluntWeapon_Base | |
407 | u32 | Missile | |
411 | u32 | Missile_Count | |
415 | u32 | Missile_Base | |
419 | u32 | CriticalStrike | |
423 | u32 | CriticalStrike_Count | |
427 | u32 | CriticalStrike_Base | |
431 | u32 | ShieldEffect | Shield spell magnitude |
435 | u32 | ActiveSpells | Bit array enumeration field using SpellArray (TBA)
Not really applicable to player but allows for permanent spells effects on NPCs (they do work on player if hex edited in though) |
439 | u32 | Level_Enemy | |
443 | char[24] | ClassName | |
467 | u8 | Resistance | Bit array enumeration field using ElementArray (TBA) |
468 | u8 | Immunity | Bit array enumeration field using ElementArray (TBA) |
469 | bool | AcuteHearing | |
470 | bool | SpellAbsorption | |
471 | bool | RapidHealing | |
472 | bool | RegenerateHealth | |
473 | bool | RegenerateSPs | |
474 | bool | Athleticism | |
475 | u32 | IncreaseMagery | Calculated as Val / 256
Note: this is the only adv/dis that must have a value set - default 00010000 (1x) |
479 | bool | AdrenalineRush | |
480 | u8 | LowTolerance | Bit array enumeration field using ElementArray (TBA) |
481 | u8 | CriticalWeakness | Bit array enumeration field using ElementArray (TBA) |
482 | bool | NoRegenOfSpellpoints | |
483 | u8 | ForbiddenWeapons | Bit array enumeration field using WeaponArray (TBA)
I'll note that forbidden use of long blades does not prevent you from using the Spear of Bitter Mercy/Broadsword of the Moon Reiver |
484 | u8 | ForbiddenArmor | Enumeration field using ArmorList (TBA)
Somewhat misleading but leaving name to match adv/dis screen, this is actually the max level of armor you can use So a value of 3 (heavy) means you can use all armor types, a value of 2 (medium) means you can use light & medium I'll note that setting to "No armor allowed" does not prevent you from wearing the Savior's Hide armor |
485 | bool | ForbiddenShield | Unused (no shields in BS) but can be added by clicking empty space directly below the No regen. of Spellpoints checkbox - it actually costs you 300 points to add for some reason |
486 | u8 | ForbiddenMaterial | Enumeration field using MaterialList (TBA)
Also misleading but leaving name to match adv/dis screen, this is actually the max level you can use So a value of 7 (ebony) means you can use everything up to and including ebony - orcish and daedric are what is actually forbidden |
487 | u8 | PrimarySkill1 | Enumeration fields using SkillList (TBA) |
488 | u8 | PrimarySkill2 | |
489 | u8 | PrimarySkill3 | |
490 | u8 | MajorSkill1 | |
491 | u8 | MajorSkill2 | |
492 | u8 | MajorSkill3 | |
493 | u8 | MinorSkill1 | |
494 | u8 | MinorSkill2 | |
495 | u8 | MinorSkill3 | |
496 | u8 | MinorSkill4 | |
497 | u8 | MinorSkill5 | |
498 | u8 | MinorSkill6 | |
499 | char[24] | ClassName_Base | Really not sure why they keep this specific base value |
523 | u8 | Resistance_Base | Bit array enumeration field using ElementArray (TBA) |
524 | u8 | Immunity_Base | Bit array enumeration field using ElementArray (TBA) |
525 | bool | AcuteHearing_Base | |
526 | bool | SpellAbsorption_Base | |
527 | bool | RapidHealing_Base | |
528 | bool | RegenerateHealth_Base | |
529 | bool | RegenerateSPs_Base | |
530 | bool | Athleticism_Base | |
531 | u32 | IncreaseMagery_Base | |
535 | bool | AdrenalineRush_Base | |
536 | u8 | LowTolerance_Base | Bit array enumeration field using ElementArray (TBA) |
537 | u8 | CriticalWeakness_Base | Bit array enumeration field using ElementArray (TBA) |
538 | bool | NoRegenOfSpellpoints_Base | |
539 | u8 | ForbiddenWeapons_Base | Bit array enumeration field using WeaponArray (TBA)
I'll note that forbidden use of long blades does not prevent you from using the Spear of Bitter Mercy/Broadsword of the Moon Reiver |
540 | u8 | ForbiddenArmor_Base | Enumeration field using ArmorList (TBA)
Somewhat misleading but leaving name to match adv/dis screen, this is actually the max level of armor you can use So a value of 3 (heavy) means you can use all armor types, a value of 2 (medium) means you can use light & medium I'll note that setting to "No armor allowed" does not prevent you from wearing the Savior's Hide armor |
541 | bool | ForbiddenShield_Base | Unused (no shields in BS) but can be added by clicking empty space directly below the No regen. of Spellpoints checkbox - it actually costs you 300 points to add for some reason |
542 | u8 | ForbiddenMaterial_Base | Enumeration field using MaterialList (TBA)
Also misleading but leaving name to match adv/dis screen, this is actually the max level you can use So a value of 7 (ebony) means you can use everything up to and including ebony - orcish and daedric are what is actually forbidden |
543 | u8 | PrimarySkill1_Base | Enumeration fields using SkillList (TBA) |
544 | u8 | PrimarySkill2_Base | |
545 | u8 | PrimarySkill3_Base | |
546 | u8 | MajorSkill1_Base | |
547 | u8 | MajorSkill2_Base | |
548 | u8 | MajorSkill3_Base | |
549 | u8 | MinorSkill1_Base | |
550 | u8 | MinorSkill2_Base | |
551 | u8 | MinorSkill3_Base | |
552 | u8 | MinorSkill4_Base | |
553 | u8 | MinorSkill5_Base | |
554 | u8 | MinorSkill6_Base | |
555 | u32 | Unknown_22B | 00 until enter combat - unknown purpose |
559 | u32 | Unknown_22F | Initially set to FEFFFFFF (-2) for player, all 00s for NPCs - NPCs update while attacking - small values, only -2, 0, & 1 seen |
563 | u32 | CombatTimestamp | Pretty sure this a timestamp for when they started attacking/pursuing you |
567 | u32 | Unknown_237 | Not sure, seems like maybe a countdown or something - interest/chase timer? |
571 | u32 | Unknown_23B | |
575 | u8 | HotkeyF1 | Enumeration fields using SpellList (TBA) if mapped to spell, when mapped to item it uses a pointer starting at 64 through 71 to point to the item's RecordID starting at offset 808 |
576 | u8 | HotkeyF2 | |
577 | u8 | HotkeyF3 | |
578 | u8 | HotkeyF4 | |
579 | u8 | HotkeyF5 | |
580 | u8 | HotkeyF6 | |
581 | u8 | HotkeyF7 | |
582 | u8 | HotkeyF8 | |
583 | u32 | Unknown_247 | For player, appears to have something to do with jumping/falling/flying set to CCF9FFFF while jumping - destination/trajectory or speed?
For monsters, is populated on death - unknown what value maps to |
587 | u32 | AvailableSkillPoints | More like leftover, not available until next level up/transition |
591 | float | PlayerLastSeenX | Looks to be the location (from header) where an NPC last saw the character |
595 | float | PlayerLastSeenY | If you sneak away the value will remain until you're spotted again |
599 | float | PlayerLastSeenZ | |
603 | float | UnknownPosX1 | Unsure, only seen set on enemies and is generally close but not the player position, maybe a goto position |
607 | float | UnknownPosY | |
611 | float | UnknownPosX2 | No idea - where I've seen these 3 set, this has been the same value as X1 and not in an area where the coordinates would plausibly allow a coincidental match with the Z and X values |
615 | u32 | Flags | Not sure if this is full u32 or a u16 with another u16 or 2xu8s following - not seen the last 2 bytes with a value set |
619 | u32 | Target | Looks like a target enemy type - value of 08 - targets player - set to 00 when on PCTeam |
623 | u32 | Team | Normally 00, set to 01 or 02 when on PCTeam - Maybe other values exist for Red/Blue team in multiplayer or L4 with ice/fire daedra infighting? |
627 | u32 | Goal | Current goal or activity - 02/03/06/08/09/0D seen
Enumeration list (or possibly bitarray?) not created yet for these as I'm guessing on these values and behavior does not always seem to track but looks like:
|
631 | u32 | ConfigVolumeMusic | Music volume on player
Only seen set to 1 when Goal is 02 (goto (I think)) on NPCs |
635 | u32 | Unknown_27B | Number values seen could be directional (direction of goal?) or maybe countdown to reevaluate goal like x237 (assuming that's what that is or BS even does that) |
639 | u8 | Hair | Player only - value maps to the number on the image file for these 3 |
640 | u8 | Eyes | Number is 0 padded to 3 digits |
641 | u8 | Mouth | And combined with the file like: 'FBRMT' + RIGHT('000' + <Val>, 3) |
642 | u8 | Unknown_282 | |
643 | u32 | Unknown_283 | |
647 | u32 | Unknown_287 | |
651 | u32 | ConfigVolumeSound | Sound effect volume on player |
655 | u32 | EnemyType | Enumeration field using EnemyList (TBA) |
659 | u32 | LastAttackTimestamp1 | Last attack timestamp |
663 | u32 | LastAttackTimestamp2 | Not sure exactly, usually the same timestamp as previous but sometimes a few milliseconds different (both +-) |
667 | u16 | EquippedWeaponItemID | Enumeration field using WeaponList (TBA)
Equipped weapon type ID - value remains if unequipped until new weapon type is equipped - ID refers to WeaponTable, not Item - 15 = HtH |
669 | u8 | Unknown_29D | |
670 | u8 | Race | Enumeration field using RaceList (TBA) - Player only |
671 | u8 | Unknown_29F | |
672 | u8 | Unknown_2A0 | Guessing last attack roll |
673 | u32 | EquippedWeaponRecordID | |
677 | u32 | Unknown_2A5 | |
681 | u32 | AC_Helmet | For player this is the defense value of the equipped armor of that type |
685 | u32 | AC_Pauldron | For NPCs, their defense value is applied to all types |
689 | u32 | AC_Cuirass | Meaning a Scamp will have 2 applied to Helmet/Pauldron/Cuirass/etc |
693 | u32 | AC_Greave | |
697 | u32 | AC_Gauntlet | |
701 | u32 | AC_Boot | |
705 | u32 | AC_Shield | Unused for player - this is set for NPCs (no idea if it actually gets applied/considered in combat calculations) |
709 | u32 | Unknown_2C5 | |
713 | u32 | LastHitYaw | Looks to be the yaw angle they were hit from |
717 | u32 | Unknown_2CD | Since these 4 look to be last hit info, maybe the last hit's defense roll? |
721 | u32 | LastHitTimestamp1 | Timestamp of when last hit |
725 | u32 | LastHitTimestamp2 | Not sure exactly, usually the same timestamp as previous but sometimes a tiny bit later (usually 150milli though other small values seen) |
729 | u32 | Unknown_2D9 | |
733 | s16 | View_Pitch | Appears to be a signed version of the pitch angle in the header |
735 | u8 | Unknown_2DF | |
736 | u32 | Level_Player | Not sure layout, this could be u8 and with a trailing 32 but going with u32 since enemy level is |
740 | u8 | Unknown_2E1 | Don't know for certain if previous is 32 and this is 8 or vise versa or some combo of 16s and 8s |
741 | u32 | Unknown_2E5 | Seem to always be set to 96 (150) on NPCs |
745 | u32 | Unknown_2E9 | Seem to always be set to 96 (150) on NPCs |
749 | u32 | Unknown_2ED | Seem to always be set to 96 (150) on NPCs |
753 | float | AnchorX | Teleport anchor position |
757 | float | AnchorY | All 00s if no anchor set |
761 | float | AnchorZ | |
765 | u32 | Unknown_2FD | |
769 | u32 | WaterBreathingExpireAt | Timestamp for when player runs out of breath - Water Breathing spell sets value at some point in future, otherwise set when going underwater based on swimming skill |
773 | s16 | Unknown_305 | Appears to be 11 s16s though is near always all FF (-1) for NPCs or 00 for player |
775 | s16 | Unknown_307 | |
777 | s16 | Unknown_309 | |
779 | s16 | Unknown_30B | |
781 | s16 | Unknown_30D | |
783 | s16 | Unknown_30F | |
785 | s16 | Unknown_311 | |
787 | s16 | Unknown_313 | |
789 | s16 | Unknown_315 | |
791 | s16 | Unknown_317 | |
793 | s16 | Unknown_319 | |
795 | u32 | Unknown_31B | |
799 | u8 | Unknown_31F | Set to 1 when dead (NPCs) |
800 | u8 | Unknown_320 | Set to FF on player when first enters combat |
801 | u8 | ConfigTurnRate | Turn speed set in controls |
802 | u8 | Unknown_322 | |
803 | u32 | SAVEVARID | Record ordinal in SAVEVARS - looks to start at offset 0x1590 - No record if 00 - not sure how big this can get, this may be u8 and next is u32 |
807 | u8 | Unknown_327 | |
808 | u32 | HotkeyF1RecordID | 64 - RecordID of item when mapped to hotkey |
812 | u32 | HotkeyF2RecordID | 65 - RecordID of item when mapped to hotkey |
816 | u32 | HotkeyF3RecordID | 66 - RecordID of item when mapped to hotkey |
820 | u32 | HotkeyF4RecordID | 67 - RecordID of item when mapped to hotkey |
824 | u32 | HotkeyF5RecordID | 68 - RecordID of item when mapped to hotkey |
828 | u32 | HotkeyF6RecordID | 69 - RecordID of item when mapped to hotkey |
832 | u32 | HotkeyF7RecordID | 70 - RecordID of item when mapped to hotkey |
836 | u32 | HotkeyF8RecordID | 71 - RecordID of item when mapped to hotkey |
840 | u32 | Unknown_34B | |
844 | u32 | ConfusionExpireAt | Timestamp for the confusion effect to expire |
848 | u32 | Unknown_353 | |
852 | u32 | Unknown_357 |
Object[edit]
Non-item 3D objects. This type is not very well understood.
Offset | DataType | Name | Description |
---|---|---|---|
0 | struct[65] | Header | Common record header structure
|
65 | u32 | BaseTypeID | Unique identifier for each item/object type (i.e. all daggers will have the same value, regardless of anything else, material, enchantments, etc) |
69 | u32 | Unknown_49 | These are near always all 00 |
73 | u32 | Unknown_4D | When embedded in item record, these values are populated once picked up |
77 | u32 | Unknown_51 | So assuming some sort of record link |
81 | u32 | Unknown_55 | |
85 | u32 | Unknown_59 | |
89 | float | UNK_X | I'm not clear what these 3 are used for |
93 | float | UNK_Y | They are definitely position related and sometimes close to object's position |
97 | float | UNK_Z | Though often completely different |
101 | float | ObjectX | Matches with header |
105 | float | ObjectY | Unclear why it is duplicated |
109 | float | ObjectZ | Maybe base/start position? |
113 | u32 | RotatePitch | Matches with header |
117 | u32 | RotateYaw | Unclear why it is duplicated and 32 bit value instead of 16 |
121 | u32 | RotateRoll | Maybe base/start angle? |
125 | u16 | Unknown_81 | |
127 | u32 | Unknown_83 | I'm really not clear what these values are and just using u32s as a default as they definitely are in blocks of 4 or a bunch of blocks with pairs of 16s |
131 | u32 | Unknown_87 | Suspect they may be scaling values |
135 | u32 | Unknown_8B | But could be anything really |
139 | u32 | Unknown_8F | What I know about 3D models could fill a thimble halfway |
143 | u32 | Unknown_93 | Making this section mostly guesses to begin with |
147 | u32 | Unknown_97 | Probably just need to stand in front of one and then start messing with the values and see what happens |
151 | u32 | Unknown_9B | |
155 | u32 | Unknown_9F | |
159 | u32 | Unknown_A3 | |
163 | u32 | Unknown_A7 | |
167 | u32 | Unknown_AB | |
171 | u32 | Unknown_AF | |
175 | u8 | Unknown_B3 |
Projectile[edit]
Short lived objects that exist for as long as the projectile is in motion/exists.
This type is only 1 byte long and every instance seen is always 0x96 (150). It is always linked to the cast spell in the header so my assumption is that this is a shell record with the real data being the positioning data in the header.
Spell[edit]
Primarily spells known by the player but a few spells, like Delayed Damage, will create a record where cast to function as the anchor/mine that is removed once triggered.
Offset | DataType | Name | Description |
---|---|---|---|
0 | struct[65] | Header | Common record header structure
|
65 | char[32] | Name | |
97 | u8 | SpellID | Enumeration field using SpellList (TBA) |
98 | u8 | TargetType | Enumeration field using SpellTargetList (TBA) |
99 | u8 | Icon | Number of the SYMB spell icon to use - Unused spells are out of range - Valid values are 00-1A |
100 | u32 | DurationBase | 1 = 5000 milliseconds |
104 | u32 | DurationBonus | |
108 | u32 | DurationBonusLevel | Caster's level is divided by this value then multiplied by the bonus value
Always either 1 (bonus applied every level) or 2 (bonus applies every other level) |
112 | u32 | MagnitudeBaseMin | |
116 | u32 | MagnitudeBaseMax | |
120 | u32 | MagnitudeBonusMin | |
124 | u32 | MagnitudeBonusMax | |
128 | u32 | MagnitudeBonusLevel | Caster's level is divided by this value then multiplied by the bonus value; however, all applicable spells have a value of 1 so not really used |
132 | u32 | LastCastDuration | Not sure why it bothers storing these two, duration is reusable I guess |
136 | u32 | LastCastMagnitude | |
140 | u16 | IconBase | Default/original icon for the spell (from EXE table) - functions same as Icon above - u16 for some reason? |
142 | u8 | Element | Enumeration field using ElementSpellList (TBA) |
143 | u8 | Delivery | Enumeration field using SpellDeliveryList (TBA) |
144 | u32 | LastCastTarget | RecordID of the last target - Self targetted spells will be 50C3 (player RecordID)
Appears to be 1000F0F8 if never cast or cast at range (maybe just if you missed in that case) Projectile records reference the caster |
148 | float | HeadingX | Projectile spell record heading in radians |
152 | float | HeadingY | Projectile spell record heading in radians |
156 | float | HeadingZ | Projectile spell record heading in radians |
160 | u32 | SPCost_Base | |
164 | u32 | SPCost_Current | Calculated cost based on relevant skill and selected delivery type |
168 | u32 | School | Enumeration field using SpellSchoolList (TBA)
Note: Separate enumeration from skill list, values are 0-5 |
172 | u32 | DetonationType | Enumeration field using SpellDetonationList (TBA)
Note: Manual is incorrect, this does not affect the casting cost |
176 | u32 | Unknown_0B0 | |
180 | u32 | ProjectileSpeed | Guessing here but likely the speed the projectile is traveling on its heading from origin |
Options[edit]
Likely a legacy data type left over from Daggerfall as only the fullscreen option is set here.
Offset | DataType | Name | Description |
---|---|---|---|
0 | struct[65] | Header | Common record header structure
|
65 | bool | IsFullscreen | This is the toggle for showing the bottom UI elements with character portrait or just the compass and health/spell point bars |
66 | u8 | Unknown_042 | Not sure how much this is really used as the only value I can see changed |
67 | u8 | Unknown_043 | When messing with all the config values available |
68 | u8 | Unknown_044 | Is the first byte when toggling between fullscreen and standard |
69 | u8 | Unknown_045 | May be legacy type leftover from Daggerfall |
Automap[edit]
Large flag field that indicates what areas on the map have been discovered and should be displayed in the automap. Of note, the grid size is defined in the header using the ViewPitch and ViewYaw values.
Offset | DataType | Name | Description |
---|---|---|---|
0 | struct[65] | Header | Common record header structure
|
65 | bool | Tile_00x00 | Each byte is 16x16 square on automap starting at top left and going across in rows until the bottom right that is flagged true once visited
Updated while walking - immediately opening map on new game will be empty |
… | bool | Tile_XXxYY | Not going to bother listing all of these |
1264 | bool | Tile_39x29 | Note: 16x16 grid size is only size seen but not all maps checked
So possible some of the small interior maps (mostly in L5) use different values |
1265 | u32 | Unknown_4F1 | Always seen empty (00000000) |
1269 | u8 | Unknown_4F5 | Always 96 (150) or 0 - unknown purpose |
Effect[edit]
Most spell effects that have a duration, excluding Monster Summoning and Water Breathing, will have an effect record that details the effect, start/end time, etc.
Offset | DataType | Name | Description |
---|---|---|---|
0 | struct[65] | Header | Common record header structure
|
65 | char[32] | Name | This is the spell's name |
97 | u16 | Unknown_061 | |
99 | s16 | StrengthModifier | Assume Strength spell will set this |
101 | padding[10] | All attributes/skills are broken into 12 byte blocks with 8 or 10 bytes of padding depending on the datatype (s16/s32) with the exception of Wounds which is a 10 byte block | |
111 | s16 | IntelligenceModifier | Probably trying to mimic the current/count/base layout used for skills in player records so assumed never used |
113 | padding[10] | Only Speed seen modified with the assumption Strength would be updated in multiplayer mode with Strength spell | |
123 | s16 | WillpowerModifier | |
125 | padding[10] | ||
135 | s16 | AgilityModifier | |
137 | padding[10] | ||
147 | s16 | EnduranceModifier | |
149 | padding[10] | ||
159 | s16 | PersonalityModifier | |
161 | padding[10] | ||
171 | s16 | SpeedModifier | Set by Haste/Slow |
173 | padding[10] | ||
183 | s16 | LuckModifier | |
185 | padding[10] | ||
195 | s16 | SpellPointModifiier | |
197 | padding[10] | ||
207 | s16 | WoundsModifier | |
209 | padding[8] | ||
217 | s32 | MedicalModifier | |
221 | padding[8] | ||
229 | s32 | JumpingModifier | |
233 | padding[8] | ||
241 | s32 | LockpickingModifier | |
245 | padding[8] | ||
253 | s32 | StealthModifier | |
257 | padding[8] | ||
265 | s32 | SwimmingModifier | |
269 | padding[8] | ||
277 | s32 | BackstabbingModifier | |
281 | padding[8] | ||
289 | s32 | DodgingModifier | |
293 | padding[8] | ||
301 | s32 | RunningModifier | |
305 | padding[8] | ||
313 | s32 | DestructionModifier | |
317 | padding[8] | ||
325 | s32 | RestorationModifier | |
329 | padding[8] | ||
337 | s32 | IllusionModifier | |
341 | padding[8] | ||
349 | s32 | AlterationModifier | |
353 | padding[8] | ||
361 | s32 | ThaumaturgyModifier | |
365 | padding[8] | ||
373 | s32 | MysticismModifier | |
377 | padding[8] | ||
385 | s32 | ShortBladeModifier | |
389 | padding[8] | ||
397 | s32 | LongBladeModifier | |
401 | padding[8] | ||
409 | s32 | HandToHandModifier | |
413 | padding[8] | ||
421 | s32 | AxeModifier | |
425 | padding[8] | ||
433 | s32 | BluntWeaponModifier | |
437 | padding[8] | ||
445 | s32 | MissileModifier | |
449 | padding[8] | ||
457 | s32 | CriticalStrikeModifier | |
461 | padding[8] | ||
469 | u32 | Unknown_1D5 | Appears to only be set on damage type spells/effects (Poison/ContinuousDamage) but only seen it set to FFFFFFFF (-1) |
473 | u32 | StartTime | Timestamp value for when the spell was cast
Appears to only be set on damage type spells/effects (Poison/ContinuousDamage) |
477 | u32 | ApplyInterval | Guessing - always seen as E803 (1000 or 1 second) for Poison/ContinousDamage |
481 | u32 | SpellIcon | +1 - Probably done so can be 0 if it shouldn't show icon (effect applied to enemy, etc) |
485 | u32 | ExpireAt | Timestamp value for when the effect ends |
489 | u32 | ActiveSpell | Bit array enumeration field using SpellArray (TBA) |
493 | u32 | Unknown_1ED | |
497 | u32 | Unknown_1F1 | |
501 | u32 | SpellResistanceEffect | Magnitude x10 |
505 | u32 | SpellAbsorptionEffect | Magnitude x10 |
509 | u32 | SpellReflectEffect | Magnitude x10 |
513 | u8 | Unknown_201 | Always seen set to 96 (150) on all effects except Etherealness, Haste, Jumping, & SlowFall which are 00 |
Spells with effects:
- Continuous Damage
- Detect Enemy
- Detect Invisibility
- Etherealness
- Fire Shield
- Haste
- Invisibility
- Jumping
- Poison
- Resistance
- Slow
- Slow Fall
- Spell Absorption
- Spell Reflection
- Spell Resistance
Note: Confusion & Shield do not use an effect record and have specific values on the character record
SAVETREE.VAR[edit]
To be filled out once SAVETREE.DAT is completed
Character Data Offsets[edit]
What follows is a list of offsets for the character data. It also works partially for mobs but not perfectly, indicating some difference between the two. These came from a variety of sources. Initially someone (Ken, jerry_fletcher@hotmail.com) emailed me some Battlespire modules for UGE, some sort of universal game editor. This gave me the basis for most of the attribute and skill offsets, but didn't describe the format very accurately. From hacking the game by creating classes with various attributes and looking at the savegame I was able to determine the other offsets in time.
The 'Normal' attribute and skills are the values when no spell or item modifies are in place. For example a characters natural Stealth is 45%. He/she puts on a pair of boots which modifies Stealth by +10%. Now their stealth is at 55% while their normal stealth value remains at 45%.
The 'Count' attribute is related to skill advancement. For instance, each time the character jumps this count is incremented. When it reaches a certain level the jumping skill increases and the count is reset.
The 'Offset' is the distance from the start of the character field, including the 4 bytes of block type characters.
The 'Field Size/Type' gives the size of the field. Long Integers are defined as 4 bytes while Integers are 2.
Offset | Field Name | Field Size/Type | Offset | Field Name | Field Size/Type | |
---|---|---|---|---|---|---|
69 | Name | 32 Characters? | 431 | Normal Critical Strike | Long Integer | |
101 | Strength | Long Integer | 447 | Class Name | 22 Characters | |
105 | Intelligence | Long Integer | 471 | Resistance | Character | |
109 | Willpower | Long Integer | 00001=Magic | |||
113 | Agility | Long Integer | 00010=Frost | |||
117 | Endurance | Long Integer | 00100=Fire | |||
121 | Personality | Long Integer | 01000=Shock | |||
125 | Speed | Long Integer | 10000=Poison | |||
129 | Luck | Long Integer | 484 | Immunity | Character | |
133 | Normal Strength | Long Integer | 00001=Magic | |||
137 | Normal Intelligence | Long Integer | 00010=Frost | |||
141 | Normal Willpower | Long Integer | 00100=Fire | |||
145 | Normal Agility | Long Integer | 01000=Shock | |||
149 | Normal Endurance | Long Integer | 10000=Poison | |||
153 | Normal Personality | Long Integer | 473 | Acute Hearing | Character | |
157 | Normal Speed | Long Integer | 00=No | |||
161 | Normal Luck | Long Integer | 01=Yes | |||
165 | Current SP | Integer | 474 | Spell Absorption | Character | |
167 | Max SP | Integer | 00=No | |||
169 | Normal Max SP | Integer | 01=Yes | |||
171 | Current Wounds | Long Integer | 475 | Rapid Healing | Character | |
175 | Max Wounds | Long Integer | 00=No | |||
179 | Normal Max Wounds | Long Integer | 01=Yes | |||
183 | ???Medical | Long Integer | 476 | Regenerate Health | Character | |
187 | ???Medical Count | Long Integer | 00=No | |||
191 | Normal ???Medical | Long Integer | 01=Yes | |||
195 | Jumping | Long Integer | 477 | Regenerate SP | Character | |
199 | Jumping Count | Long Integer | 00=No | |||
203 | Normal Jumping | Long Integer | 01=Yes | |||
207 | ???Lockpicking | Long Integer | 478 | Atheleticism | Character | |
211 | ???Lockpicking Count | Long Integer | 00=No | |||
215 | Normal ???Lockpicking | Long Integer | 01=Yes | |||
219 | Stealth | Long Integer | 480 | Spell Point Mult | Character | |
223 | Stealth Count | Long Integer | 483 | Adrenaline Rush | Character | |
227 | Normal Stealth | Long Integer | 00=No | |||
231 | Swimming | Long Integer | 01=Yes | |||
235 | Swimming Count | Long Integer | 484 | Low Tolerance | Character | |
239 | Normal Swimming | Long Integer | 00001=Magic | |||
243 | Backstabbing | Long Integer | 00010=Frost | |||
247 | Backstabbing Count | Long Integer | 00100=Fire | |||
251 | Normal Backstabbing | Long Integer | 01000=Shock | |||
255 | Dodging | Long Integer | 10000=Poison | |||
259 | Dodging Count | Long Integer | 485 | Critical Weakness | Character | |
263 | Normal Dodging | Long Integer | 00001=Magic | |||
267 | ???Running | Long Integer | 00010=Frost | |||
271 | ???Running Count | Long Integer | 00100=Fire | |||
275 | Normal ???Running | Long Integer | 01000=Shock | |||
279 | Destruction | Long Integer | 10000=Poison | |||
283 | Destruction Count | Long Integer | 486 | Regenerate Spell Points | Character | |
287 | Normal Destruction | Long Integer | 00=Yes | |||
291 | Restoration | Long Integer | 01=No | |||
295 | Restoration Count | Long Integer | 487 | Forbidden Weapon | Character | |
299 | Normal Restoration | Long Integer | 00001=Short | |||
303 | Illusion | Long Integer | 00010=Long | |||
307 | Illusion Count | Long Integer | 00100=Blunt | |||
311 | Normal Illusion | Long Integer | 01000=Axe | |||
315 | Alteration | Long Integer | 10000=Missile | |||
319 | Alteration Count | Long Integer | 488 | Forbidden Armor | Character | |
323 | Normal Alteration | Long Integer | 03=Heavy | |||
327 | Thaumaturgy | Long Integer | 02=Medium | |||
331 | Thaumaturgy Count | Long Integer | 01=Light | |||
335 | Normal Thaumaturgy | Long Integer | 490 | Forbidden Material | Character | |
339 | Mysticism | Long Integer | 09=Daedric | |||
343 | Mysticism Count | Long Integer | 08=Orcish | |||
347 | Normal Mysticism | Long Integer | etc.... | |||
351 | Short Blade | Long Integer | 503 | Class Name (again)? | 22 Characters | |
355 | Short Blade Count | Long Integer | 536 | Spell Point Mult | Character | |
359 | Normal Short Blade | Long Integer | 544 | Forbidden Armor | Character | |
363 | Long Blade | Long Integer | 546 | Forbidden Material | Character | |
367 | Long Blade Count | Long Integer | 619 | Gender | Character | |
371 | Normal Long Blade | Long Integer | 00=Male | |||
375 | Hand-to-Hand | Long Integer | 08=Female | |||
379 | Hand-to-Hand Count | Long Integer | 643 | Hair Picture # | Character | |
383 | Normal Hand-to-Hand | Long Integer | 644 | Mouth Picture # | Character | |
387 | Axe | Long Integer | 645 | Eye Picture # | Character | |
391 | Axe Count | Long Integer | 674 | Race (0-5) | Character | |
395 | Normal Axe | Long Integer | ||||
399 | Blunt Weapon | Long Integer | ||||
403 | Blunt Weapon Count | Long Integer | ||||
407 | Normal Blunt Weapon | Long Integer | ||||
411 | Missile | Long Integer | ||||
415 | Missile Count | Long Integer | ||||
419 | Normal Missile | Long Integer | ||||
423 | Critical Strike | Long Integer | ||||
427 | Critical Strike Count | Long Integer |
There are currently three unknown entries in the skill list. Their estimated values are given although this is not yet confirmed. They are based on the skill offset list found in Daggerfall. The skill order is the same except for the skills not found in Battlespire (like the language skills etc...). The running skill is quite certain, based on the position in the list and the fact that running potions exist in the game. The merchant skill is a best guess but other possibilities for this offset are either streetwise or etiquette. Similarly lock-picking may be replaced by pick-pocketing or mercantile. There is a possibility that a new skill exists at these locations, one not found in Daggerfall. Verification of these skills are still required (e-mail me!).
Item Data Offsets[edit]
The following is the list of known and some unknown variables found in the item block. Thanks to Cory Orndorff (orn9124@kutztown.edu) for sending me some offsets to get me started. Again, the 'Offset' is the distance from the beginning of the block, including the 4 byte block type.
Offset | Description | Size |
---|---|---|
69 | Name | 32 Characters? |
103 | Item ID | 8 |
MCAPE501=cape of type 501 | ||
MSHRT214=shirt of type 214 | ||
112 | Current Usage | 4 |
116 | Max Usage | 4 |
120 | Material / Damage modifier | ??? |
00=Iron | ||
01=Steel | ||
02=Silver | ||
03=Elven | ||
04=Dwarven | ||
05=Mithril | ||
06=Adamantium | ||
07=Ebony | ||
08=Orcish | ||
09=Daedric | ||
122 | Weight (1 bit=0.5 lbs) | 2 |
131 | Number of Items | ??? |
248 | Name continuation | ??? |