#ifndef JNR_LEVELGEN_H #define JNR_LEVELGEN_H #include "engine/tilemap.h" #include /* ═══════════════════════════════════════════════════ * Procedural Level Generator * * Generates a Tilemap directly in memory by stitching * together segment templates. Supports: * - Mixed layouts (horizontal, vertical, arena) * - Enemy and hazard placement * - Difficulty scaling via seed * - Dumping to .lvl format for inspection * ═══════════════════════════════════════════════════ */ /* Level theme — affects layout, hazards, gravity, atmosphere */ typedef enum LevelTheme { THEME_PLANET_SURFACE, /* alien planet exterior: open terrain, pits, flame vents, harsh conditions, high gravity */ THEME_PLANET_BASE, /* research outpost on a planet: corridors, force fields, turrets, medium gravity */ THEME_SPACE_STATION, /* orbital station: shafts, platforms, low gravity, moving platforms, turrets */ THEME_MARS_SURFACE, /* Mars exterior: red dusty terrain, wind, wide-open with charger enemies */ THEME_MARS_BASE, /* Mars base interior: very vertical, narrow corridors, turrets, laser turrets, spawners*/ THEME_COUNT } LevelTheme; #define MAX_THEME_SEQUENCE 10 /* Generator configuration */ typedef struct LevelGenConfig { uint32_t seed; /* RNG seed (0 = random from time) */ int num_segments; /* how many segments to stitch (2-10) */ float difficulty; /* 0.0 = easy, 1.0 = hard */ float gravity; /* level gravity override (0 = auto) */ /* Theme sequence: one theme per segment. * If theme_count == 0, all segments use themes[0]. * If theme_count > 0, segment i uses themes[min(i, theme_count-1)]. * Transition segments are auto-inserted at theme boundaries. */ LevelTheme themes[MAX_THEME_SEQUENCE]; int theme_count; /* number of entries in themes[] */ } LevelGenConfig; /* Default config for quick generation */ LevelGenConfig levelgen_default_config(void); /* Config preset for a space station level: * very long horizontally, narrow playable area, * near-zero gravity, all THEME_SPACE_STATION. * depth (0-based) escalates difficulty and length * with each subsequent station level. */ LevelGenConfig levelgen_station_config(uint32_t seed, int depth); /* Generate a level directly into a Tilemap struct. * The Tilemap will have layers allocated, tile defs set, * entity spawns populated, and metadata configured. * Caller must eventually call tilemap_free() on it. * Returns true on success. */ bool levelgen_generate(Tilemap *map, const LevelGenConfig *config); /* Generate a space-station level: very long, narrow, * near-zero gravity. Uses its own segment pool tuned * for horizontal layouts in tight corridors. * Returns true on success. */ bool levelgen_generate_station(Tilemap *map, const LevelGenConfig *config); /* Config preset for a Mars Base level: * tall (46 tiles), vertical, claustrophobic. * Heavy laser turret/spawner/charger presence. * depth (0-based) escalates difficulty and length. */ LevelGenConfig levelgen_mars_base_config(uint32_t seed, int depth); /* Generate a Mars Base level: tall multi-level underground * facility with shafts, turret halls, spawner hives. * Returns true on success. */ bool levelgen_generate_mars_base(Tilemap *map, const LevelGenConfig *config); /* Dump a generated (or any) Tilemap to a .lvl file. * Useful for inspecting/editing procedural output. * Returns true on success. */ bool levelgen_dump_lvl(const Tilemap *map, const char *path); #endif /* JNR_LEVELGEN_H */