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

📄 p_inter.c

📁 使用Doom引擎开发的著名游戏《毁灭巫师》的源代码。
💻 C
📖 第 1 页 / 共 4 页
字号:
			TryPickupArtifact(player, arti_puzzcweapon, special);			return;		case SPR_AMWP:			TryPickupArtifact(player, arti_puzzmweapon, special);			return;		case SPR_AGER:			TryPickupArtifact(player, arti_puzzgear1, special);			return;		case SPR_AGR2:			TryPickupArtifact(player, arti_puzzgear2, special);			return;		case SPR_AGR3:			TryPickupArtifact(player, arti_puzzgear3, special);			return;		case SPR_AGR4:			TryPickupArtifact(player, arti_puzzgear4, special);			return;		// Mana		case SPR_MAN1:			if(!P_GiveMana(player, MANA_1, 15))			{				return;			}			P_SetMessage(player, TXT_MANA_1, false);			break;		case SPR_MAN2: 			if(!P_GiveMana(player, MANA_2, 15))			{				return;			}			P_SetMessage(player, TXT_MANA_2, false);			break;		case SPR_MAN3: // Double Mana Dodecahedron			if(!P_GiveMana(player, MANA_1, 20))			{				if(!P_GiveMana(player, MANA_2, 20))				{					return;				}			}			else			{				P_GiveMana(player, MANA_2, 20);			}			P_SetMessage(player, TXT_MANA_BOTH, false);			break;		// 2nd and 3rd Mage Weapons		case SPR_WMCS: // Frost Shards			TryPickupWeapon(player, PCLASS_MAGE, WP_SECOND,				special, TXT_WEAPON_M2);			return;		case SPR_WMLG: // Arc of Death			TryPickupWeapon(player, PCLASS_MAGE, WP_THIRD,				special, TXT_WEAPON_M3);			return;		// 2nd and 3rd Fighter Weapons		case SPR_WFAX: // Timon's Axe			TryPickupWeapon(player, PCLASS_FIGHTER, WP_SECOND,				special, TXT_WEAPON_F2);			return;		case SPR_WFHM: // Hammer of Retribution			TryPickupWeapon(player, PCLASS_FIGHTER, WP_THIRD,				special, TXT_WEAPON_F3);			return;		// 2nd and 3rd Cleric Weapons		case SPR_WCSS: // Serpent Staff			TryPickupWeapon(player, PCLASS_CLERIC, WP_SECOND,				special, TXT_WEAPON_C2);			return;		case SPR_WCFM: // Firestorm			TryPickupWeapon(player, PCLASS_CLERIC, WP_THIRD,				special, TXT_WEAPON_C3);			return;		// Fourth Weapon Pieces		case SPR_WFR1:			TryPickupWeaponPiece(player, PCLASS_FIGHTER, WPIECE1,				special);			return;		case SPR_WFR2:			TryPickupWeaponPiece(player, PCLASS_FIGHTER, WPIECE2,				special);			return;		case SPR_WFR3:			TryPickupWeaponPiece(player, PCLASS_FIGHTER, WPIECE3,				special);			return;		case SPR_WCH1:			TryPickupWeaponPiece(player, PCLASS_CLERIC, WPIECE1,				special);			return;		case SPR_WCH2:			TryPickupWeaponPiece(player, PCLASS_CLERIC, WPIECE2,				special);			return;		case SPR_WCH3:			TryPickupWeaponPiece(player, PCLASS_CLERIC, WPIECE3,				special);			return;		case SPR_WMS1:			TryPickupWeaponPiece(player, PCLASS_MAGE, WPIECE1,				special);			return;		case SPR_WMS2:			TryPickupWeaponPiece(player, PCLASS_MAGE, WPIECE2,				special);			return;		case SPR_WMS3:			TryPickupWeaponPiece(player, PCLASS_MAGE, WPIECE3,				special);			return;		default:			I_Error("P_SpecialThing: Unknown gettable thing");	}	if(special->special)	{		P_ExecuteLineSpecial(special->special, special->args, NULL,			0, toucher);		special->special = 0;	}	if(deathmatch && respawn && !(special->flags2&MF2_DROPPED))	{		P_HideSpecialThing(special);	}	else	{		P_RemoveMobj(special);	}	player->bonuscount += BONUSADD;	if(player == &players[consoleplayer])	{		S_StartSound(NULL, sound);		SB_PaletteFlash(false);	}}// Search thinker list for minotaurmobj_t *ActiveMinotaur(player_t *master){	mobj_t *mo;	player_t *plr;	thinker_t *think;	unsigned int *starttime;	for(think = thinkercap.next; think != &thinkercap; think = think->next)	{		if(think->function != P_MobjThinker) continue;		mo = (mobj_t *)think;		if(mo->type != MT_MINOTAUR) continue;		if(mo->health <= 0) continue;		if(!(mo->flags&MF_COUNTKILL)) continue;		// for morphed minotaurs		if(mo->flags&MF_CORPSE) continue;		starttime = (unsigned int *)mo->args;		if ((leveltime - *starttime) >= MAULATORTICS) continue;		plr = ((mobj_t *)mo->special1)->player;		if(plr == master) return(mo);	}	return(NULL);}//---------------------------------------------------------------------------//// PROC P_KillMobj////---------------------------------------------------------------------------void P_KillMobj(mobj_t *source, mobj_t *target){	int dummy;	mobj_t *master;	target->flags &= ~(MF_SHOOTABLE|MF_FLOAT|MF_SKULLFLY|MF_NOGRAVITY);	target->flags |= MF_CORPSE|MF_DROPOFF;	target->flags2 &= ~MF2_PASSMOBJ;	target->height >>= 2;	if((target->flags&MF_COUNTKILL || target->type == MT_ZBELL) 		 && target->special)	{ // Initiate monster death actions		if(target->type == MT_SORCBOSS)		{			dummy = 0;			P_StartACS(target->special, 0, (byte *)&dummy, target,				NULL, 0);		}		else		{			P_ExecuteLineSpecial(target->special, target->args,				NULL, 0, target);		}	}	if(source && source->player)	{ // Check for frag changes		if(target->player)		{			if(target == source)			{ // Self-frag				target->player->frags[target->player-players]--;				if(cmdfrag && netgame				&& source->player == &players[consoleplayer])				{ // Send out a frag count packet					NET_SendFrags(source->player);				}			}			else			{				source->player->frags[target->player-players]++;				if(cmdfrag && netgame				&& source->player == &players[consoleplayer])				{ // Send out a frag count packet					NET_SendFrags(source->player);				}			}		}	}	if(target->player)	{ // Player death		if(!source)		{ // Self-frag			target->player->frags[target->player-players]--;			if(cmdfrag && netgame			&& target->player == &players[consoleplayer])			{ // Send out a frag count packet				NET_SendFrags(target->player);			}		}		target->flags &= ~MF_SOLID;		target->flags2 &= ~MF2_FLY;		target->player->powers[pw_flight] = 0;		target->player->playerstate = PST_DEAD;		P_DropWeapon(target->player);		if(target->flags2&MF2_FIREDAMAGE)		{ // Player flame death			switch(target->player->class)			{				case PCLASS_FIGHTER:					S_StartSound(target, SFX_PLAYER_FIGHTER_BURN_DEATH);					P_SetMobjState(target, S_PLAY_F_FDTH1);					return;				case PCLASS_CLERIC:					S_StartSound(target, SFX_PLAYER_CLERIC_BURN_DEATH);					P_SetMobjState(target, S_PLAY_C_FDTH1);					return;				case PCLASS_MAGE:					S_StartSound(target, SFX_PLAYER_MAGE_BURN_DEATH);					P_SetMobjState(target, S_PLAY_M_FDTH1);					return;				default:					break;			}		}		if(target->flags2&MF2_ICEDAMAGE)		{ // Player ice death			target->flags &= ~(7<<MF_TRANSSHIFT); //no translation			target->flags |= MF_ICECORPSE;			switch(target->player->class)			{				case PCLASS_FIGHTER:					P_SetMobjState(target, S_FPLAY_ICE);					return;				case PCLASS_CLERIC:					P_SetMobjState(target, S_CPLAY_ICE);					return;				case PCLASS_MAGE:					P_SetMobjState(target, S_MPLAY_ICE);					return;				case PCLASS_PIG:					P_SetMobjState(target, S_PIG_ICE);					return;				default:					break;			}		}	}	if(target->flags2&MF2_FIREDAMAGE)	{		if(target->type == MT_FIGHTER_BOSS 			|| target->type == MT_CLERIC_BOSS			|| target->type == MT_MAGE_BOSS)		{			switch(target->type)			{				case MT_FIGHTER_BOSS:					S_StartSound(target, SFX_PLAYER_FIGHTER_BURN_DEATH);					P_SetMobjState(target, S_PLAY_F_FDTH1);					return;				case MT_CLERIC_BOSS:					S_StartSound(target, SFX_PLAYER_CLERIC_BURN_DEATH);					P_SetMobjState(target, S_PLAY_C_FDTH1);					return;				case MT_MAGE_BOSS:					S_StartSound(target, SFX_PLAYER_MAGE_BURN_DEATH);					P_SetMobjState(target, S_PLAY_M_FDTH1);					return;				default:					break;			}		}		else if(target->type == MT_TREEDESTRUCTIBLE)		{			P_SetMobjState(target, S_ZTREEDES_X1);			target->height = 24*FRACUNIT;			S_StartSound(target, SFX_TREE_EXPLODE);			return;		}	}	if(target->flags2&MF2_ICEDAMAGE)	{		target->flags |= MF_ICECORPSE;		switch(target->type)		{			case MT_BISHOP:				P_SetMobjState(target, S_BISHOP_ICE);				return;					case MT_CENTAUR:			case MT_CENTAURLEADER:				P_SetMobjState(target, S_CENTAUR_ICE);				return;					case MT_DEMON:			case MT_DEMON2:				P_SetMobjState(target, S_DEMON_ICE);				return;					case MT_SERPENT:			case MT_SERPENTLEADER:				P_SetMobjState(target, S_SERPENT_ICE);				return;					case MT_WRAITH:			case MT_WRAITHB:				P_SetMobjState(target, S_WRAITH_ICE);				return;			case MT_ETTIN:				P_SetMobjState(target, S_ETTIN_ICE1);				return;			case MT_FIREDEMON:				P_SetMobjState(target, S_FIRED_ICE1);				return;			case MT_FIGHTER_BOSS:				P_SetMobjState(target, S_FIGHTER_ICE);				return;			case MT_CLERIC_BOSS:				P_SetMobjState(target, S_CLERIC_ICE);				return;			case MT_MAGE_BOSS:				P_SetMobjState(target, S_MAGE_ICE);				return;			case MT_PIG:				P_SetMobjState(target, S_PIG_ICE);				return;			default:				target->flags &= ~MF_ICECORPSE;				break;		}	}	if(target->type == MT_MINOTAUR)	{		master = (mobj_t *)target->special1;		if(master->health > 0)		{			if (!ActiveMinotaur(master->player))			{				master->player->powers[pw_minotaur] = 0;			}		}			}	else if(target->type == MT_TREEDESTRUCTIBLE)	{		target->height = 24*FRACUNIT;	}	if(target->health < -(target->info->spawnhealth>>1)		&& target->info->xdeathstate)	{ // Extreme death		P_SetMobjState(target, target->info->xdeathstate);	}	else	{ // Normal death		if ((target->type==MT_FIREDEMON) &&			(target->z <= target->floorz + 2*FRACUNIT) &&			(target->info->xdeathstate))		{			// This is to fix the imps' staying in fall state			P_SetMobjState(target, target->info->xdeathstate);		}		else		{			P_SetMobjState(target, target->info->deathstate);		}	}	target->tics -= P_Random()&3;//	I_StartSound(&actor->r, actor->info->deathsound);}//---------------------------------------------------------------------------//// FUNC P_MinotaurSlam////---------------------------------------------------------------------------void P_MinotaurSlam(mobj_t *source, mobj_t *target){	angle_t angle;	fixed_t thrust;	angle = R_PointToAngle2(source->x, source->y, target->x, target->y);	angle >>= ANGLETOFINESHIFT;	thrust = 16*FRACUNIT+(P_Random()<<10);	target->momx += FixedMul(thrust, finecosine[angle]);	target->momy += FixedMul(thrust, finesine[angle]);	P_DamageMobj(target, NULL, source, HITDICE(4));	if(target->player)	{		target->reactiontime = 14+(P_Random()&7);	}	source->args[0] = 0;			// Stop charging}//---------------------------------------------------------------------------//// FUNC P_MorphPlayer//// Returns true if the player gets turned into a pig////---------------------------------------------------------------------------boolean P_MorphPlayer(player_t *player){	mobj_t *pmo;	mobj_t *fog;	mobj_t *beastMo;	fixed_t x;	fixed_t y;	fixed_t z;	angle_t angle;	int oldFlags2;	if(player->powers[pw_invulnerability])	{ // Immune when invulnerable		return(false);	}	if(player->morphTics)	{ // Player is already a beast		return false;	}	pmo = player->mo;	x = pmo->x;	y = pmo->y;	z = pmo->z;	angle = pmo->angle;	oldFlags2 = pmo->flags2;	P_SetMobjState(pmo, S_FREETARGMOBJ);	fog = P_SpawnMobj(x, y, z+TELEFOGHEIGHT, MT_TFOG);	S_StartSound(fog, SFX_TELEPORT);	beastMo = P_SpawnMobj(x, y, z, MT_PIGPLAYER);	beastMo->special1 = player->readyweapon;	beastMo->angle = angle;	beastMo->player = player;	player->health = beastMo->health = MAXMORPHHEALTH;	player->mo = beastMo;	memset(&player->armorpoints[0], 0, NUMARMOR*sizeof(int));	player->class = PCLASS_PIG;	if(oldFlags2&MF2_FLY)	{		beastMo->flags2 |= MF2_FLY;	}	player->morphTics = MORPHTICS;	P_ActivateMorphWeapon(player);	return(true);}//---------------------------------------------------------------------------//// FUNC P_MorphMonster////---------------------------------------------------------------------------boolean P_MorphMonster(mobj_t *actor){	mobj_t *master, *monster, *fog;	mobjtype_t moType;	fixed_t x;	fixed_t y;	fixed_t z;	mobj_t oldMonster;	if(actor->player) return(false);	if(!(actor->flags&MF_COUNTKILL)) return false;	if(actor->flags2&MF2_BOSS) return false;	moType = actor->type;	switch(moType)	{		case MT_PIG:			return(false);		case MT_FIGHTER_BOSS:		case MT_CLERIC_BOSS:		case MT_MAGE_BOSS:			return(false);		default:			break;	}	oldMonster = *actor;	x = oldMonster.x;	y = oldMonster.y;	z = oldMonster.z;	P_RemoveMobjFromTIDList(actor);	P_SetMobjState(actor, S_FREETARGMOBJ);	fog = P_SpawnMobj(x, y, z+TELEFOGHEIGHT, MT_TFOG);	S_StartSound(fog, SFX_TELEPORT);	monster = P_SpawnMobj(x, y, z, MT_PIG);	monster->special2 = moType;	monster->special1 = MORPHTICS+P_Random();	monster->flags |= (oldMonster.flags&MF_SHADOW);	monster->target = oldMonster.target;	monster->angle = oldMonster.angle;	monster->tid = oldMonster.tid;	monster->special = oldMonster.special;	P_InsertMobjIntoTIDList(monster, oldMonster.tid);	memcpy(monster->args, oldMonster.args, 5);	// check for turning off minotaur power for active icon	if (moType==MT_MINOTAUR)	{		master = (mobj_t *)oldMonster.special1;		if(master->health > 0)		{			if (!ActiveMinotaur(master->player))			{				master->player->powers[pw_minotaur] = 0;			}		}			}	return(true);}//---------------------------------------------------------------------------//// PROC P_AutoUseHealth////---------------------------------------------------------------------------void P_AutoUseHealth(player_t *player, int saveHealth){	int i;	int count;	int normalCount;	int normalSlot=0;	int superCount;	int superSlot=0;	normalCount = superCount = 0;	for(i = 0; i < player->inventorySlotNum; i++)	{		if(player->inventory[i].type == arti_health)		{			normalSlot = i;			normalCount = player->inventory[i].count;		}		else if(player->inventory[i].type == arti_superhealth)

⌨️ 快捷键说明

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