📄 h2_main.c
字号:
for (; *c; c++)
{
x = (*c & 223) - 16;
if (x == -3)
{
mul = -mul;
}
else if (x == 72 && r == 10)
{
n -= (r=n);
if (!r) r=16;
if (r<2 || r>36) return -1;
}
else
{
if (x>10) x-=39;
if (x >= r) return -1;
n = (n*r) + x;
}
}
return(mul*n);
}
static void ExecOptionMAXZONE(char **args, int tag)
{
int size;
size = superatol(args[1]);
if (size < MINIMUM_HEAP_SIZE) size = MINIMUM_HEAP_SIZE;
if (size > MAXIMUM_HEAP_SIZE) size = MAXIMUM_HEAP_SIZE;
maxzone = size;
}
//==========================================================================
//
// H2_GameLoop
//
//==========================================================================
void H2_GameLoop(void)
{
if(M_CheckParm("-debugfile"))
{
char filename[20];
sprintf(filename, "debug%i.txt", consoleplayer);
debugfile = fopen(filename,"w");
}
I_InitGraphics();
while(1)
{
// Frame syncronous IO operations
I_StartFrame();
// Process one or more tics
if(singletics)
{
I_StartTic();
H2_ProcessEvents();
G_BuildTiccmd(&netcmds[consoleplayer][maketic%BACKUPTICS]);
if(advancedemo)
{
H2_DoAdvanceDemo();
}
G_Ticker();
gametic++;
maketic++;
}
else
{
// Will run at least one tic
TryRunTics();
}
// Move positional sounds
S_UpdateSounds(players[displayplayer].mo);
DrawAndBlit();
}
}
//==========================================================================
//
// H2_ProcessEvents
//
// Send all the events of the given timestamp down the responder chain.
//
//==========================================================================
void H2_ProcessEvents(void)
{
event_t *ev;
for(; eventtail != eventhead; eventtail = (++eventtail)&(MAXEVENTS-1))
{
ev = &events[eventtail];
if(F_Responder(ev))
{
continue;
}
if(MN_Responder(ev))
{
continue;
}
G_Responder(ev);
}
}
//==========================================================================
//
// H2_PostEvent
//
// Called by the I/O functions when input is detected.
//
//==========================================================================
void H2_PostEvent(event_t *ev)
{
events[eventhead] = *ev;
eventhead = (++eventhead)&(MAXEVENTS-1);
}
//==========================================================================
//
// DrawAndBlit
//
//==========================================================================
static void DrawAndBlit(void)
{
// Change the view size if needed
if(setsizeneeded)
{
R_ExecuteSetViewSize();
}
// Do buffered drawing
switch(gamestate)
{
case GS_LEVEL:
if(!gametic)
{
break;
}
if(automapactive)
{
AM_Drawer();
}
else
{
R_RenderPlayerView(&players[displayplayer]);
}
CT_Drawer();
UpdateState |= I_FULLVIEW;
SB_Drawer();
break;
case GS_INTERMISSION:
IN_Drawer();
break;
case GS_FINALE:
F_Drawer();
break;
case GS_DEMOSCREEN:
PageDrawer();
break;
}
if(paused && !MenuActive && !askforquit)
{
if(!netgame)
{
V_DrawPatch(160, viewwindowy+5, W_CacheLumpName("PAUSED",
PU_CACHE));
}
else
{
V_DrawPatch(160, 70, W_CacheLumpName("PAUSED",
PU_CACHE));
}
}
// Draw current message
DrawMessage();
// Draw Menu
MN_Drawer();
// Send out any new accumulation
NetUpdate();
// Flush buffered stuff to screen
I_Update();
}
//==========================================================================
//
// DrawMessage
//
//==========================================================================
static void DrawMessage(void)
{
player_t *player;
player = &players[consoleplayer];
if(player->messageTics <= 0 || !player->message)
{ // No message
return;
}
if(player->yellowMessage)
{
MN_DrTextAYellow(player->message,
160-MN_TextAWidth(player->message)/2, 1);
}
else
{
MN_DrTextA(player->message, 160-MN_TextAWidth(player->message)/2, 1);
}
}
//==========================================================================
//
// H2_PageTicker
//
//==========================================================================
void H2_PageTicker(void)
{
if(--pagetic < 0)
{
H2_AdvanceDemo();
}
}
//==========================================================================
//
// PageDrawer
//
//==========================================================================
static void PageDrawer(void)
{
V_DrawRawScreen(W_CacheLumpName(pagename, PU_CACHE));
if(demosequence == 1)
{
V_DrawPatch(4, 160, W_CacheLumpName("ADVISOR", PU_CACHE));
}
UpdateState |= I_FULLSCRN;
}
//==========================================================================
//
// H2_AdvanceDemo
//
// Called after each demo or intro demosequence finishes.
//
//==========================================================================
void H2_AdvanceDemo(void)
{
advancedemo = true;
}
//==========================================================================
//
// H2_DoAdvanceDemo
//
//==========================================================================
void H2_DoAdvanceDemo(void)
{
players[consoleplayer].playerstate = PST_LIVE; // don't reborn
advancedemo = false;
usergame = false; // can't save/end game here
paused = false;
gameaction = ga_nothing;
demosequence = (demosequence+1)%7;
switch(demosequence)
{
case 0:
pagetic = 280;
gamestate = GS_DEMOSCREEN;
pagename = "TITLE";
S_StartSongName("hexen", true);
break;
case 1:
pagetic = 210;
gamestate = GS_DEMOSCREEN;
pagename = "TITLE";
break;
case 2:
BorderNeedRefresh = true;
UpdateState |= I_FULLSCRN;
G_DeferedPlayDemo("demo1");
break;
case 3:
pagetic = 200;
gamestate = GS_DEMOSCREEN;
pagename = "CREDIT";
break;
case 4:
BorderNeedRefresh = true;
UpdateState |= I_FULLSCRN;
G_DeferedPlayDemo("demo2");
break;
case 5:
pagetic = 200;
gamestate = GS_DEMOSCREEN;
pagename = "CREDIT";
break;
case 6:
BorderNeedRefresh = true;
UpdateState |= I_FULLSCRN;
G_DeferedPlayDemo("demo3");
break;
}
}
//==========================================================================
//
// H2_StartTitle
//
//==========================================================================
void H2_StartTitle(void)
{
gameaction = ga_nothing;
demosequence = -1;
H2_AdvanceDemo();
}
//==========================================================================
//
// CheckRecordFrom
//
// -recordfrom <savegame num> <demoname>
//
//==========================================================================
static void CheckRecordFrom(void)
{
int p;
p = M_CheckParm("-recordfrom");
if(!p || p > myargc-2)
{ // Bad args
return;
}
G_LoadGame(atoi(myargv[p+1]));
G_DoLoadGame(); // Load the gameskill etc info from savegame
G_RecordDemo(gameskill, 1, gameepisode, gamemap, myargv[p+2]);
H2_GameLoop(); // Never returns
}
//==========================================================================
//
// AddWADFile
//
//==========================================================================
static void AddWADFile(char *file)
{
int i;
char *new;
ST_Message("Adding external file: %s\n", file);
i = 0;
while(wadfiles[i])
{
i++;
}
new = malloc(strlen(file)+1);
strcpy(new, file);
wadfiles[i] = new;
}
#ifdef __WATCOMC__
/*
void CleanExit(void)
{
union REGS regs;
I_ShutdownKeyboard();
regs.x.eax = 0x3;
int386(0x10, ®s, ®s);
printf("Exited from HEXEN: Beyond Heretic.\n");
exit(1);
}
*/
#endif
//==========================================================================
//
// FixedDiv
//
//==========================================================================
fixed_t FixedDiv(fixed_t a, fixed_t b)
{
if((abs(a)>>14) >= abs(b))
{
return((a^b)<0 ? MININT : MAXINT);
}
return(FixedDiv2(a, b));
}
//==========================================================================
//
// CreateSavePath
//
//==========================================================================
static void CreateSavePath(void)
{
char creationPath[121];
int len;
if(cdrom == true)
{
SavePath = "c:\\hexndata\\";
}
len = strlen(SavePath);
if (len >= 120) I_Error("Save path too long\n");
strcpy(creationPath, SavePath);
#ifdef __WATCOMC__
creationPath[len-1] = 0;
mkdir(creationPath);
#endif
}
#ifdef TIMEBOMB
//==========================================================================
//
// DoTimeBomb
//
//==========================================================================
static void DoTimeBomb(void)
{
#ifdef __WATCOMC__
time_t timeOfDay;
struct tm timeBuffer;
timeOfDay = time(NULL);
_localtime(&timeOfDay, &timeBuffer);
if(timeBuffer.tm_year != TIMEBOMB_YEAR
|| timeBuffer.tm_yday < TIMEBOMB_STARTDATE
|| timeBuffer.tm_yday > TIMEBOMB_ENDDATE)
{
I_Error("W_InitWadfiles: Wad file doesn't have IWAD or PWAD id\n");
}
printf("\n===============================================================================\n");
printf(" Hexen: Beyond Heretic\n\n");
printf(" Beta -- Do Not Distribute!\n");
printf(" Press any key to continue.\n");
printf("===============================================================================\n");
getch();
printf("\n");
#endif
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -