In Resident Evil Outbreak, RDT files contain supplementary gameplay data related to a particular room in a given scenario. An RDT file contians information like the sound bank data for footstep sounds, sound bank data for environment sounds, camera definitions, lighting configuration, triggers, spawn points, pushable object grid information, etc...
Header of any given RDT file is as follows...
struct RDTSectionDef {
u32 offset;
s32 size;
}; // size: 8 bytes
struct RDTHeader {
RDTSectionDef sections[32];
};
where in RDTSectionDef
:
offset
is a file-relative offset to
data of a section,size
is size in bytes of a section.Section ID | Description |
---|---|
Camera set definitions | |
Room script | |
Footstep sound bank | |
Environment sound bank | |
Unknown | |
Spawn point definitions | |
Trigger definitions | |
Point light configuration | |
Fog and directional light configuration | |
Pushable object grid information | |
Route information | |
Background sound configuration |
Contained in section with index 0. TODO
Contained in section with index 1. For more information see "Script Format".
TODO
Spawn points are contained in section with index 7.
When teleporting players from the script, often than not, these spawn points are used to determine where the player will end up. That includes initial player spawn.
NOTE: Certain script opcodes apply the teleportation only after a demo is played.
The section format can be described as follows...
struct SpawnPoint {
s32 positionX;
s32 positionZ;
s32 rotationY;
s32 unknown0;
s32 unknown1;
s32 positionY;
s32 unknown2;
s32 unknown3;
}; // size: 20 bytes
struct SpawnPointsSection {
u32 count;
SpawnPoint points[count];
};
where
positionX
, positionY
, and positionZ
define the starting player
position in the 3D space (unit: centimeters).rotationY
defines the starting player rotation around the Y axis.
(unit: integer rotation, where 0x8000
is π. Internally it's a 16-bit signed integer, so 0x8000
would overflow to -0x8000
, which is -π).Contained in section with index 10. TODO
Contained in section with index 11.
This section contains information on point lights present in the scene. A collection of point lights is a package and the game allows to switch between light packages in scripts. Individual point lights inside of a package can be enabled or disabled from scripts as well.
struct vec3 {
f32 x, y, z;
}; // size: 12 bytes
struct ColorRGBAF {
f32 r, g, b, a;
}; // size: 16 bytes
struct Light {
ColorRGBAF diffuse;
ColorRGBAF ambient;
vec3 position;
f32 attenuation;
f32 range;
}; // size: 52 bytes
struct LigPackage {
s32 enabled;
u32 lightCount;
u8 unused[108];
Light lights[lightCount];
};
struct LigSection {
u32 tag; // Always set to 4
u32 packageCount;
u32 offsets[packageCount]; // Offsets to LigPackage
};
where in Light
:
diffuse
is the color for the Lambertian-Gouraud diffuse lighting applied to the character models.ambient
is the color for the ambient lighting.position
determines the location of the light in the scene.attenuation
determines how fast the light fades with distance.range
is self-explanatory, although it is worth mentioning that the range specifically is checked by the position of a character/object in the scene, not for each vertex. In the original game, a character can have at most two point lights applied to them. Using the range, as well as diffuse color, the game determines the weight of each individual light and picks the ones with highest weight.in LightPackage
:
enabled
signifies whether the package can be used. If set to zero, the game won't use it.unused
is data that is present in the light package but goes unused by the game. It looks like a fog configuration.Contained in section with index 13.
This section contains basic fog and directional light configurations. Which specific configuration is used is determined by the current camera set.
Format of this section can be described as follows...
// Pay attention to channel order!
struct Color32BGRA {
u8 b, g, r, a;
}; // size: 4 bytes
struct ColorRGBAF {
f32 r, g, b, a;
}; // size: 16 bytes
struct FogConfig {
u32 enabled;
f32 fogBegin;
f32 fogEnd;
Color32BGRA fogColor;
Color32BGRA stageAmbient;
Color32BGRA objectAmbient;
u32 shadowConfig;
s16 shadowRotation[4];
ColorRGBAF dirLightDiffuse;
ColorRGBAF dirLightAmbient;
ColorRGBAF dirLightSpecular;
s32 dirLightRotation[2];
s32 dirLightFromCamera;
}; // size: 96 bytes
struct FogSection {
u32 tag; // Always set to 2
u32 count;
u32 offsets[count];
FogConfig configurations[count];
Color32BGRA backgroundColor;
};
where in FogConfig
:
enabled
signifies whether the configuration should be used. If set to zero, the game won't apply it even if it's specified in the camera set configuration.fogBegin
describes how far from the camera should the fog start.fogEnd
describes how far from the camera should the fog end. At the end of fog, all geometry that has the fog attribute enabled will be rendered with the fogColor
.fogColor
is the color used for simple linear distance fog rendering.stageAmbient
is the ambient color of the stage, as in color without applied lighting. (Lighting between stage and objects is separate, stage only receives lighting from things like gunshots and whatnot. Overall lighting is baked into vertex colors).objectAmbient
is the ambient color of the objects, including things like items and characters.shadowConfig
is a value that specifies what type of shadow should any kind of character have and what opacity it should have. (meaning).shadowRotation
describes which way the silhouette shadows should be rotated.dirLightDiffuse
is the diffuse color (factor for the applied lighting) of the directional light that is applied to objects.dirLightAmbient
is the ambient color of the directional light.dirLightSpecular
is the specular color of the directional light (seemingly unused by the game?).dirLightRotation
describes the direction of the directional light.dirLightFromCamera
can be set to 1 to force the game to ignore dirLightRotation
and direct the light from the camera position towards the target.in FogSection
:
tag
is just a magic value that the game looks at for sanity checks, should be set to 2.offsets
is an array of offsets to individual fog configurations.backgroundColor
is the color that the game will use to clear the screen before rendering the scene.NOTE: The alpha channel of colors inside fog structures is ignored and is there for padding purposes.
Bits | Meaning |
---|---|
Shadow opacity | |
Client player shadow mode | |
Other player shadow mode | |
NPC shadow mode | |
Enemy shadow mode |
Mode ID | Meaning |
---|---|
Silhouette shadow | |
No shadow | |
Round shadow | |
No shadow |
When a silhouette shadow is not available for the character (the SDW file was not loaded for various reasons or does not exist), the game will default to the round shadow.
Description | Bytes |
---|---|
No shadows | FF 00 55 00 |
All silhouette | FF 00 00 00 |
All round | FF 00 AA 00 |
Examples above have all 0xFF (maximum) shadow opacity.
Contained in section with index 14.
Pushable objects exist on a grid within a room, where each cell is 50cm x 50cm x 50cm. This section contains information for that grid, as well as markers that can be referenced in scripts for conditionals.
struct vec3 {
f32 x, y, z;
}; // size: 12 bytes
struct Marker {
u8 enabled;
u8 unused;
u8 x;
u8 z;
}; // size: 4 bytes
struct PushableObjectGridSection {
vec3 position;
u32 width;
u32 height;
u32 pushCollision[288]; // array count derived from 96*96/32
u32 climbCollision[288]; // array count derived from 96*96/32
Marker markers[8];
}; // size: 2356 bytes
where in PushableObjectGridSection
:
position
is the starting location of grid in the room (corner). Cells are "placed" in the +X/Z direction.width
is self-explanatory (in cells, X-axis, 96 is the maximum).height
is self-explanatory (in cells, Z-axis, 96 is the maximum).pushCollision
is a bitfield grid that describes whether pushable objects can be moved towards each cell of the grid. Each bit describes one cell of the grid (1
= cannot move, 0
= can move). The data is organized as a 96x96 grid compacted into 32-bit words, where a bit index for a cell coordinate can be calculated using the following formula: 96*x + z
.climbCollision
is a bitfield grid that describes whether players can climb onto/from pushable objects from/onto particular cells. Organized the same way as pushCollision
. (1
= can't climb, 0
= can climb).Contained in section with index 15. TODO
Contained in section with index 16.
struct ivec3 {
s32 x, y, z;
}; // size: 12 bytes
struct vec3 {
f32 x, y, z;
}; // size: 12 bytes
struct SoundWalkArea {
u32 priority;
ivec3 area[8];
u8 material[2];
u8 _padding[2];
}; // size: 104 bytes
struct SoundSource {
u32 enabled;
u32 sound;
vec3 position;
u32 curve;
u32 behavior;
}; // size: 28 bytes
struct SoundConfSection {
u32 walkAreaCount;
u32 soundSrcCount;
u32 offsets[walkAreaCount];
SoundWalkArea walkAreas[walkAreaCount];
SoundSource sources[soundSrcCount];
u8 defaultMaterial[2];
u8 _padding[2];
u32 unknown;
u32 reverbDepth;
u32 reverbDelay;
u32 reverbFeedback;
};
where in SoundWalkArea
:
priority
is self-explanatory, higher value means higher priority over other overlapping areas.area
is an array of coordinates for an arbitrary 3D convex shape describing the area in which the material should be applied.material
describes which sound programs in the RDT footstep sound bank (section 2) will be played. Can play sounds from two different programs simultaneously.in SoundSource
:
enabled
has to be non-zero for the entry to do anything.sound
is the sound ID in the RDT environment sound bank (section 3), specific to FILE #1: if the 16th bit is set (0x80xx
), lower 8-bits are a file index to an ADX file in the sXXenv.afs
scenario-specific AFS archive, FILE #2 will just disable the source if the 16th bit is set.position
is the position of the sound source in the 3D space. Used for panning and volume calculation.curve
is the index of the lookup table used for calculating the volume.behavior
describes the mode in which the source will operate. 0 is normal, 1 will play random sounds in the range of <sound, sound+2>
, 2 and higher will probably crash the game (at least in FILE #2).in SoundConfSection
:
walkAreaCount
is the amount of SoundWalkArea
entries in the section.soundSrcCount
is the amount of SoundSource
entries in the section.offsets
are section-relative offsets to SoundWalkArea
entries.defaultMaterial
is the material used when the player is outside every walk area.reverbDepth
is the volume of the reverb in the range of <0x0000, 0x7fff>
.reverbDelay
and reverbFeedback
are completely irrelevant due to the used reverb config by the game (Studio Large), which does not utilize those variables at all.Last updated on 2025-08-31.