?? d_main.c
字號:
// DQ end addition
// original
//int i;
//__int64 *d;
// DQ start addition
Buffer = RenderBuffer->Buffer;
YLookup = RenderBuffer->YLookup;
for (y = 0; y < SCREENHEIGHT; y++)
{
pdwDest = (DWORD *)(Buffer + YLookup[y]);
memset(pdwDest, 0, SCREENWIDTH/sizeof(DWORD));
}
// DQ end addition
// original
//d = (__int64 *)RenderBuffer/*DQ screens[0]*/;
//for (i = 0; i < ((SCREENWIDTH*SCREENHEIGHT)/8); i++)
// d[i] = 0;
V_DrawPatch (((SCREENWIDTH-320)/2),
((SCREENHEIGHT-200)/2), RenderBuffer/*DQ 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;
//sprintf(MsgText, "Changing screen to %d...\n", demosequence);
//WriteDebug(MsgText);
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;
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);
wadfiles[numwadfiles] = newfile;
}
#define R_OK 4
//
// 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. // Bug here too...
doomuwad = malloc(strlen(doomwaddir)+1+9+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);
/* Don't HAVE home directory on a single user OS...
home = getenv("HOME");
if (!home)
I_Error("Please set $HOME to your home directory");
sprintf(basedefault, "%s/.doomrc", home);
#endif
*/
if (M_CheckParm ("-shdev"))
{
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;
/*
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");
WriteDebug("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;
plutonia = TRUE;
tnt = FALSE;
D_AddFile (plutoniawad);
return;
}
if ( !access ( tntwad, R_OK ) )
{
gamemode = commercial;
tnt = TRUE;
plutonia = FALSE;
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");
WriteDebug("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);
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;
else if (M_CheckParm ("-deathmatch"))
deathmatch = 1;
if (devparm)
// printf(D_DEVSTR);
WriteDebug(D_DEVSTR);
if (M_CheckParm("-cdrom"))
{
printf(D_CDROM);
//mkdir("c:\\doomdata",0); // What's the ",0" for? Oh yeah, permissions...
mkdir("c:\\doomdata");
strcpy (basedefault,"c:/doomdata/default.cfg");
}
// turbo option
if ( (p=M_CheckParm ("-turbo")) )
{
int scale = 200;
extern int forwardmove[2];
extern int sidemove[2];
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -