Begin with one Arena room. This checks geometry, entrances, cameras, and rendered output before world connections add more variables. A world file with two rooms can then demonstrate region grammar, but it is not yet a playable campaign region.

Rained edits room geometry and renders runtime room files. Its saved project is authoring data. Rendering produces the runtime room text and one PNG per camera. Keep the project in an authoring directory and package the rendered files separately. The evidence set used Rained’s manual at commit efae3c824ee8d8b68d6211ae5b0b4f2d90d2c797. It identified release v2.5.1, while the pinned manual comes from a later development commit, so some release interface details may differ.

flowchart LR
    A[Rained project] -->|Render| B[Room text and camera PNGs]
    B --> C[Local mod levels folder]
    C -->|Arena playtest| D[Playable single room]
    D --> E[world_xx.txt and properties.txt]
    E --> F[Connected region test]
    F --> G[Dev Tools map layout and output]

Render one room

Install Rained from its maintainer release in a writable authoring directory. On first launch, choose Download Data or point Choose Data Folder at data containing Graphics, Props, and Levels. LevelEditorProjects and Materials are optional according to the maintainer manual. This setup was not run during verification.

Create a small room with a unique prefix. Keep gameplay geometry and entrances inside the editor’s white border because Rained excludes geometry outside that border from runtime text. Save the editable project with File > Save As, then use File > Render. Inspect the resulting destination instead of assuming it matches the project directory.

For an Arena test, place the exported room text and camera PNG files in a local mod’s levels/ directory and enable that mod through Remix. The exact deployment and launch were not tested here. Use the modinfo.json pattern introduced in First plugin. A mod that contains only a room does not need a plugin DLL.

Enable the bundled Dev Tools entry for room settings work. In the room, O enables Dev Tools and H opens its interface according to the installed metadata. This build defines Room Settings, Objects, Sound, Map, Triggers, Dialog, and Relationships pages in global::DevInterface.DevUI.SwitchPage(System.Int32). Room Settings, Objects, and Sound cover the usual first pass. Inspect the file written by Save before packaging it.

Move from Arena to region files

After the room works in Arena, place exported region room assets under a mod layout like this:

world/xx-rooms/xx_a01.txt
world/xx-rooms/xx_a01_1.png
world/xx-rooms/xx_a01_settings.txt
world/xx/world_xx.txt
world/xx/properties.txt
modify/world/regions.txt

XX is an illustrative prefix. Choose one that does not collide with another region. global::WorldLoader.FindRoomFile(System.String,System.Boolean,System.String,System.Boolean) first checks the room directory based on the text before the first underscore. It has later fallbacks for gates, Arena levels, and some challenge content.

The following file demonstrates the room connection grammar:

ROOMS
XX_A01 : XX_A02
XX_A02 : XX_A01
END ROOMS
CREATURES
END CREATURES

global::WorldLoader.MappingRooms() reads these connections. The entries after : correspond to the exported room’s exit order. Ordinary links need a matching return connection in the destination room. Preserve an unused exit slot with DISCONNECTED rather than shifting later entries.

Register the region through a modification file so the existing region list remains present:

[MERGE]
XX
[ENDMERGE]

Place that text in modify/world/regions.txt. global::ModManager.ModMerger.PendingApply.ApplyMerges(...) selects the regions operation, and global::ModManager.ModMerger.MergeUniqueLinesUnordered(...) combines the entries consumed by global::Region.LoadAllRegions(global::SlugcatStats.Timeline, global::RainWorldGame).

These snippets establish parser grammar only. A campaign region still needs a reachable entrance, valid room exit geometry, a shelter, appropriate access from another region or campaign start, and tested creature spawns. A SHELTER tag alone does not validate shelter geometry. A gate also needs gate room assets and compatible world definitions on both sides.

Settings, maps, and save destinations

global::RoomSettings.Load(global::SlugcatStats.Timeline) reads palette, effect, object, sound, and trigger settings. Saves for one timeline use a _settings-<timeline>.txt suffix. global::DevInterface.MapPage.SaveMapConfig() writes room map coordinates and attraction data. The map output control writes map_xx.png and map_image_xx.txt.

global::AssetManager.ResolveFilePath(System.String,System.Boolean,System.Boolean) checks merged output and active mods when resolving paths. A Dev Tools save may therefore target a resolved copy rather than the author’s mod directory. Keep source files outside mergedmods, inspect each destination, and copy the intended output into the mod package. global::ModManager.GenerateMergedMods(...) rebuilds merged content.

RegionKit is optional for this base room exercise. Its pinned metadata at commit 111fc045fdea4a3288a78e522d51b7a30c549929 identifies version 3.20.0 and a pom requirement. Add it only when the room uses its objects or region features, then test the resulting dependency and DLC combination.

Run the first game pass in both directions through every connection. Check each camera, shortcut entrance, shelter behavior, map placement, fresh creature spawning, and re-entry after room unloading. Abstract and realized objects explains what runtime room realization does after these files load. Runtime reference lists the readers, writers, source identity, and unverified parts of this workflow.

Sources