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