Files
RustRaptor/raptor/src/rap.cpp
T
raptorreplica f7c9b7a02d Vendor raptor source files (was embedded gitlink)
Tree vendored at upstream 0019c5dd; origin + license recorded in
raptor/VENDOR.txt. Windows SDL dev packages excluded via .gitignore.
2026-08-25 22:08:42 +10:00

1575 lines
36 KiB
C++

#include <stdio.h>
#include <string.h>
#include <time.h>
#include "SDL.h"
#include "common.h"
#include "glbapi.h"
#include "i_video.h"
#include "gfxapi.h"
#include "vmemapi.h"
#include "intro.h"
#include "fx.h"
#include "windows.h"
#include "swdapi.h"
#include "ptrapi.h"
#include "imsapi.h"
#include "kbdapi.h"
#include "input.h"
#include "prefapi.h"
#include "loadsave.h"
#include "help.h"
#include "objects.h"
#include "demo.h"
#include "tile.h"
#include "anims.h"
#include "bonus.h"
#include "shots.h"
#include "eshot.h"
#include "enemy.h"
#include "shadow.h"
#include "flame.h"
#include "input.h"
#include "joyapi.h"
#include "i_lastscr.h"
#include "fileids.h"
#include "entypes.h"
#ifdef _WIN32
#include <io.h>
#endif // _WIN32
#ifdef __GNUC__
#include <unistd.h>
#endif // __GNUC__
#define wmemcpy(dst,src,size) memmove(dst,src,size)
struct bday_t {
int month;
int day;
int year;
const char *name;
};
int wRandSeed = 1;
int wrand(void)
{
wRandSeed = ((long long)wRandSeed * 1103515245) + 12345;
return (wRandSeed >> 16) & 0x7fff;
}
void wsrand(int seed)
{
wRandSeed = seed;
}
#define MAX_BDAY 6
bday_t bday[MAX_BDAY];
#define MONTH 2
#define DAY 20
#define YEAR 1994
#define WLENGTH 12
int bday_flag = 0;
int bday_num = -1;
char *palette;
int godmode;
int cur_diff;
int reg_flag;
int demo_mode;
int demo_flag;
int ingameflag;
int cur_game;
int game_wave[4];
int gameflag[4];
int curship[16];
int lship[8];
int dship[8];
int fship[8];
char *numbers[11];
char gdmodestr[] = "CASTLE";
PLAYEROBJ plr;
char* g_highmem;
char *cursor_pic;
int draw_player;
int fadeflag;
int end_fadeflag;
int debugflag;
int playerx = PLAYERINITX;
int playery = PLAYERINITY;
int player_cx = PLAYERINITX;
int player_cy = PLAYERINITY;
int playerbasepic = 3;
int startfadeflag;
int g_oldsuper = -1;
int g_oldshield = -1;
int startendwave = -1;
int gl_cnt;
int g_flash = 0;
char gpal[768];
int end_wave;
int playerpic = 4;
int g_mapleft;
int fadecnt;
#define ROTPAL_START 240
#define FADE_FRAMES 20
#define MAX_GLOW 20
int shakes[FADE_FRAMES] = {
-4, 4, -3, 3, -2, 2, -1, 1,
-1, 1, -1, 1, -1, 1, -1, 1,
-1, 1, 0, 0
};
int o_engine[8] = {
0, 1, 2, 3, 2, 1, 0, 0
};
int o_gun1[8] = {
1, 3, 5, 6, 5, 3, 1, 0
};
int o_gun2[8] = {
1, 3, 6, 9, 6, 3, 2, 0
};
int o_gun3[8] = {
2, 6, 8, 11, 8, 6, 2, 0
};
int glowtable[20] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
};
char flatnames[4][14] = {
"FLATSG1_ITM",
"FLATSG2_ITM",
"FLATSG3_ITM",
"FLATSG4_ITM"
};
FLATS *flatlib[4];
/***************************************************************************
RAP_Bday() - Get system date
***************************************************************************/
void
RAP_Bday(
void
)
{
time_t t = time(NULL);
struct tm *date = localtime(&t);
int loop;
bday_flag = 0;
bday_num = -1;
for (loop = 0; loop < MAX_BDAY; loop++)
{
if (bday[loop].day)
{
if (date->tm_mon + 1 == bday[loop].month && date->tm_mday == bday[loop].day && date->tm_year + 1900 >= bday[loop].year)
{
bday_num = loop;
if (loop == 0)
bday_flag = 1;
}
}
}
}
/***************************************************************************
InitScreen() - Prints the Init Screen
***************************************************************************/
void
InitScreen(
void
)
{
printf(" RAPTOR: Call Of The Shadows V1.2 (c)1994 Cygnus Studios\n");
}
/*==========================================================================
ShutDown () Shut Down function called by EXIT_xxx functions
==========================================================================*/
void
ShutDown(
int errcode
)
{
char* mem;
if (!errcode && !godmode)
WIN_Order();
//IPT_DeInit();
//DMX_DeInit();
//GFX_EndSystem();
//PTR_End();
//KBD_End();
if (reg_flag)
mem = GLB_GetItem(FILE002_LASTSCR2_TXT); //Get ANSI Screen Fullversion from GLB to char*
else
mem = GLB_GetItem(FILE001_LASTSCR1_TXT); //Get ANSI Screen Shareware from GLB to char*
closewindow(); //Close Main Window
I_LASTSCR(mem); //Call to display ANSI Screen
GLB_FreeAll();
IPT_CloJoy(); //Close Joystick
SWD_End();
SDL_Quit();
free(g_highmem);
}
/***************************************************************************
RAP_ClearSides () - Clears the Sides
***************************************************************************/
void
RAP_ClearSides(
void
)
{
GFX_ColorBox(0, 0, MAP_LEFT, 200, 0);
GFX_ColorBox(320 - MAP_LEFT, 0, MAP_LEFT, 200, 0);
}
/***************************************************************************
RAP_GetShipPic () - Loads Correct Ship Pics for Light/Dark Waves
***************************************************************************/
void
RAP_GetShipPic(
void
)
{
int lightflag, loop;
lightflag = 1;
// GAME 2 wave 8
if (cur_game == 1 && game_wave[cur_game] == 7)
lightflag = 0;
// GAME 3 wave 3
if (cur_game == 2 && game_wave[cur_game] == 2)
lightflag = 0;
for (loop = 0; loop < 7; loop++)
{
if (lightflag)
{
curship[loop] = lship[loop];
curship[loop + 7] = lship[loop];
}
else
{
curship[loop] = dship[loop];
curship[loop + 7] = fship[loop];
}
}
for (loop = 0; loop < 14; loop++)
{
GLB_CacheItem(curship[loop]);
}
}
/***************************************************************************
Rot_Color () - Rotates color in palette
***************************************************************************/
void
Rot_Color(
char *gpal,
int snum,
int len)
{
short pos;
short maxloop;
char h1[3];
pos = snum * 3;
maxloop = len * 3;
wmemcpy(h1, &gpal[pos], 3);
wmemcpy(&gpal[pos], &gpal[pos+3], maxloop);
wmemcpy(&gpal[pos+maxloop-3], h1, 3);
}
/***************************************************************************
InitMobj() - Inits an object to be moved
***************************************************************************/
void
InitMobj(
MOVEOBJ *cur // INPUT : pointer to MOVEOBJ
)
{
cur->done = 0;
cur->addx = 1;
cur->addy = 1;
cur->delx = cur->x2 - cur->x;
cur->dely = cur->y2 - cur->y;
if (cur->delx < 0)
{
cur->delx = -cur->delx;
cur->addx = -cur->addx;
}
if (cur->dely < 0)
{
cur->dely = -cur->dely;
cur->addy = -cur->addy;
}
if (cur->delx >= cur->dely)
{
cur->err = -(cur->dely >> 1);
cur->maxloop = cur->delx + 1;
}
else
{
cur->err = cur->delx >> 1;
cur->maxloop = cur->dely + 1;
}
}
/***************************************************************************
MoveMobj() - gets next postion for an Object
***************************************************************************/
void
MoveMobj(
MOVEOBJ *cur // INPUT : pointer to MOVEOBJ
)
{
if (cur->maxloop == 0)
{
cur->done = 1;
return;
}
if (cur->delx >= cur->dely)
{
cur->x += cur->addx;
cur->err += cur->dely;
if (cur->err > 0)
{
cur->y += cur->addy;
cur->err -= cur->delx;
}
}
else
{
cur->y += cur->addy;
cur->err += cur->delx;
if (cur->err > 0)
{
cur->x += cur->addx;
cur->err -= cur->dely;
}
}
cur->maxloop--;
}
/***************************************************************************
MoveSobj() - gets next postion for an Object at speed
***************************************************************************/
int
MoveSobj(
MOVEOBJ *cur, // INPUT : pointer to MOVEOBJ
int speed // INPUT : speed to plot at
)
{
if (speed == 0)
return 0;
if (cur->delx >= cur->dely)
{
while (speed)
{
speed--;
cur->maxloop--;
cur->x += cur->addx;
cur->err += cur->dely;
if (cur->err > 0)
{
cur->y += cur->addy;
cur->err -= cur->delx;
}
}
}
else
{
while (speed)
{
speed--;
cur->maxloop--;
cur->y += cur->addy;
cur->err += cur->delx;
if (cur->err > 0)
{
cur->x += cur->addx;
cur->err -= cur->dely;
}
}
}
if (cur->maxloop < 1)
cur->done = 1;
return speed;
}
/***************************************************************************
RAP_PrintNum() -
***************************************************************************/
void
RAP_PrintNum(
int x,
int y,
char *str
)
{
int maxloop, num;
maxloop = strlen(str);
GFX_PutSprite(numbers[10], x, y);
x += 9;
while (--maxloop != -1)
{
num = *str - '0';
if (num < 11 && num >= 0)
GFX_PutSprite(numbers[num], x, y);
x += 8;
str++;
}
}
/***************************************************************************
RAP_DisplayShieldLevel() -
***************************************************************************/
void
RAP_DisplayShieldLevel(
int xpos,
int level
)
{
char *outbuf;
unsigned int curs, addx;
int loop;
outbuf = &displayscreen[ylookup[199] + xpos];
addx = (SHIELD_COLOR_RUN << 16) / MAX_SHIELD;
curs = 0;
for (loop = 0; loop < MAX_SHIELD; loop++)
{
if (loop < level)
memset(outbuf, 74 - (curs >> 16), 4);
else
memset(outbuf, 0, 4);
curs += addx;
outbuf -= 640;
}
}
/***************************************************************************
RAP_DisplayStats() -
***************************************************************************/
void
RAP_DisplayStats(
void
)
{
char temp[24];
int super, shield, loop, x, y;
char* pic;
GFX_PIC *h;
static int damage = -1;
static int blinkflag = 1;
// == DISPLAY SUPER SHIELD ========================
super = OBJS_GetAmt(S_SUPER_SHIELD);
if (g_oldsuper != super)
{
RAP_DisplayShieldLevel(MAP_LEFT - 8, super);
g_oldsuper = super;
}
// == DISPLAY NORM SHIELD ========================
shield = OBJS_GetAmt(S_ENERGY);
if (g_oldshield != shield)
{
RAP_DisplayShieldLevel(MAP_RIGHT + 4, shield);
}
if (shield <= 0 && !godmode)
{
// BLOW UP SHIP IF ! IN GOD MODE ===================
ANIMS_StartAnim(A_MED_AIR_EXPLO, playerx + (wrand()%32), playery + (wrand()%32));
ANIMS_StartAnim(A_SMALL_AIR_EXPLO, playerx + (wrand()%32), playery + (wrand()%32));
if (startendwave > END_EXPLODE)
{
if ((wrand()%2) == 0)
SND_Patch(FX_AIREXPLO, 30);
else
SND_Patch(FX_AIREXPLO, 225);
}
if (startendwave == -1)
startendwave = END_DURATION;
if (startendwave == END_EXPLODE)
{
draw_player = 0;
SND_Patch(FX_AIREXPLO, 127);
SND_Patch(FX_AIREXPLO2, 127);
ANIMS_StartAnim(A_LARGE_AIR_EXPLO, player_cx, player_cy);
for (loop = 0; loop < (PLAYERWIDTH * PLAYERHEIGHT) / 2; loop++)
{
x = playerx - (PLAYERWIDTH / 2) + (wrand() % 32) * 2;
y = playery - (PLAYERWIDTH / 2) + (wrand() % 32) * 2;
if (loop & 1)
ANIMS_StartAnim(A_LARGE_AIR_EXPLO, x, y);
else
ANIMS_StartAAnim(A_MED_AIR_EXPLO2, x, y);
}
SND_Patch(FX_AIREXPLO2, 127);
}
}
// IF END OF WAVE FLY SHIP OFF SCREEN ===================
if (startendwave != -1 && shield > 0)
{
if (startendwave == END_FLYOFF)
{
IPT_PauseControl(1);
SND_Patch(FX_FLYBY, 127);
}
if (startendwave < END_FLYOFF)
{
x = 0;
if (playerx < 152)
x = 8;
else if (playerx > 168)
x = -8;
IPT_FMovePlayer(x, -4);
}
}
if (shield <= SHIELD_LOW && !godmode)
{
if (!(gl_cnt % 8))
{
blinkflag ^= 1;
if (blinkflag)
{
if (damage)
{
damage--;
if ((haptic) && (control == 2))
{
IPT_CalJoyRumbleHigh();
}
}
}
}
if (shield < g_oldshield && super < 1)
{
if (OBJS_LoseObj())
{
SND_Patch(FX_CRASH, 127);
damage = 2;
}
}
if (blinkflag)
{
if (damage)
{
pic = GLB_GetItem(FILE111_WEPDEST_PIC);
h = (GFX_PIC*)pic;
GFX_PutSprite(pic, (320 - LE_LONG(h->width)) >> 1, MAP_BOTTOM - 9);
}
if (startendwave == -1)
SND_Patch(FX_WARNING, 127);
pic = GLB_GetItem(FILE110_SHLDLOW_PIC);
h = (GFX_PIC*)pic;
GFX_PutSprite(pic, (320 - LE_LONG(h->width)) >> 1, MAP_BOTTOM);
}
}
g_oldshield = shield;
OBJS_DisplayStats();
sprintf(temp, "%08u", plr.score);
RAP_PrintNum(119, MAP_TOP, temp);
if (demo_mode == DEMO_RECORD)
DEMO_DisplayStats();
if (debugflag)
{
sprintf(temp, "%02u", plr.diff[cur_game]);
RAP_PrintNum(18, MAP_TOP, temp);
x = MAP_LEFT + 16;
for (loop = 0; loop < 16; loop++)
{
GFX_ColorBox(x, 0, 8, 8, 240 + loop);
x += 8;
}
}
}
/***************************************************************************
RAP_PaletteStuff() -
***************************************************************************/
void
RAP_PaletteStuff(
void
)
{
static int wblink = 0;
static int glow1 = 0;
static int glow2 = 8;
static int cnt = 0;
static int palcnt = 0;
static int blink = 0;
int offset;
char *pal1, *pal2;
int num;
if (cnt & 1)
{
// == COLOR 240 - 244 ======== WATER
if (palcnt % 4 != 0)
Rot_Color(gpal, 240, 5);
// == COLOR 245 - 249 ======== FIRE
if (palcnt % 2 != 0)
Rot_Color(gpal, 245, 5);
// == COLOR 250 ======== GLOWING FIRE 1
offset = 250 * 3;
pal1 = &gpal[offset];
pal2 = &palette[offset];
num = glowtable[glow1];
glow1++;
glow1 %= MAX_GLOW;
*pal1 = *pal2 - num;
if ((uint8_t)*pal2 < num)
*pal1 = 0;
pal1++;
pal2++;
*pal1 = *pal2 - num;
if ((uint8_t)*pal2 < num)
*pal1 = 0;
pal1++;
pal2++;
*pal1 = *pal2 - num;
if ((uint8_t)*pal2 < num)
*pal1 = 0;
// == COLOR 251 ======== GLOWING FIRE 2
offset = 251 * 3;
pal1 = &gpal[offset];
pal2 = &palette[offset];
num = glowtable[glow2];
glow2++;
glow2 %= MAX_GLOW;
*pal1 = *pal2 - num;
if ((uint8_t)*pal2 < num)
*pal1 = 0;
pal1++;
pal2++;
*pal1 = *pal2 - num;
if ((uint8_t)*pal2 < num)
*pal1 = 0;
pal1++;
pal2++;
*pal1 = *pal2 - num;
if ((uint8_t)*pal2 < num)
*pal1 = 0;
// == COLOR 252 & 253 ======== BLINKING RED AND GREEN
if (palcnt % 2)
{
offset = 252 * 3;
pal1 = &gpal[offset];
pal2 = &palette[offset];
if (blink & 1)
{
memcpy(pal1, pal2, 3);
pal1 += 3;
pal2 += 3;
memset(pal1, 0, 3);
}
else
{
memset(pal1, 0, 3);
pal1 += 3;
pal2 += 3;
memcpy(pal1, pal2, 3);
}
blink++;
}
// == COLOR 254 ======== BLINKING BLUE
offset = 254 * 3;
if ((wrand() % 3) == 0)
{
pal1 = &gpal[offset];
pal2 = &palette[offset];
memcpy(pal1, pal2, 3);
}
else
{
pal1 = &gpal[offset];
memset(pal1, 0, 3);
}
// == COLOR 255 ======== BLINKING WHITE
offset = 255 * 3;
if (wblink < 3)
{
pal1 = &gpal[offset];
pal2 = &palette[offset];
memcpy(pal1, pal2, 3);
}
else
{
pal1 = &gpal[offset];
memset(pal1, 0, 3);
}
wblink++;
wblink %= 6;
GFX_SetPalette(gpal, 240);
palcnt++;
}
cnt++;
}
/***************************************************************************
Do_Game () - The main game thing this is it dude
***************************************************************************/
int // TRUE=Aborted, FALSE = timeout
Do_Game(
void
)
{
int b2_flag, b3_flag, init_flag, rval, start_score, local_cnt;
b2_flag = 0;
b3_flag = 0;
init_flag = 1;
rval = 0;
start_score = 0;
draw_player = 1;
wsrand(game_wave[cur_game] << 10);
fadeflag = 0;
end_fadeflag = 0;
KBD_Clear();
IMS_StartAck();
PTR_SetGameFlag(1);
PTR_Settouchmouseb1off(0);
BUT_1 = 0;
BUT_2 = 0;
BUT_3 = 0;
BUT_4 = 0;
playerx = PLAYERINITX;
playery = PLAYERINITY;
if (!demo_mode)
{
PTR_SetPos(playerx, playery);
IPT_Start();
}
RAP_GetShipPic();
BONUS_Clear();
ANIMS_Clear();
SHOTS_Clear();
ESHOT_Clear();
memcpy(gpal, palette, 768);
GFX_FadeOut(0, 0, 0, 2);
memset(displaybuffer, 0, 64000);
memset(displayscreen, 0, 64000);
local_cnt = GFX_GetFrameCount();
g_flash = 0;
g_oldsuper = -1;
g_oldshield = -1;
startendwave = -1;
if (demo_flag == DEMO_RECORD)
DEMO_StartRec();
// == CLEAR ALL BUTTONS ===========================
start_score = plr.score;
IMS_StartAck();
memset(buttons, 0, sizeof(buttons));
do
{
num_shadows = num_gshadows = 0;
#ifdef __ANDROID__
if (!I_GetNeedResize(true))
IPT_MovePlayer();
#else
IPT_MovePlayer();
#endif //__ANDROID__
if (KBD_IsKey(SC_F1))
{
SWD_SetClearFlag(0);
IPT_End();
HELP_Win("OVERVW06_TXT");
memset(displayscreen, 0, 64000);
IPT_Start();
g_oldsuper = -1;
g_oldshield = -1;
RAP_ClearSides();
RAP_DisplayStats();
SWD_SetClearFlag(1);
IMS_StartAck();
BUT_1 = 0;
BUT_2 = 0;
BUT_3 = 0;
BUT_4 = 0;
b2_flag = 0;
b3_flag = 0;
}
if (KBD_IsKey(SC_P) || JOY_IsKeyInGameStart(Start))
{
while (IMS_IsAck())
{
}
SWD_SetClearFlag(0);
RAP_ClearSides();
WIN_Pause();
g_oldsuper = -1;
g_oldshield = -1;
RAP_ClearSides();
RAP_DisplayStats();
SWD_SetClearFlag(1);
IMS_StartAck();
BUT_1 = 0;
BUT_2 = 0;
BUT_3 = 0;
BUT_4 = 0;
b2_flag = 0;
b3_flag = 0;
}
if (KBD_IsKey(SC_F8) && godmode)
{
while (IMS_IsAck())
{
}
debugflag ^= 1;
}
if (DEMO_Think())
break;
if (demo_mode == DEMO_PLAYBACK)
{
if (IMS_IsAck() && !BUT_2 && !BUT_3 && !BUT_4)
{
rval = 1;
break;
}
}
switch (KBD_LASTSCAN)
{
case SC_NONE:
break;
case 1:
break;
case SC_1:
OBJS_MakeSpecial(S_DUMB_MISSLE);
break;
case SC_2:
OBJS_MakeSpecial(S_MINI_GUN);
break;
case SC_3:
OBJS_MakeSpecial(S_TURRET);
break;
case SC_4:
OBJS_MakeSpecial(S_MISSLE_PODS);
break;
case SC_5:
OBJS_MakeSpecial(S_AIR_MISSLE);
break;
case SC_6:
OBJS_MakeSpecial(S_GRD_MISSLE);
break;
case SC_7:
OBJS_MakeSpecial(S_BOMB);
break;
case SC_8:
OBJS_MakeSpecial(S_ENERGY_GRAB);
break;
case SC_9:
OBJS_MakeSpecial(S_PULSE_CANNON);
break;
case SC_0:
OBJS_MakeSpecial(S_DEATH_RAY);
break;
case SC_MINUS:
OBJS_MakeSpecial(S_FORWARD_LASER);
break;
}
if (BUT_1)
{
OBJS_Use(S_FORWARD_GUNS);
OBJS_Use(S_PLASMA_GUNS);
OBJS_Use(S_MICRO_MISSLE);
BUT_1 = 0;
if (plr.sweapon != -1)
OBJS_Use(plr.sweapon);
}
if (BUT_2)
{
BUT_2 = 0;
if (!b2_flag)
{
SND_Patch(FX_SWEP, 127);
b2_flag = 1;
OBJS_GetNext();
}
}
else
{
if (b2_flag == 1)
b2_flag = 0;
}
if (BUT_3)
{
BUT_3 = 0;
if (!b3_flag)
{
b3_flag = 1;
OBJS_Use(S_MEGA_BOMB);
}
}
else
{
if (b3_flag == 1)
b3_flag = 0;
}
if (startendwave != -1)
{
if (startendwave == 0)
end_wave = 1;
startendwave--;
}
gl_cnt++;
TILE_Think();
ENEMY_Think();
ESHOT_Think();
BONUS_Think();
SHOTS_Think();
ANIMS_Think();
OBJS_Think();
if (draw_player)
SHADOW_Add(curship[playerpic + g_flash], playerx, playery);
TILE_Display();
SHADOW_DisplayGround();
ENEMY_DisplayGround();
SHADOW_DisplaySky();
ANIMS_DisplayGround();
ENEMY_DisplaySky();
SHOTS_Display();
BONUS_Display();
ANIMS_DisplaySky();
if (draw_player)
{
FLAME_Down(player_cx - o_engine[playerpic] - 3, player_cy + 15, 4, gl_cnt % 2);
FLAME_Down(player_cx + o_engine[playerpic] - 2, player_cy + 15, 4, gl_cnt % 2);
GFX_PutSprite((char*)GLB_GetItem(curship[playerpic + g_flash]), playerx, playery);
g_flash = 0;
}
ANIMS_DisplayHigh();
ESHOT_Display();
if (fadeflag)
{
if (fadecnt >= FADE_FRAMES - 1)
{
RAP_ClearSides();
g_mapleft = MAP_LEFT;
GFX_SetPalette(gpal, 0);
fadeflag = 0;
g_oldsuper = -1;
g_oldshield = -1;
}
else
{
RAP_ClearSides();
retraceflag = 0;
GFX_FadeFrame(gpal, fadecnt, FADE_FRAMES);
retraceflag = 0;
g_mapleft = shakes[fadecnt] + MAP_LEFT;
fadecnt++;
}
}
else
{
if (!init_flag)
RAP_PaletteStuff();
}
RAP_DisplayStats();
while (GFX_GetFrameCount() - local_cnt < 3)
{
}
local_cnt = GFX_GetFrameCount();
if (fadeflag)
TILE_ShakeScreen();
else
TILE_DisplayScreen();
if (startfadeflag)
{
SND_Patch(FX_GEXPLO, 127);
SND_Patch(FX_AIREXPLO, 127);
retraceflag = 1;
GFX_FadeOut(63, 60, 60, 1);
GFX_FadeStart();
startfadeflag = 0;
fadeflag = 1;
fadecnt = 0;
retraceflag = 0;
}
if (reg_flag && KBD_Key(SC_BACKSPACE))
{
OBJS_Add(S_DEATH_RAY);
OBJS_Add(S_ENERGY);
OBJS_Add(S_ENERGY);
OBJS_Add(S_ENERGY);
plr.score = 0;
}
if (init_flag)
{
init_flag = 0;
GFX_FadeIn(gpal, 64);
}
if (KBD_Key(SC_X) && KBD_Key(SC_ALT))
{
RAP_ClearSides();
SWD_SetClearFlag(0);
IPT_End();
WIN_AskExit();
IPT_Start();
g_oldsuper = -1;
g_oldshield = -1;
RAP_ClearSides();
RAP_DisplayStats();
SWD_SetClearFlag(1);
IMS_StartAck();
BUT_1 = 0;
BUT_2 = 0;
BUT_3 = 0;
BUT_4 = 0;
b2_flag = 0;
b3_flag = 0;
}
if (KBD_IsKey(SC_ESC) || JOY_IsKeyInGameBack(Back))
{
if (godmode)
end_wave = 1;
if (!demo_mode)
{
SWD_SetClearFlag(0);
#ifdef __ANDROID__
int old_mx = cur_mx;
int old_my = cur_my;
#endif //__ANDROID__
IPT_End();
RAP_ClearSides();
if (WIN_AskBool("Abort Mission ?"))
{
plr.score = start_score;
rval = 1;
break;
}
#ifdef __ANDROID__
PTR_SetPos(old_mx, old_my);
#endif //__ANDROID__
IPT_Start();
g_oldsuper = -1;
g_oldshield = -1;
RAP_ClearSides();
RAP_DisplayStats();
SWD_SetClearFlag(1);
IMS_StartAck();
BUT_1 = 0;
BUT_2 = 0;
BUT_3 = 0;
BUT_4 = 0;
b2_flag = 0;
b3_flag = 0;
}
else if (demo_mode == DEMO_PLAYBACK)
{
rval = 1;
break;
}
else if (demo_mode == DEMO_RECORD)
break;
}
} while (!end_wave);
GFX_FadeOut(0, 0, 0, 32);
RAP_FreeMap();
end_wave = 0;
PTR_SetGameFlag(0);
memset(displaybuffer, 0, 64000);
GFX_MarkUpdate(0, 0, 320, 200);
IPT_PauseControl(0);
GFX_DisplayUpdate();
GFX_SetPalette(palette, 0);
IPT_End();
if (demo_flag == DEMO_RECORD)
DEMO_SaveFile();
return rval;
}
/***************************************************************************
RAP_InitMem() - Allocates memory for VM and GLB to use
***************************************************************************/
void
RAP_InitMem(
void
)
{
unsigned int heapsize = 0x495FF0;
g_highmem = (char*)calloc(heapsize, 1);
VM_InitMemory(g_highmem, heapsize);
GLB_UseVM();
}
/***************************************************************************
main() -
***************************************************************************/
int
main(
int argc,
char *argv[]
)
{
char *var1, *tptr, *pal;
int loop, numfiles, ptrflag, item;
var1 = getenv("S_HOST");
InitScreen();
RAP_InitLoadSave();
#if _WIN32 || __linux__ || __APPLE__
if (access(RAP_SetupFilename(), 0))
{
INI_InitPreference(RAP_SetupFilename());
RAP_WriteDefaultSetup();
}
#else
if (access(RAP_SetupFilename(), 0))
{
printf("\n\n** You must run SETUP first! **\n");
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
"Raptor", "** You must run SETUP first! **", NULL);
exit(0);
}
#endif //_WIN32 || __linux__ || __APPLE__
godmode = 0;
if (var1 != NULL && !strcmp(var1, gdmodestr))
godmode = 1;
else
godmode = 0;
if (argv[1])
{
if (!strcmp(argv[1], "REC"))
{
DEMO_SetFileName(argv[2]);
demo_flag = DEMO_RECORD;
printf("DEMO RECORD enabled\n");
}
else if (!strcmp(argv[1], "PLAY"))
{
if (!access(argv[2], 0))
{
DEMO_SetFileName(argv[2]);
demo_flag = DEMO_PLAYBACK;
printf("DEMO PLAYBACK enabled\n");
}
}
}
if (godmode)
printf("GOD mode enabled\n");
cur_diff = 0;
if (!access("FILE0001.GLB", 0) ||
!access("file0001.glb", 0) ||
RAP_CheckFileInPath("FILE0001.GLB") ||
RAP_CheckFileInPath("file0001.glb"))
gameflag[0] = 1;
if (!access("FILE0002.GLB", 0) ||
!access("file0002.glb", 0) ||
RAP_CheckFileInPath("FILE0002.GLB") ||
RAP_CheckFileInPath("file0002.glb"))
gameflag[1] = 1;
if ((!access("FILE0003.GLB", 0) && !access("FILE0004.GLB", 0)) ||
(!access("file0003.glb", 0) && !access("file0004.glb", 0)) ||
(!access("FILE0003.GLB", 0) && !access("file0004.glb", 0)) ||
(!access("file0003.glb", 0) && !access("FILE0004.GLB", 0)) ||
(RAP_CheckFileInPath("FILE0003.GLB") && RAP_CheckFileInPath("FILE0004.GLB")) ||
(RAP_CheckFileInPath("file0003.glb") && RAP_CheckFileInPath("file0004.glb")) ||
(RAP_CheckFileInPath("FILE0003.GLB") && RAP_CheckFileInPath("file0004.glb")) ||
(RAP_CheckFileInPath("file0003.glb") && RAP_CheckFileInPath("FILE0004.GLB")))
{
gameflag[2] = 1;
gameflag[3] = 1;
}
if (gameflag[1] + gameflag[2])
reg_flag = 1;
numfiles = 0;
for (loop = 0; loop < 4; loop++)
{
if (gameflag[loop])
numfiles++;
}
if ((access("FILE0000.GLB", 0) && !RAP_CheckFileInPath("FILE0000.GLB")) &&
(access("file0000.glb", 0) && !RAP_CheckFileInPath("file0000.glb")) ||
!numfiles)
{
printf("All game data files NOT FOUND cannot proceed !!\n");
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
"Raptor", "All game data files NOT FOUND cannot proceed !!", NULL);
exit(0);
}
printf("Init -\n");
EXIT_Install(ShutDown);
// ================================================
// SET UP B-DAY STUFF O RAMA
// ================================================
memset(bday, 0, sizeof(bday));
bday[0].month = 5; // Scott
bday[0].day = 16;
bday[0].year = 1994;
bday[0].name = "Scott Host";
bday[1].month = 2; // Dave
bday[1].day = 27;
bday[1].year = 1996;
bday[1].name = "Dave T.";
bday[2].month = 10; // JIM
bday[2].day = 2;
bday[2].year = 1995;
bday[2].name = "Jim M.";
bday[3].month = 3; // BOBBY P.
bday[3].day = 12;
bday[3].year = 1995;
bday[3].name = "Bobby P.";
bday[4].month = 8; // RICH
bday[4].day = 28;
bday[4].year = 1995;
bday[4].name = "Rich F.";
bday[5].month = 4; // Paul
bday[5].day = 24;
bday[5].year = 1996;
bday[5].name = "Paul R.";
RAP_Bday();
if (bday_num != -1)
printf("Birthday() = %s\n", bday[bday_num].name);
// ================================================
if (access(RAP_SetupFilename(), 0))
EXIT_Error("You Must run SETUP.EXE First !!");
if (!INI_InitPreference(RAP_SetupFilename()))
EXIT_Error("SETUP Error");
fflush(stdout);
KBD_Install();
GFX_InitSystem();
SWD_Install(0);
VIDEO_LoadPrefs();
IPT_LoadPrefs();
switch (control)
{
default:
printf("PTR_Init()-Auto\n");
fflush(stdout);
ptrflag = PTR_Init(P_MOUSE);
usekb_flag = 1;
break;
case I_JOYSTICK:
printf("PTR_Init()-Joystick\n");
fflush(stdout);
ptrflag = PTR_Init(P_JOYSTICK);
if (joy_ipt_MenuNew)
usekb_flag = 1;
else
usekb_flag = 0;
break;
case I_MOUSE:
printf("PTR_Init()-Mouse\n");
fflush(stdout);
ptrflag = PTR_Init(P_MOUSE);
usekb_flag = 0;
break;
}
if (reg_flag)
{
printf("Registered EXE!\n");
fflush(stdout);
}
#if _WIN32 || __linux__ || __APPLE__
GLB_InitSystem(RAP_GetPath(), 6, 0);
#else
GLB_InitSystem(argv[0], 6, 0);
#endif //_WIN32 || __linux__ || __APPLE__
if (reg_flag)
{
tptr = GLB_GetItem(FILE000_ATENTION_TXT);
printf("%s\n", tptr);
GLB_FreeItem(FILE000_ATENTION_TXT);
}
SND_InitSound();
IPT_Init();
GLB_FreeAll();
RAP_InitMem();
printf("Loading Graphics\n");
pal = GLB_LockItem(FILE100_PALETTE_DAT);
memset(pal, 0, 3);
palette = pal;
SHADOW_Init();
FLAME_Init();
fflush(stdout);
if (ptrflag)
{
cursor_pic = (char*)GLB_LockItem(FILE112_CURSOR_PIC);
PTR_SetPic(cursor_pic);
PTR_SetPos(160, 100);
PTR_DrawCursor(0);
}
// = SET UP SHIP PICTURES =========================
for (loop = 0; loop < 7; loop++)
{
lship[loop] = FILE11a_LPLAYER_PIC + loop;
if (GAME2)
{
dship[loop] = FILE245_DPLAYER_PIC + loop;
fship[loop] = FILE24c_FPLAYER_PIC + loop;
}
}
// = LOAD IN FLAT LIBS =========================
for (loop = 0; loop < 4; loop++)
{
if (gameflag[loop])
{
item = GLB_GetItemID(flatnames[loop]);
flatlib[loop] = (FLATS*)GLB_LockItem(item);
}
else
flatlib[loop] = NULL;
}
// = LOAD IN 0-9 $ SPRITE PICS =========================
for (loop = 0; loop < 11; loop++)
{
item = FILE105_N0_PIC + loop;
numbers[loop] = (char*)GLB_LockItem(item);
}
FLAME_InitShades();
HELP_Init();
OBJS_Init();
TILE_Init();
SHOTS_Init();
ESHOT_Init();
BONUS_Init();
ANIMS_Init();
SND_Setup();
GFX_SetPalRange(0, ROTPAL_START - 1);
GFX_InitVideo(palette);
SHADOW_MakeShades();
RAP_ClearPlayer();
if (!godmode)
INTRO_Credits();
if (demo_flag != DEMO_PLAYBACK)
{
SND_PlaySong(FILE056_RINTRO_MUS, 1, 1);
INTRO_PlayMain();
SND_PlaySong(FILE057_MAINMENU_MUS, 1, 1);
}
else if (demo_flag == DEMO_PLAYBACK)
{
DEMO_LoadFile();
DEMO_Play();
}
cur_game = 0;
game_wave[0] = 0;
game_wave[1] = 0;
game_wave[2] = 0;
game_wave[3] = 0;
do
{
WIN_MainMenu();
WIN_MainLoop();
} while (1);
return 0;
}