Add Mars Base generator, mars03 boss arena, and Mars campaign polish

Dedicated Mars Base generator with 6 segment types (entry, shaft, corridor,
turret hall, hive, arena), depth-scaled difficulty, and exit to boss arena
after 2 generated levels. Mars themes integrated into all 7 generic segment
generators. Full level chain: moon03 → mars01 → mars02 → mars_base (×2) →
mars03 → station.

Also: jetpack fuel pickup preserves recharge progress, depth counters reset
on game loop, NULL checks on entity spawns, charger charge timeout, bg
decoration in Mars Base generator.
This commit is contained in:
Thomas
2026-03-02 20:27:29 +00:00
parent 74cd70738d
commit 1ef84cd3b4
9 changed files with 906 additions and 30 deletions

View File

@@ -41,6 +41,11 @@ static bool s_testing_from_editor = false;
* Drives escalating difficulty and length. */
static int s_station_depth = 0;
/* Mars Base depth: increments each generated mars_base level.
* After 2 levels, transitions to the boss arena (mars03). */
static int s_mars_depth = 0;
#define MARS_BASE_GEN_COUNT 2
/* ── Pause menu state ── */
#define PAUSE_ITEM_COUNT 3
static int s_pause_selection = 0; /* 0=Resume, 1=Restart, 2=Quit */
@@ -185,6 +190,37 @@ static void load_station_level(void) {
s_level_path[0] = '\0'; /* generated levels have no file path */
}
static void load_mars_base_level(void) {
LevelGenConfig config = levelgen_mars_base_config(s_gen_seed, s_mars_depth);
s_mars_depth++;
printf("Generating Mars Base level (depth=%d, gravity=%.0f, segments=%d, difficulty=%.2f)\n",
s_mars_depth, config.gravity, config.num_segments, config.difficulty);
Tilemap gen_map;
if (!levelgen_generate_mars_base(&gen_map, &config)) {
fprintf(stderr, "Failed to generate Mars Base level!\n");
g_engine.running = false;
return;
}
/* After MARS_BASE_GEN_COUNT generated levels, point exit to boss arena */
if (s_mars_depth >= MARS_BASE_GEN_COUNT && gen_map.exit_zone_count > 0) {
ExitZone *ez = &gen_map.exit_zones[gen_map.exit_zone_count - 1];
snprintf(ez->target, sizeof(ez->target), "assets/levels/mars03.lvl");
}
if (s_dump_lvl) {
levelgen_dump_lvl(&gen_map, "assets/levels/generated_mars_base.lvl");
}
if (!level_load_generated(&s_level, &gen_map)) {
fprintf(stderr, "Failed to load Mars Base level!\n");
g_engine.running = false;
}
s_level_path[0] = '\0';
}
/* ── Switch to editor mode ── */
static void enter_editor(void) {
if (s_mode == MODE_PLAY) {
@@ -367,8 +403,10 @@ static void game_update(float dt) {
if (target[0] == '\0') {
/* Empty target = victory / end of game */
printf("Level complete! (no next level)\n");
/* Loop back to the beginning */
/* Loop back to the beginning, reset progression state */
level_free(&s_level);
s_station_depth = 0;
s_mars_depth = 0;
if (!load_level_file("assets/levels/moon01.lvl")) {
g_engine.running = false;
}
@@ -384,6 +422,12 @@ static void game_update(float dt) {
level_free(&s_level);
s_gen_seed = (uint32_t)time(NULL);
load_station_level();
} else if (strcmp(target, "generate:mars_base") == 0) {
/* Procedurally generated Mars Base level */
printf("Transitioning to Mars Base level\n");
level_free(&s_level);
s_gen_seed = (uint32_t)time(NULL);
load_mars_base_level();
} else {
/* Load a specific level file */
printf("Transitioning to: %s\n", target);