/* * two tanks, a red one, and a blue one. */ #include #include "tmd_defs.h" #include "tmd_func.h" #include "defs.h" #include "globals.h" typedef struct { tmd_header head; tmd_object obj[1]; } tanks_str; #define NUM_TANKS 2 static tanks_str Tanks[NUM_TANKS]; GsDOBJ2 BTanks[NUM_TANKS]; GsCOORDINATE2 pcoords[NUM_TANKS]; #define T_TOP -75 #define T_MIDDLE -25 #define T_BOTTOM 0 #define T_FRONT 150 #define T_BACK -75 #define T_FRONT2 125 #define T_BACK2 -50 #define T_FRONT3 25 #define T_BACK3 -25 #define T_WIDTH 75 #define T_WIDTH2 50 #define T_WIDTH3 25 #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, 0xbf, 0x00 #define TANK_DORANGE 0xbf, 0x7f, 0x00 #define TANK_LIME 0xbf, 0xbf, 0x3f #define TANK_WHITE 0xff, 0xff, 0xff #define TANK_LGREY 0xbf, 0xbf, 0xbf #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 } tank_colours; // creates a bz style tank static void tank_createbz(tanks_str *Tank, int col) { Tank->head.id = TMD_VERSION; Tank->head.flags = TMD_FIXP; Tank->head.nobj = 1; Tank->obj[0].vert_top = tmd_vertbase(); Tank->obj[0].n_vert = 12; Tank->obj[0].norm_top = tmd_normbase(); Tank->obj[0].n_norm = 1; Tank->obj[0].prim_top = tmd_primbase(); Tank->obj[0].n_prim = 9; tmd_addvert(T_WIDTH3, T_TOP, T_FRONT3); tmd_addvert(T_WIDTH3, T_TOP, T_BACK3); tmd_addvert(-T_WIDTH3, T_TOP, T_FRONT3); tmd_addvert(-T_WIDTH3, T_TOP, T_BACK3); tmd_addvert(T_WIDTH, T_MIDDLE, T_FRONT); tmd_addvert(T_WIDTH, T_MIDDLE, T_BACK); tmd_addvert(-T_WIDTH, T_MIDDLE, T_FRONT); tmd_addvert(-T_WIDTH, T_MIDDLE, T_BACK); tmd_addvert(T_WIDTH2, T_BOTTOM, T_FRONT2); tmd_addvert(T_WIDTH2, T_BOTTOM, T_BACK2); tmd_addvert(-T_WIDTH2, T_BOTTOM, T_FRONT2); tmd_addvert(-T_WIDTH2, T_BOTTOM, T_BACK2); tmd_addnorm(0, 0, 0); switch(col) { case COL_BLUE: tmd_addp4fnt(0, 0, 1, 2, 3, TANK_CYAN); tmd_addp4fnt(0, 0, 4, 1, 5, TANK_BLUE); tmd_addp4fnt(0, 1, 5, 3, 7, TANK_BLUE); tmd_addp4fnt(0, 3, 7, 2, 6, TANK_BLUE); tmd_addp4fnt(0, 2, 6, 0, 4, TANK_CYAN); tmd_addp4fnt(0, 4, 8, 5, 9, TANK_DBLUE); tmd_addp4fnt(0, 5, 9, 7, 11, TANK_DBLUE); tmd_addp4fnt(0, 7, 11, 6, 10, TANK_DBLUE); tmd_addp4fnt(0, 6, 10, 4, 8, TANK_DBLUE); break; case COL_RED: tmd_addp4fnt(0, 0, 1, 2, 3, TANK_YELLOW); tmd_addp4fnt(0, 0, 4, 1, 5, TANK_RED); tmd_addp4fnt(0, 1, 5, 3, 7, TANK_RED); tmd_addp4fnt(0, 3, 7, 2, 6, TANK_RED); tmd_addp4fnt(0, 2, 6, 0, 4, TANK_YELLOW); tmd_addp4fnt(0, 4, 8, 5, 9, TANK_DRED); tmd_addp4fnt(0, 5, 9, 7, 11, TANK_DRED); tmd_addp4fnt(0, 7, 11, 6, 10, TANK_DRED); tmd_addp4fnt(0, 6, 10, 4, 8, TANK_DRED); break; case COL_PURPLE: tmd_addp4fnt(0, 0, 1, 2, 3, TANK_PINK); tmd_addp4fnt(0, 0, 4, 1, 5, TANK_PURPLE); tmd_addp4fnt(0, 1, 5, 3, 7, TANK_PURPLE); tmd_addp4fnt(0, 3, 7, 2, 6, TANK_PURPLE); tmd_addp4fnt(0, 2, 6, 0, 4, TANK_PINK); tmd_addp4fnt(0, 4, 8, 5, 9, TANK_DPURPLE); tmd_addp4fnt(0, 5, 9, 7, 11, TANK_DPURPLE); tmd_addp4fnt(0, 7, 11, 6, 10, TANK_DPURPLE); tmd_addp4fnt(0, 6, 10, 4, 8, TANK_DPURPLE); break; case COL_ORANGE: tmd_addp4fnt(0, 0, 1, 2, 3, TANK_LIME); tmd_addp4fnt(0, 0, 4, 1, 5, TANK_ORANGE); tmd_addp4fnt(0, 1, 5, 3, 7, TANK_ORANGE); tmd_addp4fnt(0, 3, 7, 2, 6, TANK_ORANGE); tmd_addp4fnt(0, 2, 6, 0, 4, TANK_LIME); tmd_addp4fnt(0, 4, 8, 5, 9, TANK_DORANGE); tmd_addp4fnt(0, 5, 9, 7, 11, TANK_DORANGE); tmd_addp4fnt(0, 7, 11, 6, 10, TANK_DORANGE); tmd_addp4fnt(0, 6, 10, 4, 8, TANK_DORANGE); break; case COL_WHITE: tmd_addp4fnt(0, 0, 1, 2, 3, TANK_WHITE); tmd_addp4fnt(0, 0, 4, 1, 5, TANK_LGREY); tmd_addp4fnt(0, 1, 5, 3, 7, TANK_LGREY); tmd_addp4fnt(0, 3, 7, 2, 6, TANK_LGREY); tmd_addp4fnt(0, 2, 6, 0, 4, TANK_WHITE); tmd_addp4fnt(0, 4, 8, 5, 9, TANK_GREY); tmd_addp4fnt(0, 5, 9, 7, 11, TANK_GREY); tmd_addp4fnt(0, 7, 11, 6, 10, TANK_GREY); tmd_addp4fnt(0, 6, 10, 4, 8, TANK_GREY); break; case COL_BLACK: tmd_addp4fnt(0, 0, 1, 2, 3, TANK_DGREY); tmd_addp4fnt(0, 0, 4, 1, 5, TANK_BLACK); tmd_addp4fnt(0, 1, 5, 3, 7, TANK_BLACK); tmd_addp4fnt(0, 3, 7, 2, 6, TANK_BLACK); tmd_addp4fnt(0, 2, 6, 0, 4, TANK_DGREY); tmd_addp4fnt(0, 4, 8, 5, 9, TANK_BLACK); tmd_addp4fnt(0, 5, 9, 7, 11, TANK_BLACK); tmd_addp4fnt(0, 7, 11, 6, 10, TANK_BLACK); tmd_addp4fnt(0, 6, 10, 4, 8, TANK_BLACK); break; } } void initTanks(void) { tank_createbz(&Tanks[0], COL_BLUE); tank_createbz(&Tanks[1], COL_RED); } void SetupTanks(void) { int i; VECTOR transform; u_long *tmdaddr; for(i = 0; i < NUM_TANKS; i++) { tmdaddr = (u_long *)&Tanks[i]; GsMapModelingData(tmdaddr+1); GsLinkObject4((u_long)(tmdaddr+3), &BTanks[i], 0); BTanks[i].coord2 = &pcoords[i]; BTanks[i].coord2->coord = GsIDMATRIX; BTanks[i].coord2->super = WORLD; BTanks[i].coord2->flg = 0; BTanks[i].attribute = 2<<9;//0;//(2 << 9); // the 3800 here should be altered to the value setup in the player // structure, which should probably also have the GsDOBJ2's in it setVector(&transform, i*8191, 0, i*4095); TransMatrix(&(BTanks[i].coord2->coord), &transform); } } void DrawTanks(void) { int i; MATRIX coordMatrix; for(i = 0; i < NUM_TANKS; i++) { BTanks[i].coord2->super = WORLD; BTanks[i].coord2->flg = 0; GsGetLs(BTanks[i].coord2, &coordMatrix); GsSetLsMatrix(&coordMatrix); GsSortObject4(&BTanks[i], &OT[buffIdx], 14 - OT[buffIdx].length, (u_long *)getScratchAddr(0)); } }