3503 lines
84 KiB
C
Executable File
3503 lines
84 KiB
C
Executable File
/*
|
||
Copyright (C) 1994-1995 Apogee Software, Ltd.
|
||
|
||
This program is free software; you can redistribute it and/or
|
||
modify it under the terms of the GNU General Public License
|
||
as published by the Free Software Foundation; either version 2
|
||
of the License, or (at your option) any later version.
|
||
|
||
This program is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||
|
||
See the GNU General Public License for more details.
|
||
|
||
You should have received a copy of the GNU General Public License
|
||
along with this program; if not, write to the Free Software
|
||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||
|
||
*/
|
||
#include "rt_def.h"
|
||
#include "lumpy.h"
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <stddef.h>
|
||
#include <fcntl.h>
|
||
#include <string.h>
|
||
|
||
#ifdef DOS
|
||
#include <malloc.h>
|
||
#include <dos.h>
|
||
#include <io.h>
|
||
#include <conio.h>
|
||
#include <graph.h>
|
||
#include <process.h>
|
||
#include <direct.h>
|
||
#include <bios.h>
|
||
#else
|
||
#include <signal.h>
|
||
#endif
|
||
|
||
#if USE_SDL
|
||
/* Need to redefine main to SDL_main on some platforms... */
|
||
#include "SDL.h"
|
||
#endif
|
||
|
||
#include "rt_actor.h"
|
||
#include "rt_stat.h"
|
||
#include "rt_vid.h"
|
||
#include "rt_menu.h"
|
||
#include "rt_sound.h"
|
||
#include "watcom.h"
|
||
#include "scriplib.h"
|
||
#include "rt_main.h"
|
||
#include "_rt_main.h"
|
||
#include "rt_com.h"
|
||
#include "rt_util.h"
|
||
#include "z_zone.h"
|
||
#include "w_wad.h"
|
||
#include "rt_game.h"
|
||
#include "rt_floor.h"
|
||
#include "rt_playr.h"
|
||
#include "rt_draw.h"
|
||
#include "rt_str.h"
|
||
#include "rt_view.h"
|
||
#include "rt_door.h"
|
||
#include "rt_ted.h"
|
||
#include "rt_in.h"
|
||
#include "rt_map.h"
|
||
#include "rt_rand.h"
|
||
#include "rt_debug.h"
|
||
#include "isr.h"
|
||
#include "rt_cfg.h"
|
||
#include "develop.h"
|
||
#include "version.h"
|
||
#include "rt_menu.h"
|
||
#include "rt_dr_a.h"
|
||
#include "rt_msg.h"
|
||
#include "rt_build.h"
|
||
#include "rt_error.h"
|
||
#include "modexlib.h"
|
||
#include "rt_net.h"
|
||
#include "cin_main.h"
|
||
#include "rottnet.h"
|
||
#include "rt_scale.h"
|
||
|
||
#include "music.h"
|
||
#include "fx_man.h"
|
||
//MED
|
||
#include "memcheck.h"
|
||
|
||
volatile int oldtime;
|
||
volatile int gametime;
|
||
|
||
boolean tedlevel;
|
||
int tedlevelnum;
|
||
int tedx=0;
|
||
int tedy=0;
|
||
boolean warp;
|
||
int warpx=0;
|
||
int warpy=0;
|
||
int warpa=0;
|
||
int NoSound;
|
||
int polltime;
|
||
int oldpolltime;
|
||
boolean fizzlein = false;
|
||
int pheight;
|
||
|
||
boolean SCREENSHOTS = false;
|
||
boolean MONOPRESENT = false;
|
||
boolean MAPSTATS = false;
|
||
boolean TILESTATS = false;
|
||
boolean HUD = false;
|
||
boolean IS8250 = false;
|
||
|
||
boolean dopefish;
|
||
|
||
boolean newlevel = false;
|
||
boolean infopause;
|
||
#ifdef DOS
|
||
boolean SOUNDSETUP=false;
|
||
#endif
|
||
boolean quiet = false;
|
||
|
||
#if (DEVELOPMENT == 1)
|
||
boolean DebugOk = true;
|
||
#else
|
||
boolean DebugOk = false;
|
||
#endif
|
||
|
||
#if (WHEREAMI==1)
|
||
int programlocation=-1;
|
||
#endif
|
||
|
||
#if SAVE_SCREEN
|
||
static char savename[13] = "ROTT0000.LBM";
|
||
static int totalbytes;
|
||
static byte *bptr;
|
||
#endif
|
||
static boolean turbo;
|
||
|
||
static int NoWait;
|
||
static int startlevel=0;
|
||
static int demonumber=-1;
|
||
|
||
char CWD[40]; // curent working directory
|
||
static boolean quitactive = false;
|
||
|
||
int timelimit;
|
||
int maxtimelimit;
|
||
boolean timelimitenabled;
|
||
boolean demoexit;
|
||
boolean noecho;
|
||
|
||
void CheckCommandLineParameters( void );
|
||
void PlayTurboGame( void );
|
||
void Init_Tables (void);
|
||
void CheckRemoteRidicule ( int scancode );
|
||
void SetRottScreenRes (int Width, int Height);
|
||
|
||
#ifndef DOS
|
||
extern void crash_print (int);
|
||
extern int setup_homedir (void);
|
||
#endif
|
||
|
||
//extern int G_argc;
|
||
//extern char G_argv[30][80];
|
||
int G_weaponscale;
|
||
extern int iDropDemo;
|
||
extern boolean iG_aimCross;
|
||
extern boolean sdl_fullscreen;
|
||
|
||
extern void ComSetTime ( void );
|
||
extern void VH_UpdateScreen (void);
|
||
extern void RottConsole ( void );
|
||
extern void ReadDelay(long delay);
|
||
extern void RecordDemoQuery ( void );
|
||
|
||
|
||
int main (int argc, char *argv[])
|
||
{
|
||
char *macwd;
|
||
#ifndef DOS
|
||
_argc = argc;
|
||
_argv = argv;
|
||
#endif
|
||
|
||
#if defined(PLATFORM_MACOSX)
|
||
{
|
||
/* OS X will give us a path in the form '/Applications/Rise of the Triad.app/Contents/MacOS/Rise of the Triad'.
|
||
Our data is in Contents/Resources. */
|
||
char *path;
|
||
const char suffix[] = "/Resources/";
|
||
int end;
|
||
path = (char *)malloc(strlen(argv[0]) + strlen(suffix) + 1);
|
||
if (path == NULL) return 1;
|
||
strcpy(path, argv[0]);
|
||
/* Back up two '/'s. */
|
||
for (end = strlen(path)-1; end >= 0 && path[end] != '/'; end--);
|
||
if (end >= 0) for (--end; end >= 0 && path[end] != '/'; end--);
|
||
strcpy(&path[end], suffix);
|
||
printf("Changing to working directory: %s\n", path);
|
||
chdir(path);
|
||
free(path);
|
||
}
|
||
#endif
|
||
|
||
#ifndef DOS
|
||
signal (11, crash_print);
|
||
|
||
if (setup_homedir() == -1) return 1;
|
||
#endif
|
||
|
||
// Set which release version we're on
|
||
gamestate.Version = ROTTVERSION;
|
||
|
||
#if ( SHAREWARE == 1 )
|
||
gamestate.Product = ROTT_SHAREWARE;
|
||
#elif ( SUPERROTT == 1 )
|
||
gamestate.Product = ROTT_SUPERCD;
|
||
#elif ( SITELICENSE == 1 )
|
||
gamestate.Product = ROTT_SITELICENSE;
|
||
#else
|
||
gamestate.Product = ROTT_REGISTERED;
|
||
#endif
|
||
|
||
DrawRottTitle ();
|
||
gamestate.randomseed=-1;
|
||
|
||
gamestate.autorun = 0;
|
||
StartupSoftError();
|
||
// UL_ErrorStartup ();
|
||
|
||
CheckCommandLineParameters();
|
||
|
||
// Start up Memory manager with a certain amount of reserved memory
|
||
|
||
Z_Init(50000,1000000);
|
||
|
||
IN_Startup ();
|
||
|
||
InitializeGameCommands();
|
||
if (standalone==false)
|
||
{
|
||
ReadConfig ();
|
||
ReadSETUPFiles ();
|
||
doublestep=0;
|
||
SetupWads();
|
||
BuildTables ();
|
||
GetMenuInfo ();
|
||
}
|
||
|
||
SetRottScreenRes (iGLOBAL_SCREENWIDTH, iGLOBAL_SCREENHEIGHT);
|
||
|
||
// if (modemgame==true)
|
||
// {
|
||
// SCREENSHOTS=true;
|
||
// if (standalone==false)
|
||
// {
|
||
// MenuFixup ();
|
||
// }
|
||
// MAPSTATS=true;
|
||
// }
|
||
if (standalone==false)
|
||
{
|
||
int status1 = 0;
|
||
int status2 = 0;
|
||
int status3 = 0;
|
||
|
||
if ( !NoSound && !IS8250 )
|
||
{
|
||
if (!quiet)
|
||
printf( "MU_Startup: " );
|
||
status1 = MU_Startup(false);
|
||
if (!quiet)
|
||
printf( "%s\n", MUSIC_ErrorString( MUSIC_Error ) );
|
||
}
|
||
else if ( IS8250 )
|
||
{
|
||
printf( "==============================================================================\n");
|
||
printf( "WARNING: 8250 detected.\n" );
|
||
printf( "Music has been disabled. This is necessary to maintain high interrupt\n" );
|
||
printf( "rates with the 8250 UART which will improve overall game performance.\n");
|
||
printf( " < Press any key to continue >\n");
|
||
printf( "==============================================================================\n");
|
||
getch();
|
||
}
|
||
|
||
if (!NoSound)
|
||
{
|
||
int nv, nb, nc;
|
||
|
||
if (!quiet)
|
||
printf( "SD_SetupFXCard: " );
|
||
status2 = SD_SetupFXCard (&nv, &nb, &nc);
|
||
if (!quiet)
|
||
printf( "%s\n", FX_ErrorString( FX_Error ) );
|
||
|
||
if ( !status2 )
|
||
{
|
||
if (!quiet)
|
||
printf( "SD_Startup: " );
|
||
status3 = SD_Startup(false);
|
||
if (!quiet)
|
||
printf( "%s\n", FX_ErrorString( FX_Error ) );
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (!quiet)
|
||
printf( "Sound FX disabled.\n" );
|
||
}
|
||
|
||
#ifdef DOS
|
||
if ( status1 || status2 || status3 )
|
||
{
|
||
printf( "\n\nROTT was unable to initialize your " );
|
||
if ( status1 )
|
||
{
|
||
printf( "music " );
|
||
MusicMode = 0;
|
||
}
|
||
if ( status2 || status3 )
|
||
{
|
||
if ( status1 )
|
||
{
|
||
printf( "or " );
|
||
}
|
||
printf( "sound fx " );
|
||
|
||
FXMode = 0;
|
||
}
|
||
|
||
printf( "hardware.\n"
|
||
"Now entering sound setup.\n" );
|
||
SOUNDSETUP = true;
|
||
}
|
||
#endif
|
||
|
||
Init_Tables ();
|
||
InitializeRNG ();
|
||
InitializeMessages();
|
||
LoadColorMap();
|
||
}
|
||
if (infopause==true)
|
||
{
|
||
printf("\n< Press any key to continue >\n");
|
||
getch();
|
||
}
|
||
I_StartupTimer();
|
||
I_StartupKeyboard();
|
||
#if 0
|
||
#if (SHAREWARE == 1)
|
||
if ((!SOUNDSETUP) && (standalone==false))
|
||
{
|
||
byte * txtscn;
|
||
int i;
|
||
|
||
for (i=0;i<20;i++)
|
||
printf("\n");
|
||
txtscn = (byte *) W_CacheLumpNum (W_GetNumForName ("rotts10"), PU_CACHE);
|
||
memcpy ((byte *)0xB8000, txtscn, 4000);
|
||
I_Delay (600);
|
||
}
|
||
#endif
|
||
#endif
|
||
locplayerstate = &PLAYERSTATE[consoleplayer];
|
||
|
||
if (standalone==true)
|
||
ServerLoop();
|
||
|
||
VL_SetVGAPlaneMode();
|
||
VL_SetPalette(origpal);
|
||
|
||
// SetTextMode();
|
||
// GraphicsMode();
|
||
// SetTextMode();
|
||
// VL_SetVGAPlaneMode();
|
||
// VL_SetPalette(origpal);
|
||
// SetBorderColor(155);
|
||
SetViewSize(8);
|
||
|
||
#ifdef DOS
|
||
if ( SOUNDSETUP )
|
||
{
|
||
SwitchPalette( origpal, 35 );
|
||
CP_SoundSetup();
|
||
}
|
||
#endif
|
||
|
||
playstate = ex_titles;
|
||
|
||
// I_SetKeyboardLEDs( caps_lock, 0 );
|
||
|
||
gamestate.battlemode = battle_StandAloneGame;
|
||
|
||
BATTLE_SetOptions( &BATTLE_Options[ battle_StandAloneGame ] );
|
||
|
||
if (turbo || tedlevel)
|
||
{
|
||
if (modemgame == true)
|
||
{
|
||
turbo = false;
|
||
NoWait = true;
|
||
}
|
||
else
|
||
{
|
||
PlayTurboGame();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
#if (SHAREWARE == 0)
|
||
if ( dopefish == true )
|
||
{
|
||
DopefishTitle();
|
||
}
|
||
else if ( NoWait == false )
|
||
{
|
||
ApogeeTitle();
|
||
}
|
||
#else
|
||
if ( NoWait == false )
|
||
{
|
||
if (W_CheckNumForName("svendor") != -1)
|
||
{
|
||
lbm_t * LBM;
|
||
|
||
LBM = (lbm_t *) W_CacheLumpName( "svendor", PU_CACHE, Cvt_lbm_t, 1);
|
||
VL_DecompressLBM (LBM,true);
|
||
I_Delay(40);
|
||
MenuFadeOut();
|
||
}
|
||
// ParticleIntro ();
|
||
ApogeeTitle();
|
||
}
|
||
#endif
|
||
}
|
||
|
||
GameLoop();
|
||
|
||
|
||
QuitGame();
|
||
|
||
return 0;
|
||
}
|
||
|
||
void DrawRottTitle ( void )
|
||
{
|
||
char title[80];
|
||
char buf[5];
|
||
|
||
SetTextMode();
|
||
TurnOffTextCursor ();
|
||
|
||
if (CheckParm("QUIET") == 0)
|
||
{
|
||
SetTextMode();
|
||
TurnOffTextCursor ();
|
||
#ifdef DOS
|
||
if (CheckParm ("SOUNDSETUP") == 0)
|
||
{
|
||
#endif
|
||
#ifdef ANSIESC
|
||
printf("\n\n\n");
|
||
#endif
|
||
strcpy (title,"Rise of the Triad Startup Version ");
|
||
strcat (title,itoa(ROTTMAJORVERSION,&buf[0],10));
|
||
strcat (title,".");
|
||
//MED
|
||
#if (SHAREWARE==1)||(DOPEFISH==0)
|
||
strcat (title,itoa(ROTTMINORVERSION,&buf[0],10));
|
||
#else
|
||
strcat (title,"DFISH");
|
||
#endif
|
||
#ifndef ANSIESC
|
||
strcat (title,"\n");
|
||
#endif
|
||
|
||
px=(80-strlen(title))>>1;
|
||
py=0;
|
||
|
||
UL_printf(title);
|
||
|
||
memset (title,0,sizeof(title));
|
||
|
||
if (gamestate.Product == ROTT_SHAREWARE)
|
||
{
|
||
#if (DELUXE==1)
|
||
strcpy(title,"Lasersoft Deluxe Version");
|
||
#elif (LOWCOST==1)
|
||
strcpy(title,"Episode One");
|
||
#else
|
||
strcpy(title,"Shareware Version");
|
||
#endif
|
||
}
|
||
else if (gamestate.Product == ROTT_SUPERCD)
|
||
strcpy(title,"CD Version");
|
||
else if (gamestate.Product == ROTT_SITELICENSE)
|
||
strcpy(title,"Site License CD Version");
|
||
else
|
||
strcpy(title,"Commercial Version");
|
||
|
||
px=(80-strlen(title))>>1;
|
||
py=1;
|
||
|
||
UL_printf(title);
|
||
#ifndef ANSIESC
|
||
printf ("\n");
|
||
#endif
|
||
|
||
UL_ColorBox (0, 0, 80, 2, 0x1e);
|
||
#ifdef DOS
|
||
}
|
||
else
|
||
{
|
||
printf("\n\n");
|
||
strcpy (title,"Rise of the Triad Sound Setup Version ");
|
||
strcat (title,itoa(ROTTMAJORVERSION,&buf[0],10));
|
||
strcat (title,".");
|
||
strcat (title,itoa(ROTTMINORVERSION,&buf[0],10));
|
||
|
||
px=(80-strlen(title))>>1;
|
||
py=0;
|
||
|
||
UL_printf(title);
|
||
|
||
UL_ColorBox (0, 0, 80, 1, 0x1e);
|
||
}
|
||
#endif
|
||
}
|
||
else
|
||
{
|
||
TurnOffTextCursor ();
|
||
}
|
||
|
||
}
|
||
|
||
void CheckCommandLineParameters( void )
|
||
{
|
||
char *PStrings[] = {"TEDLEVEL","NOWAIT","NOSOUND","NOW",
|
||
"TRANSPORT","DOPEFISH","SCREENSHOTS",
|
||
"MONO","MAPSTATS","TILESTATS","VER","net",
|
||
"PAUSE","SOUNDSETUP","WARP","IS8250","ENABLEVR",
|
||
"TIMELIMIT","MAXTIMELIMIT","NOECHO","DEMOEXIT","QUIET",NULL};
|
||
int i,n;
|
||
|
||
infopause=false;
|
||
#ifdef DOS
|
||
SOUNDSETUP = false;
|
||
#endif
|
||
tedlevel=false;
|
||
NoWait=false;
|
||
NoSound=false;
|
||
turbo=false;
|
||
warp=false;
|
||
dopefish=false;
|
||
modemgame=false;
|
||
SCREENSHOTS=false;
|
||
MONOPRESENT=false;
|
||
MAPSTATS=false;
|
||
TILESTATS=false;
|
||
IS8250 = false;
|
||
vrenabled = false;
|
||
demoexit = false;
|
||
|
||
modemgame=false;
|
||
networkgame=false;
|
||
consoleplayer=0;
|
||
numplayers = 1;
|
||
timelimit=-1;
|
||
timelimitenabled=false;
|
||
noecho = false;
|
||
quiet = false;
|
||
|
||
if (
|
||
(CheckParm("?\0")) ||
|
||
(CheckParm("HELP")) ||
|
||
(
|
||
(_argc>1) &&
|
||
(_argv[1][0]=='?')
|
||
)
|
||
)
|
||
{
|
||
SetTextMode ();
|
||
printf ("Rise of the Triad (c) 1995 Apogee Software\n\n");
|
||
printf ("COMMAND LINE PARAMETERS\n");
|
||
printf (" AIM - Give Aim Crosshair.\n");
|
||
printf (" FULLSCREEN - Start in fullscreen mode\n");
|
||
printf (" WINDOW - Start in windowed mode\n");
|
||
printf (" RESOLUTION - Specify the screen resolution to use\n");
|
||
printf (" - next param is <widthxheight>, valid resolutions are:\n");
|
||
printf (" - 320x200, 640x480 and 800x600\n");
|
||
#if (SHAREWARE==0)
|
||
printf (" FILERTL - used to load Userlevels (RTL files)\n");
|
||
printf (" - next parameter is RTL filename\n");
|
||
printf (" FILERTC - used to load Battlelevels (RTC files)\n");
|
||
printf (" - next parameter is RTC filename\n");
|
||
printf (" FILE - used to load Extern WAD files\n");
|
||
printf (" - next parameter is WAD filename\n");
|
||
#endif
|
||
printf (" SPACEBALL - Enable check for Spaceball.\n");
|
||
printf (" NOJOYS - Disable check for joystick.\n");
|
||
printf (" NOMOUSE - Disable check for mouse.\n");
|
||
printf (" CYBERMAN - Enable check for Cyberman.\n");
|
||
printf (" ASSASSIN - Enable check for Wingman Assassin.\n");
|
||
printf (" VER - Version number.\n");
|
||
printf (" MAPSTATS - Dump Map statistics to ERROR.\n");
|
||
printf (" TILESTATS - Dump Tile statistics to ERROR.\n");
|
||
printf (" MONO - Enable mono-monitor support.\n");
|
||
printf (" SCREENSHOTS- Clean screen capture for shots.\n");
|
||
printf (" PAUSE - Pauses startup screen information.\n");
|
||
#ifdef DOS
|
||
printf (" SOUNDSETUP - Setup sound for ROTT\n");
|
||
#endif
|
||
printf (" ENABLEVR - Enable VR helmet input devices\n");
|
||
printf (" NOECHO - Turn off sound reverb\n");
|
||
printf (" DEMOEXIT - Exit program when demo is terminated\n");
|
||
printf (" WARP - Warp to specific ROTT level\n");
|
||
printf (" next parameter is level to start on\n");
|
||
printf (" TIMELIMIT - Play ROTT in time limit mode\n");
|
||
printf (" next parameter is time in seconds\n");
|
||
printf (" MAXTIMELIMIT - Maximimum time to count down from\n");
|
||
printf (" next parameter is time in seconds\n");
|
||
printf (" DOPEFISH - ?\n");
|
||
printf (" \n");
|
||
printf ("CONTROLS\n");
|
||
printf (" Arrows - Move\n");
|
||
printf (" Ctrl - Fire\n");
|
||
printf (" Comma/Alt+left - Sidestep Left\n");
|
||
printf (" Period/Alt+right - Sidestep Right\n");
|
||
printf (" Shift - Run/Turn faster\n");
|
||
printf (" Space - Use/Open\n");
|
||
printf (" 1-4 - Choose Weapon\n");
|
||
printf (" 5-6 - Scale Weapon Up/Down\n");
|
||
printf (" Enter - Swap Weapon\n");
|
||
printf (" Backspace - Turn 180\n");
|
||
printf (" Delete - Drop Weapon\n");
|
||
printf (" +/- - Change Viewsize\n");
|
||
printf (" PgUp/PgDn - Look Up/Down\n");
|
||
printf (" Home/End - Aim Up/Down\n");
|
||
printf (" [ ] - Sound Volumen\n");
|
||
printf (" ( ) - Music Volumen\n");
|
||
printf (" Tab - Enter Automapper\n");
|
||
printf (" \n");
|
||
printf ("AUTO-MAPPER\n");
|
||
printf (" Arrows - Scroll around\n");
|
||
printf (" PgUp - Zoom Out\n");
|
||
printf (" PgDn - Zoom In\n");
|
||
printf (" Tab - Exit Auto-Mapper\n");
|
||
printf (" \n");
|
||
printf ("HOTKEYS\n");
|
||
printf (" F1 - Help\n");
|
||
printf (" F2 - Save Game\n");
|
||
printf (" F3 - Restore Game\n");
|
||
printf (" F4 - Controls/Sound/Music\n");
|
||
printf (" F5 - Change Detail Level\n");
|
||
printf (" F6 - Quick Save\n");
|
||
printf (" F7 - Messages On/Off\n");
|
||
printf (" F8 - End Game\n");
|
||
printf (" F9 - Quick Load\n");
|
||
printf (" F10 - Quit\n");
|
||
printf (" F11 - Gamma Correction\n");
|
||
printf (" \n");
|
||
printf ("COMM-BAT\n");
|
||
printf (" F1 - F10 - RemoteRidicule(tm) sounds\n");
|
||
printf (" F12 - Live RemoteRidicule\n");
|
||
printf (" T - Type message to all\n");
|
||
printf (" Z - Type directed message\n");
|
||
printf (" Tab - Toggle KillCount display\n");
|
||
printf (" \n");
|
||
printf ("SCREENSHOOT\n");
|
||
#ifdef DOS /* makes no sense under Linux as there are no lbm viewers there */
|
||
printf (" Alt+V - Screenshoot in LBM format\n");
|
||
#endif
|
||
printf (" Alt+C - Screenshoot in PCX format\n");
|
||
exit (0);
|
||
}
|
||
|
||
// Check For command line parameters
|
||
|
||
for (i = 1;i < _argc;i++)
|
||
{
|
||
n = US_CheckParm(_argv[i],PStrings);
|
||
switch(n)
|
||
{
|
||
#if (TEDLAUNCH==1)
|
||
case 0:
|
||
tedlevelnum = ParseNum(_argv[i + 1]);
|
||
tedlevel=true;
|
||
if (i+3>=_argc)
|
||
{
|
||
tedx=0;
|
||
tedy=0;
|
||
}
|
||
else
|
||
{
|
||
tedx=ParseNum(_argv[i + 2]);
|
||
tedy=ParseNum(_argv[i + 3]);
|
||
}
|
||
MenuFixup ();
|
||
break;
|
||
#endif
|
||
case 1:
|
||
NoWait = true;
|
||
break;
|
||
case 2:
|
||
NoSound = true;
|
||
break;
|
||
case 3:
|
||
turbo = true;
|
||
break;
|
||
case 4:
|
||
warp = true;
|
||
warpx=ParseNum(_argv[i + 1]);
|
||
warpy=ParseNum(_argv[i + 2]);
|
||
warpa=ParseNum(_argv[i + 3]);
|
||
break;
|
||
case 5:
|
||
dopefish=true;
|
||
break;
|
||
case 6:
|
||
SCREENSHOTS = true;
|
||
break;
|
||
case 7:
|
||
MONOPRESENT = true;
|
||
break;
|
||
case 8:
|
||
MAPSTATS = true;
|
||
break;
|
||
case 9:
|
||
TILESTATS = true;
|
||
break;
|
||
case 10:
|
||
SetTextMode ();
|
||
printf ("Rise of the Triad (c) 1995 Apogee Software\n");
|
||
//MED
|
||
if (gamestate.Product == ROTT_SHAREWARE)
|
||
{
|
||
#if (DELUXE==1)
|
||
printf("Lasersoft Deluxe ");
|
||
#elif (LOWCOST==1)
|
||
printf("Episode One ");
|
||
#else
|
||
printf("Shareware ");
|
||
#endif
|
||
}
|
||
else if (gamestate.Product == ROTT_SUPERCD)
|
||
printf("CD ");
|
||
else if (gamestate.Product == ROTT_SITELICENSE)
|
||
printf("Site License ");
|
||
else
|
||
printf("Commercial ");
|
||
printf ("Version %d.%d\n", ROTTMAJORVERSION,ROTTMINORVERSION);
|
||
exit (0);
|
||
break;
|
||
case 11:
|
||
InitROTTNET();
|
||
numplayers = rottcom->numplayers;
|
||
if (numplayers>MAXPLAYERS)
|
||
Error("Too many players.\n");
|
||
if (!quiet)
|
||
printf("Playing %ld player ROTT\n",(long int)numplayers);
|
||
modemgame=true;
|
||
if (rottcom->gametype==NETWORK_GAME)
|
||
{
|
||
if (!quiet)
|
||
printf("NETWORK GAME\n");
|
||
networkgame=true;
|
||
}
|
||
else
|
||
{
|
||
if (!quiet)
|
||
printf("MODEM GAME\n");
|
||
}
|
||
break;
|
||
case 12:
|
||
infopause=true;
|
||
break;
|
||
case 13:
|
||
#ifdef DOS
|
||
SOUNDSETUP = true;
|
||
#endif
|
||
break;
|
||
case 14:
|
||
startlevel = (ParseNum(_argv[i + 1])-1);
|
||
break;
|
||
case 15:
|
||
IS8250 = true;
|
||
break;
|
||
case 16:
|
||
vrenabled = true;
|
||
if (!quiet)
|
||
printf("Virtual Reality Mode enabled\n");
|
||
break;
|
||
case 17:
|
||
timelimitenabled = true;
|
||
timelimit = ParseNum(_argv[i + 1]);
|
||
if (!quiet)
|
||
printf("Time Limit = %ld Seconds\n",(long int)timelimit);
|
||
timelimit *= VBLCOUNTER;
|
||
break;
|
||
|
||
case 18:
|
||
maxtimelimit = ParseNum(_argv[i + 1]);
|
||
maxtimelimit *= VBLCOUNTER;
|
||
break;
|
||
case 19:
|
||
noecho = true;
|
||
break;
|
||
case 20:
|
||
demoexit = true;
|
||
break;
|
||
case 21:
|
||
quiet = true;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
void SetupWads( void )
|
||
{
|
||
char *newargs[99];
|
||
int i, arg, argnum = 0;
|
||
char tempstr[129];
|
||
char *PStrings[] = {"AIM", "FULLSCREEN", "WINDOW", "RESOLUTION", NULL };
|
||
|
||
// These must be checked here so that they can override the cfg file
|
||
for (i = 1;i < _argc;i++)
|
||
{
|
||
arg = US_CheckParm(_argv[i],PStrings);
|
||
switch(arg)
|
||
{
|
||
case 0:
|
||
iG_aimCross = 1;
|
||
break;
|
||
case 1:
|
||
sdl_fullscreen = 1;
|
||
break;
|
||
case 2:
|
||
sdl_fullscreen = 0;
|
||
break;
|
||
case 3:
|
||
i++;
|
||
if (i < _argc)
|
||
{
|
||
int width, height;
|
||
if ( (sscanf(_argv[i], "%dx%d", &width, &height) == 2) &&
|
||
( ( (width == 320) && (height == 200) ) ||
|
||
( (width == 640) && (height == 480) ) ||
|
||
( (width == 800) && (height == 600) ) ) )
|
||
{
|
||
iGLOBAL_SCREENWIDTH = width;
|
||
iGLOBAL_SCREENHEIGHT = height;
|
||
}
|
||
else
|
||
printf("Invalid resolution parameter: %s\n", _argv[i]);
|
||
}
|
||
else
|
||
printf("Missing resolution parameter\n");
|
||
break;
|
||
}
|
||
}
|
||
|
||
|
||
#if (SHAREWARE==0)
|
||
// Check for rtl files
|
||
arg = CheckParm ("filertl");
|
||
if (arg!=0)
|
||
{
|
||
FILE *f;char buf[32];
|
||
if (_argv[arg+1] != 0) { //are there a filename included
|
||
strcpy (tempstr,_argv[arg+1]);//copy it to tempstr
|
||
if (strlen (tempstr) < MAX_PATH) {
|
||
if (access (tempstr, 0) != 0) { //try open
|
||
strcat (tempstr,".rtc");//non exists, try add .rtc
|
||
if (access (tempstr, 0) != 0) { //try open again
|
||
//stil no useful filename
|
||
strcat (tempstr," not found, skipping RTL file ");
|
||
printf("%s", tempstr);
|
||
goto NoRTL;
|
||
}
|
||
}
|
||
if((f = fopen( tempstr, "r" )) == NULL ){ //try opnong file
|
||
strcat (tempstr," not could not be opened, skipping RTL file ");
|
||
printf("%s", tempstr);
|
||
goto NoRTL;
|
||
}else{
|
||
fread(buf,3,3,f);//is the 3 first letters RTL (RTC)
|
||
if (((strstr(buf,"RTL") != 0)||strstr(buf,"RTC") != 0)) {
|
||
strcpy (GameLevels.file,tempstr);
|
||
GameLevels.avail++;
|
||
strcpy (buf,"Adding ");
|
||
strcat (buf,tempstr);
|
||
printf("%s", buf);
|
||
}
|
||
fclose(f);
|
||
}
|
||
}
|
||
}else{printf("Missing RTL filename");}
|
||
}
|
||
NoRTL:;
|
||
// Check for rtc files
|
||
arg = CheckParm ("filertc");
|
||
if (arg!=0)
|
||
{
|
||
FILE *f;char buf[32];
|
||
if (_argv[arg+1] != 0) { //are there a filename included
|
||
strcpy (tempstr,_argv[arg+1]);//copy it to tempstr
|
||
if (strlen (tempstr) < MAX_PATH) {
|
||
if (access (tempstr, 0) != 0) { //try open
|
||
strcat (tempstr,".rtc");//non exists, try add .rtc
|
||
if (access (tempstr, 0) != 0) { //try open again
|
||
//stil no useful filename
|
||
strcat (tempstr," not found, skipping RTC file ");
|
||
printf("%s", tempstr);
|
||
goto NoRTL;
|
||
}
|
||
}
|
||
if((f = fopen( tempstr, "r" )) == NULL ){ //try opening file
|
||
strcat (tempstr," not could not be opened, skipping RTC file ");
|
||
printf("%s", tempstr);
|
||
goto NoRTL;
|
||
}else{
|
||
fread(buf,3,3,f);//is the 3 first letters RTL (RTC)
|
||
if (((strstr(buf,"RTL") != 0)||strstr(buf,"RTC") != 0)) {
|
||
strcpy (BattleLevels.file,tempstr);
|
||
BattleLevels.avail++;
|
||
strcpy (buf,"Adding ");
|
||
strcat (buf,tempstr);
|
||
printf("%s", buf);
|
||
}
|
||
fclose(f);
|
||
}
|
||
}
|
||
}else{printf("Missing RTC filename");}
|
||
}
|
||
NoRTC:;
|
||
|
||
// Check for User wads
|
||
arg = CheckParm ("file");
|
||
if (arg!=0)
|
||
{
|
||
newargs [argnum++] = _argv[arg+1];
|
||
}
|
||
|
||
arg = CheckParm ("file1");
|
||
if (arg!=0)
|
||
{
|
||
newargs [argnum++] = _argv[arg+1];
|
||
}
|
||
|
||
arg = CheckParm ("file2");
|
||
if (arg!=0)
|
||
{
|
||
newargs [argnum++] = _argv[arg+1];
|
||
}
|
||
|
||
#else
|
||
if (
|
||
(CheckParm ("file") > 0) ||
|
||
(CheckParm ("file1") > 0) ||
|
||
(CheckParm ("file2") > 0)
|
||
)
|
||
printf("External wads ignored.\n");
|
||
|
||
#endif
|
||
|
||
// Normal ROTT wads
|
||
|
||
#if (SHAREWARE)
|
||
newargs [argnum++] = DATADIR "HUNTBGIN.WAD";
|
||
#else
|
||
newargs [argnum++] = DATADIR "DARKWAR.WAD";
|
||
#endif
|
||
|
||
// newargs [argnum++] = "credits.wad";
|
||
|
||
// Check for Remote Ridicule WAD
|
||
|
||
if (RemoteSounds.avail == true)
|
||
{
|
||
char *src;
|
||
|
||
strcpy (tempstr,RemoteSounds.path);
|
||
src = RemoteSounds.path + strlen(RemoteSounds.path) - 1;
|
||
if (*src != '\\')
|
||
strcat (tempstr,"\\\0");
|
||
strcat (tempstr,RemoteSounds.file);
|
||
newargs [argnum++] = tempstr;
|
||
}
|
||
else
|
||
{
|
||
newargs [argnum++] = DATADIR "REMOTE1.RTS";
|
||
}
|
||
|
||
newargs [argnum++] = NULL;
|
||
|
||
W_InitMultipleFiles(newargs);
|
||
}
|
||
|
||
void PlayTurboGame
|
||
(
|
||
void
|
||
)
|
||
|
||
{
|
||
NewGame = true;
|
||
locplayerstate->player = DefaultPlayerCharacter;
|
||
playstate = ex_resetgame;
|
||
GameLoop();
|
||
}
|
||
|
||
|
||
//***************************************************************************
|
||
//
|
||
// Init_Tables () - Init tables needed for double buffering
|
||
//
|
||
//***************************************************************************
|
||
|
||
void Init_Tables (void)
|
||
{
|
||
int i;
|
||
int x,
|
||
y;
|
||
unsigned *blockstart;
|
||
byte * shape;
|
||
|
||
memset (&CWD[0], 0, 40);
|
||
getcwd (CWD, 40); // get the current directory
|
||
|
||
origpal=SafeMalloc(768);
|
||
memcpy (origpal, W_CacheLumpName("pal",PU_CACHE, CvtNull, 1), 768);
|
||
|
||
FindEGAColors();
|
||
|
||
for (i=0;i<PORTTILESHIGH;i++)
|
||
uwidthtable[i] = UPDATEWIDE*i;
|
||
|
||
updateptr = &update[0];
|
||
|
||
blockstart = &blockstarts[0];
|
||
for (y=0;y<UPDATEHIGH;y++)
|
||
for (x=0;x<UPDATEWIDE;x++)
|
||
*blockstart++ = iG_SCREENWIDTH*16*y+x*TILEWIDTH;
|
||
|
||
for (i = 0; i < 0x300; i++)
|
||
*(origpal+(unsigned int)i) = (*(origpal+(unsigned int)i))>>2;
|
||
|
||
// Cache in fonts
|
||
shape = W_CacheLumpNum (W_GetNumForName ("smallfont"), PU_STATIC, Cvt_font_t, 1);
|
||
smallfont = (font_t *)shape;
|
||
CurrentFont = smallfont;
|
||
|
||
// Cache in tiny font
|
||
shape = W_CacheLumpNum (W_GetNumForName ("tinyfont"), PU_STATIC, Cvt_font_t, 1);
|
||
tinyfont = (font_t *)shape;
|
||
|
||
intensitytable=W_CacheLumpNum(W_GetNumForName("menucmap"),PU_STATIC, CvtNull, 1);
|
||
fontcolor = egacolor[4];
|
||
|
||
if (!quiet)
|
||
printf("RT_MAIN: Fonts Initialized\n");
|
||
}
|
||
|
||
|
||
|
||
|
||
int NumberOfTeams
|
||
(
|
||
void
|
||
)
|
||
|
||
{
|
||
int index;
|
||
int team[ MAXPLAYERCOLORS ];
|
||
int count;
|
||
int color;
|
||
|
||
memset( team, 0, sizeof( team ) );
|
||
|
||
count = 0;
|
||
for( index = 0; index < numplayers; index++ )
|
||
{
|
||
color = PLAYERSTATE[ index ].uniformcolor;
|
||
if ( !team[ color ] )
|
||
{
|
||
team[ color ] = true;
|
||
count++;
|
||
}
|
||
}
|
||
|
||
return( count );
|
||
}
|
||
|
||
void GameLoop (void)
|
||
{
|
||
boolean done = false;
|
||
boolean loadit = false;
|
||
int NextLevel;
|
||
|
||
wami(1);
|
||
|
||
while (1)
|
||
{
|
||
if ( playstate == ex_battledone )
|
||
{
|
||
while( damagecount > 0 )
|
||
{
|
||
DoBorderShifts();
|
||
}
|
||
damagecount = 0;
|
||
SetBorderColor (0);
|
||
|
||
StopWind();
|
||
|
||
ShutdownClientControls();
|
||
|
||
SD_Play (SD_LEVELDONESND);
|
||
|
||
if ( ( player->flags & FL_DOGMODE ) ||
|
||
( gamestate.battlemode == battle_Eluder ) )
|
||
MU_StartSong(song_dogend);
|
||
else
|
||
MU_StartSong(song_endlevel);
|
||
|
||
|
||
VL_FillPalette(255,255,255);
|
||
VL_FadeIn(0,255,origpal,10);
|
||
|
||
BattleLevelCompleted( consoleplayer );
|
||
|
||
BATTLE_Shutdown();
|
||
|
||
Z_FreeTags (PU_LEVELSTRUCT, PU_LEVELEND); // Free current level
|
||
|
||
ingame = false;
|
||
|
||
if ( networkgame == true )
|
||
{
|
||
AddGameEndCommand ();
|
||
}
|
||
|
||
AdjustMenuStruct ();
|
||
|
||
CalcTics();
|
||
CalcTics();
|
||
|
||
|
||
playstate = ex_titles;
|
||
}
|
||
|
||
switch (playstate)
|
||
{
|
||
case ex_titles:
|
||
|
||
BATTLE_Shutdown();
|
||
MU_StartSong(song_title);
|
||
EnableScreenStretch();
|
||
if ((NoWait==false)&&(!modemgame))
|
||
{
|
||
byte dimpal[768];
|
||
int i;
|
||
|
||
for (i = 0; i < 0x300; i++)
|
||
dimpal[i] = origpal[i]>>2;
|
||
CalcTics();
|
||
CalcTics();
|
||
IN_ClearKeysDown ();
|
||
while (IN_GetMouseButtons()) {}
|
||
while ((!LastScan) && (!IN_GetMouseButtons()))
|
||
{
|
||
int i;
|
||
byte *tempbuf;
|
||
MenuFadeOut();
|
||
ClearGraphicsScreen();
|
||
SetPalette(&dimpal[0]);
|
||
PlayMovie ("shartitl", true);
|
||
if ( ( LastScan ) || ( IN_GetMouseButtons() ) )
|
||
{
|
||
break;
|
||
}
|
||
|
||
PlayMovie ("shartit2", true);
|
||
|
||
if ( ( LastScan ) || ( IN_GetMouseButtons() ) )
|
||
{
|
||
break;
|
||
}
|
||
SD_Play (SD_LIGHTNINGSND);
|
||
MenuFadeIn();
|
||
I_Delay(30);
|
||
SD_Play (SD_ACTORSQUISHSND);
|
||
tempbuf=bufferofs;
|
||
bufferofs=page1start; // fixed, was displayofs
|
||
DrawNormalSprite(320-94,200-41,W_GetNumForName("rsac"));
|
||
VW_UpdateScreen(); // fixed, was missing
|
||
bufferofs=tempbuf;
|
||
I_Delay(30);
|
||
|
||
if ( ( LastScan ) || ( IN_GetMouseButtons() ) )
|
||
{
|
||
break;
|
||
}
|
||
|
||
DoCreditScreen ();
|
||
if ((!LastScan) && (!IN_GetMouseButtons()))
|
||
CheckHighScore (0, 0, false);
|
||
#if (SHAREWARE==0)
|
||
if ((!LastScan) && (!IN_GetMouseButtons()))
|
||
{
|
||
DoMicroStoryScreen ();
|
||
}
|
||
#endif
|
||
if (
|
||
(!LastScan) &&
|
||
(!IN_GetMouseButtons()) &&
|
||
(lowmemory==0) &&
|
||
(GameLevels.avail==false)
|
||
)
|
||
{
|
||
if (demonumber==-1)
|
||
demonumber=RandomNumber("GameLoop",0);
|
||
for (i=0;i<4;i++)
|
||
{
|
||
demonumber=(demonumber+1)%4;
|
||
if (DemoExists (demonumber+1) == true)
|
||
break;
|
||
}
|
||
if (DemoExists (demonumber+1) == true)
|
||
{
|
||
ingame=true;
|
||
LoadDemo (demonumber+1);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (playstate != ex_demoplayback)
|
||
{
|
||
if (demoexit == true)
|
||
{
|
||
QuitGame();
|
||
}
|
||
NoWait = false;
|
||
SwitchPalette(origpal,35);
|
||
CP_MainMenu();
|
||
|
||
}
|
||
break;
|
||
|
||
case ex_resetgame:
|
||
|
||
// SetTextMode ( ); //12345678
|
||
EnableScreenStretch();//bna++ shut on streech mode
|
||
InitCharacter();
|
||
|
||
InitializeMessages();
|
||
|
||
fizzlein = true;
|
||
BATTLE_GetSpecials();
|
||
BATTLE_SetOptions( &BATTLE_Options[ gamestate.battlemode ] );
|
||
|
||
if ( modemgame == true )
|
||
{
|
||
fizzlein = false;
|
||
|
||
if ( consoleplayer == 0 )
|
||
{
|
||
// Setup Master
|
||
SetupGameMaster();
|
||
}
|
||
else
|
||
{
|
||
// Setup slave
|
||
SetupGamePlayer();
|
||
}
|
||
|
||
if ( gamestate.Version < ROTTVERSION )
|
||
{
|
||
Error( "This version of Rise of the Triad (%d.%d) is incompatible with\n"
|
||
"version %d.%d.", ROTTMAJORVERSION, ROTTMINORVERSION,
|
||
gamestate.Version / 10, gamestate.Version % 10 );
|
||
}
|
||
if ( gamestate.teamplay )
|
||
{
|
||
int teams;
|
||
|
||
teams = NumberOfTeams();
|
||
if ( gamestate.battlemode == battle_CaptureTheTriad )
|
||
{
|
||
if ( teams != 2 )
|
||
{
|
||
CP_CaptureTheTriadError();
|
||
playstate = ex_titles;
|
||
continue;
|
||
}
|
||
}
|
||
else if ( teams < 2 )
|
||
{
|
||
CP_TeamPlayErrorMessage();
|
||
playstate = ex_titles;
|
||
continue;
|
||
}
|
||
}
|
||
}
|
||
|
||
InitCharacter();
|
||
|
||
BATTLE_Init( gamestate.battlemode, numplayers );
|
||
|
||
NewGame = true;
|
||
|
||
if ( ( BATTLEMODE ) && ( BATTLE_ShowKillCount ) )
|
||
{
|
||
StatusBar |= STATUS_KILLS;
|
||
}
|
||
else
|
||
{
|
||
StatusBar &= ~STATUS_KILLS;
|
||
}
|
||
|
||
if (loadedgame == false)
|
||
{
|
||
if ( !BATTLEMODE )
|
||
{
|
||
PlayCinematic();
|
||
}
|
||
|
||
SetupGameLevel();
|
||
}
|
||
|
||
IN_ClearKeyboardQueue();
|
||
|
||
SetupScreen (true);
|
||
|
||
MenuFixup ();
|
||
playstate=ex_stillplaying;
|
||
|
||
DisableScreenStretch();//bna++ shut off streech mode
|
||
|
||
break;
|
||
|
||
case ex_stillplaying:
|
||
InitializeMessages();
|
||
|
||
SHAKETICS = 0xFFFF;
|
||
if (modemgame==true)
|
||
{
|
||
ComSetTime();
|
||
turbo = false;
|
||
}
|
||
else if (turbo==true)
|
||
turbo=false;
|
||
else
|
||
newlevel=true;
|
||
PlayLoop ();
|
||
break;
|
||
|
||
case ex_died:
|
||
loadit = done = false;
|
||
// SetTextMode ( ); //12345678
|
||
Died ();
|
||
StopWind();
|
||
DisableScreenStretch();//bna++ shut off streech mode
|
||
while (damagecount>0)
|
||
DoBorderShifts();
|
||
|
||
damagecount = 0;
|
||
SetBorderColor (0);
|
||
if (demorecord)
|
||
{
|
||
FreeDemo ();
|
||
}
|
||
if (demoplayback)
|
||
{
|
||
FreeDemo ();
|
||
playstate=ex_demodone;
|
||
}
|
||
else
|
||
{
|
||
ShutdownClientControls();
|
||
|
||
Z_FreeTags (PU_LEVELSTRUCT, PU_LEVELEND); // Free current level
|
||
|
||
if (CheckForQuickLoad()==false)
|
||
{
|
||
if (locplayerstate->lives < 0)
|
||
{
|
||
if (timelimitenabled == false)
|
||
{
|
||
CheckHighScore (gamestate.score, gamestate.mapon+1, false);
|
||
playstate = ex_titles;
|
||
AdjustMenuStruct ();
|
||
ingame = false;
|
||
locplayerstate->health = MaxHitpointsForCharacter(locplayerstate);
|
||
gamestate.score = 0;
|
||
locplayerstate->lives = 3;
|
||
locplayerstate->weapon = wp_pistol;
|
||
locplayerstate->triads = 0;
|
||
UpdateLives (locplayerstate->lives);
|
||
UpdateScore (gamestate.score);
|
||
}
|
||
else
|
||
{
|
||
QuitGame();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
fizzlein = true;
|
||
SetupGameLevel ();
|
||
UpdateTriads(player,0);
|
||
playstate = ex_stillplaying;
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
|
||
case ex_warped:
|
||
StopWind();
|
||
TurnShakeOff();
|
||
SHAKETICS = 0xffff;
|
||
gamestate.TimeCount = 0;
|
||
gamestate.frame=0;
|
||
|
||
Z_FreeTags (PU_LEVELSTRUCT, PU_LEVELEND); // Free current level
|
||
|
||
fizzlein = true;
|
||
SetupGameLevel ();
|
||
|
||
playstate = ex_stillplaying;
|
||
break;
|
||
|
||
case ex_skiplevel:
|
||
case ex_secretdone:
|
||
case ex_secretlevel:
|
||
case ex_completed:
|
||
case ex_bossdied:
|
||
|
||
ShutdownClientControls();
|
||
TurnShakeOff();
|
||
SHAKETICS = 0xffff;
|
||
if (timelimitenabled == false)
|
||
{
|
||
gamestate.TimeCount = 0;
|
||
gamestate.frame=0;
|
||
}
|
||
StopWind();
|
||
#if (SHAREWARE==0)
|
||
if ((playstate==ex_bossdied) && (gamestate.mapon!=30))
|
||
{
|
||
int shape;
|
||
lbm_t * LBM;
|
||
byte *s;
|
||
patch_t *p;
|
||
char str[50];
|
||
int width, height;
|
||
|
||
LBM = (lbm_t *) W_CacheLumpName( "deadboss", PU_CACHE, Cvt_lbm_t, 1);
|
||
VL_DecompressLBM (LBM,false);
|
||
MenuFadeOut();
|
||
switch (gamestate.mapon)
|
||
{
|
||
case 6:
|
||
shape = W_GetNumForName("deadstev");
|
||
break;
|
||
case 14:
|
||
shape = W_GetNumForName("deadjoe");
|
||
break;
|
||
case 22:
|
||
shape = W_GetNumForName("deadrobo");
|
||
break;
|
||
case 33:
|
||
shape = W_GetNumForName("deadtom");
|
||
break;
|
||
// default:
|
||
// Error("Boss died on an illegal level\n");
|
||
// break;
|
||
}
|
||
s = W_CacheLumpNum (shape, PU_CACHE, Cvt_patch_t, 1);
|
||
p = (patch_t *)s;
|
||
DrawNormalSprite ((320-p->origsize)>>1, (230-(p->height-p->topoffset))>>1, shape);
|
||
switch (gamestate.mapon)
|
||
{
|
||
case 6:
|
||
strcpy(&str[0],"\"General\" John Darian");
|
||
break;
|
||
case 14:
|
||
strcpy(&str[0],"Sebastian \"Doyle\" Krist");
|
||
break;
|
||
case 22:
|
||
strcpy(&str[0],"the NME");
|
||
break;
|
||
case 33:
|
||
strcpy(&str[0],"El Oscuro");
|
||
break;
|
||
// default:
|
||
// Error("Boss died on an illegal level\n");
|
||
// break;
|
||
}
|
||
CurrentFont=smallfont;
|
||
US_MeasureStr (&width, &height, "%s", str);
|
||
US_ClippedPrint ((320-width)>>1, 180, str);
|
||
VW_UpdateScreen();
|
||
MenuFadeIn();
|
||
|
||
WaitKeyUp();
|
||
LastScan = 0;
|
||
while (!LastScan) IN_UpdateKeyboard(); // Thanks again DrLex
|
||
LastScan=0;
|
||
}
|
||
#endif
|
||
LevelCompleted ( playstate );
|
||
|
||
NextLevel = GetNextMap(player->tilex,player->tiley);
|
||
|
||
demoplayback = false;
|
||
|
||
Z_FreeTags (PU_LEVELSTRUCT, PU_LEVELEND); // Free current level
|
||
if (NextLevel != -1 )
|
||
{
|
||
gamestate.mapon = NextLevel;
|
||
PlayCinematic();
|
||
fizzlein = true;
|
||
SetupGameLevel ();
|
||
playstate = ex_stillplaying;
|
||
}
|
||
else
|
||
{
|
||
playstate = ex_gameover;
|
||
}
|
||
break;
|
||
|
||
case ex_demodone:
|
||
ingame=false;
|
||
ShutdownClientControls();
|
||
TurnShakeOff();
|
||
SHAKETICS = 0xffff;
|
||
gamestate.TimeCount = 0;
|
||
gamestate.frame=0;
|
||
|
||
demoplayback = false;
|
||
|
||
Z_FreeTags (PU_LEVELSTRUCT, PU_LEVELEND); // Free current level
|
||
if (predemo_violence != -1)
|
||
{
|
||
gamestate.violence = predemo_violence;
|
||
predemo_violence = -1;
|
||
}
|
||
playstate=ex_titles;
|
||
break;
|
||
|
||
case ex_gameover:
|
||
StopWind();
|
||
DoEndCinematic();
|
||
if (playstate==ex_gameover)
|
||
{
|
||
CheckHighScore (gamestate.score, gamestate.mapon+1, false);
|
||
|
||
ingame = false;
|
||
AdjustMenuStruct ();
|
||
playstate = ex_titles;
|
||
}
|
||
break;
|
||
|
||
case ex_demorecord:
|
||
ShutdownClientControls();
|
||
Z_FreeTags (PU_LEVELSTRUCT, PU_LEVELEND); // Free current level
|
||
|
||
RecordDemo();
|
||
SetupGameLevel ();
|
||
|
||
fizzlein = true;
|
||
playstate = ex_stillplaying;
|
||
break;
|
||
|
||
case ex_demoplayback:
|
||
ShutdownClientControls();
|
||
Z_FreeTags (PU_LEVELSTRUCT, PU_LEVELEND); // Free current level
|
||
|
||
SetupDemo();
|
||
SetupGameLevel ();
|
||
|
||
fizzlein = true;
|
||
playstate = ex_stillplaying;
|
||
break;
|
||
default:
|
||
;
|
||
}
|
||
}
|
||
waminot();
|
||
}
|
||
|
||
boolean CheckForQuickLoad (void )
|
||
|
||
{
|
||
|
||
EnableScreenStretch();//bna++
|
||
|
||
if ( pickquick )
|
||
{
|
||
SetupMenuBuf();
|
||
|
||
pickquick = CP_DisplayMsg( "\nQuick load saved game?\n", 12 );
|
||
if ( pickquick )
|
||
{
|
||
AllocateSavedScreenPtr();
|
||
CP_LoadGame( 1, 1 );
|
||
FreeSavedScreenPtr();
|
||
}
|
||
else
|
||
{
|
||
// Erase the quick load message
|
||
VL_FadeOut( 0, 255, 0, 0, 0, 20 );
|
||
}
|
||
|
||
ShutdownMenuBuf();
|
||
}
|
||
|
||
return( pickquick );
|
||
}
|
||
|
||
//===========================================================================
|
||
|
||
void ShutDown ( void )
|
||
{
|
||
if ( ( standalone == false )
|
||
#ifdef DOS
|
||
|| ( SOUNDSETUP )
|
||
#endif
|
||
)
|
||
{
|
||
WriteConfig ();
|
||
}
|
||
|
||
// if (
|
||
// (networkgame==false) &&
|
||
// (modemgame==true)
|
||
// )
|
||
// {
|
||
// ShutdownModemGame ();
|
||
// }
|
||
|
||
ShutdownClientControls();
|
||
I_ShutdownKeyboard();
|
||
#ifdef DOS /* the UL_ErrorStartup() call is commented out... */
|
||
UL_ErrorShutdown ();
|
||
#endif
|
||
ShutdownGameCommands();
|
||
MU_Shutdown();
|
||
I_ShutdownTimer();
|
||
SD_Shutdown();
|
||
IN_Shutdown ();
|
||
ShutdownSoftError ();
|
||
Z_ShutDown();
|
||
// _settextcursor (0x0607);
|
||
}
|
||
|
||
//===========================================================================
|
||
|
||
#if (DEVELOPMENT == 1)
|
||
extern int totallevelsize;
|
||
#endif
|
||
|
||
void QuitGame ( void )
|
||
{
|
||
#if (DEBUG == 1)
|
||
char buf[5];
|
||
#endif
|
||
|
||
#if (DEVELOPMENT == 1)
|
||
int temp;
|
||
#else
|
||
byte *txtscn;
|
||
#endif
|
||
int k;
|
||
|
||
MU_FadeOut(200);
|
||
while (MU_FadeActive())
|
||
{
|
||
int time=GetTicCount();
|
||
while (GetTicCount()==time) {}
|
||
}
|
||
|
||
PrintMapStats();
|
||
PrintTileStats();
|
||
SetTextMode();
|
||
|
||
#if (DEVELOPMENT == 1)
|
||
printf("Clean Exit\n");
|
||
if (gamestate.TimeCount)
|
||
{
|
||
temp=(gamestate.frame*VBLCOUNTER*100)/gamestate.TimeCount;
|
||
printf("fps = %2ld.%2ld\n",temp/100,temp%100);
|
||
}
|
||
printf("argc=%ld\n",_argc);
|
||
for (k=0;k<_argc;k++) printf("%s\n",_argv[k]);
|
||
switch( _heapchk() )
|
||
{
|
||
case _HEAPOK:
|
||
printf( "OK - heap is good\n" );
|
||
break;
|
||
case _HEAPEMPTY:
|
||
printf( "OK - heap is empty\n" );
|
||
break;
|
||
case _HEAPBADBEGIN:
|
||
printf( "ERROR - heap is damaged\n" );
|
||
break;
|
||
case _HEAPBADNODE:
|
||
printf( "ERROR - bad node in heap\n" );
|
||
break;
|
||
}
|
||
printf("\nLight Characteristics\n");
|
||
printf("---------------------\n");
|
||
if (fog)
|
||
printf("FOG is ON\n");
|
||
else
|
||
printf("FOG is OFF\n");
|
||
printf("LIGHTLEVEL=%ld\n",GetLightLevelTile());
|
||
printf("LIGHTRATE =%ld\n",GetLightRateTile());
|
||
printf("\nCENTERY=%ld\n",centery);
|
||
#else
|
||
#ifdef DOS
|
||
if ( !SOUNDSETUP )
|
||
{
|
||
#endif
|
||
#if (SHAREWARE==0)
|
||
txtscn = (byte *) W_CacheLumpNum (W_GetNumForName ("regend"), PU_CACHE, CvtNull, 1);
|
||
#else
|
||
txtscn = (byte *) W_CacheLumpNum (W_GetNumForName ("shareend"), PU_CACHE, CvtNull, 1);
|
||
#endif
|
||
#if DOS
|
||
for (k = 0; k < 23; k++)
|
||
printf ("\n");
|
||
memcpy ((byte *)0xB8000, txtscn, 4000);
|
||
#elif defined (ANSIESC)
|
||
DisplayTextSplash (txtscn, 25);
|
||
#endif
|
||
|
||
#if (DEBUG == 1)
|
||
px = ERRORVERSIONCOL;
|
||
py = ERRORVERSIONROW;
|
||
#if (BETA == 1)
|
||
UL_printf ("<EFBFBD>");
|
||
#else
|
||
UL_printf (itoa(ROTTMAJORVERSION,&buf[0],10));
|
||
#endif
|
||
// Skip the dot
|
||
px++;
|
||
|
||
UL_printf (itoa(ROTTMINORVERSION,&buf[0],10));
|
||
#endif
|
||
#ifdef DOS
|
||
}
|
||
#endif
|
||
#endif
|
||
|
||
#ifdef DOS
|
||
if ( SOUNDSETUP )
|
||
{
|
||
printf( "\nSound setup complete.\n"
|
||
"Type ROTT to run the game.\n" );
|
||
}
|
||
ShutDown();
|
||
#endif
|
||
|
||
exit(0);
|
||
}
|
||
|
||
void InitCharacter
|
||
(
|
||
void
|
||
)
|
||
|
||
{
|
||
locplayerstate->health = MaxHitpointsForCharacter( locplayerstate );
|
||
if (timelimitenabled == true)
|
||
{
|
||
locplayerstate->lives = 1;
|
||
}
|
||
else
|
||
{
|
||
locplayerstate->lives = 3;
|
||
}
|
||
|
||
ClearTriads (locplayerstate);
|
||
locplayerstate->playerheight = characters[ locplayerstate->player ].height;
|
||
// locplayerstate->stepwhich = 0;
|
||
// locplayerstate->steptime = 0;
|
||
|
||
gamestate.score = 0;
|
||
|
||
if ( gamestate.battlemode == battle_StandAloneGame )
|
||
{
|
||
gamestate.mapon = startlevel;
|
||
gamestate.difficulty = DefaultDifficulty;
|
||
}
|
||
else
|
||
{
|
||
gamestate.difficulty = gd_hard;
|
||
}
|
||
|
||
gamestate.dipballs = 0;
|
||
gamestate.TimeCount = 0;
|
||
|
||
godmode = 0;
|
||
damagecount = 0;
|
||
|
||
UpdateScore( gamestate.score );
|
||
}
|
||
|
||
|
||
|
||
|
||
void UpdateGameObjects ( void )
|
||
{
|
||
int j;
|
||
volatile int atime;
|
||
objtype * ob,*temp;
|
||
battle_status BattleStatus;
|
||
|
||
wami(2);
|
||
|
||
if (controlupdatestarted==0)
|
||
{
|
||
return;
|
||
waminot();
|
||
}
|
||
|
||
atime=GetFastTics();
|
||
|
||
UpdateClientControls ();
|
||
|
||
if (demoplayback == false)
|
||
PollControls ();
|
||
|
||
CalcTics ();
|
||
|
||
UpdateClientControls ();
|
||
|
||
|
||
while (oldpolltime<oldtime)
|
||
{
|
||
UpdateClientControls ();
|
||
MoveDoors();
|
||
ProcessElevators();
|
||
MovePWalls();
|
||
UpdateLightning ();
|
||
TriggerStuff();
|
||
CheckCriticalStatics();
|
||
for(j=0;j<numclocks;j++)
|
||
if (Clocks[j].time1 &&
|
||
((gamestate.TimeCount == Clocks[j].time1) ||
|
||
(gamestate.TimeCount == Clocks[j].time2)))
|
||
TRIGGER[Clocks[j].linkindex]=1;
|
||
for (ob = firstactive; ob;)
|
||
{
|
||
temp = ob->nextactive;
|
||
DoActor (ob);
|
||
#if (DEVELOPMENT == 1)
|
||
if ((ob->x<=0) || (ob->y<=0))
|
||
Error("object xy below zero obj->x=%ld obj->y=%ld obj->obclass=%ld\n",ob->x,ob->y,ob->obclass);
|
||
if ((ob->angle<0) || (ob->angle>=FINEANGLES))
|
||
Error("object angle below zero obj->angle=%ld obj->obclass=%ld\n",ob->angle,ob->obclass);
|
||
#endif
|
||
ob = temp;
|
||
}
|
||
|
||
BattleStatus = BATTLE_CheckGameStatus( battle_refresh, 0 );
|
||
if ( BattleStatus != battle_no_event )
|
||
{
|
||
switch( BattleStatus )
|
||
{
|
||
case battle_end_game :
|
||
case battle_out_of_time :
|
||
playstate = ex_battledone;
|
||
break;
|
||
|
||
case battle_end_round :
|
||
SetWhoHaveWeapons();
|
||
break;
|
||
default:
|
||
;
|
||
}
|
||
if ( playstate == ex_battledone )
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
#if (SYNCCHECK == 1)
|
||
CheckForSyncCheck();
|
||
#endif
|
||
if (timelimitenabled == true)
|
||
{
|
||
if (timelimit-gamestate.TimeCount>maxtimelimit)
|
||
timelimit = maxtimelimit+gamestate.TimeCount;
|
||
if (gamestate.TimeCount == timelimit)
|
||
{
|
||
locplayerstate->lives=-1;
|
||
playstate=ex_died;
|
||
}
|
||
}
|
||
|
||
gamestate.TimeCount ++;
|
||
|
||
ResetCurrentCommand();
|
||
|
||
oldpolltime++;
|
||
if (GamePaused==true)
|
||
break;
|
||
}
|
||
actortime=GetFastTics()-atime;
|
||
|
||
UpdateClientControls ();
|
||
|
||
if (noecho == false)
|
||
{
|
||
if ( player->flags & FL_SHROOMS )
|
||
{
|
||
FX_SetReverb( 230 );
|
||
}
|
||
else if (sky == 0)
|
||
{
|
||
FX_SetReverb( min( numareatiles[ player->areanumber ] >> 1, 90 ) );
|
||
}
|
||
}
|
||
|
||
waminot();
|
||
|
||
}
|
||
|
||
|
||
void PauseLoop ( void )
|
||
{
|
||
StopWind();
|
||
|
||
UpdateClientControls ();
|
||
|
||
while (oldpolltime<oldtime)
|
||
{
|
||
CheckUnPause();
|
||
#if (SYNCCHECK == 1)
|
||
CheckForSyncCheck();
|
||
#endif
|
||
oldpolltime++;
|
||
if (GamePaused==false)
|
||
{
|
||
//bna++ section
|
||
if (( playstate == ex_stillplaying )&&(iGLOBAL_SCREENWIDTH > 320)){
|
||
pic_t *shape;
|
||
shape = ( pic_t * )W_CacheLumpName( "backtile", PU_CACHE, Cvt_pic_t, 1 );
|
||
DrawTiledRegion( 0, 16, iGLOBAL_SCREENWIDTH, iGLOBAL_SCREENHEIGHT - 32, 0, 16, shape );
|
||
DisableScreenStretch();//dont strech when we go BACK TO GAME
|
||
DrawPlayScreen(true);//repaint ammo and life stat
|
||
VW_UpdateScreen ();//update screen
|
||
}
|
||
StartupClientControls();
|
||
//bna section end
|
||
break;
|
||
}
|
||
}
|
||
|
||
CalcTics ();
|
||
if (demoplayback==false)
|
||
PollControls ();
|
||
|
||
if ((RefreshPause == true) &&
|
||
(GamePaused == true) &&
|
||
((GetTicCount() - pausedstartedticcount) >= blanktime))
|
||
{
|
||
RefreshPause = false;
|
||
StartupScreenSaver();
|
||
}
|
||
}
|
||
|
||
|
||
|
||
void PlayLoop
|
||
(
|
||
void
|
||
)
|
||
|
||
{
|
||
volatile int atime;
|
||
|
||
boolean canquit = true;
|
||
int quittime = 0;
|
||
|
||
wami(3);
|
||
|
||
|
||
if ( (loadedgame == false) && (timelimitenabled == false) )
|
||
{
|
||
gamestate.TimeCount = 0;
|
||
gamestate.frame = 0;
|
||
}
|
||
|
||
fromloadedgame:
|
||
|
||
GamePaused = false;
|
||
|
||
if ( loadedgame == false )
|
||
{
|
||
DrawPlayScreen( true );
|
||
missobj = NULL;
|
||
}
|
||
else
|
||
{
|
||
loadedgame = false;
|
||
DoLoadGameSequence();
|
||
}
|
||
|
||
drawtime = 0;
|
||
actortime = 0;
|
||
tics = 0;
|
||
SetFastTics(0);
|
||
|
||
if ( fizzlein == false )
|
||
{
|
||
StartupClientControls();
|
||
}
|
||
else
|
||
{
|
||
ShutdownClientControls();
|
||
}
|
||
|
||
// set detail level
|
||
doublestep = 2 - DetailLevel;
|
||
|
||
ResetMessageTime();
|
||
DeletePriorityMessage( MSG_SYSTEM );
|
||
|
||
if ( ( gamestate.battlemode == battle_Normal ) &&
|
||
( numplayers == 1 ) )
|
||
{
|
||
AddMessage( "Comm-bat is for Modem and Network games.", MSG_GAME );
|
||
AddMessage( "You will not be facing any", MSG_GAME );
|
||
AddMessage( "opponents. Have fun and explore.", MSG_GAME );
|
||
}
|
||
|
||
|
||
while( playstate == ex_stillplaying )
|
||
{
|
||
UpdateClientControls();
|
||
|
||
if ( GamePaused )
|
||
{
|
||
PauseLoop();
|
||
|
||
atime = GetFastTics();
|
||
|
||
if ( RefreshPause )
|
||
{
|
||
ThreeDRefresh();
|
||
}
|
||
else
|
||
{
|
||
UpdateScreenSaver();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (controlupdatestarted == 1)
|
||
UpdateGameObjects();
|
||
|
||
atime = GetFastTics();
|
||
|
||
ThreeDRefresh();
|
||
}
|
||
|
||
SyncToServer();
|
||
|
||
drawtime = GetFastTics() - atime;
|
||
|
||
// Don't allow player to quit if entering message
|
||
canquit = !MSG.messageon;
|
||
|
||
PollKeyboard();
|
||
|
||
MISCVARS->madenoise = false;
|
||
|
||
AnimateWalls();
|
||
|
||
UpdateClientControls();
|
||
|
||
#if (DEVELOPMENT == 1)
|
||
Z_CheckHeap();
|
||
#endif
|
||
|
||
if ( AutoDetailOn == true )
|
||
{
|
||
AdaptDetail();
|
||
}
|
||
|
||
UpdateClientControls();
|
||
|
||
DoSprites();
|
||
DoAnimatedMaskedWalls();
|
||
|
||
UpdatePlayers();
|
||
|
||
DrawTime( false );
|
||
|
||
UpdateClientControls();
|
||
|
||
if ( ( !BATTLEMODE ) && ( CP_CheckQuick( LastScan ) ) )
|
||
{
|
||
boolean escaped=false;
|
||
|
||
if (LastScan == sc_Escape)
|
||
{
|
||
MU_StoreSongPosition();
|
||
MU_StartSong(song_menu);
|
||
escaped = true;
|
||
}
|
||
TurnShakeOff();
|
||
StopWind();
|
||
SetBorderColor( 0 );
|
||
ShutdownClientControls();
|
||
if (demoplayback==true)
|
||
{
|
||
FreeDemo();
|
||
playstate = ex_demodone;
|
||
if (demoexit==true)
|
||
{
|
||
QuitGame();
|
||
}
|
||
return;
|
||
}
|
||
|
||
ControlPanel( LastScan );
|
||
|
||
// set detail level
|
||
doublestep = 2 - DetailLevel;
|
||
|
||
inmenu = false;
|
||
|
||
if ( playstate == ex_titles )
|
||
{
|
||
return;
|
||
}
|
||
|
||
if ( playstate == ex_stillplaying )
|
||
{
|
||
SetupScreen( false );
|
||
}
|
||
|
||
if ( loadedgame == true )
|
||
{
|
||
goto fromloadedgame;
|
||
}
|
||
|
||
if (
|
||
( playstate == ex_stillplaying ) &&
|
||
( ( fizzlein == false ) ||
|
||
( GamePaused )
|
||
)
|
||
)
|
||
{
|
||
StartupClientControls();
|
||
}
|
||
|
||
if (
|
||
(playstate == ex_stillplaying) &&
|
||
(GamePaused == false) &&
|
||
(escaped == true)
|
||
)
|
||
{
|
||
MU_StartSong(song_level);
|
||
MU_RestoreSongPosition();
|
||
}
|
||
}
|
||
|
||
if ( BATTLEMODE )
|
||
{
|
||
if ( MSG.messageon == false )
|
||
{
|
||
CheckRemoteRidicule( LastScan );
|
||
}
|
||
if ( quitactive == false )
|
||
{
|
||
if ( ( LastScan == sc_Escape ) && ( canquit ) )
|
||
{
|
||
quitactive = true;
|
||
quittime = GetTicCount() + QUITTIMEINTERVAL;
|
||
|
||
if ( (consoleplayer == 0) || (networkgame == false) )
|
||
{
|
||
AddMessage( "Do you want to end this game? "
|
||
"(\\FY\\O/\\FN\\O)", MSG_QUIT );
|
||
}
|
||
else
|
||
{
|
||
AddMessage( "Do you want to exit to DOS? "
|
||
"(\\FY\\O/\\EN\\O)", MSG_QUIT );
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if ( GetTicCount() > quittime )
|
||
{
|
||
quitactive = false;
|
||
}
|
||
else if ( LastScan == sc_N )
|
||
{
|
||
DeletePriorityMessage( MSG_QUIT );
|
||
quitactive = false;
|
||
}
|
||
else if ( LastScan == sc_Y )
|
||
{
|
||
DeletePriorityMessage( MSG_QUIT );
|
||
if ( (consoleplayer == 0) || (networkgame==false) )
|
||
{
|
||
AddEndGameCommand();
|
||
}
|
||
else
|
||
{
|
||
AddQuitCommand();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
waminot();
|
||
}
|
||
|
||
//******************************************************************************
|
||
//
|
||
// CheckRemoteRidicule ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void CheckRemoteRidicule ( int scancode )
|
||
{
|
||
int num=-1;
|
||
|
||
wami(4);
|
||
switch (scancode)
|
||
{
|
||
case sc_F1:
|
||
num=0;
|
||
break;
|
||
case sc_F2:
|
||
num=1;
|
||
break;
|
||
case sc_F3:
|
||
num=2;
|
||
break;
|
||
case sc_F4:
|
||
num=3;
|
||
break;
|
||
case sc_F5:
|
||
if ( !Keyboard[ sc_RShift ] )
|
||
{
|
||
num=4;
|
||
}
|
||
break;
|
||
case sc_F6:
|
||
num=5;
|
||
break;
|
||
case sc_F7:
|
||
if ( !Keyboard[ sc_RShift ] )
|
||
{
|
||
num=6;
|
||
}
|
||
break;
|
||
case sc_F8:
|
||
num=7;
|
||
break;
|
||
case sc_F9:
|
||
num=8;
|
||
break;
|
||
case sc_F10:
|
||
num=9;
|
||
break;
|
||
}
|
||
if (num>=0)
|
||
{
|
||
AddRemoteRidiculeCommand ( consoleplayer, MSG_DIRECTED_TO_ALL, num );
|
||
LastScan=0;
|
||
}
|
||
waminot();
|
||
}
|
||
|
||
//******************************************************************************
|
||
//
|
||
// DoBossKey ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void DoBossKey ( void )
|
||
{
|
||
#ifdef DOS
|
||
union REGS regs;
|
||
ShutdownClientControls();
|
||
|
||
SetTextMode();
|
||
|
||
// move cursor to the row 0 column 4
|
||
regs.w.ax = 0x0200;
|
||
regs.w.bx = 0;
|
||
regs.w.dx = 0x0004;
|
||
int386(0x10,®s,®s);
|
||
px=0;
|
||
py=0;
|
||
UL_printf("C:\\>\n");
|
||
|
||
LastScan = 0;
|
||
IN_WaitForKey ();
|
||
VL_SetVGAPlaneMode();
|
||
VL_SetPalette(origpal);
|
||
SetBorderColor(0);
|
||
TurnShakeOff();
|
||
SetupScreen(true);
|
||
ThreeDRefresh();
|
||
|
||
StartupClientControls();
|
||
#else
|
||
STUB_FUNCTION;
|
||
#endif
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// PollKeyboard ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void PollKeyboard
|
||
(
|
||
void
|
||
)
|
||
|
||
{
|
||
static char autopressed = false;
|
||
|
||
wami(5);
|
||
|
||
if (demoplayback==true)
|
||
{
|
||
IN_UpdateKeyboard();
|
||
}
|
||
|
||
if ( !BATTLEMODE )
|
||
{
|
||
CheckDebug ();
|
||
if (
|
||
( Keyboard[ sc_CapsLock ] ) &&
|
||
( DebugOk )
|
||
)
|
||
{
|
||
DebugKeys ();
|
||
}
|
||
}
|
||
|
||
if ( locplayerstate->buttonstate[ bt_autorun ] )
|
||
{
|
||
if ( !autopressed )
|
||
{
|
||
autopressed = true;
|
||
gamestate.autorun ^= 1;
|
||
if ( gamestate.autorun == 0 )
|
||
{
|
||
AddMessage( "AutoRun is \\cOFF", MSG_SYSTEM );
|
||
}
|
||
else
|
||
{
|
||
AddMessage( "AutoRun is \\cON", MSG_SYSTEM );
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
autopressed = false;
|
||
}
|
||
|
||
#if 0
|
||
if ( modemgame == false )
|
||
{
|
||
CheckDevelopmentKeys();
|
||
}
|
||
#endif
|
||
|
||
if ( ( MSG.messageon == false ) && ( !quitactive ) )
|
||
{
|
||
if ( ( Keyboard[ buttonscan[ bt_message ] ] ) && ( BATTLEMODE ) )
|
||
{
|
||
// Send message to all
|
||
MSG.messageon = true;
|
||
MSG.directed = false;
|
||
MSG.inmenu = false;
|
||
MSG.remoteridicule = -1;
|
||
MSG.towho = MSG_DIRECTED_TO_ALL;
|
||
MSG.textnum = AddMessage( "_", MSG_MODEM );
|
||
MSG.length = 1;
|
||
DeletePriorityMessage( MSG_MACRO );
|
||
}
|
||
else if ( ( Keyboard[ buttonscan[ bt_directmsg ] ] ) && ( BATTLEMODE ) )
|
||
{
|
||
// Send directed message
|
||
MSG.messageon = true;
|
||
MSG.directed = true;
|
||
MSG.inmenu = false;
|
||
MSG.remoteridicule = -1;
|
||
MSG.towho = 0;
|
||
MSG.textnum = AddMessage( "_", MSG_MODEM );
|
||
MSG.length = 1;
|
||
DeletePriorityMessage( MSG_MACRO );
|
||
}
|
||
if ( buttonpoll[ bt_map ] )
|
||
{
|
||
if ( !BATTLEMODE )
|
||
{
|
||
// Automap
|
||
StopWind();
|
||
DoMap( player->tilex, player->tiley );
|
||
}
|
||
else
|
||
{
|
||
// Show kill counts
|
||
if ( SHOW_KILLS() )
|
||
{
|
||
BATTLE_ShowKillCount = false;
|
||
StatusBar &= ~STATUS_KILLS;
|
||
}
|
||
else
|
||
{
|
||
StatusBar |= STATUS_KILLS;
|
||
BATTLE_ShowKillCount = true;
|
||
}
|
||
|
||
SetupScreen( true );
|
||
}
|
||
}
|
||
|
||
// Shrink screen
|
||
if ( Keyboard[ sc_Minus ] )
|
||
{
|
||
Keyboard[ sc_Minus ] = false; // HDG debounce
|
||
if ( viewsize > 0 )
|
||
{
|
||
viewsize--;
|
||
SetupScreen( true );
|
||
}
|
||
}
|
||
|
||
// Expand screen
|
||
if ( Keyboard[ sc_Plus ] )
|
||
{
|
||
Keyboard[ sc_Plus ] = false; // HDG debounce
|
||
if ( viewsize < MAXVIEWSIZES - 1 )
|
||
{
|
||
viewsize++;
|
||
SetupScreen( true );
|
||
}
|
||
}
|
||
|
||
// Set detail
|
||
if ( ( Keyboard[ sc_F5 ] ) && ( ( !BATTLEMODE ) ||
|
||
( Keyboard[ sc_RShift ] ) ) )
|
||
{
|
||
Keyboard[ sc_F5 ] = false;
|
||
LastScan = 0;
|
||
DetailLevel++;
|
||
if ( DetailLevel > 2 )
|
||
{
|
||
DetailLevel = 0;
|
||
}
|
||
|
||
switch( DetailLevel )
|
||
{
|
||
case 0 :
|
||
AddMessage( "Low detail", MSG_SYSTEM );
|
||
break;
|
||
|
||
case 1 :
|
||
AddMessage( "Medium detail", MSG_SYSTEM );
|
||
break;
|
||
|
||
case 2 :
|
||
AddMessage( "High detail", MSG_SYSTEM );
|
||
break;
|
||
}
|
||
doublestep = 2 - DetailLevel;
|
||
}
|
||
|
||
// Turn messages on/off
|
||
|
||
if ( ( Keyboard[ sc_F7 ] ) && ( ( !BATTLEMODE ) ||
|
||
( Keyboard[ sc_RShift ] ) ) )
|
||
{
|
||
Keyboard[ sc_F7 ] = false;
|
||
LastScan = 0;
|
||
MessagesEnabled = !MessagesEnabled;
|
||
if ( !MessagesEnabled )
|
||
{
|
||
AddMessage( "Messages disabled.", MSG_MSGSYSTEM );
|
||
}
|
||
else
|
||
{
|
||
AddMessage( "Messages enabled.", MSG_MSGSYSTEM );
|
||
}
|
||
}
|
||
|
||
if ( ( Keyboard[ sc_F6 ] ) && ( !BATTLEMODE ) )
|
||
{
|
||
Keyboard[ sc_F6 ] = false;
|
||
if (Keyboard[sc_RShift])
|
||
{
|
||
ShutdownClientControls();
|
||
UndoQuickSaveGame();
|
||
StartupClientControls();
|
||
}
|
||
else if (quicksaveslot==-1)
|
||
{
|
||
ShutdownClientControls();
|
||
LastScan=sc_F2;
|
||
inmenu = true;
|
||
ControlPanel( LastScan );
|
||
StartupClientControls();
|
||
}
|
||
else
|
||
{
|
||
LastScan = 0;
|
||
ShutdownClientControls();
|
||
ThreeDRefresh();
|
||
QuickSaveGame();
|
||
StartupClientControls();
|
||
}
|
||
}
|
||
|
||
//#if 0
|
||
if ( ( Keyboard[ sc_F12 ] ) && ( !BATTLEMODE ) )
|
||
{
|
||
Keyboard[ sc_F12 ] = false;
|
||
LastScan = 0;
|
||
DoBossKey();
|
||
}
|
||
//#endif
|
||
|
||
// Gamma correction
|
||
if ( Keyboard[ sc_F11 ] )
|
||
{
|
||
char str[ 50 ] = "Gamma Correction Level ";
|
||
char str2[ 10 ];
|
||
|
||
gammaindex++;
|
||
if ( gammaindex == NUMGAMMALEVELS )
|
||
{
|
||
gammaindex = 0;
|
||
}
|
||
VL_SetPalette( origpal );
|
||
itoa( gammaindex, str2, 10 );
|
||
strcat( str, str2 );
|
||
AddMessage( str, MSG_SYSTEM );
|
||
|
||
while( Keyboard[ sc_F11 ] )
|
||
{
|
||
IN_UpdateKeyboard();
|
||
}
|
||
}
|
||
#if 0
|
||
if ( Keyboard[ sc_M ] )
|
||
{
|
||
char str[ 50 ] = "Mouse Y-Rotation Input Scale ";
|
||
char str2[ 10 ];
|
||
|
||
if ( Keyboard[ sc_RShift ] )
|
||
mouse_ry_input_scale += 50;
|
||
else
|
||
mouse_ry_input_scale -= 50;
|
||
|
||
itoa(mouse_ry_input_scale,str2,10);
|
||
strcat( str, str2 );
|
||
AddMessage( str, MSG_SYSTEM );
|
||
|
||
}
|
||
#endif
|
||
// Increase volume
|
||
if ( Keyboard[ sc_CloseBracket ] )
|
||
{
|
||
if ( Keyboard[ sc_RShift ] )
|
||
{
|
||
char str[ 50 ] = "Music Volume Level ";
|
||
char str2[ 10 ];
|
||
|
||
if ( MUvolume < 255 )
|
||
{
|
||
MUvolume++;
|
||
}
|
||
MU_SetVolume( MUvolume );
|
||
|
||
itoa( MUvolume, str2, 10 );
|
||
strcat( str, str2 );
|
||
AddMessage( str, MSG_SYSTEM );
|
||
}
|
||
else
|
||
{
|
||
char str[ 50 ] = "Sound FX Volume Level ";
|
||
char str2[ 10 ];
|
||
|
||
if ( FXvolume < 255 )
|
||
{
|
||
FXvolume++;
|
||
}
|
||
FX_SetVolume( FXvolume );
|
||
|
||
itoa( FXvolume, str2, 10 );
|
||
strcat( str, str2 );
|
||
AddMessage( str, MSG_SYSTEM );
|
||
}
|
||
}
|
||
|
||
// Decrease volume
|
||
if ( Keyboard[ sc_OpenBracket ] )
|
||
{
|
||
if ( Keyboard[ sc_RShift ] )
|
||
{
|
||
char str[ 50 ] = "Music Volume Level ";
|
||
char str2[ 10 ];
|
||
|
||
if ( MUvolume > 0 )
|
||
{
|
||
MUvolume--;
|
||
}
|
||
MU_SetVolume( MUvolume );
|
||
|
||
itoa( MUvolume, str2, 10 );
|
||
strcat( str, str2 );
|
||
AddMessage( str, MSG_SYSTEM );
|
||
}
|
||
else
|
||
{
|
||
char str[ 50 ] = "Sound FX Volume Level ";
|
||
char str2[ 10 ];
|
||
|
||
if ( FXvolume > 0 )
|
||
{
|
||
FXvolume--;
|
||
}
|
||
FX_SetVolume( FXvolume );
|
||
|
||
itoa( FXvolume, str2, 10 );
|
||
strcat( str, str2 );
|
||
AddMessage( str, MSG_SYSTEM );
|
||
}
|
||
}
|
||
|
||
#if SAVE_SCREEN
|
||
#if (DEVELOPMENT == 1)
|
||
if ( Keyboard[ sc_CapsLock ] && Keyboard[ sc_C ] )
|
||
{
|
||
SaveScreen( true );
|
||
}
|
||
else if ( Keyboard[ sc_CapsLock ] && Keyboard[ sc_X ] )
|
||
{
|
||
SaveScreen( false );
|
||
}
|
||
#endif
|
||
else if ( Keyboard[ sc_Alt] && Keyboard[ sc_C ] )
|
||
{
|
||
SaveScreen( false );
|
||
}
|
||
#ifdef DOS /* makes no sense under Linux as there are no lbm viewers there */
|
||
else if ( Keyboard[ sc_Alt] && Keyboard[ sc_V ] )
|
||
{
|
||
SaveScreen( true );
|
||
}
|
||
#endif
|
||
#endif
|
||
}
|
||
#ifdef USE_SDL
|
||
/* SDL doesn't send proper release events for these */
|
||
if (Keystate[sc_CapsLock])
|
||
{
|
||
Keystate[sc_CapsLock]++;
|
||
if (Keystate[sc_CapsLock] == 3)
|
||
Keystate[sc_CapsLock] = 0;
|
||
}
|
||
if (Keystate[0x45]) /* numlock */
|
||
{
|
||
Keystate[0x45]++;
|
||
if (Keystate[0x45] == 3)
|
||
Keystate[0x45] = 0;
|
||
}
|
||
#endif
|
||
waminot();
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// CheckDevelopmentKeys ()
|
||
//
|
||
//******************************************************************************
|
||
#if 0
|
||
void CheckDevelopmentKeys
|
||
(
|
||
void
|
||
)
|
||
|
||
{
|
||
#if (DEBUG == 1)
|
||
if ( Keyboard[ sc_CapsLock ] && Keyboard[ sc_T ] )
|
||
{
|
||
if ( warp == true )
|
||
{
|
||
player->x = warpx;
|
||
player->y = warpy;
|
||
player->angle = warpa;
|
||
locplayerstate->anglefrac = warpa << ANGLEBITS;
|
||
player->momentumx = 0;
|
||
player->momentumy = 0;
|
||
player->momentumz = 0;
|
||
}
|
||
return;
|
||
}
|
||
#endif
|
||
|
||
// Lower wall height
|
||
if ( Keyboard[ sc_5 ] )
|
||
{
|
||
if ( levelheight > 1 )
|
||
{
|
||
levelheight--;
|
||
}
|
||
|
||
while( Keyboard[ sc_5 ] )
|
||
{
|
||
IN_UpdateKeyboard ();
|
||
}
|
||
|
||
maxheight = ( levelheight << 6 ) - 32;
|
||
nominalheight = maxheight - 32;
|
||
}
|
||
|
||
// Raise wall height
|
||
if ( Keyboard[ sc_6 ] )
|
||
{
|
||
levelheight++;
|
||
|
||
while( Keyboard[ sc_6 ] )
|
||
{
|
||
IN_UpdateKeyboard();
|
||
}
|
||
|
||
maxheight = ( levelheight << 6 ) - 32;
|
||
nominalheight = maxheight - 32;
|
||
}
|
||
|
||
if ( Keyboard[ sc_8 ] )
|
||
{
|
||
char str[ 50 ] = "You are now player ";
|
||
char str2[ 10 ];
|
||
|
||
locplayerstate->player++;
|
||
if ( locplayerstate->player == 5 )
|
||
{
|
||
locplayerstate->player = 0;
|
||
}
|
||
|
||
while( Keyboard[ sc_8 ] )
|
||
{
|
||
IN_UpdateKeyboard ();
|
||
}
|
||
|
||
itoa( locplayerstate->player, str2, 10 );
|
||
strcat( str, str2 );
|
||
AddMessage( str, MSG_SYSTEM );
|
||
}
|
||
|
||
#if 0
|
||
// Cycle forward through wall textures
|
||
if (Keyboard[sc_W] && (modemgame==false))
|
||
{int i,j;
|
||
|
||
for(i=0;i<128;i++)
|
||
for(j=0;j<128;j++)
|
||
{if (IsWall(i,j))
|
||
{if (tilemap[i][j] ==
|
||
(W_GetNumForName("WALLSTOP")-W_GetNumForName("WALLSTRT")-1))
|
||
tilemap[i][j] = 1;
|
||
else
|
||
tilemap[i][j] ++;
|
||
}
|
||
}
|
||
while(Keyboard[sc_W])
|
||
IN_UpdateKeyboard ();
|
||
|
||
}
|
||
|
||
|
||
|
||
if (Keyboard[sc_Q] && (modemgame==false))
|
||
{int i,j;
|
||
|
||
for(i=0;i<128;i++)
|
||
for(j=0;j<128;j++)
|
||
{if (IsWall(i,j))
|
||
{if (tilemap[i][j] == 1)
|
||
tilemap[i][j] = 74;
|
||
else
|
||
tilemap[i][j] --;
|
||
}
|
||
}
|
||
while(Keyboard[sc_Q])
|
||
IN_UpdateKeyboard ();
|
||
|
||
}
|
||
|
||
#endif
|
||
// Step through cieling/skies
|
||
if ( Keyboard[ sc_K ] )
|
||
{
|
||
if ( sky > 0 )
|
||
{
|
||
MAPSPOT( 1, 0, 0 )++;
|
||
if ( MAPSPOT( 1, 0, 0 ) > 239 )
|
||
{
|
||
MAPSPOT( 1, 0, 0 ) = 234;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
MAPSPOT( 1, 0, 0 )++;
|
||
if ( MAPSPOT( 1, 0, 0 ) > 198 + 15 )
|
||
{
|
||
MAPSPOT( 1, 0, 0 ) = 198;
|
||
}
|
||
}
|
||
|
||
SetPlaneViewSize();
|
||
|
||
while( Keyboard[ sc_K ] )
|
||
{
|
||
IN_UpdateKeyboard();
|
||
}
|
||
}
|
||
|
||
// Step through floors
|
||
if ( Keyboard[ sc_L ] )
|
||
{
|
||
MAPSPOT( 0, 0, 0 )++;
|
||
if ( MAPSPOT( 0, 0, 0 ) > 180 + 15 )
|
||
{
|
||
MAPSPOT( 0, 0, 0 ) = 180;
|
||
SetPlaneViewSize();
|
||
|
||
while( Keyboard[ sc_L ] )
|
||
{
|
||
IN_UpdateKeyboard();
|
||
}
|
||
}
|
||
}
|
||
|
||
// Increase darkness level
|
||
if ( Keyboard[ sc_M ] )
|
||
{
|
||
if ( darknesslevel < 7 )
|
||
{
|
||
darknesslevel++;
|
||
}
|
||
|
||
SetLightLevels( darknesslevel );
|
||
|
||
while( Keyboard[ sc_M ] )
|
||
{
|
||
IN_UpdateKeyboard();
|
||
}
|
||
}
|
||
|
||
// Decrease darkness level
|
||
if ( Keyboard[ sc_N ] )
|
||
{
|
||
if ( darknesslevel > 0 )
|
||
{
|
||
darknesslevel--;
|
||
}
|
||
|
||
SetLightLevels( darknesslevel );
|
||
|
||
while( Keyboard[ sc_N ] )
|
||
{
|
||
IN_UpdateKeyboard();
|
||
}
|
||
}
|
||
|
||
// Increase light rate
|
||
if ( Keyboard[ sc_B ] )
|
||
{
|
||
SetLightRate( GetLightRate() + 1 );
|
||
myprintf( "normalshade = %ld\n", normalshade );
|
||
|
||
while( Keyboard[ sc_B ] )
|
||
{
|
||
IN_UpdateKeyboard();
|
||
}
|
||
}
|
||
|
||
// Decrease light rate
|
||
if ( Keyboard[ sc_V ] )
|
||
{
|
||
SetLightRate( GetLightRate() - 1 );
|
||
myprintf( "normalshade = %ld\n", normalshade );
|
||
|
||
while( Keyboard[ sc_V ] )
|
||
{
|
||
IN_UpdateKeyboard();
|
||
}
|
||
}
|
||
|
||
// Toggle light diminishing on/off
|
||
if ( Keyboard[ sc_T ] )
|
||
{
|
||
fulllight ^= 1;
|
||
|
||
while( Keyboard[ sc_T ] )
|
||
{
|
||
IN_UpdateKeyboard();
|
||
}
|
||
}
|
||
}
|
||
#endif
|
||
|
||
|
||
#if SAVE_SCREEN
|
||
|
||
|
||
short BigShort (short l)
|
||
{
|
||
byte b1,b2;
|
||
|
||
b1 = l&255;
|
||
b2 = (l>>8)&255;
|
||
|
||
return (b1<<8) + b2;
|
||
}
|
||
|
||
long BigLong (long l)
|
||
{
|
||
byte b1,b2,b3,b4;
|
||
|
||
b1 = l&255;
|
||
b2 = (l>>8)&255;
|
||
b3 = (l>>16)&255;
|
||
b4 = (l>>24)&255;
|
||
|
||
return ((long)b1<<24) + ((long)b2<<16) + ((long)b3<<8) + b4;
|
||
}
|
||
|
||
/*
|
||
==============
|
||
=
|
||
= WriteLBMfile
|
||
=
|
||
==============
|
||
*/
|
||
|
||
void WriteLBMfile (char *filename, byte *data, int width, int height)
|
||
{
|
||
byte *lbm, *lbmptr;
|
||
long *formlength, *bmhdlength, *cmaplength, *bodylength;
|
||
long length;
|
||
bmhd_t basebmhd;
|
||
int handle;
|
||
int i;
|
||
|
||
lbm = lbmptr = (byte *) SafeMalloc ((iGLOBAL_SCREENWIDTH*iGLOBAL_SCREENHEIGHT)+4000);
|
||
|
||
//
|
||
// start FORM
|
||
//
|
||
*lbmptr++ = 'F';
|
||
*lbmptr++ = 'O';
|
||
*lbmptr++ = 'R';
|
||
*lbmptr++ = 'M';
|
||
|
||
formlength = (long*)lbmptr;
|
||
lbmptr+=4; // leave space for length
|
||
|
||
*lbmptr++ = 'P';
|
||
*lbmptr++ = 'B';
|
||
*lbmptr++ = 'M';
|
||
*lbmptr++ = ' ';
|
||
|
||
//
|
||
// write BMHD
|
||
//
|
||
*lbmptr++ = 'B';
|
||
*lbmptr++ = 'M';
|
||
*lbmptr++ = 'H';
|
||
*lbmptr++ = 'D';
|
||
|
||
bmhdlength = (long *)lbmptr;
|
||
lbmptr+=4; // leave space for length
|
||
|
||
memset (&basebmhd,0,sizeof(basebmhd));
|
||
basebmhd.w = BigShort(width);
|
||
basebmhd.h = BigShort(height);
|
||
basebmhd.nPlanes = BigShort(8);
|
||
basebmhd.xAspect = BigShort(5);
|
||
basebmhd.yAspect = BigShort(6);
|
||
basebmhd.pageWidth = BigShort(width);
|
||
basebmhd.pageHeight = BigShort(height);
|
||
|
||
memcpy (lbmptr,&basebmhd,sizeof(basebmhd));
|
||
lbmptr += sizeof(basebmhd);
|
||
|
||
length = lbmptr-(byte *)bmhdlength-4;
|
||
*bmhdlength = BigLong(length);
|
||
if (length&1)
|
||
*lbmptr++ = 0; // pad chunk to even offset
|
||
|
||
//
|
||
// write CMAP
|
||
//
|
||
*lbmptr++ = 'C';
|
||
*lbmptr++ = 'M';
|
||
*lbmptr++ = 'A';
|
||
*lbmptr++ = 'P';
|
||
|
||
cmaplength = (long *)lbmptr;
|
||
lbmptr+=4; // leave space for length
|
||
|
||
for (i = 0; i < 0x300; i++)
|
||
*lbmptr++ = (*(origpal+i))<<2;
|
||
|
||
// memcpy (lbmptr,&origpal[0],768);
|
||
// lbmptr += 768;
|
||
|
||
length = lbmptr-(byte *)cmaplength-4;
|
||
*cmaplength = BigLong(length);
|
||
if (length&1)
|
||
*lbmptr++ = 0; // pad chunk to even offset
|
||
|
||
//
|
||
// write BODY
|
||
//
|
||
*lbmptr++ = 'B';
|
||
*lbmptr++ = 'O';
|
||
*lbmptr++ = 'D';
|
||
*lbmptr++ = 'Y';
|
||
|
||
bodylength = (long *)lbmptr;
|
||
lbmptr+=4; // leave space for length
|
||
|
||
memcpy (lbmptr,data,width*height);
|
||
lbmptr += width*height;
|
||
|
||
length = lbmptr-(byte *)bodylength-4;
|
||
*bodylength = BigLong(length);
|
||
if (length&1)
|
||
*lbmptr++ = 0; // pad chunk to even offset
|
||
|
||
//
|
||
// done
|
||
//
|
||
length = lbmptr-(byte *)formlength-4;
|
||
*formlength = BigLong(length);
|
||
if (length&1)
|
||
*lbmptr++ = 0; // pad chunk to even offset
|
||
|
||
//
|
||
// write output file
|
||
//
|
||
handle = SafeOpenWrite (filename);
|
||
|
||
SafeWrite (handle, lbm, lbmptr-lbm);
|
||
|
||
close (handle);
|
||
SafeFree(lbm);
|
||
}
|
||
|
||
|
||
//****************************************************************************
|
||
//
|
||
// GetFileName ()
|
||
//
|
||
//****************************************************************************
|
||
|
||
void GetFileName (boolean saveLBM)
|
||
{
|
||
#ifdef DOS
|
||
char num[4];
|
||
int cnt = 0;
|
||
struct find_t fblock;
|
||
|
||
if (saveLBM)
|
||
memcpy (savename, "ROTT0000.LBM\0", 13);
|
||
else
|
||
memcpy (savename, "ROTT0000.PCX\0", 13);
|
||
|
||
if (_dos_findfirst (savename, 0, &fblock) != 0)
|
||
return;
|
||
|
||
do
|
||
{
|
||
cnt++;
|
||
memset (&num[0], 0, 4);
|
||
itoa (cnt, num, 10);
|
||
|
||
if (cnt > 99)
|
||
{
|
||
savename[5] = num[0];
|
||
savename[6] = num[1];
|
||
savename[7] = num[2];
|
||
}
|
||
else
|
||
if (cnt > 9)
|
||
{
|
||
savename[6] = num[0];
|
||
savename[7] = num[1];
|
||
}
|
||
else
|
||
savename[7] = num[0];
|
||
}
|
||
while (_dos_findfirst (savename, 0, &fblock) == 0);
|
||
#else
|
||
int i;
|
||
|
||
for (i = 0; i < 9999; i++) {
|
||
char filename[128];
|
||
|
||
if (saveLBM) {
|
||
sprintf(savename, "rott%04d.lbm", i);
|
||
} else {
|
||
sprintf(savename, "rott%04d.pcx", i);
|
||
}
|
||
|
||
GetPathFromEnvironment( filename, ApogeePath, savename );
|
||
|
||
if (access(filename, F_OK) != 0) {
|
||
return;
|
||
}
|
||
}
|
||
#endif
|
||
}
|
||
|
||
//****************************************************************************
|
||
//
|
||
// SaveScreen ()
|
||
//
|
||
//****************************************************************************
|
||
|
||
boolean inhmenu;
|
||
|
||
#if (BETA == 1)
|
||
#define SSX (160-(46*2))
|
||
#define SSY (17)
|
||
#endif
|
||
void SaveScreen (boolean saveLBM)
|
||
{
|
||
byte *buffer;
|
||
byte * screen;
|
||
boolean oldHUD;
|
||
char filename[ 128 ];
|
||
|
||
#if (BETA == 1)
|
||
unsigned tmp;
|
||
char buf[30];
|
||
int i;
|
||
#endif
|
||
|
||
|
||
oldHUD=HUD;
|
||
HUD=false;
|
||
doublestep=0;
|
||
if (inhmenu==false)
|
||
screen = (byte *) bufferofs;
|
||
else
|
||
screen = (byte *) displayofs;
|
||
|
||
if (inhmenu==false)
|
||
ThreeDRefresh ();
|
||
doublestep = 2 - DetailLevel;
|
||
|
||
//buffer = (byte *) SafeMalloc (65000);
|
||
buffer = (byte *) SafeMalloc ((iGLOBAL_SCREENHEIGHT*iGLOBAL_SCREENWIDTH)+4000);
|
||
|
||
#if (BETA == 1)
|
||
if (SCREENSHOTS == false)
|
||
{
|
||
if (screen!=(byte *)bufferofs)
|
||
{
|
||
tmp=bufferofs;
|
||
bufferofs=displayofs;
|
||
}
|
||
CurrentFont=tinyfont;
|
||
|
||
VGAMAPMASK(15);
|
||
for (i=-1;i<6;i++)
|
||
memset((byte *)bufferofs+(ylookup[i+SSY])+(SSX>>2),0,46);
|
||
px=SSX;
|
||
py=SSY;
|
||
VW_DrawPropString(" Rise of the Triad (c) 1995 Apogee Version ");
|
||
VW_DrawPropString(itoa(ROTTMAJORVERSION,&buf[0],10));
|
||
VW_DrawPropString(".");
|
||
VW_DrawPropString(itoa(ROTTMINORVERSION,&buf[0],10));
|
||
px=SSX+13;
|
||
py=SSY+8;
|
||
VW_DrawPropString(" Episode ");
|
||
VW_DrawPropString(itoa(gamestate.episode,&buf[0],10));
|
||
VW_DrawPropString(" Area ");
|
||
VW_DrawPropString(itoa(GetLevel(gamestate.episode, gamestate.mapon),&buf[0],10));
|
||
|
||
if (screen!=(byte *)bufferofs)
|
||
bufferofs=tmp;
|
||
}
|
||
#endif
|
||
|
||
|
||
|
||
GetFileName (saveLBM);
|
||
GetPathFromEnvironment( filename, ApogeePath, savename );
|
||
//
|
||
memcpy(buffer,screen , iGLOBAL_SCREENWIDTH*iGLOBAL_SCREENHEIGHT);//bna
|
||
//bna--VL_CopyPlanarPageToMemory(screen,buffer);
|
||
|
||
if (saveLBM)
|
||
{
|
||
WriteLBMfile (filename, buffer, iGLOBAL_SCREENWIDTH, iGLOBAL_SCREENHEIGHT);
|
||
#if (DEVELOPMENT == 1)
|
||
while (Keyboard[sc_CapsLock] && Keyboard[sc_C])
|
||
#else
|
||
while (Keyboard[sc_Alt] && Keyboard[sc_V])
|
||
#endif
|
||
IN_UpdateKeyboard ();
|
||
}
|
||
else
|
||
{
|
||
WritePCX (filename, buffer);
|
||
#if (DEVELOPMENT == 1)
|
||
while (Keyboard[sc_CapsLock] && Keyboard[sc_X])
|
||
#else
|
||
while (Keyboard[sc_Alt] && Keyboard[sc_C])
|
||
#endif
|
||
IN_UpdateKeyboard ();
|
||
}
|
||
|
||
SafeFree(buffer);
|
||
HUD=oldHUD;
|
||
}
|
||
|
||
//****************************************************************************
|
||
//
|
||
// WritePCX ()
|
||
//
|
||
//****************************************************************************
|
||
|
||
void WritePCX (char * file, byte * source)
|
||
{
|
||
PCX_HEADER pcxHDR;
|
||
byte *tempbuffer;
|
||
byte pal[0x300];
|
||
int pcxhandle;
|
||
int i, j, y;
|
||
unsigned char c;
|
||
unsigned char buffer1[GAP_SIZE];
|
||
|
||
pcxhandle = SafeOpenWrite (file);
|
||
|
||
/* --- init the header that we'll write.
|
||
* Note: since DPaint never reads & writes at the same time,
|
||
* it is okay to share the same read & write structure,
|
||
* unlike in CONVERT.EXE.
|
||
*/
|
||
|
||
memset (&pcxHDR, 0, sizeof(PCX_HEADER));
|
||
|
||
pcxHDR.manufacturer = 10;
|
||
pcxHDR.version = 5;
|
||
pcxHDR.encoding = 1;
|
||
|
||
pcxHDR.bitsperpixel = 8; //bpp;
|
||
pcxHDR.xmin = pcxHDR.ymin = 0;
|
||
pcxHDR.xmax = iGLOBAL_SCREENWIDTH - 1;
|
||
pcxHDR.ymax = iGLOBAL_SCREENHEIGHT - 1;
|
||
pcxHDR.hres = iGLOBAL_SCREENWIDTH; //N_COLUMNS;
|
||
pcxHDR.vres = iGLOBAL_SCREENHEIGHT; //N_LINES;
|
||
|
||
// bytesperline doesn't take into account multiple planes.
|
||
// Output in same format as bitmap (planar vs packed).
|
||
//
|
||
pcxHDR.bytesperline = iGLOBAL_SCREENWIDTH; //bitmap->width;
|
||
|
||
pcxHDR.nplanes = 1; //bitmap->planes;
|
||
pcxHDR.reserved = 0;
|
||
|
||
// First 16 colors of our palette info.
|
||
for (i = 0, j = 0; i < 16; ++i, j += 3) {
|
||
pcxHDR.colormap[i][0] = (unsigned char)(origpal[j]);
|
||
pcxHDR.colormap[i][1] = (unsigned char)(origpal[j]+2);
|
||
pcxHDR.colormap[i][2] = (unsigned char)(origpal[j]+3);
|
||
}
|
||
|
||
//
|
||
// Write the 128-byte header
|
||
//
|
||
SafeWrite(pcxhandle,&pcxHDR, sizeof (PCX_HEADER));
|
||
|
||
memset (buffer1, 0, GAP_SIZE);
|
||
|
||
SafeWrite (pcxhandle, &buffer1, GAP_SIZE);
|
||
|
||
tempbuffer = (byte *) SafeMalloc ((iGLOBAL_SCREENHEIGHT*iGLOBAL_SCREENWIDTH)+4000);
|
||
bptr = tempbuffer;
|
||
totalbytes = 0;
|
||
|
||
//
|
||
// Write to a bit-packed file.
|
||
//
|
||
for (y = 0; y < iGLOBAL_SCREENHEIGHT; ++y) // for each line in band
|
||
if (PutBytes (((unsigned char *) (source+(y*iGLOBAL_SCREENWIDTH))),
|
||
pcxHDR.bytesperline))
|
||
Error ("Error writing PCX bit-packed line!\n");
|
||
|
||
SafeWrite (pcxhandle, tempbuffer, totalbytes);
|
||
|
||
//
|
||
// Write out PCX palette
|
||
//
|
||
c = 0x0C;
|
||
|
||
for (i = 0; i < 0x300; i++)
|
||
pal[i] = (*(origpal+i))<<2;
|
||
|
||
SafeWrite (pcxhandle, &c, 1);
|
||
SafeWrite (pcxhandle, &pal[0], 768);
|
||
|
||
close (pcxhandle);
|
||
SafeFree (tempbuffer);
|
||
}
|
||
|
||
|
||
//****************************************************************************
|
||
//
|
||
// PutBytes ()
|
||
//
|
||
// Write bytes to a file, handling packing as it goes.
|
||
// Returns : 0 == SUCCESS
|
||
// 1 == FAIL.
|
||
//
|
||
//****************************************************************************
|
||
|
||
int PutBytes (unsigned char *ptr, unsigned int bytes)
|
||
{
|
||
unsigned int startbyte, count;
|
||
char b;
|
||
|
||
while (bytes > 0) {
|
||
// check for a repeating byte value
|
||
startbyte = *ptr;
|
||
*ptr++ = 0;
|
||
--bytes;
|
||
count = 1;
|
||
while (*ptr == startbyte && bytes > 0 && count < 63)
|
||
{
|
||
*ptr = 0;
|
||
++ptr;
|
||
--bytes;
|
||
++count;
|
||
}
|
||
// If we can pack the sequence, or if we have to add a
|
||
// byte before it because the top 2 bits of the value
|
||
// are 1's, write a packed sequence of 2 bytes.
|
||
// Otherwise, just write the byte value.
|
||
//
|
||
if (count > 1 || (startbyte & 0xc0) == 0xc0)
|
||
{
|
||
b = 0xc0 | count;
|
||
|
||
*bptr++ = b;
|
||
totalbytes++;
|
||
}
|
||
b = startbyte;
|
||
|
||
*bptr++ = b;
|
||
totalbytes++;
|
||
}
|
||
return (0);
|
||
}
|
||
|
||
|
||
#endif
|
||
|
||
|
||
//****************************************************************************
|
||
//
|
||
// PlayCinematic () - Play intro cinematics
|
||
//
|
||
//****************************************************************************
|
||
|
||
void PlayCinematic (void)
|
||
{
|
||
|
||
if ((tedlevel == true) || (turbo == true))
|
||
return;
|
||
|
||
switch (gamestate.mapon)
|
||
{
|
||
#if (SHAREWARE == 0)
|
||
byte pal[768];
|
||
case 0: // Start of EPISODE 1
|
||
|
||
MU_StartSong ( song_cinematic1 );
|
||
VL_FadeOut (0, 255, 0, 0, 0, 20);
|
||
VL_ClearBuffer (bufferofs, 0);
|
||
DrawNormalSprite(0,30,W_GetNumForName("nicolas"));
|
||
DrawNormalSprite(0,168,W_GetNumForName("oneyear"));
|
||
FlipPage();
|
||
memcpy(&pal[0],W_CacheLumpName("nicpal",PU_CACHE, CvtNull, 1),768);
|
||
VL_NormalizePalette(&pal[0]);
|
||
VL_FadeIn(0,255,pal,20);
|
||
I_Delay (60);
|
||
VL_FadeOut (0, 255, 0, 0, 0, 20);
|
||
IN_UpdateKeyboard();
|
||
if (LastScan!=0)
|
||
{
|
||
LastScan=0;
|
||
return;
|
||
}
|
||
SD_PlayPitchedSound(SD_LIGHTNINGSND,255,-1500);
|
||
DoInBetweenCinematic (20, W_GetNumForName("binoculr"), 80,
|
||
"The HUNT cases an\n"
|
||
"ancient monastery."
|
||
);
|
||
IN_UpdateKeyboard();
|
||
if (LastScan!=0)
|
||
{
|
||
LastScan=0;
|
||
return;
|
||
}
|
||
SD_Play(SD_NMESEESND);
|
||
DoInBetweenCinematic (20, W_GetNumForName("binosee"), 80,
|
||
"\"There they are,\" says\n"
|
||
"Cassatt. \"Let's get back\n"
|
||
"to the boat and inform HQ.\""
|
||
);
|
||
IN_UpdateKeyboard();
|
||
if (LastScan!=0)
|
||
{
|
||
LastScan=0;
|
||
return;
|
||
}
|
||
SD_Play(SD_HIGHGUARD1SEESND);
|
||
DoInBetweenCinematic (20, W_GetNumForName("boatgard"), 80,
|
||
"\"The intruders, on that hill!\""
|
||
);
|
||
IN_UpdateKeyboard();
|
||
if (LastScan!=0)
|
||
{
|
||
LastScan=0;
|
||
return;
|
||
}
|
||
SD_Play(SD_EXPLODESND);
|
||
DoInBetweenCinematic (20, W_GetNumForName("boatblow"), 80,
|
||
"\"There goes our ride home,\"\n"
|
||
"says Barrett. \"Looks like\n"
|
||
"the only way out is in....\""
|
||
);
|
||
IN_UpdateKeyboard();
|
||
LastScan=0;
|
||
break;
|
||
|
||
case 8: // Start of EPISODE 2
|
||
MU_StartSong ( song_cinematic2 );
|
||
DoInBetweenCinematic (0, W_GetNumForName("epi12"), 1200,
|
||
"The HUNT makes their way\n"
|
||
"into the main keep."
|
||
);
|
||
IN_UpdateKeyboard();
|
||
LastScan=0;
|
||
break;
|
||
|
||
case 16: // Start of EPISODE 3
|
||
MU_StartSong ( song_cinematic1 );
|
||
DoInBetweenCinematic (20, W_GetNumForName("epi23"), 1200,
|
||
"The HUNT stands before a pair\n"
|
||
"of ominous wooden doors.\n"
|
||
"The sounds of machinery and\n"
|
||
"servomotors fill the air.\n"
|
||
);
|
||
IN_UpdateKeyboard();
|
||
LastScan=0;
|
||
break;
|
||
|
||
case 24: // Start of EPISODE 4
|
||
MU_StartSong ( song_cinematic2 );
|
||
DoInBetweenCinematic (0, W_GetNumForName("epi34"), 1200,
|
||
"Stairs lead down beneath the\n"
|
||
"keep. From behind the doors\n"
|
||
"come the moans of the undead."
|
||
);
|
||
IN_UpdateKeyboard();
|
||
LastScan=0;
|
||
break;
|
||
#endif
|
||
}
|
||
}
|