From 13ab74c64b7e6685840106051a3411942cd33804 Mon Sep 17 00:00:00 2001 From: "local-model/engine-L2-grok-4.5" Date: Sat, 19 Sep 2026 17:04:19 +0200 Subject: [PATCH] engine-c: denser MEDIC/Mendbeast support + tall building fire plumes --- engine-c/src/engine.c | 18 +++++++++++++++++- engine-c/src/main.c | 39 ++++++++++++++++++++++++++++++++++++--- engine-c/src/sprites.c | 30 ++++++++++++++++-------------- 3 files changed, 69 insertions(+), 18 deletions(-) diff --git a/engine-c/src/engine.c b/engine-c/src/engine.c index 0b8c604..4edb456 100644 --- a/engine-c/src/engine.c +++ b/engine-c/src/engine.c @@ -220,6 +220,11 @@ static void place_showcase(Game *g, Faction human, Faction enemy) { unit_spawn(g, UT_BUGGY, human, wx + 72, wy - 72); unit_spawn(g, UT_MEDIC, human, wx - 12, wy + 40); unit_spawn(g, UT_MEDIC, human, wx + 20, wy + 28); + /* denser MEDIC support screen at primary clash (white vans + cross) */ + unit_spawn(g, UT_MEDIC, human, wx + 64, wy - 18); + unit_spawn(g, UT_MEDIC, human, wx + 86, wy - 36); + unit_spawn(g, UT_MEDIC, human, wx + 74, wy + 6); + unit_spawn(g, UT_MEDIC, human, wx + 98, wy - 8); for (int i = 0; i < 10; i++) unit_spawn(g, UT_INFANTRY, human, wx + 88 + (i % 5) * 14, wy + 8 + (i / 5) * 16); /* dense melee screen at primary clash (riflemen packed for KKND2 crop) */ @@ -616,8 +621,11 @@ static void place_showcase(Game *g, Faction human, Faction enemy) { for (int i = 0; i < 8; i++) unit_spawn(g, UT_INFANTRY, human, rx2 - 22 + (i % 4) * 10, ry2 - 6 + (i / 4) * 11); + /* MEDIC triage vans at SE clash */ + unit_spawn(g, UT_MEDIC, human, rx2 - 30, ry2 + 2); + unit_spawn(g, UT_MEDIC, human, rx2 - 16, ry2 - 14); - int raid[96]; + int raid[128]; int rn = 0; for (int i = 0; i < 8; i++) raid[rn++] = unit_spawn(g, UT_MUTANT, enemy, @@ -656,6 +664,10 @@ static void place_showcase(Game *g, Faction human, Faction enemy) { for (int i = 0; i < 8; i++) raid[rn++] = unit_spawn(g, UT_INFANTRY, enemy, rx - 18 + (i % 4) * 10, ry + 10 + (i / 4) * 9); + /* Evolved Mendbeast support (UT_MEDIC) behind melee wedge */ + for (int i = 0; i < 4; i++) + raid[rn++] = unit_spawn(g, UT_MEDIC, enemy, + rx + 18 + (i % 2) * 16, ry + 24 + (i / 2) * 12); /* secondary Evolved pack at SE clash — melee-heavy */ int rn_pri = rn; @@ -684,6 +696,10 @@ static void place_showcase(Game *g, Faction human, Faction enemy) { for (int i = 0; i < 6; i++) raid[rn++] = unit_spawn(g, UT_INFANTRY, enemy, rx2 - 10 + (i % 3) * 11, ry2 + 8 + (i / 3) * 10); + /* SE Mendbeast triage */ + for (int i = 0; i < 3; i++) + raid[rn++] = unit_spawn(g, UT_MEDIC, enemy, + rx2 + 20 + i * 14, ry2 + 32 + (i & 1) * 8); /* seed Survivor harvester beds so cargo silhouette is visible in shot */ { diff --git a/engine-c/src/main.c b/engine-c/src/main.c index a1ffb77..6b8e304 100644 --- a/engine-c/src/main.c +++ b/engine-c/src/main.c @@ -164,7 +164,7 @@ int main(int argc, char **argv) { particle_burst(g, cx - 48, cy - 14, 22, 0, 100, 95, 85); particle_burst(g, cx + 16, cy + 48, 20, 3, 85, 70, 55); particle_burst(g, cx - 12, cy - 48, 20, 1, 255, 160, 50); - /* building smoke / fire columns near clash (HQ, walls, turrets) */ + /* tall stacked building smoke / fire plumes (HQ, walls, turrets) */ for (int i = 0; i < g->bld_count; i++) { Building *bl = &g->buildings[i]; if (bl->dead || bl->build < 1.0f) continue; @@ -172,11 +172,20 @@ int main(int argc, char **argv) { float by = (float)(bl->ty * TILE + bl->h * TILE / 2); float bdx = bx - clash_x, bdy = by - clash_y; if (bdx * bdx + bdy * bdy > r2) continue; - int smoke_n = (bl->type == BT_BASE || bl->type == BT_TURRET) ? 18 : 12; + int heavy = (bl->type == BT_BASE || bl->type == BT_TURRET); + int smoke_n = heavy ? 22 : 14; + /* Y-offset stack: base → mid → high → tip */ particle_burst(g, bx, by - 10.0f, smoke_n, 0, 105, 95, 85); + particle_burst(g, bx + 3.0f, by - 28.0f, smoke_n - 4, 0, 95, 88, 78); + particle_burst(g, bx - 2.0f, by - 46.0f, smoke_n - 8, 0, 85, 80, 72); + particle_burst(g, bx + 1.0f, by - 64.0f, smoke_n - 12, 0, 75, 70, 65); if (bl->hp < bl->max_hp * 0.85f || bl->type == BT_TURRET) { - particle_burst(g, bx + 4.0f, by - 6.0f, 14, 1, 255, 130, 40); + particle_burst(g, bx + 4.0f, by - 6.0f, 16, 1, 255, 130, 40); + particle_burst(g, bx - 3.0f, by - 28.0f, 14, 1, 255, 110, 35); + particle_burst(g, bx + 2.0f, by - 46.0f, 12, 1, 255, 150, 45); + particle_burst(g, bx - 1.0f, by - 64.0f, 10, 1, 255, 90, 30); particle_burst(g, bx - 3.0f, by - 14.0f, 8, 3, 90, 75, 60); + particle_burst(g, bx + 5.0f, by - 36.0f, 6, 3, 80, 65, 50); } } /* muzzle flashes on units in the clash radius */ @@ -270,6 +279,30 @@ int main(int argc, char **argv) { particle_burst(g, c2x + 10, c2y + 24, 28, 1, 255, 160, 50); particle_burst(g, c2x - 28, c2y + 8, 24, 0, 100, 95, 80); particle_burst(g, c2x + 32, c2y - 16, 22, 1, 255, 120, 40); + /* SE building fire/smoke columns (same tall stack) */ + { + const float r2b = 140.0f * 140.0f; + for (int i = 0; i < g->bld_count; i++) { + Building *bl = &g->buildings[i]; + if (bl->dead || bl->build < 1.0f) continue; + float bx = (float)(bl->tx * TILE + bl->w * TILE / 2); + float by = (float)(bl->ty * TILE + bl->h * TILE / 2); + float bdx = bx - clash2_x, bdy = by - clash2_y; + if (bdx * bdx + bdy * bdy > r2b) continue; + int heavy = (bl->type == BT_BASE || bl->type == BT_TURRET); + int smoke_n = heavy ? 18 : 12; + particle_burst(g, bx, by - 10.0f, smoke_n, 0, 100, 92, 82); + particle_burst(g, bx + 2.0f, by - 28.0f, smoke_n - 4, 0, 90, 84, 74); + particle_burst(g, bx - 2.0f, by - 46.0f, smoke_n - 8, 0, 80, 76, 68); + particle_burst(g, bx + 1.0f, by - 64.0f, smoke_n - 10, 0, 70, 66, 60); + if (bl->hp < bl->max_hp * 0.85f || bl->type == BT_TURRET) { + particle_burst(g, bx + 3.0f, by - 8.0f, 14, 1, 255, 125, 38); + particle_burst(g, bx - 2.0f, by - 28.0f, 12, 1, 255, 105, 32); + particle_burst(g, bx + 2.0f, by - 46.0f, 10, 1, 255, 145, 42); + particle_burst(g, bx - 1.0f, by - 64.0f, 8, 1, 255, 95, 28); + } + } + } { int spawned2 = 0; const float pair_r2 = 160.0f * 160.0f; diff --git a/engine-c/src/sprites.c b/engine-c/src/sprites.c index 4666ad1..7e3424b 100644 --- a/engine-c/src/sprites.c +++ b/engine-c/src/sprites.c @@ -317,20 +317,22 @@ SDL_Texture *sprites_make_unit(SDL_Renderer *r, UnitType t, Faction f) { disc(s, 28, 6, 2, 255, 140, 90, 255); break; case UT_MEDIC: - /* white van + light bar + larger cross + hubs */ - fill_rect(s, 5, 10, 20, 15, ok, og, ob, 255); - fill_rect(s, 7, 12, 16, 11, 245, 245, 245, 255); - fill_rect(s, 6, 9, 6, 4, 200, 220, 240, 255); - fill_rect(s, 10, 5, 8, 2, 240, 50, 50, 255); /* light bar */ - disc(s, 10, 24, 5, ok, og, ob, 255); - disc(s, 20, 24, 5, ok, og, ob, 255); - disc(s, 10, 24, 4, tr, tg, tb, 255); - disc(s, 20, 24, 4, tr, tg, tb, 255); - disc(s, 10, 24, 2, 90, 85, 75, 255); - disc(s, 20, 24, 2, 90, 85, 75, 255); - disc(s, 15, 9, 6, 240, 50, 50, 255); - fill_rect(s, 14, 5, 3, 9, 255, 255, 255, 255); - fill_rect(s, 11, 8, 9, 3, 255, 255, 255, 255); + /* white van + light bar + bold red cross + hubs (read at live scale) */ + fill_rect(s, 3, 9, 24, 17, ok, og, ob, 255); + fill_rect(s, 5, 11, 20, 13, 245, 245, 245, 255); + fill_rect(s, 6, 12, 18, 11, 255, 255, 255, 255); + fill_rect(s, 5, 8, 7, 5, 190, 215, 235, 255); /* cab glass */ + fill_rect(s, 8, 3, 14, 3, 240, 40, 40, 255); /* light bar */ + fill_rect(s, 10, 2, 10, 2, 255, 80, 80, 255); + disc(s, 9, 24, 5, ok, og, ob, 255); + disc(s, 21, 24, 5, ok, og, ob, 255); + disc(s, 9, 24, 4, tr, tg, tb, 255); + disc(s, 21, 24, 4, tr, tg, tb, 255); + disc(s, 9, 24, 2, 90, 85, 75, 255); + disc(s, 21, 24, 2, 90, 85, 75, 255); + disc(s, 15, 10, 7, 230, 35, 35, 255); + fill_rect(s, 13, 4, 4, 12, 255, 255, 255, 255); + fill_rect(s, 9, 8, 12, 4, 255, 255, 255, 255); break; default: disc(s, 15, 15, 10, ok, og, ob, 255);