From 9cc0aec229a2d38c997b9612be733826e6c68dd5 Mon Sep 17 00:00:00 2001 From: "local-model/engine-L2-grok-4.5" Date: Sat, 19 Sep 2026 16:10:03 +0200 Subject: [PATCH] engine-c: Survivor forward HQ + faction BT_BASE identity in SHOT Forward twin CC near clash, stronger hx camera weight, Survivors corner-tower mast vs Evolved organic lobes in draw_bld/sprites. --- engine-c/src/engine.c | 27 +++++++++++++++++++ engine-c/src/snapshot.c | 56 ++++++++++++++++++++++++++++------------ engine-c/src/sprites.c | 50 +++++++++++++++++++++++++---------- kitchen/AGENT_LOG.md | 4 +++ kitchen/COLLAB-SIGNUP.md | 1 + 5 files changed, 107 insertions(+), 31 deletions(-) diff --git a/engine-c/src/engine.c b/engine-c/src/engine.c index 8f05be2..b5e4248 100644 --- a/engine-c/src/engine.c +++ b/engine-c/src/engine.c @@ -236,6 +236,33 @@ static void place_showcase(Game *g, Faction human, Faction enemy) { bld_spawn(g, BT_WALL, human, ftx + 3, fty - 1); bld_spawn(g, BT_POWER, human, ftx - 4, fty + 2); bld_force_complete(g); /* complete any partial builds from spawn */ + + /* Survivor forward HQ cluster (SW of clash) — visible in combat crop + * alongside Evolved twin BT_BASE; pad clear before place. */ + { + int hqx = ftx - 6, hqy = fty + 3; + for (int dy = -1; dy <= 4; dy++) { + for (int dx = -1; dx <= 5; dx++) { + int tx = hqx + dx, ty = hqy + dy; + if (!map_in_bounds(&g->map, tx, ty)) continue; + Tile *t = map_tile(&g->map, tx, ty); + if (!t || t->occupied) continue; + t->terrain = T_WASTELAND; + t->walkable = 1; + t->scrap = 0; + } + } + bld_spawn(g, BT_BASE, human, hqx, hqy); + bld_spawn(g, BT_BASE, human, hqx + 3, hqy); + bld_spawn(g, BT_POWER, human, hqx - 1, hqy + 2); + bld_spawn(g, BT_WARFACTORY, human, hqx + 1, hqy + 3); + bld_spawn(g, BT_TURRET, human, hqx + 2, hqy - 1); + bld_spawn(g, BT_TURRET, human, hqx + 5, hqy + 1); + bld_spawn(g, BT_WALL, human, hqx - 1, hqy); + bld_spawn(g, BT_WALL, human, hqx - 1, hqy + 1); + bld_spawn(g, BT_WALL, human, hqx + 5, hqy); + bld_force_complete(g); + } } /* denser clash scars: road core + rubble ring + scrap flecks (arid fight plate) */ diff --git a/engine-c/src/snapshot.c b/engine-c/src/snapshot.c index 9e01e49..d7897f1 100644 --- a/engine-c/src/snapshot.c +++ b/engine-c/src/snapshot.c @@ -553,20 +553,42 @@ static void draw_bld(Building *b, int sx, int sy) { switch (b->type) { case BT_BASE: - /* multi-wing HQ: side wings + centre block + dome + mast */ - fill_rect(sx + 4, sy + 18, 18, 28, ok, og, ob); - fill_rect(sx + 6, sy + 20, 14, 24, br, bg, bb); - fill_rect(sx + W - 22, sy + 18, 18, 28, ok, og, ob); - fill_rect(sx + W - 20, sy + 20, 14, 24, br, bg, bb); - fill_rect(sx + 16, sy + 10, W - 32, H - 20, ok, og, ob); - fill_rect(sx + 18, sy + 12, W - 36, H - 24, br, bg, bb); - fill_rect(sx + 20, sy + 14, W - 40, 8, lr, lg, lb); /* roof band */ - disc(sx + W/2, sy + H/2 - 2, 12, ok, og, ob); - disc(sx + W/2, sy + H/2 - 2, 10, lr, lg, lb); - disc(sx + W/2, sy + H/2 - 2, 5, 255, 250, 180); /* command dome */ - fill_rect(sx + W/2 - 2, sy + 4, 4, H/2 - 8, 200, 180, 60); /* mast */ - fill_rect(sx + W/2 - 5, sy + 4, 10, 3, 220, 210, 80); /* antenna tip */ - fill_rect(sx + W/2 - 6, sy + H - 14, 12, 6, 40, 38, 34); /* entry */ + if (b->faction == FACTION_EVOLVED) { + /* organic lobes + dark central pit (mutant hive) */ + disc(sx + 14, sy + 18, 14, ok, og, ob); + disc(sx + 14, sy + 18, 12, br, bg, bb); + disc(sx + W - 14, sy + 18, 14, ok, og, ob); + disc(sx + W - 14, sy + 18, 12, br, bg, bb); + disc(sx + 16, sy + H - 16, 12, ok, og, ob); + disc(sx + 16, sy + H - 16, 10, br, bg, bb); + disc(sx + W - 16, sy + H - 16, 12, ok, og, ob); + disc(sx + W - 16, sy + H - 16, 10, br, bg, bb); + disc(sx + W/2, sy + H/2, 16, ok, og, ob); + disc(sx + W/2, sy + H/2, 14, br, bg, bb); + disc(sx + W/2, sy + H/2, 8, 28, 18, 22); /* dark pit */ + disc(sx + W/2, sy + H/2, 4, 60, 20, 30); + disc(sx + W/2 - 10, sy + 10, 5, lr, lg, lb); /* blister */ + disc(sx + W/2 + 12, sy + H - 12, 4, lr, lg, lb); + } else { + /* Survivors: lime body + corner towers + central mast */ + fill_rect(sx + 4, sy + 4, 14, 14, ok, og, ob); /* NW tower */ + fill_rect(sx + 6, sy + 6, 10, 10, br, bg, bb); + fill_rect(sx + W - 18, sy + 4, 14, 14, ok, og, ob); /* NE */ + fill_rect(sx + W - 16, sy + 6, 10, 10, br, bg, bb); + fill_rect(sx + 4, sy + H - 18, 14, 14, ok, og, ob); /* SW */ + fill_rect(sx + 6, sy + H - 16, 10, 10, br, bg, bb); + fill_rect(sx + W - 18, sy + H - 18, 14, 14, ok, og, ob); /* SE */ + fill_rect(sx + W - 16, sy + H - 16, 10, 10, br, bg, bb); + fill_rect(sx + 14, sy + 14, W - 28, H - 28, ok, og, ob); + fill_rect(sx + 16, sy + 16, W - 32, H - 32, br, bg, bb); + fill_rect(sx + 18, sy + 18, W - 36, 8, lr, lg, lb); /* roof band */ + disc(sx + W/2, sy + H/2 - 2, 10, ok, og, ob); + disc(sx + W/2, sy + H/2 - 2, 8, lr, lg, lb); + disc(sx + W/2, sy + H/2 - 2, 4, 255, 250, 180); /* command dome */ + fill_rect(sx + W/2 - 2, sy + 2, 4, H/2 - 6, 200, 180, 60); /* mast */ + fill_rect(sx + W/2 - 6, sy + 2, 12, 3, 220, 210, 80); /* antenna */ + fill_rect(sx + W/2 - 6, sy + H - 12, 12, 6, 40, 38, 34); /* entry */ + } break; case BT_WARFACTORY: /* hangar shell + ridge vents + dark bay door */ @@ -742,9 +764,9 @@ void snapshot_capture(Game *g, const char *path) { float ecx = ne ? ex / ne : clash_x; float ecy = ne ? ey / ne : clash_y; - /* Clash + forward fight, with enough HQ so base buildings stay in frame. */ - float cx = clash_x * 0.55f + ecx * 0.15f + hx * 0.30f; - float cy = clash_y * 0.55f + ecy * 0.15f + hy * 0.30f; + /* Clash + forward fight; stronger hx so Survivor forward HQ stays in crop. */ + float cx = clash_x * 0.40f + ecx * 0.10f + hx * 0.50f; + float cy = clash_y * 0.40f + ecy * 0.10f + hy * 0.50f; float camx = cx - g_sw / 2.0f, camy = cy - g_sh / 2.0f; if (camx < 0) camx = 0; if (camy < 0) camy = 0; diff --git a/engine-c/src/sprites.c b/engine-c/src/sprites.c index 16e949c..61c80e2 100644 --- a/engine-c/src/sprites.c +++ b/engine-c/src/sprites.c @@ -363,20 +363,42 @@ SDL_Texture *sprites_make_bld(SDL_Renderer *r, BuildingType t, Faction f) { switch (t) { case BT_BASE: - /* multi-wing HQ: side wings + centre block + dome + mast (parity draw_bld) */ - fill_rect(s, 4, 18, 18, 28, ok, og, ob, 255); - fill_rect(s, 6, 20, 14, 24, base.r, base.g, base.b, 255); - fill_rect(s, W - 22, 18, 18, 28, ok, og, ob, 255); - fill_rect(s, W - 20, 20, 14, 24, base.r, base.g, base.b, 255); - fill_rect(s, 16, 10, W - 32, H - 20, ok, og, ob, 255); - fill_rect(s, 18, 12, W - 36, H - 24, base.r, base.g, base.b, 255); - fill_rect(s, 20, 14, W - 40, 8, lite.r, lite.g, lite.b, 255); - disc(s, W/2, H/2 - 2, 12, ok, og, ob, 255); - disc(s, W/2, H/2 - 2, 10, lite.r, lite.g, lite.b, 255); - disc(s, W/2, H/2 - 2, 5, 255, 250, 180, 255); - fill_rect(s, W/2 - 2, 4, 4, H/2 - 8, 200, 180, 60, 255); - fill_rect(s, W/2 - 5, 4, 10, 3, 220, 210, 80, 255); - fill_rect(s, W/2 - 6, H - 14, 12, 6, 40, 38, 34, 255); + if (f == FACTION_EVOLVED) { + /* organic lobes + dark central pit (parity draw_bld) */ + disc(s, 14, 18, 14, ok, og, ob, 255); + disc(s, 14, 18, 12, base.r, base.g, base.b, 255); + disc(s, W - 14, 18, 14, ok, og, ob, 255); + disc(s, W - 14, 18, 12, base.r, base.g, base.b, 255); + disc(s, 16, H - 16, 12, ok, og, ob, 255); + disc(s, 16, H - 16, 10, base.r, base.g, base.b, 255); + disc(s, W - 16, H - 16, 12, ok, og, ob, 255); + disc(s, W - 16, H - 16, 10, base.r, base.g, base.b, 255); + disc(s, W/2, H/2, 16, ok, og, ob, 255); + disc(s, W/2, H/2, 14, base.r, base.g, base.b, 255); + disc(s, W/2, H/2, 8, 28, 18, 22, 255); + disc(s, W/2, H/2, 4, 60, 20, 30, 255); + disc(s, W/2 - 10, 10, 5, lite.r, lite.g, lite.b, 255); + disc(s, W/2 + 12, H - 12, 4, lite.r, lite.g, lite.b, 255); + } else { + /* Survivors: corner towers + central mast (parity draw_bld) */ + fill_rect(s, 4, 4, 14, 14, ok, og, ob, 255); + fill_rect(s, 6, 6, 10, 10, base.r, base.g, base.b, 255); + fill_rect(s, W - 18, 4, 14, 14, ok, og, ob, 255); + fill_rect(s, W - 16, 6, 10, 10, base.r, base.g, base.b, 255); + fill_rect(s, 4, H - 18, 14, 14, ok, og, ob, 255); + fill_rect(s, 6, H - 16, 10, 10, base.r, base.g, base.b, 255); + fill_rect(s, W - 18, H - 18, 14, 14, ok, og, ob, 255); + fill_rect(s, W - 16, H - 16, 10, 10, base.r, base.g, base.b, 255); + fill_rect(s, 14, 14, W - 28, H - 28, ok, og, ob, 255); + fill_rect(s, 16, 16, W - 32, H - 32, base.r, base.g, base.b, 255); + fill_rect(s, 18, 18, W - 36, 8, lite.r, lite.g, lite.b, 255); + disc(s, W/2, H/2 - 2, 10, ok, og, ob, 255); + disc(s, W/2, H/2 - 2, 8, lite.r, lite.g, lite.b, 255); + disc(s, W/2, H/2 - 2, 4, 255, 250, 180, 255); + fill_rect(s, W/2 - 2, 2, 4, H/2 - 6, 200, 180, 60, 255); + fill_rect(s, W/2 - 6, 2, 12, 3, 220, 210, 80, 255); + fill_rect(s, W/2 - 6, H - 12, 12, 6, 40, 38, 34, 255); + } break; case BT_WARFACTORY: /* hangar shell + ridge vents + dark bay door */ diff --git a/kitchen/AGENT_LOG.md b/kitchen/AGENT_LOG.md index 27947ba..5970b3e 100644 --- a/kitchen/AGENT_LOG.md +++ b/kitchen/AGENT_LOG.md @@ -115,3 +115,7 @@ CLAIM Spur A: scrap/resource mounds + denser lingering smoke/fire + secondary cl - **2026-09-19T12:50:47Z** · CLAIM Spur A @local-model/engine-L2-grok-4.5 · **ACTIVE** — engine-c/src/snapshot.c,render.c,engine.c; snapshot wreck draw + type-aware silhouettes + clash wreck seed; TODO365 - **2026-09-19T14:04:14Z** · local-model/engine-L2-grok-4.5 · Spur A wrecks · **ok** — draw_wreck+render_wrecks+seed_clash_wrecks (~22); wreck_count reset; smoke RUN_ALL PASS; shot 1280x720 + +- **2026-09-19T14:06:57Z** · CLAIM Spur A @local-model/engine-L2-grok-4.5 · **ACTIVE** — engine-c/src/engine.c,snapshot.c,sprites.c; Survivor HQ identity in SHOT crop (forward CC + faction BT_BASE); TODO365 + +- **2026-09-19T14:10:02Z** · local-model/engine-L2-grok-4.5 · Spur A Survivor HQ · **ok** — forward twin BT_BASE+POWER+WF+turrets; faction BT_BASE draw; cam hx 0.50; smoke RUN_ALL PASS; shot 1280x720 diff --git a/kitchen/COLLAB-SIGNUP.md b/kitchen/COLLAB-SIGNUP.md index 52ad62f..61039ac 100644 --- a/kitchen/COLLAB-SIGNUP.md +++ b/kitchen/COLLAB-SIGNUP.md @@ -24,6 +24,7 @@ Core of **TODO=365**: collaborate to **advance the game** and **push directly** | When (UTC) | Agent / author slug | Spur | Paths (short) | Status | Note | |------------|---------------------|------|---------------|--------|------| +| 2026-09-19T14:06:57Z | local-model/engine-L2-grok-4.5 | A | engine-c/src/engine.c,snapshot.c,sprites.c | DONE | smoke PASS; Survivor forward HQ + faction BT_BASE + hx cam; 5387f9d | | 2026-09-19T12:50:47Z | local-model/engine-L2-grok-4.5 | A | engine-c/src/snapshot.c,render.c,engine.c | DONE | smoke PASS; wreck draw+type variety+clash seed (~22); d54d38e | | 2026-09-19T12:38:43Z | local-model/engine-L2-grok-4.5 | A | engine-c/src/main.c,projectiles.c,snapshot.c | DONE | smoke PASS; denser mid-fight fire/smoke/muzzle/impact; 01c7ab8 | | 2026-09-19T12:21:37Z | local-model/engine-L2-grok-4.5 | A | engine-c/src/engine.c,snapshot.c,sprites.c | DONE | smoke PASS; HQ→clash scrap/rock fill + thicker unit silhouettes; e032b8c |