/* * missiles, one for each tank */ #include #include "tmd_defs.h" #include "tmd_func.h" #include "defs.h" #include "globals.h" typedef struct { tmd_header head; tmd_object obj[1]; } missiles_str; #define NUM_MISSILES 2 static missiles_str Missiles[NUM_MISSILES]; GsDOBJ2 Bullets[NUM_MISSILES]; GsCOORDINATE2 mcoords[NUM_MISSILES]; #define MISSILE_FRONT 100 #define MISSILE_WIDTH 10 #define MISSILE_HEIGHT -10 #define MISSILE_ALT -50 #define TANK_RED 0xff, 0x00, 0x00 #define TANK_DRED 0x7f, 0x00, 0x00 #define TANK_YELLOW 0xff, 0xff, 0x00 #define TANK_BLUE 0x00, 0x00, 0xff #define TANK_DBLUE 0x00, 0x00, 0x7f #define TANK_CYAN 0x00, 0xff, 0xff #define TANK_PURPLE 0xff, 0x00, 0xff #define TANK_DPURPLE 0x7f, 0x00, 0x7f #define TANK_PINK 0xff, 0x7f, 0x7f #define TANK_ORANGE 0xff, 0x7f, 0x00 #define TANK_DORANGE 0x7f, 0x3f, 0x00 #define TANK_LIME 0x7f, 0x7f, 0xff #define TANK_WHITE 0xff, 0xff, 0xff #define TANK_GREY 0x7f, 0x7f, 0x7f #define TANK_DGREY 0x3f, 0x3f, 0x3f #define TANK_BLACK 0x00, 0x00, 0x00 typedef enum { COL_BLUE, COL_RED, COL_PURPLE, COL_ORANGE, COL_WHITE, COL_BLACK } missile_colours; static void missile_create(missiles_str *Missile, int col) { Missile->head.id = TMD_VERSION; Missile->head.flags = TMD_FIXP; Missile->head.nobj = 1; Missile->obj[0].vert_top = tmd_vertbase(); Missile->obj[0].n_vert = 4; Missile->obj[0].norm_top = tmd_normbase(); Missile->obj[0].n_norm = 1; Missile->obj[0].prim_top = tmd_primbase(); Missile->obj[0].n_prim = 4; tmd_addvert(0, MISSILE_HEIGHT, 0); tmd_addvert(MISSILE_WIDTH, 0, 0); tmd_addvert(-MISSILE_WIDTH, 0, 0); tmd_addvert(0, 0, MISSILE_FRONT); tmd_addnorm(0, 0, 0); switch(col) { case COL_BLUE: tmd_addp3fnt(0, 0, 1, 2, TANK_CYAN); tmd_addp3fnt(0, 0, 3, 1, TANK_BLUE); tmd_addp3fnt(0, 0, 2, 3, TANK_BLUE); tmd_addp3fnt(0, 3, 2, 1, TANK_DBLUE); break; case COL_RED: tmd_addp3fnt(0, 0, 1, 2, TANK_YELLOW); tmd_addp3fnt(0, 0, 3, 1, TANK_RED); tmd_addp3fnt(0, 0, 2, 3, TANK_RED); tmd_addp3fnt(0, 3, 2, 1, TANK_DRED); break; case COL_PURPLE: break; case COL_ORANGE: break; case COL_WHITE: break; case COL_BLACK: break; } } void initMissiles(void) { missile_create(&Missiles[0], COL_BLUE); missile_create(&Missiles[1], COL_RED); } void SetupMissiles(void) { int i; VECTOR transform; SVECTOR rotate; u_long *tmdaddr; for(i = 0; i < NUM_MISSILES; i++) { tmdaddr = (u_long *)&Missiles[i]; GsMapModelingData(tmdaddr+1); GsLinkObject4((u_long)(tmdaddr+3), &Bullets[i], 0); Bullets[i].coord2 = &mcoords[i]; Bullets[i].coord2->coord = GsIDMATRIX; Bullets[i].coord2->super = WORLD; Bullets[i].coord2->flg = 0; Bullets[i].coord2->param = 0; Bullets[i].attribute = 0;//(2 << 9); setVector(&transform, i*3400 + 200, MISSILE_ALT, i*3400 + 200); setVector(&rotate, 0, i*2048, 0); RotMatrix(&rotate, &(Bullets[i].coord2->coord)); TransMatrix(&(Bullets[i].coord2->coord), &transform); } } void DrawMissiles(int i) { MATRIX coordMatrix; Bullets[i].coord2->flg = 0; GsGetLs(Bullets[i].coord2, &coordMatrix); GsSetLsMatrix(&coordMatrix); GsSortObject4(&Bullets[i], &OT[buffIdx], 14 - OT[buffIdx].length, (u_long *)getScratchAddr(0)); }