/* Emacs style mode select -*- C++ -*- *----------------------------------------------------------------------------- * * * PrBoom: a Doom port merged with LxDoom and LSDLDoom * based on BOOM, a modified and improved DOOM engine * Copyright (C) 1999 by * id Software, Chi Hoang, Lee Killough, Jim Flynn, Rand Phares, Ty Halderman * Copyright (C) 1999-2000 by * Jess Haas, Nicolas Kalkhof, Colin Phipps, Florian Schulze * Copyright 2005, 2006 by * Florian Schulze, Colin Phipps, Neil Stevens, Andrey Budko * * 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. * * DESCRIPTION: * Startup and quit functions. Handles signals, inits the * memory management, then calls D_DoomMain. Also contains * I_Init which does other system-related startup stuff. * *----------------------------------------------------------------------------- */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef USE_SDL #include "SDL.h" #endif #include "doomdef.h" #include "m_argv.h" #include "d_main.h" #include "m_fixed.h" #include "i_system.h" #include "i_video.h" #include "z_zone.h" #include "lprintf.h" #include "m_random.h" #include "doomstat.h" #include "g_game.h" #include "m_misc.h" #include "i_sound.h" #include "i_main.h" #include "r_fps.h" #include "lprintf.h" #include #include #include /* Most of the following has been rewritten by Lee Killough * * I_GetTime * killough 4/13/98: Make clock rate adjustable by scale factor * cphipps - much made static */ int realtic_clock_rate = 100; static int_64_t I_GetTime_Scale = 1<<24; static int I_GetTime_Scaled(void) { return (int)( (int_64_t) I_GetTime_RealTime() * I_GetTime_Scale >> 24); } static int I_GetTime_FastDemo(void) { static int fasttic; return fasttic++; } static int I_GetTime_Error(void) { I_Error("I_GetTime_Error: GetTime() used before initialization"); return 0; } //int (*I_GetTime)(void) = I_GetTime_Error; void I_Init(void) { /* killough 4/14/98: Adjustable speedup based on realtic_clock_rate */ /* if (fastdemo) { printf("I_Init: Using fast demo: I_GetTime_FastDemo\n"); I_GetTime = I_GetTime_FastDemo; } else { if (realtic_clock_rate != 100) { printf("I_Init: Using fast demo: I_GetTime_Scaled\n"); I_GetTime_Scale = ((int_64_t) realtic_clock_rate << 24) / 100; I_GetTime = I_GetTime_Scaled; } else { printf("I_Init: Using fast demo: I_GetTime_RealTime\n"); I_GetTime = I_GetTime_RealTime; } } */ { /* killough 2/21/98: avoid sound initialization if no sound & no music */ if (!(nomusicparm && nosfxparm)) I_InitSound(); } R_InitInterpolation(); } /* cleanup handling -- killough: */ static void I_SignalHandler(int s) { char buf[2048]; // signal(s,SIG_IGN); /* Ignore future instances of this signal.*/ strcpy(buf,"Exiting on signal: "); I_SigString(buf+strlen(buf),2000-strlen(buf),s); /* If corrupted memory could cause crash, dump memory * allocation history, which points out probable causes */ if (s==SIGSEGV || s==SIGILL || s==SIGFPE) Z_DumpHistory(buf); I_Error("I_SignalHandler: %s", buf); } /* killough 2/22/98: Add support for ENDBOOM, which is PC-specific * * this converts BIOS color codes to ANSI codes. * Its not pretty, but it does the job - rain * CPhipps - made static */ inline static int convert(int color, int *bold) { if (color > 7) { color -= 8; *bold = 1; } switch (color) { case 0: return 0; case 1: return 4; case 2: return 2; case 3: return 6; case 4: return 1; case 5: return 5; case 6: return 3; case 7: return 7; } return 0; } /* CPhipps - flags controlling ENDOOM behaviour */ enum { endoom_colours = 1, endoom_nonasciichars = 2, endoom_droplastline = 4 }; unsigned int endoom_mode; static void PrintVer(void) { char vbuf[200]; lprintf(LO_INFO,"%s\n",I_GetVersionString(vbuf,200)); } /* I_EndDoom * Prints out ENDOOM or ENDBOOM, using some common sense to decide which. * cphipps - moved to l_main.c, made static */ static void I_EndDoom(void) { int lump_eb, lump_ed, lump = -1; /* CPhipps - ENDOOM/ENDBOOM selection */ lump_eb = W_CheckNumForName("ENDBOOM");/* jff 4/1/98 sign our work */ lump_ed = W_CheckNumForName("ENDOOM"); /* CPhipps - also maybe ENDOOM */ if (lump_eb == -1) lump = lump_ed; else if (lump_ed == -1) lump = lump_eb; else { /* Both ENDOOM and ENDBOOM are present */ #define LUMP_IS_NEW(num) (!((lumpinfo[num].source == source_iwad) || (lumpinfo[num].source == source_auto_load))) switch ((LUMP_IS_NEW(lump_ed) ? 1 : 0 ) | (LUMP_IS_NEW(lump_eb) ? 2 : 0)) { case 1: lump = lump_ed; break; case 2: lump = lump_eb; break; default: /* Both lumps have equal priority, both present */ lump = (P_Random(pr_misc) & 1) ? lump_ed : lump_eb; break; } } if (lump != -1) { const char (*endoom)[2] = (const void*)W_CacheLumpNum(lump); int i, l = W_LumpLength(lump) / 2; /* cph - colour ENDOOM by rain */ int oldbg = -1, oldcolor = -1, bold = 0, oldbold = -1, color = 0; #ifndef _WIN32 if (endoom_mode & endoom_nonasciichars) /* switch to secondary charset, and set to cp437 (IBM charset) */ printf("\e)K\016"); #endif /* _WIN32 */ /* cph - optionally drop the last line, so everything fits on one screen */ if (endoom_mode & endoom_droplastline) l -= 80; lprintf(LO_INFO,"\n"); for (i=0; i