Iskhodnyy_kod_Doom
.pdf}
menuactivestate = menuactive; viewactivestate = viewactive; inhelpscreensstate = inhelpscreens; oldgamestate = wipegamestate = gamestate;
// draw pause pic if (paused)
{
if (automapactive)
y = 4;
else
y = viewwindowy+4;
V_DrawPatchDirect(viewwindowx+(scaledviewwidth-68)/2,
|
y,0,W_CacheLumpName ("M_PAUSE", PU_CACHE)); |
} |
|
// menus go directly to the screen |
|
M_Drawer (); |
// menu is drawn even on top of everything |
NetUpdate (); |
// send out any new accumulation |
// normal update |
|
if (!wipe) |
|
{ |
|
I_FinishUpdate (); |
// page flip or blit buffer |
return; |
|
} |
|
// wipe update
wipe_EndScreen(0, 0, SCREENWIDTH, SCREENHEIGHT);
wipestart = I_GetTime () - 1; |
|
||
do |
|
|
|
{ |
|
|
|
|
do |
|
|
|
{ |
|
|
|
nowtime = I_GetTime (); |
|
|
|
tics = nowtime - wipestart; |
|
|
|
} while (!tics); |
|
|
|
wipestart = nowtime; |
|
|
|
done = wipe_ScreenWipe(wipe_Melt |
|
|
|
|
, 0, 0, SCREENWIDTH, SCREENHEIGHT, tics); |
|
|
I_UpdateNoBlit (); |
|
|
|
M_Drawer (); |
|
// menu is drawn even on top of wipes |
|
I_FinishUpdate (); |
// page flip or blit buffer |
|
} while (!done); |
|
|
|
} |
|
|
|
// |
|
|
|
// D_DoomLoop |
|
|
|
// |
|
|
|
extern |
boolean |
demorecording; |
|
void D_DoomLoop (void)
{
if (demorecording) G_BeginRecording ();
71
if (M_CheckParm ("-debugfile"))
{
char filename[20];
sprintf (filename,"debug%i.txt",consoleplayer); printf ("debug output to: %s\n",filename); debugfile = fopen (filename,"w");
}
I_InitGraphics ();
while (1)
{
//frame syncronous IO operations I_StartFrame ();
//process one or more tics
if (singletics)
{
I_StartTic ();
D_ProcessEvents ();
G_BuildTiccmd (&netcmds[consoleplayer][maketic%BACKUPTICS]); if (advancedemo)
D_DoAdvanceDemo ();
M_Ticker ();
G_Ticker (); gametic++; maketic++;
}
else
{
TryRunTics (); // will run at least one tic
}
S_UpdateSounds (players[consoleplayer].mo);// move positional sounds
// Update display, next frame, with current state. D_Display ();
#ifndef SNDSERV
// Sound mixing for the buffer is snychronous. I_UpdateSound();
#endif
//Synchronous sound output is explicitly called. #ifndef SNDINTR
//Update sound output.
|
I_SubmitSound(); |
#endif |
|
|
} |
} |
|
// |
|
// |
DEMO LOOP |
// |
|
int |
demosequence; |
int |
pagetic; |
char |
*pagename; |
//
//D_PageTicker
//Handles timing for warped projection
void D_PageTicker (void)
72
{
if (--pagetic < 0) D_AdvanceDemo ();
}
//
// D_PageDrawer
//
void D_PageDrawer (void)
{
V_DrawPatch (0,0, 0, W_CacheLumpName(pagename, PU_CACHE));
}
//
//D_AdvanceDemo
//Called after each demo or intro demosequence finishes
void D_AdvanceDemo (void)
{
advancedemo = true;
}
//
//This cycles through the demo sequences.
//FIXME - version dependend demo numbers?
void D_DoAdvanceDemo (void)
{
players[consoleplayer].playerstate = PST_LIVE; // not reborn
advancedemo = false; |
|
||
usergame |
= |
false; |
// no save / end game here |
paused = |
false; |
|
|
gameaction |
= ga_nothing; |
|
if ( gamemode == retail ) demosequence = (demosequence+1)%7;
else
demosequence = (demosequence+1)%6;
switch (demosequence)
{
case 0:
if ( gamemode == commercial ) pagetic = 35 * 11;
else
pagetic = 170; gamestate = GS_DEMOSCREEN; pagename = "TITLEPIC";
if ( gamemode == commercial ) S_StartMusic(mus_dm2ttl);
else
S_StartMusic (mus_intro); break;
case 1:
G_DeferedPlayDemo ("demo1"); break;
case 2:
pagetic = 200;
gamestate = GS_DEMOSCREEN; pagename = "CREDIT"; break;
73
case 3:
G_DeferedPlayDemo ("demo2"); break;
case 4:
gamestate = GS_DEMOSCREEN; if ( gamemode == commercial)
{
pagetic = 35 * 11; pagename = "TITLEPIC"; S_StartMusic(mus_dm2ttl);
}
else
{
pagetic = 200;
if ( gamemode == retail ) pagename = "CREDIT";
else
pagename = "HELP2";
}
break; case 5:
G_DeferedPlayDemo ("demo3"); break;
// THE DEFINITIVE DOOM Special Edition demo case 6:
G_DeferedPlayDemo ("demo4"); break;
}
}
//
//D_StartTitle
void D_StartTitle (void)
{
gameaction = ga_nothing; demosequence = -1; D_AdvanceDemo ();
}
//print title for every printed line
char |
title[128]; |
//
// D_AddFile
//
void D_AddFile (char *file)
{
int |
numwadfiles; |
char |
*newfile; |
for (numwadfiles = 0 ; wadfiles[numwadfiles] ; numwadfiles++)
;
newfile = malloc (strlen(file)+1); strcpy (newfile, file);
74
wadfiles[numwadfiles] = newfile;
}
//
//IdentifyVersion
//Checks availability of IWAD files by name,
//to determine whether registered/commercial features
//should be executed (notably loading PWAD’s).
//
void IdentifyVersion (void)
{
char* |
doom1wad; |
char* |
doomwad; |
char* |
doomuwad; |
char* |
doom2wad; |
char* |
doom2fwad; |
char* |
plutoniawad; |
char* |
tntwad; |
#ifdef NORMALUNIX char *home;
char *doomwaddir;
doomwaddir = getenv("DOOMWADDIR"); if (!doomwaddir)
doomwaddir = ".";
// Commercial.
doom2wad = malloc(strlen(doomwaddir)+1+9+1); sprintf(doom2wad, "%s/doom2.wad", doomwaddir);
// Retail.
doomuwad = malloc(strlen(doomwaddir)+1+8+1); sprintf(doomuwad, "%s/doomu.wad", doomwaddir);
// Registered.
doomwad = malloc(strlen(doomwaddir)+1+8+1); sprintf(doomwad, "%s/doom.wad", doomwaddir);
// Shareware.
doom1wad = malloc(strlen(doomwaddir)+1+9+1); sprintf(doom1wad, "%s/doom1.wad", doomwaddir);
//Bug, dear Shawn.
//Insufficient malloc, caused spurious realloc errors. plutoniawad = malloc(strlen(doomwaddir)+1+/*9*/12+1); sprintf(plutoniawad, "%s/plutonia.wad", doomwaddir);
tntwad = malloc(strlen(doomwaddir)+1+9+1); sprintf(tntwad, "%s/tnt.wad", doomwaddir);
// French stuff.
doom2fwad = malloc(strlen(doomwaddir)+1+10+1); sprintf(doom2fwad, "%s/doom2f.wad", doomwaddir);
home = getenv("HOME"); if (!home)
I_Error("Please set $HOME to your home directory"); sprintf(basedefault, "%s/.doomrc", home);
#endif
if (M_CheckParm ("-shdev"))
{
75
gamemode = shareware; devparm = true;
D_AddFile (DEVDATA"doom1.wad");
D_AddFile (DEVMAPS"data_se/texture1.lmp"); D_AddFile (DEVMAPS"data_se/pnames.lmp"); strcpy (basedefault,DEVDATA"default.cfg"); return;
}
if (M_CheckParm ("-regdev"))
{
gamemode = registered; devparm = true;
D_AddFile (DEVDATA"doom.wad");
D_AddFile (DEVMAPS"data_se/texture1.lmp"); D_AddFile (DEVMAPS"data_se/texture2.lmp"); D_AddFile (DEVMAPS"data_se/pnames.lmp"); strcpy (basedefault,DEVDATA"default.cfg"); return;
}
if (M_CheckParm ("-comdev"))
{
gamemode = commercial; devparm = true;
/* I don’t bother if(plutonia)
D_AddFile (DEVDATA"plutonia.wad");
else if(tnt)
D_AddFile (DEVDATA"tnt.wad"); else*/
D_AddFile (DEVDATA"doom2.wad");
D_AddFile (DEVMAPS"cdata/texture1.lmp"); D_AddFile (DEVMAPS"cdata/pnames.lmp"); strcpy (basedefault,DEVDATA"default.cfg"); return;
}
if ( !access (doom2fwad,R_OK) )
{
gamemode = commercial;
//C’est ridicule!
//Let’s handle languages in config files, okay? language = french;
printf("French version\n"); D_AddFile (doom2fwad); return;
}
if ( !access (doom2wad,R_OK) )
{
gamemode = commercial; D_AddFile (doom2wad); return;
}
if ( !access (plutoniawad, R_OK ) )
{
gamemode = commercial; D_AddFile (plutoniawad); return;
}
if ( !access ( tntwad, R_OK ) )
76
{
gamemode = commercial; D_AddFile (tntwad); return;
}
if ( !access (doomuwad,R_OK) )
{
gamemode = retail; D_AddFile (doomuwad); return;
}
if ( !access (doomwad,R_OK) )
{
gamemode = registered; D_AddFile (doomwad); return;
}
if ( !access (doom1wad,R_OK) )
{
gamemode = shareware; D_AddFile (doom1wad); return;
}
printf("Game mode indeterminate.\n"); gamemode = indetermined;
// We don’t abort. Let’s see what the PWAD contains. //exit(1);
//I_Error ("Game mode indeterminate\n");
}
//
// Find a Response File
//
void FindResponseFile (void)
{ |
|
|
int |
i; |
|
#define MAXARGVS |
100 |
|
for (i = 1;i < myargc;i++) |
||
if (myargv[i][0] == |
’@’) |
|
{ |
|
|
FILE * |
|
handle; |
int |
|
size; |
int |
|
k; |
int |
|
index; |
int |
|
indexinfile; |
char |
*infile; |
|
char |
*file; |
|
char |
*moreargs[20]; |
|
char |
*firstargv; |
// READ THE RESPONSE FILE INTO MEMORY handle = fopen (&myargv[i][1],"rb"); if (!handle)
{
printf ("\nNo such response file!"); exit(1);
}
printf("Found response file %s!\n",&myargv[i][1]); fseek (handle,0,SEEK_END);
77
size = ftell(handle); fseek (handle,0,SEEK_SET); file = malloc (size);
fread (file,size,1,handle); fclose (handle);
// KEEP ALL CMDLINE ARGS FOLLOWING @RESPONSEFILE ARG for (index = 0,k = i+1; k < myargc; k++)
moreargs[index++] = myargv[k];
firstargv = myargv[0];
myargv = malloc(sizeof(char *)*MAXARGVS); memset(myargv,0,sizeof(char *)*MAXARGVS); myargv[0] = firstargv;
infile = file; indexinfile = k = 0;
indexinfile++; // SKIP PAST ARGV[0] (KEEP IT) do
{
myargv[indexinfile++] = infile+k; while(k < size &&
((*(infile+k)>= ’ ’+1) && (*(infile+k)<=’z’))) k++;
*(infile+k) = 0; while(k < size &&
((*(infile+k)<= ’ ’) || (*(infile+k)>’z’))) k++;
} while(k < size);
for (k = 0;k < index;k++) myargv[indexinfile++] = moreargs[k];
myargc = indexinfile;
// DISPLAY ARGS
printf("%d command-line args:\n",myargc); for (k=1;k<myargc;k++)
printf("%s\n",myargv[k]);
break;
}
}
//
// D_DoomMain
//
void D_DoomMain (void)
{
int |
p; |
char |
file[256]; |
FindResponseFile ();
IdentifyVersion ();
setbuf (stdout, NULL); modifiedgame = false;
nomonsters = M_CheckParm ("-nomonsters"); respawnparm = M_CheckParm ("-respawn"); fastparm = M_CheckParm ("-fast");
devparm = M_CheckParm ("-devparm"); if (M_CheckParm ("-altdeath"))
deathmatch = 2;
78
else if (M_CheckParm ("-deathmatch"))
deathmatch = 1; |
|
switch ( gamemode ) |
|
{ |
|
case retail: |
|
sprintf (title, |
|
" |
" |
"The Ultimate DOOM Startup v%i.%i" |
|
" |
", |
VERSION/100,VERSION%100); |
|
break; |
|
case shareware: |
|
sprintf (title, |
|
" |
" |
"DOOM Shareware Startup v%i.%i" |
|
" |
", |
VERSION/100,VERSION%100); |
|
break; |
|
case registered: |
|
sprintf (title, |
|
" |
" |
"DOOM Registered Startup v%i.%i" |
|
" |
", |
VERSION/100,VERSION%100); |
|
break; |
|
case commercial: |
|
sprintf (title, |
|
" |
" |
"DOOM 2: Hell on Earth v%i.%i" |
|
" |
", |
VERSION/100,VERSION%100); |
|
break; |
|
/*FIXME |
|
case pack_plut: |
|
sprintf (title, |
|
" |
" |
"DOOM 2: Plutonia Experiment v%i.%i" |
|
" |
", |
VERSION/100,VERSION%100); |
|
break; |
|
case pack_tnt: |
|
sprintf (title, |
|
" |
" |
"DOOM 2: TNT - Evilution v%i.%i" |
|
" |
", |
VERSION/100,VERSION%100); |
|
break; |
|
*/ |
|
default: |
|
sprintf (title, |
|
" |
" |
"Public DOOM - v%i.%i" |
|
" |
", |
VERSION/100,VERSION%100);
break;
}
printf ("%s\n",title);
if (devparm) printf(D_DEVSTR);
if (M_CheckParm("-cdrom"))
{
79
printf(D_CDROM); mkdir("c:\\doomdata",0);
strcpy (basedefault,"c:/doomdata/default.cfg");
}
// turbo option
if ( (p=M_CheckParm ("-turbo")) )
{ |
|
int |
scale = 200; |
extern int forwardmove[2]; |
|
extern int sidemove[2]; |
|
if (p<myargc-1) |
|
|
scale = atoi (myargv[p+1]); |
if (scale < 10) |
scale = 10; if (scale > 400)
scale = 400;
printf ("turbo scale: %i%%\n",scale); forwardmove[0] = forwardmove[0]*scale/100; forwardmove[1] = forwardmove[1]*scale/100; sidemove[0] = sidemove[0]*scale/100; sidemove[1] = sidemove[1]*scale/100;
}
//add any files specified on the command line with -file wadfile
//to the wad list
//
//convenience hack to allow -wart e m to add a wad file
//prepend a tilde to the filename so wadfile will be reloadable p = M_CheckParm ("-wart");
if (p)
{
myargv[p][4] = ’p’; // big hack, change to -warp
// Map name handling. switch (gamemode )
{
case shareware: case retail: case registered:
sprintf (file,"~"DEVMAPS"E%cM%c.wad", myargv[p+1][0], myargv[p+2][0]);
printf("Warping to Episode %s, Map %s.\n", myargv[p+1],myargv[p+2]);
break;
case commercial: default:
p = atoi (myargv[p+1]); if (p<10)
sprintf (file,"~"DEVMAPS"cdata/map0%i.wad", p); else
sprintf (file,"~"DEVMAPS"cdata/map%i.wad", p); break;
}
D_AddFile (file);
}
p = M_CheckParm ("-file"); if (p)
{
//the parms after p are wadfile/lump names,
//until end of parms or another - preceded parm
modifiedgame = true; |
// homebrew levels |
80