⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 g_game.c

📁 制作游戏 魔法师传奇 源代码设计 MOFASHICHUANQI 经典老游戏
💻 C
📖 第 1 页 / 共 3 页
字号:
			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 + -