DEFINE_ACTION_FUNCTION(AActor, A_CMaceAttack) { angle_t angle; int damage; int slope; int i; player_t *player; AActor *linetarget; if (NULL == (player = self->player)) { return; } damage = 25+(pr_maceatk()&15); for (i = 0; i < 16; i++) { angle = player->mo->angle+i*(ANG45/16); slope = P_AimLineAttack (player->mo, angle, 2*MELEERANGE, &linetarget); if (linetarget) { P_LineAttack (player->mo, angle, 2*MELEERANGE, slope, damage, NAME_Melee, PClass::FindClass ("HammerPuff"), true, &linetarget); if (linetarget != NULL) { AdjustPlayerAngle (player->mo, linetarget); goto macedone; } } angle = player->mo->angle-i*(ANG45/16); slope = P_AimLineAttack (player->mo, angle, 2*MELEERANGE, &linetarget); if (linetarget) { P_LineAttack (player->mo, angle, 2*MELEERANGE, slope, damage, NAME_Melee, PClass::FindClass ("HammerPuff"), true, &linetarget); if (linetarget != NULL) { AdjustPlayerAngle (player->mo, linetarget); 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, &linetarget); P_LineAttack (player->mo, angle, MELEERANGE, slope, damage, NAME_Melee, PClass::FindClass ("HammerPuff")); macedone: return; }
static bool TryPunch(APlayerPawn *pmo, DAngle angle, int damage, int power) { PClassActor *pufftype; FTranslatedLineTarget t; DAngle slope; slope = P_AimLineAttack (pmo, angle, 2*MELEERANGE, &t); if (t.linetarget != NULL) { if (++pmo->weaponspecial >= 3) { damage <<= 1; power *= 3; pufftype = PClass::FindActor("HammerPuff"); } else { pufftype = PClass::FindActor("PunchPuff"); } P_LineAttack (pmo, angle, 2*MELEERANGE, slope, damage, NAME_Melee, pufftype, true, &t); if (t.linetarget != NULL) { if (t.linetarget->player != NULL || (t.linetarget->Mass != INT_MAX && (t.linetarget->flags3 & MF3_ISMONSTER))) { t.linetarget->Thrust(t.angleFromSource, power); } AdjustPlayerAngle (pmo, &t); return true; } } return false; }
static bool TryPunch(APlayerPawn *pmo, angle_t angle, int damage, fixed_t power) { const PClass *pufftype; AActor *linetarget; int slope; slope = P_AimLineAttack (pmo, angle, 2*MELEERANGE, &linetarget); if (linetarget != NULL) { if (++pmo->weaponspecial >= 3) { damage <<= 1; power *= 3; pufftype = PClass::FindClass ("HammerPuff"); } else { pufftype = PClass::FindClass ("PunchPuff"); } P_LineAttack (pmo, angle, 2*MELEERANGE, slope, damage, NAME_Melee, pufftype, true, &linetarget); if (linetarget != NULL) { if (linetarget->player != NULL || (linetarget->Mass != INT_MAX && (linetarget->flags3 & MF3_ISMONSTER))) { P_ThrustMobj (linetarget, angle, power); } AdjustPlayerAngle (pmo, linetarget); return true; } } return false; }
void A_SnoutAttack (AActor *actor) { angle_t angle; int damage; int slope; player_t *player; if (NULL == (player = actor->player)) { return; } damage = 3+(pr_snoutattack()&3); angle = player->mo->angle; slope = P_AimLineAttack(player->mo, angle, MELEERANGE); PuffSpawned = NULL; P_LineAttack(player->mo, angle, MELEERANGE, slope, damage, MOD_HIT, RUNTIME_CLASS(ASnoutPuff)); S_Sound(player->mo, CHAN_VOICE, "PigActive", 1, ATTN_NORM); if(linetarget) { AdjustPlayerAngle(player->mo); if(PuffSpawned) { // Bit something S_Sound(player->mo, CHAN_VOICE, "PigAttack", 1, ATTN_NORM); } } }
DEFINE_ACTION_FUNCTION(AActor, A_SnoutAttack) { angle_t angle; int damage; int slope; player_t *player; AActor *puff; AActor *linetarget; if (NULL == (player = self->player)) { return; } damage = 3+(pr_snoutattack()&3); angle = player->mo->angle; slope = P_AimLineAttack(player->mo, angle, MELEERANGE, &linetarget); puff = P_LineAttack(player->mo, angle, MELEERANGE, slope, damage, NAME_Melee, "SnoutPuff", true, &linetarget); S_Sound(player->mo, CHAN_VOICE, "PigActive", 1, ATTN_NORM); if(linetarget) { AdjustPlayerAngle(player->mo, linetarget); if(puff != NULL) { // Bit something S_Sound(player->mo, CHAN_VOICE, "PigAttack", 1, ATTN_NORM); } } }
DEFINE_ACTION_FUNCTION(AActor, A_SnoutAttack) { angle_t angle; int damage; int slope; player_t *player; AActor *puff; AActor *linetarget; if (NULL == (player = self->player)) { return; } damage = 3+(pr_snoutattack()&3); angle = player->mo->angle; slope = P_AimLineAttack(player->mo, angle, MELEERANGE, &linetarget); puff = P_LineAttack(player->mo, angle, MELEERANGE, slope, damage, NAME_Melee, "SnoutPuff", true); S_Sound(player->mo, CHAN_VOICE, "PigActive", 1, ATTN_NORM); // [Dusk] clients aren't properly aware of linetarget, thus they stop here. if (NETWORK_InClientMode()) return; if(linetarget) { AdjustPlayerAngle(player->mo, linetarget); // [Dusk] update angle if (NETWORK_GetState() == NETSTATE_SERVER) SERVERCOMMANDS_MoveThing(player->mo, CM_ANGLE); if(puff != NULL) { // Bit something S_Sound(player->mo, CHAN_VOICE, "PigAttack", 1, ATTN_NORM); // [Dusk] tell clients of the attack sound if (NETWORK_GetState() == NETSTATE_SERVER) SERVERCOMMANDS_SoundActor (player->mo, CHAN_VOICE, "PigAttack", 1, ATTN_NORM); } } }
void A_FPunchAttack (AActor *actor) { angle_t angle; int damage; int slope; fixed_t power; int i; player_t *player; const PClass *pufftype; if (NULL == (player = actor->player)) { return; } APlayerPawn *pmo = player->mo; damage = 40+(pr_fpatk()&15); power = 2*FRACUNIT; pufftype = RUNTIME_CLASS(APunchPuff); for (i = 0; i < 16; i++) { 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 = RUNTIME_CLASS(AHammerPuff); } P_LineAttack (pmo, angle, 2*MELEERANGE, slope, damage, MOD_HIT, pufftype); if (linetarget->flags3&MF3_ISMONSTER || 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 = RUNTIME_CLASS(AHammerPuff); } P_LineAttack (pmo, angle, 2*MELEERANGE, slope, damage, MOD_HIT, pufftype); if (linetarget->flags3&MF3_ISMONSTER || 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, MOD_HIT, pufftype); punchdone: if (pmo->special1 == 3) { pmo->special1 = 0; P_SetPsprite (player, ps_weapon, &AFWeapFist::States[S_PUNCHATK2]); S_Sound (pmo, CHAN_VOICE, "*fistgrunt", 1, ATTN_NORM); } return; }
DEFINE_ACTION_FUNCTION(AActor, A_FHammerAttack) { angle_t angle; int damage; fixed_t power; int slope; int i; player_t *player; AActor *linetarget; if (NULL == (player = self->player)) { return; } AActor *pmo=player->mo; damage = 60+(pr_hammeratk()&63); power = 10*FRACUNIT; for (i = 0; i < 16; i++) { angle = pmo->angle + i*(ANG45/32); slope = P_AimLineAttack (pmo, angle, HAMMER_RANGE, &linetarget, 0, ALF_CHECK3D); if (linetarget) { P_LineAttack (pmo, angle, HAMMER_RANGE, slope, damage, NAME_Melee, PClass::FindClass ("HammerPuff"), true, &linetarget); if (linetarget != NULL) { AdjustPlayerAngle(pmo, linetarget); if (linetarget->flags3&MF3_ISMONSTER || linetarget->player) { P_ThrustMobj (linetarget, angle, power); } // [BC] Apply spread. if ( player->cheats & CF_SPREAD ) { P_LineAttack (pmo, angle + ( ANGLE_45 / 3 ), HAMMER_RANGE, slope, damage, NAME_Melee, PClass::FindClass ("HammerPuff"), true); AdjustPlayerAngle(pmo, linetarget); if ( linetarget->flags3 & MF3_ISMONSTER || linetarget->player ) { P_ThrustMobj( linetarget, angle + ( ANGLE_45 / 3 ), power ); } P_LineAttack (pmo, angle - ( ANGLE_45 / 3 ), HAMMER_RANGE, slope, damage, NAME_Melee, PClass::FindClass ("HammerPuff"), true); AdjustPlayerAngle(pmo, linetarget); if ( linetarget->flags3 & MF3_ISMONSTER || linetarget->player ) { P_ThrustMobj( linetarget, angle - ( ANGLE_45 / 3 ), power ); } } pmo->special1 = false; // Don't throw a hammer goto hammerdone; } } angle = pmo->angle-i*(ANG45/32); slope = P_AimLineAttack(pmo, angle, HAMMER_RANGE, &linetarget, 0, ALF_CHECK3D); if(linetarget) { P_LineAttack(pmo, angle, HAMMER_RANGE, slope, damage, NAME_Melee, PClass::FindClass ("HammerPuff"), true, &linetarget); if (linetarget != NULL) { AdjustPlayerAngle(pmo, linetarget); if (linetarget->flags3&MF3_ISMONSTER || linetarget->player) { P_ThrustMobj(linetarget, angle, power); } // [BC] Apply spread. if ( player->cheats & CF_SPREAD ) { P_LineAttack(pmo, angle + ( ANGLE_45 / 3 ), HAMMER_RANGE, slope, damage, NAME_Melee, PClass::FindClass ("HammerPuff"), true); AdjustPlayerAngle(pmo, linetarget); if ( linetarget->flags3 & MF3_ISMONSTER || linetarget->player ) { P_ThrustMobj( linetarget, angle + ( ANGLE_45 / 3 ), power ); } P_LineAttack(pmo, angle - ( ANGLE_45 / 3 ), HAMMER_RANGE, slope, damage, NAME_Melee, PClass::FindClass ("HammerPuff"), true); AdjustPlayerAngle(pmo, linetarget); if ( linetarget->flags3 & MF3_ISMONSTER || linetarget->player ) { P_ThrustMobj( linetarget, angle - ( ANGLE_45 / 3 ), 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 angle = pmo->angle; slope = P_AimLineAttack (pmo, angle, HAMMER_RANGE, &linetarget, 0, ALF_CHECK3D); if (P_LineAttack (pmo, angle, HAMMER_RANGE, slope, damage, NAME_Melee, PClass::FindClass ("HammerPuff"), true) != NULL) { pmo->special1 = false; } else { pmo->special1 = true; } // [BC] Apply spread. if ( player->cheats & CF_SPREAD ) { if (P_LineAttack (pmo, angle + ( ANGLE_45 / 3 ), HAMMER_RANGE, slope, damage, NAME_Melee, PClass::FindClass ("HammerPuff"), true) != NULL) pmo->special1 = false; else pmo->special1 = true; if (P_LineAttack (pmo, angle - ( ANGLE_45 / 3 ), HAMMER_RANGE, slope, damage, NAME_Melee, PClass::FindClass ("HammerPuff"), true) != NULL) pmo->special1 = false; else pmo->special1 = true; } hammerdone: // Don't spawn a hammer if the player doesn't have enough mana if (player->ReadyWeapon == NULL || !player->ReadyWeapon->CheckAmmo (player->ReadyWeapon->bAltFire ? AWeapon::AltFire : AWeapon::PrimaryFire, false, true)) { pmo->special1 = false; } return; }
void A_FAxeAttack (AActor *actor) { angle_t angle; fixed_t power; int damage; int slope; int i; int useMana; player_t *player; AWeapon *weapon; const TypeInfo *pufftype; if (NULL == (player = actor->player)) { return; } AActor *pmo=player->mo; damage = 40+(pr_atk()&15); damage += pr_atk()&7; power = 0; weapon = player->ReadyWeapon; if (player->ReadyWeapon->Ammo1->Amount > 0) { damage <<= 1; power = 6*FRACUNIT; pufftype = RUNTIME_CLASS(AAxePuffGlow); useMana = 1; } else { pufftype = RUNTIME_CLASS(AAxePuff); 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, MOD_HIT, pufftype); if (linetarget->flags3&MF3_ISMONSTER || 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, MOD_HIT, pufftype); if (linetarget->flags3&MF3_ISMONSTER) { 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, MOD_HIT, pufftype); axedone: if (useMana == 2) { AWeapon *weapon = player->ReadyWeapon; if (weapon != NULL) { weapon->DepleteAmmo (weapon->bAltFire, false); if ((weapon->Ammo1 == NULL || weapon->Ammo1->Amount == 0) && (!(weapon->WeaponFlags & WIF_PRIMARY_USES_BOTH) || weapon->Ammo2 == NULL || weapon->Ammo2->Amount == 0)) { P_SetPsprite (player, ps_weapon, &AFWeapAxe::States[S_FAXEATK+5]); } } } return; }
DEFINE_ACTION_FUNCTION(AActor, A_FAxeAttack) { angle_t angle; fixed_t power; int damage; int slope; int i; int useMana; player_t *player; AWeapon *weapon; const PClass *pufftype; AActor *linetarget; if (NULL == (player = self->player)) { return; } AActor *pmo=player->mo; damage = 40+(pr_axeatk()&15); damage += pr_axeatk()&7; power = 0; weapon = player->ReadyWeapon; if (player->ReadyWeapon->Ammo1->Amount > 0) { damage <<= 1; power = 6*FRACUNIT; pufftype = PClass::FindClass ("AxePuffGlow"); useMana = 1; } else { pufftype = PClass::FindClass ("AxePuff"); useMana = 0; } for (i = 0; i < 16; i++) { angle = pmo->angle+i*(ANG45/16); slope = P_AimLineAttack (pmo, angle, AXERANGE, &linetarget); if (linetarget) { P_LineAttack (pmo, angle, AXERANGE, slope, damage, NAME_Melee, pufftype, true, &linetarget); if (linetarget != NULL) { if (linetarget->flags3&MF3_ISMONSTER || linetarget->player) { P_ThrustMobj (linetarget, angle, power); } AdjustPlayerAngle (pmo, linetarget); useMana++; goto axedone; } } angle = pmo->angle-i*(ANG45/16); slope = P_AimLineAttack (pmo, angle, AXERANGE, &linetarget); if (linetarget) { P_LineAttack (pmo, angle, AXERANGE, slope, damage, NAME_Melee, pufftype, true, &linetarget); if (linetarget != NULL) { if (linetarget->flags3&MF3_ISMONSTER) { P_ThrustMobj (linetarget, angle, power); } AdjustPlayerAngle (pmo, linetarget); 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, &linetarget); P_LineAttack (pmo, angle, MELEERANGE, slope, damage, NAME_Melee, pufftype, true); axedone: if (useMana == 2) { AWeapon *weapon = player->ReadyWeapon; if (weapon != NULL) { weapon->DepleteAmmo (weapon->bAltFire, false); if ((weapon->Ammo1 == NULL || weapon->Ammo1->Amount == 0) && (!(weapon->WeaponFlags & WIF_PRIMARY_USES_BOTH) || weapon->Ammo2 == NULL || weapon->Ammo2->Amount == 0)) { P_SetPsprite (player, ps_weapon, player->ReadyWeapon->FindState ("Fire") + 5); } } } return; }