// Header file for GFORCE.C #include "pad.h" #define NUMCOLOURS 32 #define GRAVITY_FORCE -0.03 #define AIR_RESISTANCE 0.02 #define ENGINE_POWER 0.2 #define NUM_LIVES 7 #define MAX_BULLETS 50 #define BULLET_POWER 4.0 #define BULLET_LIFE 100 enum { FALSE, TRUE }; typedef struct { short x, y; } POINT; typedef struct { float x, y; // position float xold, yold; float vx, vy; // velocity constant after firing u_long out; // Bullet out flag (used as timer) } BULLET; typedef struct { short x, y; // Player virtual screen coordinates short xold, yold; char angle; // Angle (0-35) 10 degree steps // uses lookup tables for sin&cos angle float px, py; // Player position as floating point float vx, vy; // Velocity vectors (fp) u_char thrust; // Thrust flag u_char lives; // Lives left u_char alive; // Death flag u_char onbase; // On base flag u_char exploding; // Exploding (value = time left exploding) u_char playing; // Is player playing u_char newplayer; // Newplayer flag } PLAYER; // Function prototypes void InitPlayers(int); // takes value 1 or 2 int UpdatePlayers(); // Returns 0,1 or 2: player dead void ResetPlayer(u_char); // puts player back to base void FireBullet(u_char); // fire bullet (player) void ClearBullets(); void DrawBullets(); void MapLoad(u_char); u_char ReadByte(); void PutPixel(short, short, u_char); // Putpixel u_char GetPixel(short, short); // used as test for collision detection void InitFrameBuffer(); void SavePlayerBKImage(u_char); // Save area for each player void PutPlayerBKImage(u_char); // Restore a saved image u_char DrawPlayer(u_char); // Draws players on virtual screen void VidModeChange(); // Global variables u_long PadStatus; PLAYER player1; PLAYER player2; RECT P1scr, P2scr; // Player screen areas RECT *scr, vir; // Visible and virtual screens RECT pix, tmp; // Used with PutBKImage/SaveBKImage/bullets RECT Clut; // Used in PutPixel POINT StartP1; // Player starting coords (set in MapLoad) POINT StartP2; short maxyoffset; // Used for split screen int Init_Once = FALSE; // Initialised once flag u_long *MAPADDR; // Pointer to map/dat data u_long offset; u_char bytenum; // Players' list of BULLETS BULLET P1Bullet[MAX_BULLETS]; BULLET P2Bullet[MAX_BULLETS]; // Palette RGB values for map - first 32 defined here, can use all 256 though u_char PALETTE[96] = { 0, 0, 0, 240, 240, 240, 224, 96, 32, 32, 80, 144, 240, 240, 32, 64, 112, 176, 112, 160, 208, 160, 208, 240, 176, 16, 0, 128, 0, 0, 192, 192, 192, 144, 144, 144, 48, 48, 48, 224, 176, 112, 192, 128, 64, 160, 96, 32, 128, 64, 0, 160, 160, 160, 112, 112, 112, 160, 160, 160, 32, 192, 0, 0, 128, 0, 0, 160, 0, 0, 160, 0, 160, 160, 160, 48, 192, 192, 48, 112, 112, 48, 192, 192, 0, 160, 160, 0, 80, 80, 0, 112, 112, 0, 112, 112 }; // Sin & Cos lookup table float SIN[36] = { 0, 0.173, 0.342, 0.5, 0.643, 0.766, 0.866, 0.940, 0.985, 1, 0.985, 0.940, 0.866, 0.766, 0.643, 0.5, 0.342, 0.173, 0, -0.173, -0.342, -0.5, -0.643, -0.766, -0.866, -0.940, -0.985, -1, -0.985, -0.940, -0.866, -0.766, -0.643, -0.5, -0.342, -0.173 }; float COS[36] = { 1, 0.985, 0.940, 0.866, 0.766, 0.643, 0.5, 0.342, 0.173, 0, -0.173, -0.342, -0.5, -0.643, -0.766, -0.866, -0.940, -0.985, -1, -0.985, -0.940, -0.866, -0.766, -0.643, -0.5, -0.342, -0.173, 0, 0.173, 0.342, 0.5, 0.643, 0.766, 0.866, 0.940, 0.985 };