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

📄 p_inter.c

📁 使用Doom引擎开发的著名游戏《毁灭巫师》的源代码。
💻 C
📖 第 1 页 / 共 4 页
字号:
	player->health += num;	if(player->health > max)	{		player->health = max;	}	player->mo->health = player->health;	return(true);}//---------------------------------------------------------------------------//// FUNC P_GiveArmor//// Returns false if the armor is worse than the current armor.////---------------------------------------------------------------------------boolean P_GiveArmor(player_t *player, armortype_t armortype, int amount){	int hits;	int totalArmor;	extern int ArmorMax[NUMCLASSES];	if(amount == -1)	{		hits = ArmorIncrement[player->class][armortype];		if(player->armorpoints[armortype] >= hits)		{			return false;		}		else		{			player->armorpoints[armortype] = hits;		}	}	else	{		hits = amount*5*FRACUNIT;		totalArmor = player->armorpoints[ARMOR_ARMOR]			+player->armorpoints[ARMOR_SHIELD]			+player->armorpoints[ARMOR_HELMET]			+player->armorpoints[ARMOR_AMULET]			+AutoArmorSave[player->class];		if(totalArmor < ArmorMax[player->class]*5*FRACUNIT)		{			player->armorpoints[armortype] += hits;		}		else		{			return false;		}	}	return true;}//---------------------------------------------------------------------------//// PROC P_GiveKey////---------------------------------------------------------------------------int P_GiveKey(player_t *player, keytype_t key){	if(player->keys&(1<<key))	{		return false;	}	player->bonuscount += BONUSADD;	player->keys |= 1<<key;	return true;}//---------------------------------------------------------------------------//// FUNC P_GivePower//// Returns true if power accepted.////---------------------------------------------------------------------------boolean P_GivePower(player_t *player, powertype_t power){	if(power == pw_invulnerability)	{		if(player->powers[power] > BLINKTHRESHOLD)		{ // Already have it			return(false);		}		player->powers[power] = INVULNTICS;		player->mo->flags2 |= MF2_INVULNERABLE;		if(player->class == PCLASS_MAGE)		{			player->mo->flags2 |= MF2_REFLECTIVE;		}		return(true);	}	if(power == pw_flight)	{		if(player->powers[power] > BLINKTHRESHOLD)		{ // Already have it			return(false);		}		player->powers[power] = FLIGHTTICS;		player->mo->flags2 |= MF2_FLY;		player->mo->flags |= MF_NOGRAVITY;		if(player->mo->z <= player->mo->floorz)		{			player->flyheight = 10; // thrust the player in the air a bit		}		return(true);	}	if(power == pw_infrared)	{		if(player->powers[power] > BLINKTHRESHOLD)		{ // Already have it			return(false);		}		player->powers[power] = INFRATICS;		return(true);	}	if(power == pw_speed)	{		if(player->powers[power] > BLINKTHRESHOLD)		{ // Already have it			return(false);		}		player->powers[power] = SPEEDTICS;		return(true);	}	if(power == pw_minotaur)	{		// Doesn't matter if already have power, renew ticker		player->powers[power] = MAULATORTICS;		return(true);	}/*	if(power == pw_ironfeet)	{		player->powers[power] = IRONTICS;		return(true);	}	if(power == pw_strength)	{		P_GiveBody(player, 100);		player->powers[power] = 1;		return(true);	}*/	if(player->powers[power])	{		return(false); // already got it	}	player->powers[power] = 1;	return(true);}//==========================================================================//// TryPickupArtifact////==========================================================================static void TryPickupArtifact(player_t *player, artitype_t artifactType,	mobj_t *artifact){	static char *artifactMessages[NUMARTIFACTS] =	{		NULL,		TXT_ARTIINVULNERABILITY,		TXT_ARTIHEALTH,		TXT_ARTISUPERHEALTH,		TXT_ARTIHEALINGRADIUS,		TXT_ARTISUMMON,		TXT_ARTITORCH,		TXT_ARTIEGG,		TXT_ARTIFLY,		TXT_ARTIBLASTRADIUS,		TXT_ARTIPOISONBAG,		TXT_ARTITELEPORTOTHER,		TXT_ARTISPEED,		TXT_ARTIBOOSTMANA,		TXT_ARTIBOOSTARMOR,		TXT_ARTITELEPORT,		TXT_ARTIPUZZSKULL,		TXT_ARTIPUZZGEMBIG,		TXT_ARTIPUZZGEMRED,		TXT_ARTIPUZZGEMGREEN1,		TXT_ARTIPUZZGEMGREEN2,		TXT_ARTIPUZZGEMBLUE1,		TXT_ARTIPUZZGEMBLUE2,		TXT_ARTIPUZZBOOK1,		TXT_ARTIPUZZBOOK2,		TXT_ARTIPUZZSKULL2,		TXT_ARTIPUZZFWEAPON,		TXT_ARTIPUZZCWEAPON,		TXT_ARTIPUZZMWEAPON,		TXT_ARTIPUZZGEAR,	// All gear pickups use the same text		TXT_ARTIPUZZGEAR,		TXT_ARTIPUZZGEAR,		TXT_ARTIPUZZGEAR	};	if(P_GiveArtifact(player, artifactType, artifact))	{		if(artifact->special)		{			P_ExecuteLineSpecial(artifact->special, artifact->args,				NULL, 0, NULL);			artifact->special = 0;		}		player->bonuscount += BONUSADD;		if(artifactType < arti_firstpuzzitem)		{			SetDormantArtifact(artifact);			S_StartSound(artifact, SFX_PICKUP_ARTIFACT);			P_SetMessage(player, artifactMessages[artifactType], false);		}		else		{ // Puzzle item			S_StartSound(NULL, SFX_PICKUP_ITEM);			P_SetMessage(player, artifactMessages[artifactType], true);			if(!netgame || deathmatch)			{ // Remove puzzle items if not cooperative netplay				P_RemoveMobj(artifact);			}		}	}}//---------------------------------------------------------------------------//// FUNC P_GiveArtifact//// Returns true if artifact accepted.////---------------------------------------------------------------------------boolean P_GiveArtifact(player_t *player, artitype_t arti, mobj_t *mo){	int i;	int j;	boolean slidePointer;	slidePointer = false;	i = 0;	while(player->inventory[i].type != arti && i < player->inventorySlotNum)	{		i++;	}	if(i == player->inventorySlotNum)	{		if(arti < arti_firstpuzzitem)		{			i = 0;			while(player->inventory[i].type < arti_firstpuzzitem			&& i < player->inventorySlotNum)			{				i++;			}			if(i != player->inventorySlotNum)			{				for(j = player->inventorySlotNum; j > i; j--)				{					player->inventory[j].count = player->inventory[j-1].count;					player->inventory[j].type = player->inventory[j-1].type;					slidePointer = true;				}			}		}		player->inventory[i].count = 1;		player->inventory[i].type = arti;		player->inventorySlotNum++;	}	else	{		if(arti >= arti_firstpuzzitem && netgame && !deathmatch)		{ // Can't carry more than 1 puzzle item in coop netplay			return false;		}		if(player->inventory[i].count >= 25)		{ // Player already has 25 of this item			return false;		}		player->inventory[i].count++;	}	if(!player->artifactCount)	{		player->readyArtifact = arti;	}	else if(player == &players[consoleplayer] && slidePointer		&& i <= inv_ptr)	{		inv_ptr++;		curpos++;		if(curpos > 6)		{			curpos = 6;		}	}	player->artifactCount++;	return(true);}//==========================================================================//// SetDormantArtifact//// Removes the MF_SPECIAL flag and initiates the artifact pickup// animation.////==========================================================================static void SetDormantArtifact(mobj_t *arti){	arti->flags &= ~MF_SPECIAL;	if(deathmatch && !(arti->flags2 & MF2_DROPPED))	{		if(arti->type == MT_ARTIINVULNERABILITY)		{			P_SetMobjState(arti, S_DORMANTARTI3_1);		}		else if(arti->type == MT_SUMMONMAULATOR			|| arti->type == MT_ARTIFLY)		{			P_SetMobjState(arti, S_DORMANTARTI2_1);		}		else		{			P_SetMobjState(arti, S_DORMANTARTI1_1);		}	}	else	{ // Don't respawn		P_SetMobjState(arti, S_DEADARTI1);	}}//---------------------------------------------------------------------------//// PROC A_RestoreArtifact////---------------------------------------------------------------------------void A_RestoreArtifact(mobj_t *arti){	arti->flags |= MF_SPECIAL;	P_SetMobjState(arti, arti->info->spawnstate);	S_StartSound(arti, SFX_RESPAWN);}//---------------------------------------------------------------------------//// PROC A_RestoreSpecialThing1//// Make a special thing visible again.////---------------------------------------------------------------------------void A_RestoreSpecialThing1(mobj_t *thing){	thing->flags2 &= ~MF2_DONTDRAW;	S_StartSound(thing, SFX_RESPAWN);}//---------------------------------------------------------------------------//// PROC A_RestoreSpecialThing2////---------------------------------------------------------------------------void A_RestoreSpecialThing2(mobj_t *thing){	thing->flags |= MF_SPECIAL;	P_SetMobjState(thing, thing->info->spawnstate);}//---------------------------------------------------------------------------//// PROC P_TouchSpecialThing////---------------------------------------------------------------------------void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher){	player_t *player;	fixed_t delta;	int sound;	boolean respawn;	delta = special->z-toucher->z;	if(delta > toucher->height || delta < -32*FRACUNIT)	{ // Out of reach		return;	}	if(toucher->health <= 0)	{ // Toucher is dead		return;	}	sound = SFX_PICKUP_ITEM;	player = toucher->player;	respawn = true;	switch(special->sprite)	{		// Items		case SPR_PTN1: // Item_HealingPotion			if(!P_GiveBody(player, 10))			{				return;			}			P_SetMessage(player, TXT_ITEMHEALTH, false);			break;		case SPR_ARM1:			if(!P_GiveArmor(player, ARMOR_ARMOR, -1))			{				return;			}			P_SetMessage(player, TXT_ARMOR1, false);			break;		case SPR_ARM2:			if(!P_GiveArmor(player, ARMOR_SHIELD, -1))			{				return;			}			P_SetMessage(player, TXT_ARMOR2, false);			break;		case SPR_ARM3:			if(!P_GiveArmor(player, ARMOR_HELMET, -1))			{				return;			}			P_SetMessage(player, TXT_ARMOR3, false);			break;		case SPR_ARM4:			if(!P_GiveArmor(player, ARMOR_AMULET, -1))			{				return;			}			P_SetMessage(player, TXT_ARMOR4, false);			break;		// Keys		case SPR_KEY1:		case SPR_KEY2:		case SPR_KEY3:		case SPR_KEY4:		case SPR_KEY5:		case SPR_KEY6:		case SPR_KEY7:		case SPR_KEY8:		case SPR_KEY9:		case SPR_KEYA:		case SPR_KEYB:			if(!P_GiveKey(player, special->sprite-SPR_KEY1))			{				return;			}			P_SetMessage(player, TextKeyMessages[special->sprite-SPR_KEY1],				true);			sound = SFX_PICKUP_KEY;			// Check and process the special now in case the key doesn't			// get removed for coop netplay			if(special->special)			{				P_ExecuteLineSpecial(special->special, special->args,					NULL, 0, toucher);				special->special = 0;			}			if(!netgame)			{ // Only remove keys in single player game				break;			}			player->bonuscount += BONUSADD;			if(player == &players[consoleplayer])			{				S_StartSound(NULL, sound);				SB_PaletteFlash(false);			}			return;		// Artifacts		case SPR_PTN2:			TryPickupArtifact(player, arti_health, special);			return;		case SPR_SOAR:			TryPickupArtifact(player, arti_fly, special);			return;		case SPR_INVU:			TryPickupArtifact(player, arti_invulnerability, special);			return;		case SPR_SUMN:			TryPickupArtifact(player, arti_summon, special);			return;		case SPR_PORK:			TryPickupArtifact(player, arti_egg, special);			return;		case SPR_SPHL:			TryPickupArtifact(player, arti_superhealth, special);			return;		case SPR_HRAD:			TryPickupArtifact(player, arti_healingradius, special);			return;		case SPR_TRCH:			TryPickupArtifact(player, arti_torch, special);			return;		case SPR_ATLP:			TryPickupArtifact(player, arti_teleport, special);			return;		case SPR_TELO:			TryPickupArtifact(player, arti_teleportother, special);			return;		case SPR_PSBG:			TryPickupArtifact(player, arti_poisonbag, special);			return;		case SPR_SPED:			TryPickupArtifact(player, arti_speed, special);			return;		case SPR_BMAN:			TryPickupArtifact(player, arti_boostmana, special);			return;		case SPR_BRAC:			TryPickupArtifact(player, arti_boostarmor, special);			return;		case SPR_BLST:			TryPickupArtifact(player, arti_blastradius, special);			return;		// Puzzle artifacts		case SPR_ASKU:			TryPickupArtifact(player, arti_puzzskull, special);			return;		case SPR_ABGM:			TryPickupArtifact(player, arti_puzzgembig, special);			return;		case SPR_AGMR:			TryPickupArtifact(player, arti_puzzgemred, special);			return;		case SPR_AGMG:			TryPickupArtifact(player, arti_puzzgemgreen1, special);			return;		case SPR_AGG2:			TryPickupArtifact(player, arti_puzzgemgreen2, special);			return;		case SPR_AGMB:			TryPickupArtifact(player, arti_puzzgemblue1, special);			return;		case SPR_AGB2:			TryPickupArtifact(player, arti_puzzgemblue2, special);			return;		case SPR_ABK1:			TryPickupArtifact(player, arti_puzzbook1, special);			return;		case SPR_ABK2:			TryPickupArtifact(player, arti_puzzbook2, special);			return;		case SPR_ASK2:			TryPickupArtifact(player, arti_puzzskull2, special);			return;		case SPR_AFWP:			TryPickupArtifact(player, arti_puzzfweapon, special);			return;		case SPR_ACWP:

⌨️ 快捷键说明

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