qzdoom/wadsrc/static/zscript/actors/hexen/clericflame.zs

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);
}
}
}