mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-11 23:32:04 +00:00
232 lines
4.7 KiB
Text
232 lines
4.7 KiB
Text
|
|
// The Mage's Frost Cone ----------------------------------------------------
|
|
|
|
class MWeapFrost : MageWeapon
|
|
{
|
|
Default
|
|
{
|
|
+BLOODSPLATTER
|
|
Weapon.SelectionOrder 1700;
|
|
Weapon.AmmoUse1 3;
|
|
Weapon.AmmoGive1 25;
|
|
Weapon.KickBack 150;
|
|
Weapon.YAdjust 20;
|
|
Weapon.AmmoType1 "Mana1";
|
|
Inventory.PickupMessage "$TXT_WEAPON_M2";
|
|
Obituary "$OB_MPMWEAPFROST";
|
|
Tag "$TAG_MWEAPFROST";
|
|
}
|
|
|
|
States
|
|
{
|
|
Spawn:
|
|
WMCS ABC 8 Bright;
|
|
Loop;
|
|
Select:
|
|
CONE A 1 A_Raise;
|
|
Loop;
|
|
Deselect:
|
|
CONE A 1 A_Lower;
|
|
Loop;
|
|
Ready:
|
|
CONE A 1 A_WeaponReady;
|
|
Loop;
|
|
Fire:
|
|
CONE B 3;
|
|
CONE C 4;
|
|
Hold:
|
|
CONE D 3;
|
|
CONE E 5;
|
|
CONE F 3 A_FireConePL1;
|
|
CONE G 3;
|
|
CONE A 9;
|
|
CONE A 10 A_ReFire;
|
|
Goto Ready;
|
|
}
|
|
|
|
//============================================================================
|
|
//
|
|
// A_FireConePL1
|
|
//
|
|
//============================================================================
|
|
|
|
action void A_FireConePL1()
|
|
{
|
|
bool conedone=false;
|
|
FTranslatedLineTarget t;
|
|
|
|
if (player == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Weapon weapon = player.ReadyWeapon;
|
|
if (weapon != null)
|
|
{
|
|
if (!weapon.DepleteAmmo (weapon.bAltFire))
|
|
return;
|
|
}
|
|
A_PlaySound ("MageShardsFire", CHAN_WEAPON);
|
|
|
|
int damage = 90+(random[MageCone]() & 15);
|
|
for (int i = 0; i < 16; i++)
|
|
{
|
|
double ang = angle + i*(45./16);
|
|
double slope = AimLineAttack (ang, DEFMELEERANGE, t, 0., ALF_CHECK3D);
|
|
if (t.linetarget)
|
|
{
|
|
t.linetarget.DamageMobj (self, self, damage, 'Ice', DMG_USEANGLE, t.angleFromSource);
|
|
conedone = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// didn't find any creatures, so fire projectiles
|
|
if (!conedone)
|
|
{
|
|
Actor mo = SpawnPlayerMissile ("FrostMissile");
|
|
if (mo)
|
|
{
|
|
mo.special1 = FrostMissile.SHARDSPAWN_LEFT|FrostMissile.SHARDSPAWN_DOWN|FrostMissile.SHARDSPAWN_UP|FrostMissile.SHARDSPAWN_RIGHT;
|
|
mo.special2 = 3; // Set sperm count (levels of reproductivity)
|
|
mo.target = self;
|
|
mo.args[0] = 3; // Mark Initial shard as super damage
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Frost Missile ------------------------------------------------------------
|
|
|
|
class FrostMissile : Actor
|
|
{
|
|
const SHARDSPAWN_LEFT = 1;
|
|
const SHARDSPAWN_RIGHT = 2;
|
|
const SHARDSPAWN_UP = 4;
|
|
const SHARDSPAWN_DOWN = 8;
|
|
|
|
Default
|
|
{
|
|
Speed 25;
|
|
Radius 13;
|
|
Height 8;
|
|
Damage 1;
|
|
DamageType "Ice";
|
|
Projectile;
|
|
DeathSound "MageShardsExplode";
|
|
Obituary "$OB_MPMWEAPFROST";
|
|
}
|
|
|
|
States
|
|
{
|
|
Spawn:
|
|
SHRD A 2 Bright;
|
|
SHRD A 3 Bright A_ShedShard;
|
|
SHRD B 3 Bright;
|
|
SHRD C 3 Bright;
|
|
Loop;
|
|
Death:
|
|
SHEX ABCDE 5 Bright;
|
|
Stop;
|
|
}
|
|
|
|
override int DoSpecialDamage (Actor victim, int damage, Name damagetype)
|
|
{
|
|
if (special2 > 0)
|
|
{
|
|
damage <<= special2;
|
|
}
|
|
return damage;
|
|
}
|
|
|
|
//============================================================================
|
|
//
|
|
// A_ShedShard
|
|
//
|
|
//============================================================================
|
|
|
|
void A_ShedShard()
|
|
{
|
|
int spawndir = special1;
|
|
int spermcount = special2;
|
|
Actor mo;
|
|
|
|
if (spermcount <= 0)
|
|
{
|
|
return; // No sperm left
|
|
}
|
|
special2 = 0;
|
|
spermcount--;
|
|
|
|
// every so many calls, spawn a new missile in its set directions
|
|
if (spawndir & SHARDSPAWN_LEFT)
|
|
{
|
|
mo = SpawnMissileAngleZSpeed(pos.z, "FrostMissile", angle + 5, 0, (20. + 2 * spermcount), target);
|
|
if (mo)
|
|
{
|
|
mo.special1 = SHARDSPAWN_LEFT;
|
|
mo.special2 = spermcount;
|
|
mo.Vel.Z = Vel.Z;
|
|
mo.args[0] = (spermcount==3)?2:0;
|
|
}
|
|
}
|
|
if (spawndir & SHARDSPAWN_RIGHT)
|
|
{
|
|
mo = SpawnMissileAngleZSpeed(pos.z, "FrostMissile", angle - 5, 0, (20. + 2 * spermcount), target);
|
|
if (mo)
|
|
{
|
|
mo.special1 = SHARDSPAWN_RIGHT;
|
|
mo.special2 = spermcount;
|
|
mo.Vel.Z = Vel.Z;
|
|
mo.args[0] = (spermcount==3)?2:0;
|
|
}
|
|
}
|
|
if (spawndir & SHARDSPAWN_UP)
|
|
{
|
|
mo = SpawnMissileAngleZSpeed(pos.z + 8., "FrostMissile", angle, 0, (15. + 2 * spermcount), target);
|
|
if (mo)
|
|
{
|
|
mo.Vel.Z = Vel.Z;
|
|
if (spermcount & 1) // Every other reproduction
|
|
mo.special1 = SHARDSPAWN_UP | SHARDSPAWN_LEFT | SHARDSPAWN_RIGHT;
|
|
else
|
|
mo.special1 = SHARDSPAWN_UP;
|
|
mo.special2 = spermcount;
|
|
mo.args[0] = (spermcount==3)?2:0;
|
|
}
|
|
}
|
|
if (spawndir & SHARDSPAWN_DOWN)
|
|
{
|
|
mo = SpawnMissileAngleZSpeed(pos.z - 4., "FrostMissile", angle, 0, (15. + 2 * spermcount), target);
|
|
if (mo)
|
|
{
|
|
mo.Vel.Z = Vel.Z;
|
|
if (spermcount & 1) // Every other reproduction
|
|
mo.special1 = SHARDSPAWN_DOWN | SHARDSPAWN_LEFT | SHARDSPAWN_RIGHT;
|
|
else
|
|
mo.special1 = SHARDSPAWN_DOWN;
|
|
mo.special2 = spermcount;
|
|
mo.target = target;
|
|
mo.args[0] = (spermcount==3)?2:0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Ice Shard ----------------------------------------------------------------
|
|
|
|
class IceShard : FrostMissile
|
|
{
|
|
Default
|
|
{
|
|
DamageType "Ice";
|
|
-ACTIVATEIMPACT
|
|
-ACTIVATEPCROSS
|
|
}
|
|
States
|
|
{
|
|
Spawn:
|
|
SHRD ABC 3 Bright;
|
|
Loop;
|
|
}
|
|
}
|