home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Dream 44
/
Amiga_Dream_44.iso
/
RiscPc
/
jeux
/
biohazard.arc
/
c
/
BioHazard
Wrap
Text File
|
1995-10-29
|
146KB
|
4,750 lines
#include "baricon.h"
#include "dbox.h"
#include "event.h"
#include "menu.h"
#include "res.h"
#include "resspr.h"
#include "sprite.h"
#include "template.h"
#include "wimp.h"
#include "wimpt.h"
#include "win.h"
#include "werr.h"
#include "wolfhead.h"
#include <stdio.h>
#include <stdlib.h>
#include <bbc.h>
#include <math.h>
#define saving_name "screensave savescrn"
#define hourglass_on "hourglass on"
#define hourglass_off "hourglass off"
#define spritedata_name "data.sprites"
#define Chainsaw_name "data.chainsaw"
#define Chaingun_name "data.cgun"
#define Grenade_name "data.grenade"
#define MGun_name "data.uzi"
#define Number_name "data.1234"
#define mapdata_name "data.map"
#define blockdata_name "data.blocks"
#define screensave "screensave wolfscreen"
#define loadscreen "screenload LoadScr"
#define loadscreenVGA "screenload LoadScrVGA"
#define Song_Name "data.CSsound"
#define floorsprite1_name "data.floor1"
#define floorsprite2_name "data.floor2"
#define bar_name "data.bar"
#define blackbox_name "data.blackbox"
#define lastfloor_name "data.lastfloor"
#define backdrop_name "data.backdrop"
#define pointer_on "pointer 1"
#define broadcast 0
#define VGA 1
#define Single 0
#define Multi 1
#define Chainsaw 0
#define Grenade 1
#define Chaingun 3
#define MGun 2
#define Game_On 6
#define Game_Over 7
#define Level_1 8
#define On 9
#define Off 10
#define Player_1 11
#define Player_2 12
#define Player_3 13
#define Player_4 14
#define Warning 15
#define Weapon_1 16
#define Weapon_2 17
#define Weapon_3 18
#define Weapon_4 19
#define Full_Screen 1
#define Tactical_Map 2
#define Main_Player 3
/*#define RISCPC*/
int block_data[32][1024];
int sprite_data[39680];
int weapon_data[39680];
int Number_Data[320];
#if defined(RISCPC)
int virtual_screen[20480];
#endif
int virtual_screen_pointer;
struct door_type {
int door_frame_counter;
int door_position_x;
int door_position_y;
int next_door;
int previous_door;
};
struct door_type Door_List[64];
int First_Door = 0, Last_Door = 0, Doors_Active = 0, Next_Free = 0;
int Next_Free_List[64], Current_Door;
int data_address[320];
int distance[320];
struct sprite_type {
int sprite_frame_counter;
int sprite_position_x;
int sprite_position_y;
int sprite_info;
};
struct sprite_type Sprite_List[64];
os_regset registers;
os_regset *point_registers = ®isters;
int paused = TRUE,input_focus=FALSE;
int player_map[4] = {1,2,3,4};
int new_time,old_time = 0,mono_time=2;
int gradient_table[1024];
int map[64][64]; /* the map! */
char Map_Data[64][64]; /* the map data for display */
int door_map[64][64]; /* door map */
int tan_table[961]; /* tan in range 0-30/0.1875 */
int cos_div_table[961];
int view_cos_table[320];
int tactical_view_cos_table[320];
int main_view_cos_table[320];
int x_move_table[3840];
int y_move_table[3840];
int increment[961];
int screen_vars[8] = {149,11,12,-1,0,0,0,0};
int mode = 1,PersTrans = 0;
int PT_EDDIE[320],PT_Tactical[320],PT_main[320]; /* casting angle lookup tables */
int Vector_Distance[320]; /* initial vector offsets for rays cast */
int Tactical_Vector_Distance[320],main_Vector_Distance[320]; /* initial vector offsets for rays cast */
int State_Frame = 0, State_Counter = 0, Direction = 1, State_Frame_Counter = 0;
int ColourMap[256],pallette_entry,pallette_entry_red,pallette_entry_green,pallette_entry_blue;
int Secret_Door_Position,Secret_Door_Orientation,result,temp_counter=1,temp_direction = 1;
int Weapon_Active = 0, Weapon_Type = 0;
int current_screen_mode,colour_red = 255,colour_green = 255,colour_blue = 255;
sprite_area *sprite_pointer,*sprite_mode_pointer;
sprite_area sprite_address;
sprite_area *sprite_data_offset;
int sprite_data_address,*sprite_mode_address;
int *sprite_data_address_pointer;
int Floor_Data[2][128][4]; /* floor data array */
int Tactical_Floor_Data[2][128][4]; /* floor data array */
int main_Floor_Data[2][128][4]; /* floor data array */
int Floor_Sprite[2][4096];
int Floor_Block[10];
int Floor_On_Off = 1,Frame_Number = 1, Frame_Increment = 1;
float rotate_cos[121];
int scale_factor,tactical_scale_factor,main_scale_factor;
float rotate_sin[121];
int int_rotate_cos[121];
int int_rotate_sin[121];
int Bar_Data[1280];
int Screen_Mode = broadcast,Tasking_Mode = Multi;
int Play_Mode = 1;
int OS_X_Pixels, OS_Y_Pixels, OS_Bits_Per_Pixel;
wimp_wind main_window,*main_window_pointer; /* Pointer to main window definition */
int main_window_size[5];
wimp_openstr biohazard_open;
int rotate_position;
int Right_Rotation_Counter,Left_Rotation_Counter,Rotation_Value;
int screen_address,Frame_Size=192,sprite_x,sprite_y;
int screen_height=238,screen_width=320;
int current_screen_height=72,current_screen_width=96;
int tactical_screen_height=60,tactical_screen_width=80;
int main_screen_height=120,main_screen_width=160;
int Sprite_Plot_Block[30];
int Weapon_Plot_Block[30];
const int door_code = 2<<8;
const int door_wall_code = 4<<8;
const int Secret_Door_Code = 254<<8;
/* moved from BioHazard app */
float theta,angle,scanline,move,temp_move,move2; /* trig & div table calc variables */
float c,sn,ang,vx,vz,a1,PI = 3.141592654,toround; /* perspective lookup variables */
float x1,y1,x2,y2,xa,ya,xg,yg; /* floor data table calc variables */
float rotate_angle;
int Quit = 0,Buttons,Players = 1,FrameCounter=0, Wait_Mode = 0,loopA;
int door_active[2], door_frame_counter[2], door_position[2][2];
int X=384<<16,Y=224<<16,direction_angle = 2880,X_conv1,Y_conv1;
int loop1,loop2,s = 0,FastMode = 0, rotate_offset,floor_flag=0,floor_test=64;
int Backdrop[20480];
int Black_Box[1];
int BB_Flag = 1;
int BB_Pointer = 1;
int BB_Value = 0;
int Last_Floor, Map_Magnification = 32;
void Draw_Map(int Yahoo_address)
{
/* Compute map coordinates from current X,Y coords.
The points are calculated in the following order:
2-------1 ^
| | |
| + | |Map_Magnification.
| X,Y| |
3-------4 v
They are then rotated in accordance with Direction_Angle.*/
float rotate_x1,rotate_y1;
float rotate_x2,rotate_y2;
float rotate_x3,rotate_y3;
float rotate_x4,rotate_y4;
float temp,map_angle,map_cos,map_sin;
int x_pixel_increment,y_pixel_increment;
int x_line_increment,y_line_increment;
int Map_Plot_Block[10],map_line_length=192;
rotate_x1 = -(Map_Magnification/2);
rotate_y1 = (Map_Magnification/2);
rotate_x2 = (Map_Magnification/2);
rotate_y2 = (Map_Magnification/2);
rotate_x3 = (Map_Magnification/2);
rotate_y3 = -(Map_Magnification/2);
rotate_x4 = -(Map_Magnification/2);
rotate_y4 = -(Map_Magnification/2);
/* rotate about X,Y */
map_angle = direction_angle * 1.63624617374E-03;
map_cos = cos(map_angle);
map_sin = sin(map_angle);
temp = (rotate_x1 * map_cos) - (rotate_y1 * map_sin);
rotate_y1 = (rotate_x1 * map_sin) + (rotate_y1 * map_cos);
rotate_x1 = temp;
temp = (rotate_x2 * map_cos) - (rotate_y2 * map_sin);
rotate_y2 = (rotate_x2 * map_sin) + (rotate_y2 * map_cos);
rotate_x2 = temp;
temp = (rotate_x3 * map_cos) - (rotate_y3 * map_sin);
rotate_y3 = (rotate_x3 * map_sin) + (rotate_y3 * map_cos);
rotate_x3 = temp;
/*temp = (rotate_x4 * map_cos) - (rotate_y4 * map_sin);
rotate_y4 = (rotate_x4 * map_sin) + (rotate_y4 * map_cos);
rotate_x4 = temp;*/
/* compute pixel increments */
x_pixel_increment = (int)(((rotate_x1 - rotate_x2)/map_line_length)*65536);
y_pixel_increment = (int)(((rotate_y1 - rotate_y2)/map_line_length)*65536);
/* compute line increments */
x_line_increment = -(int)(((rotate_x2 - rotate_x3)/map_line_length)*65536);
y_line_increment = -(int)(((rotate_y2 - rotate_y3)/map_line_length)*65536);
Map_Plot_Block[0] = (int)(rotate_x2*65536)+(Y>>6);
Map_Plot_Block[1] = (int)(rotate_y2*65536)+(X>>6);
Map_Plot_Block[2] = Yahoo_address;
Map_Plot_Block[3] = (int)&Map_Data[0];
Map_Plot_Block[4] = x_pixel_increment;
Map_Plot_Block[5] = y_pixel_increment;
Map_Plot_Block[6] = x_line_increment;
Map_Plot_Block[7] = y_line_increment;
if (Screen_Mode == VGA)
{
PlotMapVGA((int)&Map_Plot_Block[0]);
}
else
{
PlotMap((int)&Map_Plot_Block[0]);
}
}
void DrawSmallMap(int Yahoo_address,int Fade_Type)
{
/* Compute map coordinates from current X,Y coords.
The points are calculated in the following order:
2-------1 ^
| | |
| + | |Map_Magnification.
| X,Y| |
3-------4 v
They are then rotated in accordance with Direction_Angle.*/
float rotate_x1,rotate_y1;
float rotate_x2,rotate_y2;
float rotate_x3,rotate_y3;
float rotate_x4,rotate_y4;
float temp,map_angle,map_cos,map_sin;
int x_pixel_increment,y_pixel_increment;
int x_line_increment,y_line_increment;
int Map_Plot_Block[10],map_line_length=64;
rotate_x1 = -(Map_Magnification/2);
rotate_y1 = (Map_Magnification/2);
rotate_x2 = (Map_Magnification/2);
rotate_y2 = (Map_Magnification/2);
rotate_x3 = (Map_Magnification/2);
rotate_y3 = -(Map_Magnification/2);
rotate_x4 = -(Map_Magnification/2);
rotate_y4 = -(Map_Magnification/2);
/* rotate about X,Y */
map_angle = direction_angle * 1.63624617374E-03;
map_cos = cos(map_angle);
map_sin = sin(map_angle);
temp = (rotate_x1 * map_cos) - (rotate_y1 * map_sin);
rotate_y1 = (rotate_x1 * map_sin) + (rotate_y1 * map_cos);
rotate_x1 = temp;
temp = (rotate_x2 * map_cos) - (rotate_y2 * map_sin);
rotate_y2 = (rotate_x2 * map_sin) + (rotate_y2 * map_cos);
rotate_x2 = temp;
temp = (rotate_x3 * map_cos) - (rotate_y3 * map_sin);
rotate_y3 = (rotate_x3 * map_sin) + (rotate_y3 * map_cos);
rotate_x3 = temp;
/*temp = (rotate_x4 * map_cos) - (rotate_y4 * map_sin);
rotate_y4 = (rotate_x4 * map_sin) + (rotate_y4 * map_cos);
rotate_x4 = temp;*/
/* compute pixel increments */
x_pixel_increment = (int)(((rotate_x1 - rotate_x2)/map_line_length)*65536);
y_pixel_increment = (int)(((rotate_y1 - rotate_y2)/map_line_length)*65536);
/* compute line increments */
x_line_increment = -(int)(((rotate_x2 - rotate_x3)/map_line_length)*65536);
y_line_increment = -(int)(((rotate_y2 - rotate_y3)/map_line_length)*65536);
Map_Plot_Block[0] = (int)(rotate_x2*65536)+(Y>>6);
Map_Plot_Block[1] = (int)(rotate_y2*65536)+(X>>6);
Map_Plot_Block[2] = Yahoo_address;
Map_Plot_Block[3] = (int)&Map_Data[0];
Map_Plot_Block[4] = x_pixel_increment;
Map_Plot_Block[5] = y_pixel_increment;
Map_Plot_Block[6] = x_line_increment;
Map_Plot_Block[7] = y_line_increment;
if (Screen_Mode == VGA)
{
if (Fade_Type == 0)
{
PlotSmallMapVGA((int)&Map_Plot_Block[0]);
}
else
{
PlotSmallFadedMapVGA((int)&Map_Plot_Block[0]);
}
}
else
{
if (Fade_Type == 0)
{
PlotSmallMap((int)&Map_Plot_Block[0]);
}
else
{
PlotSmallFadedMap((int)&Map_Plot_Block[0]);
}
}
}
int convert_colour(int R,int G,int B)
{
int result;
R = R >> 4;
G = G >> 3;
B = B >> 4;
result = (R & 7)|(G & 3)|(B & 3);
result = result|((R & 8)<<1);
result = result|((G & 12)<<3);
result = result|((B & 4)<<1)|((B & 8)<<4);
/*pallette_entry_red = ((loop1 & 7)<<4) + ((loop1 & 16)<<3);
pallette_entry_green = ((loop1 & 3)<<4) + ((loop1 & 96)<<1);
pallette_entry_blue = ((loop1 & 3)<<4) + ((loop1 & 4)<<3) + (loop1 & 128);
pallette_entry = (pallette_entry_red<<8)+(pallette_entry_green<<16)+(pallette_entry_blue<<24);
registers.r[0] = pallette_entry;*/
return result;
}
void Resize_Screen()
{
int Quit_Resize = 0;
/* draw screen border */
if (Screen_Mode == VGA)
{
DrawBorderVGA((screen_vars[0]),screen_width,screen_height,(int)&Backdrop[0]);
DrawBorderVGA((screen_vars[0]+153600),screen_width,screen_height,(int)&Backdrop[0]);
}
else
{
if (Tasking_Mode == Single)
{
DrawBorder((screen_vars[0]),screen_width,screen_height,(int)&Backdrop[0]);
DrawBorder((screen_vars[0]+81920),screen_width,screen_height,(int)&Backdrop[0]);
}
else
{
DrawBorder(virtual_screen_pointer,screen_width,screen_height,(int)&Backdrop[0]);
}
}
if (screen_height == 238)
{
screen_height = 240;
}
while (Quit_Resize != 1)
{
/* read keyboard inputs scan for A */
registers.r[0] = 129;
registers.r[1] = -66;
registers.r[2] = 255;
os_swi(6, point_registers); /* OS_Byte */
if ((registers.r[1] == 255) && (registers.r[2] == 255))
{
if (screen_width < 320)
{
screen_width += 16;
screen_height += 12;
/* draw screen border */
if (Screen_Mode == VGA)
{
DrawBorderVGA((screen_vars[0]),screen_width,screen_height,(int)&Backdrop[0]);
DrawBorderVGA((screen_vars[0]+153600),screen_width,screen_height,(int)&Backdrop[0]);
}
else
{
if (Tasking_Mode == Single )
{
DrawBorder((screen_vars[0]),screen_width,screen_height,(int)&Backdrop[0]);
DrawBorder((screen_vars[0]+81920),screen_width,screen_height,(int)&Backdrop[0]);
}
else
{
DrawBorder(virtual_screen_pointer,screen_width,screen_height,(int)&Backdrop[0]);
}
}
/* Wait */
registers.r[0] = 19;
os_swi(6, point_registers);
registers.r[0] = 19;
os_swi(6, point_registers);
registers.r[0] = 19;
os_swi(6, point_registers);
registers.r[0] = 19;
os_swi(6, point_registers);
registers.r[0] = 19;
os_swi(6, point_registers);
}
}
/* read keyboard inputs scan for S */
registers.r[0] = 129;
registers.r[1] = -82;
registers.r[2] = 255;
os_swi(6, point_registers); /* OS_Byte */
if ((registers.r[1] == 255) && (registers.r[2] == 255))
{
if (screen_width > 80)
{
screen_width -= 16;
screen_height -= 12;
/* draw screen border */
if (Screen_Mode == VGA)
{
DrawBorderVGA((screen_vars[0]),screen_width,screen_height,(int)&Backdrop[0]);
DrawBorderVGA((screen_vars[0]+153600),screen_width,screen_height,(int)&Backdrop[0]);
}
else
{
if (Tasking_Mode == Single)
{
DrawBorder((screen_vars[0]),screen_width,screen_height,(int)&Backdrop[0]);
DrawBorder((screen_vars[0]+81920),screen_width,screen_height,(int)&Backdrop[0]);
}
else
{
DrawBorder(virtual_screen_pointer,screen_width,screen_height,(int)&Backdrop[0]);
}
}
/* Wait */
registers.r[0] = 19;
os_swi(6, point_registers);
registers.r[0] = 19;
os_swi(6, point_registers);
registers.r[0] = 19;
os_swi(6, point_registers);
registers.r[0] = 19;
os_swi(6, point_registers);
registers.r[0] = 19;
os_swi(6, point_registers);
}
}
/* read keyboard inputs scan for SPACE */
registers.r[0] = 129;
registers.r[1] = -99;
registers.r[2] = 255;
os_swi(6, point_registers); /* OS_Byte */
if ((registers.r[1] == 255) && (registers.r[2] == 255))
{
Quit_Resize = 1;
}
}
if (screen_height == 240)
{
screen_height = 238;
}
}
void Calculate_Tactical_Tables()
{
float angle,scanline,move,tactical_scaling_factor; /* trig & div table calc variables */
float c,sn,ang,vx,vz,a1,PI = 3.141592654,toround; /* perspective lookup variables */
float x1,y1,x2,y2,xa,ya,xg,yg; /* floor data table calc variables */
float rotate_angle,move2,gradient;
float PIdiv2 = PI/2.0;
float PIdiv180 = PI/180.0;
float PIdiv180div09375 = (PI/180.0)/0.09375;
int loop2;
/* Set up floor table */
/*PIdiv180 = PI/180.0;
PIdiv2 = PI/2.0;
PIdiv180div09375 = (PI/180.0)/0.09375;*/
/* precalc cos & sin values */
for (rotate_position = 0; rotate_position < 121; rotate_position++)
{
rotate_angle = rotate_position * (3*(PIdiv180));
rotate_cos[rotate_position] = cos(rotate_angle);
rotate_sin[rotate_position] = sin(rotate_angle);
int_rotate_cos[rotate_position] = (int)((cos(rotate_angle))*65536);
int_rotate_sin[rotate_position] = (int)((sin(rotate_angle))*65536);
}
tactical_scaling_factor = tactical_screen_height>>1;
tactical_scaling_factor = (tactical_scaling_factor*1.3)/120.0;
tactical_scale_factor = (int)(tactical_scaling_factor * 65536);
tactical_scaling_factor = tactical_scaling_factor*8192.0;
/*proj_angle = tan(0.4636476091);*/
for (loop2= 1; loop2 < ((tactical_screen_height/2)+1); loop2++)
{
/* calculate z distances from raster lines on screen*/
move = (tactical_scaling_factor)/loop2;
/* calculate intercepts for x1,y1 & x2,y2 co-ordinates */
for (rotate_position = 120; rotate_position < 121; rotate_position++)
{
xa = -move*0.5;
ya = move;
x1 = (xa * rotate_cos[rotate_position])-(ya * rotate_sin[rotate_position]);
y1 = (xa * rotate_sin[rotate_position])+(ya * rotate_cos[rotate_position]);
xa = move*0.5;
ya = move;
x2 = (xa * rotate_cos[rotate_position])-(ya * rotate_sin[rotate_position]);
y2 = (xa * rotate_sin[rotate_position])+(ya * rotate_cos[rotate_position]);
xg = (x2-x1)/tactical_screen_width;
yg = (y2-y1)/tactical_screen_width;
/* store results in array */
Tactical_Floor_Data[120-rotate_position][loop2-1][0] = (int)(x1*65536);
/*Floor_Data[120-rotate_position][loop2-1][0] = Floor_Data[120-rotate_position][loop2-1][0]&4194303;*/
Tactical_Floor_Data[120-rotate_position][loop2-1][1] = (int)(y1*65536);
/*Floor_Data[120-rotate_position][loop2-1][1] = Floor_Data[120-rotate_position][loop2-1][1]&4194303;
Floor_Data[120-rotate_position][loop2-1][0] -= Floor_Data[120-rotate_position][loop2-1][1]<<6;*/
Tactical_Floor_Data[120-rotate_position][loop2-1][2] = (int)(xg*65536);
Tactical_Floor_Data[120-rotate_position][loop2-1][3] = (int)(yg*65536);
/*Floor_Data[120-rotate_position][loop2-1][2] = (int)((xg)*65536);*/
}
}
PIdiv2 = PI/2.0;
PIdiv180div09375 = (PI/180.0)/0.09375;
/* Set up angle casting tables & vector direction offsets */
ang = 270*(PIdiv180);
c = cos(ang);
sn = sin(ang);
scanline = -(tactical_screen_width/2);
for (loop2=0; loop2<(tactical_screen_width>>1); loop2++)
{
/* Eddie's transform */
vx = (scanline*c) + (tactical_screen_width * sn);
vz = (tactical_screen_width*c) - (scanline*sn);
angle = atan(vx/vz);
toround = (angle/PIdiv180)/0.09375;
PT_Tactical[loop2] = toround;
tactical_view_cos_table[loop2] = (int)((cos((PIdiv2)-angle))*262144);
tactical_view_cos_table[(tactical_screen_width-1)-loop2] = (int)((cos(-((PIdiv2)-angle)))*262144);
if ((toround - PT_Tactical[loop2]) > 0.5)
{
PT_Tactical[loop2] += 1;
}
PT_Tactical[loop2] = 960-PT_Tactical[loop2];
PT_Tactical[(tactical_screen_width-1)-loop2] = -PT_Tactical[loop2];
Tactical_Vector_Distance[loop2] = (32/cos((PIdiv2)-angle));
Tactical_Vector_Distance[(tactical_screen_width-1)-loop2] = Tactical_Vector_Distance[loop2];
scanline += 1.0;
}
}
void Calculate_main_Tables()
{
float angle,scanline,move,main_scaling_factor; /* trig & div table calc variables */
float c,sn,ang,vx,vz,a1,PI = 3.141592654,toround; /* perspective lookup variables */
float x1,y1,x2,y2,xa,ya,xg,yg; /* floor data table calc variables */
float rotate_angle,move2,gradient;
float PIdiv2 = PI/2.0;
float PIdiv180 = PI/180.0;
float PIdiv180div09375 = (PI/180.0)/0.09375;
int loop2;
/* Set up floor table */
/*PIdiv180 = PI/180.0;
PIdiv2 = PI/2.0;
PIdiv180div09375 = (PI/180.0)/0.09375;*/
/* precalc cos & sin values */
for (rotate_position = 0; rotate_position < 121; rotate_position++)
{
rotate_angle = rotate_position * (3*(PIdiv180));
rotate_cos[rotate_position] = cos(rotate_angle);
rotate_sin[rotate_position] = sin(rotate_angle);
int_rotate_cos[rotate_position] = (int)((cos(rotate_angle))*65536);
int_rotate_sin[rotate_position] = (int)((sin(rotate_angle))*65536);
}
main_scaling_factor = main_screen_height>>1;
main_scaling_factor = (main_scaling_factor*1.3)/120.0;
main_scale_factor = (int)(main_scaling_factor * 65536);
main_scaling_factor = main_scaling_factor*8192.0;
/*proj_angle = tan(0.4636476091);*/
for (loop2= 1; loop2 < ((main_screen_height/2)+1); loop2++)
{
/* calculate z distances from raster lines on screen*/
move = (main_scaling_factor)/loop2;
/* calculate intercepts for x1,y1 & x2,y2 co-ordinates */
for (rotate_position = 120; rotate_position < 121; rotate_position++)
{
xa = -move*0.5;
ya = move;
x1 = (xa * rotate_cos[rotate_position])-(ya * rotate_sin[rotate_position]);
y1 = (xa * rotate_sin[rotate_position])+(ya * rotate_cos[rotate_position]);
xa = move*0.5;
ya = move;
x2 = (xa * rotate_cos[rotate_position])-(ya * rotate_sin[rotate_position]);
y2 = (xa * rotate_sin[rotate_position])+(ya * rotate_cos[rotate_position]);
xg = (x2-x1)/main_screen_width;
yg = (y2-y1)/main_screen_width;
/* store results in array */
main_Floor_Data[120-rotate_position][loop2-1][0] = (int)(x1*65536);
/*Floor_Data[120-rotate_position][loop2-1][0] = Floor_Data[120-rotate_position][loop2-1][0]&4194303;*/
main_Floor_Data[120-rotate_position][loop2-1][1] = (int)(y1*65536);
/*Floor_Data[120-rotate_position][loop2-1][1] = Floor_Data[120-rotate_position][loop2-1][1]&4194303;
Floor_Data[120-rotate_position][loop2-1][0] -= Floor_Data[120-rotate_position][loop2-1][1]<<6;*/
main_Floor_Data[120-rotate_position][loop2-1][2] = (int)(xg*65536);
main_Floor_Data[120-rotate_position][loop2-1][3] = (int)(yg*65536);
/*Floor_Data[120-rotate_position][loop2-1][2] = (int)((xg)*65536);*/
}
}
PIdiv2 = PI/2.0;
PIdiv180div09375 = (PI/180.0)/0.09375;
/* Set up angle casting tables & vector direction offsets */
ang = 270*(PIdiv180);
c = cos(ang);
sn = sin(ang);
scanline = -(main_screen_width/2);
for (loop2=0; loop2<(main_screen_width>>1); loop2++)
{
/* Eddie's transform */
vx = (scanline*c) + (main_screen_width * sn);
vz = (main_screen_width*c) - (scanline*sn);
angle = atan(vx/vz);
toround = (angle/PIdiv180)/0.09375;
PT_main[loop2] = toround;
main_view_cos_table[loop2] = (int)((cos((PIdiv2)-angle))*262144);
main_view_cos_table[(main_screen_width-1)-loop2] = (int)((cos(-((PIdiv2)-angle)))*262144);
if ((toround - PT_main[loop2]) > 0.5)
{
PT_main[loop2] += 1;
}
PT_main[loop2] = 960-PT_main[loop2];
PT_main[(main_screen_width-1)-loop2] = -PT_main[loop2];
main_Vector_Distance[loop2] = (32/cos((PIdiv2)-angle));
main_Vector_Distance[(main_screen_width-1)-loop2] = main_Vector_Distance[loop2];
scanline += 1.0;
}
}
void Calculate_Tables()
{
float angle,scanline,move,scaling_factor; /* trig & div table calc variables */
float c,sn,ang,vx,vz,a1,PI = 3.141592654,toround; /* perspective lookup variables */
float x1,y1,x2,y2,xa,ya,xg,yg; /* floor data table calc variables */
float rotate_angle,move2,gradient;
float PIdiv2 = PI/2.0;
float PIdiv180 = PI/180.0;
float PIdiv180div09375 = (PI/180.0)/0.09375;
int loop2;
/* Set up floor table */
/*PIdiv180 = PI/180.0;
PIdiv2 = PI/2.0;
PIdiv180div09375 = (PI/180.0)/0.09375;*/
/* precalc cos & sin values */
for (rotate_position = 0; rotate_position < 121; rotate_position++)
{
rotate_angle = rotate_position * (3*(PIdiv180));
rotate_cos[rotate_position] = cos(rotate_angle);
rotate_sin[rotate_position] = sin(rotate_angle);
int_rotate_cos[rotate_position] = (int)((cos(rotate_angle))*65536);
int_rotate_sin[rotate_position] = (int)((sin(rotate_angle))*65536);
}
scaling_factor = screen_height>>1;
scaling_factor = (scaling_factor*1.3)/120.0;
scale_factor = (int)(scaling_factor * 65536);
scaling_factor = scaling_factor*8192.0;
/*proj_angle = tan(0.4636476091);*/
for (loop2= 1; loop2 < ((screen_height/2)+1); loop2++)
{
/* calculate z distances from raster lines on screen*/
move = (scaling_factor)/loop2;
/* calculate intercepts for x1,y1 & x2,y2 co-ordinates */
for (rotate_position = 120; rotate_position < 121; rotate_position++)
{
xa = -move*0.5;
ya = move;
x1 = (xa * rotate_cos[rotate_position])-(ya * rotate_sin[rotate_position]);
y1 = (xa * rotate_sin[rotate_position])+(ya * rotate_cos[rotate_position]);
xa = move*0.5;
ya = move;
x2 = (xa * rotate_cos[rotate_position])-(ya * rotate_sin[rotate_position]);
y2 = (xa * rotate_sin[rotate_position])+(ya * rotate_cos[rotate_position]);
xg = (x2-x1)/screen_width;
yg = (y2-y1)/screen_width;
/* store results in array */
Floor_Data[120-rotate_position][loop2-1][0] = (int)(x1*65536);
/*Floor_Data[120-rotate_position][loop2-1][0] = Floor_Data[120-rotate_position][loop2-1][0]&4194303;*/
Floor_Data[120-rotate_position][loop2-1][1] = (int)(y1*65536);
/*Floor_Data[120-rotate_position][loop2-1][1] = Floor_Data[120-rotate_position][loop2-1][1]&4194303;
Floor_Data[120-rotate_position][loop2-1][0] -= Floor_Data[120-rotate_position][loop2-1][1]<<6;*/
Floor_Data[120-rotate_position][loop2-1][2] = (int)(xg*65536);
Floor_Data[120-rotate_position][loop2-1][3] = (int)(yg*65536);
/*Floor_Data[120-rotate_position][loop2-1][2] = (int)((xg)*65536);*/
}
}
PIdiv2 = PI/2.0;
PIdiv180div09375 = (PI/180.0)/0.09375;
/* Set up angle casting tables & vector direction offsets */
ang = 270*(PIdiv180);
c = cos(ang);
sn = sin(ang);
scanline = -(screen_width/2);
for (loop2=0; loop2<(screen_width>>1); loop2++)
{
/* Eddie's transform */
vx = (scanline*c) + (screen_width * sn);
vz = (screen_width*c) - (scanline*sn);
angle = atan(vx/vz);
toround = (angle/PIdiv180)/0.09375;
PT_EDDIE[loop2] = toround;
view_cos_table[loop2] = (int)((cos((PIdiv2)-angle))*262144);
view_cos_table[(screen_width-1)-loop2] = (int)((cos(-((PIdiv2)-angle)))*262144);
if ((toround - PT_EDDIE[loop2]) > 0.5)
{
PT_EDDIE[loop2] += 1;
}
PT_EDDIE[loop2] = 960-PT_EDDIE[loop2];
PT_EDDIE[(screen_width-1)-loop2] = -PT_EDDIE[loop2];
Vector_Distance[loop2] = (32/cos((PIdiv2)-angle));
Vector_Distance[(screen_width-1)-loop2] = Vector_Distance[loop2];
scanline += 1.0;
}
}
void Read_Keys()
{
Map_Data[X>>22][Y>>22] = 0;
/* read keyboard inputs scan for SHIFT */
registers.r[0] = 129;
registers.r[1] = -1;
registers.r[2] = 255;
os_swi(6, point_registers); /* OS_Byte */
if ((registers.r[1] == 255) && (registers.r[2] == 255))
{
Floor_On_Off++;
if (Floor_On_Off == 2)
{
Floor_On_Off = 0;
}
}
/* read keyboard inputs scan for RETURN */
registers.r[0] = 129;
registers.r[1] = -74;
registers.r[2] = 255;
os_swi(6, point_registers); /* OS_Byte */
if ((registers.r[1] == 255) && (registers.r[2] == 255))
{
Weapon_Active = 1;
if (State_Counter == 0)
{
State_Counter=1;
}
}
/* read keyboard inputs scan for F1 */
registers.r[0] = 129;
registers.r[1] = -114;
registers.r[2] = 255;
os_swi(6, point_registers); /* OS_Byte */
if ((registers.r[1] == 255) && (registers.r[2] == 255))
{
Weapon_Type++;
if (Weapon_Type == 4)
{
Weapon_Type = 0;
}
/* Load weapondata into sprite_data space */
registers.r[0] = 255;
if (Weapon_Type == Chainsaw)
{
registers.r[1] = (int)Chainsaw_name;
}
else if (Weapon_Type == Grenade)
{
registers.r[1] = (int)Grenade_name;
}
else if (Weapon_Type == Chaingun)
{
registers.r[1] = (int)Chaingun_name;
}
else
{
registers.r[1] = (int)MGun_name;
}
registers.r[2] = (int)&weapon_data[0];
registers.r[3] = 0;
os_swi(8, point_registers); /* OS_File */
/* play Weapon sample */
registers.r[0] = 0;
registers.r[1] = 29;
if (Weapon_Type == Chainsaw)
{
registers.r[2] = Weapon_1;
}
else if (Weapon_Type == Grenade)
{
registers.r[2] = Weapon_2;
}
else if (Weapon_Type == Chaingun)
{
registers.r[2] = Weapon_4;
}
else
{
registers.r[2] = Weapon_3;
}
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
os_swi(284806, point_registers); /* Dsym */
}
/* read keyboard inputs scan for F2 */
registers.r[0] = 129;
registers.r[1] = -115;
registers.r[2] = 255;
os_swi(6, point_registers); /* OS_Byte */
if ((registers.r[1] == 255) && (registers.r[2] == 255))
{
/*colour_red++;
if (colour_red > 255)
{
colour_red = 0;
}*/
Map_Magnification++;
}
/* read keyboard inputs scan for F3 */
registers.r[0] = 129;
registers.r[1] = -116;
registers.r[2] = 255;
os_swi(6, point_registers); /* OS_Byte */
if ((registers.r[1] == 255) && (registers.r[2] == 255))
{
colour_green++;
if (colour_green > 255)
{
colour_green = 0;
}
}
/* read keyboard inputs scan for F4 */
registers.r[0] = 129;
registers.r[1] = -21;
registers.r[2] = 255;
os_swi(6, point_registers); /* OS_Byte */
if ((registers.r[1] == 255) && (registers.r[2] == 255))
{
/*colour_blue++;
if (colour_blue > 255)
{
colour_blue = 0;
}*/
Map_Magnification--;
}
/* read keyboard inputs scan for F5 */
registers.r[0] = 129;
registers.r[1] = -117;
registers.r[2] = 255;
os_swi(6, point_registers); /* OS_Byte */
if ((registers.r[1] == 255) && (registers.r[2] == 255))
{
/* draw screen border */
if (Screen_Mode == VGA)
{
DrawBorderVGA((screen_vars[0]),screen_width,screen_height,(int)&Backdrop[0]);
DrawBorderVGA((screen_vars[0]+153600),screen_width,screen_height,(int)&Backdrop[0]);
}
else
{
if (Tasking_Mode == Single)
{
DrawBorder((screen_vars[0]),screen_width,screen_height,(int)&Backdrop[0]);
DrawBorder((screen_vars[0]+81920),screen_width,screen_height,(int)&Backdrop[0]);
}
else
{
DrawBorder(virtual_screen_pointer,screen_width,screen_height,(int)&Backdrop[0]);
}
}
Play_Mode = Full_Screen;
/* play Player sample */
registers.r[0] = 1;
registers.r[1] = 29;
registers.r[2] = Player_1;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
os_swi(284806, point_registers); /* Dsym */
}
/* read keyboard inputs scan for F6 */
registers.r[0] = 129;
registers.r[1] = -118;
registers.r[2] = 255;
os_swi(6, point_registers); /* OS_Byte */
if ((registers.r[1] == 255) && (registers.r[2] == 255))
{
/* draw screen border */
if (Screen_Mode == VGA)
{
DrawBorderVGA((screen_vars[0]),tactical_screen_width,tactical_screen_height,(int)&Backdrop[0]);
DrawBorderVGA((screen_vars[0]+153600),tactical_screen_width,tactical_screen_height,(int)&Backdrop[0]);
}
else
{
if (Tasking_Mode == Single)
{
DrawBorder((screen_vars[0]),tactical_screen_width,tactical_screen_height,(int)&Backdrop[0]);
DrawBorder((screen_vars[0]+81920),tactical_screen_width,tactical_screen_height,(int)&Backdrop[0]);
}
else
{
DrawBorder(virtual_screen_pointer,tactical_screen_width,tactical_screen_height,(int)&Backdrop[0]);
}
}
Play_Mode = Tactical_Map;
/* play Player sample */
registers.r[0] = 1;
registers.r[1] = 29;
registers.r[2] = Player_2;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
os_swi(284806, point_registers); /* Dsym */
}
/* read keyboard inputs scan for F7 */
registers.r[0] = 129;
registers.r[1] = -119;
registers.r[2] = 255;
os_swi(6, point_registers); /* OS_Byte */
if ((registers.r[1] == 255) && (registers.r[2] == 255))
{
/* draw screen border */
if (Screen_Mode == VGA)
{
DrawBorderVGA((screen_vars[0]),main_screen_width,main_screen_height,(int)&Backdrop[0]);
DrawBorderVGA((screen_vars[0]+153600),main_screen_width,main_screen_height,(int)&Backdrop[0]);
}
else
{
if (Tasking_Mode == Single)
{
DrawBorder((screen_vars[0]),main_screen_width,main_screen_height,(int)&Backdrop[0]);
DrawBorder((screen_vars[0]+81920),main_screen_width,main_screen_height,(int)&Backdrop[0]);
}
else
{
DrawBorder(virtual_screen_pointer,main_screen_width,main_screen_height,(int)&Backdrop[0]);
}
}
Play_Mode = Main_Player;
/* play Player sample */
registers.r[0] = 1;
registers.r[1] = 29;
registers.r[2] = Player_3;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
os_swi(284806, point_registers); /* Dsym */
}
/* read keyboard inputs scan for F8 */
registers.r[0] = 129;
registers.r[1] = -120;
registers.r[2] = 255;
os_swi(6, point_registers); /* OS_Byte */
if ((registers.r[1] == 255) && (registers.r[2] == 255))
{
/* show loading screen */
registers.r[0] = (int)saving_name;
os_swi(5, point_registers); /* OS_CLI */
}
/* read keyboard inputs scan for D */
registers.r[0] = 129;
registers.r[1] = -51;
registers.r[2] = 255;
os_swi(6, point_registers); /* OS_Byte */
if (((registers.r[1] == 255) && (registers.r[2] == 255))||((BB_Value & 16) == 16))
{
/* set black box value */
if (BB_Flag == 0)
{
BB_Value += 16;
}
X = X + ((x_move_table[direction_angle]>>3)<<FastMode);
Y = Y - ((y_move_table[direction_angle]>>3)<<FastMode);
if ((X & 4194303) > 2621440 && map[(X>>22)+1][Y>>22] != 0)
{
X = X - (X & 4194303) + 2621440;
}
else if ((X & 4194303) < 1572864 && map[(X>>22)-1][Y>>22] != 0)
{
X = X - (X & 4194303) + 1572864;
}
if ((Y & 4194303) > 2621440 && map[X>>22][(Y>>22)+1] != 0)
{
Y = Y - (Y & 4194303) + 2621440;
}
else if ((Y & 4194303) < 1572864 && map[X>>22][(Y>>22)-1] != 0)
{
Y = Y - (Y & 4194303) + 1572864;
}
}
/* read keyboard inputs scan for C */
registers.r[0] = 129;
registers.r[1] = -83;
registers.r[2] = 255;
os_swi(6, point_registers); /* OS_Byte */
if (((registers.r[1] == 255) && (registers.r[2] == 255))||((BB_Value & 8) == 8))
{
/* set black box value */
if (BB_Flag == 0)
{
BB_Value += 8;
}
X = X - ((x_move_table[direction_angle]>>3)<<FastMode);
Y = Y + ((y_move_table[direction_angle]>>3)<<FastMode);
if ((X & 4194303) > 2621440 && map[(X>>22)+1][Y>>22] != 0)
{
X = X - (X & 4194303) + 2621440;
}
else if ((X & 4194303) < 1572864 && map[(X>>22)-1][Y>>22] != 0)
{
X = X - (X & 4194303) + 1572864;
}
if ((Y & 4194303) > 2621440 && map[X>>22][(Y>>22)+1] != 0)
{
Y = Y - (Y & 4194303) + 2621440;
}
else if ((Y & 4194303) < 1572864 && map[X>>22][(Y>>22)-1] != 0)
{
Y = Y - (Y & 4194303) + 1572864;
}
}
/* read keyboard inputs scan for A */
registers.r[0] = 129;
registers.r[1] = -66;
registers.r[2] = 255;
os_swi(6, point_registers); /* OS_Byte */
if (((registers.r[1] == 255) && (registers.r[2] == 255))||((BB_Value & 4) == 4))
{
/* set black box value */
if (BB_Flag == 0)
{
BB_Value += 4;
}
if (Left_Rotation_Counter < 5)
{
Rotation_Value = 4;
}
else if (Left_Rotation_Counter < 10)
{
Rotation_Value = 8;
}
else if (Left_Rotation_Counter < 20)
{
Rotation_Value = 12;
}
else if (Left_Rotation_Counter < 30)
{
Rotation_Value = 16;
}
else if (Left_Rotation_Counter < 40)
{
Rotation_Value = 20;
}
else if (Left_Rotation_Counter < 80)
{
Rotation_Value = 24;
}
else
{
Rotation_Value = 32;
}
direction_angle = direction_angle - (Rotation_Value<<FastMode);
if (direction_angle < 0)
{
direction_angle = 3840 + direction_angle;
}
Left_Rotation_Counter++;
}
else
{
Left_Rotation_Counter = 0;
}
/* read keyboard inputs scan for S */
registers.r[0] = 129;
registers.r[1] = -82;
registers.r[2] = 255;
os_swi(6, point_registers); /* OS_Byte */
if (((registers.r[1] == 255) && (registers.r[2] == 255))||((BB_Value & 2) == 2))
{
/* set black box value */
if (BB_Flag == 0)
{
BB_Value += 2;
}
if (Right_Rotation_Counter < 5)
{
Rotation_Value = 4;
}
else if (Right_Rotation_Counter < 10)
{
Rotation_Value = 8;
}
else if (Right_Rotation_Counter < 20)
{
Rotation_Value = 12;
}
else if (Right_Rotation_Counter < 30)
{
Rotation_Value = 16;
}
else if (Right_Rotation_Counter < 40)
{
Rotation_Value = 20;
}
else if (Right_Rotation_Counter < 80)
{
Rotation_Value = 24;
}
else
{
Rotation_Value = 32;
}
direction_angle = direction_angle + (Rotation_Value<<FastMode);
if (direction_angle > 3839)
{
direction_angle = direction_angle - 3840;
}
Right_Rotation_Counter++;
}
else
{
Right_Rotation_Counter = 0;
}
/* read keyboard inputs scan for P */
registers.r[0] = 129;
registers.r[1] = -56;
registers.r[2] = 255;
os_swi(6, point_registers); /* OS_Byte */
if ((registers.r[1] == 255) && (registers.r[2] == 255))
{
/*X=240<<16;
Y=240<<16;
direction_angle = 0;
Black_Box[0] = BB_Pointer;
BB_Flag = 1;
BB_Pointer = 0;*/
/* Save black box data */
/*registers.r[0] = 10;
registers.r[1] = (int)blackbox_name;
registers.r[2] = 0;
registers.r[3] = 0;
registers.r[4] = (int)&Black_Box[0];
registers.r[5] = ((int)&Black_Box[0])+40960;
os_swi(8, point_registers);*/ /* OS_File */
/* play Player sample */
registers.r[0] = 1;
registers.r[1] = 29;
registers.r[2] = On;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
os_swi(284806, point_registers); /* Dsym */
Resize_Screen();
Calculate_Tables();
/* play Player sample */
registers.r[0] = 1;
registers.r[1] = 29;
registers.r[2] = Off;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
os_swi(284806, point_registers); /* Dsym */
}
/* read keyboard inputs scan for SPACE */
registers.r[0] = 129;
registers.r[1] = -99;
registers.r[2] = 255;
os_swi(6, point_registers); /* OS_Byte */
if (((registers.r[1] == 255) && (registers.r[2] == 255))||((BB_Value & 1) == 1))
{
/* set black box value */
if (BB_Flag == 0)
{
BB_Value += 1;
}
/* if facing forwards, check in right direction */
if (direction_angle >= 3360||direction_angle < 480)
{
/* check if door exists in forwards direction */
if (map[(X>>22)+1][(Y>>22)] == door_code)
{
/* check if doors are active */
if ((door_active[0] == 0)&(door_map[(X>>22)+1][(Y>>22)] == 0))
{
/* if not, assign door active & stuff */
door_active[0] = 1;
door_frame_counter[0] = 0;
door_position[0][0] = (X>>22)+1;
door_position[0][1] = (Y>>22);
/* play door opening sample */
registers.r[0] = 0;
registers.r[1] = 10;
registers.r[2] = 4;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
/*os_swi(284806, point_registers);*/ /* Dsym */
}
else if ((door_active[1] == 0)&(door_map[(X>>22)+1][(Y>>22)] == 0))
{
door_active[1] = 1;
door_frame_counter[1] = 0;
door_position[1][0] = (X>>22)+1;
door_position[1][1] = (Y>>22);
/* play door opening sample */
registers.r[0] = 0;
registers.r[1] = 10;
registers.r[2] = 4;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
/*os_swi(284806, point_registers);*/ /* Dsym */
}
}
}
else if (direction_angle >= 480&&direction_angle < 1440)
{
/* check if door exists in backwards direction */
if (map[(X>>22)][(Y>>22)-1] == door_code)
{
/* check if doors are active */
if ((door_active[0] == 0)&(door_map[(X>>22)][(Y>>22)-1] == 0))
{
/* if not, assign door active & stuff */
door_active[0] = 1;
door_frame_counter[0] = 0;
door_position[0][0] = (X>>22);
door_position[0][1] = (Y>>22)-1;
/* play door opening sample */
registers.r[0] = 0;
registers.r[1] = 10;
registers.r[2] = 4;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
/*os_swi(284806, point_registers);*/ /* Dsym */
}
else if ((door_active[1] == 0)&(door_map[(X>>22)][(Y>>22)-1] == 0))
{
door_active[1] = 1;
door_frame_counter[1] = 0;
door_position[1][0] = (X>>22);
door_position[1][1] = (Y>>22)-1;
/* play door opening sample */
registers.r[0] = 0;
registers.r[1] = 10;
registers.r[2] = 4;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
/*os_swi(284806, point_registers);*/ /* Dsym */
}
}
}
else if (direction_angle >= 1440&&direction_angle < 2400)
{
/* check if door exists in left direction */
if (map[(X>>22)-1][(Y>>22)] == door_code)
{
/* check if doors are active and if door is closed */
if ((door_active[0] == 0)&(door_map[(X>>22)-1][(Y>>22)] == 0))
{
/* if not, assign door active & stuff */
door_active[0] = 1;
door_frame_counter[0] = 0;
door_position[0][0] = (X>>22)-1;
door_position[0][1] = (Y>>22);
/* play door opening sample */
registers.r[0] = 0;
registers.r[1] = 10;
registers.r[2] = 4;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
/*os_swi(284806, point_registers);*/ /* Dsym */
}
else if ((door_active[1] == 0)&(door_map[(X>>22)-1][(Y>>22)] == 0))
{
door_active[1] = 1;
door_frame_counter[1] = 0;
door_position[1][0] = (X>>22)-1;
door_position[1][1] = (Y>>22);
/* play door opening sample */
registers.r[0] = 0;
registers.r[1] = 10;
registers.r[2] = 4;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
/*os_swi(284806, point_registers);*/ /* Dsym */
}
}
}
else if (direction_angle >= 2400&&direction_angle < 3360)
{
/* check if door exists in upwards direction */
if (map[(X>>22)][(Y>>22)+1] == door_code)
{
/* check if doors are active & if door is closed */
if ((door_active[0] == 0)&(door_map[(X>>22)][(Y>>22)+1] == 0))
{
/* if not, assign door active & stuff */
door_active[0] = 1;
door_frame_counter[0] = 0;
door_position[0][0] = (X>>22);
door_position[0][1] = (Y>>22)+1;
/* play door opening sample */
registers.r[0] = 0;
registers.r[1] = 10;
registers.r[2] = 4;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
/*os_swi(284806, point_registers);*/ /* Dsym */
}
else if ((door_active[1] == 0)&(door_map[(X>>22)][(Y>>22)+1] == 0))
{
door_active[1] = 1;
door_frame_counter[1] = 0;
door_position[1][0] = (X>>22);
door_position[1][1] = (Y>>22)+1;
/* play door opening sample */
registers.r[0] = 0;
registers.r[1] = 10;
registers.r[2] = 4;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
/*os_swi(284806, point_registers);*/ /* Dsym */
}
}
}
}
Map_Data[X>>22][Y>>22] = 255;
}
void RayCastScene(int Xb,int Yb,int angle_of_player,int screen_addr,int players,int *Perspective_Array,int scale_factor,int current_screen_width,int current_screen_height,int *current_view_cos_table)
{
const int map_x_max = (63*64)<<16;
const int map_x_min = 0;
const int map_y_max = (63*64)<<16;
const int map_y_min = 0;
float move,move2,move3;
int ScanLine,height,Xa,Ya;
int viewing_angle,offset_angleX,offset_angleY;
int x_position,x_intercept,y_intercept;
int y_position,x_distance,y_distance;
int initial_x_intercept,initial_y_intercept,quadrant;
int x_door_hit,y_door_hit,door_intercept,x_door_offset,y_door_offset;
int Plot_Block[20];
int last_intercept = 0, Inner_Four;
int smallest_height = 1<<26;
int Big_X,Big_Y,X_sprite_distance,Y_sprite_distance;
Big_X = Xb>>14;
Big_Y = Yb>>14;
Plot_Block[6] = players;
Xa = Xb>>16;
/* round Xa */
/*if ((Xb-(Xa<<16)) > 32767)
{
Xa++;
}*/
Ya = Yb>>16;
/* round Ya */
/*if ((Yb-(Ya<<16)) > 32767)
{
Ya++;
}*/
Xb = Xa<<16;
Yb = Ya<<16;
for (ScanLine = 0; ScanLine < current_screen_width; ScanLine++)
{
/* viewing_angle = angle_of_player - (PT_EDDIE[ScanLine]);*/
viewing_angle = angle_of_player - (Perspective_Array[ScanLine]);
if (viewing_angle<0)
{
viewing_angle = viewing_angle + 3840;
}
if (viewing_angle>3839)
{
viewing_angle = viewing_angle - 3840;
}
/* compute quadrant of ray */
if ((viewing_angle>=0)&(viewing_angle<960))
{
quadrant = 0;
}
else if ((viewing_angle>959)&(viewing_angle<1920))
{
quadrant = 1;
}
else if ((viewing_angle>1919)&(viewing_angle<2880))
{
quadrant = 2;
}
else if ((viewing_angle>2879)&(viewing_angle<3840))
{
quadrant = 3;
}
offset_angleY = viewing_angle - (quadrant * 960);
offset_angleX = 960-offset_angleY;
x_intercept = 0;
y_intercept = 0;
x_door_hit = 0;
y_door_hit = 0;
x_distance = (5120<<16);
y_distance = (5120<<16);
/* compute initial x & y intercepts for current ray */
if (quadrant == 3)
{
/* x intercept on right & bottom side of squares */
/*initial_y_intercept = (Big_Y<<14)+(((256-(Big_X & 255))*tan_table[offset_angleX])>>2);
initial_x_intercept = (Big_X<<14)+(((256-(Big_Y & 255))*tan_table[offset_angleY])>>2);*/
initial_y_intercept = (Yb)+((64-(Xa & 63))*tan_table[offset_angleX]);
initial_x_intercept = (Xb)+((64-(Ya & 63))*tan_table[offset_angleY]);
if ((Ya & 65535) > 32767)
{
Ya += 65536;
}
if ((Xa & 65535) > 32767)
{
Xa += 65536;
}
if ((initial_x_intercept < map_x_max)&((viewing_angle != 0)&(viewing_angle != 1920)))
{
/* fire x ray & test for intersections */
y_position = ((Ya>>6)+1);
x_intercept = map[initial_x_intercept>>22][y_position];
if (x_intercept != 0)
{
if (x_intercept == door_code)
{
door_intercept = initial_x_intercept; /*preserve initial intercept val */
if (door_map[initial_x_intercept>>22][y_position] == Secret_Door_Code)
{
/* check if door is moving in y direction */
if (Secret_Door_Orientation < 4)
{
/* find magnitude of x offset */
x_door_offset = Secret_Door_Position * tan_table[viewing_angle-2880];
door_intercept = (x_door_offset>>16) + ((initial_x_intercept >> 16) & 63);
/* if interception exceeds bounds of door resume tracing */
if (door_intercept > 63)
{
x_intercept = 0;
}
else
{
x_door_hit = 2;
initial_x_intercept += x_door_offset;
}
}
}
else
{
x_door_hit = 1;
initial_x_intercept = initial_x_intercept + (increment[offset_angleY]>>1);
/* if door is open... */
if (door_map[initial_x_intercept>>22][y_position] != 0)
{
if (door_map[door_intercept>>22][y_position] >= ((initial_x_intercept>>16) & 63))
{
x_door_hit = 0;
x_intercept = 0;
initial_x_intercept = door_intercept;
}
else
{
initial_x_intercept -= ((door_map[door_intercept>>22][y_position]+1)<<16);
}
}
}
}
else
{
if (x_intercept < 256)
{
if (Sprite_Plot_Block[1] > 960)
{
Sprite_Plot_Block[1] = ScanLine+((320-current_screen_width)>>1);
Sprite_Plot_Block[2] = Sprite_Plot_Block[1];
X_sprite_distance = (Sprite_List[0].sprite_position_x - Xb);
Y_sprite_distance = (Sprite_List[0].sprite_position_y - Yb);
if (X_sprite_distance == 0)
{
X_sprite_distance = 1;
}
if (Y_sprite_distance == 0)
{
Y_sprite_distance = 1;
}
move = Y_sprite_distance;
move2 =X_sprite_distance;
move = move/move2;
Sprite_Plot_Block[5] = (atan(move)/1.63624617374E-03);
move = atan(move);
Sprite_Plot_Block[5] = (((960-(direction_angle - 2880)) - Sprite_Plot_Block[5])/2)+160;
if (move == 0.0)
{
move = 0.1;
}
Y_sprite_distance = move2/cos(move);
Sprite_Plot_Block[3] = (64<<14)/(Y_sprite_distance>>10);
Sprite_Plot_Block[3] = (Sprite_Plot_Block[3] * scale_factor);
Sprite_Plot_Block[3] = Sprite_Plot_Block[3]>>16;
if (Sprite_Plot_Block[3] > (240))
{
Sprite_Plot_Block[3] = 240;
}
Sprite_Plot_Block[4] = (128<<20)/Sprite_Plot_Block[3];
}
else
{
Sprite_Plot_Block[2]++;
}
x_intercept = 0;
}
}
}
while (((initial_x_intercept < map_x_max)&(y_position < (map_y_max>>22)))&(x_intercept == 0))
{
y_position = y_position + 1;
initial_x_intercept = initial_x_intercept + increment[offset_angleY];
x_intercept = map[initial_x_intercept>>22][y_position];
if (x_intercept != 0)
{
if (x_intercept == door_code)
{
door_intercept = initial_x_intercept; /*preserve initial intercept val */
if (door_map[initial_x_intercept>>22][y_position] == Secret_Door_Code)
{
/* check if door is moving in y direction */
if (Secret_Door_Orientation < 4)
{
/* find magnitude of x offset */
x_door_offset = Secret_Door_Position * tan_table[viewing_angle-2880];
door_intercept = (x_door_offset>>16) + ((initial_x_intercept >> 16) & 63);
/* if interception exceeds bounds of door resume tracing */
if (door_intercept > 63)
{
x_intercept = 0;
}
else
{
x_door_hit = 2;
initial_x_intercept += x_door_offset;
}
}
}
else
{
x_door_hit = 1;
initial_x_intercept = initial_x_intercept + (increment[offset_angleY]>>1);
/* if door is open... */
if (door_map[initial_x_intercept>>22][y_position] != 0)
{
if (door_map[door_intercept>>22][y_position] >= ((initial_x_intercept>>16) & 63))
{
x_door_hit = 0;
x_intercept = 0;
initial_x_intercept = door_intercept;
}
else
{
initial_x_intercept -= ((door_map[door_intercept>>22][y_position]+1)<<16);
}
}
}
}
else
{
if (x_intercept < 256)
{
if (Sprite_Plot_Block[1] > 960)
{
Sprite_Plot_Block[1] = ScanLine+((320-current_screen_width)>>1);
Sprite_Plot_Block[2] = Sprite_Plot_Block[1];
X_sprite_distance = (Sprite_List[0].sprite_position_x - Xb);
Y_sprite_distance = (Sprite_List[0].sprite_position_y - Yb);
if (X_sprite_distance == 0)
{
X_sprite_distance = 1;
}
if (Y_sprite_distance == 0)
{
Y_sprite_distance = 1;
}
move = Y_sprite_distance;
move2 =X_sprite_distance;
move = move/move2;
Sprite_Plot_Block[5] = (atan(move)/1.63624617374E-03);
move = atan(move);
Sprite_Plot_Block[5] = (((960-(direction_angle - 2880)) - Sprite_Plot_Block[5])/2)+160;
if (move == 0.0)
{
move = 0.1;
}
Y_sprite_distance = move2/cos(move);
Sprite_Plot_Block[3] = (64<<14)/(Y_sprite_distance>>10);
Sprite_Plot_Block[3] = (Sprite_Plot_Block[3] * scale_factor);
Sprite_Plot_Block[3] = Sprite_Plot_Block[3]>>16;
if (Sprite_Plot_Block[3] > (240))
{
Sprite_Plot_Block[3] = 240;
}
Sprite_Plot_Block[4] = (128<<20)/Sprite_Plot_Block[3];
}
else
{
Sprite_Plot_Block[2]++;
}
x_intercept = 0;
}
}
}
}
}
if ((initial_y_intercept < map_y_max)&&((viewing_angle != 960)&(viewing_angle != 2880)))
{
/* fire y ray & test for intersections */
x_position = ((Xa>>6)+1);
y_intercept = map[x_position][initial_y_intercept>>22];
if (y_intercept != 0)
{
if (y_intercept == door_code)
{
door_intercept = initial_y_intercept; /*preserve initial intercept val */
if (door_map[x_position][initial_y_intercept>>22] == Secret_Door_Code)
{
/* check if door is moving in y direction */
if (Secret_Door_Orientation > 2)
{
/* find magnitude of y offset */
y_door_offset = Secret_Door_Position * tan_table[960-(viewing_angle-2880)];
door_intercept = (y_door_offset>>16) + ((initial_y_intercept >> 16) & 63);
/* if interception exceeds bounds of door resume tracing */
if (door_intercept > 63)
{
y_intercept = 0;
}
else
{
y_door_hit = 2;
initial_y_intercept += y_door_offset;
}
}
}
else
{
y_door_hit = 1;
initial_y_intercept = initial_y_intercept + (increment[offset_angleX]>>1);
/* if door is open... */
if (door_map[x_position][initial_y_intercept>>22] != 0)
{
if (door_map[x_position][initial_y_intercept>>22] >= ((initial_y_intercept>>16) & 63))
{
y_door_hit = 0;
y_intercept = 0;
initial_y_intercept = door_intercept;
}
else
{
initial_y_intercept -= ((door_map[x_position][door_intercept>>22]+1)<<16);
}
}
}
}
else
{
if (y_intercept < 256)
{
if (Sprite_Plot_Block[1] > 960)
{
Sprite_Plot_Block[1] = ScanLine+((320-current_screen_width)>>1);
Sprite_Plot_Block[2] = Sprite_Plot_Block[1];
X_sprite_distance = (Sprite_List[0].sprite_position_x - Xb);
Y_sprite_distance = (Sprite_List[0].sprite_position_y - Yb);
if (X_sprite_distance == 0)
{
X_sprite_distance = 1;
}
if (Y_sprite_distance == 0)
{
Y_sprite_distance = 1;
}
move = Y_sprite_distance;
move2 =X_sprite_distance;
move = move/move2;
Sprite_Plot_Block[5] = (atan(move)/1.63624617374E-03);
move = atan(move);
Sprite_Plot_Block[5] = (((960-(direction_angle - 2880)) - Sprite_Plot_Block[5])/2)+160;
if (Y_sprite_distance == 0)
{
Y_sprite_distance = 1;
}
Y_sprite_distance = move2/cos(move);
Sprite_Plot_Block[3] = (64<<14)/(Y_sprite_distance>>10);
Sprite_Plot_Block[3] = (Sprite_Plot_Block[3] * scale_factor);
Sprite_Plot_Block[3] = Sprite_Plot_Block[3]>>16;
if (Sprite_Plot_Block[3] > (240))
{
Sprite_Plot_Block[3] = 240;
}
Sprite_Plot_Block[4] = (128<<20)/Sprite_Plot_Block[3];
}
else
{
Sprite_Plot_Block[2]++;
}
y_intercept = 0;
}
}
}
while (((initial_y_intercept < map_y_max)&(x_position < (map_x_max>>22)))&(y_intercept == 0))
{
x_position = x_position + 1;
initial_y_intercept = initial_y_intercept + increment[offset_angleX];
y_intercept = map[x_position][(initial_y_intercept>>22)];
if (y_intercept != 0)
{
if (y_intercept == door_code)
{
door_intercept = initial_y_intercept; /*preserve initial intercept val */
if (door_map[x_position][initial_y_intercept>>22] == Secret_Door_Code)
{
/* check if door is moving in y direction */
if (Secret_Door_Orientation > 2)
{
/* find magnitude of y offset */
y_door_offset = Secret_Door_Position * tan_table[960-(viewing_angle-2880)];
door_intercept = (y_door_offset>>16) + ((initial_y_intercept >> 16) & 63);
/* if interception exceeds bounds of door resume tracing */
if (door_intercept > 63)
{
y_intercept = 0;
}
else
{
y_door_hit = 2;
initial_y_intercept += y_door_offset;
}
}
}
else
{
y_door_hit = 1;
initial_y_intercept = initial_y_intercept + (increment[offset_angleX]>>1);
/* if door is open... */
if (door_map[x_position][initial_y_intercept>>22] != 0)
{
if (door_map[x_position][initial_y_intercept>>22] >= ((initial_y_intercept>>16) & 63))
{
y_door_hit = 0;
y_intercept = 0;
initial_y_intercept = door_intercept;
}
else
{
initial_y_intercept -= ((door_map[x_position][door_intercept>>22]+1)<<16);
}
}
}
}
else
{
if (y_intercept < 256)
{
if (Sprite_Plot_Block[1] > 960)
{
Sprite_Plot_Block[1] = ScanLine+((320-current_screen_width)>>1);
Sprite_Plot_Block[2] = Sprite_Plot_Block[1];
X_sprite_distance = (Sprite_List[0].sprite_position_x - Xb);
Y_sprite_distance = (Sprite_List[0].sprite_position_y - Yb);
if (X_sprite_distance == 0)
{
X_sprite_distance = 1;
}
if (Y_sprite_distance == 0)
{
Y_sprite_distance = 1;
}
move = Y_sprite_distance;
move2 =X_sprite_distance;
move = move/move2;
Sprite_Plot_Block[5] = (atan(move)/1.63624617374E-03);
move = atan(move);
Sprite_Plot_Block[5] = (((960-(direction_angle - 2880)) - Sprite_Plot_Block[5])/2)+160;
if (move == 0.0)
{
move = 0.1;
}
Y_sprite_distance = move2/cos(move);
Sprite_Plot_Block[3] = (64<<14)/(Y_sprite_distance>>10);
Sprite_Plot_Block[3] = (Sprite_Plot_Block[3] * scale_factor);
Sprite_Plot_Block[3] = Sprite_Plot_Block[3]>>16;
if (Sprite_Plot_Block[3] > (240))
{
Sprite_Plot_Block[3] = 240;
}
Sprite_Plot_Block[4] = (128<<20)/Sprite_Plot_Block[3];
}
else
{
Sprite_Plot_Block[2]++;
}
y_intercept = 0;
}
}
}
}
}
/* validate intercept */
if (initial_x_intercept > map_x_max || initial_x_intercept < map_x_min)
{
x_intercept = 0;
}
if (initial_y_intercept > map_y_max || initial_y_intercept < map_y_min)
{
y_intercept = 0;
}
/* compute distance for x ray */
initial_x_intercept = initial_x_intercept>>16;
if (x_intercept != 0)
{
if (x_door_hit == 0)
{
x_distance = ((y_position<<6) - Ya) * cos_div_table[offset_angleY];
}
else if (x_door_hit == 1)
{
x_distance = (((y_position<<6)+32) - Ya) * cos_div_table[offset_angleY];
}
else if (x_door_hit == 2)
{
x_distance = (((y_position<<6)+Secret_Door_Position) - Ya) * cos_div_table[offset_angleY];
}
}
/* compute distance for y ray */
initial_y_intercept = initial_y_intercept>>16;
if (y_intercept != 0)
{
if (y_door_hit == 0)
{
initial_y_intercept = initial_y_intercept-(initial_y_intercept & 63)+(63-(initial_y_intercept & 63));
y_distance = ((x_position<<6) - Xa) * cos_div_table[offset_angleX];
}
else if (y_door_hit == 1)
{
y_distance = (((x_position<<6)+32) - Xa) * cos_div_table[offset_angleX];
}
else if (y_door_hit == 2)
{
y_distance = (((x_position<<6)+Secret_Door_Position) - Xa) * cos_div_table[offset_angleX];
}
}
}
else if (quadrant == 0)
{
initial_y_intercept = (Yb)-((64-(Xa & 63))*tan_table[offset_angleY]);
initial_x_intercept = (Xb)+((Ya & 63)*tan_table[offset_angleX]);
if ((initial_x_intercept < map_x_max)&((viewing_angle != 0)&(viewing_angle != 1920)))
{
/* fire x ray & test for intersections */
y_position = (Ya>>6);
x_intercept = map[initial_x_intercept>>22][(y_position)-1];
if (x_intercept != 0)
{
if (x_intercept == door_code)
{
door_intercept = initial_x_intercept; /*preserve initial intercept val */
if (door_map[initial_x_intercept>>22][(y_position)-1] == Secret_Door_Code)
{
/* check if door is moving in y direction */
if (Secret_Door_Orientation < 4)
{
/* find magnitude of x offset */
x_door_offset = Secret_Door_Position * tan_table[960-viewing_angle];
door_intercept = (x_door_offset>>16) + ((initial_x_intercept >> 16) & 63);
/* if interception exceeds bounds of door resume tracing */
if (door_intercept > 63)
{
x_intercept = 0;
}
else
{
x_door_hit = 2;
initial_x_intercept += x_door_offset;
}
}
}
else
{
x_door_hit = 1;
initial_x_intercept = initial_x_intercept + (increment[offset_angleX]>>1);
/* if door is open... */
if (door_map[initial_x_intercept>>22][y_position-1] != 0)
{
if (door_map[door_intercept>>22][y_position-1] >= ((initial_x_intercept>>16) & 63))
{
x_door_hit = 0;
x_intercept = 0;
initial_x_intercept = door_intercept;
}
else
{
initial_x_intercept -= ((door_map[door_intercept>>22][y_position-1]+1)<<16);
}
}
}
}
}
while (((initial_x_intercept < map_x_max)&(y_position > (map_y_min>>22)))&(x_intercept == 0))
{
y_position = y_position - 1;
initial_x_intercept = initial_x_intercept + increment[offset_angleX];
x_intercept = map[initial_x_intercept>>22][(y_position)-1];
if (x_intercept != 0)
{
if (x_intercept == door_code)
{
door_intercept = initial_x_intercept; /*preserve initial intercept val */
if (door_map[initial_x_intercept>>22][(y_position)-1] == Secret_Door_Code)
{
/* check if door is moving in y direction */
if (Secret_Door_Orientation < 4)
{
/* find magnitude of x offset */
x_door_offset = Secret_Door_Position * tan_table[960-viewing_angle];
door_intercept = (x_door_offset>>16) + ((initial_x_intercept >> 16) & 63);
/* if interception exceeds bounds of door resume tracing */
if (door_intercept > 63)
{
x_intercept = 0;
}
else
{
x_door_hit = 2;
initial_x_intercept += x_door_offset;
}
}
}
else
{
x_door_hit = 1;
initial_x_intercept = initial_x_intercept + (increment[offset_angleX]>>1);
/* if door is open... */
if (door_map[initial_x_intercept>>22][y_position-1] != 0)
{
if (door_map[door_intercept>>22][y_position-1] >= ((initial_x_intercept>>16) & 63))
{
x_door_hit = 0;
x_intercept = 0;
initial_x_intercept = door_intercept;
}
else
{
initial_x_intercept -= ((door_map[door_intercept>>22][y_position-1]+1)<<16);
}
}
}
}
}
}
}
if ((initial_y_intercept > map_y_min)&((viewing_angle != 960)&(viewing_angle != 2880)))
{
/* fire y ray & test for intersections */
x_position = (Xa>>6)+1;
y_intercept = map[x_position][(initial_y_intercept>>22)];
if (y_intercept == door_code)
{
door_intercept = initial_y_intercept; /*preserve initial intercept val */
if (door_map[x_position][initial_y_intercept>>22] == Secret_Door_Code)
{
/* check if door is moving in y direction */
if (Secret_Door_Orientation > 2)
{
/* find magnitude of y offset */
y_door_offset = Secret_Door_Position * tan_table[viewing_angle];
door_intercept = (y_door_offset>>16) - ((initial_y_intercept >> 16) & 63);
/* if interception exceeds bounds of door resume tracing */
if (door_intercept > 63)
{
y_intercept = 0;
}
else
{
y_door_hit = 2;
initial_y_intercept -= y_door_offset;
}
}
}
else
{
y_door_hit = 1;
initial_y_intercept = initial_y_intercept - (increment[offset_angleY]>>1);
/* if door is open... */
if (door_map[x_position][initial_y_intercept>>22] != 0)
{
if (door_map[x_position][initial_y_intercept>>22] >= ((initial_y_intercept>>16) & 63))
{
y_door_hit = 0;
y_intercept = 0;
initial_y_intercept = door_intercept;
}
else
{
initial_y_intercept -= ((door_map[x_position][door_intercept>>22]+1)<<16);
}
}
}
}
while (((initial_y_intercept > map_y_min)&(x_position < (map_x_max>>22)))&(y_intercept == 0))
{
x_position = x_position + 1;
initial_y_intercept = initial_y_intercept - increment[offset_angleY];
y_intercept = map[x_position][(initial_y_intercept>>22)];
if (y_intercept == door_code)
{
door_intercept = initial_y_intercept; /*preserve initial intercept val */
if (door_map[x_position][initial_y_intercept>>22] == Secret_Door_Code)
{
/* check if door is moving in y direction */
if (Secret_Door_Orientation > 2)
{
/* find magnitude of y offset */
y_door_offset = Secret_Door_Position * tan_table[viewing_angle];
door_intercept = (y_door_offset>>16) - ((initial_y_intercept >> 16) & 63);
/* if interception exceeds bounds of door resume tracing */
if (door_intercept > 63)
{
y_intercept = 0;
}
else
{
y_door_hit = 2;
initial_y_intercept -= y_door_offset;
}
}
}
else
{
y_door_hit = 1;
initial_y_intercept = initial_y_intercept - (increment[offset_angleY]>>1);
/* if door is open... */
if (door_map[x_position][initial_y_intercept>>22] != 0)
{
if (door_map[x_position][initial_y_intercept>>22] >= ((initial_y_intercept>>16) & 63))
{
y_door_hit = 0;
y_intercept = 0;
initial_y_intercept = door_intercept;
}
else
{
initial_y_intercept -= ((door_map[x_position][door_intercept>>22]+1)<<16);
}
}
}
}
}
}
/* validate intercept */
if (initial_x_intercept > map_x_max || initial_x_intercept < map_x_min)
{
x_intercept = 0;
}
if (initial_y_intercept > map_y_max || initial_y_intercept < map_y_min)
{
y_intercept = 0;
}
/* compute distance for x ray */
initial_x_intercept = initial_x_intercept>>16;
if (x_intercept != 0)
{
if (x_door_hit == 0)
{
initial_x_intercept = initial_x_intercept-(initial_x_intercept & 63)+(63-(initial_x_intercept & 63));
x_distance = (Ya - (y_position<<6)) * cos_div_table[offset_angleX];
}
else if (x_door_hit == 1)
{
x_distance = (Ya - ((y_position<<6)-32)) * cos_div_table[offset_angleX];
}
else if (x_door_hit == 2)
{
x_distance = (Ya - ((y_position<<6)-Secret_Door_Position)) * cos_div_table[offset_angleX];
}
}
/* compute distance for y ray */
initial_y_intercept = initial_y_intercept>>16;
if (y_intercept != 0)
{
if (y_door_hit == 0)
{
initial_y_intercept = initial_y_intercept-(initial_y_intercept & 63)+(63-(initial_y_intercept & 63));
y_distance = ((x_position<<6) - Xa) * cos_div_table[offset_angleY];
}
else if (y_door_hit == 1)
{
y_distance = (((x_position<<6)+32) - Xa) * cos_div_table[offset_angleY];
}
else if (y_door_hit == 2)
{
y_distance = (((x_position<<6)+Secret_Door_Position) - Xa) * cos_div_table[offset_angleY];
}
}
y_position--;
}
else if (quadrant == 1)
{
initial_y_intercept = (Yb)-((Xa & 63)*tan_table[offset_angleX]);
initial_x_intercept = (Xb)-((Ya & 63)*tan_table[offset_angleY]);
if ((initial_x_intercept > map_x_min)&((viewing_angle != 0)&(viewing_angle != 1920)))
{
/* fire x ray & test for intersections */
y_position = (Ya>>6);
x_intercept = map[initial_x_intercept>>22][(y_position)-1];
if (x_intercept == door_code)
{
door_intercept = initial_x_intercept; /*preserve initial intercept val */
if (door_map[initial_x_intercept>>22][(y_position)-1] == Secret_Door_Code)
{
/* check if door is moving in y direction */
if (Secret_Door_Orientation < 4)
{
/* find magnitude of x offset */
x_door_offset = Secret_Door_Position * tan_table[viewing_angle-960];
door_intercept = ((initial_x_intercept >> 16) & 63) - (x_door_offset>>16);
/* if interception exceeds bounds of door resume tracing */
if (door_intercept > 63)
{
x_intercept = 0;
}
else
{
x_door_hit = 2;
initial_x_intercept -= x_door_offset;
}
}
}
else
{
x_door_hit = 1;
initial_x_intercept = initial_x_intercept - (increment[offset_angleY]>>1);
/* if door is open... */
if (door_map[initial_x_intercept>>22][y_position-1] != 0)
{
if (door_map[door_intercept>>22][y_position-1] >= ((initial_x_intercept>>16) & 63))
{
x_door_hit = 0;
x_intercept = 0;
initial_x_intercept = door_intercept;
}
else
{
initial_x_intercept -= ((door_map[door_intercept>>22][y_position-1]+1)<<16);
}
}
}
}
while (((initial_x_intercept > map_x_min)&(y_position > (map_y_min>>22)))&(x_intercept == 0))
{
y_position = y_position - 1;
initial_x_intercept = initial_x_intercept - increment[offset_angleY];
x_intercept = map[initial_x_intercept>>22][(y_position)-1];
if (x_intercept == door_code)
{
door_intercept = initial_x_intercept; /*preserve initial intercept val */
if (door_map[initial_x_intercept>>22][(y_position)-1] == Secret_Door_Code)
{
/* check if door is moving in y direction */
if (Secret_Door_Orientation < 4)
{
/* find magnitude of x offset */
x_door_offset = Secret_Door_Position * tan_table[viewing_angle-960];
door_intercept = ((initial_x_intercept >> 16) & 63) - (x_door_offset>>16);
/* if interception exceeds bounds of door resume tracing */
if (door_intercept > 63)
{
x_intercept = 0;
}
else
{
x_door_hit = 2;
initial_x_intercept -= x_door_offset;
}
}
}
else
{
x_door_hit = 1;
initial_x_intercept = initial_x_intercept - (increment[offset_angleY]>>1);
/* if door is open... */
if (door_map[initial_x_intercept>>22][y_position-1] != 0)
{
if (door_map[door_intercept>>22][y_position-1] >= ((initial_x_intercept>>16) & 63))
{
x_door_hit = 0;
x_intercept = 0;
initial_x_intercept = door_intercept;
}
else
{
initial_x_intercept -= ((door_map[door_intercept>>22][y_position-1]+1)<<16);
}
}
}
}
}
}
if ((initial_y_intercept > map_y_min)&((viewing_angle != 960)&(viewing_angle != 2880)))
{
/* fire y ray & test for intersections */
x_position = (Xa>>6);
y_intercept = map[(x_position)-1][initial_y_intercept>>22];
if (y_intercept == door_code)
{
door_intercept = initial_y_intercept; /*preserve initial intercept val */
if (door_map[x_position-1][initial_y_intercept>>22] == Secret_Door_Code)
{
/* check if door is moving in y direction */
if (Secret_Door_Orientation > 2)
{
/* find magnitude of y offset */
y_door_offset = Secret_Door_Position * tan_table[960-(viewing_angle-960)];
door_intercept = (y_door_offset>>16) - ((initial_y_intercept >> 16) & 63);
/* if interception exceeds bounds of door resume tracing */
if (door_intercept > 63)
{
y_intercept = 0;
}
else
{
y_door_hit = 2;
initial_y_intercept -= y_door_offset;
}
}
}
else
{
y_door_hit = 1;
initial_y_intercept = initial_y_intercept - (increment[offset_angleX]>>1);
/* if door is open... */
if (door_map[x_position-1][initial_y_intercept>>22] != 0)
{
if (door_map[x_position-1][initial_y_intercept>>22] >= ((initial_y_intercept>>16) & 63))
{
y_door_hit = 0;
y_intercept = 0;
initial_y_intercept = door_intercept;
}
else
{
initial_y_intercept -= ((door_map[x_position-1][door_intercept>>22]+1)<<16);
}
}
}
}
while (((initial_y_intercept > map_y_min)&(x_position > (map_x_min>>22)))&(y_intercept == 0))
{
x_position = x_position - 1;
initial_y_intercept = initial_y_intercept - increment[offset_angleX];
y_intercept = map[(x_position)-1][initial_y_intercept>>22];
if (y_intercept == door_code)
{
door_intercept = initial_y_intercept; /*preserve initial intercept val */
if (door_map[x_position-1][initial_y_intercept>>22] == Secret_Door_Code)
{
/* check if door is moving in y direction */
if (Secret_Door_Orientation > 2)
{
/* find magnitude of y offset */
y_door_offset = Secret_Door_Position * tan_table[960-(viewing_angle-960)];
door_intercept = (y_door_offset>>16) - ((initial_y_intercept >> 16) & 63);
/* if interception exceeds bounds of door resume tracing */
if (door_intercept > 63)
{
y_intercept = 0;
}
else
{
y_door_hit = 2;
initial_y_intercept -= y_door_offset;
}
}
}
else
{
y_door_hit = 1;
initial_y_intercept = initial_y_intercept - (increment[offset_angleX]>>1);
/* if door is open... */
if (door_map[x_position-1][initial_y_intercept>>22] != 0)
{
if (door_map[x_position-1][initial_y_intercept>>22] >= ((initial_y_intercept>>16) & 63))
{
y_door_hit = 0;
y_intercept = 0;
initial_y_intercept = door_intercept;
}
else
{
initial_y_intercept -= ((door_map[x_position-1][door_intercept>>22]+1)<<16);
}
}
}
}
}
}
/* validate intercept */
if (initial_x_intercept > map_x_max || initial_x_intercept < map_x_min)
{
x_intercept = 0;
}
if (initial_y_intercept > map_y_max || initial_y_intercept < map_y_min)
{
y_intercept = 0;
}
/* compute distance for x ray */
initial_x_intercept = initial_x_intercept>>16;
if (x_intercept != 0)
{
if (x_door_hit == 0)
{
initial_x_intercept = initial_x_intercept-(initial_x_intercept & 63)+(63-(initial_x_intercept & 63));
x_distance = (Ya - (y_position<<6)) * cos_div_table[offset_angleY];
}
else if (x_door_hit == 1)
{
x_distance = (Ya - ((y_position<<6)-32)) * cos_div_table[offset_angleY];
}
else if (x_door_hit == 2)
{
x_distance = (Ya - ((y_position<<6)-Secret_Door_Position)) * cos_div_table[offset_angleY];
}
}
/* compute distance for y ray */
initial_y_intercept = initial_y_intercept>>16;
if (y_intercept != 0)
{
if (y_door_hit == 0)
{
y_distance = (Xa - (x_position<<6)) * cos_div_table[offset_angleX];
}
else if (y_door_hit == 1)
{
y_distance = (Xa - ((x_position<<6)-32)) * cos_div_table[offset_angleX];
}
else if (y_door_hit == 2)
{
y_distance = (Xa - ((x_position<<6)-Secret_Door_Position)) * cos_div_table[offset_angleX];
}
}
x_position--;
y_position--;
}
else if (quadrant == 2)
{
initial_y_intercept = (Yb)+((Xa & 63)*tan_table[offset_angleY]);
initial_x_intercept = (Xb)-((64-(Ya & 63))*tan_table[offset_angleX]);
if ((initial_x_intercept > map_x_min)&((viewing_angle != 0)&(viewing_angle != 1920)))
{
/* fire x ray & test for intersections */
y_position = (Ya>>6)+1;
x_intercept = map[initial_x_intercept>>22][y_position];
if (x_intercept == door_code)
{
door_intercept = initial_x_intercept; /*preserve initial intercept val */
if (door_map[initial_x_intercept>>22][y_position] == Secret_Door_Code)
{
/* check if door is moving in y direction */
if (Secret_Door_Orientation < 4)
{
/* find magnitude of x offset */
x_door_offset = Secret_Door_Position * tan_table[960-(viewing_angle-1920)];
door_intercept = ((initial_x_intercept >> 16) & 63) - (x_door_offset>>16);
/* if interception exceeds bounds of door resume tracing */
if (door_intercept > 63)
{
x_intercept = 0;
}
else
{
x_door_hit = 2;
initial_x_intercept -= x_door_offset;
}
}
}
else
{
x_door_hit = 1;
initial_x_intercept = initial_x_intercept - (increment[offset_angleX]>>1);
/* if door is open... */
if (door_map[initial_x_intercept>>22][y_position] != 0)
{
if (door_map[door_intercept>>22][y_position] >= ((initial_x_intercept>>16) & 63))
{
x_door_hit = 0;
x_intercept = 0;
initial_x_intercept = door_intercept;
}
else
{
initial_x_intercept -= ((door_map[door_intercept>>22][y_position]+1)<<16);
}
}
}
}
while (((initial_x_intercept > map_x_min)&(y_position < (map_y_max>>22)))&(x_intercept == 0))
{
y_position = y_position + 1;
initial_x_intercept = initial_x_intercept - increment[offset_angleX];
x_intercept = map[initial_x_intercept>>22][y_position];
if (x_intercept == door_code)
{
door_intercept = initial_x_intercept; /*preserve initial intercept val */
if (door_map[initial_x_intercept>>22][y_position] == Secret_Door_Code)
{
/* check if door is moving in y direction */
if (Secret_Door_Orientation < 4)
{
/* find magnitude of x offset */
x_door_offset = Secret_Door_Position * tan_table[960-(viewing_angle-1920)];
door_intercept = ((initial_x_intercept >> 16) & 63) - (x_door_offset>>16);
/* if interception exceeds bounds of door resume tracing */
if (door_intercept > 63)
{
x_intercept = 0;
}
else
{
x_door_hit = 2;
initial_x_intercept -= x_door_offset;
}
}
}
else
{
x_door_hit = 1;
initial_x_intercept = initial_x_intercept - (increment[offset_angleX]>>1);
/* if door is open... */
if (door_map[initial_x_intercept>>22][y_position] != 0)
{
if (door_map[door_intercept>>22][y_position] >= ((initial_x_intercept>>16) & 63))
{
x_door_hit = 0;
x_intercept = 0;
initial_x_intercept = door_intercept;
}
else
{
initial_x_intercept -= ((door_map[door_intercept>>22][y_position]+1)<<16);
}
}
}
}
}
}
if ((initial_y_intercept < map_y_max)&((viewing_angle != 960)&(viewing_angle != 2880)))
{
/* fire y ray & test for intersections */
x_position = (Xa>>6);
y_intercept = map[(x_position)-1][initial_y_intercept>>22];
if (y_intercept == door_code)
{
door_intercept = initial_y_intercept; /*preserve initial intercept val */
if (door_map[x_position-1][initial_y_intercept>>22] == Secret_Door_Code)
{
/* check if door is moving in y direction */
if (Secret_Door_Orientation > 2)
{
/* find magnitude of y offset */
y_door_offset = Secret_Door_Position * tan_table[viewing_angle-1920];
door_intercept = (y_door_offset>>16) + ((initial_y_intercept >> 16) & 63);
/* if interception exceeds bounds of door resume tracing */
if (door_intercept > 63)
{
y_intercept = 0;
}
else
{
y_door_hit = 2;
initial_y_intercept += y_door_offset;
}
}
}
else
{
y_door_hit = 1;
initial_y_intercept = initial_y_intercept + (increment[offset_angleY]>>1);
/* if door is open... */
if (door_map[x_position-1][initial_y_intercept>>22] != 0)
{
if (door_map[x_position-1][initial_y_intercept>>22] >= ((initial_y_intercept>>16) & 63))
{
y_door_hit = 0;
y_intercept = 0;
initial_y_intercept = door_intercept;
}
else
{
initial_y_intercept -= ((door_map[x_position-1][door_intercept>>22]+1)<<16);
}
}
}
}
while (((initial_y_intercept < map_y_max)&(x_position > (map_x_min>>22)))&(y_intercept == 0))
{
x_position = x_position - 1;
initial_y_intercept = initial_y_intercept + increment[offset_angleY];
y_intercept = map[(x_position)-1][initial_y_intercept>>22];
if (y_intercept == door_code)
{
door_intercept = initial_y_intercept; /*preserve initial intercept val */
if (door_map[x_position-1][initial_y_intercept>>22] == Secret_Door_Code)
{
/* check if door is moving in y direction */
if (Secret_Door_Orientation > 2)
{
/* find magnitude of y offset */
y_door_offset = Secret_Door_Position * tan_table[viewing_angle-1920];
door_intercept = (y_door_offset>>16) + ((initial_y_intercept >> 16) & 63);
/* if interception exceeds bounds of door resume tracing */
if (door_intercept > 63)
{
y_intercept = 0;
}
else
{
y_door_hit = 2;
initial_y_intercept += y_door_offset;
}
}
}
else
{
y_door_hit = 1;
initial_y_intercept = initial_y_intercept + (increment[offset_angleY]>>1);
/* if door is open... */
if (door_map[x_position-1][initial_y_intercept>>22] != 0)
{
if (door_map[x_position-1][initial_y_intercept>>22] >= ((initial_y_intercept>>16) & 63))
{
y_door_hit = 0;
y_intercept = 0;
initial_y_intercept = door_intercept;
}
else
{
initial_y_intercept -= ((door_map[x_position-1][door_intercept>>22]+1)<<16);
}
}
}
}
}
}
/* validate intercept */
if (initial_x_intercept > map_x_max || initial_x_intercept < map_x_min)
{
x_intercept = 0;
}
if (initial_y_intercept > map_y_max || initial_y_intercept < map_y_min)
{
y_intercept = 0;
}
/* compute distance for x ray */
initial_x_intercept = initial_x_intercept>>16;
if (x_intercept != 0)
{
if (x_door_hit == 0)
{
x_distance = ((y_position<<6) - Ya) * cos_div_table[offset_angleX];
}
else if (x_door_hit == 1)
{
x_distance = (((y_position<<6)+32) - Ya) * cos_div_table[offset_angleX];
}
else if (x_door_hit == 2)
{
x_distance = (((y_position<<6)+Secret_Door_Position) - Ya) * cos_div_table[offset_angleX];
}
}
/* compute distance for y ray */
initial_y_intercept = initial_y_intercept>>16;
if (y_intercept != 0)
{
if (y_door_hit == 0)
{
y_distance = (Xa - (x_position<<6)) * cos_div_table[offset_angleY];
}
else if (y_door_hit == 1)
{
y_distance = (Xa - ((x_position<<6)-32)) * cos_div_table[offset_angleY];
}
else if (y_door_hit == 2)
{
y_distance = (Xa - ((x_position<<6)-Secret_Door_Position)) * cos_div_table[offset_angleY];
}
}
x_position--;
}
if (y_distance < 0)
{
y_intercept = 0;
}
if (x_distance < 0)
{
x_intercept = 0;
}
/* round distance values */
if ((y_distance & 65535) > 32767)
{
y_distance += 65536;
}
if ((x_distance & 65535) > 32767)
{
x_distance += 65536;
}
/* round intercept values */
if ((initial_y_intercept & 65535) > 32767)
{
initial_y_intercept += 65536;
}
if ((initial_x_intercept & 65535) > 32767)
{
initial_x_intercept += 65536;
}
/* draw distance scaled vertical scan lines */
x_distance = x_distance >> 16;
y_distance = y_distance >> 16;
/* check for same distances */
if (x_distance == y_distance)
{
if (x_intercept !=0 && last_intercept == 0)
{
y_intercept = 0;
}
else
{
if (y_intercept != 0)
{
x_intercept = 0;
}
}
}
/*if (x_distance > 65536||x_distance < 0)
{
x_intercept = 0;
x_distance = 65536;
}
if (y_distance > 65536||y_distance < 0)
{
y_intercept = 0;
y_distance = 65536;
}*/
/* check for door walls */
if (x_intercept >= 65536)
{
if ((x_intercept >> 16) == 2)
{
x_intercept = door_wall_code;
}
x_intercept = x_intercept & 65535;
}
if (y_intercept >= 65536)
{
if ((y_intercept >> 16) == 4)
{
y_intercept = door_wall_code;
}
y_intercept = y_intercept & 65535;
}
if (x_distance <= y_distance && x_intercept != 0)
{
if ((initial_x_intercept > map_x_min)&(initial_x_intercept < map_x_max))
{
if (x_intercept < 122880)
{
/* modify distance to avoid bowing */
height = (x_distance*current_view_cos_table[ScanLine]);
if (height > smallest_height)
{
smallest_height = height;
}
if ((height & 262143) > 131071)
{
height += 262144;
}
distance[ScanLine] = height;
Map_Data[initial_x_intercept>>6][y_position] =103;
initial_x_intercept = ((initial_x_intercept & 63)<<6);
data_address[ScanLine] = (((x_intercept)>>8)<<12)+initial_x_intercept;
last_intercept = 0;
}
else
{
distance[ScanLine] = 1;
data_address[ScanLine] = 0;
}
}
else
{
distance[ScanLine] = 1;
data_address[ScanLine] = 0;
}
}
else if (x_distance > y_distance || x_intercept == 0)
{
if ((y_intercept != 0)&(initial_y_intercept > map_y_min)&(initial_y_intercept < map_y_max))
{
if (y_intercept < 122880)
{
height = (y_distance*current_view_cos_table[ScanLine]);
if (height > smallest_height)
{
smallest_height = height;
}
if ((height & 262143) > 131071)
{
height += 262144;
}
distance[ScanLine] = height;
Map_Data[x_position][initial_y_intercept>>6] =103;
initial_y_intercept = ((initial_y_intercept & 63)<<6);
data_address[ScanLine] = (((y_intercept>>8)+1)<<12)+initial_y_intercept;
last_intercept = 1;
}
else
{
distance[ScanLine] = 1;
data_address[ScanLine] = 0;
}
}
else
{
distance[ScanLine] = 1;
data_address[ScanLine] = 0;
}
}
}
smallest_height = ((64<<14)/((smallest_height>>15)<<1))>>1;
smallest_height = (smallest_height * scale_factor);
smallest_height = smallest_height>>16;
if (smallest_height < (current_screen_height>>1))
{
if (Floor_On_Off == 1)
{
if (Play_Mode == Full_Screen)
{
Floor_Block[0] = (int)&Floor_Data[0][smallest_height][0];
}
else if (Play_Mode == Tactical_Map)
{
Floor_Block[0] = (int)&Tactical_Floor_Data[0][smallest_height][0];
}
else if (Play_Mode == Main_Player)
{
Floor_Block[0] = (int)&main_Floor_Data[0][smallest_height][0];
}
if (Screen_Mode == VGA)
{
Floor_Block[1] = screen_addr+76800+(640*smallest_height);
}
else
{
Floor_Block[1] = screen_addr+38400-320+(320*smallest_height);
}
Floor_Block[3] = (current_screen_height/2)-smallest_height;
if (Screen_Mode == VGA)
{
PlotFloorVGA((int)&Floor_Block[0]);
/*AdaptiveRedrawScreenVGA(screen_address,screen_width,screen_height);*/
}
else
{
PlotFloor((int)&Floor_Block[0]);
}
}
else
{
if (Screen_Mode ==VGA)
{
AdaptiveRedrawScreenVGA(screen_addr,current_screen_width,current_screen_height);
}
else
{
AdaptiveRedrawScreen(screen_addr,current_screen_width,current_screen_height);
}
}
}
Plot_Block[0] = (int)&distance[0];
Plot_Block[1] = (int)&data_address[0];
Plot_Block[2] = current_screen_width;
Plot_Block[17] = (int)&block_data[0][0];
Plot_Block[19] = current_screen_height;
Plot_Block[20] = (int)&gradient_table[0];
Plot_Block[21] = scale_factor;
Plot_Block[22] = convert_colour(colour_red,colour_green,colour_blue)<<16;
if (Screen_Mode == VGA)
{
Plot_Block[16] = screen_addr-76800-8;
DrawScaledLineVGA((int)&Plot_Block[0]);
}
else
{
Plot_Block[16] = screen_addr-8;
DrawScaledLine((int)&Plot_Block[0]);
}
/* Draw Sprite */
Sprite_Plot_Block[0] = temp_counter;
temp_counter = temp_counter + temp_direction;
if ((temp_counter > 14)|(temp_counter < 2))
{
temp_direction = -temp_direction;
}
Frame_Size = current_screen_height;
/*Sprite_Plot_Block[1] = 8;
Sprite_Plot_Block[2] = 312;
Sprite_Plot_Block[3] = Frame_Size;
Sprite_Plot_Block[4] = (128<<20)/(Frame_Size);
Sprite_Plot_Block[5] = 160;*/
Sprite_Plot_Block[7] = (int)&sprite_data[0];
Sprite_Plot_Block[8] = 320;
Sprite_Plot_Block[9] = 240;
Sprite_Plot_Block[11] = (Frame_Size*1048576)/128;
if (Sprite_Plot_Block[1] < 320)
{
if (Screen_Mode == VGA)
{
Sprite_Plot_Block[6] = screen_addr-((320-current_screen_width)>>1)+320;
PlotSpriteVGA((int)&Sprite_Plot_Block[0]);
}
else
{
Sprite_Plot_Block[6] = screen_addr-((320-current_screen_width)>>1)-320;
PlotSprite((int)&Sprite_Plot_Block[0]);
}
}
/* Draw Gun */
Weapon_Plot_Block[0] = Frame_Number;
Frame_Size = current_screen_height;
Weapon_Plot_Block[1] = 8;
Weapon_Plot_Block[2] = 312;
Weapon_Plot_Block[3] = Frame_Size;
Weapon_Plot_Block[4] = (240<<20)/(Frame_Size);
Weapon_Plot_Block[5] = 160;
Weapon_Plot_Block[7] = (int)&weapon_data[0];
Weapon_Plot_Block[8] = 320;
Weapon_Plot_Block[9] = 240;
Weapon_Plot_Block[11] = (Frame_Size*1048576)/240;
if (Screen_Mode == VGA)
{
Weapon_Plot_Block[6] = screen_addr-((320-current_screen_width)>>1)+320;
PlotWeaponVGA((int)&Weapon_Plot_Block[0]);
}
else
{
Weapon_Plot_Block[6] = screen_addr-((320-current_screen_width)>>1)-320;
PlotWeapon((int)&Weapon_Plot_Block[0]);
}
}
int BioHazard()
{
/* Turn off cursor */
os_swi(54, point_registers);
/*printf("Please wait - calculating tables...");*/
/*InitiateScreenEvent();*/
/* Turn off cursor */
os_swi(54, point_registers);
Quit = 0;
while (Quit != 1)
{
if (BB_Flag == 1)
{
BB_Value = Black_Box[BB_Pointer];
}
else
{
BB_Value = 0;
}
/* get mouse X,Y co-ords & button state */
os_swi(28, point_registers); /* OS_Mouse */
Buttons = registers.r[2];
if ((Buttons == 2)&&(Tasking_Mode == Single))
{
Quit = 1;
}
if (Play_Mode == Full_Screen)
{
current_screen_width = screen_width;
current_screen_height = screen_height;
}
else if (Play_Mode == Tactical_Map)
{
current_screen_width = tactical_screen_width;
current_screen_height = tactical_screen_height;
}
else if (Play_Mode == Main_Player)
{
current_screen_width = main_screen_width;
current_screen_height = main_screen_height;
}
if ((input_focus == TRUE)||(Tasking_Mode == Single))
{
Read_Keys();
}
for (loop1=0; loop1<2; loop1++)
{
if (door_active[loop1] == 1)
{
door_frame_counter[loop1]++;
if (door_frame_counter[loop1] < 32)
{
door_map[door_position[loop1][0]][door_position[loop1][1]] = (door_frame_counter[loop1])<<1;
}
else if ((door_frame_counter[loop1] >= 32)&(door_frame_counter[loop1] < 64))
{
map[door_position[loop1][0]][door_position[loop1][1]] = 0;
}
else if ((door_frame_counter[loop1] >= 64)&(door_frame_counter[loop1] < 96))
{
if (((X>>22)==(door_position[loop1][0]))&((Y>>22)==(door_position[loop1][1])))
{
door_frame_counter[loop1] = 64;
/* play door grinding sample */
registers.r[0] = 1;
registers.r[1] = 10;
registers.r[2] = 3;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 15;
registers.r[6] = 0;
/*os_swi(284806, point_registers);*/ /* Dsym */
}
else
{
if (door_frame_counter[loop1] == 64)
{
/* play door closing sample */
registers.r[0] = 1;
registers.r[1] = 10;
registers.r[2] = 3;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
/*os_swi(284806, point_registers);*/ /* Dsym */
}
map[door_position[loop1][0]][door_position[loop1][1]] = door_code;
door_map[door_position[loop1][0]][door_position[loop1][1]] = (31 - (door_frame_counter[loop1] & 31))<<1;
}
}
else if (door_frame_counter[loop1] >= 96)
{
door_active[loop1] = 0;
door_frame_counter[loop1] = 0;
door_map[door_position[loop1][0]][door_position[loop1][1]] = 0;
}
}
}
/* weaponry state machines */
if (Weapon_Type == Chainsaw)
{
if (State_Counter == 1)
{
if (State_Frame == 1)
{
registers.r[0] = 0;
registers.r[1] = 17;
registers.r[2] = 3;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
os_swi(284806, point_registers);
}
State_Frame++;
State_Frame_Counter++;
if (State_Frame_Counter == 8)
{
Frame_Number++;
State_Frame_Counter = 0;
}
if (Frame_Number == 10)
{
Frame_Number = 8;
}
if (State_Frame == 100)
{
State_Counter=2;
State_Frame_Counter = 0;
State_Frame = 0;
Frame_Number = 10;
Direction = 1;
registers.r[0] = 0;
registers.r[1] = 17;
registers.r[2] = 4;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
os_swi(284806, point_registers);
}
}
else if (State_Counter == 2)
{
State_Frame++;
State_Frame_Counter++;
if (State_Frame_Counter == 8)
{
Frame_Number=Frame_Number+Direction;
State_Frame_Counter = 0;
}
if (Frame_Number == 15)
{
Direction = -1;
}
if (Frame_Number == 11)
{
Direction = 1;
}
if (State_Frame == 80)
{
if (Weapon_Active == 0)
{
State_Counter=0;
State_Frame = 0;
Frame_Number = 1;
Direction = 1;
State_Frame_Counter = 0;
registers.r[0] = 0;
registers.r[1] = 17;
registers.r[2] = 1;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
os_swi(284806, point_registers);
}
Weapon_Active = 0;
State_Frame = 0;
}
}
}
if (Weapon_Type == MGun)
{
if (State_Counter == 1)
{
State_Frame++;
State_Frame_Counter++;
if (State_Frame_Counter == 4)
{
Frame_Number++;
State_Frame_Counter = 0;
}
if (Frame_Number == 8)
{
State_Counter=2;
State_Frame_Counter = 0;
State_Frame = 0;
Frame_Number = 8;
registers.r[0] = 0;
registers.r[1] = 25;
registers.r[2] = 5;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
os_swi(284806, point_registers);
}
}
else if (State_Counter == 2)
{
State_Frame++;
State_Frame_Counter++;
if (State_Frame_Counter == 4)
{
Frame_Number++;
State_Frame_Counter = 0;
}
if (Frame_Number == 8)
{
Frame_Number = 6;
registers.r[0] = 0;
registers.r[1] = 25;
registers.r[2] = 5;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
os_swi(284806, point_registers);
}
if (State_Frame == 8)
{
if (Weapon_Active == 0)
{
State_Counter=0;
State_Frame = 0;
Frame_Number = 1;
Direction = 1;
State_Frame_Counter = 0;
registers.r[0] = 0;
registers.r[1] = 25;
registers.r[2] = 5;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
os_swi(284806, point_registers);
}
Weapon_Active = 0;
State_Frame = 0;
}
}
}
if (Weapon_Type == Grenade)
{
if (State_Counter == 1)
{
State_Frame++;
State_Frame_Counter++;
if (State_Frame_Counter == 4)
{
Frame_Number++;
State_Frame_Counter = 0;
}
if (Frame_Number == 15)
{
State_Counter=0;
State_Frame_Counter = 0;
State_Frame = 0;
Frame_Number = 0;
registers.r[0] = 0;
registers.r[1] = 25;
registers.r[2] = 5;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
os_swi(284806, point_registers);
}
}
}
if (Weapon_Type == Chaingun)
{
if (State_Counter == 1)
{
State_Frame++;
State_Frame_Counter++;
if (State_Frame_Counter == 4)
{
Frame_Number++;
State_Frame_Counter = 0;
}
if (Frame_Number == 8)
{
State_Counter=2;
State_Frame_Counter = 0;
State_Frame = 0;
Frame_Number = 8;
registers.r[0] = 0;
registers.r[1] = 25;
registers.r[2] = 5;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
os_swi(284806, point_registers);
}
}
else if (State_Counter == 2)
{
State_Frame++;
State_Frame_Counter++;
if (State_Frame_Counter == 4)
{
Frame_Number++;
State_Frame_Counter = 0;
}
if (Frame_Number == 9)
{
Frame_Number = 7;
registers.r[0] = 0;
registers.r[1] = 25;
registers.r[2] = 5;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
os_swi(284806, point_registers);
}
if (State_Frame == 32)
{
if (Weapon_Active == 0)
{
State_Counter=0;
State_Frame = 0;
Frame_Number = 1;
Direction = 1;
State_Frame_Counter = 0;
registers.r[0] = 0;
registers.r[1] = 25;
registers.r[2] = 5;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
os_swi(284806, point_registers);
}
Weapon_Active = 0;
State_Frame = 0;
}
}
}
rotate_offset = direction_angle + 1920;
if (rotate_offset > 3839)
{
rotate_offset = rotate_offset - 3840;
}
X_conv1 = X + (x_move_table[rotate_offset]);
Y_conv1 = Y - (y_move_table[rotate_offset]);
/*
else if (s == 3)
{
screen_address = screen_vars[0]+163840;
}
VerifyBufferClear(s);*/
/* Clear screen */
/*BigRedrawScreen(screen_address);*/
rotate_offset = 3839-direction_angle;
Floor_Block[2] = (int)&Floor_Sprite[0][0];
Floor_Block[4] = ((X>>16)&127)<<16;
Floor_Block[5] = ((Y>>16)&127)<<16;
Floor_Block[6] = current_screen_width;
Floor_Block[7] = current_screen_height;
Floor_Block[8] = (int)(cos(rotate_offset*1.6362461737E-03)*65536);
Floor_Block[9] = (int)(sin(rotate_offset*1.6362461737E-03)*65536);
rotate_position = 0;
/*Floor_Block[4] = X_conv1&4194303;
Floor_Block[5] = Y_conv1&4194303;*/
map[6][6] = 128;
sprite_x = 352;
sprite_y = 352;
if (mono_time == 0)
{
/* read monotonic time, calculate interval */
os_swi(0x42, point_registers); /* Read Monotonic Timer */
old_time = registers.r[0];
/* Wait */
if (Wait_Mode == 1)
{
registers.r[0] = 19;
os_swi(6, point_registers);
}
if (Tasking_Mode == Single)
{
/* Flip screen banks */
registers.r[0] = 112;
registers.r[1] = 3-s;
os_swi(6, point_registers);
registers.r[0] = 113;
registers.r[1] = s;
os_swi(6, point_registers);
/* Modify screen bank variables */
s++;
if (s > 2)
{
s = 1;
}
}
if (s == 1)
{
if (Play_Mode == 1)
{
if (Tasking_Mode == Single)
{
screen_address = screen_vars[0]+((320-current_screen_width)>>1);
}
else
{
screen_address = virtual_screen_pointer+((320-current_screen_width)>>1);
}
}
else if (Play_Mode == Tactical_Map)
{
if (Screen_Mode == VGA)
{
screen_address = screen_vars[0]+40376-160+((320-current_screen_width)>>1);
}
else
{
if (Tasking_Mode == Single)
{
screen_address = screen_vars[0]+20376+((320-current_screen_width)>>1);
}
else
{
screen_address = virtual_screen_pointer+20376+((320-current_screen_width)>>1);
}
}
}
else if (Play_Mode == Main_Player)
{
if (Screen_Mode == VGA)
{
screen_address = screen_vars[0]+25600+((320-current_screen_width)>>1);
}
else
{
if (Tasking_Mode == Single)
{
screen_address = screen_vars[0]+12800+((320-current_screen_width)>>1);
}
else
{
screen_address = virtual_screen_pointer+12800+((320-current_screen_width)>>1);
}
}
}
}
else
{
if (Play_Mode == 1)
{
if (Screen_Mode == VGA)
{
screen_address = screen_vars[0]+153600+((320-current_screen_width)>>1);
}
else
{
if (Tasking_Mode == Single)
{
screen_address = screen_vars[0]+81920+((320-current_screen_width)>>1);
}
else
{
screen_address = virtual_screen_pointer+((320-current_screen_width)>>1);
}
}
}
else if (Play_Mode == Tactical_Map)
{
if (Screen_Mode == VGA)
{
screen_address = screen_vars[0]+153600+40376-160+((320-current_screen_width)>>1);
}
else
{
if (Tasking_Mode == Single)
{
screen_address = screen_vars[0]+81920+20376+((320-current_screen_width)>>1);
}
else
{
screen_address = virtual_screen_pointer+20376+((320-current_screen_width)>>1);
}
}
}
else if (Play_Mode == Main_Player)
{
if (Screen_Mode == VGA)
{
screen_address = screen_vars[0]+153600+25600+((320-current_screen_width)>>1);
}
else
{
if (Tasking_Mode == Single)
{
screen_address = screen_vars[0]+81920+12800+((320-current_screen_width)>>1);
}
else
{
screen_address = virtual_screen_pointer+12800+((320-current_screen_width)>>1);
}
}
}
}
Sprite_Plot_Block[1] = 1024;
if (Play_Mode == Full_Screen)
{
RayCastScene(X,Y,direction_angle,screen_address,0,&PT_EDDIE[0],scale_factor,screen_width,screen_height,&view_cos_table[0]);
if (Screen_Mode == VGA)
{
DrawNumberVGA(screen_address,1,(int)&Number_Data[0]);
}
else
{
DrawNumber(screen_address,1,(int)&Number_Data[0]);
}
DrawSmallMap(screen_address+64000-64,1);
}
else if (Play_Mode == Tactical_Map)
{
RayCastScene(X,Y,direction_angle,screen_address,0,&PT_Tactical[0],tactical_scale_factor,tactical_screen_width,tactical_screen_height,&tactical_view_cos_table[0]);
if (Screen_Mode == VGA)
{
Draw_Map(screen_address-((320-tactical_screen_width)>>1)+13024-40376+50);
DrawNumberVGA(screen_address+(320*tactical_screen_height),1,(int)&Number_Data[0]);
}
else
{
Draw_Map(screen_address-((320-tactical_screen_width)>>1)+6512-20376);
DrawNumber(screen_address+(160*tactical_screen_height),1,(int)&Number_Data[0]);
}
}
else if (Play_Mode == Main_Player)
{
RayCastScene(X,Y,direction_angle,screen_address-64,0,&PT_main[0],main_scale_factor,main_screen_width,main_screen_height,&main_view_cos_table[0]);
if (Screen_Mode == VGA)
{
current_screen_width = tactical_screen_width;
current_screen_height = tactical_screen_height;
Play_Mode = Tactical_Map;
Floor_Block[6] = current_screen_width;
Floor_Block[7] = current_screen_height;
RayCastScene(384<<16,224<<16,direction_angle,screen_address-64000-68,0,&PT_Tactical[0],tactical_scale_factor,tactical_screen_width,tactical_screen_height,&tactical_view_cos_table[0]);
RayCastScene(X,Y,direction_angle,screen_address-64000+132,0,&PT_Tactical[0],tactical_scale_factor,tactical_screen_width,tactical_screen_height,&tactical_view_cos_table[0]);
RayCastScene(X,Y,direction_angle,screen_address-64000+32,0,&PT_Tactical[0],tactical_scale_factor,tactical_screen_width,tactical_screen_height,&tactical_view_cos_table[0]);
DrawSmallMap(screen_address+64000-64,0);
DrawNumberVGA(screen_address-19200-68,player_map[1],(int)&Number_Data[0]);
DrawNumberVGA(screen_address+32-19200,player_map[2],(int)&Number_Data[0]);
DrawNumberVGA(screen_address+132-19200,player_map[3],(int)&Number_Data[0]);
DrawNumberVGA(screen_address+19200+19200+96,player_map[0],(int)&Number_Data[0]);
}
else
{
current_screen_width = tactical_screen_width;
current_screen_height = tactical_screen_height;
Play_Mode = Tactical_Map;
Floor_Block[6] = current_screen_width;
Floor_Block[7] = current_screen_height;
RayCastScene(384<<16,224<<16,direction_angle,screen_address-32000-68,0,&PT_Tactical[0],tactical_scale_factor,tactical_screen_width,tactical_screen_height,&tactical_view_cos_table[0]);
RayCastScene(X,Y,direction_angle,screen_address-32000+132,0,&PT_Tactical[0],tactical_scale_factor,tactical_screen_width,tactical_screen_height,&tactical_view_cos_table[0]);
RayCastScene(X,Y,direction_angle,screen_address-32000+32,0,&PT_Tactical[0],tactical_scale_factor,tactical_screen_width,tactical_screen_height,&tactical_view_cos_table[0]);
DrawSmallMap(screen_address-((320-tactical_screen_width)>>1)+32000-64,0);
DrawNumber(screen_address-9600-68,player_map[1],(int)&Number_Data[0]);
DrawNumber(screen_address+32-9600,player_map[2],(int)&Number_Data[0]);
DrawNumber(screen_address+132-9600,player_map[3],(int)&Number_Data[0]);
DrawNumber(screen_address+19200+96,player_map[0],(int)&Number_Data[0]);
}
current_screen_width = main_screen_width;
current_screen_height = main_screen_height;
Play_Mode = Main_Player;
}
if ((Tasking_Mode == Multi)&&(mono_time==0))
{
Quit = 1;
}
/* read monotonic time, calculate interval */
os_swi(0x42, point_registers); /* Read Monotonic Timer */
new_time = registers.r[0];
mono_time = new_time - old_time;
if (mono_time < 2)
{
mono_time = 1;
}
}
FrameCounter++;
mono_time--;
if (BB_Flag == 0)
{
Black_Box[BB_Pointer] = BB_Value;
}
/*BB_Pointer++;*/
if (BB_Pointer == Black_Box[0])
{
Quit = 1;
}
/*Secret_Door_Position = ((Secret_Door_Position+2)&63);*/
/*SetFlagBufferUsed(s);
ScreenEvent();*/
}
/* Fade out music */
for (loopA=64; loopA>1; loopA--)
{
/* Waits added for timed fade, otherwise too fast
registers.r[0] = 19;
os_swi(6, point_registers);
Wait
registers.r[0] = 19;
os_swi(6, point_registers);
set volume
registers.r[0] = loopA;
os_swi(284802, point_registers); Dsym */
}
/* pause music
os_swi(284814, point_registers); Dsym */
/* reset volume
registers.r[0] = 64;
os_swi(284802, point_registers); Dsym */
return 0;
}
/********************************* CONSTANTS ********************************/
/* Menu items */
#define biohazard_menu_info 1
#define biohazard_menu_task 2
#define biohazard_menu_config 3
#define biohazard_menu_pause 4
#define biohazard_menu_quit 5
/* Info box field for the version string */
#define biohazard_info_field 4
/******************************** GLOBAL DATA *******************************/
/* Application version */
static char *biohazard_Version_String = "0.7x (not for distribution!!!)";
/* The top of the menu tree */
static menu biohazard_menu;
/* Handle for the biohazard window */
static wimp_w biohazard_win_handle;
/* Handle for the biohazard window */
static wimp_w config_win_handle;
/* Handle for the init window */
static wimp_w biohazard_init_handle;
/* Flag - is the window open */
static BOOL biohazard_window_open = FALSE;
/***************************** WINDOW FUNCTIONS *****************************/
/*--- Create the window, yielding its handle. Return TRUE if ok. ---*/
static BOOL biohazard_create_window(char *name, wimp_w *handle)
{
wimp_wind *window; /* Pointer to window definition */
/* Find template for the window */
window = template_syshandle(name);
if (window == 0)
return FALSE;
/* Create the window, dealing with errors */
return (wimpt_complain(wimp_create_wind(window, handle)) == 0);
}
/*--- Create the window, yielding its handle. Return TRUE if ok. ---*/
static BOOL biohazard_create_main_window(char *name, wimp_w *handle)
{
/* Find template for the window */
main_window_pointer = template_syshandle(name);
if (main_window_pointer == 0)
return FALSE;
AdjustWindowSize(main_window_pointer,(int)&main_window_size);
/* Create the window, dealing with errors */
return (wimpt_complain(wimp_create_wind(main_window_pointer, handle)) == 0);
}
/*--- Individual event routines for the window ---*/
static void biohazard_redraw_window(wimp_w handle)
{
/* Redrawing the window here does nothing - just go through the loop */
int more;
wimp_redrawstr r;
/* Start the redraw */
r.w = handle;
wimpt_noerr(wimp_redraw_wind(&r, &more));
/* Do the redraw loop */
while (more)
{
wimp_get_rectangle(&r, &more);
}
}
static void biohazard_open_window(wimp_openstr *o)
{
/* Just pass the open request on to the wimp */
wimpt_noerr(wimp_open_wind(o));
}
/****************************** EVENT HANDLERS ******************************/
/*--- Event handler called on a left click on the icon. ---*/
static void biohazard_iconclick(wimp_i icon)
{
icon = icon; /* We don't need the handle: this stops compiler warning */
/* Open the window - only one allowed */
if (biohazard_window_open)
werr(FALSE, "BioHazard already running");
else
{
wimp_wstate state;
/* Get the state of the window */
if (wimpt_complain(wimp_get_wind_state(biohazard_win_handle, &state)) == 0)
{
state.o.behind = -1; /* Make sure window is opened in front */
wimpt_noerr(wimp_open_wind(&state.o));
biohazard_window_open = TRUE;
paused = FALSE;
}
}
result = BioHazard();
}
/*--- Display the program info box - called from the menu processor. ---*/
static void biohazard_info_about_program(void)
{
dbox d; /* Dialogue box handle */
/* Create the dialogue box */
if (d = dbox_new("ProgInfo"), d != NULL)
{
/* Fill in the version number */
dbox_setfield(d, biohazard_info_field, biohazard_Version_String);
/* Show the dialogue box */
dbox_show(d);
/* Keep it on the screen as long as needed */
dbox_fillin(d);
/* Dispose of the dialogue box */
dbox_dispose(&d);
}
}
/*--- Event handler for the menu. ---*/
static void biohazard_menuproc(void *handle, char *hit)
{
wimp_wstate state;
handle = handle; /* We don't need handle: this stops compiler warning */
/* Find which menu item was hit and take action as appropriate */
switch (hit[0])
{
case biohazard_menu_info:
biohazard_info_about_program();
break;
case biohazard_menu_task:
/* Start single tasking */
Tasking_Mode = Single;
/* Determine screen mode to change to */
/* get current mode info & determine Screen_Mode */
registers.r[0] = -1;
registers.r[1] = 12;
os_swi(53, point_registers); /* OS_ReadModeVars */
if (registers.r[2] > 470)
{
Screen_Mode = VGA;
}
else
{
Screen_Mode = broadcast;
}
registers.r[0] = 135;
os_swi(0x06, point_registers); /* read current screen mode */
current_screen_mode = registers.r[2];
screen_vars[0] = 149;
screen_vars[1] = 11;
screen_vars[2] = 12;
screen_vars[3] = -1;
screen_vars[4] = 0;
screen_vars[5] = 0;
screen_vars[6] = 0;
screen_vars[7] = 0;
/* draw screen border */
if (Screen_Mode == VGA)
{
/* check 320k of screen memory can be allocated */
bbc_mode(28);
bbc_mode(49);
/* get screen address & set in line block */
registers.r[0] = (int)&screen_vars[0];
registers.r[1] = (int)&screen_vars[0];
os_swi(49, point_registers); /* OS_ReadVduVars */
screen_address = (screen_vars[0]);
DrawBorderVGA(screen_address,screen_width,screen_height,(int)&Backdrop[0]);
DrawBorderVGA((screen_address+153600),screen_width,screen_height,(int)&Backdrop[0]);
}
else
{
/* check 160k of screen memory can be allocated */
bbc_mode(15);
bbc_mode(13);
/* get screen address & set in line block */
registers.r[0] = (int)&screen_vars[0];
registers.r[1] = (int)&screen_vars[0];
os_swi(49, point_registers); /* OS_ReadVduVars */
screen_address = (screen_vars[0]);
DrawBorder(screen_address,screen_width,screen_height,(int)&Backdrop[0]);
DrawBorder((screen_address+81920),screen_width,screen_height,(int)&Backdrop[0]);
DrawBar((screen_address+76800),(int)&Bar_Data[0]);
DrawBar((screen_address+76800+81920),(int)&Bar_Data[0]);
}
if (Weapon_Type == Chainsaw)
{
/* play turnover sample */
registers.r[0] = 0;
registers.r[1] = 17;
registers.r[2] = 1;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
os_swi(284806, point_registers); /* Dsym */
}
/* play Game_On opening sample */
registers.r[0] = 1;
registers.r[1] = 29;
registers.r[2] = Level_1;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
os_swi(284806, point_registers); /* Dsym */
/* run main program */
s = 0;
Quit = 0;
result = BioHazard();
Screen_Mode = broadcast;
Tasking_Mode = Multi;
screen_address = virtual_screen_pointer;
DrawBorder(virtual_screen_pointer,screen_width,screen_height,(int)&Backdrop[0]);
result = BioHazard(); /* update sprite */
/* reset old screen mode */
registers.r[0] = current_screen_mode;
os_swi(0x400E3, point_registers); /* set old wimpmode */
registers.r[0] = (int)pointer_on;
os_swi(0x05, point_registers); /* turn on pointer */
registers.r[0] = -1;
registers.r[1] = 0;
registers.r[2] = 0;
registers.r[3] = 3200;
registers.r[4] = 1600;
os_swi(0x400D1, point_registers); /* Force window redraw */
if (input_focus == TRUE)
{
/* get the input focus */
registers.r[0] = biohazard_win_handle;
registers.r[1] = -1;
registers.r[2] = 0;
registers.r[3] = 0;
registers.r[4] = 16;
registers.r[5] = 1;
os_swi(0x400D2, point_registers); /* Wimp_SetCaretPosition */
}
break;
case biohazard_menu_config:
/* Open configuration window */
/* Get the state of the window */
if (wimpt_complain(wimp_get_wind_state(config_win_handle, &state)) == 0)
{
state.o.behind = -1; /* Make sure window is opened in front */
wimpt_noerr(wimp_open_wind(&state.o));
}
break;
case biohazard_menu_pause:
break;
case biohazard_menu_quit:
/* play Game_Over sample */
registers.r[0] = 0;
registers.r[1] = 29;
registers.r[2] = Game_Over;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
os_swi(284806, point_registers); /* Dsym */
/* Exit from the program. The wimp gets rid of the window and icon */
exit(0);
}
}
/*--- Event handler for window. ---*/
static void biohazard_event_handler(wimp_eventstr *e, void *handle)
{
handle = handle; /* We don't need handle: this stops compiler warning */
/* Deal with event */
switch (e->e)
{
case wimp_ENULL:
if (paused == FALSE)
{
result = BioHazard();
}
#if defined(RISCPC)
ConvertRPC(virtual_screen_pointer,sprite_data_address,OS_Bits_Per_Pixel,(int)&ColourMap[0]);
#else
ConvertScreen(virtual_screen_pointer,sprite_data_address,OS_Bits_Per_Pixel,(int)&ColourMap[0]);
#endif
registers.r[0] = biohazard_win_handle;
registers.r[1] = -1280;
registers.r[2] = -1024;
registers.r[3] = 0;
registers.r[4] = 0;
os_swi(0x400D1, point_registers); /* Force window redraw */
break;
case wimp_EBUT:
registers.r[0] = biohazard_win_handle;
registers.r[1] = -1;
registers.r[2] = 0;
registers.r[3] = 0;
registers.r[4] = 16;
registers.r[5] = 1;
os_swi(0x400D2, point_registers); /* Wimp_SetCaretPosition */
break;
case wimp_ELOSECARET:
input_focus = FALSE;
break;
case wimp_EGAINCARET:
input_focus = TRUE;
break;
case wimp_EREDRAW:
biohazard_redraw_window(e->data.o.w);
break;
case wimp_EOPEN:
biohazard_open_window(&e->data.o);
/* get the input focus */
registers.r[0] = biohazard_win_handle;
registers.r[1] = -1;
registers.r[2] = 0;
registers.r[3] = 0;
registers.r[4] = 16;
registers.r[5] = 1;
os_swi(0x400D2, point_registers); /* Wimp_SetCaretPosition */
if (Weapon_Type == Chainsaw)
{
/* play turnover sample */
registers.r[0] = 0;
registers.r[1] = 17;
registers.r[2] = 1;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
os_swi(284806, point_registers); /* Dsym */
}
break;
case wimp_ECLOSE: /* Pass on close request */
wimpt_noerr(wimp_close_wind(e->data.o.w));
biohazard_window_open = FALSE;
break;
case wimp_ESEND:
case wimp_ESENDWANTACK: /*
* this code checks for mode/palette
* broadcasts
*/
switch(e->data.msg.hdr.action)
{
case wimp_PALETTECHANGE:
/* calculate colour map positions */
for (loop1=0; loop1 < 256; loop1++)
{
/* convert 256 col mode byte to pallette entry */
pallette_entry_red = ((loop1 & 7)<<4) + ((loop1 & 16)<<3);
pallette_entry_green = ((loop1 & 3)<<4) + ((loop1 & 96)<<1);
pallette_entry_blue = ((loop1 & 3)<<4) + ((loop1 & 4)<<3) + (loop1 & 128);
pallette_entry = (pallette_entry_red<<8)+(pallette_entry_green<<16)+(pallette_entry_blue<<24);
registers.r[0] = pallette_entry;
os_swi(0x40742, point_registers); /* ColourTrans_ReturnColourNumber */
ColourMap[loop1] = registers.r[0];
}
break;
case wimp_MMODECHANGE:
wimpt_checkmode();
OS_X_Pixels = wimpt_dx();
OS_Y_Pixels = wimpt_dy();
OS_Bits_Per_Pixel = wimpt_bpp();
#if defined(RISCPC)
virtual_screen_pointer = (int)&virtual_screen[0];
#else
virtual_screen_pointer = sprite_data_address;
#endif
registers.r[0] = 135;
os_swi(0x06, point_registers); /* read current screen mode */
current_screen_mode = registers.r[2];
SpriteSetMode(sprite_mode_pointer,current_screen_mode);
wimp_delete_wind(biohazard_win_handle);
main_window_size[0] = -1280;
main_window_size[1] = -1024;
main_window_size[2] = -(1280-(320*OS_X_Pixels));
main_window_size[3] = -(1024-(256*OS_Y_Pixels));
main_window_size[4] = (-640)+((-512)<<16);
/* Create the main window, and declare its event handler */
!biohazard_create_main_window("MainWindow", &biohazard_win_handle);
win_register_event_handler(biohazard_win_handle, biohazard_event_handler, 0);
if (biohazard_window_open == TRUE)
{
biohazard_open.w = biohazard_win_handle;
biohazard_open.box.x0 = main_window_size[0];
biohazard_open.box.y0 = main_window_size[1];
biohazard_open.box.x1 = main_window_size[2];
biohazard_open.box.y1 = main_window_size[3];
biohazard_open.x = 0;
biohazard_open.y = 0;
biohazard_open.behind = -1;
wimp_open_wind(&biohazard_open);
}
break;
}
default: /* Ignore any other event */
break;
}
}
/****************************** INITIALISATION ******************************/
/*--- Initialise the program, returning TRUE if it was all OK. ---*/
static BOOL biohazard_initialise(void)
{
wimp_wstate state;
/* turn on hourglass mouse pointer */
registers.r[0] = (int)Song_Name;
registers.r[2] = 0;
os_swi(0x000406C0, point_registers); /* hourglass on */
/* RISC_OSlib initialisation */
wimpt_init("BioHazard");/* Main Wimp initialisation */
res_init("BioHazard"); /* Resources */
resspr_init(); /* Application sprites */
sprite_pointer = resspr_area(); /* Application sprites */
sprite_address = *sprite_pointer;
sprite_mode_pointer = sprite_pointer;
registers.r[0] = 135;
os_swi(0x06, point_registers); /* read current screen mode */
current_screen_mode = registers.r[2];
SpriteSetMode(sprite_mode_pointer,current_screen_mode);
sprite_pointer = sprite_pointer + sprite_address.sproff;
sprite_data_address = (int)sprite_pointer;
sprite_data_address = sprite_data_address - 196;
template_init(); /* Templates */
dbox_init(); /* Dialogue boxes */
wimpt_checkmode();
OS_X_Pixels = wimpt_dx();
OS_Y_Pixels = wimpt_dy();
OS_Bits_Per_Pixel = wimpt_bpp();
#if defined(RISCPC)
virtual_screen_pointer = (int)&virtual_screen[0];
#else
virtual_screen_pointer = sprite_data_address;
#endif
main_window_size[0] = -1280;
main_window_size[1] = -1024;
main_window_size[2] = -(1280-(320*OS_X_Pixels));
main_window_size[3] = -(1024-(256*OS_Y_Pixels));
main_window_size[4] = (-640)+((-512)<<16);
/* Create the main window, and declare its event handler */
if (!biohazard_create_main_window("MainWindow", &biohazard_win_handle))
return FALSE; /* Window creation failed */
win_register_event_handler(biohazard_win_handle, biohazard_event_handler, 0);
/* Create the configuration window, and declare its event handler */
if (!biohazard_create_window("config", &config_win_handle))
return FALSE; /* Window creation failed */
win_register_event_handler(biohazard_win_handle, biohazard_event_handler, 0);
/* Create the init window, and declare its event handler */
if (!biohazard_create_window("init", &biohazard_init_handle))
return FALSE; /* Window creation failed */
win_register_event_handler(biohazard_init_handle, biohazard_event_handler, 0);
/* Get the state of the window */
if (wimpt_complain(wimp_get_wind_state(biohazard_init_handle, &state)) == 0)
{
state.o.behind = -1; /* Make sure window is opened in front */
wimpt_noerr(wimp_open_wind(&state.o));
}
/* Create the menu tree */
if (biohazard_menu = menu_new("BioHazard", ">Info,Single Task,Configure,Pause,Quit"), biohazard_menu == NULL)
return FALSE; /* Menu create failed */
/* Set up the icon on the icon bar, and declare its event handlers */
baricon("!biohazard", (int)resspr_area(), biohazard_iconclick);
if (!event_attachmenu(win_ICONBAR, biohazard_menu, biohazard_menuproc, 0))
return FALSE; /* Unable to attach menu */
screen_address = sprite_data_address;
/* Start tune... */
/*os_swi(284801, point_registers);*/ /* Dsym */
/* Load symphony from disc */
/*registers.r[0] = (int)Song_Name;
registers.r[2] = 0;
os_swi(284800, point_registers);*/ /* Dsym */
/* 4 voices */
registers.r[0] = 4;
os_swi(284815, point_registers); /* Dsym */
/* set sample rate */
registers.r[0] = 52;
os_swi(284823, point_registers); /* Dsym */
/* Reconfigure to new settings */
registers.r[0] = 1;
os_swi(284824, point_registers); /* Dsym */
/* Start tune... */
/*os_swi(284801, point_registers); Dsym */
/* set stereo positions */
registers.r[0] = 0;
registers.r[1] = 0;
os_swi(284803, point_registers); /* Dsym */
registers.r[0] = 1;
registers.r[1] = 0;
os_swi(284803, point_registers); /* Dsym */
/* Load Last_Floor */
registers.r[0] = 255;
registers.r[1] = (int)lastfloor_name;
registers.r[2] = (int)&Last_Floor;
registers.r[3] = 0;
os_swi(8, point_registers); /* OS_File */
if (Last_Floor == 1)
{
/* Load floor sprite 1 into Floor_Sprite space */
registers.r[0] = 255;
registers.r[1] = (int)floorsprite1_name;
registers.r[2] = (int)&Floor_Sprite[0][0];
registers.r[3] = 0;
os_swi(8, point_registers); /* OS_File */
Last_Floor = 2;
}
else
{
/* Load floor sprite 1 into Floor_Sprite space */
registers.r[0] = 255;
registers.r[1] = (int)floorsprite2_name;
registers.r[2] = (int)&Floor_Sprite[0][0];
registers.r[3] = 0;
os_swi(8, point_registers); /* OS_File */
Last_Floor = 1;
}
/* Save last floor data */
registers.r[0] = 10;
registers.r[1] = (int)lastfloor_name;
registers.r[2] = 0;
registers.r[3] = 0;
registers.r[4] = (int)&Last_Floor;
registers.r[5] = ((int)&Last_Floor)+4;
os_swi(8, point_registers); /* OS_File */
/* Load backdrop data into backdrop space */
registers.r[0] = 255;
registers.r[1] = (int)backdrop_name;
registers.r[2] = (int)&Backdrop[0];
registers.r[3] = 0;
os_swi(8, point_registers); /* OS_File */
/* Load weapondata into weapon_data space */
registers.r[0] = 255;
registers.r[1] = (int)Chainsaw_name;
registers.r[2] = (int)&weapon_data[0];
registers.r[3] = 0;
os_swi(8, point_registers); /* OS_File */
/* Load numberdata into Number_Data space */
registers.r[0] = 255;
registers.r[1] = (int)Number_name;
registers.r[2] = (int)&Number_Data[0];
registers.r[3] = 0;
os_swi(8, point_registers); /* OS_File */
/* Load spritedata into sprite_data space */
registers.r[0] = 255;
registers.r[1] = (int)spritedata_name;
registers.r[2] = (int)&sprite_data[0];
registers.r[3] = 0;
os_swi(8, point_registers); /* OS_File */
/* Load bar sprite into Bar_Data space */
registers.r[0] = 255;
registers.r[1] = (int)bar_name;
registers.r[2] = (int)&Bar_Data[0];
registers.r[3] = 0;
os_swi(8, point_registers); /* OS_File */
/* Load mapdata into map space */
registers.r[0] = 255;
registers.r[1] = (int)mapdata_name;
registers.r[2] = (int)&map[0][0];
registers.r[3] = 0;
os_swi(8, point_registers); /* OS_File */
map[X>>22][Y>>22] = 0;
/* convert word map to data map */
for (loop1 = 0; loop1 < 64; loop1++)
{
for (loop2 = 0; loop2 < 64; loop2++)
{
if (map[loop1][loop2] != 0)
{
Map_Data[loop1][loop2] = 0;
}
else
{
Map_Data[loop1][loop2] = 0;
}
}
}
/* Load blockdata into block_data space */
registers.r[0] = 255;
registers.r[1] = (int)blockdata_name;
registers.r[2] = (int)&block_data[0][0];
registers.r[3] = 0;
os_swi(8, point_registers); /* OS_File */
/* Set up trigonometric tables */
theta = 0;
angle = PI/1920;
/* Set up cos & sin division tables */
theta = angle;
for (loop2=1; loop2<960; loop2++)
{
cos_div_table[loop2] = (int)((1/(cos(theta)))*262144);
theta = theta + angle;
}
cos_div_table[960] = 262144;
cos_div_table[0] = 262144;
/* tan & interception */
theta = 0.0;
for (loop2=0; loop2<959; loop2++)
{
tan_table[loop2] = (int)(tan(theta)*65536);
increment[loop2] = (int)(tan(theta)*4194304);
if (increment[loop2] > (1<<29))
{
increment[loop2] = (1<<29);
}
theta = theta + angle;
}
tan_table[959] = tan_table[958]+(100<<16);
tan_table[960] = tan_table[959]+(500<<16);
increment[959] = (1<<29)+(1<<28);
increment[960] = (1<<29)+(2<<28);
/* Set up movement */
theta = 0;
for (loop2=0; loop2<3840; loop2++)
{
move = 24*(cos(theta))*65536;
if ((move - (int)move) > 0.5)
{
move += 1.0;
}
else if ((move - (int)move) < -0.5)
{
move -= 1.0;
}
x_move_table[loop2] = move;
move = 24*(sin(theta))*65536;
if ((move - (int)move) > 0.5)
{
move += 1.0;
}
else if ((move - (int)move) < -0.5)
{
move -= 1.0;
}
y_move_table[loop2] = move;
theta = theta + angle;
}
/* set up gradient tables */
for (loop2=1; loop2<1024; loop2++)
{
move = 64.0/((float)loop2);
gradient_table[loop2] = (int)(move * 16384);
}
/* set up next free door list */
for (loop2=0; loop2<64; loop2++)
{
Next_Free_List[loop2] = loop2;
}
Calculate_Tables();
Calculate_Tactical_Tables();
Calculate_main_Tables();
/* calculate colour map positions */
for (loop1=0; loop1 < 256; loop1++)
{
/* convert 256 col mode byte to pallette entry */
pallette_entry_red = ((loop1 & 7)<<4) + ((loop1 & 16)<<3);
pallette_entry_green = ((loop1 & 3)<<4) + ((loop1 & 96)<<1);
pallette_entry_blue = ((loop1 & 3)<<4) + ((loop1 & 4)<<3) + (loop1 & 128);
pallette_entry = (pallette_entry_red<<8)+(pallette_entry_green<<16)+(pallette_entry_blue<<24);
registers.r[0] = pallette_entry;
os_swi(0x40742, point_registers); /* ColourTrans_ReturnColourNumber */
ColourMap[loop1] = registers.r[0];
}
/* set door positions */
/*for (loop1=0; loop1 < 32; loop1++)
{
for (loop2=0; loop2 < 32; loop2++)
{
door_map[loop1][loop2] = 64;
if (map[loop1][loop2] == door_code)
{
map[loop1][loop2] = 0;
}
}
}*/
/*Secret_Door_Position = 48;
Secret_Door_Orientation = 4;
door_map[1][6] = Secret_Door_Code;
map[1][6] = door_code;*/
door_active[0] = 0;
door_active[1] = 0;
DrawBorder(sprite_data_address,screen_width,screen_height,(int)&Backdrop[0]);
wimpt_noerr(wimp_close_wind(biohazard_init_handle));
win_claim_idle_events(biohazard_win_handle);
win_claim_unknown_events(biohazard_win_handle);
Sprite_List[0].sprite_position_x = ((6*64)+32)<<16;
Sprite_List[0].sprite_position_y = ((6*64)+32)<<16;
/* play Game_On opening sample */
registers.r[0] = 0;
registers.r[1] = 29;
registers.r[2] = Game_On;
registers.r[3] = 0;
registers.r[4] = 0;
registers.r[5] = 0;
registers.r[6] = 0;
os_swi(284806, point_registers); /* Dsym */
/* turn off hourglass mouse pointer */
registers.r[0] = (int)Song_Name;
registers.r[2] = 0;
os_swi(0x000406C1, point_registers); /* hourglass off */
/* All went ok */
return TRUE;
}
/******************************* MAIN PROGRAM ********************************/
/*--- Main entry point. ---*/
int main()
{
if (biohazard_initialise())
{
/* --- mask off the events we're not interested in --- */
event_setmask(wimp_EMPTRENTER|wimp_EMPTRLEAVE);
/* The main event loop */
while (TRUE)
event_process();
}
return 0;
}