Visibility and shadow controls
MSB stores several controls that affect what can draw: part shadow bytes, visibility-related arrays and event-addressable entity IDs. Character display masks and event-flag world presence add separate state systems. Sourced · SoulsFormatsNEXT
Visibility arrays
Section titled “Visibility arrays”The reference reader names Elden Ring part arrays DisplayGroups, DrawGroups and CollisionMask, but leaves their
semantics unknown. Sekiro’s corresponding structure is named CollisionMask with 48 words.
Sourced · SoulsFormatsNEXT
Elden Ring’s structure is laid out in its section below. Sekiro stores the same block (388 bytes against 392) and its
first 192 bytes hold the same three arrays in the same order: 8 display-group words at +0, 8 draw-group words at +32
and 32 collision-mask words at +64. Proven · Sekiro The block is present on map pieces, objects, enemies and
collisions in Sekiro, and on every part in Elden Ring.
Parts with a non-zero array, over every part of both installs:
| Game and kind | Parts | Display groups non-zero | Draw groups non-zero | Collision mask non-zero |
|---|---|---|---|---|
| Sekiro map piece | 40,970 | 28,522 | 40,741 | 40,879 |
| Sekiro object | 10,538 | 5,840 | 10,113 | 8,561 |
| Sekiro enemy | 1,557 | 1 | 2 | 5 |
| Sekiro collision | 1,304 | 999 | 1,185 | 1,060 |
| Elden Ring map piece | 4,522 | 2,886 | 1,444 | 1,341 |
| Elden Ring asset | 421,253 | 281,090 | 106,461 | 80,643 |
| Elden Ring enemy | 16,776 | 11,849 | 1 | 6 |
| Elden Ring collision | 3,266 | 906 | 1,053 | 883 |
| Elden Ring connecting collision | 800 | 130 | 110 | 161 |
Elden Ring’s dummy enemies store non-zero display groups on 3,028 of 7,108 parts and its dummy assets on 53 of 2,661; its player starts on 203 of 722. Proven · Elden Ring
If a part is taken as drawn when its draw groups share a bit with the display groups of some collision of its map (an
assumption, not an established rule), 5,217 of the 5,310 map pieces and objects of Sekiro’s m11_01 qualify, 92 store
draw groups that are all zero, and one qualifies for no collision; over all of Sekiro’s maps 49,433 of 51,508 qualify,
654 store zeros and 1,421 qualify for none (1,130 of them in m20_00). The same count over Elden Ring’s map pieces and
assets gives 70,713 qualifying, 317,870 with zero draw groups and 37,192 qualifying for none, in 29 of the 935
layouts. Observed So the arrays alone do not hide whole interiors of Ashina Castle.
Elden Ring’s _99 overlay layouts (overlays) hold no collision of their own,
and the draw groups of their parts are met by the display groups of the collisions of the base map they overlay, as the
intersection reading predicts:
| Overlay | Parts with draw groups | Met by the overlay’s own collisions | Met by the base map’s collisions |
|---|---|---|---|
m10_00_00_99 |
1,298 | 0 | 1,279 |
m11_00_00_99 |
1,240 | 0 | 1,203 |
m11_05_00_99 |
668 | 0 | 644 |
m12_02_00_99 |
31 | 0 | 30 |
m13_00_00_99 |
80 | 0 | 80 |
m14_00_00_99 |
734 | 0 | 732 |
m15_00_00_99 |
109 | 0 | 109 |
m16_00_00_99 |
555 | 0 | 112 |
m39_20_00_99 |
787 | 0 | 787 |
m45_00_00_99, m45_01_00_99, m45_02_00_99 |
750, 107, 106 | 0 | 0 |
The other 12 _99 layouts that have a base layout store no non-zero draw group. Observed · Elden Ring That the groups of a part are
compared with those of the collision the player stands on is the community’s reading (soulstruct’s field notes: a part is
drawn while its draw group is among the active display groups, and display groups function on collisions)
Sourced · Elden Ring · soulstruct; that most parts of the largest underground maps (m12_01: 8,205 of 10,297 parts
with draw groups, m12_02: 5,096 of 8,069) meet no display group of their own map’s collisions even when the second block’s
groups and the connecting collisions’ are added (8,049 and 5,063 remain) is not explained by it. Observed · Elden Ring
The draw groups of the collisions relate to the parts’ too. Over the map pieces, objects and assets with draw groups (the collisions of the base map standing for an overlay’s), 107,130 of Elden Ring’s 107,905 have every set bit among the draw groups of some collision of their map, against 29,325 among the display groups of some; Sekiro’s figures are 32,731 and 14,090 of 50,854. Elden Ring’s 3,266 collisions store draw groups on 1,053 (none stores all 256 bits), Sekiro’s 1,304 on 1,185. Observed Which of the two sets a collision contributes when the player stands on it, or whether both, is not established. Unknown
The parts’ own display groups are not empty: of the 425,775 map pieces, objects and assets of Elden Ring’s layouts that
store a draw block, 283,976 set at least one display group (48,895 of the 107,905 with draw groups, 235,081 of the 317,870
without), and of Sekiro’s 51,508, 34,362 (34,091 of the 50,854 with draw groups, 271 of the 654 without). In m10_00 of Elden
Ring 4,085 of the 7,773 parts with draw groups and 171 of the 292 without set one. Observed With the collisions of an
overlay’s base map standing for its own, a part’s display groups are among the display groups of some collision of its map
for 32,427 of the 48,895 Elden Ring parts that have both, and its draw groups among the draw groups of some collision for all
48,895 (its display groups among the draw groups of some for 46,973); of the 235,081 parts without draw groups, 11,552 have a
display group among those of the collisions (9,198 counting each layout’s own collisions only). Observed · Elden Ring Each array of a part is thus mostly
met by the array of the same name of the collisions. Read that way (a part is drawn when a draw group is among the draw
groups, or a display group among the display groups, of the collision under the player) the running-game pictures above agree:
draw groups equal to a group no collision holds hide a part (the group-200 arms and the arm with every draw group zero and
display groups as stored); a display group the floor collision holds draws it (the group-9 arm); and the stock-zero assets that
stay on screen when every draw group is zero are those with display groups, which the group-200 arms replaced. Inferred
Neither term, neither array and neither part kind is tested alone.
With all 256 bits set in both group arrays of every collision, and the parts as stored, the spawn view equals the stock view at the noise level (2.5 % of pixels differ by more than 24/255, against 1.9 % between two arms known to look alike; the player read at the spawn position at the time). This agrees with a gate that every stock part already passes and with no gate at all. Observed · Elden Ring The same layout with both arrays zero on every collision ended the game at world load in the one launch made. Observed · Elden Ring
In the running game (1.17.2, offline, the layout m10_00_00_00 replaced by a test file), a part whose draw groups are set to
all zero is not drawn: setting the draw groups of every map piece and asset to zero (7,773 of the 8,065 stored a non-zero
array; display groups left as stored) removes the walls, floor and props around the Stormveil spawn, as moving all of them
300 m up does. What stays on screen is not made of this layout’s parts: lifting the 292 parts that store zero draw groups
and zeroing the rest gives the same picture. Observed · Elden Ring Zero draw groups alone do not hide a part: with
the draw groups of every map piece and asset zero and their display groups all set to the single bit 9 of word 0 (a bit that
is set in both group arrays of the floor collision under the spawn, h001300), the gate, pillars, walls and rubble around
the spawn are drawn again (the floor stays absent), where the same zeroing with the display groups left as stored (zero
on nearly all of the parts in view) removes them. Observed · Elden Ring So a part is drawn when either its draw groups
or its display groups share a bit with those of the collision under the player, as far as these two pictures show. One view
each; one bit tried; the rule for a single part, and which collision’s arrays count, are not tested. Inferred The parts
that store zero draw groups in this layout (27 map pieces, all at the origin, and 265 assets, 144 of them with non-zero
display groups) were not seen themselves: none of them is in view at the spawn, and moving them in front of the camera
showed nothing (parts of models with no instance near the spawn were not seen after being moved there, with stored or forced groups).
The pattern “draw groups zero, display groups set” that those 144 assets store is drawn when the display groups match.
Observed · Elden Ring
The same test with a shared group tells that a bit in common with the display groups of the collisions does not draw a part. With the draw groups of every map piece and asset set to group 200 alone, the near scenery (gate, walls, floor, rubble) is not drawn when every collision’s display groups are set to group 200, nor when they are set to group 201, nor when only the 22 collisions that store no display group are set to 200; the three screenshots differ from each other in under 2 % of their pixels (lamp flicker), against 55 % from the stock view. Observed · Elden Ring The grace and the castle front that stay visible when every draw group is zero are gone in these arms too; the likely reason is that the parts which store no group are drawn while they have none and hidden once group 200 is on them, but which parts those are was not tested. Observed · Elden Ring (Each arm is one recording read by eye; whether group 200 is in the range the game tests is not separated from the rule.) Unknown · Elden Ring Setting the draw groups of the collisions to group 200 as well, in the arm with display group 201, does not bring the scenery back either; that view differs from the others (the character is out of frame, the camera on a rock and barrels in fog), so the arm cannot be read further. Observed · Elden Ring
The block of every part that stores one; the sizes are the distance to the next block.
| Offset | Size | Type | Field | Confidence | Games | Notes |
|---|---|---|---|---|---|---|
| 0x0 | 32 | u32[8] | display groups | Sourced | Named by SoulsFormatsNEXT; what a group does is the game's | |
| 0x20 | 32 | u32[8] | draw groups | Sourced | ||
| 0x40 | 128 | u32[32] | collision mask | Sourced | ||
| 0xC0 | 4 | u8[4] | condition bytes | Unknown | The first two are 0 or 1 in both games; Elden Ring's third is 0 or 2 and its fourth 0, 1 or 2; Sekiro's third and fourth are 0 | |
| 0xC4 | 2 | i16 | unknown | Unknown | Elden Ring | -1 on all 457,108 parts |
| 0xC6 | 1 | u8 | unknown | Unknown | Elden Ring | 0, or 1 on 177 map pieces |
| 0xC4 | 4 | u8[4] | unknown | Unknown | Sekiro | 0 |
| 0xC8 | variable | bytes = 0 | reserved | Proven | Zero to the end of the block in both games |
Collisions and connecting collisions in both games, assets in Elden Ring.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 4 | i32 | condition | Unknown | -1 on every Elden Ring asset, on 1,887 of the 3,266 Elden Ring collisions and on 108 of the 1,304 Sekiro collisions; otherwise a non-negative number |
| 0x4 | 32 | u32[8] | display groups | Sourced | Zero except on 341 Elden Ring collisions, 322 connecting collisions and 3 assets, and on 11 Sekiro collisions and 73 of its connecting collisions |
| 0x24 | 4 | u8[4] | unknown | Unknown | 00 00 ff ff (a signed -1 in the last two bytes) on all but 15 connecting collisions (12 in Sekiro, 3 in Elden Ring), which store a 16-bit number there and, on 14 of them, a 1 in the first byte |
| 0x28 | 32 | bytes = 0 | reserved | Proven |
Both blocks read with no refusals on every part of both installs (Sekiro 55,352 parts, Elden Ring 457,108), their sizes and zero bytes as stated. Proven
Shadow bytes
Section titled “Shadow bytes”Offsets below are relative to the part’s entity-data block, not its header. The cast, receive and shadow-only flags are independent stored bytes. Observed · Sekiro Proven · Elden Ring · all 457,108 parts
| Offset | Meaning | Stored encoding | Confidence |
|---|---|---|---|
0x0a |
Point-light shadow cast | MSBS: 0/1; MSBE: 0/0xff |
Observed · Sekiro Proven · Elden Ring · all parts |
0x0c |
Cast shadow | 0/1 |
Observed · Sekiro Proven · Elden Ring · all parts |
0x0d |
Static shadow control | Raw byte; renderer meaning unresolved | Unknown |
0x0e |
Cascade-3 shadow control | Raw byte; renderer meaning unresolved | Unknown |
0x11 |
Receive shadow | 0/1 |
Observed · Sekiro Proven · Elden Ring · all parts |
0x12 |
Shadow only | 0/1 |
Observed · Sekiro Proven · Elden Ring · all parts |
Sekiro’s bytes agree with SoulsFormats on all 5,310 map-piece and object parts of m11_01 for the eight shadow
and draw flags compared. Among them, m400090_6000, a flat ground piece in the spawn courtyard, is shadow-only.
Observed · Sekiro
The Elden Ring shadow-byte comparison covers every part of all 935 installed MSBs with no refusals. Proven · Elden Ring
Other entity-data bytes
Section titled “Other entity-data bytes”The other bytes of the entity-data block that carry values in the installs, over every part:
| Game and offset | Meaning (community name) | Values | Confidence |
|---|---|---|---|
Elden Ring +0x04 |
Uses a draw-parameter row (isUsePartsDrawParamID) |
1 on 11,583 parts (3,905 of 4,522 map pieces, 7,656 assets, 22 other), else 0 | Proven · Elden Ring Sourced · Elden Ring · Smithbox |
Elden Ring +0x08 |
Draw-parameter row ID (PartsDrawParamID), a u16 |
On all 11,583 parts with +0x04 set, a PartsDrawParam row of that ID exists in the regulation (385 rows); the other parts store 0 (445,086) or a value (439, of which 34 are 0xffff) |
Proven · Elden Ring |
Elden Ring +0x13 |
Draw by reflection camera | 0 on all 457,108 parts | Proven · Elden Ring Sourced · Elden Ring · Smithbox |
Elden Ring +0x14 |
Draw only in the reflection camera | 1 on 156 parts (138 map pieces, 17 assets, 1 connecting collision) | Proven · Elden Ring Sourced · Elden Ring · Smithbox |
Elden Ring +0x15 |
Enable on above shadow | 1 on 198 parts (176 map pieces, 19 assets, 2 collisions, 1 connecting collision) | Proven · Elden Ring Sourced · Elden Ring · Smithbox |
Elden Ring +0x16 |
Disable point-light effect | 1 on 97 parts (96 assets, 1 map piece) | Proven · Elden Ring Sourced · Elden Ring · Smithbox |
Elden Ring +0x3f |
Disable ray-traced ambient occlusion | 1 on 6,655 parts (6,428 assets, 227 map pieces) | Proven · Elden Ring Sourced · Elden Ring · Smithbox |
Sekiro +0x07 |
Lantern ID | 0 on all 55,352 parts | Proven · Sekiro Sourced · Sekiro · Smithbox |
Sekiro +0x08 |
Level-of-detail parameter row (LodParamID), a byte |
255 on 53,724 parts; 3, 31, 40, 41, 42, 60, 61 or 63 on 1,628 parts (1,616 map pieces, 12 objects), each with a row of that ID in the 64-row LodParam |
Proven · Sekiro |
What the draw-parameter row and the level-of-detail row set is not read here. A reader that takes Elden Ring’s +0x08
as a signed byte “level of detail” with a second byte beside it splits what is one u16 row ID (2046 is bytes 0xfe and
0x07; on map pieces the IDs are 1000 on 2,481, 2046 on 247, 2060 on 173 and 2048 on 131). Proven · Elden Ring
Distance opacity in the running game
Section titled “Distance opacity in the running game”Each instanced draw’s cbInstanceData record holds a fade alpha (ditherFadeAlpha, row 7 x of the 13-row record in Elden Ring, row 11 x of
the 17-row record in Sekiro). In nine Elden Ring frames at the Stormveil gate it is below 1 on 117 of the 21,192 records of the G-buffer
draws (5 to 29 in each of six frames, none in the last three); in Sekiro’s three frames at the Ashina idol it is 1 on all 4,393 records.
Observed · nine Elden Ring frames, three Sekiro frames
Where it is below 1 it is of two kinds. A model at 30 to 35 m (and two at 95 m) is drawn twice, once per face set of
the same meshes, and the two draws’ alphas add to 1: 44 of 44 pairs of six frames, 0.018 with 0.982, 0.229 with 0.771, 0.465 with 0.535, 0.645
with 0.355; in 35 of them the larger alpha is on the face set with fewer indices and the larger start offset, in 9 on the other.
Observed · Elden Ring · 44 pairs of six frames This is the cross-fade between two levels of
which level is drawn, seen as two draws. Foliage draws (Vesitation programs) also appear
alone, with an alpha falling from 0.739 at 72.1 m to 0.046 at 75.9 m and 0.030 at 76.3 m, the opacity ramp to 0 of the draw distance
above; the alpha at one distance differs between models. Observed · Elden Ring · four frames Five records of 0.692 at 95.3 m have no
complementary draw in the main G-buffer pass, so a model faded out by distance and a model crossing between levels are not told apart by the
alpha alone. Observed · Elden Ring
Narrowed: the distance term is visible in frames (above): an opacity from 1 to 0, and a two-draw cross-fade between levels. The group term is not: a frame holds neither the arrays nor the active display groups, so it shows only what was drawn, and nothing undrawn. The presence of arrays and their community names do not establish bit intersections, collision activation, occlusion or camera dependence. Nor is precedence established when shadow-only and cast-shadow controls appear contradictory. These bytes must not be collapsed into a single unconditional visibility flag. Missing: a frame of the running game with the test layouts above (groups zeroed or set to one bit), to list which draws are absent.
Sekiro
Section titled “Sekiro”Black boxes around the keep
Section titled “Black boxes around the keep”only in Sekiro Around Ashina Castle’s keep, objects m015091 to m015098 and one submesh of m015051 draw
near-black boxes with the texture m11_black_a and the program GXFlver_ColDif. Observed · Sekiro That they are
blocker or occluder cards rather than scenery is a guess. Inferred · Sekiro
Moved parts
Section titled “Moved parts”only in Sekiro A part moved in the MSB keeps the display condition of the area it came from: its draw block (eight
display-group words, eight draw-group words and 32 collision-mask words). The armour stand o114903, moved onto the
path from the Ashina Castle start idol, is not drawn there and the player walks through its place; with the display
groups, draw groups and mask copied from an object drawn at that spot (o114710_3800) it is drawn and its collision
deflects the player (Havok collision). Observed · Sekiro · three runs without the copy, one with it
A part that is not drawn is therefore not collided with either. Observed · Sekiro
Copying all three draws it; whether the collision mask alone, or the display and draw groups alone, would do is not established. The Sekiro frames hold no moved part, so they do not bear on it. Missing: three launches with the part moved and one array copied each, captured at the idol.
Elden Ring
Section titled “Elden Ring”Draw distance and the shadow cut
Section titled “Draw distance and the shadow cut”A placed model’s PartsDrawParam row also ends its drawing by distance. Each frame and view the model gets an opacity
of 1 below drawDist (offset 52) times the scale of the row’s LBDrawDistScaleParamID (offset 109), falling to 0 over
drawFadeRange (offset 56); shadow views use shadowDrawDist and shadowFadeRange (offsets 60 and 64) instead. A
model whose opacity is 0 is not drawn. Observed · Elden Ring · read from the executable’s code Each drawn
instance also keeps a shadow level beside its texture level: it turns on beyond shadowDrawDist plus a band and back
off below it minus the band, shadowDrawDist replaced by a per-instance value where the instance sets one.
Observed · Elden Ring · read from the executable’s code
Part visibility-related structure
Section titled “Part visibility-related structure”| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 32 | u32[8] | DisplayGroups | Unknown | Community field name; meaning unresolved |
| 0x20 | 32 | u32[8] | DrawGroups | Unknown | Community field name; meaning unresolved |
| 0x40 | 128 | u32[32] | CollisionMask | Unknown | Community field name; meaning unresolved |
| 0xC0 | 4 | u8[4] | conditions and unknown bytes | Unknown | Named Condition1; Condition2; UnkC2; UnkC3 by the reference |
| 0xC4 | 2 | i16 | unknown | Unknown | Reference reports -1 in retail |
| 0xC6 | 2 | i16 | unknown | Unknown | Reference reports 0 or 1 in retail |
| 0xC8 | 192 | u8[192] = 0 | padding | Sourced |