Base File Index
equals to :ref:`start-block` 0x2c0 (BFI)
Note
Information about data type you can access with official python documentation
Offset (from the begging) | Size/Type | Explain | Value |
---|---|---|---|
File General Header | |||
0x00 | 4 bytes c_char_p | Probably file format container | BND4 |
0x04 | 4 bytes c_uint32 | could be a separator | x00x00x00x00 |
0x08 | 4 bytes c_uint32 | Unknown data | |
0x0c | 4 bytes c_uint32 | Could be real block data stored in whole file | hex: 0xB dec: 11 |
0x10 | 4 bytes c_uint32 | Unknown data | |
0x14 | 4 bytes c_uint32 | could be a separator | x00x00x00x00 |
0x18 | 8 bytes c_char_p |
|
string: 00000001 |
0x20 | 4 bytes c_uint32 | Unknown data | hex: 0x20 dec: 32 |
0x24 | 4 bytes c_uint32 | could be a separator | x00x00x00x00 |
0x28 | 4 bytes c_uint32 | First data block offset from the of the file :ref:`start-block` | hex: 0x2c0 dec: 704 |
0x2c | 4 bytes c_uint32 | could be a separator | x00x00x00x00 |
0x30 | 4 bytes c_uint32 | Unknown data (0x0120->8193) | |
0x34, 0x38, 0x3c | 4 bytes * 3 c_uint32 | Unknown block of data: | x00x00x00x00 3 times |
Start containers header metadata (11 blocks) (datasheet below represents only 1 of 11th data blocks) | |||
0x40 | 4 bytes c_uint32 | Container Header separator High | hex: 0x50 dec: 80 |
0x44 | 4 bytes c_uint32 | Container Header separator Low | hex: 0xFFFF |
End of container header metadata | |||
Containers data 1 block example represented | |||
0x48 | 8 bytes c_ulong | Block data size (in bytes) | |
0x50 | 4 bytes c_uint32 | data block start offset from the file beginning | |
0x54 | 4 bytes c_uint32 | Unknown data, could be an some sort of offsets | |
0x58 | 4 bytes c_uint32 | Skip the amount of bytes when end of slot block has reached (4h->4) | hex: 0x04 dec: 04 |
0x5c | 4 bytes c_uint32 | could be a separator useless block or just 8 byte for 0x58 block | x00x00x00x00 |
End of Containers header data | |||
End of Containers | |||
0x1A0 => 0x2Bf
USER_DATA xxx representation
in following format |
|||
0x1A0 | 26 bytes c_char_p | string sequence | USER_DATA 000x00 |
0x1BA | 26 bytes c_char_p | string sequence | USER_DATA 001x00 |
And so on until
USER_DATA 010\x00 sequence |
|||
0x2bc | 4 bytes c_uint32 | separator | x00x00x00x00 |
End of File General Header |
Note
Slot block data contains very useful information, stats, items, deaths count
and so on. Char data offset means offsets from character start block.
0x2c0 + offset
for 1 slot character and so on.
Char data offset | Size/Type | Explain | Value |
---|---|---|---|
0x6c | 4 Bytes c_uint32 | Health bar current | Depends on stats 600 |
0x70 | 4 Bytes c_uint32 | Health bar | Depends on stats 600 |
0x74 | 4 Bytes c_uint32 | Health bar | Depends on stats 600 |
0x78 | 4 Bytes c_uint32 | Unknown data | 0x7d |
0x7c | 4 Bytes c_uint32 | Unknown data | 0x7d |
0x80 | 4 Bytes c_uint32 | Unknown data | 0x7d |
0x84 | 4 Bytes c_uint32 | Unknown data | 0x00000000 |
0x8c | 4 Bytes c_uint32 | Stamina 2 | Depends on stats max: 160 |
0x90 | 8 Bytes c_long | Stamina 3 | Depends on stats max: 160 |
0x98 | 8 Bytes c_long | Vitality | Depends on level and so on (30) |
0xa0 | 8 Bytes c_ulong | Attunement | Depends on level and so on (10) |
0xa8 | 8 Bytes c_ulong | Endurance | Depends on level and so on (50) |
0xb0 | 8 Bytes c_ulong | Strength | Depends on level and so on (50) |
0xb8 | 8 Bytes c_ulong | Dextirity | Depends on level and so on (20) |
0xc0 | 8 Bytes c_ulong | Intelligence | Depends on level and so on (10) |
0xc8 | 8 Bytes c_ulong | Faith | Depends on level and so on (10) |
0xd0 | 8 Bytes c_ulong | Unknown data | |
0xd8 | 8 Bytes c_ulong | Humanity | Depends on level and so on (00) |
0xe0 | 8 Bytes c_long | Resistance | Depends on level and so on (11) |
0xe8 | 4 Bytes c_uint32 | Level | Depends on level and so on (11) |
0xec | 4 Bytes c_uint32 | Souls | Depends on level and so on (9312) |
0xf0 | 8 Bytes c_ulong | Earned souls | Depends on level and so on (9991) |
0xf8 | 4 Bytes c_uint32 | Unknown data Could be separator | 0x00000000 |
0xfc | 4 Bytes c_uint32 | Soul statement: hollow, human (could be other state statuses) | 0x00000000 - human 0x00000008 - hollow |
0x100 | 28 Bytes c_char_p | Character's name | Depends on your imagination (Nick) |
skipped data (0x10e->0x121) | |||
0x122 | 1 Bytes c_bool | Male | Depends on your choice (1) |
0x126 | 1 Bytes c_uint8 | Class | Depends on your choice (6) |
0x127 | 1 Bytes c_uint8 | Body | Depends on your choice (0) |
0x128 | 1 Bytes c_uint8 | Gift | Depends on your choice (1) |
0x129 | 1 Bytes c_uint8 | Unknown data | |
0x12a | 1 Bytes c_uint8 | Unknown data | |
0x12b | 1 Bytes c_uint8 | Unknown data | |
0x12c | 4 Bytes c_uint32 | Unknown data | 0x00000000 |
0x130 | 4 Bytes c_uint32 | Unknown data | 0x00000000 |
0x134 | 4 Bytes c_uint32 | Unknown data | 0x00000000 |
0x138 | 4 Bytes c_uint32 | Unknown data | 0x00000000 |
0x13с | 4 Bytes c_uint32 | Unknown data | 0x00000000 |
0x140 | 4 Bytes c_uint32 | Unknown data | 0x00000000 |
0x144 | 4 Bytes c_uint32 | Unknown data | 0x00000000 |
0x148 | 4 Bytes c_uint32 | Unknown data | 0x00000000 |
0x14с | 4 Bytes c_uint32 | Unknown data | 0x00000000 |
0x150 | 4 Bytes c_uint32 | Unknown data | 0x00000000 |
0x154 | 4 Bytes c_uint32 | Unknown data | 0x00000000 |
0x158 | 1 Bytes c_uint8 | Poison resistance | Depends on your items and armour |
0x15c | 1 Bytes c_uint8 | Bleeding resistance | Depends on your items and armour |
0x160 | 1 Bytes c_uint8 | Poison resistance (could be repeated or something) | Depends on your items and armour |
0x164 | 1 Bytes c_uint8 | Damnation resistance | Depends on your items and armour |
0x168 | 1 Bytes c_uint8 | Face | Depends on your choice (6) |
0x16c | 1 Bytes c_uint8 | Face | Depends on your choice (6) |
0x16d | 1 Bytes c_uint8 | Hairs | Depends on your choice (6) |
0x16e | 1 Bytes c_uint8 | Color | Depends on your choice (6) |
skip | |||
0x228 | 4 Bytes c_uint32 | Left arrows slot | Unknown data type |
0x22c | 4 Bytes c_uint32 | Left bolts slot | Unknown data type |
0x230 | 4 Bytes c_uint32 | Right arrows slot | Unknown data type |
0x234 | 4 Bytes c_uint32 | Right bolts slot | Unknown data type |
0x238 | 4 Bytes c_uint32 | Unknown item slot? | Unknown data type |
0x23c | 4 Bytes c_uint32 | Unknown item slot? | Unknown data type |
0x240 | 4 Bytes c_uint32 | Unknown item slot? | Unknown data type |
0x244 | 4 Bytes c_uint32 | Unknown item slot? | Unknown data type |
0x248 | 4 Bytes c_uint32 | Unknown item slot? | Unknown data type |
0x24c | 4 Bytes c_uint32 | Left ring slot | Unknown data type |
0x250 | 4 Bytes c_uint32 | Right ring slot | Unknown data type |
0x254 | 4 Bytes c_uint32 | First quick slot item type | Unknown data |
0x258 | 4 Bytes c_uint32 | Second quick slot item type | Unknown data |
0x25c | 4 Bytes c_uint32 | Third quick slot item type | Unknown data |
0x260 | 4 Bytes c_uint32 | Fourth quick slot item type | Unknown data |
0x264 | 4 Bytes c_uint32 | Fifth quick slot item type | Unknown data |
0x268 | 4 Bytes c_uint32 | One hand/Double hand switcher weapon use | 0x00000001 - 1 hand 0x00000003 - doubled |
0x26c | 4 Bytes c_uint32 | Left hand weapon/shield flag | 0x00000001 or 0x00000000 |
0x270 | 4 Bytes c_uint32 | Right hand weapon/shield flag | 0x00000001 or 0x00000000 |
0x274 | 4 Bytes c_uint32 | Unknown flag, could possible switch something | 0x00000001 or 0x00000000 |
0x278 | 4 Bytes c_uint32 | Unknown flag, could possible switch something | 0x00000001 or 0x00000000 |
0x27c | 4 Bytes c_uint32 | Unknown flag, could possible switch something | 0x00000001 or 0x00000000 |
0x280 | 4 Bytes c_uint32 | Unknown flag, could possible switch something | 0x00000001 or 0x00000000 |
0x284 | 4 Bytes c_uint32 | Left hand weapon/shield first slot | Weapon/Armour type knife: 100015 |
0x288 | 4 Bytes c_uint32 | Left hand weapon/shield second slot | Weapon/Armour type knife: 100015 |
0x28c | 4 Bytes c_uint32 | Right hand weapon/shield first slot | Weapon/Armour type knife: 100015 |
0x290 | 4 Bytes c_uint32 | Right hand weapon/shield second slot | Weapon/Armour type knife: 100015 |
0x294 | 4 Bytes c_uint32 | Left arrows slot | Item type or 0xffffffff |
0x298 | 4 Bytes c_uint32 | Left bolts slot | Item type or 0xffffffff |
0x29с | 4 Bytes c_uint32 | Right arrows slot | Item type or 0xffffffff |
0x2a0 | 4 Bytes c_uint32 | Right bolts slot | Item type or 0xffffffff |
0x2a4 | 4 Bytes c_uint32 | Head wearing slot | Head (armour type) |
0x2a8 | 4 Bytes c_uint32 | Body wearing slot | Body (armour type) |
0x2ac | 4 Bytes c_uint32 | Hands wearing slot | Hands (armour type) |
0x2b0 | 4 Bytes c_uint32 | Legs wearing slot | Legs (armour type) |
0x2b4 | 4 Bytes c_uint32 | Something that points on some item in the inventory | Rings (item type) |
0x2b8 | 4 Bytes c_uint32 | Left ring slot | Rings (item type) |
0x2bc | 4 Bytes c_uint32 | Right ring slot | Rings (item type) |
0x2c0 | 4 Bytes c_uint32 | First quick slot item type | Any accessible item type (203 for ex.) |
0x2c4 | 4 Bytes c_uint32 | Second quick slot item type | Any accessible item type (203 for ex.) |
0x2c8 | 4 Bytes c_uint32 | Third quick slot item type | Any accessible item type (203 for ex.) |
0x2cc | 4 Bytes c_uint32 | Fourth quick slot item type | Any accessible item type (203 for ex.) |
0x2d0 | 4 Bytes c_uint32 | Fifth quick slot item type | Any accessible item type (203 for ex.) |
0x2d4 | 4 Bytes c_uint32 | Backpack items amount | Depends 34 |
0x2d8 | 4 Bytes c_uint32 | Unknown data | |
0x2dc | 4 Bytes c_uint32 | Unknown data | |
End of stats block | |||
0x2e0 | Start block for your backpack | ||
skip (each storage item allocates 4 * 7 bytes of space) see item storage block description below | |||
0xe2e0 | End block of your backpack last item storage points on 0xe2c4 | ||
skip | |||
0xe344 | 4 Bytes c_uint32 | Active spell slot | Depends on your sorcery slots amount and spells bind |
0xe35c | 4 Bytes c_uint32 | Active slot of something | Unknown type of data |
skip | |||
0x1f128 | 4 Bytes c_uint32 | Deaths | Depends on your skill :D (155) |
0x1f138 | 4 Bytes c_uint32 | Phantom encounters (PVP/Co-op/the likes) (may be) |
Note
0x2c starts with first character data. Character data is under heavily process of reverse engineering, so there is only some simple bunch of data represented withing different blocks/structures such like as :ref:`stats`, :ref:`items`.
Note
All character statistics depending on items/primary stats (vitality->resistance) are dynamicly-calculated type of data. So there's no reason to store it or modify it via runtime. Therefore only two of this type of data present in the table below. it's Capacity and Physical defence.
Note
General stats such like as Vitality, Attunement, Strength and so on stored in RAM with given offsets listed in 3rd table column. But their real address slightly different from save file one, be warned. For example if Vitality has 0x7C563C00 address then Attunement is certainly with 0x08 offset further and stored into 0x7C563C08
Parameter | Amount of memory entries (ingame) | Amount of store entries (save file) |
---|---|---|
Stamina | 3 slots, 4 byte | BFI + 0x88 (and 0x8c, 0x90) |
Vitality | 1 slot, 4 byte | BFI + 0x98 |
Attunement | 1 slot, 4 byte | BFI + 0xa0 |
Endurance | 1 slot, 4 byte | BFI + 0xa8 |
Strength | 1 slot, 4 byte | BFI + 0xb0 |
Dexterity | 1 slot, 4 byte | BFI + 0xb8 |
Intel. | 1 slot, 4 byte | BFI + 0xc0 |
Faith | 1 slot, 4 byte | BFI + 0xc8 |
Unknown | 1 slot, 4 byte (unsigned) | BFI + 0xd0 |
Humanity | 1 slot, 4 byte | BFI + 0xd8 |
Resistance | 1 slot, 4 byte | BFI + 0xe0 |
Level | 1 slot, 4 byte | BFI + 0xe8 |
Souls | 1 slot, 4 byte | BFI + 0xec |
Collected Souls | 1 slot, 4 byte | BFI + 0xf0 |
Name | 1 slot, 28 byte 13*2 = name, 1 = 0x00 | BFI + 0x100 |
Gender (male) | 1 slot, 1 byte 0 - female, 1 - male | BFI + 0x122 |
Class | 1 slot, 1 byte | BFI + 0x126 |
Body | 1 slot, 1 byte | BFI + 0x127 |
Gift | 1 slot, 1 byte | BFI + 0x128 |
Face | 1 slot, 1 byte | BFI + 0x16c |
Haris | 1 slot, 1 byte | BFI + 0x16d |
Color | 1 slot, 1 byte | BFI + 0x16e |
Deaths | 1 slot, 1 byte | BFI + 0x1f128 |
Dynamicly-calculated data | ||
Capacity | 2 slots 4 byte float (evaluateable) | Offsets don't concure with memory ones |
Physical defence | 6 slots 4 byte (evaluateable) | Offsets do not concure with memory offsets |
from ctypes import
weapon_proto_structure = {
'stored': c_uint32, # see table below
'type': c_uint32, # item type
'amount', c_uint32, # have amount
'position': c_uint32, # position?
'have': c_uint32, # have
'durability': c_uint32, # item durability
'durability_hits': c_uint32, # 0->9
}
Field | Possible values | Explanation |
---|---|---|
stored |
|
|
type | see :ref:`items-type` and so on | item/weapon/armour type |
amount | 0x00000000 to 0xFFFFFFFF probably | how much do you have it? |
position | some big numbers (didn't parsed for till moment) | could be some pointer or address for backpack navigation |
have | 0x00000001 or 0x00000000 yes or no | do you have it? |
durability | Depends on weapon or armour | Depends on item if it has dur. statement |
durability_hits | 0x00000000 to 0x00000009 | Stack counter from 0 to
9 each circle weapon
or armour losts its
durability point |
60 bytes each account entry
from ctypes import
weapon_proto_structure = {
'marker1': c_uint32, # (0x100) flag
'marker2': c_uint32, # (0x3400) flag
'byte_1': c_byte, # probably flag
'name': c_char_p(16), # char's name 14 + \x00 * 2
'byte_2': c_byte, # probably flag
'byte_3': c_byte, # probably flag
'byte_4': c_byte, # probably flag
'statement_1': c_uint32, # player's data
'statement_2': c_uint32, # player's data
'statement_3': c_uint32, # player's data
'statement_4': c_uint32, # player's data
'statement_5': c_uint32, # player's data
'statement_6': c_uint32, # player's data
'statement_7': c_uint32, # player's data
'statement_8': c_uint32, # player's data
}