Creature spawns belong in the CREATURES block of world_ha.txt. They are world records, separate from a room’s rendered geometry and from the PlacedObjects setting. Start a new region with an empty block, confirm the rooms load, then copy and adjust one known-good record from a comparable installed region.

CREATURES
END CREATURES

global::WorldLoader finds this block by its exact headings. Each non-LINEAGE line goes to AddSpawnersFromString. A line beginning with LINEAGE goes to AddLineageFromString. The parser splits the record at :, then splits each comma-separated spawn entry at -.

Start with one ordinary base-game record:

HA_A01 : 0-blue

This is an original example of the verified simple-record grammar. HA_A01 is the room name, 0 is its den index, and blue maps to CreatureTemplate.Type.BlueLizard. It only works if node 0 in the rendered HA_A01 is a den. Replace the room and den index with values from the room you inspect.

The simple entry form is <den index>-<creature>[-<amount>]. The parser starts with amount = 1. Omitting the final field creates one creature. A later integer field replaces the amount. Fields enclosed in { and } become the spawn data string. Use the two-field form until a game test needs an amount or spawn data.

Choose a den that the room exports

An ordinary spawn record names a room and a den node. The loader creates a World.SimpleSpawner with that room index and den index. global::WorldLoader.SpawnerStabilityCheck(global::World.CreatureSpawner) checks whether the target room belongs to the loaded region and whether the node index exists and is a Den node. It runs for fresh spawns when RainWorld.ShowLogs is enabled and writes invalid room or den data to the game log.

Before copying a record, inspect the rendered room’s node list and identify a real den. An ordinary shortcut entrance is not necessarily a den. The parser makes a special allowance for a Garbage Worm in a GarbageHoles node. That exception does not apply to ordinary creature records.

Use the exact creature name accepted by global::WorldLoader.CreatureTypeFromString(System.String). The base parser maps blue to CreatureTemplate.Type.BlueLizard. Keep the first test to this one ordinary record.

Keep simple spawns and lineages separate

A simple spawn describes one creature type and an amount. A lineage is a separate progression record with its own creature-type and chance fields. SpawnerStabilityCheck checks that a lineage ends at zero percent. Keep lineages out of the first region pass.

OFFSCREEN is a supported first field for an off-screen den. It is a different target from a room-local den. Do not use it as a substitute for a missing node in a room that should host the creature.

Test a fresh world state

Spawn state can persist in a save. Test a new record with a fresh world or a controlled save state, then watch the target den. With RainWorld.ShowLogs enabled, the validator reports an invalid room or den. A creature that does not appear can still have a valid abstract spawn, so distinguish world creation from realized room behavior.

For creature templates and behavior, use Creature templates and Creature AI lifecycle. Room connections covers the room graph that creatures use after spawning.

Sources

  • Rain World v1.11.8, Steam build 22785462: global::WorldLoader.AddSpawnersFromString(System.String[]), global::WorldLoader.AddLineageFromString(System.String[]), global::WorldLoader.CreatureTypeFromString(System.String), and global::WorldLoader.SpawnerStabilityCheck(global::World.CreatureSpawner) in the assembly identified by Runtime reference.