2006-03-20 16:43:15 +00:00
/*
THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
SOFTWARE CORPORATION ( " PARALLAX " ) . PARALLAX , IN DISTRIBUTING THE CODE TO
END - USERS , AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN , GRANTS A
ROYALTY - FREE , PERPETUAL LICENSE TO SUCH END - USERS FOR USE BY SUCH END - USERS
IN USING , DISPLAYING , AND CREATING DERIVATIVE WORKS THEREOF , SO LONG AS
SUCH USE , DISPLAY OR CREATION IS FOR NON - COMMERCIAL , ROYALTY OR REVENUE
FREE PURPOSES . IN NO EVENT SHALL THE END - USER USE THE COMPUTER CODE
CONTAINED HEREIN FOR REVENUE - BEARING PURPOSES . THE END - USER UNDERSTANDS
AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE .
COPYRIGHT 1993 - 1998 PARALLAX SOFTWARE CORPORATION . ALL RIGHTS RESERVED .
*/
2007-07-14 20:33:42 +00:00
/*
2006-03-20 16:43:15 +00:00
*
* main ( ) for Inferno
*
*/
# ifdef __GNUC__
static char copyright [ ] = " DESCENT COPYRIGHT (C) 1994,1995 PARALLAX SOFTWARE CORPORATION " ;
static char * __reference [ 2 ] = { copyright , ( char * ) __reference } ;
# endif
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
# include <string.h>
2006-10-18 12:52:56 +00:00
# include <limits.h>
# include <SDL/SDL.h>
2006-03-20 16:43:15 +00:00
# ifndef _MSC_VER
# include <unistd.h>
# endif
2006-10-18 12:52:56 +00:00
2006-03-20 16:43:15 +00:00
# ifdef __MSDOS__
# include <time.h>
# endif
2006-10-18 12:52:56 +00:00
2006-03-20 16:43:15 +00:00
# ifdef __WINDOWS__
# include <windows.h>
# endif
2006-10-18 12:52:56 +00:00
2006-03-20 16:43:15 +00:00
# if defined(_MSC_VER) && defined(_DEBUG)
# include <crtdbg.h>
# endif
2006-10-18 12:52:56 +00:00
# ifdef __MSDOS__
# include <conio.h>
# else
# define getch() getchar()
# endif
# ifdef EDITOR
# include "editor/editor.h"
# include "editor/kdefs.h"
# endif
# ifdef QUICKSTART
# include "playsave.h"
# endif
# ifdef SCRIPT
# include "script.h"
# endif
# ifdef OGL
# include "ogl_init.h"
# endif
2006-03-20 16:43:15 +00:00
# include "gr.h"
# include "3d.h"
# include "inferno.h"
# include "error.h"
# include "game.h"
2006-10-18 12:52:56 +00:00
# include "segment.h" //for Side_to_verts
2006-03-20 16:43:15 +00:00
# include "u_mem.h"
# include "texmerge.h"
# include "menu.h"
# include "digi.h"
# include "args.h"
# include "titles.h"
# include "text.h"
# include "ipx.h"
# include "network.h"
# include "modem.h"
# include "gamefont.h"
# include "kconfig.h"
# include "newmenu.h"
# include "desc_id.h"
# include "config.h"
# include "joydefs.h"
# include "multi.h"
# include "songs.h"
# include "cfile.h"
# include "gameseq.h"
# include "timer.h"
# include "key.h"
# include "mono.h"
# include "palette.h"
# include "bm.h"
# include "screens.h"
# include "hudmsg.h"
# include "playsave.h"
# include "d_io.h"
# include "ban.h"
# include "gauges.h"
# include "physics.h"
# include "strutil.h"
# include "altsound.h"
# include "../texmap/scanline.h" //for select_tmap -MM
# include "vers_id.h"
2007-02-10 23:19:21 +00:00
# include "collide.h"
2007-04-04 17:17:53 +00:00
# include "newdemo.h"
2007-07-14 22:36:04 +00:00
# include "joy.h"
2006-03-20 16:43:15 +00:00
static const char desc_id_checksum_str [ ] = DESC_ID_CHKSUM ;
char desc_id_exit_num = 0 ;
2006-10-18 12:52:56 +00:00
int Function_mode = FMODE_MENU ; //game or editor?
int Screen_mode = - 1 ; //game screen or editor screen?
2006-03-20 16:43:15 +00:00
int descent_critical_error = 0 ;
unsigned int descent_critical_deverror = 0 ;
unsigned int descent_critical_errcode = 0 ;
2006-10-18 12:52:56 +00:00
u_int32_t menu_screen_mode = SM ( 640 , 480 ) ;
2006-08-30 18:11:16 +00:00
int menu_use_game_res = 1 ;
2006-03-20 16:43:15 +00:00
# ifdef EDITOR
int Inferno_is_800x600_available = 0 ;
# endif
2007-07-14 22:36:04 +00:00
extern void d_mouse_init ( void ) ;
2006-03-20 16:43:15 +00:00
2006-10-18 12:52:56 +00:00
void show_commandline_help ( )
{
printf ( " \n System Options: \n \n " ) ;
printf ( " -fps %s \n " , " Enable FPS indicator by default " ) ;
2007-07-16 02:34:51 +00:00
printf ( " -nicefps %s \n " , " Free CPU-cycles. Less CPU load, but game may become choppy " ) ;
2007-01-25 09:56:05 +00:00
printf ( " -maxfps <n> %s \n " , " Set maximum framerate (1-80) " ) ;
2007-07-15 21:22:07 +00:00
printf ( " -missiondir <s> %s \n " , " Set alternate mission dir to <d> instead of missions/ " ) ;
2006-10-18 12:52:56 +00:00
printf ( " -lowmem %s \n " , " Lowers animation detail for better performance with low memory " ) ;
2007-06-14 20:51:52 +00:00
printf ( " -legacyhomers %s \n " , " Activate original homing missiles (FPS and physics dependent) " ) ;
2007-07-15 21:22:07 +00:00
printf ( " -pilot <s> %s \n " , " Select this pilot-file automatically " ) ;
2007-07-14 20:33:42 +00:00
printf ( " -autodemo %s \n " , " Start in demo mode " ) ;
2007-07-15 21:22:07 +00:00
printf ( " -window %s \n " , " Run the game in a window " ) ;
2006-10-18 12:52:56 +00:00
printf ( " \n Controls: \n \n " ) ;
2007-07-14 22:36:04 +00:00
printf ( " -nomouse %s \n " , " Deactivate mouse " ) ;
printf ( " -nojoystick %s \n " , " Deactivate joystick " ) ;
2006-10-18 12:52:56 +00:00
printf ( " -mouselook %s \n " , " Activate mouselook. Works in singleplayer only " ) ;
printf ( " -grabmouse %s \n " , " Keeps the mouse from wandering out of the window " ) ;
printf ( " \n Sound: \n \n " ) ;
2007-07-14 22:36:04 +00:00
printf ( " -nosound %s \n " , " Disables sound output " ) ;
printf ( " -nomusic %s \n " , " Disables music output " ) ;
2006-10-18 12:52:56 +00:00
printf ( " \n Graphics: \n \n " ) ;
printf ( " -menu<X>x<Y> %s \n " , " Set menu-resolution to <X> by <Y> instead of game-resolution " ) ;
printf ( " -aspect<Y>x<X> %s \n " , " use specified aspect " ) ;
2007-07-15 21:22:07 +00:00
printf ( " -hud <n> %s \n " , " Set hud mode. 0=normal 1-3=new " ) ;
printf ( " -hudlines <n> %s \n " , " Number of hud messages to show " ) ;
2006-10-18 12:52:56 +00:00
printf ( " -hiresfont %s \n " , " use high resolution fonts if available " ) ;
2007-07-15 21:55:00 +00:00
printf ( " -persistentdebris %s \n " , " Enable persistent debris. Works in singleplayer only " ) ;
2006-10-18 12:52:56 +00:00
# ifdef OGL
printf ( " \n OpenGL: \n \n " ) ;
printf ( " -gl_mipmap %s \n " , " Set gl texture filters to \" standard \" options for mipmapping " ) ;
printf ( " -gl_trilinear %s \n " , " Set gl texture filters to trilinear mipmapping " ) ;
2007-01-29 23:31:20 +00:00
printf ( " -gl_transparency %s \n " , " Enable transparency effects " ) ;
2007-07-15 21:22:07 +00:00
printf ( " -gl_reticle <n> %s \n " , " Use OGL reticle 0=never 1=above 320x* 2=always " ) ;
printf ( " -gl_scissor_ok <n> %s \n " , " Set glScissor. 0=off 1=on (default) " ) ;
2007-02-09 15:34:10 +00:00
printf ( " -gl_voodoo %s \n " , " Force fullscreen mode only " ) ;
2006-10-18 12:52:56 +00:00
printf ( " -fixedfont %s \n " , " Do not scale fonts to current resolution " ) ;
# endif // OGL
# ifdef NETWORK
printf ( " \n Multiplayer: \n \n " ) ;
2007-07-15 21:22:07 +00:00
printf ( " -mprofile <s> %s \n " , " Use multi game profile <f> " ) ;
2006-10-18 12:52:56 +00:00
printf ( " -nobans %s \n " , " Don't use saved bans " ) ;
printf ( " -savebans %s \n " , " Automatically save new bans " ) ;
printf ( " -noredundancy %s \n " , " Do not send messages when picking up redundant items in multiplayer " ) ;
2007-01-26 11:15:18 +00:00
printf ( " -playermessages %s \n " , " View only messages from other players in multi - overrides -noredundancy " ) ;
2007-07-15 21:22:07 +00:00
printf ( " -msgcolorlevel <n> %s \n " , " Level of colorization for hud messages \n \t \t \t 0=none(old style) \n \t \t \t 1=color names in talk messages only(default) \n \t \t \t 2=also color names in kill/join/etc messages \n \t \t \t 3=talk messages are fully colored, not just names " ) ;
2007-07-16 02:34:51 +00:00
printf ( " -ipxnetwork <n> %s \n " , " Use IPX network number <n> " ) ;
2007-01-21 11:09:41 +00:00
printf ( " -ip_nogetmyaddr %s \n " , " Prevent autodetection of local ip address " ) ;
2007-07-15 21:22:07 +00:00
printf ( " -ip_myaddr <n> %s \n " , " Use <n> as local ip address " ) ;
printf ( " -ip_baseport <n> %s \n " , " Use <n> as offset from normal port (allows multiple instances of d1x to be run on a single computer) " ) ;
2006-10-18 12:52:56 +00:00
# endif // NETWORK
# ifndef NDEBUG
printf ( " \n Debug: \n \n " ) ;
2007-07-18 20:13:17 +00:00
printf ( " -verbose %s \n " , " Shows initialization steps for tech support " ) ;
2006-10-18 12:52:56 +00:00
printf ( " -norun %s \n " , " Bail out after initialization " ) ;
2007-07-18 20:13:17 +00:00
printf ( " -renderstats %s \n " , " Enable renderstats info by default " ) ;
printf ( " -text <s> %s \n " , " Specify alternate .tex file " ) ;
2007-07-15 21:22:07 +00:00
printf ( " -tmap <s> %s \n " , " Select texmapper to use (c,fp,quad,i386,pent,ppro) " ) ;
2007-07-18 20:13:17 +00:00
# ifdef OGL
printf ( " -gl_oldtexmerge %s \n " , " Use old texmerge, uses more ram, but _might_ be a bit faster " ) ;
2006-10-18 12:52:56 +00:00
# endif // OGL
# endif // NDEBUG
printf ( " \n Help: \n \n " ) ;
printf ( " -help, -h, -?, ? %s \n " , " View this help screen " ) ;
printf ( " \n \n " ) ;
2006-03-20 16:43:15 +00:00
}
2007-07-14 22:36:04 +00:00
void sdl_close ( )
{
SDL_Quit ( ) ;
}
2006-03-20 16:43:15 +00:00
extern fix fixed_frametime ;
extern void vfx_set_palette_sub ( ubyte * ) ;
int main ( int argc , char * * argv )
{
2007-07-14 20:33:42 +00:00
int t ;
2006-03-20 16:43:15 +00:00
u_int32_t screen_mode = SM ( 640 , 480 ) ;
error_init ( NULL ) ;
2006-10-18 12:52:56 +00:00
setbuf ( stdout , NULL ) ; // unbuffered output via printf
2006-10-15 23:35:30 +00:00
ReadConfigFile ( ) ;
2006-03-20 16:43:15 +00:00
InitArgs ( argc , argv ) ;
2007-01-19 14:27:21 +00:00
if ( ! cfexist ( DESCENT_DATA_PATH " descent.hog " ) | | ! cfexist ( DESCENT_DATA_PATH " descent.pig " ) )
Error ( " Could not find valid descent.hog and/or descent.pig in \n "
# ifdef __unix__
" \t " DESCENT_DATA_PATH " \n "
# else
" \t current directory \n "
# endif
) ;
2006-03-20 16:43:15 +00:00
load_text ( ) ;
printf ( DESCENT_VERSION " \n "
" This is a MODIFIED version of DESCENT which is NOT supported by Parallax or \n "
2007-01-19 14:27:21 +00:00
" Interplay. Use at your own risk! Copyright (c) 2005 Christian Beckhaeuser \n " ) ;
2006-03-20 16:43:15 +00:00
printf ( " Based on: DESCENT %s \n " , VERSION_NAME ) ;
printf ( " %s \n %s \n " , TXT_COPYRIGHT , TXT_TRADEMARK ) ;
2007-07-18 20:13:17 +00:00
if ( GameArg . SysShowCmdHelp ) {
2006-10-18 12:52:56 +00:00
show_commandline_help ( ) ;
2006-03-20 16:43:15 +00:00
set_exit_message ( " " ) ;
return 0 ;
}
2006-10-18 12:52:56 +00:00
printf ( " \n Type 'd1x-rebirth-gl/sdl -help' for a list of command-line options. \n " ) ;
2006-03-20 16:43:15 +00:00
2007-07-14 20:33:42 +00:00
cfile_use_alternate_hogdir ( GameArg . SysMissionDir ) ;
2006-03-20 16:43:15 +00:00
2007-07-18 20:13:17 +00:00
select_tmap ( GameArg . DbgTexMap ) ;
2006-03-20 16:43:15 +00:00
2007-01-26 11:15:18 +00:00
# ifdef NETWORK
2006-03-20 16:43:15 +00:00
readbans ( ) ;
# endif
2007-07-18 20:13:17 +00:00
if ( GameArg . DbgVerbose )
2006-10-18 12:52:56 +00:00
printf ( " %s " , TXT_VERBOSE_1 ) ;
2006-03-20 16:43:15 +00:00
2007-07-14 22:36:04 +00:00
if ( SDL_Init ( SDL_INIT_VIDEO ) < 0 )
Error ( " SDL library initialisation failed: %s. " , SDL_GetError ( ) ) ;
2006-12-12 21:47:17 +00:00
2007-07-14 22:36:04 +00:00
key_init ( ) ;
2006-03-20 16:43:15 +00:00
2007-07-14 22:36:04 +00:00
if ( ! GameArg . SndNoSound )
digi_init ( ) ;
if ( ! GameArg . CtlNoMouse )
d_mouse_init ( ) ;
if ( ! GameArg . CtlNoJoystick )
joy_init ( ) ;
atexit ( sdl_close ) ;
2006-10-18 17:08:59 +00:00
2007-01-25 13:01:39 +00:00
Game_screen_mode = screen_mode ;
2006-10-18 12:52:56 +00:00
2006-03-20 16:43:15 +00:00
{
2006-10-18 12:52:56 +00:00
int i , argnum = INT_MAX , w , h ;
2006-08-30 18:11:16 +00:00
# define SMODE(V,VV,VG) if ((i=FindResArg(#V, &w, &h)) && (i < argnum)) { argnum = i; VV = SM(w, h); VG = 0; }
2007-07-18 20:13:17 +00:00
# define SMODE_PRINT(V,VV,VG) if (GameArg.DbgVerbose) { if (VG) printf( #V " using game resolution ...\n"); else printf( #V " using %ix%i ...\n",SM_W(VV),SM_H(VV) ); }
2007-07-15 15:23:45 +00:00
# define S_MODE(V,VV,VG) argnum = INT_MAX; SMODE(V, VV, VG); SMODE_PRINT(V, VV, VG);
2006-03-20 16:43:15 +00:00
2006-10-18 12:52:56 +00:00
S_MODE ( menu , menu_screen_mode , menu_use_game_res ) ;
2006-03-20 16:43:15 +00:00
}
# ifdef NETWORK
control_invul_time = 0 ;
# endif
2007-07-18 20:13:17 +00:00
if ( GameArg . DbgVerbose )
2006-03-20 16:43:15 +00:00
printf ( " \n %s \n \n " , TXT_INITIALIZING_GRAPHICS ) ;
if ( ( t = gr_init ( SM_ORIGINAL ) ) ! = 0 )
Error ( TXT_CANT_INIT_GFX , t ) ;
// Load the palette stuff. Returns non-zero if error.
mprintf ( ( 0 , " Going into graphics mode... " ) ) ;
gr_set_mode ( MENU_SCREEN_MODE ) ;
# ifdef OGL
/* hack to fix initial screens with ogl */
{
int old_screen_mode = Screen_mode ;
Screen_mode = MENU_SCREEN_MODE ;
Screen_mode = old_screen_mode ;
}
# endif
mprintf ( ( 0 , " \n Initializing palette system... " ) ) ;
gr_use_palette_table ( " PALETTE.256 " ) ;
mprintf ( ( 0 , " \n Initializing font system... " ) ) ;
2006-08-13 15:52:49 +00:00
gamefont_init ( ) ; // must load after palette data loaded.
2006-03-20 16:43:15 +00:00
songs_play_song ( SONG_TITLE , 1 ) ;
2007-07-14 20:33:42 +00:00
show_title_screen ( " iplogo1.pcx " , 1 ) ;
show_title_screen ( " logo.pcx " , 1 ) ;
2006-03-20 16:43:15 +00:00
show_title_screen ( " descent.pcx " , 2 ) ;
# ifdef SHAREWARE
bm_init_use_tbl ( ) ;
# else
# ifdef EDITOR
if ( ! FindArg ( " -nobm " ) )
bm_init_use_tbl ( ) ;
else
bm_init ( ) ;
# else
bm_init ( ) ;
# endif
# endif
2007-07-18 20:13:17 +00:00
if ( GameArg . DbgNoRun )
2006-03-20 16:43:15 +00:00
return ( 0 ) ;
mprintf ( ( 0 , " \n Initializing 3d system... " ) ) ;
g3_init ( ) ;
mprintf ( ( 0 , " \n Initializing texture caching system... " ) ) ;
2007-07-14 20:33:42 +00:00
texmerge_init ( 10 ) ; // 10 cache bitmaps
2006-03-20 16:43:15 +00:00
mprintf ( ( 0 , " \n Running game... \n " ) ) ;
# ifdef SCRIPT
script_init ( ) ;
# endif
set_screen_mode ( SCREEN_MENU ) ;
init_game ( ) ;
set_detail_level_parameters ( Detail_level ) ;
Players [ Player_num ] . callsign [ 0 ] = ' \0 ' ;
2007-04-04 10:24:03 +00:00
key_flush ( ) ;
2007-07-14 20:33:42 +00:00
if ( GameArg . SysPilot )
2007-04-04 10:24:03 +00:00
{
char filename [ 15 ] ;
int j ;
2007-07-14 20:33:42 +00:00
snprintf ( filename , 12 , GameArg . SysPilot ) ;
2007-04-04 10:24:03 +00:00
for ( j = 0 ; filename [ j ] ! = ' \0 ' ; j + + ) {
switch ( filename [ j ] ) {
case ' ' :
filename [ j ] = ' \0 ' ;
2006-10-10 09:53:25 +00:00
}
2006-10-18 12:52:56 +00:00
}
2007-04-04 10:24:03 +00:00
strlwr ( filename ) ;
2007-05-10 09:34:27 +00:00
if ( ! strstr ( filename , " .plr " ) ) // if player hasn't specified .plr extension in argument, add it
strcat ( filename , " .plr " ) ;
2007-04-04 10:24:03 +00:00
if ( ! access ( filename , 4 ) )
{
strcpy ( strstr ( filename , " .plr " ) , " \0 " ) ;
strcpy ( Players [ Player_num ] . callsign , filename ) ;
read_player_file ( ) ;
Auto_leveling_on = Default_leveling_on ;
WriteConfigFile ( ) ;
}
else //pilot doesn't exist. get pilot.
2006-10-18 12:52:56 +00:00
if ( ! RegisterPlayer ( ) )
Function_mode = FMODE_EXIT ;
2006-03-20 16:43:15 +00:00
}
2007-04-04 10:24:03 +00:00
else
if ( ! RegisterPlayer ( ) )
Function_mode = FMODE_EXIT ;
2006-03-20 16:43:15 +00:00
gr_palette_fade_out ( NULL , 32 , 0 ) ;
Game_mode = GM_GAME_OVER ;
# ifndef SHAREWARE
2006-10-18 12:52:56 +00:00
t = build_mission_list ( 0 ) ; // This also loads mission 0.
2006-03-20 16:43:15 +00:00
# endif
while ( Function_mode ! = FMODE_EXIT )
{
switch ( Function_mode ) {
case FMODE_MENU :
2007-04-04 10:24:03 +00:00
DoMenu ( ) ;
2006-03-20 16:43:15 +00:00
# ifdef EDITOR
2007-04-04 10:24:03 +00:00
if ( Function_mode = = FMODE_EDITOR ) {
create_new_mine ( ) ;
SetPlayerFromCurseg ( ) ;
2006-03-20 16:43:15 +00:00
}
2007-04-04 10:24:03 +00:00
# endif
break ;
2006-03-20 16:43:15 +00:00
case FMODE_GAME :
# ifdef EDITOR
keyd_editor_mode = 0 ;
# endif
2006-07-28 15:22:07 +00:00
2006-03-20 16:43:15 +00:00
game ( ) ;
2006-07-28 15:22:07 +00:00
2006-03-20 16:43:15 +00:00
if ( Function_mode = = FMODE_MENU )
songs_play_song ( SONG_TITLE , 1 ) ;
break ;
# ifdef EDITOR
case FMODE_EDITOR :
keyd_editor_mode = 1 ;
editor ( ) ;
# ifdef __WATCOMC__
_harderr ( ( void * ) descent_critical_error_handler ) ; // Reinstall game error handler
# endif
if ( Function_mode = = FMODE_GAME ) {
Game_mode = GM_EDITOR ;
editor_reset_stuff_on_level ( ) ;
N_players = 1 ;
}
break ;
# endif
default :
Error ( " Invalid function mode %d " , Function_mode ) ;
}
}
WriteConfigFile ( ) ;
# ifndef ROCKWELL_CODE
# ifdef SHAREWARE
show_order_form ( ) ;
# endif
# endif
2006-10-18 12:52:56 +00:00
return ( 0 ) ; //presumably successful exit
2006-03-20 16:43:15 +00:00
}
void quit_request ( )
{
# ifdef NETWORK
void network_abort_game ( ) ;
if ( Network_status )
network_abort_game ( ) ;
# endif
exit ( 0 ) ;
}