Save Files - Diablo 2 Lod Character

Following the header is a variable-length block containing base stats and current stats (life, mana, stamina, etc.). The format uses a series of (StatID, Value) pairs terminated by 0x00 0x00.

Common StatIDs:

Example fragment (hex): 01 00 64 00 → Strength (ID 0x01) = 100 (0x64)

A .d2s file is a binary file. Key offsets (1.10+ LoD): diablo 2 lod character save files

| Offset | Size | Description | |--------|------|-------------| | 0 | 4 | File identifier (0xAA 0xAA 0xAA 0xAA for LoD 1.10+) | | 4 | 4 | Version (e.g., 0x60 0x00 0x00 0x00 for 1.10+) | | 8 | 32 | Character name (null-terminated) | | 40 | 4 | Status (0=normal, 1=expansion, 2=dead HC, etc.) | | 44 | 4 | Character class (0=Amazon, 1=Sorceress, 2=Necro, etc.) | | 48 | 4 | Level | | 52 | 4 | Strength | | 56 | 4 | Energy | | 60 | 4 | Dexterity | | 64 | 4 | Vitality | | 68 | 4 | Unused stat points | | 72 | 4 | Unused skill points | | ... | ... | Then follow: current stats (HP, mana, stamina), waypoints, quests, NPC dialogues, skills, inventory, stash, mercenary data, corpse, and iron golem info. |

📘 Inventory items are stored as raw item codes with attribute lists (a complex nested structure).


If you try to load a 1.09 character into a 1.14 installation: Following the header is a variable-length block containing


This is the most common error. It means the game engine loaded the .d2s file but encountered a mathematical impossibility.

The D2:LOD .d2s file is a remarkably compact binary format for its era, balancing storage efficiency (bit-packed skills, variable-length integers for item attributes) with extensibility (stat ID list, item code strings). Its reverse engineering has enabled a thriving modding and offline community for over two decades. However, the format’s age is evident in its lack of forward compatibility and reliance on a trivial checksum, making it vulnerable to corruption and easy editing—features that ultimately became part of the game’s enduring charm.


References


Appendix available upon request: Complete stat ID table, all item code mappings, and checksum test vectors.


The header contains the identity of the character.

  • File Size (Bytes 8–11): A 32-bit integer indicating the total file size.
  • Checksum (Bytes 12–15): This is the most common cause of "Bad Inventory Data."
  • Character Name (Bytes 20–35): A 16-byte block containing the ASCII name (up to 15 chars + null terminator).
  • The file contains a snapshot of your character’s entire state, including: Example fragment (hex): 01 00 64 00 →

    The file is saved automatically whenever you exit the game or when the game auto-saves at certain checkpoints.


    Two distinct blocks:

    No comments:

    Post a Comment

    Contact me

    Get in Touch
    Name
    Suriya Ravichandran
    Address
    Chennai,Tamilnadu
    Email
    rsuriya119@gmail.com
    Message me