|
|
1.1 root 1:
2: //**************************************************************************
3: //**
4: //** h2_main.c : Heretic 2 : Raven Software, Corp.
5: //**
6: //** $RCSfile: h2_main.c,v $
7: //** $Revision: 1.50 $
8: //** $Date: 96/01/16 13:02:28 $
9: //** $Author: bgokey $
10: //**
11: //**************************************************************************
12:
13: // HEADER FILES ------------------------------------------------------------
14:
15: #ifdef __WATCOMC__
16: #include <dos.h>
17: #include <sys\types.h>
18: #include <direct.h>
19: #endif
20: #include <stdio.h>
21: #include <stdlib.h>
22: #include <time.h>
23: #include "h2def.h"
24: #include "p_local.h"
25: #include "soundst.h"
26:
27: // MACROS ------------------------------------------------------------------
28:
29: #define CONFIG_FILE_NAME "hexen.cfg"
30: #define MAXWADFILES 20
31:
32: // TYPES -------------------------------------------------------------------
33:
34: typedef struct
35: {
36: char *name;
37: void (*func)(char **args, int tag);
38: int requiredArgs;
39: int tag;
40: } execOpt_t;
41:
42: // EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
43:
44: void R_ExecuteSetViewSize(void);
45: void D_CheckNetGame(void);
46: void G_BuildTiccmd(ticcmd_t *cmd);
47: void F_Drawer(void);
48: boolean F_Responder(event_t *ev);
49: void I_StartupKeyboard(void);
50: void I_StartupJoystick(void);
51: void I_ShutdownKeyboard(void);
52: void S_InitScript(void);
53:
54: // PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
55:
56: void H2_ProcessEvents(void);
57: void H2_DoAdvanceDemo(void);
58: void H2_AdvanceDemo(void);
59: void H2_StartTitle(void);
60: void H2_PageTicker(void);
61:
62: // PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
63:
64: static void DrawMessage(void);
65: static void PageDrawer(void);
66: static void HandleArgs(void);
67: static void CheckRecordFrom(void);
68: static void AddWADFile(char *file);
69: static void DrawAndBlit(void);
70: static void ExecOptionFILE(char **args, int tag);
71: static void ExecOptionSCRIPTS(char **args, int tag);
72: static void ExecOptionDEVMAPS(char **args, int tag);
73: static void ExecOptionSKILL(char **args, int tag);
74: static void ExecOptionPLAYDEMO(char **args, int tag);
75: static void ExecOptionMAXZONE(char **args, int tag);
76: static void CreateSavePath(void);
77: static void WarpCheck(void);
78:
79: #ifdef TIMEBOMB
80: static void DoTimeBomb(void);
81: #endif
82:
83: // EXTERNAL DATA DECLARATIONS ----------------------------------------------
84:
85: extern boolean automapactive;
86: extern boolean MenuActive;
87: extern boolean askforquit;
88: extern char *SavePath;
89:
90: // PUBLIC DATA DEFINITIONS -------------------------------------------------
91:
92: boolean DevMaps; // true = Map development mode
93: char *DevMapsDir = ""; // development maps directory
94: boolean shareware; // true if only episode 1 present
95: boolean nomonsters; // checkparm of -nomonsters
96: boolean respawnparm; // checkparm of -respawn
97: boolean randomclass; // checkparm of -randclass
98: boolean debugmode; // checkparm of -debug
99: boolean ravpic; // checkparm of -ravpic
100: boolean cdrom; // true if cd-rom mode active
101: boolean cmdfrag; // true if a CMD_FRAG packet should be sent out
102: boolean singletics; // debug flag to cancel adaptiveness
103: boolean artiskip; // whether shift-enter skips an artifact
104: int maxzone = 0x800000; // Maximum allocated for zone heap (8meg default)
105: skill_t startskill;
106: int startepisode;
107: int startmap;
108: boolean autostart;
109: boolean advancedemo;
110: FILE *debugfile;
111: event_t events[MAXEVENTS];
112: int eventhead;
113: int eventtail;
114:
115: // PRIVATE DATA DEFINITIONS ------------------------------------------------
116:
117: static int WarpMap;
118: static int demosequence;
119: static int pagetic;
120: static char *pagename;
121: #ifdef __NeXT__
122: static char *wadfiles[MAXWADFILES] =
123: {
124: "/Novell/H2/source/hexen.wad"
125: };
126: #else
127: static char *wadfiles[MAXWADFILES] =
128: {
129: "hexen.wad"
130: };
131: #endif
132: static execOpt_t ExecOptions[] =
133: {
134: { "-file", ExecOptionFILE, 1, 0 },
135: { "-scripts", ExecOptionSCRIPTS, 1, 0 },
136: { "-devmaps", ExecOptionDEVMAPS, 1, 0 },
137: { "-skill", ExecOptionSKILL, 1, 0 },
138: { "-playdemo", ExecOptionPLAYDEMO, 1, 0 },
139: { "-timedemo", ExecOptionPLAYDEMO, 1, 0 },
140: { "-maxzone", ExecOptionMAXZONE, 1, 0 },
141: { NULL, NULL, 0, 0 } // Terminator
142: };
143:
144: // CODE --------------------------------------------------------------------
145:
146: //==========================================================================
147: //
148: // H2_Main
149: //
150: //==========================================================================
151: void InitMapMusicInfo(void);
152:
153: void H2_Main(void)
154: {
155: int p;
156:
157: M_FindResponseFile();
158: setbuf(stdout, NULL);
159: startepisode = 1;
160: autostart = false;
161: startskill = sk_medium;
162: startmap = 1;
163: shareware = false; // Always false for Hexen
164:
165: HandleArgs();
166:
167: // Initialize subsystems
168:
169: ST_Message("V_Init: allocate screens.\n");
170: V_Init();
171:
172: // Load defaults before initing other systems
173: ST_Message("M_LoadDefaults: Load system defaults.\n");
174: M_LoadDefaults(CONFIG_FILE_NAME);
175:
176: // Now that the savedir is loaded from .CFG, make sure it exists
177: CreateSavePath();
178:
179: // HEXEN MODIFICATION:
180: // There is a realloc() in W_AddFile() that might fail if the zone
181: // heap has been previously allocated, so we need to initialize the
182: // WAD files BEFORE the zone memory initialization.
183: ST_Message("W_Init: Init WADfiles.\n");
184: W_InitMultipleFiles(wadfiles);
185:
186: #ifdef TIMEBOMB
187: DoTimeBomb();
188: #endif
189:
190: ST_Message("Z_Init: Init zone memory allocation daemon.\n");
191: Z_Init();
192:
193: #ifdef __WATCOMC__
194: I_StartupKeyboard();
195: I_StartupJoystick();
196: #endif
197:
198: ST_Message("MN_Init: Init menu system.\n");
199: MN_Init();
200:
201: ST_Message("CT_Init: Init chat mode data.\n");
202: CT_Init();
203:
204: InitMapMusicInfo(); // Init music fields in mapinfo
205:
206: #ifdef __WATCOMC__
207: ST_Message("S_InitScript\n");
208: S_InitScript();
209: #endif
210:
211: ST_Message("SN_InitSequenceScript: Registering sound sequences.\n");
212: SN_InitSequenceScript();
213: ST_Message("I_Init: Setting up machine state.\n");
214: I_Init();
215:
216: ST_Message("ST_Init: Init startup screen.\n");
217: ST_Init();
218:
219: S_StartSongName("orb", true);
220:
221: // Show version message now, so it's visible during R_Init()
222: ST_Message("Executable: "VERSIONTEXT".\n");
223:
224: ST_Message("R_Init: Init Hexen refresh daemon");
225: R_Init();
226: ST_Message("\n");
227:
228: if (M_CheckParm("-net")) ST_NetProgress(); // Console player found
229:
230: ST_Message("P_Init: Init Playloop state.\n");
231: P_Init();
232:
233: // Check for command line warping. Follows P_Init() because the
234: // MAPINFO.TXT script must be already processed.
235: WarpCheck();
236:
237: if(autostart)
238: {
239: ST_Message("Warp to Map %d (\"%s\":%d), Skill %d\n",
240: WarpMap, P_GetMapName(startmap), startmap, startskill+1);
241: }
242:
243: ST_Message("D_CheckNetGame: Checking network game status.\n");
244: D_CheckNetGame();
245:
246: ST_Message("SB_Init: Loading patches.\n");
247: SB_Init();
248:
249: CheckRecordFrom();
250:
251: p = M_CheckParm("-record");
252: if(p && p < myargc-1)
253: {
254: G_RecordDemo(startskill, 1, startepisode, startmap, myargv[p+1]);
255: H2_GameLoop(); // Never returns
256: }
257:
258: p = M_CheckParm("-playdemo");
259: if(p && p < myargc-1)
260: {
261: singledemo = true; // Quit after one demo
262: G_DeferedPlayDemo(myargv[p+1]);
263: H2_GameLoop(); // Never returns
264: }
265:
266: p = M_CheckParm("-timedemo");
267: if(p && p < myargc-1)
268: {
269: G_TimeDemo(myargv[p+1]);
270: H2_GameLoop(); // Never returns
271: }
272:
273: p = M_CheckParm("-loadgame");
274: if(p && p < myargc-1)
275: {
276: G_LoadGame(atoi(myargv[p+1]));
277: }
278:
279: if(gameaction != ga_loadgame)
280: {
281: UpdateState |= I_FULLSCRN;
282: BorderNeedRefresh = true;
283: if(autostart || netgame)
284: {
285: G_StartNewInit();
286: G_InitNew(startskill, startepisode, startmap);
287: }
288: else
289: {
290: H2_StartTitle();
291: }
292: }
293: H2_GameLoop(); // Never returns
294: }
295:
296: //==========================================================================
297: //
298: // HandleArgs
299: //
300: //==========================================================================
301:
302: static void HandleArgs(void)
303: {
304: int p;
305: execOpt_t *opt;
306:
307: nomonsters = M_ParmExists("-nomonsters");
308: respawnparm = M_ParmExists("-respawn");
309: randomclass = M_ParmExists("-randclass");
310: ravpic = M_ParmExists("-ravpic");
311: artiskip = M_ParmExists("-artiskip");
312: debugmode = M_ParmExists("-debug");
313: deathmatch = M_ParmExists("-deathmatch");
314: cdrom = M_ParmExists("-cdrom");
315: cmdfrag = M_ParmExists("-cmdfrag");
316:
317: // Process command line options
318: for(opt = ExecOptions; opt->name != NULL; opt++)
319: {
320: p = M_CheckParm(opt->name);
321: if(p && p < myargc-opt->requiredArgs)
322: {
323: opt->func(&myargv[p], opt->tag);
324: }
325: }
326:
327: // Look for an external device driver
328: I_CheckExternDriver();
329: }
330:
331: //==========================================================================
332: //
333: // WarpCheck
334: //
335: //==========================================================================
336:
337: static void WarpCheck(void)
338: {
339: int p;
340: int map;
341:
342: p = M_CheckParm("-warp");
343: if(p && p < myargc-1)
344: {
345: WarpMap = atoi(myargv[p+1]);
346: map = P_TranslateMap(WarpMap);
347: if(map == -1)
348: { // Couldn't find real map number
349: startmap = 1;
350: ST_Message("-WARP: Invalid map number.\n");
351: }
352: else
353: { // Found a valid startmap
354: startmap = map;
355: autostart = true;
356: }
357: }
358: else
359: {
360: WarpMap = 1;
361: startmap = P_TranslateMap(1);
362: if(startmap == -1)
363: {
364: startmap = 1;
365: }
366: }
367: }
368:
369: //==========================================================================
370: //
371: // ExecOptionSKILL
372: //
373: //==========================================================================
374:
375: static void ExecOptionSKILL(char **args, int tag)
376: {
377: startskill = args[1][0]-'1';
378: autostart = true;
379: }
380:
381: //==========================================================================
382: //
383: // ExecOptionFILE
384: //
385: //==========================================================================
386:
387: static void ExecOptionFILE(char **args, int tag)
388: {
389: int p;
390:
391: p = M_CheckParm("-file");
392: while(++p != myargc && myargv[p][0] != '-')
393: {
394: AddWADFile(myargv[p]);
395: }
396: }
397:
398:
399: //==========================================================================
400: //
401: // ExecOptionPLAYDEMO
402: //
403: //==========================================================================
404:
405: static void ExecOptionPLAYDEMO(char **args, int tag)
406: {
407: char file[256];
408:
409: sprintf(file, "%s.lmp", args[1]);
410: AddWADFile(file);
411: ST_Message("Playing demo %s.lmp.\n", args[1]);
412: }
413:
414: //==========================================================================
415: //
416: // ExecOptionSCRIPTS
417: //
418: //==========================================================================
419:
420: static void ExecOptionSCRIPTS(char **args, int tag)
421: {
422: sc_FileScripts = true;
423: sc_ScriptsDir = args[1];
424: }
425:
426: //==========================================================================
427: //
428: // ExecOptionDEVMAPS
429: //
430: //==========================================================================
431:
432: static void ExecOptionDEVMAPS(char **args, int tag)
433: {
434: DevMaps = true;
435: ST_Message("Map development mode enabled:\n");
436: ST_Message("[config ] = %s\n", args[1]);
437: SC_OpenFileCLib(args[1]);
438: SC_MustGetStringName("mapsdir");
439: SC_MustGetString();
440: ST_Message("[mapsdir ] = %s\n", sc_String);
441: DevMapsDir = malloc(strlen(sc_String)+1);
442: strcpy(DevMapsDir, sc_String);
443: SC_MustGetStringName("scriptsdir");
444: SC_MustGetString();
445: ST_Message("[scriptsdir] = %s\n", sc_String);
446: sc_FileScripts = true;
447: sc_ScriptsDir = malloc(strlen(sc_String)+1);
448: strcpy(sc_ScriptsDir, sc_String);
449: while(SC_GetString())
450: {
451: if(SC_Compare("file"))
452: {
453: SC_MustGetString();
454: AddWADFile(sc_String);
455: }
456: else
457: {
458: SC_ScriptError(NULL);
459: }
460: }
461: SC_Close();
462: }
463:
464:
465: long superatol(char *s)
466: {
467: long int n=0, r=10, x, mul=1;
468: char *c=s;
469:
470: for (; *c; c++)
471: {
472: x = (*c & 223) - 16;
473:
474: if (x == -3)
475: {
476: mul = -mul;
477: }
478: else if (x == 72 && r == 10)
479: {
480: n -= (r=n);
481: if (!r) r=16;
482: if (r<2 || r>36) return -1;
483: }
484: else
485: {
486: if (x>10) x-=39;
487: if (x >= r) return -1;
488: n = (n*r) + x;
489: }
490: }
491: return(mul*n);
492: }
493:
494:
495: static void ExecOptionMAXZONE(char **args, int tag)
496: {
497: int size;
498:
499: size = superatol(args[1]);
500: if (size < MINIMUM_HEAP_SIZE) size = MINIMUM_HEAP_SIZE;
501: if (size > MAXIMUM_HEAP_SIZE) size = MAXIMUM_HEAP_SIZE;
502: maxzone = size;
503: }
504:
505: //==========================================================================
506: //
507: // H2_GameLoop
508: //
509: //==========================================================================
510:
511: void H2_GameLoop(void)
512: {
513: if(M_CheckParm("-debugfile"))
514: {
515: char filename[20];
516: sprintf(filename, "debug%i.txt", consoleplayer);
517: debugfile = fopen(filename,"w");
518: }
519: I_InitGraphics();
520: while(1)
521: {
522: // Frame syncronous IO operations
523: I_StartFrame();
524:
525: // Process one or more tics
526: if(singletics)
527: {
528: I_StartTic();
529: H2_ProcessEvents();
530: G_BuildTiccmd(&netcmds[consoleplayer][maketic%BACKUPTICS]);
531: if(advancedemo)
532: {
533: H2_DoAdvanceDemo();
534: }
535: G_Ticker();
536: gametic++;
537: maketic++;
538: }
539: else
540: {
541: // Will run at least one tic
542: TryRunTics();
543: }
544:
545: // Move positional sounds
546: S_UpdateSounds(players[displayplayer].mo);
547:
548: DrawAndBlit();
549: }
550: }
551:
552: //==========================================================================
553: //
554: // H2_ProcessEvents
555: //
556: // Send all the events of the given timestamp down the responder chain.
557: //
558: //==========================================================================
559:
560: void H2_ProcessEvents(void)
561: {
562: event_t *ev;
563:
564: for(; eventtail != eventhead; eventtail = (++eventtail)&(MAXEVENTS-1))
565: {
566: ev = &events[eventtail];
567: if(F_Responder(ev))
568: {
569: continue;
570: }
571: if(MN_Responder(ev))
572: {
573: continue;
574: }
575: G_Responder(ev);
576: }
577: }
578:
579: //==========================================================================
580: //
581: // H2_PostEvent
582: //
583: // Called by the I/O functions when input is detected.
584: //
585: //==========================================================================
586:
587: void H2_PostEvent(event_t *ev)
588: {
589: events[eventhead] = *ev;
590: eventhead = (++eventhead)&(MAXEVENTS-1);
591: }
592:
593: //==========================================================================
594: //
595: // DrawAndBlit
596: //
597: //==========================================================================
598:
599: static void DrawAndBlit(void)
600: {
601: // Change the view size if needed
602: if(setsizeneeded)
603: {
604: R_ExecuteSetViewSize();
605: }
606:
607: // Do buffered drawing
608: switch(gamestate)
609: {
610: case GS_LEVEL:
611: if(!gametic)
612: {
613: break;
614: }
615: if(automapactive)
616: {
617: AM_Drawer();
618: }
619: else
620: {
621: R_RenderPlayerView(&players[displayplayer]);
622: }
623: CT_Drawer();
624: UpdateState |= I_FULLVIEW;
625: SB_Drawer();
626: break;
627: case GS_INTERMISSION:
628: IN_Drawer();
629: break;
630: case GS_FINALE:
631: F_Drawer();
632: break;
633: case GS_DEMOSCREEN:
634: PageDrawer();
635: break;
636: }
637:
638: if(paused && !MenuActive && !askforquit)
639: {
640: if(!netgame)
641: {
642: V_DrawPatch(160, viewwindowy+5, W_CacheLumpName("PAUSED",
643: PU_CACHE));
644: }
645: else
646: {
647: V_DrawPatch(160, 70, W_CacheLumpName("PAUSED",
648: PU_CACHE));
649: }
650: }
651:
652: // Draw current message
653: DrawMessage();
654:
655: // Draw Menu
656: MN_Drawer();
657:
658: // Send out any new accumulation
659: NetUpdate();
660:
661: // Flush buffered stuff to screen
662: I_Update();
663: }
664:
665: //==========================================================================
666: //
667: // DrawMessage
668: //
669: //==========================================================================
670:
671: static void DrawMessage(void)
672: {
673: player_t *player;
674:
675: player = &players[consoleplayer];
676: if(player->messageTics <= 0 || !player->message)
677: { // No message
678: return;
679: }
680: if(player->yellowMessage)
681: {
682: MN_DrTextAYellow(player->message,
683: 160-MN_TextAWidth(player->message)/2, 1);
684: }
685: else
686: {
687: MN_DrTextA(player->message, 160-MN_TextAWidth(player->message)/2, 1);
688: }
689: }
690:
691: //==========================================================================
692: //
693: // H2_PageTicker
694: //
695: //==========================================================================
696:
697: void H2_PageTicker(void)
698: {
699: if(--pagetic < 0)
700: {
701: H2_AdvanceDemo();
702: }
703: }
704:
705: //==========================================================================
706: //
707: // PageDrawer
708: //
709: //==========================================================================
710:
711: static void PageDrawer(void)
712: {
713: V_DrawRawScreen(W_CacheLumpName(pagename, PU_CACHE));
714: if(demosequence == 1)
715: {
716: V_DrawPatch(4, 160, W_CacheLumpName("ADVISOR", PU_CACHE));
717: }
718: UpdateState |= I_FULLSCRN;
719: }
720:
721: //==========================================================================
722: //
723: // H2_AdvanceDemo
724: //
725: // Called after each demo or intro demosequence finishes.
726: //
727: //==========================================================================
728:
729: void H2_AdvanceDemo(void)
730: {
731: advancedemo = true;
732: }
733:
734: //==========================================================================
735: //
736: // H2_DoAdvanceDemo
737: //
738: //==========================================================================
739:
740: void H2_DoAdvanceDemo(void)
741: {
742: players[consoleplayer].playerstate = PST_LIVE; // don't reborn
743: advancedemo = false;
744: usergame = false; // can't save/end game here
745: paused = false;
746: gameaction = ga_nothing;
747: demosequence = (demosequence+1)%7;
748: switch(demosequence)
749: {
750: case 0:
751: pagetic = 280;
752: gamestate = GS_DEMOSCREEN;
753: pagename = "TITLE";
754: S_StartSongName("hexen", true);
755: break;
756: case 1:
757: pagetic = 210;
758: gamestate = GS_DEMOSCREEN;
759: pagename = "TITLE";
760: break;
761: case 2:
762: BorderNeedRefresh = true;
763: UpdateState |= I_FULLSCRN;
764: G_DeferedPlayDemo("demo1");
765: break;
766: case 3:
767: pagetic = 200;
768: gamestate = GS_DEMOSCREEN;
769: pagename = "CREDIT";
770: break;
771: case 4:
772: BorderNeedRefresh = true;
773: UpdateState |= I_FULLSCRN;
774: G_DeferedPlayDemo("demo2");
775: break;
776: case 5:
777: pagetic = 200;
778: gamestate = GS_DEMOSCREEN;
779: pagename = "CREDIT";
780: break;
781: case 6:
782: BorderNeedRefresh = true;
783: UpdateState |= I_FULLSCRN;
784: G_DeferedPlayDemo("demo3");
785: break;
786: }
787: }
788:
789: //==========================================================================
790: //
791: // H2_StartTitle
792: //
793: //==========================================================================
794:
795: void H2_StartTitle(void)
796: {
797: gameaction = ga_nothing;
798: demosequence = -1;
799: H2_AdvanceDemo();
800: }
801:
802: //==========================================================================
803: //
804: // CheckRecordFrom
805: //
806: // -recordfrom <savegame num> <demoname>
807: //
808: //==========================================================================
809:
810: static void CheckRecordFrom(void)
811: {
812: int p;
813:
814: p = M_CheckParm("-recordfrom");
815: if(!p || p > myargc-2)
816: { // Bad args
817: return;
818: }
819: G_LoadGame(atoi(myargv[p+1]));
820: G_DoLoadGame(); // Load the gameskill etc info from savegame
821: G_RecordDemo(gameskill, 1, gameepisode, gamemap, myargv[p+2]);
822: H2_GameLoop(); // Never returns
823: }
824:
825: //==========================================================================
826: //
827: // AddWADFile
828: //
829: //==========================================================================
830:
831: static void AddWADFile(char *file)
832: {
833: int i;
834: char *new;
835:
836: ST_Message("Adding external file: %s\n", file);
837: i = 0;
838: while(wadfiles[i])
839: {
840: i++;
841: }
842: new = malloc(strlen(file)+1);
843: strcpy(new, file);
844: wadfiles[i] = new;
845: }
846:
847: #ifdef __WATCOMC__
848: /*
849: void CleanExit(void)
850: {
851: union REGS regs;
852:
853: I_ShutdownKeyboard();
854: regs.x.eax = 0x3;
855: int386(0x10, ®s, ®s);
856: printf("Exited from HEXEN: Beyond Heretic.\n");
857: exit(1);
858: }
859: */
860: #endif
861:
862: //==========================================================================
863: //
864: // FixedDiv
865: //
866: //==========================================================================
867:
868: fixed_t FixedDiv(fixed_t a, fixed_t b)
869: {
870: if((abs(a)>>14) >= abs(b))
871: {
872: return((a^b)<0 ? MININT : MAXINT);
873: }
874: return(FixedDiv2(a, b));
875: }
876:
877:
878: //==========================================================================
879: //
880: // CreateSavePath
881: //
882: //==========================================================================
883:
884: static void CreateSavePath(void)
885: {
886: char creationPath[121];
887: int len;
888:
889: if(cdrom == true)
890: {
891: SavePath = "c:\\hexndata\\";
892: }
893: len = strlen(SavePath);
894: if (len >= 120) I_Error("Save path too long\n");
895: strcpy(creationPath, SavePath);
896: #ifdef __WATCOMC__
897: creationPath[len-1] = 0;
898: mkdir(creationPath);
899: #endif
900: }
901:
902: #ifdef TIMEBOMB
903: //==========================================================================
904: //
905: // DoTimeBomb
906: //
907: //==========================================================================
908:
909: static void DoTimeBomb(void)
910: {
911: #ifdef __WATCOMC__
912: time_t timeOfDay;
913: struct tm timeBuffer;
914:
915: timeOfDay = time(NULL);
916: _localtime(&timeOfDay, &timeBuffer);
917: if(timeBuffer.tm_year != TIMEBOMB_YEAR
918: || timeBuffer.tm_yday < TIMEBOMB_STARTDATE
919: || timeBuffer.tm_yday > TIMEBOMB_ENDDATE)
920: {
921: I_Error("W_InitWadfiles: Wad file doesn't have IWAD or PWAD id\n");
922: }
923:
924: printf("\n===============================================================================\n");
925: printf(" Hexen: Beyond Heretic\n\n");
926: printf(" Beta -- Do Not Distribute!\n");
927: printf(" Press any key to continue.\n");
928: printf("===============================================================================\n");
929:
930: getch();
931: printf("\n");
932: #endif
933: }
934: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.