📄 p_pspr.c
字号:
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 + -