DZS and DZR - LordNed/WindEditor GitHub Wiki
The DZS and DZR files contain the definitions for various data types within a Worldspace. DZR files are room-specific, while DZS files are global.
They both begin with an simple file header, which represents the number of chunks within the file.
File Header
//0x04/4 bytes long
/*0x00*/ int chunkCount
Immediately following this are chunkCount
Chunk headers, specified below.
Chunk headers
//0x0C/12 bytes long
/*0x00*/ string chunkType;
/*0x04*/ int numEntries;
/*0x08*/ int chunkOffset;
Thereafter are the chunks themselves. The data within them depends on the chunk type, so the information below is organized in that way, as well.
Chunk List:
- 2DMA - Onscreen Mini-Map Properties
- ACTR - Actor Info
- AROB - Camera waypoint, like RARO
- CAMR - Sets a camera behavior for certain events; points to a RARO or AROB entry
- Colo - Part of Environment Lighting
- DMAP - Dungeon Map Properties
- DOOR - Doors
- EnvR - Part of Environment Lighting
- EVNT - Worldspace Events
- FILI - Room Properties
- FLOR - Floor definitions for multi-floor worldspaces
- LGHT - Interior Light source
- LBNK - Padding?
- MECO - Assigns rooms to an entry in MEMA
- MEMA - Memory allocation size
- MULT - Room model X/Z translation
- PATH - Waypoint series definition
- PLYR - Player Spawn Points
- Pale - Part of Environment Lighting
- PPNT - Path Waypoint Coordinates
- RARO - Camera Reference Point for Event_List.dat - Identical in structure to AROB
- RCAM - Sets camera behavior
- RPAT - Waypoint Series Definition
- RPPN - Path Waypoint Coordinates
- RTBL - Defines what rooms are loaded from the room the player is currently in
- SCLS - Exit List
- SCOB - Environmental Actors (ie: Light)
- SHIP - King of Red Lions spawn points.
- SOND - Ambient Sound Settings
- STAG - Worldspace Properties
- TGDR - Doors
- TRES - Treasure Chests
- Virt - Part of Environment Lighting
- LGTV - Light source for shadow behavior
2DMA
//0x38/56 bytes long
/*0x00*/ float fullMapImageScaleX;
/*0x04*/ float fullMapImageScaleY;
/*0x08*/ float fullMapSpaceScaleX;
/*0x0C*/ float fullMapSpaceScaleY;
/*0x10*/ float fullMapXCoord;
/*0x14*/ float fullMapYCoord;
/*0x18*/ float zoomedMapXScrolling1; //Something with scrolling, but that's also defined below?
/*0x1C*/ float zoomedMapYScrolling1; //Does something like scrolling on y-axis
/*0x20*/ float zoomedMapXScrolling2;
/*0x24*/ float zoomedMapYScrolling2;
/*0x28*/ float zoomedMapXCoord;
/*0x2C*/ float zoomedMapYCoord;
/*0x30*/ float zoomedMapScale; //That's what it appeared to affect, anyway
/*0x34*/ byte unknown1; //Always 0x80?
/*0x35*/ byte mapIndex; //number of the map image to use. For instance, using the first image would be 80, the second 81, and so on.
/*0x36*/ byte unknown2; //variable, but changing it has no immediate result
/*0x37*/ byte padding;
Settings for the minimap.
ACTR
//0x20/32 bytes long
/*0x00*/string name; //0x8/8 bytes total space
/*0x08*/ byte param1;
/*0x09*/ byte param2;
/*0x0A*/ byte param3;
/*0x0B*/ byte param4;
/*0x0C*/ float xPos;
/*0x10*/ float yPos;
/*0x14*/ float zPos;
/*0x18*/ short xRot;
/*0x1A*/ short yRot;
/*0x1C*/ short setFlag; //A flag to set, probably when the object gets despawned. Only for enemies?
/*0x1E*/ short enemyNumber; //Enemies are given a number here based on their position in the actor list
Defines the actors that appear within the scene.
AROB
//0x14/20 bytes long
/*0x00*/ float xCoord;
/*0x04*/ float yCoord;
/*0x08*/ float zCoord;
/*0x0C*/ short xRot;
/*0x0E*/ short yRot;
/*0x10*/ short zRot;
/*0x12*/ short padding;
Camera waypoints for the RCAM and CAMR chunks.
CAMR
//0x14/20 bytes long
/*0x00*/ string cameraType; //String, from a list in the .dol, giving the camera type
/*0x10*/ byte raroIndex; //index of the RARO chunk this entry uses
/*0x11*/ byte padding;
/*0x12*/ byte padding;
/*0x13*/ byte padding;
Camera behavior during events. The raroIndex variable is the "Arrow" in the map that the Camera will be positioned at (a point and rotation in space). cameraType defines the behavior of the camera once at this point. A probably fairly complete list of possible cameraType strings are as follows:
- "????"
- "Field"
- "Dungeon"
- "Plain"
- "DungeonDown"
- "DungeonUp"
- "DungeonCorner"
- "Jump"
- "DungeonWide"
- "Room"
- "FieldCushion"
- "OverLook"
- "Corridor"
- "Subject"
- "DungeonPassage"
- "Cliff"
- "Cliff2"
Other types that may or may not be valid (seem to be specific-case use ones)
- "MajTower"
- "Boss01"
- "Boss02"
- "Gamoss"
- "MiniIsland"
- "Amoss"
- "Cafe"
- "P_Ganon1"
- "P_Ganon2"
- "WindBoss"
- "P_Ganon3"
- "G_BedRoom"
- "G_Roof"
- "G_BedRoom2"
- "Boss04"
- "WindHall"
- "BigBird"
- "DStairs"
Colo
//0xC/12 bytes long
/*0x00*/ byte dawnPaleIndexA; //Index of Pale entry to use for dawn
/*0x01*/ byte morningPaleIndexA; //Index of Pale entry to use for morning
/*0x02*/ byte noonPaleIndexA; //Index of Pale entry to use for noon
/*0x03*/ byte afternoonPaleIndexA; //Index of Pale entry to use for the evening
/*0x04*/ byte duskPaleIndexA; //Index of Pale entry to use for dusk
/*0x05*/ byte nightPaleIndexA; //Index of Pale entry to use for night
/*0x06*/ byte dawnPaleIndexB; //Index of Pale entry to use for dawn
/*0x07*/ byte morningPaleIndexB; //Index of Pale entry to use for morning
/*0x08*/ byte noonPaleIndexB; //Index of Pale entry to use for noon
/*0x09*/ byte afternoonPaleIndexB; //Index of Pale entry to use for the evening
/*0x0A*/ byte duskPaleIndexB; //Index of Pale entry to use for dusk
/*0x0B*/ byte nightPaleIndexB; //Index of Pale entry to use for night
Second/time branch for environmental lighting.
DMAP
//0x10/16 bytes long
/*0x00*/ float mapSpaceX;
/*0x04*/ float mapSpaceY;
/*0x08*/ float mapSpaceScale; //Larger values make the scale smaller. Fractional scale?
/*0x0C*/ float unknown1; //always 00 00 00 00? Could be filler or a terminator
Settings for the dungeon maps accessed by pressing up on the D-pad.
DOOR
See TGDR.
EnvR
//0x8/8 bytes long
/*0x00*/ byte firstClearColoIndex; //Colo entry to use for clear weather
/*0x01*/ byte firstRainingColoIndex; //Colo entry to use for rainy weather
/*0x02*/ byte firstSnowingColoIndex; //Colo entry to use for snowy weather
/*0x03*/ byte firstUnknown2ColoIndex; //Colo entry to use for an unknown condition
/*0x04*/ byte secondClearColoIndex;
/*0x05*/ byte secondRainingColoIndex;
/*0x06*/ byte secondSnowingColoIndex;
/*0x07*/ byte secondUnknown2ColoIndex;
First/weather branch for environmental lighting.
EVNT
//0x18/24 bytes long
/*0x00*/ byte unknown1; //0xFF/255 in the majority of the time
/*0x01*/ string name; //see /stage/dat/event_list.dat
/*0x10*/ byte unknown2; //Only set when name == "MapToolCamera"
/*0x11*/ byte unknown3; //Only set when name == "MaptoolCamera"
/*0x12*/ byte unknown4;
/*0x13*/ byte unknown5;
/*0x14*/ byte roomNum; //Not always set
/*0x15*/ byte padding1;
/*0x16*/ byte padding2;
/*0x17*/ byte padding3;
Definitions for the events within a scene.
FILI
//0x08/8 bytes long
/*0x00*/ int32 Parameters; // See Below
/*0x04*/ float skyboxYOrigin; //Transformation of the skybox on the Y-axis compared to the worldspace's origin
Room environment settings. Game has this marked as "File List Info" for some reason, even though none of the contained things seem to have anything to do with File Lists. Only found in room.dzr, only 1 entry per .dzr seen so far.
Masks for the parameters section were pulled from the Dolphin Debugger. Unknown why some bits are skipped.
-
0100 0000 0000 0000 0000 0000 0000 0000 - Mask for Can Play Song of Passing
-
0001 1111 1110 0000 0000 0000 0000 0000 - Mask for Unknown 1
-
0000 0000 0001 0000 0000 0000 0000 0000 - Mask for IsWeather
-
0000 0000 0000 1100 0000 0000 0000 0000 - Mask for Wind Use Check
-
0000 0000 0000 0000 0111 1111 1000 0000 - Mask for Draw Depth
-
0000 0000 0000 0000 0000 0000 0111 1111 - Mask for Unknown 2
-
Can play song of passing: AND by 0x40000000 and shift right 30 bits.
-
Unknown: AND by 0x1FE00000 and shift right by 21 bits
-
IsWeather: AND by 0x100000 and shift right by 20 bits
-
Wind use check: AND by 0xC0000 and shift right by 18 bits
-
Draw depth: AND by 0x7F80 and shift right by 7 bits
FLOR
//0x14/20 bytes long
/*0x0*/ float lowerBoundaryYCoord;
/*0x4*/ byte floorNum; //0x8a, with a starting at 0
/*0x5*/ byte[15] includedRooms; //Each byte is a room number, and rooms in sequence are stored together
Defines different floors for dungeon map purposes.
LGHT
//0x1C/28 bytes long
/*0x00*/ float xCoord;
/*0x04*/ float yCoord;
/*0x08*/ float zCoord;
/*0x0C*/ float xRadius;
/*0x10*/ float yRadius;
/*0x14*/ float zRadius;
/*0x18*/ byte r;
/*0x19*/ byte g;
/*0x1A*/ byte b;
/*0x1B*/ byte padding;
Defines a dynamic light source in the map. Does not cast shadows, only adds color to nearby objects within the radius.
LGTV
See LGHT
Uses the same structure as LGHT, but has a Radius of 1,1,1 and a color that is transparent white. Used to define where shadows should cast from in the scene.
LBNK
//0x01/1 bytes long
/*0x00*/ byte Unknown;
Only one byte in length, usually 0xFF but some maps have different amounts. May be related to which layer to load, ie: some form of layer remap table to load a different layer (of the 12) than the original layer index.
MECO
//0x02/2 bytes long
/*0x00*/ byte roomNum;
/*0x01*/ byte memaIndex;
Assigns rooms to a MEMA entry.
MEMA
//0x04/4 bytes long
0x00 int memSize;
Defines the amount of memory to allocate for a room.
MULT
//0x0C/12 bytes long
/*0x0*/ float xTrans;
/*0x4*/ float yTrans;
/*0x8*/ short yRot;
/*0xA*/ byte roomNum;
/*0xB*/ byte unknown1;
Translates a room model to fit the collision mesh. Unknown1 may be a scalar multiplier for Water Height, as the calling function for dStage_stageDt_c::getMulti(const(void)) calls SetInf__25daSea_WaterHeightInfo, right after accessing it. It seems reasonable, I do think some areas of the sea have naturally higher wave heights all the time than others.
PATH
//0x0C/12 bytes long
/*0x00*/ short NumPoints; //Number of entries in this group
/*0x02*/ short AssociatedPathIndex; // Index of the next RPAT in the series, appears paths can be made of severall, nonconsecuitive chunks
/*0x04*/ byte unknown2; //Not sure what it does. Seems to be either 0xFF, 0, or 1
/*0x05*/ byte IsLoop; //Determines if the path is closed
/*0x06*/ short padding;
/*0x08*/ int firstEntryOffset; //Offset to the first entry of this group
Groups PPNT entries.
PLYR
//0x20/32 bytes long
/*0x00*/ string Link; //Always "Link"
/*0x08*/ byte evntIndex; //Specifies an event from the DZS file to play upon spawning. FF means no event
/*0x09*/ byte unknown1; //Padding?
/*0x0A*/ byte spawnType; //How Link enters the room
/*0x0B*/ byte roomNum; //room number of the room the spawn is in
/*0x0C*/ float spawnXCoord;
/*0x10*/ float spawnYCoord;
/*0x14*/ float spawnZCoord;
/*0x18*/ short unknown2; //Always 0
/*0x1A*/ short yRotation;
/*0x1C*/ byte unknown3; //Always 0xFF
/*0x1D*/ byte spawnID; //ID used by SCLS entries to enter the map
/*0x1E*/ short unknown4; //Always 0xFFFF
Defines spawn points for Link.
Pale
// 0x2C/44 bytes long
/*0x00*/ Color24 ActorAmbientColor; // TEV Color0 color for actor models
/*0x03*/ Color24 ActorLightColor; // TEV kColor0 color for actor models
/*0x06*/ Color24 RoomAmbientColor; // TEV Color0 color for room models (model)
/*0x09*/ Color24 RoomLightColor; // TEV kColor0 color for room models (model)
/*0x0C*/ Color24 WaveColor; // TEV Color0 color for room models (model1)
/*0x0F*/ Color24 OceanColor; // TEV kColor0 color (model1)
/*0x12*/ Color24 UnknownWhite1Color; // Typically this is pure white or just off of it
/*0x15*/ Color24 UnknownWhite2Color; // Ditto here
/*0x18*/ Color24 DoorwayColor; // TEV Color0 color for room models (model3)
/*0x1B*/ Color24 UnknownColor3;
/*0x1E*/ Color24 FogColor;
/*0x21*/ byte VirtIndex; // Index of Virt entry to use for skybox colors
/*0x22*/ byte padding;
/*0x23*/ byte padding;
/*0x24*/ float FogFarPlane;
/*0x28*/ float FogNearPlane;
Main body of environmental lighting.
PPNT
//0x10/16 bytes long
/*0x00*/ int unknown1;
/*0x04*/ float xCoord;
/*0x08*/ float yCoord;
/*0x0C*/ float zCoord;
Defines waypoints.
RARO
See AROB
RCAM
See CAMR
RPAT
See PATH
RPPN
See PPNT
RTBL
Entry Offsets
//0x04/4 bytes long
/*0x00*/ int entryOffset;
//There are chunkHeader.numEntries entry offsets.
Entry
//0x08 bytes long
/*0x00*/ byte NumRooms;
/*0x00*/ byte ReverbAmount; // Amount of reverb in this room
/*0x02*/ byte IsTimePass; //0 means time is halted, 01 means time flows normally
/*0x03*/ byte Unknown2; //Always 0
/*0x04*/ int TableOffset;
Table
byte[numRooms] LoadedRoomIndexes;
Defines what other rooms are loaded while in any given room, and whether time flows in them.
The RTBL section is composed of chunkHeader.numEntries
RTBL offsets. Each of these lists the offset (from the start of the DZS file itself) to an associated RTBL Entry. The RTBL Entry numRooms
specifies the number of rooms that are to be co-loaded (currently active room included), while tableOffset
points to an RTBL Table element (from the start of the DZS file). The RTBL Table elements are set up where they are of numRooms
length. The roomId of the current room is the first byte followed by a byte for the ID of each concurrently loaded room.
SCLS
//0xC/12 bytes long
/*0x0*/ string DestName; //Name of destination worldspace
/*0x8*/ byte SpawnNum; //Number of destination room
/*0x9*/ byte DestRoomNum; //Spawn index to use to enter the destination map
/*0xA*/ byte FadeType; //How the camera fades from the old room to the new room. Initialized to 0 and filled at runtime?
/*0xB*/ byte padding;
Defines the exits in a scene. byte at 0x8 might be two 4 bit values, overworld has lots of values in the 100-105 range which seems awfully high. If split into two chunks, gives you two indexes in more sane ranges (0-10)
SCOB
//0x24/36 bytes long
/*0x00*/ string objectName; //8 bytes long
/*0x08*/ byte param0;
/*0x09*/ byte param1;
/*0x0A*/ byte param2;
/*0x0B*/ byte param3; //These four fields are context-sensitive. They differ between objects
/*0x0C*/ float xCoord;
/*0x10*/ float yCoord;
/*0x14*/ float zCoord;
/*0x18*/ short auxiliaryParam1; //only objects that call up text use this, and it's for the text ID
/*0x1A*/ short yRotation;
/*0x1C*/ short unknown1;
/*0x1E*/ short unknown2; //Could be padding, seems to always be FF FF
/*0x20*/ byte scaleX;
/*0x21*/ byte scaleY;
/*0x22*/ byte scaleZ;
/*0x23*/ byte padding;
Short for SCalable OBject. Deals with objects that require trigger radii or scaling.
SHIP
//0x10/16 bytes long
/*0x00*/ float xCoord;
/*0x04*/ float yCoord;
/*0x08*/ float zCoord;
/*0x0C*/ short yRot;
/*0x0E*/ byte ShipID;
/*0x0F*/ byte Unknown;
Defines spawn points for the King of Red Lions.
SOND
//0x1C/28 bytes long
/*0x00*/ string "sndpath";
/*0x08*/ float xCoord;
/*0x0C*/ float yCoord;
/*0x10*/ float zCoord;
/*0x14*/ byte unknown1; //typically 00, but one example had 08
/*0x15*/ byte padding;
/*0x16*/ byte unknown2; //typically FF, but Outset's entries have the room number, 0x2C, here
/*0x17*/ byte soundID;
/*0x18*/ byte soundRadius; // Appears to be an index into the RPAT array of path to follow.
/*0x19*/ byte padding;
/*0x1A*/ byte padding;
/*0x1B*/ byte padding;
Defines ambient noises in a scene. SoundID might be relative to the room in some way - code references: execute__8dEnvSe_cF, dPath_GetRoomPath__Fii, dEnvSe_getNearPathPos__FP4cXyzP4CxyzP5dPath, dPath_GetNextRoomPath__FP5dPathi. Seems to find the nearest Path.
STAG
//0x14/20 bytes long
/*0x00*/ float depthMin;
/*0x04*/ float depthMax;
/*0x08*/ short stageID; //Determines if the worldspace is a dungeon, and if so, which one. 0x7 is Dragon Roost Cavern, 0x9 is the Forbidden Woods, 0xB is the Tower of the Gods, 0xD is the Earth Temple, and 0xF is the Wind Temple. The only differences that could be seen between them is that these IDs display the key counter in the UI and write the correct names into the space on the dungeon map screen.
/*0x0A*/ short loadedParticleBank; //particle bank to load for the worldspace. Method of IDing a certain particle bank is currently unknown.
/*0x0C*/ short propertyIndex; //Determines, from what can be seen, the fill color of the mini-map, whether Link can use his items or not, and whether the sun draws in the sky. 0x1F is the overworld, 0x29 is for dungeons. There are other IDs that need to be documented
/*0x0E*/ byte unknown;
/*0x0F*/ byte unknown1;
/*0x10*/ byte unknown2; //RGB data? I don't know for what though, nothing changed when I changed this. These three unknowns are usually set to 00 00 FF. That can be the default value to use for file creation, since it works
/*0x11*/ byte unknown3;
/*0x12*/ short drawRange;
Defines settings for stages. Found in stage.dzs, only seen one per file. The various parameters listed above get more complicated (of course), below is a confusing outline of what masks were seen when using Dolphin Debugger, mostly incomplete.
Bit masks for the short at 0xA: 0000 0111 1111 1000
Bit masks for the field at 0xC: 0000 0000 0000 0111 1111 1111 0000 0000 0000 0000 0000 0111 0000 0000 0000 0000 - 0000 0000 0000 0000 1111 1111 0000 0000 - envcolor_init 0000 0000 0000 0000 0000 0000 1111 1111 - SetSchBit
Bit masks for the field at 0x10: 0000 0000 1111 1111 0000 0000 0000 0000 - SetSchBit 0000 0000 0000 0000 1111 1111 1111 1111 - View_Setup
TGDR
This chunk defines the doors in a scene.
/*0x00*/ string Name; //door10, door20, keyshut, or Zenshut
/*0x08*/ int UnlockSwitchEventNoDoorTypeSwitchIDBitField; //A bit field. See below for info and masks.
/*0x0C*/ Vector3 Position;
/*0x18*/ short RoomLoadingParams;
/*0x1A*/ short YRotation;
/*0x1C*/ byte Arg1; //This is the name that the game gives it
/*0x1D*/ byte ShipID; //0x3F is null
/*0x1E*/ byte unknown7;
/*0x1F*/ byte Unknown8;
/*0x20*/ byte ScaleX; //Not functional?
/*0x21*/ byte ScaleY; //Not functional?
/*0x22*/ byte ScaleZ; //Not functional?
/*0x23*/ byte Unknown9;
Notes
UnlockSwitch:
This holds the ID for a switch. When that switch is activated, the door will be unlocked.
The mask for this field is:
0000 1111 1111 0000 0000 0000 0000 0000 (0x0FF00000)
EventNo:
Seems to be the index of an event from the EVNT chunk to play, but it doesn't seem to be used.
The mask for this field is:
0000 0000 0000 1111 1111 0000 0000 0000 (0x000FF000)
DoorType:
This value is the door type. The types are defined below.
0 - Normal door
1 - Boss door (Locked by default)
2 - Barred door
3 - Unknown
4 - Locked door
The mask for this field is:
0000 0000 0000 0000 0000 1111 0000 0000 (0x00000F00)
SwitchID:
The exact purpose of this field is unknown, but it appears to specify a region of memory that indicates whether the door should be locked or unlocked. Hypothetically, this region of memory would be initialized to zero, which indicates a locked door, and is then set to one when the door is unlocked.
The mask for this field is:
0000 0000 0000 0000 0000 0000 1111 1111 (0x000000FF)
RoomLoadingParams:
This short is a bit field that indicates what room the door leads to and what room Link is leaving. The masks for these values are as follows:
0000 1111 1100 0000 (0x0FC0) - Room to be loaded
0000 0000 0011 1111 (0x003F) - Room that Link is leaving
Arg1:
This appears to specify what model to use for doors in the Earth and Wind Temples, since they don't keep their door models in their Stage.arcs. It's most heavily used in the Wind Temple (kaze) where most have 0x0A/10, while the miniboss door uses 0x0B/11 and the boss door has 0x0C/12. The Earth Temple mostly uses 0xFF/255, but the miniboss door uses 8 and the boss door uses 9.
ShipID:
The assumption is that this value indicates the ID of a SHIP entry to load the King of Red Lions at.
ScaleX, ScaleY, ScaleZ:
SCOB uses these fields to indicate scaling values for objects, but they don't appear to affect the size of the door.
TRES
//0x20/32 bytes long
/*0x00*/ string name;
/*0x08*/ byte param1; //Always null?
/*0x09*/ byte chestTypeAndFlagNyb1;
/*0x0A*/ byte flagNyb2AndUnknown;
/*0x0B*/ byte appearCondition;
/*0x0C*/ float xCoord;
/*0x10*/ float yCoord;
/*0x14*/ float zCoord;
/*0x18*/ short roomNum;
/*0x1A*/ short yRot;
/*0x1C*/ byte chestItem;
/*0x1D*/ byte FlagID; // See below
/*0x1E*/ short padding;
Defines treasure chests on land.
chestTypeAndFlagNyb1
The high nybble controls the chest type:
- 0x - Normal wooden
- 1x - Dark wooden
- 2x - Dungeon metal
- 3x - Boss key
The low nybble is actually the high nybble of the flag to check for before the chest either spawns or is able to be opened.
flagNyb2AndUnknown
The high nybble of this parameter is actually the low nybble of the flag that is checked before the chest will be accessible.
If there is a chestTypeAndFlagNyb1 of 0x2E, and a flagNyb2AndUnknown of 0x30, making for a sequence of 0x2E30, the flag to check is actually 0xE3.
appearCondition
It seems that only the low nybble of the byte means anything, since the high nybble has been observed to be both 0 and 8, with no unique behavior.
- 00 - None
- 01 - Trigger switch 1 (Chest appears when flag is set)
- 02 - Defeat all enemies
- 03 - Trigger switch 2 (Chest is visible but can't be opened until flag is set)
- 04 - Hit chest with light beam
- 05 - Trigger switch 3 (Chest appears with swirling wind particles when flag is set)
FlagID
This is the flag to set once the chest has been opened.
The first nybble is the index of a short in memory. The second nybble is the index of the bit within that short to set. If we have a FlagID of 0x3F, for example, bit 0xF/15 in byte 6 will be set. The position of the byte in memory to manipulate can be calculated by multiplying the first nybble by two: 3 * 2 = 6.
Virt
//0x24/36 bytes long
/*0x00*/ int unknown1;
/*0x04*/ int unknown2;
/*0x08*/ int unknown3;
/*0x0C*/ int unknown4;
/*0x10*/ Color32 HorizonCloudColor; // Color of clouds on the horizon, including vr_back_cloud
/*0x14*/ Color32 CenterCloudColor; // Color of clouds near the center of the sky
/*0x18*/ Color24 VRSkyColor; // The color of the main sky model, vr_sky
/*0x1B*/ Color24 VRUsoUmiColor; // The color of the ocean's horizon, or "false sea," vr_uso_umi
/*0x1E*/ Color24 VRKasumiMaeColor; // The color of the sky's horizon, vr_kasumi_mae
/*0x21*/ byte padding;
/*0x22*/ byte padding; //Entries would be 0x21 bytes long without these. Ick.
/*0x23*/ byte padding;
Skybox level of environmental lighting.