From 7d880ed2fd3694834f4d2a8c540c037b31acca4b Mon Sep 17 00:00:00 2001 From: "local-model/engine-L2-grok-4.5" Date: Sat, 19 Sep 2026 11:31:00 +0200 Subject: [PATCH] engine-c: SDL ground shadows + type-scale + richer bld silhouettes --- engine-c/openkknd | Bin 209912 -> 209912 bytes engine-c/src/render.c | 54 +++++++++++++++++++++++------ engine-c/src/sprites.c | 76 +++++++++++++++++++++++++---------------- 3 files changed, 90 insertions(+), 40 deletions(-) diff --git a/engine-c/openkknd b/engine-c/openkknd index 1848619c5998f224bdd8ff8318d5a3ef3cf850cc..4fa9fdf1a528d618717999267c35ed159591a9c2 100755 GIT binary patch delta 23274 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 Kr@yq|y#7Cv7P~_L delta 19061 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 i++) { Unit *u = &g->units[i]; @@ -166,36 +194,40 @@ void render_units(Game *g) { int tx = (int)(u->x / TILE), ty = (int)(u->y / TILE); if (!map_in_bounds(&g->map, tx, ty) || g->map.fog[ty*g->map.w + tx] != 2) continue; } - /* Match snapshot SHOT_UNIT_SCALE 1.45 → live silhouette ~41px */ - int sz = 41; + int sz = unit_screen_sz(u->type); + int cx = (int)(u->x - g->cam.x), cy = (int)(u->y - g->cam.y); + /* Ground shadow before rotated body so units lift off sand. */ + draw_unit_shadow(g->ren, cx, cy, sz / 4 + 4); SDL_Texture *tex = g->spr.unit[u->type][u->faction]; draw_tex_world(g, tex, u->x, u->y, sz, sz, u->heading, 255); - /* selection ring */ + /* selection ring — larger for heavy chassis */ if (u->selected) { - int cx = (int)(u->x - g->cam.x), cy = (int)(u->y - g->cam.y); + int rad = (u->type == UT_TANK || u->type == UT_BEAST || u->type == UT_RAVAGER) + ? sz / 2 + 4 : sz / 2 + 2; SDL_SetRenderDrawColor(g->ren, 120, 255, 120, 220); for (int a = 0; a < 360; a += 12) { - int px = cx + (int)(cosf(a*3.14159f/180)*22); - int py = cy + (int)(sinf(a*3.14159f/180)*22); + int px = cx + (int)(cosf(a * 3.14159f / 180) * rad); + int py = cy + (int)(sinf(a * 3.14159f / 180) * rad); SDL_RenderDrawPoint(g->ren, px, py); } } /* health bar */ if (u->hp < u->max_hp || u->selected) { - int cx = (int)(u->x - g->cam.x), by = (int)(u->y - g->cam.y) - 26; - int bw = 32; - SDL_Rect bg = { cx - bw/2, by, bw, 4 }; + int by = cy - sz / 2 - 6; + int bw = sz - 8; + if (bw < 24) bw = 24; + SDL_Rect bg = { cx - bw / 2, by, bw, 4 }; SDL_SetRenderDrawColor(g->ren, 50, 50, 50, 255); SDL_RenderFillRect(g->ren, &bg); float f = u->hp / u->max_hp; SDL_Color c = (u->faction == FACTION_SURVIVOR) ? (SDL_Color){55,235,55,255} : (SDL_Color){255,40,255,255}; - SDL_Rect fg = { cx - bw/2, by, (int)(bw * f), 4 }; + SDL_Rect fg = { cx - bw / 2, by, (int)(bw * f), 4 }; SDL_SetRenderDrawColor(g->ren, c.r, c.g, c.b, 255); SDL_RenderFillRect(g->ren, &fg); /* cargo indicator for harvesters */ if (u->type == UT_HARVESTER && u->cargo > 0) { - SDL_Rect cg = { cx - bw/2, by - 4, (int)(bw * u->cargo / 1000), 2 }; + SDL_Rect cg = { cx - bw / 2, by - 4, (int)(bw * u->cargo / 1000), 2 }; SDL_SetRenderDrawColor(g->ren, 230, 190, 70, 255); SDL_RenderFillRect(g->ren, &cg); } diff --git a/engine-c/src/sprites.c b/engine-c/src/sprites.c index f319e9f..5e34c82 100644 --- a/engine-c/src/sprites.c +++ b/engine-c/src/sprites.c @@ -182,65 +182,83 @@ SDL_Texture *sprites_make_unit(SDL_Renderer *r, UnitType t, Faction f) { } /* ---------------- building sprites ---------------- */ +/* Bright concrete pad + BT_* interiors (parity with snapshot draw_bld). */ SDL_Texture *sprites_make_bld(SDL_Renderer *r, BuildingType t, Faction f) { int w = bld_def(t)->w, h = bld_def(t)->h; int W = w * TILE, H = h * TILE; SDL_Surface *s = new_surf(W, H); SDL_Color base = faction_color(f); SDL_Color dark = darken(base, 0.5f); - SDL_Color lite = lighten(base, 0.4f); - /* Bright sand pad + dark ridge outline (arid wasteland plate). */ - SDL_Color wall = { 198, 168, 108, 255 }; - SDL_Color wall2 = { 155, 128, 78, 255 }; - const Uint8 ok = 28, og = 24, ob = 18; + SDL_Color lite = lighten(base, 0.35f); + const Uint8 ok = 22, og = 20, ob = 16; + const Uint8 wall = 205, wall2 = 175; - fill_rect(s, 0, 0, W, H, wall2.r, wall2.g, wall2.b, 255); - fill_rect(s, 2, 2, W - 4, H - 4, ok, og, ob, 255); - fill_rect(s, 4, 4, W - 8, H - 8, wall.r, wall.g, wall.b, 255); - ring(s, W/2, H/2, (W