Mod:Save Game Offset List

The UESPWiki – Your source for The Elder Scrolls since 1995
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.

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 RecordType

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
  • Weapon/Armor: MaterialList enumeration field (TBA)
  • Scroll (maybe parchment?): last 3 digits of book txt file
  • Sigil: EnchantmentID (the EnchantmentID value is also set)
  • Containers: Unknown purpose
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:

  • 0 apply to clothes
  • 1 to weapons
  • 2 to clothes, weapons, or armor
  • 3 to amulets (sigils)
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:

  • 02 = GoTo
  • 03 = Attack
  • 06 = Flee
  • 08 = Wander or follow PC (maybe?)
  • 09 = Do nothing
  • 0D = Hold position (might also be initiate conversation?)
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 ???