From b03cd2a0e3e7e00da3c116e81caccf93069f5e03 Mon Sep 17 00:00:00 2001 From: "local-model/engine-L2-grok-4.5" Date: Sat, 19 Sep 2026 11:23:13 +0200 Subject: [PATCH] engine-c: SDL live arid+scale+tracers parity with KKND_SHOT --- engine-c/openkknd | Bin 193400 -> 209912 bytes engine-c/src/config.c | 6 +-- engine-c/src/render.c | 74 +++++++++++++++++++++++---- engine-c/src/sprites.c | 112 +++++++++++++++++++++++------------------ 4 files changed, 129 insertions(+), 63 deletions(-) diff --git a/engine-c/openkknd b/engine-c/openkknd index aeca6233b94167d1f19c3eb1faea4c42d97b4659..1848619c5998f224bdd8ff8318d5a3ef3cf850cc 100755 GIT binary patch delta 36114 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 delta 30230 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 / TILE), ty = (int)(u->y / TILE); if (!map_in_bounds(&g->map, tx, ty) || g->map.fog[ty*g->map.w + tx] != 2) continue; } - int sz = 28; + /* Match snapshot SHOT_UNIT_SCALE 1.45 → live silhouette ~41px */ + int sz = 41; 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 */ @@ -174,21 +175,21 @@ void render_units(Game *g) { int cx = (int)(u->x - g->cam.x), cy = (int)(u->y - g->cam.y); 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)*16); - int py = cy + (int)(sinf(a*3.14159f/180)*16); + int px = cx + (int)(cosf(a*3.14159f/180)*22); + int py = cy + (int)(sinf(a*3.14159f/180)*22); 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) - 18; - int bw = 24; + 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 }; 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){90,200,90,255} - : (SDL_Color){220,110,220,255}; + 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_SetRenderDrawColor(g->ren, c.r, c.g, c.b, 255); SDL_RenderFillRect(g->ren, &fg); @@ -203,9 +204,57 @@ void render_units(Game *g) { } void render_bullets(Game *g) { + /* Kind-aware tracers / shells with streak tails (parity with snapshot.c). */ for (int i = 0; i < g->bullet_count; i++) { Bullet *b = &g->bullets[i]; int sx = (int)(b->x - g->cam.x), sy = (int)(b->y - g->cam.y); + float dx = b->tx - b->x, dy = b->ty - b->y; + float d = sqrtf(dx * dx + dy * dy); + if (d > 1.0f) { + float ux = dx / d, uy = dy / d; + int len = (b->kind == 2) ? 24 : (b->kind == 3) ? 18 + : (b->kind == 1) ? 14 : 10; + for (int t = 1; t <= len; t++) { + int tx = sx - (int)(ux * (float)t * 0.75f); + int ty = sy - (int)(uy * (float)t * 0.75f); + Uint8 fade = (Uint8)(255 - t * 9); + if (b->kind == 2) { + /* laser: cyan→magenta streak */ + SDL_SetRenderDrawColor(g->ren, fade, 80, 255, 220); + SDL_RenderFillRect(g->ren, &(SDL_Rect){ tx - 1, ty - 1, + (t < 3) ? 3 : 2, (t < 3) ? 3 : 2 }); + SDL_SetRenderDrawColor(g->ren, 220, 180, 255, 255); + SDL_RenderDrawPoint(g->ren, tx, ty); + } else if (b->kind == 3) { + SDL_SetRenderDrawColor(g->ren, 255, (Uint8)(120 - t * 4), 30, 230); + SDL_RenderFillRect(g->ren, &(SDL_Rect){ tx - 1, ty - 1, + (t < 4) ? 3 : 2, (t < 4) ? 3 : 2 }); + } else { + SDL_SetRenderDrawColor(g->ren, 255, (Uint8)(200 - t * 8), 50, 220); + SDL_RenderFillRect(g->ren, &(SDL_Rect){ tx, ty, 2, 2 }); + } + } + } + int rad = (b->kind == 1 || b->kind == 3) ? 6 : 4; + SDL_SetRenderDrawColor(g->ren, 255, 160, 40, 255); + SDL_RenderFillRect(g->ren, &(SDL_Rect){ sx - rad - 1, sy - rad - 1, + (rad + 1) * 2, (rad + 1) * 2 }); + SDL_SetRenderDrawColor(g->ren, 255, 240, 140, 255); + SDL_RenderFillRect(g->ren, &(SDL_Rect){ sx - rad, sy - rad, rad * 2, rad * 2 }); + if (b->kind == 2) { + SDL_SetRenderDrawColor(g->ren, 120, 200, 255, 255); + SDL_RenderFillRect(g->ren, &(SDL_Rect){ sx - rad - 1, sy - rad - 1, + (rad + 1) * 2, (rad + 1) * 2 }); + SDL_SetRenderDrawColor(g->ren, 240, 220, 255, 255); + SDL_RenderFillRect(g->ren, &(SDL_Rect){ sx - (rad - 1), sy - (rad - 1), + (rad - 1) * 2, (rad - 1) * 2 }); + } else if (b->kind == 3) { + SDL_SetRenderDrawColor(g->ren, 255, 70, 30, 240); + SDL_RenderFillRect(g->ren, &(SDL_Rect){ sx - 5, sy - 1, 6, 6 }); + SDL_SetRenderDrawColor(g->ren, 255, 200, 80, 240); + SDL_RenderFillRect(g->ren, &(SDL_Rect){ sx, sy - 4, 4, 4 }); + } + /* Keep sprite head as bright core on top of procedural tracer. */ SDL_Texture *tex = g->spr.bullet[b->kind < 4 ? b->kind : 0]; SDL_Rect r = { sx - 5, sy - 5, 10, 10 }; SDL_RenderCopy(g->ren, tex, NULL, &r); @@ -213,13 +262,16 @@ void render_bullets(Game *g) { } void render_particles(Game *g) { + /* Larger combat FX (parity with snapshot particle sizes). */ for (int i = 0; i < g->particle_count; i++) { Particle *p = &g->particles[i]; int sx = (int)(p->x - g->cam.x), sy = (int)(p->y - g->cam.y); - Uint8 a = (Uint8)(255 * (p->life / p->max_life)); + float life_a = p->life / (p->max_life > 0 ? p->max_life : 1.0f); + if (life_a < 0.12f) continue; + Uint8 a = (Uint8)(255 * life_a); SDL_SetRenderDrawColor(g->ren, p->r, p->g, p->b, a); - int sz = (p->kind == 1) ? 3 : 2; - SDL_RenderFillRect(g->ren, &(SDL_Rect){ sx-sz/2, sy-sz/2, sz, sz }); + int sz = (p->kind == 1) ? 5 : (p->kind == 3) ? 3 : (p->kind == 0) ? 4 : 3; + SDL_RenderFillRect(g->ren, &(SDL_Rect){ sx - sz/2, sy - sz/2, sz + 1, sz + 1 }); } } @@ -471,7 +523,7 @@ void render_minimap(Game *g) { case T_WATER: cr=44;cg=78;cb=120; break; case T_ROCK: cr=110;cg=104;cb=98; break; case T_SCRAP: cr=200;cg=170;cb=70; break; - case T_GRASS: cr=86;cg=120;cb=64; break; + case T_GRASS: cr=210;cg=170;cb=78; break; /* arid wasteland */ } if (fv == 1) { cr/=2; cg/=2; cb/=2; } SDL_SetRenderDrawColor(g->ren, cr, cg, cb, 255); diff --git a/engine-c/src/sprites.c b/engine-c/src/sprites.c index f8ae7d4..f319e9f 100644 --- a/engine-c/src/sprites.c +++ b/engine-c/src/sprites.c @@ -69,6 +69,7 @@ static SDL_Color lighten(SDL_Color c, float f) { } /* ---------------- unit sprites ---------------- */ +/* Near-black outline first (KKND2 silhouette), then bright faction fill. */ SDL_Texture *sprites_make_unit(SDL_Renderer *r, UnitType t, Faction f) { int S = 30; SDL_Surface *s = new_surf(S, S); @@ -76,85 +77,93 @@ SDL_Texture *sprites_make_unit(SDL_Renderer *r, UnitType t, Faction f) { SDL_Color dark = darken(base, 0.55f); SDL_Color lite = lighten(base, 0.45f); SDL_Color metal = { 60, 60, 70, 255 }; + const Uint8 ok = 18, og = 16, ob = 14; /* near-black outline */ switch (t) { case UT_INFANTRY: - disc(s, 15, 15, 8, dark.r, dark.g, dark.b, 255); - disc(s, 15, 15, 6, base.r, base.g, base.b, 255); + disc(s, 15, 15, 9, ok, og, ob, 255); + disc(s, 15, 15, 7, base.r, base.g, base.b, 255); disc(s, 15, 12, 3, lite.r, lite.g, lite.b, 255); - line(s, 15, 15, 15, 2, 30, 30, 30, 255); /* rifle */ + line(s, 15, 15, 15, 2, ok, og, ob, 255); /* rifle */ break; case UT_BUGGY: - fill_rect(s, 6, 9, 18, 12, dark.r, dark.g, dark.b, 255); - fill_rect(s, 8, 11, 14, 8, base.r, base.g, base.b, 255); + fill_rect(s, 5, 8, 20, 14, ok, og, ob, 255); + fill_rect(s, 7, 10, 16, 10, base.r, base.g, base.b, 255); disc(s, 10, 8, 3, metal.r, metal.g, metal.b, 255); disc(s, 20, 8, 3, metal.r, metal.g, metal.b, 255); disc(s, 10, 22, 3, metal.r, metal.g, metal.b, 255); disc(s, 20, 22, 3, metal.r, metal.g, metal.b, 255); - line(s, 15, 15, 28, 15, 30, 30, 30, 255); + line(s, 15, 15, 28, 15, ok, og, ob, 255); break; case UT_TANK: - fill_rect(s, 5, 10, 20, 11, dark.r, dark.g, dark.b, 255); - fill_rect(s, 7, 12, 16, 7, base.r, base.g, base.b, 255); + fill_rect(s, 4, 9, 22, 13, ok, og, ob, 255); + fill_rect(s, 6, 11, 18, 9, base.r, base.g, base.b, 255); disc(s, 15, 15, 6, lite.r, lite.g, lite.b, 255); - line(s, 15, 15, 30, 15, 40, 40, 45, 255); - disc(s, 9, 22, 3, 30, 30, 30, 255); - disc(s, 21, 22, 3, 30, 30, 30, 255); + line(s, 15, 15, 30, 15, ok, og, ob, 255); + disc(s, 9, 22, 3, ok, og, ob, 255); + disc(s, 21, 22, 3, ok, og, ob, 255); break; case UT_ARTILLERY: - fill_rect(s, 5, 11, 20, 9, dark.r, dark.g, dark.b, 255); + fill_rect(s, 4, 10, 22, 11, ok, og, ob, 255); + fill_rect(s, 6, 12, 18, 7, base.r, base.g, base.b, 255); disc(s, 15, 15, 5, lite.r, lite.g, lite.b, 255); - line(s, 15, 15, 4, 4, 40, 40, 45, 255); - line(s, 15, 15, 26, 26, 40, 40, 45, 255); + line(s, 15, 15, 4, 4, ok, og, ob, 255); + line(s, 15, 15, 26, 26, ok, og, ob, 255); break; case UT_HARVESTER: - fill_rect(s, 4, 8, 22, 14, dark.r, dark.g, dark.b, 255); - fill_rect(s, 6, 10, 18, 10, 110, 90, 50, 255); /* scrap bed */ - disc(s, 9, 22, 3, 30, 30, 30, 255); - disc(s, 21, 22, 3, 30, 30, 30, 255); + fill_rect(s, 3, 7, 24, 16, ok, og, ob, 255); + fill_rect(s, 5, 9, 20, 12, dark.r, dark.g, dark.b, 255); + fill_rect(s, 6, 10, 18, 10, 180, 150, 70, 255); /* scrap bed */ + disc(s, 9, 22, 3, ok, og, ob, 255); + disc(s, 21, 22, 3, ok, og, ob, 255); line(s, 6, 8, 6, 4, base.r, base.g, base.b, 255); break; case UT_JEEP: - fill_rect(s, 7, 11, 16, 9, dark.r, dark.g, dark.b, 255); + fill_rect(s, 6, 10, 18, 11, ok, og, ob, 255); + fill_rect(s, 8, 12, 14, 7, base.r, base.g, base.b, 255); disc(s, 10, 21, 3, metal.r, metal.g, metal.b, 255); disc(s, 20, 21, 3, metal.r, metal.g, metal.b, 255); line(s, 15, 12, 15, 5, base.r, base.g, base.b, 255); /* roll bar */ - line(s, 15, 15, 27, 15, 40, 40, 45, 255); + line(s, 15, 15, 27, 15, ok, og, ob, 255); break; case UT_MUTANT: - disc(s, 15, 16, 9, dark.r, dark.g, dark.b, 255); - disc(s, 15, 14, 6, base.r, base.g, base.b, 255); + disc(s, 15, 16, 10, ok, og, ob, 255); + disc(s, 15, 14, 7, base.r, base.g, base.b, 255); disc(s, 15, 11, 3, lite.r, lite.g, lite.b, 255); - line(s, 15, 16, 23, 10, 30, 30, 30, 255); /* arm/club */ + line(s, 15, 16, 23, 10, ok, og, ob, 255); /* arm/club */ break; case UT_BEAST: - fill_rect(s, 8, 11, 14, 9, dark.r, dark.g, dark.b, 255); - disc(s, 10, 20, 2, 30, 30, 30, 255); - disc(s, 14, 21, 2, 30, 30, 30, 255); - disc(s, 18, 20, 2, 30, 30, 30, 255); - disc(s, 22, 21, 2, 30, 30, 30, 255); - disc(s, 22, 13, 4, base.r, base.g, base.b, 255); + fill_rect(s, 7, 10, 16, 11, ok, og, ob, 255); + fill_rect(s, 9, 12, 12, 7, base.r, base.g, base.b, 255); + disc(s, 10, 20, 2, ok, og, ob, 255); + disc(s, 14, 21, 2, ok, og, ob, 255); + disc(s, 18, 20, 2, ok, og, ob, 255); + disc(s, 22, 21, 2, ok, og, ob, 255); + disc(s, 22, 13, 4, lite.r, lite.g, lite.b, 255); break; case UT_RAVAGER: - fill_rect(s, 3, 9, 24, 13, dark.r, dark.g, dark.b, 255); - fill_rect(s, 6, 12, 18, 7, base.r, base.g, base.b, 255); + fill_rect(s, 2, 8, 26, 15, ok, og, ob, 255); + fill_rect(s, 5, 11, 20, 9, base.r, base.g, base.b, 255); disc(s, 15, 15, 7, lite.r, lite.g, lite.b, 255); - line(s, 15, 15, 29, 15, 40, 40, 45, 255); /* big barrel */ - disc(s, 8, 22, 3, 30, 30, 30, 255); - disc(s, 22, 22, 3, 30, 30, 30, 255); + line(s, 15, 15, 29, 15, ok, og, ob, 255); /* big barrel */ + disc(s, 8, 22, 3, ok, og, ob, 255); + disc(s, 22, 22, 3, ok, og, ob, 255); break; case UT_FLAME: - fill_rect(s, 8, 12, 14, 12, dark.r, dark.g, dark.b, 255); - disc(s, 15, 11, 4, base.r, base.g, base.b, 255); + fill_rect(s, 7, 11, 16, 14, ok, og, ob, 255); + fill_rect(s, 9, 13, 12, 10, base.r, base.g, base.b, 255); + disc(s, 15, 11, 4, lite.r, lite.g, lite.b, 255); line(s, 15, 15, 27, 19, 220, 120, 40, 255); /* flame nozzle */ break; case UT_MISSILE: - fill_rect(s, 7, 12, 16, 11, dark.r, dark.g, dark.b, 255); + fill_rect(s, 6, 11, 18, 13, ok, og, ob, 255); + fill_rect(s, 8, 13, 14, 9, base.r, base.g, base.b, 255); disc(s, 10, 22, 3, metal.r, metal.g, metal.b, 255); disc(s, 20, 22, 3, metal.r, metal.g, metal.b, 255); line(s, 15, 15, 28, 8, 200, 60, 60, 255); /* launcher */ break; case UT_MEDIC: + fill_rect(s, 7, 10, 16, 14, ok, og, ob, 255); fill_rect(s, 8, 11, 14, 12, 235, 235, 235, 255); /* white ambulance body */ disc(s, 11, 23, 3, metal.r, metal.g, metal.b, 255); disc(s, 19, 23, 3, metal.r, metal.g, metal.b, 255); @@ -163,7 +172,8 @@ SDL_Texture *sprites_make_unit(SDL_Renderer *r, UnitType t, Faction f) { fill_rect(s, 12, 9, 6, 2, 255, 255, 255, 255); break; default: - disc(s, 15, 15, 9, base.r, base.g, base.b, 255); + disc(s, 15, 15, 10, ok, og, ob, 255); + disc(s, 15, 15, 8, base.r, base.g, base.b, 255); break; } SDL_Texture *tex = SDL_CreateTextureFromSurface(r, s); @@ -179,11 +189,14 @@ SDL_Texture *sprites_make_bld(SDL_Renderer *r, BuildingType t, Faction f) { SDL_Color base = faction_color(f); SDL_Color dark = darken(base, 0.5f); SDL_Color lite = lighten(base, 0.4f); - SDL_Color wall = { 90, 84, 78, 255 }; - SDL_Color wall2 = { 64, 60, 56, 255 }; + /* 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; fill_rect(s, 0, 0, W, H, wall2.r, wall2.g, wall2.b, 255); - fill_rect(s, 3, 3, W - 6, H - 6, wall.r, wall.g, wall.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>B, G slightly under R). */ switch (t) { - case T_WASTELAND: tr=120; tg=104; tb=78; break; - case T_RUBBLE: tr=96; tg=86; tb=74; break; - case T_ROAD: tr=70; tg=68; tb=64; break; - case T_GRASS: tr=86; tg=120; tb=64; break; - case T_WATER: tr=44; tg=78; tb=120; break; - case T_ROCK: tr=110; tg=104; tb=98; break; - case T_SCRAP: tr=110; tg=96; tb=70; break; - default: tr=120; tg=104; tb=78; break; + case T_WASTELAND: tr=228; tg=188; tb=98; break; + case T_RUBBLE: tr=168; tg=138; tb=88; break; + case T_ROAD: tr=175; tg=148; tb=98; break; + case T_GRASS: tr=242; tg=198; tb=92; break; /* sunlit desert */ + case T_WATER: tr=72; tg=128; tb=178; break; + case T_ROCK: tr=155; tg=142; tb=128; break; + case T_SCRAP: tr=240; tg=190; tb=78; break; + default: tr=228; tg=188; tb=98; break; } fill_rect(s, 0, 0, TILE, TILE, tr, tg, tb, 255); /* speckle for texture */