gzdoom/wadsrc/static/zscript/actors/doom/spidermaster.zs
Christoph Oelckers b667b930a3 fixed logic bug with HitFriend and Refire functions.
The old code was essentially ineffective and useless, this is how MBF had it and how it was supposed to be.
2024-10-03 22:30:09 +02:00

99 lines
1.8 KiB
Text

//===========================================================================
//
// Spider boss
//
//===========================================================================
class SpiderMastermind : Actor
{
Default
{
Health 3000;
Radius 128;
Height 100;
Mass 1000;
Speed 12;
PainChance 40;
MissileChanceMult 0.5;
Monster;
+BOSS
+FLOORCLIP
+NORADIUSDMG
+DONTMORPH
+BOSSDEATH
+E3M8BOSS
+E4M8BOSS
SeeSound "spider/sight";
AttackSound "spider/attack";
PainSound "spider/pain";
DeathSound "spider/death";
ActiveSound "spider/active";
Obituary "$OB_SPIDER";
Tag "$FN_SPIDER";
}
States
{
Spawn:
SPID AB 10 A_Look;
Loop;
See:
SPID A 3 A_Metal;
SPID ABB 3 A_Chase;
SPID C 3 A_Metal;
SPID CDD 3 A_Chase;
SPID E 3 A_Metal;
SPID EFF 3 A_Chase;
Loop;
Missile:
SPID A 20 BRIGHT A_FaceTarget;
SPID G 4 BRIGHT A_SPosAttackUseAtkSound;
SPID H 4 BRIGHT A_SposAttackUseAtkSound;
SPID H 1 BRIGHT A_SpidRefire;
Goto Missile+1;
Pain:
SPID I 3;
SPID I 3 A_Pain;
Goto See;
Death:
SPID J 20 A_Scream;
SPID K 10 A_NoBlocking;
SPID LMNOPQR 10;
SPID S 30;
SPID S -1 A_BossDeath;
Stop;
}
}
//===========================================================================
//
// Code (must be attached to Actor)
//
//===========================================================================
extend class Actor
{
void A_SpidRefire()
{
if (HitFriend())
{
SetState(SeeState);
return;
}
// keep firing unless target got out of sight
A_FaceTarget();
if (Random[CPosRefire](0, 255) >= 10)
{
if (!target
|| target.health <= 0
|| !CheckSight(target, SF_SEEPASTBLOCKEVERYTHING|SF_SEEPASTSHOOTABLELINES))
{
SetState(SeeState);
}
}
}
void A_Metal()
{
A_StartSound("spider/walk", CHAN_BODY, CHANF_DEFAULT, 1, ATTN_IDLE);
A_Chase();
}
}