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

📄 p_pspr.c

📁 使用Doom引擎开发的著名游戏《毁灭巫师》的源代码。
💻 C
📖 第 1 页 / 共 4 页
字号:
	if(actor->z <= actor->floorz)	{		actor->z = actor->floorz+FRACUNIT;	}	actor->special2 = weaveZ+(weaveXY<<16);}//============================================================================//// A_MStaffTrack////============================================================================void A_MStaffTrack(mobj_t *actor){	if ((actor->special1 == 0) && (P_Random()<50))	{		actor->special1 = (int)P_RoughMonsterSearch(actor, 10);	}	P_SeekerMissile(actor, ANGLE_1*2, ANGLE_1*10);}//============================================================================//// MStaffSpawn2 - for use by mage class boss////============================================================================void MStaffSpawn2(mobj_t *actor, angle_t angle){	mobj_t *mo;	mo = P_SpawnMissileAngle(actor, MT_MSTAFF_FX2, angle, 0);	if (mo)	{		mo->target = actor;		mo->special1 = (int)P_RoughMonsterSearch(mo, 10);	}}//============================================================================//// A_MStaffAttack2 - for use by mage class boss////============================================================================void A_MStaffAttack2(mobj_t *actor){	angle_t angle;	angle = actor->angle;	MStaffSpawn2(actor, angle);	MStaffSpawn2(actor, angle-ANGLE_1*5);	MStaffSpawn2(actor, angle+ANGLE_1*5);	S_StartSound(actor, SFX_MAGE_STAFF_FIRE);}//============================================================================//// A_FPunchAttack////============================================================================void A_FPunchAttack(player_t *player, pspdef_t *psp){	angle_t angle;	int damage;	int slope;	mobj_t *pmo = player->mo;	fixed_t power;	int i;	damage = 40+(P_Random()&15);	power = 2*FRACUNIT;	PuffType = MT_PUNCHPUFF;	for(i = 0; i < 16; i++)	{		angle = pmo->angle+i*(ANG45/16);		slope = P_AimLineAttack(pmo, angle, 2*MELEERANGE);		if(linetarget)		{			player->mo->special1++;			if(pmo->special1 == 3)			{				damage <<= 1;				power = 6*FRACUNIT;				PuffType = MT_HAMMERPUFF;			}			P_LineAttack(pmo, angle, 2*MELEERANGE, slope, damage);			if (linetarget->flags&MF_COUNTKILL || linetarget->player)			{				P_ThrustMobj(linetarget, angle, power);			}			AdjustPlayerAngle(pmo);			goto punchdone;		}		angle = pmo->angle-i*(ANG45/16);		slope = P_AimLineAttack(pmo, angle, 2*MELEERANGE);		if(linetarget)		{			pmo->special1++;			if(pmo->special1 == 3)			{				damage <<= 1;				power = 6*FRACUNIT;				PuffType = MT_HAMMERPUFF;			}			P_LineAttack(pmo, angle, 2*MELEERANGE, slope, damage);			if (linetarget->flags&MF_COUNTKILL || linetarget->player)			{				P_ThrustMobj(linetarget, angle, power);			}			AdjustPlayerAngle(pmo);			goto punchdone;		}	}	// didn't find any creatures, so try to strike any walls	pmo->special1 = 0;	angle = pmo->angle;	slope = P_AimLineAttack(pmo, angle, MELEERANGE);	P_LineAttack(pmo, angle, MELEERANGE, slope, damage);punchdone:	if(pmo->special1 == 3)	{		pmo->special1 = 0;		P_SetPsprite(player, ps_weapon, S_PUNCHATK2_1);		S_StartSound(pmo, SFX_FIGHTER_GRUNT);	}	return;		}//============================================================================//// A_FAxeAttack////============================================================================#define AXERANGE	2.25*MELEERANGEvoid A_FAxeAttack(player_t *player, pspdef_t *psp){	angle_t angle;	mobj_t *pmo=player->mo;	fixed_t power;	int damage;	int slope;	int i;	int useMana;	damage = 40+(P_Random()&15)+(P_Random()&7);	power = 0;	if(player->mana[MANA_1] > 0)	{		damage <<= 1;		power = 6*FRACUNIT;		PuffType = MT_AXEPUFF_GLOW;		useMana = 1;	}	else	{		PuffType = MT_AXEPUFF;		useMana = 0;	}	for(i = 0; i < 16; i++)	{		angle = pmo->angle+i*(ANG45/16);		slope = P_AimLineAttack(pmo, angle, AXERANGE);		if(linetarget)		{			P_LineAttack(pmo, angle, AXERANGE, slope, damage);			if (linetarget->flags&MF_COUNTKILL || linetarget->player)			{				P_ThrustMobj(linetarget, angle, power);			}			AdjustPlayerAngle(pmo);			useMana++; 			goto axedone;		}		angle = pmo->angle-i*(ANG45/16);		slope = P_AimLineAttack(pmo, angle, AXERANGE);		if(linetarget)		{			P_LineAttack(pmo, angle, AXERANGE, slope, damage);			if (linetarget->flags&MF_COUNTKILL)			{				P_ThrustMobj(linetarget, angle, power);			}			AdjustPlayerAngle(pmo);			useMana++; 			goto axedone;		}	}	// didn't find any creatures, so try to strike any walls	pmo->special1 = 0;	angle = pmo->angle;	slope = P_AimLineAttack(pmo, angle, MELEERANGE);	P_LineAttack(pmo, angle, MELEERANGE, slope, damage);axedone:	if(useMana == 2)	{		player->mana[MANA_1] -= 			WeaponManaUse[player->class][player->readyweapon];		if(player->mana[MANA_1] <= 0)		{			P_SetPsprite(player, ps_weapon, S_FAXEATK_5);		}	}	return;		}//===========================================================================//// A_CMaceAttack////===========================================================================void A_CMaceAttack(player_t *player, pspdef_t *psp){	angle_t angle;	int damage;	int slope;	int i;	damage = 25+(P_Random()&15);	PuffType = MT_HAMMERPUFF;	for(i = 0; i < 16; i++)	{		angle = player->mo->angle+i*(ANG45/16);		slope = P_AimLineAttack(player->mo, angle, 2*MELEERANGE);		if(linetarget)		{			P_LineAttack(player->mo, angle, 2*MELEERANGE, slope, 				damage);			AdjustPlayerAngle(player->mo);//			player->mo->angle = R_PointToAngle2(player->mo->x,//				player->mo->y, linetarget->x, linetarget->y);			goto macedone;		}		angle = player->mo->angle-i*(ANG45/16);		slope = P_AimLineAttack(player->mo, angle, 2*MELEERANGE);		if(linetarget)		{			P_LineAttack(player->mo, angle, 2*MELEERANGE, slope, 				damage);			AdjustPlayerAngle(player->mo);//			player->mo->angle = R_PointToAngle2(player->mo->x,//				player->mo->y, linetarget->x, linetarget->y);			goto macedone;		}	}	// didn't find any creatures, so try to strike any walls	player->mo->special1 = 0;	angle = player->mo->angle;	slope = P_AimLineAttack(player->mo, angle, MELEERANGE);	P_LineAttack(player->mo, angle, MELEERANGE, slope, 		damage);macedone:	return;		}//============================================================================//// A_CStaffCheck////============================================================================void A_CStaffCheck(player_t *player, pspdef_t *psp){	mobj_t *pmo;	int damage;	int newLife;	angle_t angle;	int slope;	int i;	pmo = player->mo;	damage = 20+(P_Random()&15);	PuffType = MT_CSTAFFPUFF;	for(i = 0; i < 3; i++)	{		angle = pmo->angle+i*(ANG45/16);		slope = P_AimLineAttack(pmo, angle, 1.5*MELEERANGE);		if(linetarget)		{			P_LineAttack(pmo, angle, 1.5*MELEERANGE, slope, damage);			pmo->angle = R_PointToAngle2(pmo->x, pmo->y, 				linetarget->x, linetarget->y);			if((linetarget->player || linetarget->flags&MF_COUNTKILL)				&& (!(linetarget->flags2&(MF2_DORMANT+MF2_INVULNERABLE))))			{				newLife = player->health+(damage>>3);				newLife = newLife > 100 ? 100 : newLife;				pmo->health = player->health = newLife;				P_SetPsprite(player, ps_weapon, S_CSTAFFATK2_1);			}			player->mana[MANA_1] -= 				WeaponManaUse[player->class][player->readyweapon];			break;		}		angle = pmo->angle-i*(ANG45/16);		slope = P_AimLineAttack(player->mo, angle, 1.5*MELEERANGE);		if(linetarget)		{			P_LineAttack(pmo, angle, 1.5*MELEERANGE, slope, damage);			pmo->angle = R_PointToAngle2(pmo->x, pmo->y, 				linetarget->x, linetarget->y);			if(linetarget->player || linetarget->flags&MF_COUNTKILL)			{				newLife = player->health+(damage>>4);				newLife = newLife > 100 ? 100 : newLife;				pmo->health = player->health = newLife;				P_SetPsprite(player, ps_weapon, S_CSTAFFATK2_1);			}			player->mana[MANA_1] -= 				WeaponManaUse[player->class][player->readyweapon];			break;		}	}}//============================================================================//// A_CStaffAttack////============================================================================void A_CStaffAttack(player_t *player, pspdef_t *psp){	mobj_t *mo;	mobj_t *pmo;	player->mana[MANA_1] -=	WeaponManaUse[player->class][player->readyweapon];	pmo = player->mo;	mo = P_SPMAngle(pmo, MT_CSTAFF_MISSILE, pmo->angle-(ANG45/15));	if(mo)	{		mo->special2 = 32;	}	mo = P_SPMAngle(pmo, MT_CSTAFF_MISSILE, pmo->angle+(ANG45/15));	if(mo)	{		mo->special2 = 0;	}	S_StartSound(player->mo, SFX_CLERIC_CSTAFF_FIRE);}//============================================================================//// A_CStaffMissileSlither////============================================================================void A_CStaffMissileSlither(mobj_t *actor){	fixed_t newX, newY;	int weaveXY;	int angle;	weaveXY = actor->special2;	angle = (actor->angle+ANG90)>>ANGLETOFINESHIFT;	newX = actor->x-FixedMul(finecosine[angle], 		FloatBobOffsets[weaveXY]);	newY = actor->y-FixedMul(finesine[angle],		FloatBobOffsets[weaveXY]);	weaveXY = (weaveXY+3)&63;	newX += FixedMul(finecosine[angle], 		FloatBobOffsets[weaveXY]);	newY += FixedMul(finesine[angle], 		FloatBobOffsets[weaveXY]);	P_TryMove(actor, newX, newY);	actor->special2 = weaveXY;	}//============================================================================//// A_CStaffInitBlink////============================================================================void A_CStaffInitBlink(player_t *player, pspdef_t *psp){	player->mo->special1 = (P_Random()>>1)+20;}//============================================================================//// A_CStaffCheckBlink////============================================================================void A_CStaffCheckBlink(player_t *player, pspdef_t *psp){	if(!--player->mo->special1)	{		P_SetPsprite(player, ps_weapon, S_CSTAFFBLINK1);		player->mo->special1 = (P_Random()+50)>>2;	}}//============================================================================//// A_CFlameAttack////============================================================================#define FLAMESPEED	(0.45*FRACUNIT)#define CFLAMERANGE	(12*64*FRACUNIT)void A_CFlameAttack(player_t *player, pspdef_t *psp){	mobj_t *mo;	mo = P_SpawnPlayerMissile(player->mo, MT_CFLAME_MISSILE);	if(mo)	{		mo->thinker.function = P_BlasterMobjThinker;		mo->special1 = 2;	}	player->mana[MANA_2] -= WeaponManaUse[player->class][player->readyweapon];	S_StartSound(player->mo, SFX_CLERIC_FLAME_FIRE);}//============================================================================//// A_CFlamePuff////============================================================================void A_CFlamePuff(mobj_t *actor){	A_UnHideThing(actor);	actor->momx = 0;	actor->momy = 0;	actor->momz = 0;	S_StartSound(actor, SFX_CLERIC_FLAME_EXPLODE);}//============================================================================//// A_CFlameMissile////============================================================================void A_CFlameMissile(mobj_t *actor){	int i;	int an, an90;	fixed_t dist;	mobj_t *mo;		A_UnHideThing(actor);	S_StartSound(actor, SFX_CLERIC_FLAME_EXPLODE);	if(BlockingMobj && BlockingMobj->flags&MF_SHOOTABLE)	{ // Hit something, so spawn the flame circle around the thing		dist = BlockingMobj->radius+18*FRACUNIT;		for(i = 0; i < 4; i++)		{			an = (i*ANG45)>>ANGLETOFINESHIFT;			an90 = (i*ANG45+ANG90)>>ANGLETOFINESHIFT;			mo = P_SpawnMobj(BlockingMobj->x+FixedMul(dist, finecosine[an]),				BlockingMobj->y+FixedMul(dist, finesine[an]), 				BlockingMobj->z+5*FRACUNIT, MT_CIRCLEFLAME);			if(mo)			{				mo->angle = an<<ANGLETOFINESHIFT;				mo->target = actor->target;				mo->momx = mo->special1 = FixedMul(FLAMESPEED, finecosine[an]);				mo->momy = mo->special2 = FixedMul(FLAMESPEED, finesine[an]);				mo->tics -= P_Random()&3;			}			mo = P_SpawnMobj(BlockingMobj->x-FixedMul(dist, finecosine[an]),				BlockingMobj->y-FixedMul(dist, finesine[an]), 				BlockingMobj->z+5*FRACUNIT, MT_CIRCLEFLAME);			if(mo)			{				mo->angle = ANG180+(an<<ANGLETOFINESHIFT);				mo->target = actor->target;				mo->momx = mo->special1 = FixedMul(-FLAMESPEED, 					finecosine[an]);				mo->momy = mo->special2 = FixedMul(-FLAMESPEED, finesine[an]);				mo->tics -= P_Random()&3;			}		}		P_SetMobjState(actor, S_FLAMEPUFF2_1);	}}/*void A_CFlameAttack(player_t *player, pspdef_t *psp){	mobj_t *pmo;	angle_t angle;	int damage;	int i;	int an, an90;	fixed_t dist;	mobj_t *mo;	pmo = player->mo;	P_BulletSlope(pmo);	damage = 25+HITDICE(3);	angle = pmo->angle;	if(player->refire)	{		angle += (P_Random()-P_Random())<<17;	}	P_AimLineAttack(pmo, angle, CFLAMERANGE); // Correctly set linetarget	if(!linetarget)	{		angle += ANGLE_1*2;		P_AimLineAttack(pmo, angle, CFLAMERANGE);		if(!linetarget)		{			angle -= ANGLE_1*4;			P_AimLineAttack(pmo, angle, CFLAMERANGE);			if(!linetarget)			{				angle += ANGLE_1*2;			}		}			}	if(linetarget)	{		PuffType = MT_FLAMEPUFF2;	}	else	{		PuffType = MT_FLAMEPUFF;	}	P_LineAttack(pmo, angle, CFLAMERANGE, bulletslope, damage);	if(linetarget)	{ // Hit something, so spawn the flame circle around the thing		dist = linetarget->radius+18*FRACUNIT;		for(i = 0; i < 4; i++)		{			an = (i*ANG45)>>ANGLETOFINESHIFT;			an90 = (i*ANG45+ANG90)>>ANGLETOFINESHIFT;			mo = P_SpawnMobj(linetarget->x+FixedMul(dist, finecosine[an]),				linetarget->y+FixedMul(dist, finesine[an]), 				linetarget->z+5*FRACUNIT, MT_CIRCLEFLAME);			if(mo)			{				mo->angle = an<<ANGLETOFINESHIFT;				mo->target = pmo;				mo->momx = mo->special1 = FixedMul(FLAMESPEED, finecosine[an]);				mo->momy = mo->special2 = FixedMul(FLAMESPEED, finesine[an]);				mo->tics -= P_Random()&3;			}			mo = P_SpawnMobj(linetarget->x-FixedMul(dist, finecosine[an]),				linetarget->y-FixedMul(dist, finesine[an]), 				linetarget->z+5*FRACUNIT, MT_CIRCLEFLAME);			if(mo)			{				mo->angle = ANG180+(an<<ANGLETOFINESHIFT);				mo->target = pmo;				mo->momx = mo->special1 = FixedMul(-FLAMESPEED, 					finecosine[an]);				mo->momy = mo->special2 = FixedMul(-FLAMESPEED, finesine[an]);				mo->tics -= P_Random()&3;			}		}	}// Create a line of flames from the player to the flame puff	CFlameCreateFlames(player->mo);	player->mana[MANA_2] -= WeaponManaUse[player->class][player->readyweapon];	S_StartSound(player->mo, SFX_CLERIC_FLAME_FIRE);}*///============================================================================//// A_CFlameRotate////============================================================================#define FLAMEROTSPEED	2*FRACUNITvoid A_CFlameRotate(mobj_t *actor){	int an;	an = (actor->angle+ANG90)>>ANGLETOFINESHIFT;	actor->momx = actor->special1+FixedMul(FLAMEROTSPEED, finecosine[an]);	actor->momy = actor->special2+FixedMul(FLAMEROTSPEED, finesine[an]);	actor->angle += ANG90/15;}//============================================================================//// A_CHolyAttack3//// 	Spawns the spirits//============================================================================void A_CHolyAttack3(mobj_t *actor){	P_SpawnMissile(actor, actor->target, MT_HOLY_MISSILE);	S_StartSound(actor, SFX_CHOLY_FIRE);}//============================================================================//// A_CHolyAttack2 //// 	Spawns the spirits

⌨️ 快捷键说明

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