DEFINE_ACTION_FUNCTION(AActor, A_Srcr1Attack) { PARAM_ACTION_PROLOGUE; AActor *mo; DAngle angle; if (!self->target) { return 0; } S_Sound (self, CHAN_BODY, self->AttackSound, 1, ATTN_NORM); if (self->CheckMeleeRange ()) { int damage = pr_scrc1atk.HitDice (8); int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee); P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self); return 0; } PClassActor *fx = PClass::FindActor("SorcererFX1"); if (self->health > (self->SpawnHealth()/3)*2) { // Spit one fireball P_SpawnMissileZ (self, self->Z() + 48, self->target, fx ); } else { // Spit three fireballs mo = P_SpawnMissileZ (self, self->Z() + 48, self->target, fx); if (mo != NULL) { angle = mo->Angles.Yaw; P_SpawnMissileAngleZ(self, self->Z() + 48, fx, angle - 3, mo->Vel.Z); P_SpawnMissileAngleZ(self, self->Z() + 48, fx, angle + 3, mo->Vel.Z); } if (self->health < self->SpawnHealth()/3) { // Maybe attack again if (self->special1) { // Just attacked, so don't attack again self->special1 = 0; } else { // Set state to attack again self->special1 = 1; self->SetState (self->FindState("Missile2")); } } } return 0; }
DEFINE_ACTION_FUNCTION(AActor, A_Srcr1Attack) { AActor *mo; fixed_t velz; angle_t angle; if (!self->target) { return; } S_Sound (self, CHAN_BODY, self->AttackSound, 1, ATTN_NORM); if (self->CheckMeleeRange ()) { int damage = pr_scrc1atk.HitDice (8); int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee); P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self); return; } const PClass *fx = PClass::FindClass("SorcererFX1"); if (self->health > (self->SpawnHealth()/3)*2) { // Spit one fireball P_SpawnMissileZ (self, self->Z() + 48*FRACUNIT, self->target, fx ); } else { // Spit three fireballs mo = P_SpawnMissileZ (self, self->Z() + 48*FRACUNIT, self->target, fx); if (mo != NULL) { velz = mo->velz; angle = mo->angle; P_SpawnMissileAngleZ (self, self->Z() + 48*FRACUNIT, fx, angle-ANGLE_1*3, velz); P_SpawnMissileAngleZ (self, self->Z() + 48*FRACUNIT, fx, angle+ANGLE_1*3, velz); } if (self->health < self->SpawnHealth()/3) { // Maybe attack again if (self->special1) { // Just attacked, so don't attack again self->special1 = 0; } else { // Set state to attack again self->special1 = 1; self->SetState (self->FindState("Missile2")); } } } }
void A_Srcr1Attack (AActor *actor) { AActor *mo; fixed_t momz; angle_t angle; if (!actor->target) { return; } S_SoundID (actor, CHAN_BODY, actor->AttackSound, 1, ATTN_NORM); if (actor->CheckMeleeRange ()) { int damage = pr_scrc1atk.HitDice (8); P_DamageMobj (actor->target, actor, actor, damage, NAME_Melee); P_TraceBleed (damage, actor->target, actor); return; } if (actor->health > (actor->GetDefault()->health/3)*2) { // Spit one fireball P_SpawnMissileZ (actor, actor->z + 48*FRACUNIT, actor->target, RUNTIME_CLASS(ASorcererFX1)); } else { // Spit three fireballs mo = P_SpawnMissileZ (actor, actor->z + 48*FRACUNIT, actor->target, RUNTIME_CLASS(ASorcererFX1)); if (mo != NULL) { momz = mo->momz; angle = mo->angle; P_SpawnMissileAngleZ (actor, actor->z + 48*FRACUNIT, RUNTIME_CLASS(ASorcererFX1), angle-ANGLE_1*3, momz); P_SpawnMissileAngleZ (actor, actor->z + 48*FRACUNIT, RUNTIME_CLASS(ASorcererFX1), angle+ANGLE_1*3, momz); } if (actor->health < actor->GetDefault()->health/3) { // Maybe attack again if (actor->special1) { // Just attacked, so don't attack again actor->special1 = 0; } else { // Set state to attack again actor->special1 = 1; actor->SetState (&ASorcerer1::States[S_SRCR1_ATK+3]); } } } }
DEFINE_ACTION_FUNCTION(AActor, A_MinotaurAtk2) { PARAM_ACTION_PROLOGUE; AActor *mo; DAngle angle; double vz; double z; bool friendly = !!(self->flags5 & MF5_SUMMONEDMONSTER); if (self->target == NULL) { return 0; } S_Sound (self, CHAN_WEAPON, "minotaur/attack2", 1, ATTN_NORM); if (self->CheckMeleeRange()) { int damage; damage = pr_atk.HitDice (friendly ? 3 : 5); int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee); P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self); return 0; } z = self->Z() + 40; PClassActor *fx = PClass::FindActor("MinotaurFX1"); if (fx) { mo = P_SpawnMissileZ (self, z, self->target, fx); if (mo != NULL) { // S_Sound (mo, CHAN_WEAPON, "minotaur/attack2", 1, ATTN_NORM); vz = mo->Vel.Z; angle = mo->Angles.Yaw; P_SpawnMissileAngleZ (self, z, fx, angle-(45./8), vz); P_SpawnMissileAngleZ (self, z, fx, angle+(45./8), vz); P_SpawnMissileAngleZ (self, z, fx, angle-(45./16), vz); P_SpawnMissileAngleZ (self, z, fx, angle+(45./16), vz); } } return 0; }