📄 g_game.c
字号:
return;
}
}
// no good spot, so the player will probably get stuck
P_SpawnPlayer (&playerstarts[0][playernum]);
}
//==========================================================================//// G_DoReborn////==========================================================================void G_DoReborn(int playernum){ int i; boolean oldWeaponowned[NUMWEAPONS]; int oldKeys; int oldPieces; boolean foundSpot; int bestWeapon; if(G_CheckDemoStatus()) { return; } if(!netgame) { if(SV_RebornSlotAvailable()) { // Use the reborn code if the slot is available gameaction = ga_singlereborn; } else { // Start a new game if there's no reborn info gameaction = ga_newgame; } } else { // Net-game players[playernum].mo->player = NULL; // Dissassociate the corpse if(deathmatch) { // Spawn at random spot if in death match G_DeathMatchSpawnPlayer(playernum); return; } // Cooperative net-play, retain keys and weapons oldKeys = players[playernum].keys; oldPieces = players[playernum].pieces; for(i = 0; i < NUMWEAPONS; i++) { oldWeaponowned[i] = players[playernum].weaponowned[i]; } foundSpot = false; if(G_CheckSpot(playernum, &playerstarts[RebornPosition][playernum])) { // Appropriate player start spot is open P_SpawnPlayer(&playerstarts[RebornPosition][playernum]); foundSpot = true; } else { // Try to spawn at one of the other player start spots for(i = 0; i < MAXPLAYERS; i++) { if(G_CheckSpot(playernum, &playerstarts[RebornPosition][i])) { // Found an open start spot // Fake as other player playerstarts[RebornPosition][i].type = playernum+1; P_SpawnPlayer(&playerstarts[RebornPosition][i]); // Restore proper player type playerstarts[RebornPosition][i].type = i+1; foundSpot = true; break; } } } if(foundSpot == false) { // Player's going to be inside something P_SpawnPlayer(&playerstarts[RebornPosition][playernum]); } // Restore keys and weapons players[playernum].keys = oldKeys; players[playernum].pieces = oldPieces; for(bestWeapon = 0, i = 0; i < NUMWEAPONS; i++) { if(oldWeaponowned[i]) { bestWeapon = i; players[playernum].weaponowned[i] = true; } } players[playernum].mana[MANA_1] = 25; players[playernum].mana[MANA_2] = 25; if(bestWeapon) { // Bring up the best weapon players[playernum].pendingweapon = bestWeapon; } }}void G_ScreenShot (void)
{
gameaction = ga_screenshot;
}
//==========================================================================//// G_StartNewInit////==========================================================================void G_StartNewInit(void){ SV_InitBaseSlot(); SV_ClearRebornSlot(); P_ACSInitNewGame(); // Default the player start spot group to 0 RebornPosition = 0;}//==========================================================================//// G_StartNewGame////==========================================================================void G_StartNewGame(skill_t skill){ int realMap; G_StartNewInit(); realMap = P_TranslateMap(1); if(realMap == -1) { realMap = 1; } G_InitNew(TempSkill, 1, realMap);}//==========================================================================//// G_TeleportNewMap//// Only called by the warp cheat code. Works just like normal map to map// teleporting, but doesn't do any interlude stuff.////==========================================================================void G_TeleportNewMap(int map, int position){ gameaction = ga_leavemap; LeaveMap = map; LeavePosition = position;}//==========================================================================//// G_DoTeleportNewMap////==========================================================================void G_DoTeleportNewMap(void){ SV_MapTeleport(LeaveMap, LeavePosition); gamestate = GS_LEVEL; gameaction = ga_nothing; RebornPosition = LeavePosition;}/*boolean secretexit;void G_ExitLevel (void){ secretexit = false; gameaction = ga_completed;}void G_SecretExitLevel (void){ secretexit = true; gameaction = ga_completed;}*///==========================================================================
//
// G_Completed//// Starts intermission routine, which is used only during hub exits,// and DeathMatch games.//==========================================================================
void G_Completed(int map, int position){ gameaction = ga_completed; LeaveMap = map; LeavePosition = position;}void G_DoCompleted(void){ int i; gameaction = ga_nothing; if(G_CheckDemoStatus()) { return; } for(i = 0; i < MAXPLAYERS; i++) { if(playeringame[i]) { G_PlayerExitMap(i); } } if(LeaveMap == -1 && LeavePosition == -1) { gameaction = ga_victory; return; } else { gamestate = GS_INTERMISSION; IN_Start(); }/* int i; static int afterSecret[3] = { 7, 5, 5 }; gameaction = ga_nothing; if(G_CheckDemoStatus()) { return; } for(i = 0; i < MAXPLAYERS; i++) { if(playeringame[i]) { G_PlayerFinishLevel(i); } } prevmap = gamemap; if(secretexit == true) { gamemap = 9; } else if(gamemap == 9) { // Finished secret level gamemap = afterSecret[gameepisode-1]; } else if(gamemap == 8) { gameaction = ga_victory; return; } else { gamemap++; } gamestate = GS_INTERMISSION; IN_Start();*/}//============================================================================//// G_WorldDone////============================================================================void G_WorldDone(void){ gameaction = ga_worlddone;}//============================================================================//// G_DoWorldDone////============================================================================void G_DoWorldDone(void){ gamestate = GS_LEVEL; G_DoLoadLevel(); gameaction = ga_nothing; viewactive = true;}//==========================================================================//// G_DoSingleReborn//// Called by G_Ticker based on gameaction. Loads a game from the reborn// save slot.////==========================================================================void G_DoSingleReborn(void){ gameaction = ga_nothing; SV_LoadGame(SV_GetRebornSlot()); SB_SetClassData();}//==========================================================================//// G_LoadGame//// Can be called by the startup code or the menu task.////==========================================================================static int GameLoadSlot;void G_LoadGame(int slot){ GameLoadSlot = slot; gameaction = ga_loadgame;}//==========================================================================//// G_DoLoadGame//// Called by G_Ticker based on gameaction.////==========================================================================void G_DoLoadGame(void){ gameaction = ga_nothing; SV_LoadGame(GameLoadSlot); if(!netgame) { // Copy the base slot to the reborn slot SV_UpdateRebornSlot(); } SB_SetClassData();}//==========================================================================//// G_SaveGame//// Called by the menu task. <description> is a 24 byte text string.////==========================================================================void G_SaveGame(int slot, char *description){ savegameslot = slot; strcpy(savedescription, description); sendsave = true;}//==========================================================================//// G_DoSaveGame//// Called by G_Ticker based on gameaction.////==========================================================================void G_DoSaveGame(void){ SV_SaveGame(savegameslot, savedescription); gameaction = ga_nothing; savedescription[0] = 0; P_SetMessage(&players[consoleplayer], TXT_GAMESAVED, true);}//==========================================================================//// G_DeferredNewGame////==========================================================================void G_DeferredNewGame(skill_t skill){ TempSkill = skill; gameaction = ga_newgame;}//==========================================================================//// G_DoNewGame////==========================================================================void G_DoNewGame(void){ G_StartNewGame(TempSkill); gameaction = ga_nothing;}/*
====================
=
= G_InitNew
=
= Can be called by the startup code or the menu task
= consoleplayer, displayplayer, playeringame[] should be set
====================
*/void G_DeferedInitNew(skill_t skill, int episode, int map){ TempSkill = skill; TempEpisode = episode; TempMap = map; gameaction = ga_initnew;}void G_DoInitNew(void){ SV_InitBaseSlot(); G_InitNew(TempSkill, TempEpisode, TempMap); gameaction = ga_nothing;}void G_InitNew(skill_t skill, int episode, int map){ int i; if(paused) { paused = false; S_ResumeSound(); } if(skill < sk_baby) { skill = sk_baby; } if(skill > sk_nightmare) { skill = sk_nightmare; } if(map < 1) { map = 1; } if(map > 99) { map = 99; } M_ClearRandom(); // Force players to be initialized upon first level load for(i = 0; i < MAXPLAYERS; i++) { players[i].playerstate = PST_REBORN; players[i].worldTimer = 0; } // Set up a bunch of globals usergame = true; // will be set false if a demo paused = false; demorecording = false; demoplayback = false; viewactive = true; gameepisode = episode; gamemap = map; gameskill = skill; BorderNeedRefresh = true; // Initialize the sky R_InitSky(map); // Give one null ticcmd_t //gametic = 0; //maketic = 1; //for (i=0 ; i<MAXPLAYERS ; i++) // nettics[i] = 1; // one null event for this gametic //memset (localcmds,0,sizeof(localcmds)); //memset (netcmds,0,sizeof(netcmds)); G_DoLoadLevel();}/*
===============================================================================
DEMO RECORDING
===============================================================================
*/
#define DEMOMARKER 0x80
void G_ReadDemoTiccmd (ticcmd_t *cmd)
{
if (*demo_p == DEMOMARKER)
{ // end of demo data stream
G_CheckDemoStatus ();
return;
}
cmd->forwardmove = ((signed char)*demo_p++);
cmd->sidemove = ((signed char)*demo_p++);
cmd->angleturn = ((unsigned char)*demo_p++)<<8;
cmd->buttons = (unsigned char)*demo_p++; cmd->lookfly = (unsigned char)*demo_p++; cmd->arti = (unsigned char)*demo_p++;}
void G_WriteDemoTiccmd (ticcmd_t *cmd)
{
if (gamekeydown['q']) // press q to end demo recording
G_CheckDemoStatus ();
*demo_p++ = cmd->forwardmove; *demo_p++ = cmd->sidemove; *demo_p++ = cmd->angleturn>>8; *demo_p++ = cmd->buttons; *demo_p++ = cmd->lookfly; *demo_p++ = cmd->arti; demo_p -= 6;
G_ReadDemoTiccmd (cmd); // make SURE it is exactly the same
}
/*
===================
=
= G_RecordDemo
=
===================
*/
void G_RecordDemo (skill_t skill, int numplayers, int episode, int map, char *name)
{
int i;
G_InitNew (skill, episode, map);
usergame = false;
strcpy (demoname, name);
strcat (demoname, ".lmp");
demobuffer = demo_p = Z_Malloc (0x20000,PU_STATIC,NULL);
*demo_p++ = skill;
*demo_p++ = episode;
*demo_p++ = map;
for (i=0 ; i<MAXPLAYERS ; i++) { *demo_p++ = playeringame[i];
*demo_p++ = PlayerClass[i]; }
demorecording = true;
}
/*
===================
=
= G_PlayDemo
=
===================
*/
char *defdemoname;
void G_DeferedPlayDemo (char *name)
{
defdemoname = name;
gameaction = ga_playdemo;
}
void G_DoPlayDemo (void)
{
skill_t skill;
int i, episode, map;
gameaction = ga_nothing;
demobuffer = demo_p = W_CacheLumpName (defdemoname, PU_STATIC);
skill = *demo_p++;
episode = *demo_p++;
map = *demo_p++;
for (i=0 ; i<MAXPLAYERS ; i++) { playeringame[i] = *demo_p++;
PlayerClass[i] = *demo_p++; } // Initialize world info, etc. G_StartNewInit(); precache = false; // don't spend a lot of time in loadlevel
G_InitNew (skill, episode, map);
precache = true;
usergame = false;
demoplayback = true;
}
/*
===================
=
= G_TimeDemo
=
===================
*/
void G_TimeDemo (char *name)
{
skill_t skill;
int episode, map;
demobuffer = demo_p = W_CacheLumpName (name, PU_STATIC);
skill = *demo_p++;
episode = *demo_p++;
map = *demo_p++;
G_InitNew (skill, episode, map);
usergame = false;
demoplayback = true;
timingdemo = true;
singletics = true;
}
/*
===================
=
= G_CheckDemoStatus
=
= Called after a death or level completion to allow demos to be cleaned up
= Returns true if a new demo loop action will take place
===================
*/
boolean G_CheckDemoStatus (void)
{
int endtime;
if (timingdemo)
{
endtime = I_GetTime ();
I_Error ("timed %i gametics in %i realtics",gametic
, endtime-starttime);
}
if (demoplayback)
{
if (singledemo)
I_Quit ();
Z_ChangeTag (demobuffer, PU_CACHE); demoplayback = false; H2_AdvanceDemo(); return true; }
if (demorecording) { *demo_p++ = DEMOMARKER; M_WriteFile (demoname, demobuffer, demo_p - demobuffer); Z_Free (demobuffer); demorecording = false; I_Error ("Demo %s recorded",demoname); } return false;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -