mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-15 00:41:57 +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.
325 lines
6 KiB
Text
325 lines
6 KiB
Text
|
|
// The Cleric's Flame Strike ------------------------------------------------
|
|
|
|
class CWeapFlame : ClericWeapon
|
|
{
|
|
Default
|
|
{
|
|
+NOGRAVITY
|
|
Weapon.SelectionOrder 1000;
|
|
Weapon.AmmoUse 4;
|
|
Weapon.AmmoGive 25;
|
|
Weapon.KickBack 150;
|
|
Weapon.YAdjust 10;
|
|
Weapon.AmmoType1 "Mana2";
|
|
Inventory.PickupMessage "$TXT_WEAPON_C3";
|
|
Tag "$TAG_CWEAPFLAME";
|
|
}
|
|
|
|
States
|
|
{
|
|
Spawn:
|
|
WCFM ABCDEFGH 4 Bright;
|
|
Loop;
|
|
Select:
|
|
CFLM A 1 A_Raise;
|
|
Loop;
|
|
Deselect:
|
|
CFLM A 1 A_Lower;
|
|
Loop;
|
|
Ready:
|
|
CFLM AAAABBBBCCCC 1 A_WeaponReady;
|
|
Loop;
|
|
Fire:
|
|
CFLM A 2 Offset (0, 40);
|
|
CFLM D 2 Offset (0, 50);
|
|
CFLM D 2 Offset (0, 36);
|
|
CFLM E 4 Bright;
|
|
CFLM F 4 Bright A_CFlameAttack;
|
|
CFLM E 4 Bright;
|
|
CFLM G 2 Offset (0, 40);
|
|
CFLM G 2;
|
|
Goto Ready;
|
|
}
|
|
|
|
//============================================================================
|
|
//
|
|
// A_CFlameAttack
|
|
//
|
|
//============================================================================
|
|
|
|
action void A_CFlameAttack()
|
|
{
|
|
if (player == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Weapon weapon = player.ReadyWeapon;
|
|
if (weapon != null)
|
|
{
|
|
if (!weapon.DepleteAmmo (weapon.bAltFire))
|
|
return;
|
|
}
|
|
SpawnPlayerMissile ("CFlameMissile");
|
|
A_PlaySound ("ClericFlameFire", CHAN_WEAPON);
|
|
}
|
|
}
|
|
|
|
// Floor Flame --------------------------------------------------------------
|
|
|
|
class CFlameFloor : Actor
|
|
{
|
|
Default
|
|
{
|
|
+NOBLOCKMAP +NOGRAVITY +ZDOOMTRANS
|
|
RenderStyle "Add";
|
|
}
|
|
States
|
|
{
|
|
Spawn:
|
|
CFFX N 5 Bright;
|
|
CFFX O 4 Bright;
|
|
CFFX P 3 Bright;
|
|
Stop;
|
|
}
|
|
}
|
|
|
|
// Flame Puff ---------------------------------------------------------------
|
|
|
|
class FlamePuff : Actor
|
|
{
|
|
Default
|
|
{
|
|
Radius 1;
|
|
Height 1;
|
|
+NOBLOCKMAP +NOGRAVITY +ZDOOMTRANS
|
|
RenderStyle "Add";
|
|
SeeSound "ClericFlameExplode";
|
|
AttackSound "ClericFlameExplode";
|
|
}
|
|
States
|
|
{
|
|
Spawn:
|
|
CFFX ABC 3 Bright;
|
|
CFFX D 4 Bright;
|
|
CFFX E 3 Bright;
|
|
CFFX F 4 Bright;
|
|
CFFX G 3 Bright;
|
|
CFFX H 4 Bright;
|
|
CFFX I 3 Bright;
|
|
CFFX J 4 Bright;
|
|
CFFX K 3 Bright;
|
|
CFFX L 4 Bright;
|
|
CFFX M 3 Bright;
|
|
Stop;
|
|
}
|
|
}
|
|
|
|
// Flame Puff 2 -------------------------------------------------------------
|
|
|
|
class FlamePuff2 : FlamePuff
|
|
{
|
|
States
|
|
{
|
|
Spawn:
|
|
CFFX ABC 3 Bright;
|
|
CFFX D 4 Bright;
|
|
CFFX E 3 Bright;
|
|
CFFX F 4 Bright;
|
|
CFFX G 3 Bright;
|
|
CFFX H 4 Bright;
|
|
CFFX IC 3 Bright;
|
|
CFFX D 4 Bright;
|
|
CFFX E 3 Bright;
|
|
CFFX F 4 Bright;
|
|
CFFX G 3 Bright;
|
|
CFFX H 4 Bright;
|
|
CFFX I 3 Bright;
|
|
CFFX J 4 Bright;
|
|
CFFX K 3 Bright;
|
|
CFFX L 4 Bright;
|
|
CFFX M 3 Bright;
|
|
Stop;
|
|
}
|
|
}
|
|
|
|
// Circle Flame -------------------------------------------------------------
|
|
|
|
class CircleFlame : Actor
|
|
{
|
|
const FLAMESPEED = 0.45;
|
|
const FLAMEROTSPEED = 2.;
|
|
|
|
Default
|
|
{
|
|
Radius 6;
|
|
Damage 2;
|
|
DamageType "Fire";
|
|
Projectile;
|
|
-ACTIVATEIMPACT
|
|
-ACTIVATEPCROSS
|
|
+ZDOOMTRANS
|
|
RenderStyle "Add";
|
|
DeathSound "ClericFlameCircle";
|
|
Obituary "$OB_MPCWEAPFLAME";
|
|
}
|
|
|
|
States
|
|
{
|
|
Spawn:
|
|
CFCF A 4 Bright;
|
|
CFCF B 2 Bright A_CFlameRotate;
|
|
CFCF C 2 Bright;
|
|
CFCF D 1 Bright;
|
|
CFCF E 2 Bright;
|
|
CFCF F 2 Bright A_CFlameRotate;
|
|
CFCF G 1 Bright;
|
|
CFCF HI 2 Bright;
|
|
CFCF J 1 Bright A_CFlameRotate;
|
|
CFCF K 2 Bright;
|
|
CFCF LM 3 Bright;
|
|
CFCF N 2 Bright A_CFlameRotate;
|
|
CFCF O 3 Bright;
|
|
CFCF P 2 Bright;
|
|
Stop;
|
|
Death:
|
|
CFCF QR 3 Bright;
|
|
CFCF S 3 Bright A_Explode(20, 20, 0);
|
|
CFCF TUVWXYZ 3 Bright;
|
|
Stop;
|
|
}
|
|
|
|
//============================================================================
|
|
//
|
|
// A_CFlameRotate
|
|
//
|
|
//============================================================================
|
|
|
|
void A_CFlameRotate()
|
|
{
|
|
double an = Angle + 90.;
|
|
VelFromAngle(FLAMEROTSPEED, an);
|
|
Vel.XY += (specialf1, specialf2);
|
|
Angle += 6;
|
|
}
|
|
}
|
|
|
|
// Flame Missile ------------------------------------------------------------
|
|
|
|
class CFlameMissile : FastProjectile
|
|
{
|
|
Default
|
|
{
|
|
Speed 200;
|
|
Radius 14;
|
|
Height 8;
|
|
Damage 8;
|
|
DamageType "Fire";
|
|
+INVISIBLE
|
|
+ZDOOMTRANS
|
|
RenderStyle "Add";
|
|
Obituary "$OB_MPCWEAPFLAME";
|
|
}
|
|
|
|
States
|
|
{
|
|
Spawn:
|
|
CFFX A 4 Bright;
|
|
CFFX A 1 A_CFlamePuff;
|
|
Goto Death + 1;
|
|
Death:
|
|
CFFX A 1 Bright A_CFlameMissile;
|
|
CFFX ABC 3 Bright;
|
|
CFFX D 4 Bright;
|
|
CFFX E 3 Bright;
|
|
CFFX F 4 Bright;
|
|
CFFX G 3 Bright;
|
|
CFFX H 4 Bright;
|
|
CFFX I 3 Bright;
|
|
CFFX J 4 Bright;
|
|
CFFX K 3 Bright;
|
|
CFFX L 4 Bright;
|
|
CFFX M 3 Bright;
|
|
Stop;
|
|
}
|
|
|
|
override void BeginPlay ()
|
|
{
|
|
special1 = 2;
|
|
}
|
|
|
|
override void Effect ()
|
|
{
|
|
if (!--special1)
|
|
{
|
|
special1 = 4;
|
|
double newz = pos.z - 12;
|
|
if (newz < floorz)
|
|
{
|
|
newz = floorz;
|
|
}
|
|
Actor mo = Spawn ("CFlameFloor", (pos.xy, newz), ALLOW_REPLACE);
|
|
if (mo)
|
|
{
|
|
mo.angle = angle;
|
|
}
|
|
}
|
|
}
|
|
|
|
//============================================================================
|
|
//
|
|
// A_CFlamePuff
|
|
//
|
|
//============================================================================
|
|
|
|
void A_CFlamePuff()
|
|
{
|
|
bInvisible = false;
|
|
bMissile = false;
|
|
Vel = (0,0,0);
|
|
A_PlaySound ("ClericFlameExplode", CHAN_BODY);
|
|
}
|
|
|
|
//============================================================================
|
|
//
|
|
// A_CFlameMissile
|
|
//
|
|
//============================================================================
|
|
|
|
void A_CFlameMissile()
|
|
{
|
|
bInvisible = false;
|
|
A_PlaySound ("ClericFlameExplode", CHAN_BODY);
|
|
if (BlockingMobj && BlockingMobj.bShootable)
|
|
{ // Hit something, so spawn the flame circle around the thing
|
|
double dist = BlockingMobj.radius + 18;
|
|
for (int i = 0; i < 4; i++)
|
|
{
|
|
double an = i*45.;
|
|
Actor mo = Spawn ("CircleFlame", BlockingMobj.Vec3Angle(dist, an, 5), ALLOW_REPLACE);
|
|
if (mo)
|
|
{
|
|
mo.angle = an;
|
|
mo.target = target;
|
|
mo.VelFromAngle(CircleFlame.FLAMESPEED);
|
|
mo.specialf1 = mo.Vel.X;
|
|
mo.specialf2 = mo.Vel.Y;
|
|
mo.tics -= random[FlameMissile](0, 3);
|
|
}
|
|
an += 180;
|
|
mo = Spawn("CircleFlame", BlockingMobj.Vec3Angle(dist, an, 5), ALLOW_REPLACE);
|
|
if(mo)
|
|
{
|
|
mo.angle = an;
|
|
mo.target = target;
|
|
mo.VelFromAngle(-CircleFlame.FLAMESPEED);
|
|
mo.specialf1 = mo.Vel.X;
|
|
mo.specialf2 = mo.Vel.Y;
|
|
mo.tics -= random[FlameMissile](0, 3);
|
|
}
|
|
}
|
|
SetState (SpawnState);
|
|
}
|
|
}
|
|
}
|