A room settings file stores palette choices, environmental values, effects, placed objects, ambience, and triggers separately from rendered room geometry. For HA_A01, the ordinary region file is world/ha-rooms/ha_a01_settings.txt.

flowchart TD
    A[Region template] -->|inherit| B[Room settings]
    C[Local values] -->|override| B
    B --> D[Realized room]
    B -->|save| E[Timeline file]

Line and record syntax

global::RoomSettings.Load(global::SlugcatStats.Timeline) accepts lines split into exactly two parts by : . Key names are literal and values use invariant-culture number parsing. Preserve the space after the colon and use a period for decimal values.

An installed room has this ordinary scalar setting:

BkgDroneVolume: 0.2769565

The serializer can also write keys such as Palette, EffectColorA, EffectColorB, Effects, AmbientSounds, FadePalette, and TerrainFadePalette. A small settings file can contain only values that differ from its parent:

Palette: 4
BkgDroneVolume: 0.2769565

Collection values have their own inner grammar. An installed settings template contains these records:

Effects: RockFlea-0.173913-20-20,
AmbientSounds: OMNI><SO_WAT-DripTap.ogg><661.6606><638.8691><0.3043478><1,

global::RoomSettings.LoadEffects(System.String[]) splits the collection on , and each ordinary effect record on -. Ripple Settings has a special parser. global::RoomSettings.LoadAmbientSounds(System.String[]) splits each ambience record on >< and recognizes OMNI, DIR, and SPOT records.

The fields after the type depend on the selected effect or ambience class. Create unfamiliar records through Dev Tools, save, and inspect the exact line it produced. Copying positions or slider fields from an unrelated type can parse incorrectly or produce a different result. Placed objects also use ><, but their data classes define separate fields.

Templates and local overrides

Region properties.txt declares templates. The installed Outskirts pattern is:

Palette: 0
Subregion: Outskirts
Room Setting Templates: Outside, Inside

global::RoomSettings.FindParent(global::Region) chooses the first region template for an ordinary room. A room file can select another declared template with Template: <name> or return to the root settings with:

Template: NONE

Effects and ambient sounds are inherited after the parent is chosen. A local effect with the same effect type overrides the inherited record. A local ambient record overrides a parent record when both its sample and ambience type match. A local Palette value replaces the inherited palette.

Use templates for settings shared across many rooms. Keep local files for exceptions. This makes an ambience or palette change easier to trace and avoids repeating long collection lines.

Normal and timeline paths

The global::RoomSettings constructor lowercases the room name and first looks for _settings-<timeline>.txt when it has a timeline. If that load fails, it finds the normal room text and derives the sibling _settings.txt path.

global::RoomSettings.Save() writes the current filePath. global::RoomSettings.Save(global::SlugcatStats.Timeline) writes the path returned by global::RoomSettings.SpecificPath(global::SlugcatStats.Timeline), which inserts -<timeline> after settings.

Path resolution matters during Dev Tools work. The current filePath may point into an active mod, base content, or generated mergedmods output. After each controlled save:

  1. Locate the file that changed.
  2. Confirm whether it is the ordinary or timeline-specific file.
  3. Copy the intended settings into the mod’s authored content tree.
  4. Leave generated mergedmods files out of the package.
  5. Reload from a clean generated state and inspect the room again.

Room settings merge by key when supplied through a modify contribution. Collection keys such as Effects and AmbientSounds are combined as sets, so merged collection order is unspecified. Asset resolution covers this behavior and path priority.

The parser and save paths were verified from build 22785462. Effect appearance, ambience volume, timeline selection, and the destination chosen by a live Dev Tools session remain game tests.

Sources

  • Rain World v1.11.8, Steam build 22785462: global::RoomSettings.Load(global::SlugcatStats.Timeline), global::RoomSettings.Save(), global::RoomSettings.Save(global::SlugcatStats.Timeline), and global::RoomSettings.SpecificPath(global::SlugcatStats.Timeline) in the assembly identified by Runtime reference.
  • Rain World v1.11.8, Steam build 22785462: global::RoomSettings.FindParent(global::Region), global::RoomSettings.InheritEffects(), global::RoomSettings.InheritAmbientSounds(), global::RoomSettings.LoadEffects(System.String[]), and global::RoomSettings.LoadAmbientSounds(System.String[]).