/* 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. */ /* $Source: f:/miner/source/main/rcs/inferno.c $ * $Revision: 2.36 $ * $Author: john $ * $Date: 1996/01/05 16:52:16 $ * * main() for Inferno * * $Log: inferno.c $ * Revision 2.36 1996/01/05 16:52:16 john * Improved 3d stuff. * * Revision 2.35 1995/10/07 13:20:06 john * Added new modes for LCDBIOS, also added support for -JoyNice, * and added Shift+F1-F4 to controls various stereoscopic params. * * Revision 2.34 1995/06/26 11:30:57 john * Made registration/copyright screen go away after 5 minutes. * * Revision 2.33 1995/05/31 14:26:55 unknown * Fixed ugly spacing. * * Revision 2.32 1995/05/26 16:15:28 john * Split SATURN into define's for requiring cd, using cd, etc. * Also started adding all the Rockwell stuff. * * Revision 2.31 1995/05/11 13:30:01 john * Changed 3dbios detection to work like Didde Kim wanted it to. * * Revision 2.30 1995/05/08 13:53:50 john * Added code to read vipport environemnt variable. * * Revision 2.29 1995/05/08 11:26:18 john * Reversed eyes in 3dmax mode. * * Revision 2.28 1995/05/08 11:24:06 john * Made 3dmax work like Kasan wants it to. * * Revision 2.27 1995/04/23 16:06:25 john * Moved rinvul into modem/null modem menu. * * Revision 2.26 1995/04/12 13:39:26 john * Fixed bug with -lowmem not working. * * Revision 2.25 1995/04/09 14:43:00 john * Made Dynamic sockets not print Msockets for help. * * Revision 2.24 1995/04/07 16:11:33 john * Fixed problem with VFX display when using setup. * * Revision 2.23 1995/04/06 15:40:51 john * Synced VFX with setup #'s. * * Revision 2.22 1995/04/06 12:12:53 john * Fixed some bugs with 3dmax. * * Revision 2.21 1995/03/30 16:36:51 mike * text localization. * * Revision 2.20 1995/03/29 15:33:52 john * Added code to parse descent.net file. * * Revision 2.19 1995/03/28 20:08:21 john * Took away alternate server thing. * * Revision 2.18 1995/03/27 09:43:08 john * Added VR Settings in config file. * * Revision 2.17 1995/03/23 19:02:21 john * Added descent.net file use. * * Revision 2.16 1995/03/23 12:25:11 john * Moved IPX stuff into BIOS lib. * * Revision 2.15 1995/03/21 16:52:34 john * Added 320x100. * * Revision 2.14 1995/03/21 14:40:33 john * Ifdef'd out the NETWORK code. * * Revision 2.13 1995/03/16 23:13:35 john * Fixed bug with piggy paging in bitmap not checking for disk * error, hence bogifying textures if you pull the CD out. * * Revision 2.12 1995/03/16 21:45:22 john * Made all paged modes have incompatible menus! * * Revision 2.11 1995/03/15 15:19:34 john * Took out code that changes to exe dir. * * Revision 2.10 1995/03/15 14:33:37 john * Added code to force the Descent CD-rom in the drive. * * Revision 2.9 1995/03/15 11:41:27 john * Better Saturn CD-ROM support. * * Revision 2.8 1995/03/14 18:24:46 john * Force Destination Saturn to use CD-ROM drive. * * Revision 2.7 1995/03/14 16:22:35 john * Added cdrom alternate directory stuff. * * Revision 2.6 1995/03/13 15:17:19 john * Added alternate hogfile directory. * * Revision 2.5 1995/03/10 13:05:35 john * Added code so that palette is correct for VFX1 helmets. * * Revision 2.4 1995/03/07 15:12:43 john * Fixed VFX,3dmax support. * * Revision 2.3 1995/03/07 14:19:35 mike * More destination saturn stuff. * * Revision 2.2 1995/03/06 16:47:34 mike * destination saturn * * Revision 2.1 1995/03/06 15:24:06 john * New screen techniques. * * Revision 2.0 1995/02/27 11:31:29 john * New version 2.0, which has no anonymous unions, builds with * Watcom 10.0, and doesn't require parsing BITMAPS.TBL. * * Revision 1.295 1995/02/23 12:02:14 john * Made mono windows smaller. * * Revision 1.294 1995/02/16 17:35:00 john * Added code to allow dynamic socket changing. * * Revision 1.293 1995/02/14 19:29:29 john * Locked down critical error handler. * * Revision 1.292 1995/02/14 15:29:20 john * Added CR-LF to last line of menu help text. * * Revision 1.291 1995/02/14 11:39:01 john * Added polled/bios joystick readers. * * Revision 1.290 1995/02/13 20:35:03 john * Lintized * * Revision 1.289 1995/02/11 16:20:02 john * Added code to make the default mission be the one last played. * * Revision 1.288 1995/02/11 15:54:13 rob * changed cinvul to rinvul. * * Revision 1.287 1995/02/11 14:48:43 rob * Added max of 314 seconds to control invul. times * * Revision 1.286 1995/02/11 12:42:01 john * Added new song method, with FM bank switching.. * * Revision 1.285 1995/02/11 11:36:11 rob * Added cinvul option. * * Revision 1.284 1995/02/10 16:07:45 matt * Took 'registered' out of printed info at startup * * Revision 1.283 1995/02/09 22:00:59 john * Added i-glasses tracking. * * Revision 1.282 1995/02/02 11:11:27 john * Added -nocyberman switch. * * Revision 1.281 1995/02/01 16:35:14 john * Linted. * * Revision 1.280 1995/01/31 02:04:25 matt * Fixed up cmdline help * * Revision 1.279 1995/01/30 16:25:55 john * Put back in graphical screen at program end. * * Revision 1.278 1995/01/28 17:05:50 matt * Changed imbedded copyright to use comma instead of hyphen * * Revision 1.277 1995/01/28 15:57:26 john * Made joystick calibration be only when wrong detected in * menu or joystick axis changed. * * Revision 1.276 1995/01/25 14:37:49 john * Made joystick only prompt for calibration once... * * Revision 1.275 1995/01/24 18:21:00 john * Added Adam's text warning. * * Revision 1.274 1995/01/22 15:57:20 john * Took out code that printed warning out as game exited. * * Revision 1.273 1995/01/22 13:31:35 matt * Added load of mission 0, so there's always a default mission * * Revision 1.272 1995/01/19 17:00:41 john * Made save game work between levels. * * Revision 1.271 1995/01/18 11:47:57 adam * changed copyright notice * * Revision 1.270 1995/01/15 13:42:42 john * Moved low_mem cutoff higher. * * Revision 1.269 1995/01/12 18:53:50 john * Put ifdef EDITOR around the code that checked for * a 800x600 mode, because this trashed some people's * computers (maybe) causing the mem allocation error in * mouse.c that many users reported. * * Revision 1.268 1995/01/12 11:41:42 john * Added external control reading. * * Revision 1.267 1995/01/06 10:26:55 john * Added -nodoscheck command line switch. * * Revision 1.266 1995/01/05 16:59:30 yuan * Don't show orderform in editor version. * * Revision 1.265 1994/12/28 15:33:51 john * Added -slowjoy option. * * Revision 1.264 1994/12/15 16:44:15 matt * Added trademark notice * * Revision 1.263 1994/12/14 20:13:59 john * Reduced physical mem requments to 2 MB. * * Revision 1.262 1994/12/14 19:06:17 john * Lowered physical memory requments to 2 MB. * * Revision 1.261 1994/12/14 09:41:29 allender * change to drive and directory (if needed) of command line invocation * so descent can be started from anywhere * * Revision 1.260 1994/12/13 19:08:59 john * Updated memory requirements. * * Revision 1.259 1994/12/13 17:30:33 john * Made the timer rate be changed right after initializing it. * * Revision 1.258 1994/12/13 02:46:25 matt * Added imbedded copyright * * Revision 1.257 1994/12/13 02:06:46 john * Added code to check stack used by descent... initial * check showed stack used 35k/50k, so we decided it wasn't * worth pursuing any more. * * Revision 1.256 1994/12/11 23:17:54 john * Added -nomusic. * Added RealFrameTime. * Put in a pause when sound initialization error. * Made controlcen countdown and framerate use RealFrameTime. * * Revision 1.255 1994/12/10 00:56:51 matt * Added -nomusic to command-line help * * Revision 1.254 1994/12/08 11:55:11 john * Took out low memory print. * * Revision 1.253 1994/12/08 11:51:00 john * Made strcpy only copy corect number of chars,. * * Revision 1.252 1994/12/08 00:38:29 matt * Cleaned up banner messages * * Revision 1.251 1994/12/07 19:14:52 matt * Cleaned up command-line options and command-line help message * * Revision 1.250 1994/12/06 19:33:28 john * Fixed text of message to make more sense. * * Revision 1.249 1994/12/06 16:30:55 john * Neatend mem message,.. * * Revision 1.248 1994/12/06 16:17:35 john * Added better mem checking/printing. * * Revision 1.247 1994/12/06 14:14:37 john * Added code to set low mem based on memory. * * Revision 1.246 1994/12/05 12:29:09 allender * removed ifdefs around -norun option * * Revision 1.245 1994/12/05 00:03:30 matt * Added -norun option to exit after writing pig * * Revision 1.244 1994/12/04 14:47:01 john * MAde the intro and menu be the same song. * * Revision 1.243 1994/12/04 14:36:42 john * Added menu music. * * Revision 1.242 1994/12/02 13:50:17 yuan * Localization. * * Revision 1.241 1994/12/01 17:28:30 adam * added end-shareware stuff * * Revision 1.240 1994/11/30 12:10:57 adam * added support for PCX titles/brief screens * * Revision 1.239 1994/11/29 15:47:33 matt * Moved error_init to start of game, so error message prints last * * Revision 1.238 1994/11/29 14:19:22 jasen * reduced dos mem requirments. * * Revision 1.237 1994/11/29 03:46:35 john * Added joystick sensitivity; Added sound channels to detail menu. Removed -maxchannels * command line arg. * * Revision 1.236 1994/11/29 02:50:18 john * Increased the amount a joystick has to be off before * asking if they want to recalibrate their joystick. * * Revision 1.235 1994/11/29 02:01:29 john * Corrected some of the Descent command line help items. * * Revision 1.234 1994/11/29 01:39:56 john * Fixed minor bug with vfx_light help not wrapping correctly. * * Revision 1.233 1994/11/28 21:34:17 john * Reduced dos mem rqment to 70k. * * Revision 1.232 1994/11/28 21:20:38 john * First version with memory checking. * * Revision 1.231 1994/11/28 20:06:21 rob * Removed old serial param command line options. * Added -noserial and -nonetwork to help listing. * * Revision 1.230 1994/11/27 23:15:24 matt * Made changes for new mprintf calling convention * * Revision 1.229 1994/11/27 20:50:51 matt * Don't set mem stuff if no debug * * Revision 1.228 1994/11/27 18:46:21 matt * Cleaned up command-line switches a little * * Revision 1.227 1994/11/21 17:48:00 matt * Added text to specifiy whether shareware or registered version * * Revision 1.226 1994/11/21 14:44:20 john * Fixed some bugs with setting volumes even when -nosound was used. Duh! * * Revision 1.225 1994/11/21 13:53:42 matt * Took out dos extender copyright * * Revision 1.224 1994/11/21 09:46:54 john * Added -showmeminfo parameter. * * Revision 1.223 1994/11/20 22:12:05 mike * Make some stuff dependent on SHAREWARE. * * Revision 1.222 1994/11/20 21:14:09 john * Changed -serial to -noserial. MAde a 1 sec delay * before leaving title screen. Clear keyboard buffer * before asking for player name. * * Revision 1.221 1994/11/19 15:20:20 mike * rip out unused code and data * * Revision 1.220 1994/11/17 19:14:29 adam * prevented order screen from coming up when -notitles is used * * Revision 1.219 1994/11/16 11:34:39 john * Added -nottitle switch. * * Revision 1.218 1994/11/16 10:05:53 john * Added verbose messages. * * Revision 1.217 1994/11/15 20:12:34 john * Added back in inferno and parallax screens. * * Revision 1.216 1994/11/15 18:35:30 john * Added verbose setting. * * Revision 1.215 1994/11/15 17:47:44 john * Added ordering info screen. * * Revision 1.214 1994/11/15 08:57:44 john * Added MS-DOS version checking and -nonetwork option. * * Revision 1.213 1994/11/15 08:34:32 john * Added better error messages for IPX init. * * Revision 1.212 1994/11/14 20:14:18 john * Fixed some warnings. * * Revision 1.211 1994/11/14 19:50:49 john * Added joystick cal values to descent.cfg. * * Revision 1.210 1994/11/14 17:56:44 allender * make call to ReadConfigFile at startup * * Revision 1.209 1994/11/14 11:41:55 john * Fixed bug with editor/game sequencing. * * Revision 1.208 1994/11/13 17:05:11 john * Made the callsign entry be a list box and gave the ability * to delete players. * * Revision 1.207 1994/11/13 15:39:22 john * Added critical error handler to game. Took out -editor command line * option because it didn't work anymore and wasn't worth fixing. Made scores * not use MINER enviroment variable on release version, and made scores * not print an error if there is no descent.hi. * * Revision 1.206 1994/11/10 20:53:29 john * Used new sound install parameters. * * Revision 1.205 1994/11/10 11:07:52 mike * Set default detail level. * * Revision 1.204 1994/11/09 13:45:43 matt * Made -? work again for help * * Revision 1.203 1994/11/09 10:55:58 matt * Cleaned up initialization for editor -> game transitions * * Revision 1.202 1994/11/07 21:35:47 matt * Use new function iff_read_into_bitmap() * * Revision 1.201 1994/11/05 17:22:16 john * Fixed lots of sequencing problems with newdemo stuff. * * Revision 1.200 1994/11/05 14:05:44 john * Fixed fade transitions between all screens by making gr_palette_fade_in and out keep * track of whether the palette is faded in or not. Then, wherever the code needs to fade out, * it just calls gr_palette_fade_out and it will fade out if it isn't already. The same with fade_in. * This eliminates the need for all the flags like Menu_fade_out, game_fade_in palette, etc. * * Revision 1.199 1994/11/04 14:36:30 allender * change Auto_demo meaning to mean autostart from menu only. Use * FindArgs when searching for AutoDemo from command line. also, * set N_Players to 1 when starting in editor mode. * * Revision 1.198 1994/11/02 11:59:49 john * Moved menu out of game into inferno main loop. * * Revision 1.197 1994/11/01 17:57:39 mike * -noscreens option to bypass all screens. * * Revision 1.196 1994/10/28 15:42:34 allender * don't register player if Autodemo is on * * Revision 1.195 1994/10/28 10:58:01 matt * Added copyright notice for DOS4GW * * Revision 1.194 1994/10/20 21:26:48 matt * Took out old serial name/number code, and put up message if this * is a marked version. * * Revision 1.193 1994/10/19 09:52:14 allender * Print out who descent.exe belongs to if descent.exe is stamped. * * Revision 1.192 1994/10/18 16:43:05 allender * Added check for identifier stamp and time after which descent will * no longer run. * * Revision 1.191 1994/10/17 13:07:17 john * Moved the descent.cfg info into the player config file. * * Revision 1.190 1994/10/04 10:26:31 matt * Support new menu fade in * * Revision 1.189 1994/10/03 22:58:46 matt * Changed some values of game_mode * * Revision 1.188 1994/10/03 18:55:39 rob * Changed defaults for com port settings. * * Revision 1.187 1994/10/03 13:34:47 matt * Added new (and hopefully better) game sequencing functions * * Revision 1.186 1994/09/30 12:37:28 john * Added midi,digi volume to configuration. * * Revision 1.185 1994/09/30 10:08:48 john * Changed sound stuff... made it so the reseting card doesn't hang, * made volume change only if sound is installed. * * Revision 1.184 1994/09/28 17:25:00 matt * Added first draft of game save/load system * * Revision 1.183 1994/09/28 16:18:23 john * Added capability to play midi song. * * Revision 1.182 1994/09/28 11:31:18 john * Made text output unbuffered. * * Revision 1.181 1994/09/27 19:23:44 john * Added -nojoystick and -nomouse * * Revision 1.180 1994/09/24 16:55:29 rob * No longer open COM port immediately upon program start. * No longer set Network_active is serial_active is set. * * Revision 1.179 1994/09/24 14:16:30 mike * Support new game mode constants. * * Revision 1.178 1994/09/22 17:52:31 rob * Added Findargs hooks for -serial, -speed, and -com. * * Revision 1.177 1994/09/22 16:14:11 john * Redid intro sequecing. * * Revision 1.176 1994/09/21 16:32:58 john * Made mouse and keyboard init after bm_init. Why? * Because it seems to work better under virtual * memory. * * Revision 1.175 1994/09/21 16:27:52 john * Added mouse_init * * Revision 1.174 1994/09/20 15:14:10 matt * New message for new VFX switches * * Revision 1.173 1994/09/16 16:14:27 john * Added acrade sequencing. * * Revision 1.172 1994/09/16 11:49:52 john * Added first version of arcade joystick support; * Also fixed some bugs in kconfig.c, such as reading non-present * joysticks, which killed frame rate, and not reading key_down_time * when in slide mode or bank mode. * * Revision 1.171 1994/09/15 16:11:35 john * Added support for VFX1 head tracking. Fixed bug with memory over- * write when using stereo mode. * * Revision 1.170 1994/09/12 19:38:23 john * Made some stuff that prints to the DOS screen go to the * mono instead, since it really is debugging info. * * Revision 1.169 1994/08/29 21:18:28 john * First version of new keyboard/oystick remapping stuff. * * Revision 1.168 1994/08/26 13:02:00 john * Put high score system in. * * Revision 1.167 1994/08/24 19:00:23 john * Changed key_down_time to return fixed seconds instead of * milliseconds. * * Revision 1.166 1994/08/18 16:24:20 john * changed socket to channel in text. * * Revision 1.165 1994/08/18 16:16:51 john * Added support for different sockets. * * Revision 1.164 1994/08/18 10:47:53 john * *** empty log message *** * * Revision 1.163 1994/08/12 09:15:54 john * *** empty log message *** * * Revision 1.162 1994/08/12 03:11:19 john * Made network be default off; Moved network options into * main menu. Made starting net game check that mines are the * same. * * Revision 1.161 1994/08/10 19:57:05 john * Changed font stuff; Took out old menu; messed up lots of * other stuff like game sequencing messages, etc. * * Revision 1.160 1994/08/05 16:30:23 john * Added capability to turn off network. * * Revision 1.159 1994/08/04 19:42:51 matt * Moved serial number & name (and version name) from inferno.c to inferno.ini * * Revision 1.158 1994/08/03 10:30:23 matt * Change cybermaxx switches, updated command-line help, and added serial number system * * Revision 1.157 1994/07/29 18:30:10 matt * New parms (lack of parms, actually) for g3_init() * * Revision 1.156 1994/07/24 00:39:25 matt * Added more text to TEX file; make NewGame() take a start level; made game * load/save menus use open/close window funcs. * * Revision 1.155 1994/07/21 21:31:27 john * First cheapo version of VictorMaxx tracking. * * Revision 1.154 1994/07/21 18:15:34 matt * Ripped out a bunch of unused stuff * * Revision 1.153 1994/07/21 17:59:10 matt * Cleaned up initial mode game/editor code * * Revision 1.152 1994/07/21 13:11:19 matt * Ripped out remants of old demo system, and added demo only system that * disables object movement and game options from menu. * * Revision 1.151 1994/07/20 15:58:27 john * First installment of ipx stuff. * * Revision 1.150 1994/07/15 16:04:24 matt * Changed comment for milestone 3 version * * Revision 1.149 1994/07/15 13:59:24 matt * Fixed stupid mistake I make in the last revision * * Revision 1.148 1994/07/15 13:20:15 matt * Updated comand-line help * * Revision 1.147 1994/07/14 23:29:43 matt * Open two mono debug messages, one for errors & one for spew * * Revision 1.146 1994/07/09 22:48:05 matt * Added localizable text * * Revision 1.145 1994/07/02 13:49:47 matt * Cleaned up includes * * Revision 1.144 1994/06/30 20:04:43 john * Added -joydef support. * * Revision 1.143 1994/06/24 17:01:44 john * Add VFX support; Took Game Sequencing, like EndGame and stuff and * took it out of game.c and into gameseq.c * */ #pragma off (unreferenced) static char rcsid[] = "$Id: inferno.c 2.36 1996/01/05 16:52:16 john Exp $"; static char copyright[] = "DESCENT COPYRIGHT (C) 1994,1995 PARALLAX SOFTWARE CORPORATION"; #pragma on (unreferenced) #include #include #include #include #include #include #include #include #include #include #include "gr.h" #include "ui.h" #include "mono.h" #include "key.h" #include "timer.h" #include "3d.h" #include "bm.h" #include "inferno.h" #include "error.h" #include "cflib.h" #include "div0.h" #include "game.h" #include "segment.h" //for Side_to_verts #include "mem.h" #include "textures.h" #include "segpoint.h" #include "screens.h" #include "texmap.h" #include "texmerge.h" #include "menu.h" #include "wall.h" #include "switch.h" #include "polyobj.h" #include "effects.h" #include "digi.h" #include "iff.h" #include "pcx.h" #include "palette.h" #include "args.h" #include "sounds.h" #include "titles.h" #include "player.h" #include "text.h" #include "ipx.h" #include "newdemo.h" #include "victor.h" #include "network.h" #include "modem.h" #include "gamefont.h" #include "kconfig.h" #include "arcade.h" #include "coindev.h" #include "mouse.h" #include "joy.h" #include "dpmi.h" #include "newmenu.h" #include "desc_id.h" #include "config.h" #include "joydefs.h" #include "multi.h" #include "iglasses.h" #include "songs.h" #include "cfile.h" #include "cdrom.h" #include "gameseq.h" #ifdef EDITOR #include "editor\editor.h" #include "editor\kdefs.h" #endif #include "vers_id.h" extern int Game_simuleyes_flag; static const char desc_id_checksum_str[] = DESC_ID_CHKSUM; char desc_id_exit_num = 0; int Function_mode=FMODE_MENU; //game or editor? int Screen_mode=-1; //game screen or editor screen? //--unused-- grs_bitmap Inferno_bitmap_title; int WVIDEO_running=0; //debugger can set to 1 if running #ifdef EDITOR int Inferno_is_800x600_available = 0; #endif //--unused-- int Cyberman_installed=0; // SWIFT device present void install_int3_handler(void); int __far descent_critical_error_handler( unsigned deverr, unsigned errcode, unsigned far * devhdr ); #ifndef NDEBUG do_heap_check() { int heap_status; heap_status = _heapset( 0xFF ); switch( heap_status ) { case _HEAPBADBEGIN: mprintf((1, "ERROR - heap is damaged\n")); Int3(); break; case _HEAPBADNODE: mprintf((1, "ERROR - bad node in heap\n" )); Int3(); break; } } #endif int registered_copy=0; char name_copy[sizeof(DESC_ID_STR)]; void check_id_checksum_and_date() { const char name[] = DESC_ID_STR; char time_str[] = DESC_DEAD_TIME; int i, found; unsigned long *checksum, test_checksum; time_t current_time, saved_time; saved_time = (time_t)strtol(&(time_str[strlen(time_str) - 10]), NULL, 16); if (saved_time == (time_t)0) return; strcpy(name_copy,name); registered_copy = 1; current_time = time(NULL); if (current_time >= saved_time) desc_id_exit_num = 1; test_checksum = 0; for (i = 0; i < strlen(name); i++) { found = 0; test_checksum += name[i]; if (((test_checksum / 2) * 2) != test_checksum) found = 1; test_checksum = test_checksum >> 1; if (found) test_checksum |= 0x80000000; } checksum = (unsigned long *)&(desc_id_checksum_str[0]); if (test_checksum != *checksum) desc_id_exit_num = 2; printf ("%s %s\n", TXT_REGISTRATION, name); } int is_3dbios_installed() { dpmi_real_regs rregs; memset(&rregs,0,sizeof(dpmi_real_regs)); rregs.eax = 0x4ed0; //rregs.ebx = 0x3d10; dpmi_real_int386x( 0x10, &rregs ); if ( (rregs.edx & 0xFFFF) != 0x3344 ) return 0; else return 1; } int init_graphics() { int result; result=gr_check_mode(SM_320x200C); #ifdef EDITOR if ( result==0 ) result=gr_check_mode(SM_800x600V); #endif switch( result ) { case 0: //Mode set OK #ifdef EDITOR Inferno_is_800x600_available = 1; #endif break; case 1: //No VGA adapter installed printf("%s\n", TXT_REQUIRES_VGA ); return 1; case 10: //Error allocating selector for A0000h printf( "%s\n",TXT_ERROR_SELECTOR ); return 1; case 11: //Not a valid mode support by gr.lib printf( "%s\n", TXT_ERROR_GRAPHICS ); return 1; #ifdef EDITOR case 3: //Monitor doesn't support that VESA mode. case 4: //Video card doesn't support that VESA mode. printf( "Your VESA driver or video hardware doesn't support 800x600 256-color mode.\n" ); break; case 5: //No VESA driver found. printf( "No VESA driver detected.\n" ); break; case 2: //Program doesn't support this VESA granularity case 6: //Bad Status after VESA call/ case 7: //Not enough DOS memory to call VESA functions. case 8: //Error using DPMI. case 9: //Error setting logical line width. default: printf( "Error %d using 800x600 256-color VESA mode.\n", result ); break; #endif } return 0; } extern fix fixed_frametime; // Returns 1 if ok, 0 if failed... int init_gameport() { union REGS regs; memset(®s,0,sizeof(regs)); regs.x.eax = 0x8400; regs.x.edx = 0xF0; int386( 0x15, ®s, ®s ); if ( ( regs.x.eax & 0xFFFF ) == 'SG' ) return 1; else return 0; } void check_dos_version() { int major, minor; union REGS regs; memset(®s,0,sizeof(regs)); regs.x.eax = 0x3000; // Get MS-DOS Version Number int386( 0x21, ®s, ®s ); major = regs.h.al; minor = regs.h.ah; if ( major < 5 ) { printf( "%s %d.d\n%s", TXT_DOS_VERSION_1, major, minor, TXT_DOS_VERSION_2); exit(1); } //printf( "\nUsing MS-DOS %d.%d...\n", major, minor ); } void change_to_dir(char *cmd_line) { char drive[_MAX_DRIVE], dir[_MAX_DIR], curdir[_MAX_DIR]; unsigned total, cur_drive; _splitpath(cmd_line, drive, dir, NULL, NULL); dir[strlen(dir) - 1] = '\0'; if (drive[0] != '\0') { _dos_getdrive(&cur_drive); if (cur_drive != (drive[0] - 'A' + 1)) _dos_setdrive(drive[0] - 'A' + 1, &total); } getcwd(curdir, _MAX_DIR); if (stricmp(&(curdir[2]), dir)) chdir(dir); } void dos_check_file_handles(int num_required) { int i, n; FILE * fp[16]; if ( num_required > 16 ) num_required = 16; n = 0; for (i=0; i<16; i++ ) fp[i] = NULL; for (i=0; i<16; i++ ) { fp[i] = fopen( "nul", "wb" ); if ( !fp[i] ) break; } n = i; for (i=0; i<16; i++ ) { if (fp[i]) fclose(fp[i]); } if ( n < num_required ) { printf( "\n%s\n", TXT_NOT_ENOUGH_HANDLES ); printf( "------------------------\n" ); printf( "%d/%d %s\n", n, num_required, TXT_HANDLES_1 ); printf( "%s\n", TXT_HANDLES_2); printf( "%s\n", TXT_HANDLES_3); exit(1); } } #define NEEDED_DOS_MEMORY ( 300*1024) // 300 K #define NEEDED_LINEAR_MEMORY (7680*1024) // 7.5 MB #define LOW_PHYSICAL_MEMORY_CUTOFF (5*1024*1024) // 5.0 MB #define NEEDED_PHYSICAL_MEMORY (2000*1024) // 2000 KB extern int piggy_low_memory; void mem_int_to_string( int number, char *dest ) { int i,l,c; char buffer[20],*p; sprintf( buffer, "%d", number ); l = strlen(buffer); if (l<=3) { // Don't bother with less than 3 digits sprintf( dest, "%d", number ); return; } c = 0; p=dest; for (i=l-1; i>=0; i-- ) { if (c==3) { *p++=','; c = 0; } c++; *p++ = buffer[i]; } *p++ = '\0'; strrev(dest); } void check_memory() { char text[32]; printf( "\n%s\n", TXT_AVAILABLE_MEMORY); printf( "----------------\n" ); mem_int_to_string( dpmi_dos_memory/1024, text ); printf( "Conventional: %7s KB\n", text ); mem_int_to_string( dpmi_physical_memory/1024, text ); printf( "Extended: %7s KB\n", text ); if ( dpmi_available_memory > dpmi_physical_memory ) { mem_int_to_string( (dpmi_available_memory-dpmi_physical_memory)/1024, text ); } else { mem_int_to_string( 0, text ); } printf( "Virtual: %7s KB\n", text ); printf( "\n" ); if ( dpmi_dos_memory < NEEDED_DOS_MEMORY ) { printf( "%d %s\n", NEEDED_DOS_MEMORY - dpmi_dos_memory, TXT_MEMORY_CONFIG ); exit(1); } if ( dpmi_available_memory < NEEDED_LINEAR_MEMORY ) { if ( dpmi_virtual_memory ) { printf( "%d %s\n", NEEDED_LINEAR_MEMORY - dpmi_available_memory, TXT_RECONFIGURE_VMM ); } else { printf( "%d %s\n", NEEDED_LINEAR_MEMORY - dpmi_available_memory, TXT_MORE_MEMORY ); printf( "%s\n", TXT_MORE_MEMORY_2); } exit(1); } if ( dpmi_physical_memory < NEEDED_PHYSICAL_MEMORY ) { printf( "%d %s\n", NEEDED_PHYSICAL_MEMORY - dpmi_physical_memory, TXT_PHYSICAL_MEMORY ); if ( dpmi_virtual_memory ) { printf( "%s\n", TXT_PHYSICAL_MEMORY_2); } exit(1); } if ( dpmi_physical_memory < LOW_PHYSICAL_MEMORY_CUTOFF ) { piggy_low_memory = 1; } } int Inferno_verbose = 0; //NO_STACK_SIZE_CHECK uint * stack, *stack_ptr; //NO_STACK_SIZE_CHECK int stack_size, unused_stack_space; //NO_STACK_SIZE_CHECK int sil; //NO_STACK_SIZE_CHECK //NO_STACK_SIZE_CHECK int main(int argc,char **argv) //NO_STACK_SIZE_CHECK { //NO_STACK_SIZE_CHECK uint ret_value; //NO_STACK_SIZE_CHECK //NO_STACK_SIZE_CHECK unused_stack_space = 0; //NO_STACK_SIZE_CHECK stack = &ret_value; //NO_STACK_SIZE_CHECK stack_size = stackavail()/4; //NO_STACK_SIZE_CHECK //NO_STACK_SIZE_CHECK for ( sil=0; sil0 ) { sprintf( destsat_cdpath, "%c:\\descent\\", i +'a' - 1 ); cfile_use_alternate_hogdir( destsat_cdpath ); } #ifdef REQUIRE_CD else { // NOTE ABOVE LINK!!!!!!!!!!!!!!!!!! printf( "\n\n" ); #ifdef DEST_SAT printf("Couldn't find the 'Descent: Destination Saturn' CD-ROM.\n" ); #else printf("Couldn't find the Descent CD-ROM.\n" ); #endif printf("Please make sure that it is in your CD-ROM drive and\n" ); printf("that your CD-ROM drivers are loaded correctly.\n" ); exit(1); } #endif #endif load_text(); // set_exit_message("\n\n%s", TXT_THANKS); printf("\nDESCENT %s\n", VERSION_NAME); printf("%s\n%s\n",TXT_COPYRIGHT,TXT_TRADEMARK); check_id_checksum_and_date(); if (FindArg( "-?" ) || FindArg( "-help" ) || FindArg( "?" ) ) { printf( "%s\n", TXT_COMMAND_LINE_0 ); printf(" -SimulEyes %s\n", "Enables StereoGraphics SimulEyes VR stereo display" ); printf(" -Iglasses %s\n", TXT_IGLASSES ); printf(" -VioTrack %s n\n",TXT_VIOTRACK ); printf(" -3dmaxLo %s\n",TXT_KASAN ); printf(" %s\n",TXT_KASAN_2 ); printf(" -3dmaxHi %s\n",TXT_3DMAX ); printf( "%s\n", TXT_COMMAND_LINE_1 ); printf( "%s\n", TXT_COMMAND_LINE_2 ); printf( "%s\n", TXT_COMMAND_LINE_3 ); printf( "%s\n", TXT_COMMAND_LINE_4 ); printf( "%s\n", TXT_COMMAND_LINE_5 ); // printf( "\n"); printf( "%s\n", TXT_COMMAND_LINE_6 ); printf( "%s\n", TXT_COMMAND_LINE_7 ); printf( "%s\n", TXT_COMMAND_LINE_8 ); // printf( "\n"); printf( "\n%s\n",TXT_PRESS_ANY_KEY3); getch(); printf( "\n" ); printf( "%s\n", TXT_COMMAND_LINE_9); printf( "%s\n", TXT_COMMAND_LINE_10); printf( "%s\n", TXT_COMMAND_LINE_11); printf( "%s\n", TXT_COMMAND_LINE_12); printf( "%s\n", TXT_COMMAND_LINE_13); printf( "%s\n", TXT_COMMAND_LINE_14); printf( "%s\n", TXT_COMMAND_LINE_15); printf( "%s\n", TXT_COMMAND_LINE_16); printf( "%s\n", TXT_COMMAND_LINE_17); printf( "%s\n", TXT_COMMAND_LINE_18); printf( " -DynamicSockets %s\n", TXT_SOCKET); printf( " -NoFileCheck %s\n", TXT_NOFILECHECK); printf( " -GamePort %s\n", "Use Colorado Spectrum's Notebook Gameport" ); printf( " -NoDoubleBuffer %s\n", "Use only one page of video memory" ); printf( " -LCDBios %s\n", "Enables LCDBIOS for using LCD shutter glasses" ); printf( " -JoyNice %s\n", "Joystick poller allows interrupts to occur" ); set_exit_message(""); return(0); } printf("\n%s\n", TXT_HELP); #ifdef PASSWORD if ((t = FindArg("-pswd")) != 0) { int n; byte *pp = Side_to_verts; int ch; for (n=0; n<6; n++) for (ch=0; ch 0 ) kconfig_sense_init(); else if ((Config_vr_type==1)&&(Config_vr_tracking>0)) kconfig_sense_init(); i = FindArg( "-maxxtrak" ); if ( i > 0) victor_init_tracking( atoi(Args[i+1]) ); else if ((Config_vr_type==2)&&(Config_vr_tracking>0)) victor_init_tracking( Config_vr_tracking ); i = FindArg( "-viotrack" ); if ( i > 0 ) iglasses_init_tracking( atoi(Args[i+1]) ); else if ((Config_vr_type==3)&&(Config_vr_tracking>0)) iglasses_init_tracking( Config_vr_tracking ); if ( FindArg( "-vfx" ) || (Config_vr_type==1) ) { vfx_init(); Game_vfx_flag = 1; game_init_render_buffers(SM_640x480V, 320, 240, 0, VR_AREA_DET, 0 ); VR_low_res = 3; } else if ( FindArg( "-cybermaxx" ) || (Config_vr_type==2) ) { Game_victor_flag = 1; game_init_render_buffers(SM_320x200C, 320, 100, 0, VR_INTERLACED, 1 ); VR_low_res = 0; } else if ( FindArg( "-iglasses" ) || (Config_vr_type==3) ) { Game_vio_flag = 1; game_init_render_buffers(SM_320x400U, 320, 200, 1, VR_INTERLACED, 0 ); VR_low_res = 3; } else if ( FindArg( "-cybermax2" ) || (Config_vr_type==6) ) { game_init_render_buffers(SM_320x400U, 320, 200, 1, VR_INTERLACED, 0 ); VR_low_res = 3; } else if ( FindArg( "-3dmaxlo" ) || (Config_vr_type==4) ) { if (!is_3dbios_installed()) { printf( "Error: Kasan 3DBIOS needs to be installed.\n" ); exit(1); } Game_3dmax_flag = 1; game_init_render_buffers(SM_320x200C, 320, 100, 0, VR_INTERLACED, 0 ); VR_low_res = 0; VR_switch_eyes = 0; } else if ( FindArg( "-3dmaxhi" ) || (Config_vr_type==5) ) { if (!is_3dbios_installed()) { printf( "Error: Kasan's 3DBIOS needs to be installed.\n" ); exit(1); } Game_3dmax_flag = 2; game_init_render_buffers(22, 320, 200, 1, VR_INTERLACED, 0 ); VR_switch_eyes = 0; VR_low_res = 0; } else { int screen_mode = SM_320x200C; int screen_width = 320; int screen_height = 200; int vr_mode = VR_NONE; int screen_compatible = 1; int use_double_buffer = 0; if ( FindArg( "-lcdbios" ) ) { if (!is_3dbios_installed()) { printf( "Warning: LCDBIOS needs to be installed.\nPress Esc to continue anyway, any other key to exit.\n" ); if ( key_getch()!=KEY_ESC ) exit(1); } if (Inferno_verbose) printf( "Enabling LCDBIOS...\n" ); Game_3dmax_flag = 3; screen_compatible = 0; VR_switch_eyes = 0; VR_low_res = 0; vr_mode = VR_INTERLACED; } if ( FindArg( "-simuleyes" )) { Game_simuleyes_flag = 1; } if (Game_simuleyes_flag) { // default to 320x400 (x200 per eye) screen_mode = SM_320x400U; screen_width = 320; screen_height = 400; screen_compatible = 0; use_double_buffer = 1; if ( FindArg( "-320x200" )) { if (Inferno_verbose) printf( "Using 320x200...\n" ); screen_mode = SM_320x200C; screen_width = 320; screen_height = 200; use_double_buffer = 0; } else { if (Inferno_verbose) printf( "Using 320x400 ModeX...\n" ); } } if ( FindArg( "-320x240" )) { if (Inferno_verbose) printf( "Using 320x240 ModeX...\n" ); screen_mode = SM_320x240U; screen_width = 320; screen_height = 240; screen_compatible = 0; use_double_buffer = 1; } if ( FindArg( "-320x400" )) { if (Inferno_verbose) printf( "Using 320x400 ModeX...\n" ); screen_mode = SM_320x400U; screen_width = 320; screen_height = 400; screen_compatible = 0; use_double_buffer = 1; } if (!Game_simuleyes_flag && FindArg( "-640x400" )) { if (Inferno_verbose) printf( "Using 640x400 VESA...\n" ); screen_mode = SM_640x400V; screen_width = 640; screen_height = 400; screen_compatible = 0; use_double_buffer = 1; } if (!Game_simuleyes_flag && FindArg( "-640x480" )) { if (Inferno_verbose) printf( "Using 640x480 VESA...\n" ); screen_mode = SM_640x480V; screen_width = 640; screen_height = 480; screen_compatible = 0; use_double_buffer = 1; } if ( FindArg( "-320x100" )) { if (Inferno_verbose) printf( "Using 320x100 VGA...\n" ); screen_mode = 19; screen_width = 320; screen_height = 100; screen_compatible = 0; } if ( FindArg( "-nodoublebuffer" ) ) { if (Inferno_verbose) printf( "Double-buffering disabled...\n" ); use_double_buffer = 0; } if ( vr_mode == VR_INTERLACED ) screen_height /= 2; game_init_render_buffers(screen_mode, screen_width, screen_height, use_double_buffer, vr_mode, screen_compatible ); } if (Game_victor_flag) { char *vswitch = getenv( "CYBERMAXX" ); if ( vswitch ) { char *p = strstr( vswitch, "/E:R" ); if ( p ) { VR_switch_eyes = 1; } else VR_switch_eyes = 0; } else { VR_switch_eyes = 0; } } #ifdef ARCADE i = FindArg( "-arcade" ); if (i > 0 ) { arcade_init(); coindev_init(0); } #endif #ifdef NETWORK // i = FindArg( "-rinvul" ); // if (i > 0) { // int mins = atoi(Args[i+1]); // if (mins > 314) // mins = 314; // control_invul_time = mins/5; // } control_invul_time = 0; #endif i = FindArg( "-xcontrol" ); if ( i > 0 ) { kconfig_init_external_controls( strtol(Args[i+1], NULL, 0), strtol(Args[i+2], NULL, 0) ); } if (Inferno_verbose) 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(SM_320x200C); mprintf( (0, "\nInitializing palette system..." )); gr_use_palette_table( "PALETTE.256" ); mprintf( (0, "\nInitializing font system..." )); gamefont_init(); // must load after palette data loaded. songs_play_song( SONG_TITLE, 1 ); #ifndef RELEASE if ( !FindArg( "-notitles" ) ) #endif { //NOTE LINK TO ABOVE! show_title_screen( "iplogo1.pcx", 1 ); show_title_screen( "logo.pcx", 1 ); } { //grs_bitmap title_bm; int pcx_error; char filename[14]; strcpy(filename, "descent.pcx"); if ((pcx_error=pcx_read_bitmap( filename, &grd_curcanv->cv_bitmap, grd_curcanv->cv_bitmap.bm_type, title_pal ))==PCX_ERROR_NONE) { vfx_set_palette_sub( title_pal ); gr_palette_clear(); //gr_bitmap( 0, 0, &title_bm ); gr_palette_fade_in( title_pal, 32, 0 ); //free(title_bm.bm_data); } else { gr_close(); Error( "Couldn't load pcx file '%s', PCX load error: %s\n",filename, pcx_errormsg(pcx_error)); } } #ifdef EDITOR if ( !FindArg("-nobm") ) bm_init_use_tbl(); else bm_init(); #else bm_init(); #endif if ( FindArg( "-norun" ) ) return(0); mprintf( (0, "\nInitializing 3d system..." )); g3_init(); mprintf( (0, "\nInitializing texture caching system..." )); texmerge_init( 10 ); // 10 cache bitmaps mprintf( (0, "\nRunning game...\n" )); set_screen_mode(SCREEN_MENU); init_game(); set_detail_level_parameters(Detail_level); Players[Player_num].callsign[0] = '\0'; if (!Auto_demo) { key_flush(); RegisterPlayer(); //get player's name } gr_palette_fade_out( title_pal, 32, 0 ); //check for special stamped version if (registered_copy) { nm_messagebox("EVALUATION COPY",1,"Continue", "This special evaluation copy\n" "of DESCENT has been issued to:\n\n" "%s\n" "\n\n NOT FOR DISTRIBUTION", name_copy); gr_palette_fade_out( gr_palette, 32, 0 ); } //kconfig_load_all(); Game_mode = GM_GAME_OVER; if (Auto_demo) { newdemo_start_playback("DESCENT.DEM"); if (Newdemo_state == ND_STATE_PLAYBACK ) Function_mode = FMODE_GAME; } build_mission_list(0); // This also loads mission 0. while (Function_mode != FMODE_EXIT) { switch( Function_mode ) { case FMODE_MENU: if ( Auto_demo ) { newdemo_start_playback(NULL); // Randomly pick a file if (Newdemo_state != ND_STATE_PLAYBACK) Error("No demo files were found for autodemo mode!"); } else { check_joystick_calibration(); DoMenu(); #ifdef EDITOR if ( Function_mode == FMODE_EDITOR ) { create_new_mine(); SetPlayerFromCurseg(); } #endif } break; case FMODE_GAME: #ifdef EDITOR keyd_editor_mode = 0; #endif game(); if ( Function_mode == FMODE_MENU ) songs_play_song( SONG_TITLE, 1 ); break; #ifdef EDITOR case FMODE_EDITOR: keyd_editor_mode = 1; editor(); _harderr( (void *)descent_critical_error_handler ); // Reinstall game error handler 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 #ifndef RELEASE if (!FindArg( "-notitles" )) #endif //NOTE LINK TO ABOVE!! #ifndef EDITOR show_order_form(); #endif #endif #ifndef NDEBUG if ( FindArg( "-showmeminfo" ) ) // show_mem_info = 1; // Make memory statistics show #endif return(0); //presumably successful exit } void check_joystick_calibration() { int x1, y1, x2, y2, c; fix t1; if ( (Config_control_type!=CONTROL_JOYSTICK) && (Config_control_type!=CONTROL_FLIGHTSTICK_PRO) && (Config_control_type!=CONTROL_THRUSTMASTER_FCS) && (Config_control_type!=CONTROL_GRAVIS_GAMEPAD) ) return; joy_get_pos( &x1, &y1 ); t1 = timer_get_fixed_seconds(); while( timer_get_fixed_seconds() < t1 + F1_0/100 ) ; joy_get_pos( &x2, &y2 ); // If joystick hasn't moved... if ( (abs(x2-x1)<30) && (abs(y2-y1)<30) ) { if ( (abs(x1)>30) || (abs(x2)>30) || (abs(y1)>30) || (abs(y2)>30) ) { c = nm_messagebox( NULL, 2, TXT_CALIBRATE, TXT_SKIP, TXT_JOYSTICK_NOT_CEN ); if ( c==0 ) { joydefs_calibrate(); } } } } void show_order_form() { int pcx_error; char title_pal[768]; char exit_screen[16]; gr_set_current_canvas( NULL ); gr_palette_clear(); key_flush(); #ifdef SHAREWARE strcpy(exit_screen, "order01.pcx"); #else #ifdef DEST_SAT strcpy(exit_screen, "order01.pcx"); #else strcpy(exit_screen, "warning.pcx"); #endif #endif if ((pcx_error=pcx_read_bitmap( exit_screen, &grd_curcanv->cv_bitmap, grd_curcanv->cv_bitmap.bm_type, title_pal ))==PCX_ERROR_NONE) { vfx_set_palette_sub( title_pal ); gr_palette_fade_in( title_pal, 32, 0 ); { int done=0; fix time_out_value = timer_get_approx_seconds()+i2f(60*5); while(!done) { if ( timer_get_approx_seconds() > time_out_value ) done = 1; if (key_inkey()) done = 1; } } gr_palette_fade_out( title_pal, 32, 0 ); } key_flush(); } #ifdef USE_CD #include #include #include #include #include "dpmi.h" typedef struct { char unit; ushort dev_offset; ushort dev_segment; } dev_list; typedef struct _Dev_Hdr { unsigned int dev_next; unsigned short dev_att; ushort dev_stat; ushort dev_int; char dev_name[8]; short dev_resv; char dev_letr; char dev_units; } dev_header; int find_descent_cd() { dpmi_real_regs rregs; // Get dos memory for call... dev_list * buf; dev_header *device; int num_drives, i; unsigned cdrive, cur_drive, cdrom_drive; memset(&rregs,0,sizeof(dpmi_real_regs)); rregs.eax = 0x1500; rregs.ebx = 0; dpmi_real_int386x( 0x2f, &rregs ); if ((rregs.ebx & 0xffff) == 0) { return -1; // No cdrom } num_drives = rregs.ebx; buf = (dev_list *)dpmi_get_temp_low_buffer( sizeof(dev_list)*26 ); if (buf==NULL) { return -2; // Error getting memory! } memset(&rregs,0,sizeof(dpmi_real_regs)); rregs.es = DPMI_real_segment(buf); rregs.ebx = DPMI_real_offset(buf); rregs.eax = 0x1501; dpmi_real_int386x( 0x2f, &rregs ); cdrom_drive = 0; _dos_getdrive(&cdrive); for (i = 0; i < num_drives; i++) { device = (dev_header *)((buf[i].dev_segment<<4)+ buf[i].dev_offset); _dos_setdrive(device->dev_letr,&cur_drive); _dos_getdrive(&cur_drive); if (cur_drive == device->dev_letr) { if (!chdir("\\descent")) { FILE * fp; #ifdef DEST_SAT fp = fopen( "saturn.hog", "rb" ); #else fp = fopen( "descent.hog", "rb" ); #endif if ( fp ) { int write_failed = 1; fclose(fp); fp = fopen( "descent.tmp", "wb" ); if ( fp ) { int temp = 0x15A90C23; if ( fwrite( &temp, sizeof(int), 1, fp )==1 ) { fp = fopen( "descent.tmp", "rb" ); if ( fp ) { temp = 0; if ( fread( &temp, sizeof(int), 1, fp )==1 ) { if ( temp == 0x15A90C23 ) write_failed = 0; } fclose(fp); unlink( "descent.tmp" ); } } fclose(fp); } if ( write_failed ) { cdrom_drive = device->dev_letr; break; } } } } } _dos_setdrive(cdrive,&cur_drive); return cdrom_drive; } #endif