mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-12-11 21:21:45 +00:00
0770c0022c
Many uses of random() & value have been turned into random(0, value). This is not only more efficient, it also ensures better random distribution because the parameter-less variant only returns values between 0 and 255.
237 lines
4.7 KiB
Text
237 lines
4.7 KiB
Text
|
|
// Programmer ---------------------------------------------------------------
|
|
|
|
class Programmer : Actor
|
|
{
|
|
Default
|
|
{
|
|
Health 1100;
|
|
PainChance 50;
|
|
Speed 26;
|
|
FloatSpeed 5;
|
|
Radius 45;
|
|
Height 60;
|
|
Mass 800;
|
|
Damage 4;
|
|
Monster;
|
|
+NOGRAVITY
|
|
+FLOAT
|
|
+NOBLOOD
|
|
+NOTDMATCH
|
|
+DONTMORPH
|
|
+NOBLOCKMONST
|
|
+LOOKALLAROUND
|
|
+NOICEDEATH
|
|
+NOTARGETSWITCH
|
|
DamageFactor "Fire", 0.5;
|
|
MinMissileChance 150;
|
|
AttackSound "programmer/attack";
|
|
PainSound "programmer/pain";
|
|
DeathSound "programmer/death";
|
|
ActiveSound "programmer/active";
|
|
Obituary "$OB_PROGRAMMER";
|
|
DropItem "Sigil1";
|
|
}
|
|
|
|
States
|
|
{
|
|
Spawn:
|
|
PRGR A 5 A_Look;
|
|
PRGR A 1 A_SentinelBob;
|
|
Loop;
|
|
See:
|
|
PRGR A 160 A_SentinelBob;
|
|
PRGR BCD 5 A_SentinelBob;
|
|
PRGR EF 2 A_SentinelBob;
|
|
PRGR EF 3 A_Chase;
|
|
Goto See+4;
|
|
Melee:
|
|
PRGR E 2 A_SentinelBob;
|
|
PRGR F 3 A_SentinelBob;
|
|
PRGR E 3 A_FaceTarget;
|
|
PRGR F 4 A_ProgrammerMelee;
|
|
Goto See+4;
|
|
Missile:
|
|
PRGR G 5 A_FaceTarget;
|
|
PRGR H 5 A_SentinelBob;
|
|
PRGR I 5 Bright A_FaceTarget;
|
|
PRGR J 5 Bright A_SpotLightning;
|
|
Goto See+4;
|
|
Pain:
|
|
PRGR K 5 A_Pain;
|
|
PRGR L 5 A_SentinelBob;
|
|
Goto See+4;
|
|
Death:
|
|
PRGR L 7 Bright A_TossGib;
|
|
PRGR M 7 Bright A_Scream;
|
|
PRGR N 7 Bright A_TossGib;
|
|
PRGR O 7 Bright A_NoBlocking;
|
|
PRGR P 7 Bright A_TossGib;
|
|
PRGR Q 7 Bright A_SpawnProgrammerBase;
|
|
PRGR R 7 Bright;
|
|
PRGR S 6 Bright;
|
|
PRGR TUVW 5 Bright;
|
|
PRGR X 32 Bright;
|
|
PRGR X -1 Bright A_ProgrammerDeath;
|
|
Stop;
|
|
}
|
|
|
|
//============================================================================
|
|
//
|
|
// A_ProgrammerMelee
|
|
//
|
|
//============================================================================
|
|
|
|
void A_ProgrammerMelee ()
|
|
{
|
|
if (target == null)
|
|
return;
|
|
|
|
A_FaceTarget ();
|
|
|
|
if (!CheckMeleeRange ())
|
|
return;
|
|
|
|
A_PlaySound("programmer/clank", CHAN_WEAPON);
|
|
|
|
int damage = random[Programmer](1, 10) * 6;
|
|
int newdam = target.DamageMobj (self, self, damage, 'Melee');
|
|
target.TraceBleed (newdam > 0 ? newdam : damage, self);
|
|
}
|
|
|
|
//============================================================================
|
|
//
|
|
// A_SpawnProgrammerBase
|
|
//
|
|
//============================================================================
|
|
|
|
void A_SpawnProgrammerBase ()
|
|
{
|
|
Actor foo = Spawn("ProgrammerBase", Pos + (0,0,24), ALLOW_REPLACE);
|
|
if (foo != null)
|
|
{
|
|
foo.Angle = Angle + 180. + Random2[Programmer]() * (360. / 1024.);
|
|
foo.VelFromAngle();
|
|
foo.Vel.Z = random[Programmer]() / 128.;
|
|
}
|
|
}
|
|
|
|
//============================================================================
|
|
//
|
|
// A_ProgrammerDeath
|
|
//
|
|
//============================================================================
|
|
|
|
void A_ProgrammerDeath ()
|
|
{
|
|
if (!CheckBossDeath ())
|
|
return;
|
|
|
|
for (int i = 0; i < MAXPLAYERS; ++i)
|
|
{
|
|
if (playeringame[i] && players[i].health > 0)
|
|
{
|
|
players[i].mo.GiveInventoryType ("ProgLevelEnder");
|
|
break;
|
|
}
|
|
}
|
|
// the sky change scripts are now done as special actions in MAPINFO
|
|
A_BossDeath();
|
|
}
|
|
|
|
//============================================================================
|
|
//
|
|
// A_SpotLightning
|
|
//
|
|
//============================================================================
|
|
|
|
void A_SpotLightning()
|
|
{
|
|
if (target == null) return;
|
|
|
|
Actor spot = Spawn("SpectralLightningSpot", (target.pos.xy, target.floorz), ALLOW_REPLACE);
|
|
if (spot != null)
|
|
{
|
|
spot.threshold = 25;
|
|
spot.target = self;
|
|
spot.FriendPlayer = 0;
|
|
spot.tracer = target;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
// The Programmer's base for when he dies -----------------------------------
|
|
|
|
class ProgrammerBase : Actor
|
|
{
|
|
Default
|
|
{
|
|
+NOBLOCKMAP
|
|
+NOCLIP
|
|
+NOBLOOD
|
|
}
|
|
States
|
|
{
|
|
Spawn:
|
|
BASE A 5 Bright A_Explode(32,32,1,1);
|
|
BASE BCD 5 Bright;
|
|
BASE EFG 5;
|
|
BASE H -1;
|
|
Stop;
|
|
}
|
|
}
|
|
|
|
|
|
// The Programmer level ending thing ----------------------------------------
|
|
|
|
class ProgLevelEnder : Inventory
|
|
{
|
|
Default
|
|
{
|
|
+INVENTORY.UNDROPPABLE
|
|
}
|
|
|
|
|
|
//============================================================================
|
|
//
|
|
// AProgLevelEnder :: Tick
|
|
//
|
|
// Fade to black, end the level, then unfade.
|
|
//
|
|
//============================================================================
|
|
|
|
override void Tick ()
|
|
{
|
|
if (special2 == 0)
|
|
{ // fade out over .66 second
|
|
special1 += 255 / (TICRATE*2/3);
|
|
if (++special1 >= 255)
|
|
{
|
|
special1 = 255;
|
|
special2 = 1;
|
|
Exit_Normal(0);
|
|
}
|
|
}
|
|
else
|
|
{ // fade in over two seconds
|
|
special1 -= 255 / (TICRATE*2);
|
|
if (special1 <= 0)
|
|
{
|
|
Destroy ();
|
|
}
|
|
}
|
|
}
|
|
|
|
//============================================================================
|
|
//
|
|
// AProgLevelEnder :: GetBlend
|
|
//
|
|
//============================================================================
|
|
|
|
override Color GetBlend ()
|
|
{
|
|
return Color(special1, 0, 0, 0);
|
|
}
|
|
}
|