Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Iskhodnyy_kod_Doom

.pdf
Скачиваний:
7
Добавлен:
13.02.2015
Размер:
1.01 Mб
Скачать

}

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]