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

📄 p_inter.c

📁 使用Doom引擎开发的著名游戏《毁灭巫师》的源代码。
💻 C
📖 第 1 页 / 共 4 页
字号:
//**************************************************************************//**//** p_inter.c : Heretic 2 : Raven Software, Corp.//**//** $RCSfile: p_inter.c,v $//** $Revision: 1.145 $//** $Date: 96/01/16 10:35:33 $//** $Author: bgokey $//**//**************************************************************************#include "h2def.h"#include "p_local.h"#include "soundst.h"#define BONUSADD 6int ArmorIncrement[NUMCLASSES][NUMARMOR] ={	{ 25*FRACUNIT, 20*FRACUNIT, 15*FRACUNIT, 5*FRACUNIT },	{ 10*FRACUNIT, 25*FRACUNIT, 5*FRACUNIT, 20*FRACUNIT },	{ 5*FRACUNIT, 15*FRACUNIT, 10*FRACUNIT, 25*FRACUNIT },	{ 0, 0, 0, 0 }};int AutoArmorSave[NUMCLASSES] = { 15*FRACUNIT, 10*FRACUNIT, 5*FRACUNIT, 0 };char *TextKeyMessages[] = {	TXT_KEY_STEEL,	TXT_KEY_CAVE,	TXT_KEY_AXE,	TXT_KEY_FIRE,	TXT_KEY_EMERALD,	TXT_KEY_DUNGEON,	TXT_KEY_SILVER,	TXT_KEY_RUSTED,	TXT_KEY_HORN,	TXT_KEY_SWAMP,	TXT_KEY_CASTLE};static void SetDormantArtifact(mobj_t *arti);static void TryPickupArtifact(player_t *player, artitype_t artifactType,	mobj_t *artifact);static void TryPickupWeapon(player_t *player, pclass_t weaponClass,	weapontype_t weaponType, mobj_t *weapon, char *message);static void TryPickupWeaponPiece(player_t *player, pclass_t matchClass,	int pieceValue, mobj_t *pieceMobj);#ifdef __NeXT__extern void strupr(char *s);#endif//--------------------------------------------------------------------------//// PROC P_SetMessage////--------------------------------------------------------------------------void P_SetMessage(player_t *player, char *message, boolean ultmsg){	extern boolean messageson;		if((player->ultimateMessage || !messageson) && !ultmsg)	{		return;	}	if(strlen(message) > 79)	{		memcpy(player->message, message, 80);		player->message[80] = 0;	}	else	{		strcpy(player->message, message);	}	strupr(player->message);	player->messageTics = MESSAGETICS;	player->yellowMessage = false;	if(ultmsg)	{		player->ultimateMessage = true;	}	if(player == &players[consoleplayer])	{		BorderTopRefresh = true;	}}//==========================================================================//// P_SetYellowMessage////==========================================================================void P_SetYellowMessage(player_t *player, char *message, boolean ultmsg){	extern boolean messageson;		if((player->ultimateMessage || !messageson) && !ultmsg)	{		return;	}	if(strlen(message) > 79)	{		memcpy(player->message, message, 80);		player->message[80] = 0;	}	else	{		strcpy(player->message, message);	}	player->messageTics = 5*MESSAGETICS; // Bold messages last longer	player->yellowMessage = true;	if(ultmsg)	{		player->ultimateMessage = true;	}	if(player == &players[consoleplayer])	{		BorderTopRefresh = true;	}}//==========================================================================//// P_ClearMessage////==========================================================================void P_ClearMessage(player_t *player){	player->messageTics = 0;	if(player == &players[consoleplayer])	{		BorderTopRefresh = true;	}}//----------------------------------------------------------------------------//// PROC P_HideSpecialThing////----------------------------------------------------------------------------void P_HideSpecialThing(mobj_t *thing){	thing->flags &= ~MF_SPECIAL;	thing->flags2 |= MF2_DONTDRAW;	P_SetMobjState(thing, S_HIDESPECIAL1);}//--------------------------------------------------------------------------//// FUNC P_GiveMana//// Returns true if the player accepted the mana, false if it was// refused (player has MAX_MANA).////--------------------------------------------------------------------------boolean P_GiveMana(player_t *player, manatype_t mana, int count){	int prevMana;	//weapontype_t changeWeapon;	if(mana == MANA_NONE || mana == MANA_BOTH)	{		return(false);	}	if(mana < 0 || mana > NUMMANA)	{		I_Error("P_GiveMana: bad type %i", mana);	}	if(player->mana[mana] == MAX_MANA)	{		return(false);	}	if(gameskill == sk_baby || gameskill == sk_nightmare)	{ // extra mana in baby mode and nightmare mode		count += count>>1;	}	prevMana = player->mana[mana];	player->mana[mana] += count;	if(player->mana[mana] > MAX_MANA)	{		player->mana[mana] = MAX_MANA;	}	if(player->class == PCLASS_FIGHTER && player->readyweapon == WP_SECOND	&& mana == MANA_1 && prevMana <= 0)	{		P_SetPsprite(player, ps_weapon, S_FAXEREADY_G);	}	return(true);}//==========================================================================//// TryPickupWeapon////==========================================================================static void TryPickupWeapon(player_t *player, pclass_t weaponClass,	weapontype_t weaponType, mobj_t *weapon, char *message){	boolean remove;	boolean gaveMana;	boolean gaveWeapon;	remove = true;	if(player->class != weaponClass)	{ // Wrong class, but try to pick up for mana		if(netgame && !deathmatch)		{ // Can't pick up weapons for other classes in coop netplay			return;		}		if(weaponType == WP_SECOND)		{			if(!P_GiveMana(player, MANA_1, 25))			{				return;			}		}		else		{			if(!P_GiveMana(player, MANA_2, 25))			{				return;			}		}	}	else if(netgame && !deathmatch)	{ // Cooperative net-game		if(player->weaponowned[weaponType])		{			return;		}		player->weaponowned[weaponType] = true;		if(weaponType == WP_SECOND)		{			P_GiveMana(player, MANA_1, 25);		}		else		{			P_GiveMana(player, MANA_2, 25);		}		player->pendingweapon = weaponType;		remove = false;	}	else	{ // Deathmatch or single player game		if(weaponType == WP_SECOND)		{			gaveMana = P_GiveMana(player, MANA_1, 25);		}		else 		{			gaveMana = P_GiveMana(player, MANA_2, 25);		}		if(player->weaponowned[weaponType])		{			gaveWeapon = false;		}		else		{			gaveWeapon = true;			player->weaponowned[weaponType] = true;			if(weaponType > player->readyweapon)			{ // Only switch to more powerful weapons				player->pendingweapon = weaponType;			}		}		if(!(gaveWeapon || gaveMana))		{ // Player didn't need the weapon or any mana			return;		}	}	P_SetMessage(player, message, false);	if(weapon->special)	{		P_ExecuteLineSpecial(weapon->special, weapon->args,			NULL, 0, player->mo);		weapon->special = 0;	}	if(remove)	{		if(deathmatch && !(weapon->flags2&MF2_DROPPED))		{			P_HideSpecialThing(weapon);		}		else		{			P_RemoveMobj(weapon);		}	}	player->bonuscount += BONUSADD;	if(player == &players[consoleplayer])	{		S_StartSound(NULL, SFX_PICKUP_WEAPON);		SB_PaletteFlash(false);	}}//--------------------------------------------------------------------------//// FUNC P_GiveWeapon//// Returns true if the weapon or its mana was accepted.////--------------------------------------------------------------------------/*boolean P_GiveWeapon(player_t *player, pclass_t class, weapontype_t weapon){	boolean gaveMana;	boolean gaveWeapon;	if(player->class != class)	{ // player cannot use this weapon, take it anyway, and get mana		if(netgame && !deathmatch)		{ // Can't pick up weapons for other classes in coop netplay			return false;		}		if(weapon == WP_SECOND)		{			return P_GiveMana(player, MANA_1, 25);		}		else		{			return P_GiveMana(player, MANA_2, 25);		}			}	if(netgame && !deathmatch)	{ // Cooperative net-game		if(player->weaponowned[weapon])		{			return(false);		}		player->bonuscount += BONUSADD;		player->weaponowned[weapon] = true;		if(weapon == WP_SECOND)		{			P_GiveMana(player, MANA_1, 25);		}		else 		{			P_GiveMana(player, MANA_2, 25);		}		player->pendingweapon = weapon;		if(player == &players[consoleplayer])		{			S_StartSound(NULL, SFX_PICKUP_WEAPON);		}		return(false);	}	if(weapon == WP_SECOND)	{		gaveMana = P_GiveMana(player, MANA_1, 25);	}	else 	{		gaveMana = P_GiveMana(player, MANA_2, 25);	}	if(player->weaponowned[weapon])	{		gaveWeapon = false;	}	else	{		gaveWeapon = true;		player->weaponowned[weapon] = true;		if(weapon > player->readyweapon)		{ // Only switch to more powerful weapons			player->pendingweapon = weapon;		}	}	return(gaveWeapon || gaveMana);}*///===========================================================================//// P_GiveWeaponPiece////===========================================================================/*boolean P_GiveWeaponPiece(player_t *player, pclass_t class, int piece){	P_GiveMana(player, MANA_1, 20);	P_GiveMana(player, MANA_2, 20);	if(player->class != class)	{		return true;	}	else if(player->pieces&piece)	{ // player already has that weapon piece		return true;	}	player->pieces |= piece;	if(player->pieces == 7)	{ // player has built the fourth weapon!		P_GiveWeapon(player, class, WP_FOURTH);		S_StartSound(player->mo, SFX_WEAPON_BUILD);	}	return true;}*///==========================================================================//// TryPickupWeaponPiece////==========================================================================static void TryPickupWeaponPiece(player_t *player, pclass_t matchClass,	int pieceValue, mobj_t *pieceMobj){	boolean remove;	boolean checkAssembled;	boolean gaveWeapon;	int gaveMana;	static char *fourthWeaponText[] =	{		TXT_WEAPON_F4,		TXT_WEAPON_C4,		TXT_WEAPON_M4	};	static char *weaponPieceText[] =	{		TXT_QUIETUS_PIECE,		TXT_WRAITHVERGE_PIECE,		TXT_BLOODSCOURGE_PIECE	};	static int pieceValueTrans[] =	{		0,							// 0: never		WPIECE1|WPIECE2|WPIECE3,	// WPIECE1 (1)		WPIECE2|WPIECE3,			// WPIECE2 (2)		0,							// 3: never		WPIECE3						// WPIECE3 (4)	};	remove = true;	checkAssembled = true;	gaveWeapon = false;	if(player->class != matchClass)	{ // Wrong class, but try to pick up for mana		if(netgame && !deathmatch)		{ // Can't pick up wrong-class weapons in coop netplay			return;		}		checkAssembled = false;		gaveMana = P_GiveMana(player, MANA_1, 20)+			P_GiveMana(player, MANA_2, 20);		if(!gaveMana)		{ // Didn't need the mana, so don't pick it up			return;		}	}	else if(netgame && !deathmatch)	{ // Cooperative net-game		if(player->pieces&pieceValue)		{ // Already has the piece			return;		}		pieceValue = pieceValueTrans[pieceValue];		P_GiveMana(player, MANA_1, 20);		P_GiveMana(player, MANA_2, 20);		remove = false;	}	else	{ // Deathmatch or single player game		gaveMana = P_GiveMana(player, MANA_1, 20)+			P_GiveMana(player, MANA_2, 20);		if(player->pieces&pieceValue)		{ // Already has the piece, check if mana needed			if(!gaveMana)			{ // Didn't need the mana, so don't pick it up				return;			}			checkAssembled = false;		}	}	// Pick up the weapon piece	if(pieceMobj->special)	{		P_ExecuteLineSpecial(pieceMobj->special, pieceMobj->args,			NULL, 0, player->mo);		pieceMobj->special = 0;	}	if(remove)	{		if(deathmatch && !(pieceMobj->flags2&MF2_DROPPED))		{			P_HideSpecialThing(pieceMobj);		}		else		{			P_RemoveMobj(pieceMobj);		}	}	player->bonuscount += BONUSADD;	if(player == &players[consoleplayer])	{		SB_PaletteFlash(false);	}	// Check if fourth weapon assembled	if(checkAssembled)	{		player->pieces |= pieceValue;		if(player->pieces == (WPIECE1|WPIECE2|WPIECE3))		{			gaveWeapon = true;			player->weaponowned[WP_FOURTH] = true;			player->pendingweapon = WP_FOURTH;		}	}	if(gaveWeapon)	{		P_SetMessage(player, fourthWeaponText[matchClass], false);		// Play the build-sound full volume for all players		S_StartSound(NULL, SFX_WEAPON_BUILD);	}	else	{		P_SetMessage(player, weaponPieceText[matchClass], false);		if(player == &players[consoleplayer])		{			S_StartSound(NULL, SFX_PICKUP_WEAPON);		}	}}//---------------------------------------------------------------------------//// FUNC P_GiveBody//// Returns false if the body isn't needed at all.////---------------------------------------------------------------------------boolean P_GiveBody(player_t *player, int num){	int max;	max = MAXHEALTH;	if(player->morphTics)	{		max = MAXMORPHHEALTH;	}	if(player->health >= max)	{		return(false);	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -