MSB map layouts
An MSB describes a map’s models and their occurrences, regions and events. A model entry names a resource; a part places it, so several parts can share one model. Parts also carry entity IDs used by event scripts. Observed
Sekiro uses the MSBS generation and Elden Ring uses MSBE. The ordered section names identify the generation; section revision numbers alone do not, because revisions can differ while the record layout stays the same. Observed
Sections
Section titled “Sections”| Order | MSBS | MSBE | Confidence |
|---|---|---|---|
| 1 | MODEL_PARAM_ST |
Same | Observed · Sekiro Proven · Elden Ring |
| 2 | EVENT_PARAM_ST |
Same | Observed · Sekiro Proven · Elden Ring |
| 3 | POINT_PARAM_ST (regions) |
Same | Observed · Sekiro Proven · Elden Ring |
| 4 | ROUTE_PARAM_ST |
Same | Observed · Sekiro Proven · Elden Ring |
| 5 | LAYER_PARAM_ST (empty in the examined layouts) |
Same | Observed · Sekiro Proven · Elden Ring |
| 6 | PARTS_PARAM_ST |
Same | Observed · Sekiro Proven · Elden Ring |
| 7 | MAPSTUDIO_PARTS_POSE_ST (empty in the examined layouts) |
Absent | Observed · Sekiro Proven · Elden Ring |
| 8 | MAPSTUDIO_BONE_NAME_STRING (empty in the examined layouts) |
Absent | Observed · Sekiro Proven · Elden Ring |
The file begins with MSB and a 16-byte header; the first section starts at 16. Section pointers are absolute,
whereas pointers inside a part or model record are relative to that record. Strings are NUL-terminated UTF-16.
Observed
Section revisions
Section titled “Section revisions”A file stores one revision, repeated in every section header of its chain; the two empty trailing sections of a Sekiro file store 0. This holds in all 10 Sekiro and all 935 Elden Ring MSBs of the installs examined (the Elden Ring install is the base game without the expansion archive). Proven
| Game | Revisions stored (files) | Confidence |
|---|---|---|
| Sekiro | 35 (9 maps), 33 (m89_00_00_99) |
Proven · Sekiro |
| Elden Ring | 73 (547), 74 (160), 57 (46), 51 (39), 69 (30), 64 (30), 71 (22), 65 (21), 63 (20), 66 (18), 46 (1), 70 (1) | Proven · Elden Ring |
Every Elden Ring file reads with the one six-section layout whatever its revision, so a reader that accepts only 73
refuses 388 of the 935 files. Proven · Elden Ring Within m60 the revision varies from tile to tile (73 on 460
tiles, 74 on 153, and eight further revisions on 18 to 46 tiles each). Proven · Elden Ring
Little-endian; offsets are absolute from the MSB start.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 4 | u32 | section revision | Observed | |
| 0x4 | 4 | u32 | pointer count | Observed | Record count plus one |
| 0x8 | 8 | u64 | section name offset | Observed | |
| 0x10 | 8 × record count | u64[] | record offsets | Observed | |
| after record offsets | 8 | u64 | next section offset | Observed | Zero terminates the chain |
Little-endian; offsets are absolute from the MSB start.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 4 | u32 | section revision | Proven | |
| 0x4 | 4 | u32 | pointer count | Proven | Record count plus one |
| 0x8 | 8 | u64 | section name offset | Proven | |
| 0x10 | 8 × record count | u64[] | record offsets | Proven | |
| after record offsets | 8 | u64 | next section offset | Proven | Zero terminates the chain |
Section layout
Section titled “Section layout”In every file of both installs a section is: its header (revision, pointer count, name offset), the table of record offsets ending in the next section’s offset, the section’s name directly after the table, zero bytes to the next multiple of 8, and its records back to back. A record runs to the next record’s offset, the last record of a section to the next section’s start, so the padding after a record belongs to it, and every record of both installs is a multiple of 8 bytes long. An empty section has the table’s single slot, its name and the padding, and the next section follows at once. The last section’s next-section slot is 0. Proven · every MSB of both installs Laying the sections out again from their revisions, names and records this way reproduces all 10 Sekiro and all 887 distinct Elden Ring files byte for byte. Proven · an independent writer over every MSB of both installs
Ashina Castle’s map-piece and object names, model references, positions, rotations and scales agree bit for bit with an independent SoulsFormats decode. That comparison does not cover the other Sekiro part kinds. Observed · Sekiro The whole-install Elden Ring comparison covers all 935 MSBs, all 457,108 parts of every kind and all 227 spawn points, with no refusals. Model names, part transforms, IDs, shadow controls, hit filters and spawn-point values agree with SoulsFormatsNEXT. Proven · Elden Ring
Offsets within records are relative to the record start. Unlisted fields are not described here.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 8 | u64 | name offset | Observed | |
| 0x8 | 4 | u32 | part kind | Observed | |
| 0x10 | 4 | i32 | model index | Observed | -1 names no model |
| 0x18 | 8 | u64 | resource path offset | Sourced | |
| 0x20 | 12 | f32[3] | position | Observed | |
| 0x2C | 12 | f32[3] | rotation in degrees | Observed | |
| 0x38 | 12 | f32[3] | scale | Observed | |
| 0x60 | 8 | u64 | entity data offset | Observed | Entity block occupies 0x54 bytes |
| 0x68 | 8 | u64 | type data offset | Observed | |
| 0x70 | 8 | u64 | graphics configuration offset | Observed | |
| 0x78 | 8 | u64 | scene configuration offset | Observed |
Unlisted fields are not described here; record-relative offsets.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 8 | u64 | name offset | Proven | |
| 0xC | 4 | u32 | part kind | Proven | |
| 0x14 | 4 | i32 | model index | Proven | -1 names no model |
| 0x18 | 8 | u64 | resource path offset | Sourced | |
| 0x20 | 12 | f32[3] | position | Proven | |
| 0x2C | 12 | f32[3] | rotation in degrees | Proven | |
| 0x38 | 12 | f32[3] | scale | Proven | |
| 0x60 | 8 | u64 | entity data offset | Proven | Entity block occupies 0x40 bytes |
| 0x68 | 8 | u64 | type data offset | Proven | |
| 0x70 | 8 | u64 | graphics configuration offset | Proven | |
| 0x78 | 8 | u64 | scene configuration offset | Proven |
Within entity data, the entity ID is at +0 and eight group IDs start at +0x1c. Enemy type data stores the NPC
row ID at +12. Sourced · SoulsFormatsNEXT
Kind 0 is a map piece, 2 an enemy, 4 a player, 5 collision, 10 a dummy enemy and 11 connecting collision. Sourced · SoulsFormatsNEXT only in Sekiro Kind 1 is an object and 9 a dummy object. Sourced · Sekiro · SoulsFormatsNEXT only in Elden Ring Kind 13 is an asset and 9 a dummy asset. Sourced · Elden Ring · SoulsFormatsNEXT
An entity ID of 0 or -1 names no entity. A positive group ID lets an event address all parts in that group. Observed
Part kinds present
Section titled “Part kinds present”Over all parts of the installs, only the kinds above occur; no part has kind 6 (the navmesh kind of earlier games). Model records have kind 0, 1, 2, 4 or 5 in Sekiro and 0, 2, 4, 5 or 10 in Elden Ring (4,335 / 1,266 / 284 / 4 / 1,353 Sekiro records of those kinds; 4,958 / 4,475 / 189 / 3,351 / 40,530 Elden Ring records). Proven
| Kind | Sekiro parts | Elden Ring parts |
|---|---|---|
| 0 map piece | 40,970 | 4,522 |
| 1 object | 10,538 | n/a |
| 2 enemy | 1,557 | 16,776 |
| 4 player | 70 | 722 |
| 5 collision | 1,304 | 3,266 |
| 9 dummy object / dummy asset | 125 | 2,661 |
| 10 dummy enemy | 206 | 7,108 |
| 11 connecting collision | 582 | 800 |
| 13 asset | n/a | 421,253 |
| Total | 55,352 | 457,108 |
The counts cover the 10 Sekiro and 935 Elden Ring MSBs of the installs. Proven
Model records
Section titled “Model records”A model record is 40 bytes of header before its strings, in both games (the name offset is 40 in all 7,242 Sekiro and
53,503 Elden Ring records). Its u32 at +24 is the number of parts that name the model: it equals the count of parts
whose model index is that record in every model record of both installs. A file’s parts reference no model index
outside its model section, apart from the -1 of 4 Elden Ring files. Proven
Payload slots
Section titled “Payload slots”The part header’s payload slots (eleven u64 from +80 in Elden Ring, seven in Sekiro) hold offsets of blocks, 0 for
none. The size below is the distance from a block to the next higher offset or the record’s end, so it includes
alignment padding. Proven
| Slot | Block | Size (Sekiro / Elden Ring) | Present on |
|---|---|---|---|
+80 |
draw and display groups | 388 / 392 | Elden Ring: every kind. Sekiro: map piece, object, enemy, collision |
+88 |
second display-group block | 72 / 72 | Collision and connecting collision in both games; Elden Ring assets |
+96 |
entity data | 84 (88 on player, dummy and connecting-collision kinds) / 64 | Every kind |
+104 |
type data | per kind | Every kind |
+112 |
graphics configuration | 32 / 32 | Every kind except player and connecting collision |
+120 |
scene configuration | 80 / 80 | Collision only |
+128 |
Sekiro: unnamed; Elden Ring: grass configuration | 32 / 32 | Sekiro map pieces only; Elden Ring map pieces and assets |
+136, +152 |
Elden Ring: unnamed; +152 is the tile-load configuration |
32 | Elden Ring: every kind |
+144, +160 |
Elden Ring: unnamed | 32 | Elden Ring: +144 map pieces and assets; +160 map pieces, collisions, connecting collisions and assets |
Type-data sizes (Sekiro / Elden Ring): map piece 8 / 8; object 40 / n/a; enemy and dummy enemy 192 / 192; player 16 / 16; collision 96 / 80; dummy object or asset 40 / 32; connecting collision 16 / 16; asset n/a / 392. Proven
Asset effects (Elden Ring)
Section titled “Asset effects (Elden Ring)”An asset part’s type data stores at +0x1c a signed 16-bit word, the relative id of the row of AssetModelSfxParam its
effects come from: row (nnn x 1000 + mmm) x 1000 + id for the asset model AEGnnn_mmm (see
model effect params); -1 names none. Of the 421,253 asset parts of
AEGnnn_mmm models, 409,246 store -1, 11,533 name an existing row and 474 name an absent one. Of every 16-bit word of the type
data, this is the only one whose non-negative values name an existing row for more than a thousand parts (4,100 positive values
name a row and 16 do not; the next best word names one for 966 parts and misses 69,758). Observed · Elden Ring
Sekiro’s object part has no such field. Observed · Sekiro
Collision parts
Section titled “Collision parts”A collision part’s type data starts with a hit-filter byte. The values present, with the community names (Smithbox’s enumerations; both games leave 16, 17, 20, 23 and 24 unnamed):
| Value | Name | Sekiro collisions | Elden Ring collisions | Confidence |
|---|---|---|---|---|
| 8 | Collide with all characters | 1,127 | 2,095 | Proven · Sekiro, Elden Ring · counts Sourced · Sekiro, Elden Ring · Smithbox |
| 9 | Collide with camera only | 6 | 27 | Proven · Sekiro, Elden Ring · counts Sourced · Sekiro, Elden Ring · Smithbox |
| 11 | Collide with non-player characters only | 14 | 71 | Proven · Sekiro, Elden Ring · counts Sourced · Sekiro, Elden Ring · Smithbox |
| 13 | Trigger fall death camera | 12 | 257 | Proven · Sekiro, Elden Ring · counts Sourced · Sekiro, Elden Ring · Smithbox |
| 15 | Trigger instant death | 13 | 258 | Proven · Sekiro, Elden Ring · counts Sourced · Sekiro, Elden Ring · Smithbox |
| 16 | unnamed | 19 | 187 | Proven · Sekiro, Elden Ring · counts |
| 17 | unnamed | 4 | 92 | Proven · Sekiro, Elden Ring · counts |
| 19 | Collide with non-player characters only (Sekiro enumeration), unnamed (Elden Ring) | 9 | 38 | Proven · Sekiro, Elden Ring · counts Sourced · Sekiro · Smithbox |
| 20 | unnamed | 0 | 10 | Proven · Sekiro, Elden Ring · counts |
| 22 | Block all fall damage (Sekiro enumeration), unnamed (Elden Ring) | 17 | 210 | Proven · Sekiro, Elden Ring · counts Sourced · Sekiro · Smithbox |
| 23, 24, 29 | unnamed | 0 | 10, 3, 8 | Proven · Elden Ring · counts |
| 25, 26, 27, 28 | absent from the community enumerations | 6, 2, 64, 11 | 0 | Proven · Sekiro · counts |
The counts are over all 1,304 Sekiro and 3,266 Elden Ring collision parts. Values 0 to 7, 14 and 21 (named in the Sekiro enumeration) do not occur in either install. Proven
In Elden Ring the collision type data holds two more bytes read from the data: +0x35 is 255 on 3,225 of 3,266
collisions and otherwise 0, 1, 2, 3, 21, 31 or 41 (41 collisions, all in m60 tiles), and +0x36 is 0 on 1,877 and 1
on 1,389. How +0x35 selects a graphics-parameter file is under
graphics parameters. Proven · Elden Ring
Entity IDs and groups
Section titled “Entity IDs and groups”Entity IDs and group IDs follow a numbering per area, in the decimal digits of the ID. Counted over every positive
entity ID in the installs’ MSBs (part IDs, the eight group IDs of each part, region IDs and the entity ID in each event’s
base data), n being a number below 10,000:
| Game and kind of map | Form | Parts | Part groups | Regions | Events | Confidence |
|---|---|---|---|---|---|---|
Sekiro, all maps but _99 |
area × 10^5 + block × 10^4 + n |
2,616 of 2,619 | 2,783 of 2,783 | 1,787 of 1,871 | 203 of 213 | Observed · Sekiro |
| Elden Ring, legacy dungeons and other non-overworld maps | area × 10^6 + block × 10^4 + n |
6,241 of 6,256 | 6,198 of 6,204 | 3,106 of 3,425 | 239 of 240 | Observed · Elden Ring |
Elden Ring, m60 tiles |
10^9 + X × 10^6 + Z × 10^4 + n for tile m60_X_Z_* |
5,077 of 5,808 | 2,741 of 3,759 | 1,778 of 2,304 | 125 of 136 | Observed · Elden Ring |
“Of” counts the positive IDs of that kind in those maps; the others are small numbers (group IDs 7 and 8, region IDs 1
and 2) or follow the numbering of another block (a m10_00 region with an ID of the m10_01 form). The Elden Ring forms
are also the forms of the event flags that the map’s own scripts set (see
EMEVD).
Regions and events
Section titled “Regions and events”Regions combine a type, a shape and a placement. Sourced · SoulsFormatsNEXT
Region-record-relative offsets; type-specific payloads differ. The first string (the name) starts at the header's end.
| Offset | Size | Type | Field | Confidence | Games | Notes |
|---|---|---|---|---|---|---|
| 0x0 | 8 | u64 | name offset | Sourced | Equals the header size (96 or 104) in all 45,121 regions | |
| 0x8 | 4 | u32 | region type | Sourced | ||
| 0xC | 4 | u32 | index among the regions of the same type | Proven | Counts from 0 in file order; equals the per-type counter in all 45,121 regions | |
| 0x10 | 4 | u32 | shape type | Sourced | ||
| 0x14 | 12 | f32[3] | position | Sourced | ||
| 0x20 | 12 | f32[3] | rotation in degrees | Sourced | ||
| 0x2C | 4 | u32 | region number | Proven | Unique within the file in all 945 files; not the record index (equal to it in 391 of 45,121 regions) | |
| 0x48 | 8 | u64 | shape data offset | Sourced | ||
| 0x50 | 8 | u64 | entity data offset | Sourced | ||
| 0x58 | 8 | u64 | type data offset | Sourced | 0 in all 6,872 Elden Ring regions of type 0xffffffff and in 37 regions of other types | |
| 0x60 | 8 | u64 | extra data offset | Proven | Elden Ring | Non-zero in all 36,409 regions; the block it names is described below |
Event-record-relative offsets; type-specific payloads differ. The name string starts at the header's end.
| Offset | Size | Type | Field | Confidence | Games | Notes |
|---|---|---|---|---|---|---|
| 0x0 | 8 | u64 | name offset | Sourced | Equals the header size (40 or 48) in all 9,211 events | |
| 0x8 | 4 | u32 | event number | Proven | Unique within the file in all 945 files; not the record index (equal to it in 367 of 9,211 events); densely 0..n-1 in 731 of 945 files | |
| 0xC | 4 | u32 | event type | Sourced | ||
| 0x10 | 4 | u32 | index among the events of the same type | Proven | Equals the per-type counter in 9,209 of 9,211 events; the other two have type 0xffffffff | |
| 0x18 | 8 | u64 | base data offset | Sourced | Part index, region index and entity ID (16 bytes) | |
| 0x20 | 8 | u64 | type data offset | Sourced | 0 for events of type 0xffffffff, and for Sekiro type 22 | |
| 0x28 | 8 | u64 | extra data offset | Proven | Elden Ring | Non-zero in all 7,585 events; the block it names is described below |
The event and region sections of every Elden Ring file are sorted by type, as are the event sections of all 10 Sekiro files
(the Sekiro region sections of 3 of the 10). The number at
+8 of an event and the number at +44 of a region are file-wide identifiers that keep their values when records are
removed: they are unique in every file but dense (a permutation of 0..n-1) in only 731 of the 945 event sections and 419
of the region sections, and they are in section order in 597 of the event sections of the Elden Ring files. They are
neither the record index nor the per-type index. Proven
Extra block (Elden Ring)
Section titled “Extra block (Elden Ring)”only in Elden Ring Every region and event ends with a 32-byte block that its extra data offset names. It is the last thing in the record: the block ends at the record’s end in 23,517 regions and 7,571 events, and 4 zero bytes of alignment follow it in the other 12,892 regions and 14 events. Proven
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 4 | u32 | map word | Proven | 0xffffffff in 35,784 of 36,409 regions and 7,454 of 7,585 events; otherwise a map word (area in the top byte) |
| 0x4 | 4 | u32 | unknown | Unknown | 0 with a default map word; 13 in all 756 records with a map word |
| 0x8 | 4 | u32 | unknown | Unknown | 0 in every region and event but one (2) |
| 0xC | 4 | i32 | unknown | Unknown | -1 with a default map word; otherwise a non-negative number (226 distinct values, up to 9,081) whose meaning is not established |
| 0x10 | 16 | u8[16] = 0 | padding | Proven |
The records with a map word are the 625 regions and 131 events of 46 overworld tiles of levels 1 and 2: 17 _01
tiles, 26 _02 tiles and the alternate tiles m60_*_11 (2) and m60_*_12 (1). Proven How the word is read is under map words.
Sekiro has no extra block or pointer: its region header ends at +96, its event header at +40, and the name string
follows. Proven · Sekiro A reader that takes a region’s or event’s type data as “from the type-data offset to the
record’s end” in Elden Ring therefore includes the 32-byte block (and up to 4 padding bytes) in it.
Effect regions (type 5)
Section titled “Effect regions (type 5)”An SFX region’s type data names the effect it spawns (an FXR file by id) and whether the
effect starts disabled until an event script enables it. The word that holds the flag is SoulsFormats’ StartDisabled (an
integer); the files store only 0 and 1 in Elden Ring’s, and in Sekiro’s 0, 1, 256 and 257, so its low byte is read as the flag.
| Offset | Size | Type | Field | Confidence | Games | Notes |
|---|---|---|---|---|---|---|
| 0x0 | 4 | i32 | effect id | Proven | The number of an FXR file; 1,872 Sekiro and 1,523 Elden Ring regions | |
| 0x4 | 4 | u32 | start disabled | Sourced | Elden Ring | 0 or 1 in all 1,523 regions (17 are 1) |
| 0x4 | 4 | i32 | unnamed | Unknown | Sekiro | SoulsFormats' UnkT04: -1 in 1,868 regions, 0x00110440 in 4 |
| 0x8 | 12 | i32[3] = -1 | padding | Proven | Sekiro | |
| 0x14 | 4 | u32 | start disabled | Sourced | Sekiro | Low byte 0 or 1 (54 of 1,872 regions are 1); the second byte is 1 in 13 regions, not understood; the two high bytes are 0 |
Every SFX region of both installs has a flag byte of 0 or 1 and, in Elden Ring, zero bytes after it in its word. Proven · every region of type 5 of both installs
Wind regions (type 6)
Section titled “Wind regions (type 6)”A WindSFX region’s type data also starts with an effect id, of an effect whose action is a WindForce
(parameters); the Stormveil region 【GD_環境風_突風12-5m】_808003_1001
(a box 120.307 × 110.863 × 72.456, turned 36.404° about y) stores [808003, 289, −1.0]. Observed · Elden Ring
only in Elden Ring The game builds the wind regions with the SFX regions when a world block is set up, and every frame spawns
or removes their effects by a global flag, a 256-bit mask and two enable bits, with no test of the player’s position.
Observed · Elden Ring · read from the code of 1.17.3 A loaded region keeps the file’s record layout, with its offsets
turned into pointers and its rotation into radians, f32(degrees) × f32(π / 180) (0x3C8EFA35). The region’s matrix is the
rotation (from the C runtime’s sinf and cosf of those radians) times the translation to its position; the effect is spawned at
that matrix times the world block’s offset (frames). A box region’s
area has the same rows, scaled by half its width, height and depth (the box’s third value being the height), and its centre is
the spawn position plus half the height in y. Observed · Elden Ring · the game’s own code run from a memory image of 1.17.3, one region
With the block offset (88, −16, −16), the spawn matrix equals the running force field’s transform bit for bit, and the box centre’s
y the field origin’s y. Observed · Elden Ring · one region, one recording For a turn about y alone the rotation’s rows are (cos, 0, −sin),
(0, 1, 0) and (sin, 0, cos), and the field blows along the third row. All twelve wind regions of Stormveil’s layout resolve to a
field this way, and the recorded cloth stood inside exactly one region’s box. Observed · Elden Ring · one recording Whether
the box containing the cloth is how the game picks the field in general is not established, and the x and z of the field’s
origin are not read from the code. Unknown · Elden Ring
Shape variants include points, circles, spheres, cylinders, rectangles, boxes and composites; a shape and a region’s purpose are different fields. Sourced · SoulsFormatsNEXT
| Shape code | Payload | Confidence |
|---|---|---|
0xffffffff |
No shape | Sourced · SoulsFormatsNEXT |
| 0 | Point, no dimensions | Sourced · SoulsFormatsNEXT |
| 1 / 2 | Circle / sphere, one radius float | Sourced · SoulsFormatsNEXT |
| 3 | Cylinder, radius then height | Sourced · SoulsFormatsNEXT |
| 4 | Rectangle, width then depth | Sourced · SoulsFormatsNEXT |
| 5 | Box, width then depth then height | Sourced · SoulsFormatsNEXT |
| 6 | Composite child-region records | Sourced · SoulsFormatsNEXT |
Region type 8 identifies spawn points in both generations. Sourced · SoulsFormatsNEXT Sekiro’s event type 9 is MapOffset; MSBE has no corresponding MapOffset event. See coordinate frames. Observed
Community definitions name many types, but a name alone does not establish activation, priority or runtime lifetime. Type-specific bytes need a separate interpretation for each type and game.