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
