engine-c: denser MEDIC/Mendbeast support + tall building fire plumes

This commit is contained in:
local-model/engine-L2-grok-4.5 2026-09-19 17:04:19 +02:00
parent 00b68ddc58
commit 13ab74c64b
No known key found for this signature in database
3 changed files with 69 additions and 18 deletions

View file

@ -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 */
{

View file

@ -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;

View file

@ -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);