engine-c: HQ→clash corridor scrap/rock fill + thicker unit silhouettes

This commit is contained in:
local-model/engine-L2-grok-4.5 2026-09-19 14:33:58 +02:00
parent 05a457bf21
commit e032b8cbfa
No known key found for this signature in database
3 changed files with 390 additions and 137 deletions

View file

@ -376,6 +376,46 @@ static void place_showcase(Game *g, Faction human, Faction enemy) {
} }
} }
} }
/* denser corridor fill HQ → primary clash: scrap mounds, rubble, rock outcrops
* so arid yellow plate is broken up (KKND2 wasteland read). */
{
int hx_t = sx, hy_t = sy;
int minx = hx_t < ctx ? hx_t : ctx;
int maxx = hx_t > ctx ? hx_t : ctx;
int miny = hy_t < cty ? hy_t : cty;
int maxy = hy_t > cty ? hy_t : cty;
minx -= 4; maxx += 6; miny -= 5; maxy += 4;
for (int ty = miny; ty <= maxy; ty++) {
for (int tx = minx; tx <= maxx; tx++) {
if (!map_in_bounds(&g->map, tx, ty)) continue;
Tile *t = map_tile(&g->map, tx, ty);
if (!t || t->occupied || !t->walkable) continue;
if (t->terrain == T_ROAD) continue;
/* keep clash-core scars already set */
if (t->terrain == T_RUBBLE || t->terrain == T_SCRAP) continue;
int dx = tx - hx_t, dy = ty - hy_t;
int h = (tx * 17 + ty * 13) & 15;
int along = abs((ty - hy_t) * (ctx - hx_t) - (tx - hx_t) * (cty - hy_t));
int span = abs(ctx - hx_t) + abs(cty - hy_t);
if (span < 1) span = 1;
/* band around approach road */
if (along > span * 3) continue;
if (h == 0 || h == 7) {
t->terrain = T_SCRAP;
t->scrap = (uint8_t)(95 + ((dx * 19 + dy * 11) & 127));
} else if (h == 2 || h == 9) {
t->terrain = T_RUBBLE;
t->scrap = 0;
} else if (h == 4 && ((tx + ty) & 3) == 0) {
/* sparse rock outcrops — non-walkable */
t->terrain = T_ROCK;
t->walkable = 0;
t->scrap = 0;
}
}
}
}
} }
/* secondary clash front SE of HQ (second fight plate in crop) */ /* secondary clash front SE of HQ (second fight plate in crop) */
@ -417,6 +457,41 @@ static void place_showcase(Game *g, Faction human, Faction enemy) {
t->scrap = 0; t->scrap = 0;
} }
} }
/* denser corridor fill HQ → secondary SE clash */
{
int hx_t = sx, hy_t = sy;
int minx = hx_t < ctx2 ? hx_t : ctx2;
int maxx = hx_t > ctx2 ? hx_t : ctx2;
int miny = hy_t < cty2 ? hy_t : cty2;
int maxy = hy_t > cty2 ? hy_t : cty2;
minx -= 3; maxx += 5; miny -= 3; maxy += 5;
for (int ty = miny; ty <= maxy; ty++) {
for (int tx = minx; tx <= maxx; tx++) {
if (!map_in_bounds(&g->map, tx, ty)) continue;
Tile *t = map_tile(&g->map, tx, ty);
if (!t || t->occupied || !t->walkable) continue;
if (t->terrain == T_ROAD || t->terrain == T_RUBBLE || t->terrain == T_SCRAP)
continue;
int dx = tx - hx_t, dy = ty - hy_t;
int h = (tx * 19 + ty * 11) & 15;
int along = abs((ty - hy_t) * (ctx2 - hx_t) - (tx - hx_t) * (cty2 - hy_t));
int span = abs(ctx2 - hx_t) + abs(cty2 - hy_t);
if (span < 1) span = 1;
if (along > span * 3) continue;
if (h == 1 || h == 8) {
t->terrain = T_SCRAP;
t->scrap = (uint8_t)(90 + ((dx * 23 + dy * 7) & 127));
} else if (h == 3 || h == 10) {
t->terrain = T_RUBBLE;
t->scrap = 0;
} else if (h == 5 && ((tx + ty) & 3) == 1) {
t->terrain = T_ROCK;
t->walkable = 0;
t->scrap = 0;
}
}
}
}
bld_spawn(g, BT_TURRET, human, ctx2 - 2, cty2); bld_spawn(g, BT_TURRET, human, ctx2 - 2, cty2);
bld_spawn(g, BT_TURRET, human, ctx2 + 1, cty2 + 1); bld_spawn(g, BT_TURRET, human, ctx2 + 1, cty2 + 1);
bld_spawn(g, BT_WALL, human, ctx2 - 3, cty2); bld_spawn(g, BT_WALL, human, ctx2 - 3, cty2);

View file

