The ROOM format is used to store object layout data in Tropical Freeze.
|
This file format needs more research Still a lot of unknown values and a lot of things that aren't known about how objects interact with each other.
|
Format
Type
|
Count
|
Name
|
Notes
|
Form Descriptor
|
1
|
ROOM Form Descriptor
|
Data type is ROOM
|
Header
|
1
|
Header
|
|
Layer
|
Varying
|
Layers
|
Each layer is under its own form. Unsure if the format has a layer count anywhere.
|
Type
|
Count
|
Name
|
Notes
|
Chunk Descriptor
|
1
|
Room Header Descriptor
|
Data type is RMHD
|
u16
|
1
|
Unknown
|
Always 3?
|
Performance Groups
Type
|
Count
|
Name
|
Notes
|
Chunk Descriptor
|
1
|
Performance Groups Descriptor
|
Data type is PGRP
|
u16
|
1
|
Performance Group Count
|
|
Performance Group
|
Performance Group Count
|
Performance Groups
|
|
Performance Group
Type
|
Count
|
Name
|
Notes
|
u32
|
1
|
Name Length
|
|
char
|
Name Length
|
Performance Group Name
|
Not zero-terminated
|
GUID
|
1
|
PerformanceGroupController Instance GUID
|
|
bool
|
1
|
Unknown
|
|
u16
|
1
|
Layer Count
|
|
GUID
|
Layer Count
|
Layer GUIDs
|
|
Generated Object Map
Generated Object
Type
|
Count
|
Name
|
Notes
|
GUID
|
1
|
Unknown
|
|
GUID
|
1
|
Unknown
|
|
Load Unit
Type
|
Count
|
Name
|
Notes
|
Form Descriptor
|
1
|
Load Unit Descriptor
|
Data type is LUNT
|
Chunk Descriptor
|
1
|
Load Unit Header Descriptor
|
Data type is LUHD
|
u32
|
1
|
Name Length
|
|
char
|
Name Length
|
Load Unit Name
|
For some reason these seem to generally have really short names (sometimes a single character).
|
GUID
|
1
|
Unknown
|
Probably the GUID for this load unit
|
u16
|
1
|
Unknown
|
|
Chunk Descriptor
|
1
|
Load Unit Resources Descriptor
|
Data type is LRES
|
u32
|
1
|
Resource Count
|
|
GUID
|
Resource Count
|
Load Unit Resources Array
|
Likely a list of all resources that are used by this load unit.
|
Chunk Descriptor
|
1
|
Load Unit Layers Descriptor
|
Data type is LLYR
|
u32
|
1
|
Layer Count
|
|
GUID
|
Layer Count
|
Load Unit Layers Array
|
Likely a list of all layers that are part of this load unit. (Note that it seems layers can be included in multiple load units.)
|
Layer
Type
|
Count
|
Name
|
Notes
|
Form Descriptor
|
1
|
Layer Form Descriptor
|
Data type is LAYR
|
Chunk Descriptor
|
1
|
Layer Header Descriptor
|
Data type is LHED
|
u32
|
1
|
Name Length
|
|
char
|
Name Length
|
Layer Name
|
|
GUID
|
1
|
Layer ID
|
|
u32
|
1
|
Unknown
|
|
GUID
|
1
|
Unknown
|
|
bool
|
1
|
Unknown
|
|
Form Descriptor
|
1
|
Unknown Descriptor
|
Data type is GSRP . Often has a size of 0.
|
Form Descriptor
|
1
|
Script Descriptor
|
Data type is SRIP
|
Game Object Component
|
Varies
|
Components
|
Unsure if there is a layer component count.
|
Game Object Component
Type
|
Count
|
Name
|
Notes
|
Chunk Descriptor
|
1
|
Component Descriptor
|
Data type is COMP
|
u32
|
1
|
Component Type
|
This appears to be a hash of the component name.
|
GUID
|
1
|
Instance ID
|
|
u32
|
1
|
Name Length
|
|
char
|
Name Length
|
Instance Name
|
|
The remaining data seems to have two structures; one that's used by most objects and one that's specific to GameObject components.
Regular structure:
Type
|
Count
|
Name
|
Notes
|
u16
|
1
|
Connection Count
|
|
Connection
|
Connection Count
|
Connection Array
|
These establish links to other components to allow them to interact
|
u32
|
1
|
Property Count
|
|
Property
|
Property Count
|
Object Properties
|
|
GameObject structure:
Type
|
Count
|
Name
|
Notes
|
u32
|
1
|
Sub-Component Count
|
|
Sub-Component
|
Sub-Component Count
|
Sub-Component Array
|
Seems to describe other script components that are children of this one.
|
bool
|
1
|
Unknown
|
This is likely the Active flag that appears on every object in the previous games.
|
vector3
|
1
|
Position
|
|
vector3
|
1
|
Rotation
|
Euler XYZ angles in degrees (presumably in ZYX order like the previous games).
|
vector3
|
1
|
Scale
|
|
Connection
Type
|
Count
|
Name
|
Notes
|
char
|
4
|
Event
|
This is the event that causes the connection to trigger. (These are what were called States in the previous games.)
|
char
|
4
|
Action
|
Action that the connected object should execute when the connection triggers. (These are what were called Messages in the previous games.)
|
GUID
|
1
|
Target Instance ID
|
Instance ID of the target object that
|
u32
|
1
|
Unknown
|
|
Property
Type
|
Count
|
Name
|
Notes
|
u32
|
1
|
Property ID
|
32-bit hash of the property name.
|
u16
|
1
|
Property Size
|
|
|
|
Property Data
|
Varies depending on the type of the property (which is hardcoded depending on the property ID).
|
Sub-Component
This structure is used to define sub-components that are attached to GameObject components.
Type
|
Count
|
Name
|
Notes
|
char
|
4
|
Type
|
Usually COMP , but sometimes other things like IL00 . Not sure what it means.
|
GUID
|
1
|
Component ID
|
|
bool
|
1
|
Unknown
|
Might be an Active/Enabled flag.
|
Component Types
ID
|
Component
|
0x749749F1
|
GameObject
|
0x4EC5FA3A
|
FakePlayerControls
|
0x57153AA4
|
StaticCollision
|
0x41956904
|
RenderWorld
|
0xB4361E7B
|
ActorCollision
|
0x2BE8BC19
|
LightStatic
|
0x9EE5541D
|
LightDynamic
|
0xCD098F70
|
Effect
|
0x8FE0BFC9
|
Relay
|
0xA7DB53C1
|
Counter
|
0xADA85938
|
SeaLion
|
0xAAEBA313
|
WarusKing
|
0x05DD288E
|
Switch
|
0x9E8A4940
|
Timer
|
0xD616EE8B
|
ControllerAction
|
0xD898656D
|
Waypoint
|
0xF0240D23
|
PathControl
|
0x4FE57689
|
CameraHint
|
0x97E65DDD
|
TouchableTrigger
|
0x1A4117AB
|
Toucher
|
0xC49D730E
|
TriggerLogic
|
0xD47974E4
|
FiniteStateMachine
|
0x1349E5AC
|
CustomInterpolation
|
0xC1F64515
|
CameraTarget
|
0xDE522669
|
Generator
|
0x1383F6D6
|
GeneratorDeleter
|
0x2C4F2D31
|
SplineMotion
|
0x1223437C
|
Creature
|
0x21C57D2B
|
DynamicActorCollision
|
0xDF31EC16
|
Render
|
0xAE921C3B
|
Player
|
0x81A242A0
|
DirectionalIrradianceMap
|
0xBDE4AB05
|
TakeDamage
|
0x5453C979
|
MasterSlave
|
0x07E3137F
|
TraceObject
|
0x046FAD23
|
TimerSequence
|
0x3175DF36
|
ApplyDamage
|
0x65E2349B
|
RelayRandom
|
0xABBCFC6A
|
RelayConditional
|
0xEA30E0B1
|
SpawnPoint
|
0x1FB9AF22
|
ActorKeyframe
|
0xCB6D9ACE
|
PlayerProxy
|
0x6FB22081
|
BarrelCannon
|
0xF4567AD7
|
RumbleEffect
|
0x10EA9EC8
|
ObjectFollow
|
0x481EA5AF
|
Pickup
|
0xBC9A60AE
|
CameraManager
|
0xDB38B3FB
|
GroundPoundDetector
|
0xBE82DEF3
|
Projectile
|
0x43C0D52A
|
ClingPathControl
|
0xB85D6790
|
ColorModifier
|
0x021C14B0
|
Explosion
|
0x16702F15
|
ReloadSetLoader
|
0x660FC7C1
|
Checkpoint
|
0x8C2CCFAC
|
PlayerRespawn
|
0xC0281AE7
|
ImpulseDriver
|
0xD4538C9B
|
Bouncer
|
0x06E89BE7
|
Health
|
0xE0AFAF06
|
PlayerActionHint
|
0x1A90271D
|
Grabbable
|
0x3C23783B
|
GrabThrow
|
0x9373FEC0
|
Respawn
|
0xAF565E69
|
SwingRope
|
0xC7B43DA6
|
ActorInteraction
|
0xC9ED6454
|
WindWaker
|
0x78D8893A
|
CameraTargetPlayer
|
0xA86E6401
|
PoiObject
|
0xFDD83489
|
Sound
|
0xCCAD4BD9
|
PerformanceGroupController
|
0x502506D6
|
TouchSet
|
0x88603CF7
|
MineCartProxy
|
0xE1E1C49C
|
WaterVolume
|
0x6C5D597D
|
NearVisible
|
0x3449A5DF
|
Swimmer
|
0x591D8F55
|
CharacterPrimitivesCollision
|
0x90D8D3CE
|
RenderMethodResolver
|
0xBD4CFA2F
|
TriggerForce
|
0x3150D2F6
|
FuseBomb
|
0xAF3A06F2
|
PathControlZipline
|
0xD32870DF
|
PolarBear
|
0x2131C235
|
GroupSpawn
|
0x2751EBF2
|
AnimationGridController
|
0x18B96D29
|
TimerAnimationGridParamProvider
|
0xB9F9F04C
|
ActionDetector
|
0x343A47F7
|
CameraShaker
|
0x06159C2D
|
RespawnBalloon
|
0x7E6063C8
|
PlayerActor
|
0x91F22DCF
|
Tippy
|
0x89F426F2
|
CinematicCameraShot
|
0x1EB2749F
|
ConveyorModifier
|
0x73AECD92
|
FogVolume
|
0x845E492A
|
Retronome
|
0x23C5DFF4
|
WaterRenderVolume
|
0x55F80CCE
|
CinematicSkipHandler
|
0xAB5C5D7B
|
BonusRoom
|
0x3A3A6FAD
|
TireBounce
|
0x9D25FE2D
|
BeatUpHandler
|
0x9FC07D01
|
Owl
|
0xA42F7AB9
|
GrabbableGenerator
|
0xF34EDD1F
|
InventoryItem
|
0x18C0AD0F
|
EndGame
|
0xEBE92100
|
RocketBarrelProxy
|
0xB7ADA3EC
|
BurningBranch
|
0x59AB515E
|
HotCoals
|
0xE21D45CB
|
BarrelBalloon
|
0x6302BBB3
|
UVTransform
|
0x5FEF037B
|
Baboon
|
0x25899782
|
MusicData
|
0x1AC8C8FD
|
MusicStateController
|
0x47A60DC3
|
MusicSystemTransport
|
0x5CF17BFE
|
AdapterManager
|
0xCA08C6A4
|
WaterRenderDecal
|
0x7F6D1CBA
|
RelayAutoFire
|
0x3DAAF68B
|
BaboonManager
|
0xD745DC42
|
GraphicalTransition
|
0x0FA3899C
|
RetronomeDriver
|
0x57E54B9D
|
EndLevel
|
0x6780941E
|
SuperCombinedAbilityEmitter
|
0xB8B6A22E
|
SuperCombinedAbilityResponder
|
0x0AF8D63C
|
MapPlayer
|
0x8CB5BF7D
|
MapPathControl
|
0xEBE0DAEE
|
WaterCurrentVolume
|
0xA7D1C922
|
CausticVolume
|
0x35D8F3F0
|
PufferFish
|
0xBA796FEF
|
Playlist
|
0xC2F2282A
|
WindWakerImpulser
|
0xE03DD39F
|
MapNode
|
0x55AAB5F1
|
RambiCrate
|
0x24D9D323
|
AudioEffect
|
0xF7602744
|
DSP
|
0x160E9AF9
|
RoomSettings
|
0x5746A908
|
DynamicActorControl
|
0x59276E0E
|
HUDAnchor
|
0xF442A668
|
TimeKeyframe
|
0xB6040870
|
RelayProbabilityGameMode
|
0xF3847DE3
|
FlyingPickupEffect
|
0x212BCDF5
|
SimpleShadow
|
0x655C5175
|
AudioBusController
|
0xF6751A5D
|
PlayerKeyframe
|
0xC04DAF13
|
BreathMonitor
|
0x4C7B9FC8
|
DirectionalIrradianceProbes
|
0x0BE7FC29
|
SurfaceControl
|
0xB6EC1A51
|
SimpleSound
|
0xD2CAC9A5
|
LightGroupProxy
|
0xDFD2A23A
|
DialogPanel
|
0xBCCB1B30
|
MinecartPathManager
|
0xD856F6B9
|
Imposter
|
0xBD040603
|
LevelDarkener
|
0xA72A9926
|
RenderGroup
|
0x3258FD44
|
RenderToFlash
|
0x3ABCFF68
|
SkinSwap
|
0xC532AD25
|
ScreenCaptureToFlash
|
0xB152AD59
|
PlayerSound
|
0xBFF963D2
|
StreamedMovie
|
0x7DCAF170
|
BloomEffect
|
0x1243C3E3
|
ProjectedSimpleShadowReceiver
|
0x5368FF52
|
ShopData
|
0xA04F0C68
|
ShopInstance
|
0x5B0C954B
|
UICameraSelector
|
0x7CC0B7BF
|
Squawks
|
0xB177FA02
|
SquawksProxy
|
0x4C53A836
|
UnitController
|
0x008E3AF5
|
FlashTextureSwapper
|
0xF5D80D1A
|
Extras
|
0xBB449D71
|
ExtrasType
|
0xA98F9015
|
ExtrasCategory
|
0xEE0D6FD4
|
DynamicLoadManager
|
0xFDDB58A1
|
MapManagerProxy
|
0xA32E718F
|
Achievement
|
0x62913993
|
AudioBusMixer
|
0xADCD416E
|
Credits
|
0xA4E4FE1D
|
HUDFadeDetector
|
0xAF9DEA76
|
ProductionFrontEndProxy
|