Skip to main content

Caves Retrofit Land

Based on game build 714014 | Last updated: 2026-03-03

Overview

caves_retrofit_land.lua is a world generation utility module that contains two retrofit functions—ReturnOfThemRetrofitting_AcientArchives and FromBeyondRetrofitting_Fumarole. These functions modify an already-generated cave map by inserting predefined biome layouts (e.g., the Ancient Archives and Fumarole biomes) using tile-based object placement and topology graph updates. They are invoked during world initialization for legacy saves that need to support new content.

Usage example

This module is not used directly by prefabs or components. Instead, its functions are called internally during world loading. A typical usage pattern (as seen in the source) is:

local caves_retrofit_land = require "map/caves_retrofit_land"

-- Called after world generation completes, with savedata and world_map
caves_retrofit_land.ReturnOfThemRetrofitting_AcientArchives(world_map, savedata)
caves_retrofit_land.FromBeyondRetrofitting_Fumarole(world_map, savedata)

Dependencies & tags

Components used: None.
Tags: Uses and adds topology node tags such as "archive_hallway", "archive_hallway_two", "archive_keyroom", "archive_start", "archive_end", "fumarolearea", "lunacyarea", "GrottoWarEntrance". These tags are stored in topology node metadata for gameplay rule processing (e.g., Lunacy logic).

Properties

No public properties. This module exports only functions.

Main functions

FindOpenArea(map, map_width, map_height, tiles_wide, tiles_high)

  • Description: Scans the world map grid to find a rectangular area large enough to fit a given structure (e.g., a maze) without overlapping impassable terrain. It checks grid points in steps of 5 tiles, with a padding offset from world edges.
  • Parameters:
    map (WorldMap) — The generated map object used to query tile passability.
    map_width (number) — Total width of the map in tiles.
    map_height (number) — Total height of the map in tiles.
    tiles_wide (number) — Required width of the candidate area (in tiles).
    tiles_high (number) — Required height of the candidate area (in tiles).
  • Returns:
    found (boolean) — true if a valid area is found, otherwise false.
    top (number, optional) — Y-coordinate (grid index) of the top edge of the found area.
    left (number, optional) — X-coordinate (grid index) of the left edge of the found area.
  • Error states: Returns (false) if no suitable area is found after full scan.

AddTopologyData(topology, left, top, width, height, room_id, tags)

  • Description: Creates and appends a new node to the map’s topology graph (used by pathfinding and world logic), representing a defined region such as a biome or maze. It populates node metadata including geometry, neighbours (initially empty), and custom tags.
  • Parameters:
    topology (table) — The savedata.map.topology table to modify.
    left (number) — X-coordinate (world space, scaled) of the top-left corner.
    top (number) — Y-coordinate (world space, scaled) of the top-left corner.
    width (number) — Width of the node region (world space).
    height (number) — Height of the node region (world space).
    room_id (string) — Unique identifier string for the node (e.g., "AncientArchivesRetrofit:0:Archives").
    tags (table) — Array of string tags to associate with this node (e.g., { "lunacyarea" }).
  • Returns: index (number) — The 1-based index in topology.nodes where the new node was inserted.

AddTileNodeIdsForArea(world_map, node_index, left, top, width, height)

  • Description: Assigns a topology node ID to every tile within a rectangular region, enabling tile-based map lookups to link positions to topology regions.
  • Parameters:
    world_map (WorldMap) — The map object.
    node_index (number) — Index of the topology node to assign to all tiles in the area.
    left, top, width, height (numbers) — Define the rectangular region in tile coordinates (inclusive bounds).
  • Returns: Nothing.

add_fn_fn(prefab, points_x, points_y, current_pos_idx, entitiesOut, width, height, prefab_list, prefab_data, rand_offset)

  • Description: Internal helper used by obj_layout.Place to record placement data for prefabs (e.g., rooms or biome assets). Saves entity position (scaled world space) and optional metadata (data, id, scenario).
  • Parameters:
    prefab (string) — Name of the prefab being placed.
    points_x, points_y (tables) — arrays of tile-space coordinates.
    current_pos_idx (number) — Index into points_x/points_y to use.
    entitiesOut (table) — Output table where entries are keyed by prefab name.
    width, height (numbers) — Used to compute center coordinates.
    prefab_data (table or nil) — Optional metadata to include in the saved data.
    Remaining arguments (prefab_list, rand_offset, debug_prefab_list) are unused in this context.
  • Returns: Nothing. Appends a save_data entry to entitiesOut[prefab].

ReturnOfThemRetrofitting_AcientArchives(world_map, savedata)

  • Description: Retrofits the “Ancient Archives” biome—comprising a 4×4 maze of hallway segments, a Moon Mushroom patch, and a bridge—into an existing world. It uses FindOpenArea to locate space, places rooms via obj_layout.Place, and registers corresponding topology nodes.
  • Parameters:
    world_map (WorldMap) — The current world map instance.
    savedata (table) — Contains savedata.map.topology, savedata.map.width/height, savedata.ents, savedata.map.generated.
  • Returns: Nothing. Prints success/failure to console.

FromBeyondRetrofitting_Fumarole(world_map, savedata)

  • Description: Retrofits the “Fumarole” biome—a 30×30 tile circle of fumarole terrain—into the world. Similar to ReturnOfThemRetrofitting_AcientArchives, it locates space, places the biome asset via obj_layout.PlaceAndPopulatePrefabDensities, and adds a topology node marked with "fumarolearea".
  • Parameters:
    world_map (WorldMap) — The current world map instance.
    savedata (table) — Same structure as above.
  • Returns: Nothing. Prints success/failure to console.

Events & listeners

None. This is a pure utility module with no event listeners or event firing.