/* ------------------------------------------------------------------ Black Nebula File : main3d.c Programmer: Colin Adams Date: 29/3/91 Last Modified : 10/6/91 Description: Controls the main loop of the player's ship. ------------------------------------------------------------------ */ #define AMIGA_INCLUDES #include "3d.h" #define FIRE 1 #define RIGHT 2 #define LEFT 4 #define DOWN 8 #define UP 16 #define DELAY_TIME 2 /* ------------------------------------------------------------------ External Variables ------------------------------------------------------------------ */ extern short swapflag; extern object myship; extern int player_score, player_scale; extern struct RastPort my_rast_port, back_rast_port; extern struct View my_view, back_view; extern struct ViewPort my_view_port, back_view_port; extern struct BitMap my_bit_map; extern struct BitMap back_bit_map; extern void AddNewObject(short, short, short, short); extern void SpinObjCentres(void); extern int GetPointAngle(int *, short, short); /* ------------------------------------------------------------------ Variables ------------------------------------------------------------------ */ static int last_draw = 0; int player_missiles; short U_rot = 270, W_rot = 180; short View2_Angle; int cos_angle[360], sin_angle[360]; char rotate[4]; /* pointers to bitmaps for console update */ PLANEPTR front_alt[4], back_alt[4]; PLANEPTR front_sp[4], back_sp[4]; PLANEPTR front_radar[66][4]; PLANEPTR back_radar[66][4]; char colour_mask[16][4]; UBYTE on_pat[8], off_pat[8]; /* ------------------------------------------------------------------ Routines ------------------------------------------------------------------ */ void SetUpConsole(void) /* precalculation of bitmap pointers for fast drawing */ { unsigned char i, j; for(i=0; i<16; i++) { colour_mask[i][0] = i & 1; colour_mask[i][1] = i & 2; colour_mask[i][2] = i & 4; colour_mask[i][3] = i & 8; } for(i=0; i5) colour = j + 4; else colour = 13 - j; if(colour_mask[colour][i]) { *temp2 = 255; /* fill byte with colour */ *temp = 255; } else { *temp2 = 0; /* set to background colour */ *temp = 0; } } if(byte<9) { *(temp + 1) = 0; /* clear to right side */ *(temp2 + 1) = 0; } temp += G/8; temp2 += G/8; } } } void UpdateSpeed(void) /* Updates the speed meter on the user display. For some strange reason this code doesn't work on an Amiga 3000 the way it does on a 2000. ie. bugs */ { unsigned int i; for(i=0; i5) colour = j + 4; else colour = 13 - j; if(colour_mask[colour][i]) { *temp2 = 255; /* fill byte with colour */ *temp = 255; } else { *temp2 = 0; /* set to background colour */ *temp = 0; } } if(velocity<9) { *(temp + 1) = 0; /* clear to right side */ *(temp2 + 1) = 0; } temp += G/8; temp2 += G/8; } } } void UpdateRadar(void) /* updates the radar on the user display */ { static PLANEPTR last_bytes_front[TOTAL_MAX_OBJECTS][DEPTH]; static PLANEPTR last_bytes_back[TOTAL_MAX_OBJECTS][DEPTH]; unsigned int i, loop; object *obj; for(loop=0; looptrans_x; y = obj->trans_z / (MAX_WORLD_Z/65); switch(obj->type) { case FIXED: colour = 9; break; case ENEMYMISSILE: colour = 10; break; case MYMISSILE: colour = 1; break; case SHUTTLE: colour = 14; break; case KRAIT: colour = 12; break; case GECKO: colour = 15; break; case THARGOID: colour = 11; break; case MAMBA: colour = 8; break; case GUIDEDMISSILE: colour = 3; break; case EXPLOSION: colour = 0; break; } } else { x = ex; y = ez / (MAX_WORLD_Z/65); colour = 8; } byte = x/(MAX_WORLD_X/7); /* get byte number */ offset = x- (byte*(MAX_WORLD_X/7)); /* get bit offset */ offset = 7 - (offset/((MAX_WORLD_X/7)/7)); for(i=0; i