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

📄 p_pspr.c

📁 使用Doom引擎开发的著名游戏《毁灭巫师》的源代码。
💻 C
📖 第 1 页 / 共 4 页
字号:
===============*//*void P_BulletSlope (mobj_t *mo){	angle_t		an;//// see which target is to be aimed at//	an = mo->angle;	bulletslope = P_AimLineAttack (mo, an, 16*64*FRACUNIT);	if (!linetarget)	{		an += 1<<26;		bulletslope = P_AimLineAttack (mo, an, 16*64*FRACUNIT);		if (!linetarget)		{			an -= 2<<26;			bulletslope = P_AimLineAttack (mo, an, 16*64*FRACUNIT);		}		if (!linetarget)		{			an += 1<<26;			bulletslope = (mo->player->lookdir<<FRACBITS)/173;		}	}}*///****************************************************************************//// WEAPON ATTACKS////****************************************************************************//============================================================================////	AdjustPlayerAngle////============================================================================#define MAX_ANGLE_ADJUST (5*ANGLE_1)void AdjustPlayerAngle(mobj_t *pmo){	angle_t angle;	int difference;	angle = R_PointToAngle2(pmo->x, pmo->y, linetarget->x, linetarget->y);	difference = (int)angle-(int)pmo->angle;	if(abs(difference) > MAX_ANGLE_ADJUST)	{		pmo->angle += difference > 0 ? MAX_ANGLE_ADJUST : -MAX_ANGLE_ADJUST;	}	else	{		pmo->angle = angle;	}}//============================================================================//// A_SnoutAttack////============================================================================void A_SnoutAttack(player_t *player, pspdef_t *psp){	angle_t angle;	int damage;	int slope;	damage = 3+(P_Random()&3);	angle = player->mo->angle;	slope = P_AimLineAttack(player->mo, angle, MELEERANGE);	PuffType = MT_SNOUTPUFF;	PuffSpawned = NULL;	P_LineAttack(player->mo, angle, MELEERANGE, slope, damage);	S_StartSound(player->mo, SFX_PIG_ACTIVE1+(P_Random()&1));	if(linetarget)	{		AdjustPlayerAngle(player->mo);//		player->mo->angle = R_PointToAngle2(player->mo->x,//			player->mo->y, linetarget->x, linetarget->y);		if(PuffSpawned)		{ // Bit something			S_StartSound(player->mo, SFX_PIG_ATTACK);		}	}}//============================================================================//// A_FHammerAttack////============================================================================#define HAMMER_RANGE	(MELEERANGE+MELEERANGE/2)void A_FHammerAttack(player_t *player, pspdef_t *psp){	angle_t angle;	mobj_t *pmo=player->mo;	int damage;	fixed_t power;	int slope;	int i;	damage = 60+(P_Random()&63);	power = 10*FRACUNIT;	PuffType = MT_HAMMERPUFF;	for(i = 0; i < 16; i++)	{		angle = pmo->angle+i*(ANG45/32);		slope = P_AimLineAttack(pmo, angle, HAMMER_RANGE);		if(linetarget)		{			P_LineAttack(pmo, angle, HAMMER_RANGE, slope, damage);			AdjustPlayerAngle(pmo);			if (linetarget->flags&MF_COUNTKILL || linetarget->player)			{				P_ThrustMobj(linetarget, angle, power);			}			pmo->special1 = false; // Don't throw a hammer			goto hammerdone;		}		angle = pmo->angle-i*(ANG45/32);		slope = P_AimLineAttack(pmo, angle, HAMMER_RANGE);		if(linetarget)		{			P_LineAttack(pmo, angle, HAMMER_RANGE, slope, damage);			AdjustPlayerAngle(pmo);			if (linetarget->flags&MF_COUNTKILL || linetarget->player)			{				P_ThrustMobj(linetarget, angle, power);			}			pmo->special1 = false; // Don't throw a hammer			goto hammerdone;		}	}	// didn't find any targets in meleerange, so set to throw out a hammer	PuffSpawned = NULL;	angle = pmo->angle;	slope = P_AimLineAttack(pmo, angle, HAMMER_RANGE);	P_LineAttack(pmo, angle, HAMMER_RANGE, slope, damage);	if(PuffSpawned)	{		pmo->special1 = false;	}	else	{		pmo->special1 = true;	}hammerdone:	if(player->mana[MANA_2] < 		WeaponManaUse[player->class][player->readyweapon])	{ // Don't spawn a hammer if the player doesn't have enough mana		pmo->special1 = false;	}	return;		}//============================================================================//// A_FHammerThrow////============================================================================void A_FHammerThrow(player_t *player, pspdef_t *psp){	mobj_t *mo;	if(!player->mo->special1)	{		return;	}	player->mana[MANA_2] -= WeaponManaUse[player->class][player->readyweapon];	mo = P_SpawnPlayerMissile(player->mo, MT_HAMMER_MISSILE); 	if(mo)	{		mo->special1 = 0;	}	}//============================================================================//// A_FSwordAttack////============================================================================void A_FSwordAttack(player_t *player, pspdef_t *psp){	mobj_t *pmo;	player->mana[MANA_1] -= WeaponManaUse[player->class][player->readyweapon];	player->mana[MANA_2] -= WeaponManaUse[player->class][player->readyweapon];	pmo = player->mo;	P_SPMAngleXYZ(pmo, pmo->x, pmo->y, pmo->z-10*FRACUNIT, MT_FSWORD_MISSILE, 		pmo->angle+ANG45/4);	P_SPMAngleXYZ(pmo, pmo->x, pmo->y, pmo->z-5*FRACUNIT, MT_FSWORD_MISSILE, 		pmo->angle+ANG45/8);	P_SPMAngleXYZ(pmo, pmo->x, pmo->y, pmo->z, MT_FSWORD_MISSILE, pmo->angle);	P_SPMAngleXYZ(pmo, pmo->x, pmo->y, pmo->z+5*FRACUNIT, MT_FSWORD_MISSILE, 		pmo->angle-ANG45/8);	P_SPMAngleXYZ(pmo, pmo->x, pmo->y, pmo->z+10*FRACUNIT, MT_FSWORD_MISSILE, 		pmo->angle-ANG45/4);	S_StartSound(pmo, SFX_FIGHTER_SWORD_FIRE);}//============================================================================//// A_FSwordAttack2////============================================================================void A_FSwordAttack2(mobj_t *actor){	angle_t angle = actor->angle;	P_SpawnMissileAngle(actor, MT_FSWORD_MISSILE,angle+ANG45/4, 0);	P_SpawnMissileAngle(actor, MT_FSWORD_MISSILE,angle+ANG45/8, 0);	P_SpawnMissileAngle(actor, MT_FSWORD_MISSILE,angle,         0);	P_SpawnMissileAngle(actor, MT_FSWORD_MISSILE,angle-ANG45/8, 0);	P_SpawnMissileAngle(actor, MT_FSWORD_MISSILE,angle-ANG45/4, 0);	S_StartSound(actor, SFX_FIGHTER_SWORD_FIRE);}//============================================================================//// A_FSwordFlames////============================================================================void A_FSwordFlames(mobj_t *actor){	int i;	for(i = 1+(P_Random()&3); i; i--)	{		P_SpawnMobj(actor->x+((P_Random()-128)<<12), actor->y			+((P_Random()-128)<<12), actor->z+((P_Random()-128)<<11),			MT_FSWORD_FLAME);	}}//============================================================================//// A_MWandAttack////============================================================================void A_MWandAttack(player_t *player, pspdef_t *psp){	mobj_t *mo;	mo = P_SpawnPlayerMissile(player->mo, MT_MWAND_MISSILE);	if(mo)	{		mo->thinker.function = P_BlasterMobjThinker;	}	S_StartSound(player->mo, SFX_MAGE_WAND_FIRE);}// ===== Mage Lightning Weapon =====//============================================================================//// A_LightningReady////============================================================================void A_LightningReady(player_t *player, pspdef_t *psp){	A_WeaponReady(player, psp);	if(P_Random() < 160)	{		S_StartSound(player->mo, SFX_MAGE_LIGHTNING_READY);	}}//============================================================================//// A_LightningClip////============================================================================#define ZAGSPEED	FRACUNITvoid A_LightningClip(mobj_t *actor){	mobj_t *cMo;	mobj_t *target;	int zigZag;	if(actor->type == MT_LIGHTNING_FLOOR)	{		actor->z = actor->floorz;		target = (mobj_t *)((mobj_t *)actor->special2)->special1;	}	else if(actor->type == MT_LIGHTNING_CEILING)	{		actor->z = actor->ceilingz-actor->height;		target = (mobj_t *)actor->special1;	}	if(actor->type == MT_LIGHTNING_FLOOR)	{ // floor lightning zig-zags, and forces the ceiling lightning to mimic		cMo = (mobj_t *)actor->special2;		zigZag = P_Random();		if((zigZag > 128 && actor->special1 < 2) || actor->special1 < -2)		{			P_ThrustMobj(actor, actor->angle+ANG90, ZAGSPEED);			if(cMo)			{				P_ThrustMobj(cMo, actor->angle+ANG90, ZAGSPEED);			}			actor->special1++;		}		else		{			P_ThrustMobj(actor, actor->angle-ANG90, ZAGSPEED);			if(cMo)			{				P_ThrustMobj(cMo, cMo->angle-ANG90, ZAGSPEED);			}			actor->special1--;		}	}	if(target)	{		if(target->health <= 0)		{			P_ExplodeMissile(actor);		}		else		{			actor->angle = R_PointToAngle2(actor->x, actor->y, target->x,				target->y);			actor->momx = 0;			actor->momy = 0;			P_ThrustMobj(actor, actor->angle, actor->info->speed>>1);		}	}}//============================================================================//// A_LightningZap////============================================================================void A_LightningZap(mobj_t *actor){	mobj_t *mo;	fixed_t deltaZ;	A_LightningClip(actor);	actor->health -= 8;	if(actor->health <= 0)	{		P_SetMobjState(actor, actor->info->deathstate);		return;	}	if(actor->type == MT_LIGHTNING_FLOOR)	{		deltaZ = 10*FRACUNIT;	}	else	{		deltaZ = -10*FRACUNIT;	}	mo = P_SpawnMobj(actor->x+((P_Random()-128)*actor->radius/256), 		actor->y+((P_Random()-128)*actor->radius/256), 		actor->z+deltaZ, MT_LIGHTNING_ZAP);	if(mo)	{		mo->special2 = (int)actor;		mo->momx = actor->momx;		mo->momy = actor->momy;		mo->target = actor->target;		if(actor->type == MT_LIGHTNING_FLOOR)		{			mo->momz = 20*FRACUNIT;		}		else 		{			mo->momz = -20*FRACUNIT;		}	}/*	mo = P_SpawnMobj(actor->x+((P_Random()-128)*actor->radius/256), 		actor->y+((P_Random()-128)*actor->radius/256), 		actor->z+deltaZ, MT_LIGHTNING_ZAP);	if(mo)	{		mo->special2 = (int)actor;		mo->momx = actor->momx;		mo->momy = actor->momy;		mo->target = actor->target;		if(actor->type == MT_LIGHTNING_FLOOR)		{			mo->momz = 16*FRACUNIT;		}		else 		{			mo->momz = -16*FRACUNIT;		}	}*/	if(actor->type == MT_LIGHTNING_FLOOR && P_Random() < 160)	{		S_StartSound(actor, SFX_MAGE_LIGHTNING_CONTINUOUS);	}}//============================================================================//// A_MLightningAttack2////============================================================================void A_MLightningAttack2(mobj_t *actor){	mobj_t *fmo, *cmo;	fmo = P_SpawnPlayerMissile(actor, MT_LIGHTNING_FLOOR);	cmo = P_SpawnPlayerMissile(actor, MT_LIGHTNING_CEILING);	if(fmo)	{		fmo->special1 = 0;		fmo->special2 = (int)cmo;		A_LightningZap(fmo);		}	if(cmo)	{		cmo->special1 = 0;	// mobj that it will track		cmo->special2 = (int)fmo;		A_LightningZap(cmo);		}	S_StartSound(actor, SFX_MAGE_LIGHTNING_FIRE);}//============================================================================//// A_MLightningAttack////============================================================================void A_MLightningAttack(player_t *player, pspdef_t *psp){	A_MLightningAttack2(player->mo);	player->mana[MANA_2] -= WeaponManaUse[player->class][player->readyweapon];}//============================================================================//// A_ZapMimic////============================================================================void A_ZapMimic(mobj_t *actor){	mobj_t *mo;	mo = (mobj_t *)actor->special2;	if(mo)	{		if(mo->state >= &states[mo->info->deathstate]			|| mo->state == &states[S_FREETARGMOBJ])		{			P_ExplodeMissile(actor);		}		else		{			actor->momx = mo->momx;			actor->momy = mo->momy;		}	}}//============================================================================//// A_LastZap////============================================================================void A_LastZap(mobj_t *actor){	mobj_t *mo;	mo = P_SpawnMobj(actor->x, actor->y, actor->z, MT_LIGHTNING_ZAP);	if(mo)	{		P_SetMobjState(mo, S_LIGHTNING_ZAP_X1);		mo->momz = 40*FRACUNIT;	}}//============================================================================//// A_LightningRemove////============================================================================void A_LightningRemove(mobj_t *actor){	mobj_t *mo;	mo = (mobj_t *)actor->special2;	if(mo)	{		mo->special2 = 0;		P_ExplodeMissile(mo);	}}//============================================================================//// MStaffSpawn////============================================================================void MStaffSpawn(mobj_t *pmo, angle_t angle){	mobj_t *mo;	mo = P_SPMAngle(pmo, MT_MSTAFF_FX2, angle);	if (mo)	{		mo->target = pmo;		mo->special1 = (int)P_RoughMonsterSearch(mo, 10);	}}//============================================================================//// A_MStaffAttack////============================================================================void A_MStaffAttack(player_t *player, pspdef_t *psp){	angle_t angle;	mobj_t *pmo;	player->mana[MANA_1] -= WeaponManaUse[player->class][player->readyweapon];	player->mana[MANA_2] -= WeaponManaUse[player->class][player->readyweapon];	pmo = player->mo;	angle = pmo->angle;		MStaffSpawn(pmo, angle);	MStaffSpawn(pmo, angle-ANGLE_1*5);	MStaffSpawn(pmo, angle+ANGLE_1*5);	S_StartSound(player->mo, SFX_MAGE_STAFF_FIRE);	if(player == &players[consoleplayer])	{		player->damagecount = 0;		player->bonuscount = 0;		I_SetPalette((byte *)W_CacheLumpNum(W_GetNumForName("playpal"),			PU_CACHE)+STARTSCOURGEPAL*768);	}}//============================================================================//// A_MStaffPalette////============================================================================void A_MStaffPalette(player_t *player, pspdef_t *psp){	int pal;	if(player == &players[consoleplayer])	{		pal = STARTSCOURGEPAL+psp->state-(&states[S_MSTAFFATK_2]);		if(pal == STARTSCOURGEPAL+3)		{ // reset back to original playpal			pal = 0;		}		I_SetPalette((byte *)W_CacheLumpNum(W_GetNumForName("playpal"),			PU_CACHE)+pal*768);	}}//============================================================================//// A_MStaffWeave////============================================================================void A_MStaffWeave(mobj_t *actor){	fixed_t newX, newY;	int weaveXY, weaveZ;	int angle;	weaveXY = actor->special2>>16;	weaveZ = actor->special2&0xFFFF;	angle = (actor->angle+ANG90)>>ANGLETOFINESHIFT;	newX = actor->x-FixedMul(finecosine[angle], 		FloatBobOffsets[weaveXY]<<2);	newY = actor->y-FixedMul(finesine[angle],		FloatBobOffsets[weaveXY]<<2);	weaveXY = (weaveXY+6)&63;	newX += FixedMul(finecosine[angle], 		FloatBobOffsets[weaveXY]<<2);	newY += FixedMul(finesine[angle], 		FloatBobOffsets[weaveXY]<<2);	P_TryMove(actor, newX, newY);	actor->z -= FloatBobOffsets[weaveZ]<<1;	weaveZ = (weaveZ+3)&63;	actor->z += FloatBobOffsets[weaveZ]<<1;

⌨️ 快捷键说明

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