engine-c: deepen REPAIR/RESEARCH/WALL silhouettes

This commit is contained in:
local-model/engine-L2-grok-4.5 2026-09-19 18:00:17 +02:00
parent 0fb11e84dd
commit 8a78ad731f
No known key found for this signature in database
2 changed files with 170 additions and 64 deletions

View file

@ -705,42 +705,99 @@ static void draw_bld(Building *b, int sx, int sy) {
disc(sx + W/2 + 13, sy + H/2 - 10, 2, 255, 200, 80); /* muzzle tip */
break;
case BT_WALL:
/* battlement blocks + ridge + shadow seam */
fill_rect(sx + 1, sy + 1, W - 2, H - 2, ok, og, ob);
fill_rect(sx + 2, sy + 6, W - 4, H - 8, 175, 155, 120);
fill_rect(sx + 2, sy + 2, 7, 8, 195, 175, 140); /* merlon */
fill_rect(sx + 12, sy + 2, 7, 8, 195, 175, 140);
fill_rect(sx + 22, sy + 2, 7, 8, 195, 175, 140);
fill_rect(sx + 3, sy + 10, W - 6, 4, 210, 190, 150); /* ridge */
line(sx + 2, sy + H/2, sx + W - 2, sy + H/2, 60, 52, 42);
line(sx + W/2, sy + 6, sx + W/2, sy + H - 2, 70, 60, 48);
/* thick fort wall + crenels + seams + embrasure (KKND fort read) */
fill_rect(sx + 0, sy + 4, W, H - 4, ok, og, ob);
fill_rect(sx + 1, sy + 6, W - 2, H - 8, 165, 145, 110);
fill_rect(sx + 2, sy + H - 6, W - 4, 4, 90, 78, 58); /* plinth */
/* thick merlons */
fill_rect(sx + 1, sy + 1, 8, 10, ok, og, ob);
fill_rect(sx + 2, sy + 2, 6, 8, 195, 175, 140);
fill_rect(sx + W/2 - 4, sy + 1, 8, 10, ok, og, ob);
fill_rect(sx + W/2 - 3, sy + 2, 6, 8, 200, 180, 145);
fill_rect(sx + W - 9, sy + 1, 8, 10, ok, og, ob);
fill_rect(sx + W - 8, sy + 2, 6, 8, 190, 170, 135);
fill_rect(sx + 2, sy + 10, W - 4, 3, 215, 195, 155); /* coping */
/* block seams + arrow slit */
line(sx + 2, sy + H/2 + 2, sx + W - 2, sy + H/2 + 2, 55, 48, 38);
line(sx + W/3, sy + 8, sx + W/3, sy + H - 4, 65, 55, 42);
line(sx + 2 * W/3, sy + 8, sx + 2 * W/3, sy + H - 4, 65, 55, 42);
fill_rect(sx + W/2 - 2, sy + H/2 - 2, 4, 8, 35, 30, 24); /* embrasure */
fill_rect(sx + W/2 - 1, sy + H/2, 2, 4, 20, 18, 14);
break;
case BT_REPAIR:
/* garage bay + crane arm + green service mark */
fill_rect(sx + 5, sy + 8, W - 10, H - 14, ok, og, ob);
fill_rect(sx + 7, sy + 10, W - 14, H - 18, br, bg, bb);
fill_rect(sx + 10, sy + H - 26, W - 20, 14, 40, 38, 34); /* bay floor */
fill_rect(sx + 12, sy + H - 24, W - 24, 10, 55, 52, 48);
fill_rect(sx + W - 18, sy + 8, 10, 6, ok, og, ob); /* crane mast */
fill_rect(sx + W - 16, sy + 10, 6, 22, 90, 85, 70);
line(sx + W - 13, sy + 12, sx + 14, sy + 18, 120, 110, 90); /* jib */
line(sx + W - 13, sy + 13, sx + 14, sy + 19, 100, 90, 70);
ring(sx + W/2 - 4, sy + H/2 + 2, 8, 2, 120, 220, 120);
line(sx + W/2 - 10, sy + H/2 + 2, sx + W/2 + 2, sy + H/2 + 2, 120, 220, 120);
line(sx + W/2 - 4, sy + H/2 - 4, sx + W/2 - 4, sy + H/2 + 8, 120, 220, 120);
/* garage + vehicle lift + tool rack + crane (KKND depot read) */
fill_rect(sx + 4, sy + 6, W - 8, H - 10, ok, og, ob);
fill_rect(sx + 6, sy + 8, W - 12, H - 14, br, bg, bb);
fill_rect(sx + 8, sy + 10, W - 16, 8, lr, lg, lb); /* roof */
fill_rect(sx + 10, sy + 12, 4, 4, 50, 48, 40); /* roof vents */
fill_rect(sx + W/2 - 2, sy + 12, 4, 4, 50, 48, 40);
fill_rect(sx + W - 14, sy + 12, 4, 4, 50, 48, 40);
/* open bay + lift pad */
fill_rect(sx + 10, sy + H - 28, W - 28, 18, ok, og, ob);
fill_rect(sx + 12, sy + H - 26, W - 32, 14, 38, 36, 32);
fill_rect(sx + W/2 - 10, sy + H - 22, 20, 8, 70, 68, 58); /* lift platform */
fill_rect(sx + W/2 - 8, sy + H - 20, 16, 4, 110, 100, 70);
line(sx + W/2 - 10, sy + H - 22, sx + W/2 - 10, sy + H - 12, 90, 85, 70);
line(sx + W/2 + 10, sy + H - 22, sx + W/2 + 10, sy + H - 12, 90, 85, 70);
/* tool rack annex (left) */
fill_rect(sx + 4, sy + H/2 - 2, 10, H/2 - 6, ok, og, ob);
{
uint8_t dr, dg, db;
darken3(br, bg, bb, 0.5f, &dr, &dg, &db);
fill_rect(sx + 5, sy + H/2, 8, H/2 - 10, dr, dg, db);
}
fill_rect(sx + 6, sy + H/2 + 2, 2, 6, 200, 160, 60); /* tools */
fill_rect(sx + 9, sy + H/2 + 1, 2, 7, 180, 180, 190);
/* overhead crane mast + jib + hook */
fill_rect(sx + W - 16, sy + 4, 8, H - 20, ok, og, ob);
fill_rect(sx + W - 14, sy + 5, 5, H - 22, 95, 88, 70);
fill_rect(sx + 16, sy + 6, W - 32, 4, ok, og, ob);
fill_rect(sx + 17, sy + 7, W - 34, 2, 120, 110, 85);
line(sx + W/2, sy + 10, sx + W/2, sy + 20, 70, 65, 50);
disc(sx + W/2, sy + 22, 3, 80, 75, 55);
/* green service cross (clearer) */
ring(sx + W/2 - 6, sy + H/2 + 4, 9, 2, 90, 200, 90);
fill_rect(sx + W/2 - 14, sy + H/2 + 2, 16, 4, 120, 220, 120);
fill_rect(sx + W/2 - 8, sy + H/2 - 4, 4, 16, 120, 220, 120);
/* parts crates */
fill_rect(sx + W - 22, sy + H - 14, 8, 6, 140, 100, 55);
fill_rect(sx + W - 20, sy + H - 12, 4, 3, 180, 140, 70);
break;
case BT_RESEARCH:
/* lab block + dish + instrument stubs */
fill_rect(sx + 6, sy + 14, W - 12, H - 20, ok, og, ob);
fill_rect(sx + 8, sy + 16, W - 16, H - 24, br, bg, bb);
fill_rect(sx + 10, sy + 18, W - 20, 8, lr, lg, lb);
disc(sx + W/2 + 6, sy + 14, 12, ok, og, ob);
disc(sx + W/2 + 6, sy + 14, 10, 210, 180, 80); /* dish */
ring(sx + W/2 + 6, sy + 14, 7, 2, 180, 150, 60);
disc(sx + W/2 + 6, sy + 14, 3, 255, 240, 160);
fill_rect(sx + 12, sy + H - 18, 6, 8, 230, 230, 160); /* stub */
fill_rect(sx + 22, sy + H - 20, 5, 10, 230, 230, 160);
line(sx + W/2 + 6, sy + 4, sx + W/2 + 6, sy + 14, 200, 190, 120);
/* tall lab + dish mast + instrument bank (KKND lab read) */
fill_rect(sx + 5, sy + 12, W - 10, H - 16, ok, og, ob);
fill_rect(sx + 7, sy + 14, W - 14, H - 20, br, bg, bb);
fill_rect(sx + 9, sy + 16, W - 18, 10, lr, lg, lb); /* upper band */
/* glowing lab windows */
fill_rect(sx + 10, sy + H/2 - 2, 8, 6, 180, 230, 255);
fill_rect(sx + 22, sy + H/2 - 2, 8, 6, 160, 220, 250);
fill_rect(sx + 34, sy + H/2 - 2, 8, 6, 180, 230, 255);
fill_rect(sx + 12, sy + H/2, 4, 2, 240, 250, 255);
fill_rect(sx + 24, sy + H/2, 4, 2, 230, 245, 255);
/* dish on tall mast */
fill_rect(sx + W/2 + 4, sy + 2, 5, 18, ok, og, ob);
fill_rect(sx + W/2 + 5, sy + 3, 3, 16, 110, 100, 75);
disc(sx + W/2 + 6, sy + 12, 13, ok, og, ob);
disc(sx + W/2 + 6, sy + 12, 11, 215, 185, 85);
ring(sx + W/2 + 6, sy + 12, 8, 2, 170, 140, 55);
disc(sx + W/2 + 6, sy + 12, 4, 255, 245, 170);
disc(sx + W/2 + 6, sy + 12, 2, 255, 255, 220); /* feed */
line(sx + W/2 + 6, sy + 2, sx + W/2 + 6, sy + 12, 200, 190, 120);
/* side antenna stubs */
fill_rect(sx + 10, sy + 6, 3, 10, 200, 200, 140);
fill_rect(sx + 18, sy + 4, 2, 12, 220, 220, 150);
disc(sx + 11, sy + 5, 2, 255, 240, 120);
disc(sx + 19, sy + 3, 2, 255, 230, 100);
/* instrument bank / console strip */
{
uint8_t dr, dg, db;
darken3(br, bg, bb, 0.5f, &dr, &dg, &db);
fill_rect(sx + 10, sy + H - 18, W - 28, 8, dr, dg, db);
}
fill_rect(sx + 12, sy + H - 16, 4, 4, 80, 220, 120);
fill_rect(sx + 18, sy + H - 16, 4, 4, 80, 160, 255);
fill_rect(sx + 24, sy + H - 16, 4, 4, 255, 180, 80);
fill_rect(sx + 30, sy + H - 16, 4, 4, 200, 100, 255);
break;
default:
break;

View file

@ -505,42 +505,91 @@ SDL_Texture *sprites_make_bld(SDL_Renderer *r, BuildingType t, Faction f) {
disc(s, W/2 + 13, H/2 - 10, 2, 255, 200, 80, 255); /* muzzle tip */
break;
case BT_WALL:
/* battlement blocks + ridge + shadow seam */
fill_rect(s, 1, 1, W - 2, H - 2, ok, og, ob, 255);
fill_rect(s, 2, 6, W - 4, H - 8, 175, 155, 120, 255);
fill_rect(s, 2, 2, 7, 8, 195, 175, 140, 255);
fill_rect(s, 12, 2, 7, 8, 195, 175, 140, 255);
fill_rect(s, 22, 2, 7, 8, 195, 175, 140, 255);
fill_rect(s, 3, 10, W - 6, 4, 210, 190, 150, 255);
line(s, 2, H/2, W - 2, H/2, 60, 52, 42, 255);
line(s, W/2, 6, W/2, H - 2, 70, 60, 48, 255);
/* thick fort wall + crenels + seams + embrasure (KKND fort read) */
fill_rect(s, 0, 4, W, H - 4, ok, og, ob, 255);
fill_rect(s, 1, 6, W - 2, H - 8, 165, 145, 110, 255);
fill_rect(s, 2, H - 6, W - 4, 4, 90, 78, 58, 255); /* plinth */
/* thick merlons */
fill_rect(s, 1, 1, 8, 10, ok, og, ob, 255);
fill_rect(s, 2, 2, 6, 8, 195, 175, 140, 255);
fill_rect(s, W/2 - 4, 1, 8, 10, ok, og, ob, 255);
fill_rect(s, W/2 - 3, 2, 6, 8, 200, 180, 145, 255);
fill_rect(s, W - 9, 1, 8, 10, ok, og, ob, 255);
fill_rect(s, W - 8, 2, 6, 8, 190, 170, 135, 255);
fill_rect(s, 2, 10, W - 4, 3, 215, 195, 155, 255); /* coping */
/* block seams + arrow slit */
line(s, 2, H/2 + 2, W - 2, H/2 + 2, 55, 48, 38, 255);
line(s, W/3, 8, W/3, H - 4, 65, 55, 42, 255);
line(s, 2 * W/3, 8, 2 * W/3, H - 4, 65, 55, 42, 255);
fill_rect(s, W/2 - 2, H/2 - 2, 4, 8, 35, 30, 24, 255); /* embrasure */
fill_rect(s, W/2 - 1, H/2, 2, 4, 20, 18, 14, 255);
break;
case BT_REPAIR:
/* garage bay + crane arm + green service mark */
fill_rect(s, 5, 8, W - 10, H - 14, ok, og, ob, 255);
fill_rect(s, 7, 10, W - 14, H - 18, base.r, base.g, base.b, 255);
fill_rect(s, 10, H - 26, W - 20, 14, 40, 38, 34, 255);
fill_rect(s, 12, H - 24, W - 24, 10, 55, 52, 48, 255);
fill_rect(s, W - 18, 8, 10, 6, ok, og, ob, 255);
fill_rect(s, W - 16, 10, 6, 22, 90, 85, 70, 255);
line(s, W - 13, 12, 14, 18, 120, 110, 90, 255);
line(s, W - 13, 13, 14, 19, 100, 90, 70, 255);
ring(s, W/2 - 4, H/2 + 2, 8, 2, 120, 220, 120, 255);
line(s, W/2 - 10, H/2 + 2, W/2 + 2, H/2 + 2, 120, 220, 120, 255);
line(s, W/2 - 4, H/2 - 4, W/2 - 4, H/2 + 8, 120, 220, 120, 255);
/* garage + vehicle lift + tool rack + crane (KKND depot read) */
fill_rect(s, 4, 6, W - 8, H - 10, ok, og, ob, 255);
fill_rect(s, 6, 8, W - 12, H - 14, base.r, base.g, base.b, 255);
fill_rect(s, 8, 10, W - 16, 8, lite.r, lite.g, lite.b, 255); /* roof */
fill_rect(s, 10, 12, 4, 4, 50, 48, 40, 255); /* roof vents */
fill_rect(s, W/2 - 2, 12, 4, 4, 50, 48, 40, 255);
fill_rect(s, W - 14, 12, 4, 4, 50, 48, 40, 255);
/* open bay + lift pad */
fill_rect(s, 10, H - 28, W - 28, 18, ok, og, ob, 255);
fill_rect(s, 12, H - 26, W - 32, 14, 38, 36, 32, 255);
fill_rect(s, W/2 - 10, H - 22, 20, 8, 70, 68, 58, 255); /* lift platform */
fill_rect(s, W/2 - 8, H - 20, 16, 4, 110, 100, 70, 255);
line(s, W/2 - 10, H - 22, W/2 - 10, H - 12, 90, 85, 70, 255);
line(s, W/2 + 10, H - 22, W/2 + 10, H - 12, 90, 85, 70, 255);
/* tool rack annex (left) */
fill_rect(s, 4, H/2 - 2, 10, H/2 - 6, ok, og, ob, 255);
fill_rect(s, 5, H/2, 8, H/2 - 10, dark.r, dark.g, dark.b, 255);
fill_rect(s, 6, H/2 + 2, 2, 6, 200, 160, 60, 255); /* tools */
fill_rect(s, 9, H/2 + 1, 2, 7, 180, 180, 190, 255);
/* overhead crane mast + jib + hook */
fill_rect(s, W - 16, 4, 8, H - 20, ok, og, ob, 255);
fill_rect(s, W - 14, 5, 5, H - 22, 95, 88, 70, 255);
fill_rect(s, 16, 6, W - 32, 4, ok, og, ob, 255);
fill_rect(s, 17, 7, W - 34, 2, 120, 110, 85, 255);
line(s, W/2, 10, W/2, 20, 70, 65, 50, 255);
disc(s, W/2, 22, 3, 80, 75, 55, 255);
/* green service cross (clearer) */
ring(s, W/2 - 6, H/2 + 4, 9, 2, 90, 200, 90, 255);
fill_rect(s, W/2 - 14, H/2 + 2, 16, 4, 120, 220, 120, 255);
fill_rect(s, W/2 - 8, H/2 - 4, 4, 16, 120, 220, 120, 255);
/* parts crates */
fill_rect(s, W - 22, H - 14, 8, 6, 140, 100, 55, 255);
fill_rect(s, W - 20, H - 12, 4, 3, 180, 140, 70, 255);
break;
case BT_RESEARCH:
/* lab block + dish + instrument stubs */
fill_rect(s, 6, 14, W - 12, H - 20, ok, og, ob, 255);
fill_rect(s, 8, 16, W - 16, H - 24, base.r, base.g, base.b, 255);
fill_rect(s, 10, 18, W - 20, 8, lite.r, lite.g, lite.b, 255);
disc(s, W/2 + 6, 14, 12, ok, og, ob, 255);
disc(s, W/2 + 6, 14, 10, 210, 180, 80, 255);
ring(s, W/2 + 6, 14, 7, 2, 180, 150, 60, 255);
disc(s, W/2 + 6, 14, 3, 255, 240, 160, 255);
fill_rect(s, 12, H - 18, 6, 8, 230, 230, 160, 255);
fill_rect(s, 22, H - 20, 5, 10, 230, 230, 160, 255);
line(s, W/2 + 6, 4, W/2 + 6, 14, 200, 190, 120, 255);
/* tall lab + dish mast + instrument bank (KKND lab read) */
fill_rect(s, 5, 12, W - 10, H - 16, ok, og, ob, 255);
fill_rect(s, 7, 14, W - 14, H - 20, base.r, base.g, base.b, 255);
fill_rect(s, 9, 16, W - 18, 10, lite.r, lite.g, lite.b, 255); /* upper band */
/* glowing lab windows */
fill_rect(s, 10, H/2 - 2, 8, 6, 180, 230, 255, 255);
fill_rect(s, 22, H/2 - 2, 8, 6, 160, 220, 250, 255);
fill_rect(s, 34, H/2 - 2, 8, 6, 180, 230, 255, 255);
fill_rect(s, 12, H/2, 4, 2, 240, 250, 255, 255);
fill_rect(s, 24, H/2, 4, 2, 230, 245, 255, 255);
/* dish on tall mast */
fill_rect(s, W/2 + 4, 2, 5, 18, ok, og, ob, 255);
fill_rect(s, W/2 + 5, 3, 3, 16, 110, 100, 75, 255);
disc(s, W/2 + 6, 12, 13, ok, og, ob, 255);
disc(s, W/2 + 6, 12, 11, 215, 185, 85, 255);
ring(s, W/2 + 6, 12, 8, 2, 170, 140, 55, 255);
disc(s, W/2 + 6, 12, 4, 255, 245, 170, 255);
disc(s, W/2 + 6, 12, 2, 255, 255, 220, 255); /* feed */
line(s, W/2 + 6, 2, W/2 + 6, 12, 200, 190, 120, 255);
/* side antenna stubs */
fill_rect(s, 10, 6, 3, 10, 200, 200, 140, 255);
fill_rect(s, 18, 4, 2, 12, 220, 220, 150, 255);
disc(s, 11, 5, 2, 255, 240, 120, 255);
disc(s, 19, 3, 2, 255, 230, 100, 255);
/* instrument bank / console strip */
fill_rect(s, 10, H - 18, W - 28, 8, dark.r, dark.g, dark.b, 255);
fill_rect(s, 12, H - 16, 4, 4, 80, 220, 120, 255);
fill_rect(s, 18, H - 16, 4, 4, 80, 160, 255, 255);
fill_rect(s, 24, H - 16, 4, 4, 255, 180, 80, 255);
fill_rect(s, 30, H - 16, 4, 4, 200, 100, 255, 255);
break;
default:
(void)dark;