@ -146,131 +146,185 @@ static void draw_unit(Unit *u, int sx, int sy) {
switch (u->type) { switch (u->type) {
case UT_INFANTRY: case UT_INFANTRY:
/* legs → torso → helmet → rifle (KKND2 foot soldier read) */ /* legs → torso → helmet/visor → pack → thick rifle (KKND2 foot soldier) */
disc(LX(11,23), LY(11,23), SI(3), ok, og, ob); disc(LX(11,23), LY(11,23), SI(3), ok, og, ob);
disc(LX(19,23), LY(19,23), SI(3), ok, og, ob); disc(LX(19,23), LY(19,23), SI(3), ok, og, ob);
disc(LX(11,23), LY(11,23), SI(2), br, bg, bb); disc(LX(11,23), LY(11,23), SI(2), br, bg, bb);
disc(LX(19,23), LY(19,23), SI(2), br, bg, bb); disc(LX(19,23), LY(19,23), SI(2), br, bg, bb);
disc(sx, sy, SI(8), ok, og, ob); disc(sx, sy, SI(9), ok, og, ob);
disc(sx, sy, SI(6), br, bg, bb); disc(sx, sy, SI(7), br, bg, bb);
disc(LX(15,9), LY(15,9), SI(4), ok, og, ob); disc(LX(10,16), LY(10,16), SI(3), ok, og, ob); /* backpack */
disc(LX(15,9), LY(15,9), SI(3), lr, lg, lb); disc(LX(10,16), LY(10,16), SI(2), 50, 46, 40);
line(LX(16,14), LY(16,14), LX(16,1), LY(16,1), 40, 36, 30); disc(LX(15,8), LY(15,8), SI(5), ok, og, ob);
line(LX(17,14), LY(17,14), LX(17,2), LY(17,2), 55, 50, 40); disc(LX(15,8), LY(15,8), SI(4), lr, lg, lb); /* helmet */
fill_rect(LX(13,8)-SI(1), LY(13,8)-1, SI(5), SI(2), 30, 40, 50); /* visor */
line(LX(16,14), LY(16,14), LX(16,0), LY(16,0), 40, 36, 30);
line(LX(17,14), LY(17,14), LX(17,1), LY(17,1), 55, 50, 40);
line(LX(18,14), LY(18,14), LX(18,2), LY(18,2), 45, 40, 34);
disc(LX(17,1), LY(17,1), SI(2), 60, 55, 45); /* muzzle tip */
break; break;
case UT_BUGGY: case UT_BUGGY:
/* cabin + windshield + chassis + wheels */ /* cabin + windshield + chassis + hubbed wheels + thick MG */
fill_rect(sx-SI(12), sy-SI(8), SI(24), SI(16), ok, og, ob); fill_rect(sx-SI(12), sy-SI(8), SI(24), SI(16), ok, og, ob);
fill_rect(sx-SI(10), sy-SI(6), SI(20), SI(12), br, bg, bb); fill_rect(sx-SI(10), sy-SI(6), SI(20), SI(12), br, bg, bb);
fill_rect(LX(7,10)-SI(1), LY(7,10)-SI(1), SI(10), SI(6), lr, lg, lb); /* cabin */ fill_rect(LX(7,10)-SI(1), LY(7,10)-SI(1), SI(10), SI(6), lr, lg, lb); /* cabin */
fill_rect(LX(8,9)-SI(1), LY(8,9)-SI(1), SI(8), SI(3), 35, 55, 75); /* windshield */ fill_rect(LX(8,9)-SI(1), LY(8,9)-SI(1), SI(8), SI(3), 35, 55, 75); /* windshield */
disc(LX(8,7), LY(8,7), SI(5), ok, og, ob);
disc(LX(22,7), LY(22,7), SI(5), ok, og, ob);
disc(LX(8,23), LY(8,23), SI(5), ok, og, ob);
disc(LX(22,23), LY(22,23), SI(5), ok, og, ob);
disc(LX(8,7), LY(8,7), SI(4), mr, mg, mb); disc(LX(8,7), LY(8,7), SI(4), mr, mg, mb);
disc(LX(22,7), LY(22,7), SI(4), mr, mg, mb); disc(LX(22,7), LY(22,7), SI(4), mr, mg, mb);
disc(LX(8,23), LY(8,23), SI(4), mr, mg, mb); disc(LX(8,23), LY(8,23), SI(4), mr, mg, mb);
disc(LX(22,23), LY(22,23), SI(4), mr, mg, mb); disc(LX(22,23), LY(22,23), SI(4), mr, mg, mb);
disc(LX(8,7), LY(8,7), SI(2), 90, 85, 75); /* hub */
disc(LX(22,7), LY(22,7), SI(2), 90, 85, 75);
disc(LX(8,23), LY(8,23), SI(2), 90, 85, 75);
disc(LX(22,23), LY(22,23), SI(2), 90, 85, 75);
tyre_mark(LX(8,7), LY(8,7), SI(4), ph, 1); tyre_mark(LX(8,7), LY(8,7), SI(4), ph, 1);
tyre_mark(LX(22,7), LY(22,7), SI(4), ph, 1); tyre_mark(LX(22,7), LY(22,7), SI(4), ph, 1);
tyre_mark(LX(8,23), LY(8,23), SI(4), ph, 1); tyre_mark(LX(8,23), LY(8,23), SI(4), ph, 1);
tyre_mark(LX(22,23), LY(22,23), SI(4), ph, 1); tyre_mark(LX(22,23), LY(22,23), SI(4), ph, 1);
line(sx, sy, LX(29,15), LY(29,15), 40, 36, 30); line(sx, sy, LX(29,14), LY(29,14), 40, 36, 30);
line(sx, sy, LX(29,15), LY(29,15), 50, 45, 35);
line(sx, sy, LX(29,16), LY(29,16), 40, 36, 30);
disc(LX(29,15), LY(29,15), SI(2), 60, 55, 45);
break; break;
case UT_TANK: case UT_TANK:
/* side tracks + hull + cupola + thick barrel */ /* side tracks + sprockets + hull + cupola + thick barrel */
fill_rect(LX(3,10)-SI(1), LY(3,10)-SI(2), SI(5), SI(12), ok, og, ob); fill_rect(LX(3,10)-SI(1), LY(3,10)-SI(2), SI(5), SI(12), ok, og, ob);
fill_rect(LX(24,10)-SI(1), LY(24,10)-SI(2), SI(5), SI(12), ok, og, ob); fill_rect(LX(24,10)-SI(1), LY(24,10)-SI(2), SI(5), SI(12), ok, og, ob);
fill_rect(LX(4,11)-SI(1), LY(4,11)-SI(1), SI(3), SI(10), mr, mg, mb); fill_rect(LX(4,11)-SI(1), LY(4,11)-SI(1), SI(3), SI(10), mr, mg, mb);
fill_rect(LX(25,11)-SI(1), LY(25,11)-SI(1), SI(3), SI(10), mr, mg, mb); fill_rect(LX(25,11)-SI(1), LY(25,11)-SI(1), SI(3), SI(10), mr, mg, mb);
disc(LX(5,11), LY(5,11), SI(2), 40, 38, 32); /* sprocket */
disc(LX(5,20), LY(5,20), SI(2), 40, 38, 32);
disc(LX(26,11), LY(26,11), SI(2), 40, 38, 32);
disc(LX(26,20), LY(26,20), SI(2), 40, 38, 32);
fill_rect(sx-SI(11), sy-SI(5), SI(22), SI(10), ok, og, ob); fill_rect(sx-SI(11), sy-SI(5), SI(22), SI(10), ok, og, ob);
fill_rect(sx-SI(9), sy-SI(4), SI(18), SI(8), br, bg, bb); fill_rect(sx-SI(9), sy-SI(4), SI(18), SI(8), br, bg, bb);
disc(sx, sy, SI(6), ok, og, ob); disc(sx, sy, SI(7), ok, og, ob);
disc(sx, sy, SI(5), lr, lg, lb); /* cupola */ disc(sx, sy, SI(6), lr, lg, lb); /* cupola */
disc(LX(15,12), LY(15,12), SI(2), 40, 38, 32); /* hatch */ disc(LX(15,12), LY(15,12), SI(2), 40, 38, 32); /* hatch */
line(LX(15,13), LY(15,13), LX(29,13), LY(29,13), 45, 40, 32);
line(LX(15,14), LY(15,14), LX(29,14), LY(29,14), 50, 45, 35); line(LX(15,14), LY(15,14), LX(29,14), LY(29,14), 50, 45, 35);
line(LX(15,15), LY(15,15), LX(29,15), LY(29,15), 50, 45, 35); line(LX(15,15), LY(15,15), LX(29,15), LY(29,15), 55, 50, 40);
line(LX(15,16), LY(15,16), LX(28,16), LY(28,16), 50, 45, 35); line(LX(15,16), LY(15,16), LX(29,16), LY(29,16), 50, 45, 35);
line(LX(15,17), LY(15,17), LX(28,17), LY(28,17), 45, 40, 32);
disc(LX(29,15), LY(29,15), SI(2), 60, 55, 45); /* muzzle */
disc(LX(8,23), LY(8,23), SI(4), mr, mg, mb); disc(LX(8,23), LY(8,23), SI(4), mr, mg, mb);
disc(LX(22,23), LY(22,23), SI(4), mr, mg, mb); disc(LX(22,23), LY(22,23), SI(4), mr, mg, mb);
tyre_mark(LX(8,23), LY(8,23), SI(4), ph, 0); tyre_mark(LX(8,23), LY(8,23), SI(4), ph, 0);
tyre_mark(LX(22,23), LY(22,23), SI(4), ph, 0); tyre_mark(LX(22,23), LY(22,23), SI(4), ph, 0);
break; break;
case UT_ARTILLERY: case UT_ARTILLERY:
/* chassis + long barrel tube */ /* chassis + long thick barrel tube + muzzle brake */
fill_rect(sx-SI(13), sy-SI(5), SI(26), SI(12), ok, og, ob); fill_rect(sx-SI(13), sy-SI(5), SI(26), SI(12), ok, og, ob);
fill_rect(sx-SI(11), sy-SI(3), SI(22), SI(8), br, bg, bb); fill_rect(sx-SI(11), sy-SI(3), SI(22), SI(8), br, bg, bb);
disc(sx, sy, SI(5), ok, og, ob); disc(sx, sy, SI(6), ok, og, ob);
disc(sx, sy, SI(4), lr, lg, lb); disc(sx, sy, SI(5), lr, lg, lb);
line(LX(15,13), LY(15,13), LX(4,2), LY(4,2), 45, 40, 32);
line(LX(15,14), LY(15,14), LX(4,3), LY(4,3), 50, 45, 35); line(LX(15,14), LY(15,14), LX(4,3), LY(4,3), 50, 45, 35);
line(LX(15,15), LY(15,15), LX(3,2), LY(3,2), 55, 50, 40); line(LX(15,15), LY(15,15), LX(3,2), LY(3,2), 55, 50, 40);
line(LX(15,16), LY(15,16), LX(4,4), LY(4,4), 50, 45, 35); line(LX(15,16), LY(15,16), LX(4,4), LY(4,4), 50, 45, 35);
disc(LX(4,3), LY(4,3), SI(2), 60, 55, 45); /* muzzle */ line(LX(15,17), LY(15,17), LX(5,5), LY(5,5), 45, 40, 32);
disc(LX(8,23), LY(8,23), SI(3), mr, mg, mb); disc(LX(4,3), LY(4,3), SI(3), 60, 55, 45); /* muzzle */
disc(LX(22,23), LY(22,23), SI(3), mr, mg, mb); disc(LX(4,3), LY(4,3), SI(1), 30, 28, 24);
tyre_mark(LX(8,23), LY(8,23), SI(3), ph, 0); disc(LX(8,23), LY(8,23), SI(4), mr, mg, mb);
tyre_mark(LX(22,23), LY(22,23), SI(3), ph, 0); disc(LX(22,23), LY(22,23), SI(4), mr, mg, mb);
tyre_mark(LX(8,23), LY(8,23), SI(4), ph, 0);
tyre_mark(LX(22,23), LY(22,23), SI(4), ph, 0);
break; break;
case UT_HARVESTER: { case UT_HARVESTER: {
/* cabin nose + cargo bed (empty dark → gold fill by u->cargo) + wheels */ /* cabin + scoop lip + cargo bed (gold by cargo) + hubbed dual wheels */
fill_rect(sx-SI(14), sy-SI(9), SI(28), SI(18), ok, og, ob); fill_rect(sx-SI(14), sy-SI(9), SI(28), SI(18), ok, og, ob);
fill_rect(sx-SI(12), sy-SI(7), SI(24), SI(14), br, bg, bb); fill_rect(sx-SI(12), sy-SI(7), SI(24), SI(14), br, bg, bb);
fill_rect(LX(4,10)-SI(1), LY(4,10)-SI(2), SI(8), SI(8), lr, lg, lb); /* cabin */ fill_rect(LX(4,10)-SI(1), LY(4,10)-SI(2), SI(8), SI(8), lr, lg, lb); /* cabin */
fill_rect(LX(5,9)-SI(1), LY(5,9)-SI(1), SI(6), SI(3), 35, 55, 75); /* cabin glass */ fill_rect(LX(5,9)-SI(1), LY(5,9)-SI(1), SI(6), SI(3), 35, 55, 75); /* glass */
fill_rect(LX(2,14)-SI(1), LY(2,14)-SI(1), SI(4), SI(5), 90, 80, 55); /* scoop */
int bed_w = SI(14), bed_h = SI(10); int bed_w = SI(14), bed_h = SI(10);
int bed_x = sx - SI(4), bed_y = sy - SI(5); int bed_x = sx - SI(4), bed_y = sy - SI(5);
fill_rect(bed_x, bed_y, bed_w, bed_h, 55, 48, 32); /* empty bed */ fill_rect(bed_x, bed_y, bed_w, bed_h, 55, 48, 32);
float cap = (float)unit_def(u->type, u->faction)->cargo; float cap = (float)unit_def(u->type, u->faction)->cargo;
float fill = (cap > 0.0f) ? (u->cargo / cap) : 0.0f; float fill = (cap > 0.0f) ? (u->cargo / cap) : 0.0f;
if (fill < 0.0f) fill = 0.0f; if (fill < 0.0f) fill = 0.0f;
if (fill > 1.0f) fill = 1.0f; if (fill > 1.0f) fill = 1.0f;
int fw = (int)(bed_w * fill + 0.5f); int fw = (int)(bed_w * fill + 0.5f);
if (fw > 0) if (fw > 0)
fill_rect(bed_x, bed_y, fw, bed_h, 200, 170, 90); /* cargo gold */ fill_rect(bed_x, bed_y, fw, bed_h, 200, 170, 90);
if (fill > 0.15f) { if (fill > 0.15f) {
line(LX(14,10), LY(14,10), LX(26,10), LY(26,10), 160, 130, 70); line(LX(14,10), LY(14,10), LX(26,10), LY(26,10), 160, 130, 70);
line(LX(14,13), LY(14,13), LX(26,13), LY(26,13), 160, 130, 70); line(LX(14,13), LY(14,13), LX(26,13), LY(26,13), 160, 130, 70);
line(LX(14,16), LY(14,16), LX(26,16), LY(26,16), 160, 130, 70); line(LX(14,16), LY(14,16), LX(26,16), LY(26,16), 160, 130, 70);
} }
disc(LX(8,23), LY(8,23), SI(5), ok, og, ob);
disc(LX(22,23), LY(22,23), SI(5), ok, og, ob);
disc(LX(8,23), LY(8,23), SI(4), mr, mg, mb); disc(LX(8,23), LY(8,23), SI(4), mr, mg, mb);
disc(LX(22,23), LY(22,23), SI(4), mr, mg, mb); disc(LX(22,23), LY(22,23), SI(4), mr, mg, mb);
disc(LX(8,23), LY(8,23), SI(2), 90, 85, 75);
disc(LX(22,23), LY(22,23), SI(2), 90, 85, 75);
tyre_mark(LX(8,23), LY(8,23), SI(4), ph, 1); tyre_mark(LX(8,23), LY(8,23), SI(4), ph, 1);
tyre_mark(LX(22,23), LY(22,23), SI(4), ph, 1); tyre_mark(LX(22,23), LY(22,23), SI(4), ph, 1);
line(LX(5,7), LY(5,7), LX(5,2), LY(5,2), lr, lg, lb); line(LX(5,7), LY(5,7), LX(5,2), LY(5,2), lr, lg, lb);
line(LX(6,7), LY(6,7), LX(6,3), LY(6,3), 50, 46, 40);
break; break;
} }
case UT_JEEP: case UT_JEEP:
/* open cabin + roll bar + MG */ /* open cabin + thick roll cage + hubbed wheels + twin MG */
fill_rect(sx-SI(11), sy-SI(6), SI(22), SI(12), ok, og, ob); fill_rect(sx-SI(11), sy-SI(6), SI(22), SI(12), ok, og, ob);
fill_rect(sx-SI(9), sy-SI(4), SI(18), SI(8), br, bg, bb); fill_rect(sx-SI(9), sy-SI(4), SI(18), SI(8), br, bg, bb);
fill_rect(LX(8,11)-SI(1), LY(8,11)-SI(1), SI(8), SI(5), lr, lg, lb); fill_rect(LX(8,11)-SI(1), LY(8,11)-SI(1), SI(8), SI(5), lr, lg, lb);
disc(LX(9,22), LY(9,22), SI(5), ok, og, ob);
disc(LX(21,22), LY(21,22), SI(5), ok, og, ob);
disc(LX(9,22), LY(9,22), SI(4), mr, mg, mb); disc(LX(9,22), LY(9,22), SI(4), mr, mg, mb);
disc(LX(21,22), LY(21,22), SI(4), mr, mg, mb); disc(LX(21,22), LY(21,22), SI(4), mr, mg, mb);
disc(LX(9,22), LY(9,22), SI(2), 90, 85, 75);
disc(LX(21,22), LY(21,22), SI(2), 90, 85, 75);
tyre_mark(LX(9,22), LY(9,22), SI(4), ph, 1); tyre_mark(LX(9,22), LY(9,22), SI(4), ph, 1);
tyre_mark(LX(21,22), LY(21,22), SI(4), ph, 1); tyre_mark(LX(21,22), LY(21,22), SI(4), ph, 1);
line(LX(11,11), LY(11,11), LX(11,3), LY(11,3), lr, lg, lb); line(LX(11,11), LY(11,11), LX(11,3), LY(11,3), lr, lg, lb);
line(LX(12,11), LY(12,11), LX(12,3), LY(12,3), 50, 46, 40);
line(LX(19,11), LY(19,11), LX(19,3), LY(19,3), lr, lg, lb); line(LX(19,11), LY(19,11), LX(19,3), LY(19,3), lr, lg, lb);
line(LX(18,11), LY(18,11), LX(18,3), LY(18,3), 50, 46, 40);
line(LX(11,3), LY(11,3), LX(19,3), LY(19,3), lr, lg, lb); line(LX(11,3), LY(11,3), LX(19,3), LY(19,3), lr, lg, lb);
line(LX(11,4), LY(11,4), LX(19,4), LY(19,4), 50, 46, 40);
line(sx, sy, LX(28,14), LY(28,14), 40, 36, 30);
line(sx, sy, LX(28,15), LY(28,15), 50, 45, 35); line(sx, sy, LX(28,15), LY(28,15), 50, 45, 35);
line(sx, sy, LX(28,16), LY(28,16), 40, 36, 30);
disc(LX(28,15), LY(28,15), SI(2), 60, 55, 45);
break; break;
case UT_MUTANT: case UT_MUTANT:
/* hunched body + spikes + claws */ /* hunched bulk + brow ridge + thick spikes + claw hand */
disc(sx, sy+SI(2), SI(10), ok, og, ob); disc(sx, sy+SI(2), SI(11), ok, og, ob);
disc(sx, sy, SI(8), br, bg, bb); disc(sx, sy, SI(9), br, bg, bb);
disc(LX(15,9), LY(15,9), SI(4), ok, og, ob); disc(LX(15,9), LY(15,9), SI(5), ok, og, ob);
disc(LX(15,9), LY(15,9), SI(3), lr, lg, lb); disc(LX(15,9), LY(15,9), SI(4), lr, lg, lb);
line(LX(12,6), LY(12,6), LX(10,1), LY(10,1), 40, 36, 30); /* back spike */ fill_rect(LX(12,8)-SI(1), LY(12,8)-1, SI(7), SI(2), 30, 40, 50); /* brow */
line(LX(12,6), LY(12,6), LX(9,0), LY(9,0), 40, 36, 30);
line(LX(13,6), LY(13,6), LX(10,1), LY(10,1), 55, 50, 40);
line(LX(15,5), LY(15,5), LX(15,0), LY(15,0), 40, 36, 30); line(LX(15,5), LY(15,5), LX(15,0), LY(15,0), 40, 36, 30);
line(LX(18,6), LY(18,6), LX(20,1), LY(20,1), 40, 36, 30); line(LX(16,5), LY(16,5), LX(16,0), LY(16,0), 55, 50, 40);
line(sx, sy+SI(1), LX(26,8), LY(26,8), 40, 36, 30); /* claw arm */ line(LX(18,6), LY(18,6), LX(21,0), LY(21,0), 40, 36, 30);
line(LX(24,9), LY(24,9), LX(28,6), LY(28,6), 55, 50, 40); line(LX(17,6), LY(17,6), LX(20,1), LY(20,1), 55, 50, 40);
line(LX(24,9), LY(24,9), LX(28,11), LY(28,11), 55, 50, 40); line(sx, sy+SI(1), LX(26,8), LY(26,8), 40, 36, 30);
disc(LX(10,22), LY(10,22), SI(3), ok, og, ob); line(sx, sy+SI(2), LX(26,9), LY(26,9), 50, 45, 35);
disc(LX(20,22), LY(20,22), SI(3), ok, og, ob); line(LX(24,9), LY(24,9), LX(29,5), LY(29,5), 55, 50, 40);
disc(LX(10,22), LY(10,22), SI(2), br, bg, bb); line(LX(24,9), LY(24,9), LX(29,11), LY(29,11), 55, 50, 40);
disc(LX(20,22), LY(20,22), SI(2), br, bg, bb); line(LX(24,10), LY(24,10), LX(28,8), LY(28,8), 70, 60, 45);
disc(LX(28,8), LY(28,8), SI(2), 70, 60, 45); /* claw tip */
disc(LX(10,22), LY(10,22), SI(4), ok, og, ob);
disc(LX(20,22), LY(20,22), SI(4), ok, og, ob);
disc(LX(10,22), LY(10,22), SI(3), br, bg, bb);
disc(LX(20,22), LY(20,22), SI(3), br, bg, bb);
break; break;
case UT_BEAST: case UT_BEAST:
/* chunky body + snout + multi-wheel */ /* armored carapace + thick snout/tusks + hubbed multi-wheel */
fill_rect(sx-SI(10), sy-SI(6), SI(20), SI(12), ok, og, ob); fill_rect(sx-SI(10), sy-SI(6), SI(20), SI(12), ok, og, ob);
fill_rect(sx-SI(8), sy-SI(4), SI(16), SI(8), br, bg, bb); fill_rect(sx-SI(8), sy-SI(4), SI(16), SI(8), br, bg, bb);
fill_rect(sx-SI(6), sy-SI(5), SI(12), SI(3), lr, lg, lb); /* carapace ridge */
disc(LX(9,21), LY(9,21), SI(4), ok, og, ob);
disc(LX(14,22), LY(14,22), SI(4), ok, og, ob);
disc(LX(19,21), LY(19,21), SI(4), ok, og, ob);
disc(LX(23,22), LY(23,22), SI(4), ok, og, ob);
disc(LX(9,21), LY(9,21), SI(3), mr, mg, mb); disc(LX(9,21), LY(9,21), SI(3), mr, mg, mb);
disc(LX(14,22), LY(14,22), SI(3), mr, mg, mb); disc(LX(14,22), LY(14,22), SI(3), mr, mg, mb);
disc(LX(19,21), LY(19,21), SI(3), mr, mg, mb); disc(LX(19,21), LY(19,21), SI(3), mr, mg, mb);
@ -279,64 +333,99 @@ static void draw_unit(Unit *u, int sx, int sy) {
tyre_mark(LX(14,22), LY(14,22), SI(3), ph, 1); tyre_mark(LX(14,22), LY(14,22), SI(3), ph, 1);
tyre_mark(LX(19,21), LY(19,21), SI(3), ph, 1); tyre_mark(LX(19,21), LY(19,21), SI(3), ph, 1);
tyre_mark(LX(23,22), LY(23,22), SI(3), ph, 1); tyre_mark(LX(23,22), LY(23,22), SI(3), ph, 1);
disc(LX(24,12), LY(24,12), SI(5), ok, og, ob); disc(LX(24,12), LY(24,12), SI(6), ok, og, ob);
disc(LX(24,12), LY(24,12), SI(4), lr, lg, lb); /* snout */ disc(LX(24,12), LY(24,12), SI(5), lr, lg, lb); /* snout */
line(LX(26,12), LY(26,12), LX(29,12), LY(29,12), 40, 36, 30); line(LX(26,10), LY(26,10), LX(29,8), LY(29,8), 40, 36, 30); /* tusk */
line(LX(26,14), LY(26,14), LX(29,16), LY(29,16), 40, 36, 30);
line(LX(26,12), LY(26,12), LX(29,12), LY(29,12), 55, 50, 40);
disc(LX(29,12), LY(29,12), SI(2), 60, 55, 45);
break; break;
case UT_RAVAGER: case UT_RAVAGER:
/* heavy hull + side skirts + big barrel */ /* heavy skirts + sprockets + cupola hatch + thick multi-barrel */
fill_rect(LX(1,9)-SI(1), LY(1,9)-SI(2), SI(5), SI(14), ok, og, ob); fill_rect(LX(1,9)-SI(1), LY(1,9)-SI(2), SI(5), SI(14), ok, og, ob);
fill_rect(LX(26,9)-SI(1), LY(26,9)-SI(2), SI(5), SI(14), ok, og, ob); fill_rect(LX(26,9)-SI(1), LY(26,9)-SI(2), SI(5), SI(14), ok, og, ob);
fill_rect(LX(2,11)-SI(1), LY(2,11)-SI(1), SI(3), SI(10), mr, mg, mb);
fill_rect(LX(27,11)-SI(1), LY(27,11)-SI(1), SI(3), SI(10), mr, mg, mb);
disc(LX(3,12), LY(3,12), SI(2), 40, 38, 32);
disc(LX(3,20), LY(3,20), SI(2), 40, 38, 32);
disc(LX(28,12), LY(28,12), SI(2), 40, 38, 32);
disc(LX(28,20), LY(28,20), SI(2), 40, 38, 32);
fill_rect(sx-SI(13), sy-SI(6), SI(26), SI(12), ok, og, ob); fill_rect(sx-SI(13), sy-SI(6), SI(26), SI(12), ok, og, ob);
fill_rect(sx-SI(11), sy-SI(5), SI(22), SI(10), br, bg, bb); fill_rect(sx-SI(11), sy-SI(5), SI(22), SI(10), br, bg, bb);
disc(sx, sy, SI(7), ok, og, ob); disc(sx, sy, SI(8), ok, og, ob);
disc(sx, sy, SI(6), lr, lg, lb); disc(sx, sy, SI(7), lr, lg, lb);
disc(LX(15,12), LY(15,12), SI(2), 40, 38, 32); /* hatch */
line(LX(15,13), LY(15,13), LX(29,13), LY(29,13), 45, 40, 32);
line(LX(15,14), LY(15,14), LX(29,14), LY(29,14), 50, 45, 35); line(LX(15,14), LY(15,14), LX(29,14), LY(29,14), 50, 45, 35);
line(LX(15,15), LY(15,15), LX(29,15), LY(29,15), 50, 45, 35); line(LX(15,15), LY(15,15), LX(29,15), LY(29,15), 55, 50, 40);
line(LX(15,16), LY(15,16), LX(28,16), LY(28,16), 50, 45, 35); line(LX(15,16), LY(15,16), LX(29,16), LY(29,16), 50, 45, 35);
line(LX(15,17), LY(15,17), LX(28,17), LY(28,17), 45, 40, 32);
disc(LX(29,15), LY(29,15), SI(2), 60, 55, 45);
disc(LX(7,23), LY(7,23), SI(5), ok, og, ob);
disc(LX(23,23), LY(23,23), SI(5), ok, og, ob);
disc(LX(7,23), LY(7,23), SI(4), mr, mg, mb); disc(LX(7,23), LY(7,23), SI(4), mr, mg, mb);
disc(LX(23,23), LY(23,23), SI(4), mr, mg, mb); disc(LX(23,23), LY(23,23), SI(4), mr, mg, mb);
tyre_mark(LX(7,23), LY(7,23), SI(4), ph, 0); tyre_mark(LX(7,23), LY(7,23), SI(4), ph, 0);
tyre_mark(LX(23,23), LY(23,23), SI(4), ph, 0); tyre_mark(LX(23,23), LY(23,23), SI(4), ph, 0);
break; break;
case UT_FLAME: case UT_FLAME:
/* backpack tank + nozzle + body */ /* fuel pack valves + thick nozzle jet + helmet */
fill_rect(sx-SI(8), sy-SI(3), SI(16), SI(12), ok, og, ob); fill_rect(sx-SI(8), sy-SI(3), SI(16), SI(12), ok, og, ob);
fill_rect(sx-SI(6), sy-SI(1), SI(12), SI(9), br, bg, bb); fill_rect(sx-SI(6), sy-SI(1), SI(12), SI(9), br, bg, bb);
disc(LX(15,9), LY(15,9), SI(4), ok, og, ob); disc(LX(15,9), LY(15,9), SI(5), ok, og, ob);
disc(LX(15,9), LY(15,9), SI(3), lr, lg, lb); disc(LX(15,9), LY(15,9), SI(4), lr, lg, lb);
disc(LX(8,14), LY(8,14), SI(5), ok, og, ob); /* fuel tank */ fill_rect(LX(13,9)-SI(1), LY(13,9)-1, SI(5), SI(2), 30, 40, 50); /* visor */
disc(LX(8,14), LY(8,14), SI(4), 90, 70, 40); disc(LX(8,14), LY(8,14), SI(6), ok, og, ob); /* fuel tank */
disc(LX(8,14), LY(8,14), SI(2), 200, 120, 40); disc(LX(8,14), LY(8,14), SI(5), 90, 70, 40);
disc(LX(8,14), LY(8,14), SI(3), 200, 120, 40);
disc(LX(8,12), LY(8,12), SI(1), 60, 55, 45); /* valve */
disc(LX(8,16), LY(8,16), SI(1), 60, 55, 45);
line(LX(18,14), LY(18,14), LX(28,19), LY(28,19), 255, 120, 40);
line(LX(18,15), LY(18,15), LX(28,20), LY(28,20), 255, 150, 50); line(LX(18,15), LY(18,15), LX(28,20), LY(28,20), 255, 150, 50);
line(LX(18,16), LY(18,16), LX(27,21), LY(27,21), 255, 180, 60); line(LX(18,16), LY(18,16), LX(27,21), LY(27,21), 255, 180, 60);
disc(LX(28,20), LY(28,20), SI(2), 255, 200, 80); line(LX(18,17), LY(18,17), LX(26,21), LY(26,21), 255, 200, 80);
disc(LX(28,20), LY(28,20), SI(3), 255, 200, 80);
disc(LX(28,20), LY(28,20), SI(1), 255, 240, 160);
break; break;
case UT_MISSILE: case UT_MISSILE:
/* launcher rails + tubes on wheeled chassis */ /* dual tube pods + rail tips + hubbed chassis */
fill_rect(sx-SI(11), sy-SI(4), SI(22), SI(14), ok, og, ob); fill_rect(sx-SI(11), sy-SI(4), SI(22), SI(14), ok, og, ob);
fill_rect(sx-SI(9), sy-SI(2), SI(18), SI(10), br, bg, bb); fill_rect(sx-SI(9), sy-SI(2), SI(18), SI(10), br, bg, bb);
fill_rect(LX(12,8)-SI(1), LY(12,8)-SI(2), SI(10), SI(4), ok, og, ob); fill_rect(LX(12,7)-SI(1), LY(12,7)-SI(2), SI(10), SI(5), ok, og, ob);
fill_rect(LX(13,7)-SI(1), LY(13,7)-SI(1), SI(8), SI(2), 255, 80, 60); fill_rect(LX(13,6)-SI(1), LY(13,6)-SI(1), SI(8), SI(3), 255, 80, 60);
fill_rect(LX(12,13)-SI(1), LY(12,13)-SI(2), SI(10), SI(4), ok, og, ob); fill_rect(LX(12,13)-SI(1), LY(12,13)-SI(2), SI(10), SI(5), ok, og, ob);
fill_rect(LX(13,12)-SI(1), LY(13,12)-SI(1), SI(8), SI(2), 255, 100, 70); fill_rect(LX(13,12)-SI(1), LY(13,12)-SI(1), SI(8), SI(3), 255, 100, 70);
disc(LX(21,7), LY(21,7), SI(2), 255, 120, 80); /* nose cones */
disc(LX(21,13), LY(21,13), SI(2), 255, 140, 90);
disc(LX(9,23), LY(9,23), SI(5), ok, og, ob);
disc(LX(21,23), LY(21,23), SI(5), ok, og, ob);
disc(LX(9,23), LY(9,23), SI(4), mr, mg, mb); disc(LX(9,23), LY(9,23), SI(4), mr, mg, mb);
disc(LX(21,23), LY(21,23), SI(4), mr, mg, mb); disc(LX(21,23), LY(21,23), SI(4), mr, mg, mb);
disc(LX(9,23), LY(9,23), SI(2), 90, 85, 75);
disc(LX(21,23), LY(21,23), SI(2), 90, 85, 75);
tyre_mark(LX(9,23), LY(9,23), SI(4), ph, 1); tyre_mark(LX(9,23), LY(9,23), SI(4), ph, 1);
tyre_mark(LX(21,23), LY(21,23), SI(4), ph, 1); tyre_mark(LX(21,23), LY(21,23), SI(4), ph, 1);
line(sx, sy, LX(28,6), LY(28,6), 255, 80, 60); line(sx, sy, LX(28,5), LY(28,5), 255, 80, 60);
line(sx, sy, LX(28,6), LY(28,6), 255, 100, 70);
disc(LX(28,6), LY(28,6), SI(2), 255, 140, 90);
break; break;
case UT_MEDIC: case UT_MEDIC:
/* white van + thick red cross + hubbed wheels + light bar */
fill_rect(sx-SI(10), sy-SI(5), SI(20), SI(15), ok, og, ob); fill_rect(sx-SI(10), sy-SI(5), SI(20), SI(15), ok, og, ob);
fill_rect(sx-SI(8), sy-SI(3), SI(16), SI(11), 245, 245, 245); fill_rect(sx-SI(8), sy-SI(3), SI(16), SI(11), 245, 245, 245);
fill_rect(LX(7,10)-SI(1), LY(7,10)-SI(1), SI(6), SI(4), 200, 220, 240); /* cab glass */ fill_rect(LX(7,10)-SI(1), LY(7,10)-SI(1), SI(6), SI(4), 200, 220, 240);
fill_rect(LX(12,6)-SI(2), LY(12,6)-1, SI(8), SI(2), 240, 50, 50); /* light bar */
disc(LX(10,24), LY(10,24), SI(5), ok, og, ob);
disc(LX(20,24), LY(20,24), SI(5), ok, og, ob);
disc(LX(10,24), LY(10,24), SI(4), mr, mg, mb); disc(LX(10,24), LY(10,24), SI(4), mr, mg, mb);
disc(LX(20,24), LY(20,24), SI(4), mr, mg, mb); disc(LX(20,24), LY(20,24), SI(4), mr, mg, mb);
disc(LX(10,24), LY(10,24), SI(2), 90, 85, 75);
disc(LX(20,24), LY(20,24), SI(2), 90, 85, 75);
tyre_mark(LX(10,24), LY(10,24), SI(4), ph, 1); tyre_mark(LX(10,24), LY(10,24), SI(4), ph, 1);
tyre_mark(LX(20,24), LY(20,24), SI(4), ph, 1); tyre_mark(LX(20,24), LY(20,24), SI(4), ph, 1);
disc(LX(15,9), LY(15,9), SI(5), 240, 50, 50); disc(LX(15,9), LY(15,9), SI(6), 240, 50, 50);
fill_rect(LX(14,6)-1, LY(14,6)-SI(4), SI(3), SI(8), 255, 255, 255); fill_rect(LX(14,5)-1, LY(14,5)-SI(4), SI(3), SI(9), 255, 255, 255);
fill_rect(LX(11,8)-SI(4), LY(11,8)-1, SI(8), SI(3), 255, 255, 255); fill_rect(LX(11,8)-SI(4), LY(11,8)-1, SI(9), SI(3), 255, 255, 255);
break; break;
default: default:
disc(sx, sy, SI(10), ok, og, ob); disc(sx, sy, SI(10), ok, og, ob);

View file

@ -84,164 +84,253 @@ SDL_Texture *sprites_make_unit(SDL_Renderer *r, UnitType t, Faction f) {
switch (t) { switch (t) {
case UT_INFANTRY: case UT_INFANTRY:
/* legs → torso → helmet → rifle */ /* legs → torso → pack → helmet/visor → thick rifle (parity snapshot) */
disc(s, 11, 23, 3, ok, og, ob, 255); disc(s, 11, 23, 3, ok, og, ob, 255);
disc(s, 19, 23, 3, ok, og, ob, 255); disc(s, 19, 23, 3, ok, og, ob, 255);
disc(s, 11, 23, 2, base.r, base.g, base.b, 255); disc(s, 11, 23, 2, base.r, base.g, base.b, 255);
disc(s, 19, 23, 2, base.r, base.g, base.b, 255); disc(s, 19, 23, 2, base.r, base.g, base.b, 255);
disc(s, 15, 15, 8, ok, og, ob, 255); disc(s, 15, 15, 9, ok, og, ob, 255);
disc(s, 15, 15, 6, base.r, base.g, base.b, 255); disc(s, 15, 15, 7, base.r, base.g, base.b, 255);
disc(s, 15, 9, 4, ok, og, ob, 255); disc(s, 10, 16, 3, ok, og, ob, 255); /* backpack */
disc(s, 15, 9, 3, lite.r, lite.g, lite.b, 255); disc(s, 10, 16, 2, 50, 46, 40, 255);
line(s, 16, 14, 16, 1, 40, 36, 30, 255); disc(s, 15, 8, 5, ok, og, ob, 255);
line(s, 17, 14, 17, 2, 55, 50, 40, 255); disc(s, 15, 8, 4, lite.r, lite.g, lite.b, 255);
fill_rect(s, 12, 7, 5, 2, 30, 40, 50, 255); /* visor */
line(s, 16, 14, 16, 0, 40, 36, 30, 255);
line(s, 17, 14, 17, 1, 55, 50, 40, 255);
line(s, 18, 14, 18, 2, 45, 40, 34, 255);
disc(s, 17, 1, 2, 60, 55, 45, 255); /* muzzle tip */
break; break;
case UT_BUGGY: case UT_BUGGY:
/* cabin + windshield + chassis + wheels */ /* cabin + windshield + hubbed wheels + thick MG */
fill_rect(s, 3, 7, 24, 16, ok, og, ob, 255); fill_rect(s, 3, 7, 24, 16, ok, og, ob, 255);
fill_rect(s, 5, 9, 20, 12, base.r, base.g, base.b, 255); fill_rect(s, 5, 9, 20, 12, base.r, base.g, base.b, 255);
fill_rect(s, 6, 9, 10, 6, lite.r, lite.g, lite.b, 255); /* cabin */ fill_rect(s, 6, 9, 10, 6, lite.r, lite.g, lite.b, 255);
fill_rect(s, 7, 8, 8, 3, 35, 55, 75, 255); /* windshield */ fill_rect(s, 7, 8, 8, 3, 35, 55, 75, 255);
disc(s, 8, 7, 5, ok, og, ob, 255);
disc(s, 22, 7, 5, ok, og, ob, 255);
disc(s, 8, 23, 5, ok, og, ob, 255);
disc(s, 22, 23, 5, ok, og, ob, 255);
disc(s, 8, 7, 4, tr, tg, tb, 255); disc(s, 8, 7, 4, tr, tg, tb, 255);
disc(s, 22, 7, 4, tr, tg, tb, 255); disc(s, 22, 7, 4, tr, tg, tb, 255);
disc(s, 8, 23, 4, tr, tg, tb, 255); disc(s, 8, 23, 4, tr, tg, tb, 255);
disc(s, 22, 23, 4, tr, tg, tb, 255); disc(s, 22, 23, 4, tr, tg, tb, 255);
line(s, 15, 15, 29, 15, 40, 36, 30, 255); disc(s, 8, 7, 2, 90, 85, 75, 255); /* hub */
disc(s, 22, 7, 2, 90, 85, 75, 255);
disc(s, 8, 23, 2, 90, 85, 75, 255);
disc(s, 22, 23, 2, 90, 85, 75, 255);
line(s, 15, 14, 29, 14, 40, 36, 30, 255);
line(s, 15, 15, 29, 15, 50, 45, 35, 255);
line(s, 15, 16, 29, 16, 40, 36, 30, 255);
disc(s, 29, 15, 2, 60, 55, 45, 255);
break; break;
case UT_TANK: case UT_TANK:
/* side tracks + hull + cupola + thick barrel */ /* tracks + sprockets + cupola + thick barrel */
fill_rect(s, 2, 8, 5, 12, ok, og, ob, 255); fill_rect(s, 2, 8, 5, 12, ok, og, ob, 255);
fill_rect(s, 23, 8, 5, 12, ok, og, ob, 255); fill_rect(s, 23, 8, 5, 12, ok, og, ob, 255);
fill_rect(s, 3, 10, 3, 10, tr, tg, tb, 255); fill_rect(s, 3, 10, 3, 10, tr, tg, tb, 255);
fill_rect(s, 24, 10, 3, 10, tr, tg, tb, 255); fill_rect(s, 24, 10, 3, 10, tr, tg, tb, 255);
disc(s, 5, 11, 2, 40, 38, 32, 255); /* sprocket */
disc(s, 5, 20, 2, 40, 38, 32, 255);
disc(s, 26, 11, 2, 40, 38, 32, 255);
disc(s, 26, 20, 2, 40, 38, 32, 255);
fill_rect(s, 4, 10, 22, 10, ok, og, ob, 255); fill_rect(s, 4, 10, 22, 10, ok, og, ob, 255);
fill_rect(s, 6, 11, 18, 8, base.r, base.g, base.b, 255); fill_rect(s, 6, 11, 18, 8, base.r, base.g, base.b, 255);
disc(s, 15, 15, 6, ok, og, ob, 255); disc(s, 15, 15, 7, ok, og, ob, 255);
disc(s, 15, 15, 5, lite.r, lite.g, lite.b, 255); /* cupola */ disc(s, 15, 15, 6, lite.r, lite.g, lite.b, 255);
disc(s, 15, 12, 2, 40, 38, 32, 255); /* hatch */ disc(s, 15, 12, 2, 40, 38, 32, 255);
line(s, 15, 13, 29, 13, 45, 40, 32, 255);
line(s, 15, 14, 29, 14, 50, 45, 35, 255); line(s, 15, 14, 29, 14, 50, 45, 35, 255);
line(s, 15, 15, 29, 15, 50, 45, 35, 255); line(s, 15, 15, 29, 15, 55, 50, 40, 255);
line(s, 15, 16, 28, 16, 50, 45, 35, 255); line(s, 15, 16, 29, 16, 50, 45, 35, 255);
line(s, 15, 17, 28, 17, 45, 40, 32, 255);
disc(s, 29, 15, 2, 60, 55, 45, 255);
disc(s, 8, 23, 4, tr, tg, tb, 255); disc(s, 8, 23, 4, tr, tg, tb, 255);
disc(s, 22, 23, 4, tr, tg, tb, 255); disc(s, 22, 23, 4, tr, tg, tb, 255);
break; break;
case UT_ARTILLERY: case UT_ARTILLERY:
/* chassis + long barrel tube + muzzle */ /* chassis + thick barrel + muzzle brake */
fill_rect(s, 2, 10, 26, 12, ok, og, ob, 255); fill_rect(s, 2, 10, 26, 12, ok, og, ob, 255);
fill_rect(s, 4, 12, 22, 8, base.r, base.g, base.b, 255); fill_rect(s, 4, 12, 22, 8, base.r, base.g, base.b, 255);
disc(s, 15, 15, 5, ok, og, ob, 255); disc(s, 15, 15, 6, ok, og, ob, 255);
disc(s, 15, 15, 4, lite.r, lite.g, lite.b, 255); disc(s, 15, 15, 5, lite.r, lite.g, lite.b, 255);
line(s, 15, 13, 4, 2, 45, 40, 32, 255);
line(s, 15, 14, 4, 3, 50, 45, 35, 255); line(s, 15, 14, 4, 3, 50, 45, 35, 255);
line(s, 15, 15, 3, 2, 55, 50, 40, 255); line(s, 15, 15, 3, 2, 55, 50, 40, 255);
line(s, 15, 16, 4, 4, 50, 45, 35, 255); line(s, 15, 16, 4, 4, 50, 45, 35, 255);
disc(s, 4, 3, 2, 60, 55, 45, 255); /* muzzle */ line(s, 15, 17, 5, 5, 45, 40, 32, 255);
disc(s, 8, 23, 3, tr, tg, tb, 255); disc(s, 4, 3, 3, 60, 55, 45, 255);
disc(s, 22, 23, 3, tr, tg, tb, 255); disc(s, 4, 3, 1, 30, 28, 24, 255);
disc(s, 8, 23, 4, tr, tg, tb, 255);
disc(s, 22, 23, 4, tr, tg, tb, 255);
break; break;
case UT_HARVESTER: case UT_HARVESTER:
/* cabin + mid-loaded cargo bed (static atlas; no live Unit) */ /* cabin + scoop + mid cargo + hubbed wheels */
fill_rect(s, 1, 6, 28, 18, ok, og, ob, 255); fill_rect(s, 1, 6, 28, 18, ok, og, ob, 255);
fill_rect(s, 3, 8, 24, 14, base.r, base.g, base.b, 255); fill_rect(s, 3, 8, 24, 14, base.r, base.g, base.b, 255);
fill_rect(s, 3, 8, 8, 8, lite.r, lite.g, lite.b, 255); /* cabin */ fill_rect(s, 3, 8, 8, 8, lite.r, lite.g, lite.b, 255);
fill_rect(s, 4, 8, 6, 3, 35, 55, 75, 255); /* cabin glass */ fill_rect(s, 4, 8, 6, 3, 35, 55, 75, 255);
fill_rect(s, 11, 10, 14, 10, 55, 48, 32, 255); /* empty bed */ fill_rect(s, 1, 13, 4, 5, 90, 80, 55, 255); /* scoop */
fill_rect(s, 11, 10, 8, 10, 200, 170, 90, 255); /* ~half cargo gold */ fill_rect(s, 11, 10, 14, 10, 55, 48, 32, 255);
fill_rect(s, 11, 10, 8, 10, 200, 170, 90, 255);
line(s, 14, 10, 19, 10, 160, 130, 70, 255); line(s, 14, 10, 19, 10, 160, 130, 70, 255);
line(s, 14, 13, 19, 13, 160, 130, 70, 255); line(s, 14, 13, 19, 13, 160, 130, 70, 255);
line(s, 14, 16, 19, 16, 160, 130, 70, 255); line(s, 14, 16, 19, 16, 160, 130, 70, 255);
disc(s, 8, 23, 5, ok, og, ob, 255);
disc(s, 22, 23, 5, ok, og, ob, 255);
disc(s, 8, 23, 4, tr, tg, tb, 255); disc(s, 8, 23, 4, tr, tg, tb, 255);
disc(s, 22, 23, 4, tr, tg, tb, 255); disc(s, 22, 23, 4, tr, tg, tb, 255);
disc(s, 8, 23, 2, 90, 85, 75, 255);
disc(s, 22, 23, 2, 90, 85, 75, 255);
line(s, 5, 7, 5, 2, lite.r, lite.g, lite.b, 255); line(s, 5, 7, 5, 2, lite.r, lite.g, lite.b, 255);
line(s, 6, 7, 6, 3, 50, 46, 40, 255);
break; break;
case UT_JEEP: case UT_JEEP:
/* open cabin + roll bar + MG */ /* thick roll cage + hubbed wheels + twin MG */
fill_rect(s, 4, 9, 22, 12, ok, og, ob, 255); fill_rect(s, 4, 9, 22, 12, ok, og, ob, 255);
fill_rect(s, 6, 11, 18, 8, base.r, base.g, base.b, 255); fill_rect(s, 6, 11, 18, 8, base.r, base.g, base.b, 255);
fill_rect(s, 7, 10, 8, 5, lite.r, lite.g, lite.b, 255); fill_rect(s, 7, 10, 8, 5, lite.r, lite.g, lite.b, 255);
disc(s, 9, 22, 5, ok, og, ob, 255);
disc(s, 21, 22, 5, ok, og, ob, 255);
disc(s, 9, 22, 4, tr, tg, tb, 255); disc(s, 9, 22, 4, tr, tg, tb, 255);
disc(s, 21, 22, 4, tr, tg, tb, 255); disc(s, 21, 22, 4, tr, tg, tb, 255);
disc(s, 9, 22, 2, 90, 85, 75, 255);
disc(s, 21, 22, 2, 90, 85, 75, 255);
line(s, 11, 11, 11, 3, lite.r, lite.g, lite.b, 255); line(s, 11, 11, 11, 3, lite.r, lite.g, lite.b, 255);
line(s, 12, 11, 12, 3, 50, 46, 40, 255);
line(s, 19, 11, 19, 3, lite.r, lite.g, lite.b, 255); line(s, 19, 11, 19, 3, lite.r, lite.g, lite.b, 255);
line(s, 18, 11, 18, 3, 50, 46, 40, 255);
line(s, 11, 3, 19, 3, lite.r, lite.g, lite.b, 255); line(s, 11, 3, 19, 3, lite.r, lite.g, lite.b, 255);
line(s, 11, 4, 19, 4, 50, 46, 40, 255);
line(s, 15, 14, 28, 14, 40, 36, 30, 255);
line(s, 15, 15, 28, 15, 50, 45, 35, 255); line(s, 15, 15, 28, 15, 50, 45, 35, 255);
line(s, 15, 16, 28, 16, 40, 36, 30, 255);
disc(s, 28, 15, 2, 60, 55, 45, 255);
break; break;
case UT_MUTANT: case UT_MUTANT:
/* hunched body + spikes + claws */ /* brow + thick spikes + claw tip */
disc(s, 15, 17, 10, ok, og, ob, 255); disc(s, 15, 17, 11, ok, og, ob, 255);
disc(s, 15, 15, 8, base.r, base.g, base.b, 255); disc(s, 15, 15, 9, base.r, base.g, base.b, 255);
disc(s, 15, 9, 4, ok, og, ob, 255); disc(s, 15, 9, 5, ok, og, ob, 255);
disc(s, 15, 9, 3, lite.r, lite.g, lite.b, 255); disc(s, 15, 9, 4, lite.r, lite.g, lite.b, 255);
line(s, 12, 6, 10, 1, 40, 36, 30, 255); /* back spike */ fill_rect(s, 11, 7, 7, 2, 30, 40, 50, 255); /* brow */
line(s, 12, 6, 9, 0, 40, 36, 30, 255);
line(s, 13, 6, 10, 1, 55, 50, 40, 255);
line(s, 15, 5, 15, 0, 40, 36, 30, 255); line(s, 15, 5, 15, 0, 40, 36, 30, 255);
line(s, 18, 6, 20, 1, 40, 36, 30, 255); line(s, 16, 5, 16, 0, 55, 50, 40, 255);
line(s, 15, 16, 26, 8, 40, 36, 30, 255); /* claw arm */ line(s, 18, 6, 21, 0, 40, 36, 30, 255);
line(s, 24, 9, 28, 6, 55, 50, 40, 255); line(s, 17, 6, 20, 1, 55, 50, 40, 255);
line(s, 24, 9, 28, 11, 55, 50, 40, 255); line(s, 15, 16, 26, 8, 40, 36, 30, 255);
disc(s, 10, 22, 3, ok, og, ob, 255); line(s, 15, 17, 26, 9, 50, 45, 35, 255);
disc(s, 20, 22, 3, ok, og, ob, 255); line(s, 24, 9, 29, 5, 55, 50, 40, 255);
disc(s, 10, 22, 2, base.r, base.g, base.b, 255); line(s, 24, 9, 29, 11, 55, 50, 40, 255);
disc(s, 20, 22, 2, base.r, base.g, base.b, 255); line(s, 24, 10, 28, 8, 70, 60, 45, 255);
disc(s, 28, 8, 2, 70, 60, 45, 255);
disc(s, 10, 22, 4, ok, og, ob, 255);
disc(s, 20, 22, 4, ok, og, ob, 255);
disc(s, 10, 22, 3, base.r, base.g, base.b, 255);
disc(s, 20, 22, 3, base.r, base.g, base.b, 255);
break; break;
case UT_BEAST: case UT_BEAST:
/* chunky body + snout + multi-wheel */ /* carapace ridge + tusks + hubbed multi-wheel */
fill_rect(s, 5, 9, 20, 12, ok, og, ob, 255); fill_rect(s, 5, 9, 20, 12, ok, og, ob, 255);
fill_rect(s, 7, 11, 16, 8, base.r, base.g, base.b, 255); fill_rect(s, 7, 11, 16, 8, base.r, base.g, base.b, 255);
fill_rect(s, 9, 10, 12, 3, lite.r, lite.g, lite.b, 255);
disc(s, 9, 21, 4, ok, og, ob, 255);
disc(s, 14, 22, 4, ok, og, ob, 255);
disc(s, 19, 21, 4, ok, og, ob, 255);
disc(s, 23, 22, 4, ok, og, ob, 255);
disc(s, 9, 21, 3, tr, tg, tb, 255); disc(s, 9, 21, 3, tr, tg, tb, 255);
disc(s, 14, 22, 3, tr, tg, tb, 255); disc(s, 14, 22, 3, tr, tg, tb, 255);
disc(s, 19, 21, 3, tr, tg, tb, 255); disc(s, 19, 21, 3, tr, tg, tb, 255);
disc(s, 23, 22, 3, tr, tg, tb, 255); disc(s, 23, 22, 3, tr, tg, tb, 255);
disc(s, 24, 12, 5, ok, og, ob, 255); disc(s, 24, 12, 6, ok, og, ob, 255);
disc(s, 24, 12, 4, lite.r, lite.g, lite.b, 255); /* snout */ disc(s, 24, 12, 5, lite.r, lite.g, lite.b, 255);
line(s, 26, 12, 29, 12, 40, 36, 30, 255); line(s, 26, 10, 29, 8, 40, 36, 30, 255);
line(s, 26, 14, 29, 16, 40, 36, 30, 255);
line(s, 26, 12, 29, 12, 55, 50, 40, 255);
disc(s, 29, 12, 2, 60, 55, 45, 255);
break; break;
case UT_RAVAGER: case UT_RAVAGER:
/* heavy hull + side skirts + big barrel */ /* skirts + sprockets + hatch + thick multi-barrel */
fill_rect(s, 0, 7, 5, 14, ok, og, ob, 255); fill_rect(s, 0, 7, 5, 14, ok, og, ob, 255);
fill_rect(s, 25, 7, 5, 14, ok, og, ob, 255); fill_rect(s, 25, 7, 5, 14, ok, og, ob, 255);
fill_rect(s, 1, 10, 3, 10, tr, tg, tb, 255);
fill_rect(s, 26, 10, 3, 10, tr, tg, tb, 255);
disc(s, 3, 12, 2, 40, 38, 32, 255);
disc(s, 3, 20, 2, 40, 38, 32, 255);
disc(s, 28, 12, 2, 40, 38, 32, 255);
disc(s, 28, 20, 2, 40, 38, 32, 255);
fill_rect(s, 2, 9, 26, 12, ok, og, ob, 255); fill_rect(s, 2, 9, 26, 12, ok, og, ob, 255);
fill_rect(s, 4, 10, 22, 10, base.r, base.g, base.b, 255); fill_rect(s, 4, 10, 22, 10, base.r, base.g, base.b, 255);
disc(s, 15, 15, 7, ok, og, ob, 255); disc(s, 15, 15, 8, ok, og, ob, 255);
disc(s, 15, 15, 6, lite.r, lite.g, lite.b, 255); disc(s, 15, 15, 7, lite.r, lite.g, lite.b, 255);
disc(s, 15, 12, 2, 40, 38, 32, 255);
line(s, 15, 13, 29, 13, 45, 40, 32, 255);
line(s, 15, 14, 29, 14, 50, 45, 35, 255); line(s, 15, 14, 29, 14, 50, 45, 35, 255);
line(s, 15, 15, 29, 15, 50, 45, 35, 255); line(s, 15, 15, 29, 15, 55, 50, 40, 255);
line(s, 15, 16, 28, 16, 50, 45, 35, 255); line(s, 15, 16, 29, 16, 50, 45, 35, 255);
line(s, 15, 17, 28, 17, 45, 40, 32, 255);
disc(s, 29, 15, 2, 60, 55, 45, 255);
disc(s, 7, 23, 5, ok, og, ob, 255);
disc(s, 23, 23, 5, ok, og, ob, 255);
disc(s, 7, 23, 4, tr, tg, tb, 255); disc(s, 7, 23, 4, tr, tg, tb, 255);
disc(s, 23, 23, 4, tr, tg, tb, 255); disc(s, 23, 23, 4, tr, tg, tb, 255);
break; break;
case UT_FLAME: case UT_FLAME:
/* backpack fuel tank + nozzle + body */ /* visor + valves + thick nozzle jet */
fill_rect(s, 7, 12, 16, 12, ok, og, ob, 255); fill_rect(s, 7, 12, 16, 12, ok, og, ob, 255);
fill_rect(s, 9, 14, 12, 9, base.r, base.g, base.b, 255); fill_rect(s, 9, 14, 12, 9, base.r, base.g, base.b, 255);
disc(s, 15, 9, 4, ok, og, ob, 255); disc(s, 15, 9, 5, ok, og, ob, 255);
disc(s, 15, 9, 3, lite.r, lite.g, lite.b, 255); disc(s, 15, 9, 4, lite.r, lite.g, lite.b, 255);
disc(s, 8, 14, 5, ok, og, ob, 255); /* fuel tank */ fill_rect(s, 12, 8, 5, 2, 30, 40, 50, 255);
disc(s, 8, 14, 4, 90, 70, 40, 255); disc(s, 8, 14, 6, ok, og, ob, 255);
disc(s, 8, 14, 2, 200, 120, 40, 255); disc(s, 8, 14, 5, 90, 70, 40, 255);
disc(s, 8, 14, 3, 200, 120, 40, 255);
disc(s, 8, 12, 1, 60, 55, 45, 255);
disc(s, 8, 16, 1, 60, 55, 45, 255);
line(s, 18, 14, 28, 19, 255, 120, 40, 255);
line(s, 18, 15, 28, 20, 255, 150, 50, 255); line(s, 18, 15, 28, 20, 255, 150, 50, 255);
line(s, 18, 16, 27, 21, 255, 180, 60, 255); line(s, 18, 16, 27, 21, 255, 180, 60, 255);
disc(s, 28, 20, 2, 255, 200, 80, 255); line(s, 18, 17, 26, 21, 255, 200, 80, 255);
disc(s, 28, 20, 3, 255, 200, 80, 255);
disc(s, 28, 20, 1, 255, 240, 160, 255);
break; break;
case UT_MISSILE: case UT_MISSILE:
/* launcher rails + tubes on wheeled chassis */ /* dual pods + nose cones + hubbed chassis */
fill_rect(s, 4, 11, 22, 14, ok, og, ob, 255); fill_rect(s, 4, 11, 22, 14, ok, og, ob, 255);
fill_rect(s, 6, 13, 18, 10, base.r, base.g, base.b, 255); fill_rect(s, 6, 13, 18, 10, base.r, base.g, base.b, 255);
fill_rect(s, 11, 6, 10, 4, ok, og, ob, 255); fill_rect(s, 11, 5, 10, 5, ok, og, ob, 255);
fill_rect(s, 12, 6, 8, 2, 255, 80, 60, 255); fill_rect(s, 12, 5, 8, 3, 255, 80, 60, 255);
fill_rect(s, 11, 11, 10, 4, ok, og, ob, 255); fill_rect(s, 11, 11, 10, 5, ok, og, ob, 255);
fill_rect(s, 12, 11, 8, 2, 255, 100, 70, 255); fill_rect(s, 12, 11, 8, 3, 255, 100, 70, 255);
disc(s, 21, 7, 2, 255, 120, 80, 255);
disc(s, 21, 13, 2, 255, 140, 90, 255);
disc(s, 9, 23, 5, ok, og, ob, 255);
disc(s, 21, 23, 5, ok, og, ob, 255);
disc(s, 9, 23, 4, tr, tg, tb, 255); disc(s, 9, 23, 4, tr, tg, tb, 255);
disc(s, 21, 23, 4, tr, tg, tb, 255); disc(s, 21, 23, 4, tr, tg, tb, 255);
line(s, 15, 15, 28, 6, 255, 80, 60, 255); disc(s, 9, 23, 2, 90, 85, 75, 255);
disc(s, 21, 23, 2, 90, 85, 75, 255);
line(s, 15, 15, 28, 5, 255, 80, 60, 255);
line(s, 15, 15, 28, 6, 255, 100, 70, 255);
disc(s, 28, 6, 2, 255, 140, 90, 255);
break; break;
case UT_MEDIC: case UT_MEDIC:
/* white van + light bar + larger cross + hubs */
fill_rect(s, 5, 10, 20, 15, ok, og, ob, 255); fill_rect(s, 5, 10, 20, 15, ok, og, ob, 255);
fill_rect(s, 7, 12, 16, 11, 245, 245, 245, 255); /* white ambulance */ fill_rect(s, 7, 12, 16, 11, 245, 245, 245, 255);
fill_rect(s, 6, 9, 6, 4, 200, 220, 240, 255); /* cab glass */ 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, 10, 24, 4, tr, tg, tb, 255);
disc(s, 20, 24, 4, tr, tg, tb, 255); disc(s, 20, 24, 4, tr, tg, tb, 255);
disc(s, 15, 9, 5, 240, 50, 50, 255); /* red cross */ disc(s, 10, 24, 2, 90, 85, 75, 255);
fill_rect(s, 14, 5, 3, 8, 255, 255, 255, 255); disc(s, 20, 24, 2, 90, 85, 75, 255);
fill_rect(s, 11, 8, 8, 3, 255, 255, 255, 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);
break; break;
default: default:
disc(s, 15, 15, 10, ok, og, ob, 255); disc(s, 15, 15, 10, ok, og, ob, 255);