engine-c: clearer ARTILLERY/MISSILE/FLAME/RAVAGER silhouettes

This commit is contained in:
local-model/engine-L2-grok-4.5 2026-09-19 18:08:54 +02:00
parent cd384fb457
commit 050dffb685
No known key found for this signature in database
2 changed files with 160 additions and 96 deletions

View file

@ -217,18 +217,28 @@ static void draw_unit(Unit *u, int sx, int sy) {
tyre_mark(LX(22,23), LY(22,23), SI(4), ph, 0);
break;
case UT_ARTILLERY:
/* 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(11), sy-SI(3), SI(22), SI(8), br, bg, bb);
disc(sx, sy, SI(6), ok, og, ob);
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,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,17), LY(15,17), LX(5,5), LY(5,5), 45, 40, 32);
disc(LX(4,3), LY(4,3), SI(3), 60, 55, 45); /* muzzle */
disc(LX(4,3), LY(4,3), SI(1), 30, 28, 24);
/* howitzer: outriggers + shield + ammo rack + elevated tube + brake */
fill_rect(LX(1,18)-SI(1), LY(1,18)-1, SI(8), SI(3), ok, og, ob);
fill_rect(LX(21,18)-SI(1), LY(21,18)-1, SI(8), SI(3), ok, og, ob);
fill_rect(LX(0,19)-SI(1), LY(0,19)-1, SI(4), SI(2), 40, 38, 32);
fill_rect(LX(26,19)-SI(1), LY(26,19)-1, SI(4), SI(2), 40, 38, 32);
fill_rect(sx-SI(11), sy-SI(4), SI(22), SI(10), ok, og, ob);
fill_rect(sx-SI(9), sy-SI(2), SI(18), SI(7), br, bg, bb);
fill_rect(LX(22,12)-SI(1), LY(22,12)-SI(2), SI(6), SI(8), 55, 50, 40);
line(LX(23,13), LY(23,13), LX(27,13), LY(27,13), 90, 80, 55);
line(LX(23,15), LY(23,15), LX(27,15), LY(27,15), 90, 80, 55);
line(LX(23,17), LY(23,17), LX(27,17), LY(27,17), 90, 80, 55);
fill_rect(LX(10,8)-SI(1), LY(10,8)-SI(1), SI(10), SI(5), ok, og, ob);
fill_rect(LX(11,9)-SI(1), LY(11,9)-1, SI(8), SI(3), lr, lg, lb);
disc(sx, sy-SI(1), SI(4), ok, og, ob);
disc(sx, sy-SI(1), SI(3), lr, lg, lb);
line(LX(15,11), LY(15,11), LX(3,1), LY(3,1), 45, 40, 32);
line(LX(15,12), LY(15,12), LX(3,2), LY(3,2), 50, 45, 35);
line(LX(15,13), LY(15,13), LX(2,1), LY(2,1), 55, 50, 40);
line(LX(15,14), LY(15,14), LX(3,3), LY(3,3), 50, 45, 35);
line(LX(15,15), LY(15,15), LX(4,4), LY(4,4), 45, 40, 32);
fill_rect(LX(1,0)-SI(1), LY(1,0)-1, SI(5), SI(4), 60, 55, 45);
fill_rect(LX(2,1)-SI(1), LY(2,1)-1, SI(3), SI(2), 30, 28, 24);
disc(LX(8,23), LY(8,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);
@ -341,26 +351,35 @@ static void draw_unit(Unit *u, int sx, int sy) {
disc(LX(29,12), LY(29,12), SI(2), 60, 55, 45);
break;
case UT_RAVAGER:
/* 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(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);
/* prow + ammo boxes + triple gatling + exhaust (vs tank cupola) */
fill_rect(LX(0,7)-SI(1), LY(0,7)-SI(2), SI(5), SI(14), ok, og, ob);
fill_rect(LX(25,7)-SI(1), LY(25,7)-SI(2), SI(5), SI(14), ok, og, ob);
fill_rect(LX(1,10)-SI(1), LY(1,10)-SI(1), SI(3), SI(10), mr, mg, mb);
fill_rect(LX(26,10)-SI(1), LY(26,10)-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(11), sy-SI(5), SI(22), SI(10), br, bg, bb);
disc(sx, sy, SI(8), ok, og, ob);
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,15), LY(15,15), LX(29,15), LY(29,15), 55, 50, 40);
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);
fill_rect(sx-SI(12), sy-SI(6), SI(24), SI(12), ok, og, ob);
fill_rect(sx-SI(10), sy-SI(5), SI(20), SI(10), br, bg, bb);
fill_rect(LX(24,8)-SI(1), LY(24,8)-SI(1), SI(6), SI(6), 55, 48, 38);
line(LX(25,9), LY(25,9), LX(29,11), LY(29,11), 70, 60, 45);
line(LX(25,13), LY(25,13), LX(29,11), LY(29,11), 70, 60, 45);
fill_rect(LX(4,8)-SI(1), LY(4,8)-1, SI(5), SI(4), 70, 55, 35);
fill_rect(LX(5,9)-SI(1), LY(5,9)-1, SI(3), SI(2), 200, 160, 60);
fill_rect(LX(10,8)-SI(1), LY(10,8)-1, SI(5), SI(4), 70, 55, 35);
fill_rect(LX(11,9)-SI(1), LY(11,9)-1, SI(3), SI(2), 200, 160, 60);
fill_rect(LX(12,12)-SI(1), LY(12,12)-SI(1), SI(10), SI(8), ok, og, ob);
fill_rect(LX(13,13)-SI(1), LY(13,13)-SI(1), SI(8), SI(6), lr, lg, lb);
line(LX(20,13), LY(20,13), LX(29,12), LY(29,12), 45, 40, 32);
line(LX(20,15), LY(20,15), LX(29,15), LY(29,15), 55, 50, 40);
line(LX(20,17), LY(20,17), LX(29,18), LY(29,18), 45, 40, 32);
disc(LX(29,12), LY(29,12), SI(1), 60, 55, 45);
disc(LX(29,15), LY(29,15), SI(2), 60, 55, 45);
disc(LX(29,18), LY(29,18), SI(1), 60, 55, 45);
fill_rect(LX(2,14)-SI(1), LY(2,14)-1, SI(3), SI(4), 40, 38, 32);
disc(LX(2,15), LY(2,15), SI(2), 90, 70, 40);
disc(LX(2,17), LY(2,17), SI(1), 200, 100, 40);
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);
@ -369,34 +388,47 @@ static void draw_unit(Unit *u, int sx, int sy) {
tyre_mark(LX(23,23), LY(23,23), SI(4), ph, 0);
break;
case UT_FLAME:
/* fuel pack valves + thick nozzle jet + helmet */
/* dual tanks + hose + heat shield + nozzle jet */
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);
disc(LX(15,9), LY(15,9), SI(5), ok, og, ob);
disc(LX(15,9), LY(15,9), SI(4), lr, lg, lb);
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(6), ok, og, ob); /* fuel tank */
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,16), LY(18,16), LX(27,21), LY(27,21), 255, 180, 60);
line(LX(18,17), LY(18,17), LX(26,21), LY(26,21), 255, 200, 80);
fill_rect(LX(12,8)-SI(1), LY(12,8)-1, SI(5), SI(2), 30, 40, 50);
disc(LX(6,13), LY(6,13), SI(5), ok, og, ob);
disc(LX(6,13), LY(6,13), SI(4), 90, 70, 40);
disc(LX(6,13), LY(6,13), SI(2), 200, 120, 40);
disc(LX(6,19), LY(6,19), SI(5), ok, og, ob);
disc(LX(6,19), LY(6,19), SI(4), 90, 70, 40);
disc(LX(6,19), LY(6,19), SI(2), 200, 120, 40);
disc(LX(6,11), LY(6,11), SI(1), 60, 55, 45);
disc(LX(6,17), LY(6,17), SI(1), 60, 55, 45);
disc(LX(6,21), LY(6,21), SI(1), 60, 55, 45);
line(LX(10,14), LY(10,14), LX(16,16), LY(16,16), 50, 45, 35);
line(LX(10,15), LY(10,15), LX(16,17), LY(16,17), 70, 55, 35);
fill_rect(LX(16,12)-SI(1), LY(16,12)-SI(1), SI(5), SI(8), 55, 50, 40);
fill_rect(LX(17,13)-SI(1), LY(17,13)-SI(1), SI(3), SI(6), 90, 70, 40);
line(LX(20,14), LY(20,14), LX(28,19), LY(28,19), 255, 120, 40);
line(LX(20,15), LY(20,15), LX(28,20), LY(28,20), 255, 150, 50);
line(LX(20,16), LY(20,16), LX(27,21), LY(27,21), 255, 180, 60);
line(LX(20,17), LY(20,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;
case UT_MISSILE:
/* 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(9), sy-SI(2), SI(18), SI(10), br, bg, bb);
fill_rect(LX(12,7)-SI(1), LY(12,7)-SI(2), SI(10), SI(5), ok, og, ob);
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(5), ok, og, ob);
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);
/* MLRS box launcher + rails + warning stripes + hubbed chassis */
fill_rect(sx-SI(12), sy-SI(3), SI(24), SI(12), ok, og, ob);
fill_rect(sx-SI(10), sy-SI(1), SI(20), SI(8), br, bg, bb);
fill_rect(LX(8,4)-SI(1), LY(8,4)-SI(2), SI(16), SI(10), ok, og, ob);
fill_rect(LX(9,5)-SI(1), LY(9,5)-SI(1), SI(14), SI(8), 50, 48, 42);
line(LX(10,6), LY(10,6), LX(22,6), LY(22,6), 90, 85, 70);
line(LX(10,8), LY(10,8), LX(22,8), LY(22,8), 90, 85, 70);
line(LX(10,10), LY(10,10), LX(22,10), LY(22,10), 90, 85, 70);
line(LX(10,12), LY(10,12), LX(22,12), LY(22,12), 90, 85, 70);
fill_rect(LX(9,5)-SI(1), LY(9,5)-SI(1), SI(3), SI(8), 255, 200, 40);
fill_rect(LX(12,5)-SI(1), LY(12,5)-SI(1), SI(2), SI(8), 30, 28, 24);
fill_rect(LX(14,5)-SI(1), LY(14,5)-SI(1), SI(3), SI(8), 255, 200, 40);
disc(LX(23,7), LY(23,7), SI(2), 255, 120, 80);
disc(LX(23,10), LY(23,10), 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);
@ -405,9 +437,9 @@ static void draw_unit(Unit *u, int sx, int sy) {
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(21,23), LY(21,23), SI(4), ph, 1);
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);
line(LX(22,8), LY(22,8), LX(29,4), LY(29,4), 255, 80, 60);
line(LX(22,10), LY(22,10), LX(29,6), LY(29,6), 255, 100, 70);
disc(LX(29,5), LY(29,5), SI(2), 255, 140, 90);
break;
case UT_MEDIC:
/* white van + thick red cross + hubbed wheels + light bar */

View file

@ -149,18 +149,28 @@ SDL_Texture *sprites_make_unit(SDL_Renderer *r, UnitType t, Faction f) {
disc(s, 22, 23, 4, tr, tg, tb, 255);
break;
case UT_ARTILLERY:
/* chassis + thick barrel + muzzle brake */
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);
disc(s, 15, 15, 6, ok, og, ob, 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, 15, 3, 2, 55, 50, 40, 255);
line(s, 15, 16, 4, 4, 50, 45, 35, 255);
line(s, 15, 17, 5, 5, 45, 40, 32, 255);
disc(s, 4, 3, 3, 60, 55, 45, 255);
disc(s, 4, 3, 1, 30, 28, 24, 255);
/* howitzer: outriggers + shield + ammo rack + elevated tube + brake */
fill_rect(s, 1, 18, 8, 3, ok, og, ob, 255); /* left outrigger */
fill_rect(s, 21, 18, 8, 3, ok, og, ob, 255); /* right outrigger */
fill_rect(s, 0, 19, 4, 2, 40, 38, 32, 255);
fill_rect(s, 26, 19, 4, 2, 40, 38, 32, 255);
fill_rect(s, 4, 11, 22, 10, ok, og, ob, 255);
fill_rect(s, 6, 13, 18, 7, base.r, base.g, base.b, 255);
fill_rect(s, 22, 12, 6, 8, 55, 50, 40, 255); /* ammo rack */
line(s, 23, 13, 27, 13, 90, 80, 55, 255);
line(s, 23, 15, 27, 15, 90, 80, 55, 255);
line(s, 23, 17, 27, 17, 90, 80, 55, 255);
fill_rect(s, 10, 8, 10, 5, ok, og, ob, 255); /* gun shield */
fill_rect(s, 11, 9, 8, 3, lite.r, lite.g, lite.b, 255);
disc(s, 15, 14, 4, ok, og, ob, 255);
disc(s, 15, 14, 3, lite.r, lite.g, lite.b, 255);
line(s, 15, 11, 3, 1, 45, 40, 32, 255); /* elevated tube */
line(s, 15, 12, 3, 2, 50, 45, 35, 255);
line(s, 15, 13, 2, 1, 55, 50, 40, 255);
line(s, 15, 14, 3, 3, 50, 45, 35, 255);
line(s, 15, 15, 4, 4, 45, 40, 32, 255);
fill_rect(s, 1, 0, 5, 4, 60, 55, 45, 255); /* muzzle brake */
fill_rect(s, 2, 1, 3, 2, 30, 28, 24, 255);
disc(s, 8, 23, 4, tr, tg, tb, 255);
disc(s, 22, 23, 4, tr, tg, tb, 255);
break;
@ -252,7 +262,7 @@ SDL_Texture *sprites_make_unit(SDL_Renderer *r, UnitType t, Faction f) {
disc(s, 29, 12, 2, 60, 55, 45, 255);
break;
case UT_RAVAGER:
/* skirts + sprockets + hatch + thick multi-barrel */
/* prow + ammo boxes + triple gatling + exhaust (vs tank cupola) */
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, 1, 10, 3, 10, tr, tg, tb, 255);
@ -261,60 +271,82 @@ SDL_Texture *sprites_make_unit(SDL_Renderer *r, UnitType t, Faction f) {
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, 4, 10, 22, 10, base.r, base.g, base.b, 255);
disc(s, 15, 15, 8, ok, og, ob, 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, 15, 29, 15, 55, 50, 40, 255);
line(s, 15, 16, 29, 16, 50, 45, 35, 255);
line(s, 15, 17, 28, 17, 45, 40, 32, 255);
fill_rect(s, 3, 9, 24, 12, ok, og, ob, 255);
fill_rect(s, 5, 10, 20, 10, base.r, base.g, base.b, 255);
fill_rect(s, 24, 8, 6, 6, 55, 48, 38, 255); /* prow plate */
line(s, 25, 9, 29, 11, 70, 60, 45, 255);
line(s, 25, 13, 29, 11, 70, 60, 45, 255);
fill_rect(s, 4, 8, 5, 4, 70, 55, 35, 255); /* ammo boxes */
fill_rect(s, 5, 9, 3, 2, 200, 160, 60, 255);
fill_rect(s, 10, 8, 5, 4, 70, 55, 35, 255);
fill_rect(s, 11, 9, 3, 2, 200, 160, 60, 255);
fill_rect(s, 12, 12, 10, 8, ok, og, ob, 255); /* gatling block */
fill_rect(s, 13, 13, 8, 6, lite.r, lite.g, lite.b, 255);
line(s, 20, 13, 29, 12, 45, 40, 32, 255); /* triple barrels */
line(s, 20, 15, 29, 15, 55, 50, 40, 255);
line(s, 20, 17, 29, 18, 45, 40, 32, 255);
disc(s, 29, 12, 1, 60, 55, 45, 255);
disc(s, 29, 15, 2, 60, 55, 45, 255);
disc(s, 29, 18, 1, 60, 55, 45, 255);
fill_rect(s, 2, 14, 3, 4, 40, 38, 32, 255); /* exhaust */
disc(s, 2, 15, 2, 90, 70, 40, 255);
disc(s, 2, 17, 1, 200, 100, 40, 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, 23, 23, 4, tr, tg, tb, 255);
break;
case UT_FLAME:
/* visor + valves + thick nozzle jet */
/* dual tanks + hose + heat shield + nozzle jet */
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);
disc(s, 15, 9, 5, ok, og, ob, 255);
disc(s, 15, 9, 4, lite.r, lite.g, lite.b, 255);
fill_rect(s, 12, 8, 5, 2, 30, 40, 50, 255);
disc(s, 8, 14, 6, ok, og, ob, 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, 16, 27, 21, 255, 180, 60, 255);
line(s, 18, 17, 26, 21, 255, 200, 80, 255);
fill_rect(s, 12, 8, 5, 2, 30, 40, 50, 255); /* visor */
disc(s, 6, 13, 5, ok, og, ob, 255); /* dual fuel tanks */
disc(s, 6, 13, 4, 90, 70, 40, 255);
disc(s, 6, 13, 2, 200, 120, 40, 255);
disc(s, 6, 19, 5, ok, og, ob, 255);
disc(s, 6, 19, 4, 90, 70, 40, 255);
disc(s, 6, 19, 2, 200, 120, 40, 255);
disc(s, 6, 11, 1, 60, 55, 45, 255);
disc(s, 6, 17, 1, 60, 55, 45, 255);
disc(s, 6, 21, 1, 60, 55, 45, 255);
line(s, 10, 14, 16, 16, 50, 45, 35, 255); /* hose */
line(s, 10, 15, 16, 17, 70, 55, 35, 255);
fill_rect(s, 16, 12, 5, 8, 55, 50, 40, 255); /* heat shield */
fill_rect(s, 17, 13, 3, 6, 90, 70, 40, 255);
line(s, 20, 14, 28, 19, 255, 120, 40, 255);
line(s, 20, 15, 28, 20, 255, 150, 50, 255);
line(s, 20, 16, 27, 21, 255, 180, 60, 255);
line(s, 20, 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;
case UT_MISSILE:
/* dual pods + nose cones + hubbed chassis */
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, 11, 5, 10, 5, ok, og, ob, 255);
fill_rect(s, 12, 5, 8, 3, 255, 80, 60, 255);
fill_rect(s, 11, 11, 10, 5, ok, og, ob, 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);
/* MLRS box launcher + rails + warning stripes + hubbed chassis */
fill_rect(s, 3, 12, 24, 12, ok, og, ob, 255);
fill_rect(s, 5, 14, 20, 8, base.r, base.g, base.b, 255);
fill_rect(s, 8, 4, 16, 10, ok, og, ob, 255); /* box launcher */
fill_rect(s, 9, 5, 14, 8, 50, 48, 42, 255);
line(s, 10, 6, 22, 6, 90, 85, 70, 255); /* rails */
line(s, 10, 8, 22, 8, 90, 85, 70, 255);
line(s, 10, 10, 22, 10, 90, 85, 70, 255);
line(s, 10, 12, 22, 12, 90, 85, 70, 255);
fill_rect(s, 9, 5, 3, 8, 255, 200, 40, 255); /* warning stripes */
fill_rect(s, 12, 5, 2, 8, 30, 28, 24, 255);
fill_rect(s, 14, 5, 3, 8, 255, 200, 40, 255);
disc(s, 23, 7, 2, 255, 120, 80, 255); /* nose tips */
disc(s, 23, 10, 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, 21, 23, 4, tr, tg, tb, 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);
line(s, 22, 8, 29, 4, 255, 80, 60, 255);
line(s, 22, 10, 29, 6, 255, 100, 70, 255);
disc(s, 29, 5, 2, 255, 140, 90, 255);
break;
case UT_MEDIC:
/* white van + light bar + bold red cross + hubs (read at live scale) */