engine-c: vehicle tread/wheel roll via Unit.anim
This commit is contained in:
parent
48960b11fa
commit
8b55fa687a
3 changed files with 149 additions and 4 deletions
|
|
@ -103,6 +103,23 @@ static void terrain_color(TerrainType t, uint8_t *r, uint8_t *g, uint8_t *b) {
|
|||
}
|
||||
}
|
||||
|
||||
/* Spoke (wheeled) or hash (tracked) marks on a tyre disc; phase = Unit.anim rad. */
|
||||
static void tyre_mark(int cx, int cy, int rad, float phase, int wheeled) {
|
||||
uint8_t sr = 205, sg = 200, sb = 180;
|
||||
int n = wheeled ? 4 : 3;
|
||||
float step = (float)(2.0 * M_PI / (double)n);
|
||||
float r0 = wheeled ? rad * 0.30f : rad * 0.55f;
|
||||
float r1 = rad * 0.90f;
|
||||
for (int i = 0; i < n; i++) {
|
||||
float a = phase + i * step;
|
||||
int x1 = cx + (int)(cosf(a) * r0);
|
||||
int y1 = cy + (int)(sinf(a) * r0);
|
||||
int x2 = cx + (int)(cosf(a) * r1);
|
||||
int y2 = cy + (int)(sinf(a) * r1);
|
||||
line(x1, y1, x2, y2, sr, sg, sb);
|
||||
}
|
||||
}
|
||||
|
||||
/* Classic RTS silhouette: thin black outline, then bright faction fill.
|
||||
* Dark outer discs previously read as olive-mud blobs under NN zoom. */
|
||||
static void draw_unit(Unit *u, int sx, int sy) {
|
||||
|
|
@ -113,6 +130,7 @@ static void draw_unit(Unit *u, int sx, int sy) {
|
|||
uint8_t mr = 70, mg = 65, mb = 58; /* tyre */
|
||||
float c = cosf(u->heading), s = sinf(u->heading);
|
||||
const float sc = SHOT_UNIT_SCALE;
|
||||
float ph = u->anim; /* continuous roll phase for wheeled/tracked */
|
||||
#define SI(n) ((int)((n) * sc + 0.5f))
|
||||
#define LX(lx, ly) (sx + (int)((((lx)-15)*sc)*c - (((ly)-15)*sc)*s))
|
||||
#define LY(lx, ly) (sy + (int)((((lx)-15)*sc)*s + (((ly)-15)*sc)*c))
|
||||
|
|
@ -135,6 +153,10 @@ static void draw_unit(Unit *u, int sx, int sy) {
|
|||
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(22,23), LY(22,23), SI(4), mr, mg, mb);
|
||||
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(8,23), LY(8,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);
|
||||
break;
|
||||
case UT_TANK:
|
||||
|
|
@ -144,6 +166,8 @@ static void draw_unit(Unit *u, int sx, int sy) {
|
|||
line(sx, sy, LX(30,15), LY(30,15), 50, 45, 35);
|
||||
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);
|
||||
tyre_mark(LX(22,23), LY(22,23), SI(4), ph, 0);
|
||||
break;
|
||||
case UT_ARTILLERY:
|
||||
fill_rect(sx-SI(13), sy-SI(5), SI(26), SI(12), ok, og, ob);
|
||||
|
|
@ -158,6 +182,8 @@ static void draw_unit(Unit *u, int sx, int sy) {
|
|||
fill_rect(sx-SI(10), sy-SI(5), SI(20), SI(10), 200, 170, 90);
|
||||
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, 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);
|
||||
break;
|
||||
case UT_JEEP:
|
||||
|
|
@ -165,6 +191,8 @@ static void draw_unit(Unit *u, int sx, int sy) {
|
|||
fill_rect(sx-SI(9), sy-SI(4), SI(18), SI(8), br, bg, bb);
|
||||
disc(LX(9,22), LY(9,22), SI(4), mr, mg, mb);
|
||||
disc(LX(21,22), LY(21,22), SI(4), mr, mg, mb);
|
||||
tyre_mark(LX(9,22), LY(9,22), SI(4), ph, 1);
|
||||
tyre_mark(LX(21,22), LY(21,22), SI(4), ph, 1);
|
||||
line(LX(15,11), LY(15,11), LX(15,3), LY(15,3), lr, lg, lb);
|
||||
line(sx, sy, LX(28,15), LY(28,15), 50, 45, 35);
|
||||
break;
|
||||
|
|
@ -181,6 +209,10 @@ static void draw_unit(Unit *u, int sx, int sy) {
|
|||
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(23,22), LY(23,22), SI(3), mr, mg, mb);
|
||||
tyre_mark(LX(9,21), LY(9,21), 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(23,22), LY(23,22), SI(3), ph, 1);
|
||||
disc(LX(23,12), LY(23,12), SI(5), lr, lg, lb);
|
||||
break;
|
||||
case UT_RAVAGER:
|
||||
|
|
@ -190,6 +222,8 @@ static void draw_unit(Unit *u, int sx, int sy) {
|
|||
line(sx, sy, LX(29,15), LY(29,15), 50, 45, 35);
|
||||
disc(LX(7,23), LY(7,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(23,23), LY(23,23), SI(4), ph, 0);
|
||||
break;
|
||||
case UT_FLAME:
|
||||
fill_rect(sx-SI(10), sy-SI(4), SI(20), SI(15), ok, og, ob);
|
||||
|
|
@ -202,6 +236,8 @@ static void draw_unit(Unit *u, int sx, int sy) {
|
|||
fill_rect(sx-SI(9), sy-SI(2), SI(18), SI(10), br, bg, bb);
|
||||
disc(LX(9,23), LY(9,23), SI(4), mr, mg, mb);
|
||||
disc(LX(21,23), LY(21,23), SI(4), mr, mg, mb);
|
||||
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,6), LY(28,6), 255, 80, 60);
|
||||
break;
|
||||
case UT_MEDIC:
|
||||
|
|
@ -209,6 +245,8 @@ static void draw_unit(Unit *u, int sx, int sy) {
|
|||
fill_rect(sx-SI(8), sy-SI(3), SI(16), SI(11), 245, 245, 245);
|
||||
disc(LX(10,24), LY(10,24), SI(4), mr, mg, mb);
|
||||
disc(LX(20,24), LY(20,24), SI(4), mr, mg, mb);
|
||||
tyre_mark(LX(10,24), LY(10,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);
|
||||
fill_rect(LX(14,6)-1, LY(14,6)-SI(4), SI(3), SI(8), 255, 255, 255);
|
||||
fill_rect(LX(11,8)-SI(4), LY(11,8)-1, SI(8), SI(3), 255, 255, 255);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue