Remove 8+ size variants of shells. Allow dropping of 2/4 golden shells.

Use overlays for Eviscerator casing eject, add random offsets like with Explodium Gun.
Fix Candy Gun not being consistent with new animation changes of Explodium Gun.
Fix Explodium Gun not showing the loaded bullet when checking the chamber.
Give random offsets to Silver Bullet ejection overlays.
Some small texture wrangling.
Add projectile models for Silver Bullet (this will be used in the future).
Remove InterHubAmount from MagAmmo classes (not needed as this property is only used by items with the INVBAR flag).
Reduce BackpackMaxAmount of Ynykron Ammo to 3.
Adjust how Chanceboxes randomize their "dud" probability.
Tweak some of the Chancebox drops.
Set DROPPED flag to false for all Chancebox drops, so they don't get crushed.
Add 25% Crush damage factor to Demolitionist (in a future update, will try to make it so crushers have a chance to break while touching the player).
This commit is contained in:
Mari the Deer 2021-02-15 23:46:04 +01:00
commit b17fbd9a7d
44 changed files with 259 additions and 286 deletions

View file

@ -284,7 +284,6 @@ Class RayBolt : MagAmmo
MagAmmo.ParentAmmo "RayAmmo";
MagAmmo.ClipSize 20;
Inventory.MaxAmount 25;
Inventory.InterHubAmount 25;
+FLOATBOB;
FloatBobStrength 0.25;
}
@ -396,7 +395,6 @@ Class GrandSpear : MagAmmo
MagAmmo.ParentAmmo "GrandAmmo";
MagAmmo.ClipSize 5;
Inventory.MaxAmount 8;
Inventory.InterHubAmount 8;
+FLOATBOB;
FloatBobStrength 0.25;
}

View file

@ -417,7 +417,6 @@ Class RedShell2 : RedShell
{
Inventory.Amount 2;
Radius 6;
Height 20;
}
}
Class RedShell4 : RedShell
@ -426,34 +425,6 @@ Class RedShell4 : RedShell
{
Inventory.Amount 4;
Radius 6;
Height 20;
}
}
Class RedShell8 : RedShell
{
Default
{
Inventory.Amount 8;
Radius 8;
Height 20;
}
}
Class RedShell12 : RedShell
{
Default
{
Inventory.Amount 12;
Radius 10;
Height 20;
}
}
Class RedShell16 : RedShell
{
Default
{
Inventory.Amount 16;
Radius 10;
Height 20;
}
}
@ -492,7 +463,6 @@ Class GreenShell2 : GreenShell
{
Inventory.Amount 2;
Radius 6;
Height 20;
}
}
Class GreenShell4 : GreenShell
@ -501,25 +471,6 @@ Class GreenShell4 : GreenShell
{
Inventory.Amount 4;
Radius 6;
Height 20;
}
}
Class GreenShell8 : GreenShell
{
Default
{
Inventory.Amount 8;
Radius 8;
Height 20;
}
}
Class GreenShell12 : GreenShell
{
Default
{
Inventory.Amount 12;
Radius 10;
Height 20;
}
}
@ -543,7 +494,6 @@ Class WhiteShell : Ammo
+FLOATBOB;
FloatBobStrength 0.25;
Radius 4;
Height 20;
}
States
{
@ -558,7 +508,6 @@ Class WhiteShell2 : WhiteShell
{
Inventory.Amount 2;
Radius 6;
Height 20;
}
}
Class WhiteShell4 : WhiteShell
@ -567,16 +516,6 @@ Class WhiteShell4 : WhiteShell
{
Inventory.Amount 4;
Radius 6;
Height 20;
}
}
Class WhiteShell8 : WhiteShell
{
Default
{
Inventory.Amount 8;
Radius 8;
Height 20;
}
}
@ -615,7 +554,6 @@ Class BlueShell2 : BlueShell
{
Inventory.Amount 2;
Radius 6;
Height 20;
}
}
Class BlueShell4 : BlueShell
@ -624,16 +562,6 @@ Class BlueShell4 : BlueShell
{
Inventory.Amount 4;
Radius 6;
Height 20;
}
}
Class BlueShell8 : BlueShell
{
Default
{
Inventory.Amount 8;
Radius 8;
Height 20;
}
}
@ -672,7 +600,6 @@ Class BlackShell2 : BlackShell
{
Inventory.Amount 2;
Radius 6;
Height 20;
}
}
Class BlackShell4 : BlackShell
@ -681,7 +608,6 @@ Class BlackShell4 : BlackShell
{
Inventory.Amount 4;
Radius 6;
Height 20;
}
}
@ -720,7 +646,6 @@ Class PurpleShell2 : PurpleShell
{
Inventory.Amount 2;
Radius 6;
Height 20;
}
}
Class PurpleShell4 : PurpleShell
@ -729,7 +654,6 @@ Class PurpleShell4 : PurpleShell
{
Inventory.Amount 4;
Radius 6;
Height 20;
}
}
@ -777,7 +701,7 @@ Class GoldShell : Ammo
action void A_GoldShellTrail()
{
if ( Random[Goldy](0,2) ) return;
Spawn("GoldShellSparkle",Vec3Offset(FRandom[Goldy](-2,2),FRandom[Goldy](-2,2),FRandom[Goldy](10,18)));
Spawn("GoldShellSparkle",Vec3Offset(FRandom[Goldy](-radius,radius)/2.,FRandom[Goldy](-radius,radius)/2.,FRandom[Goldy](10,18)));
}
Default
@ -803,6 +727,22 @@ Class GoldShell : Ammo
Wait;
}
}
Class GoldShell2 : GoldShell
{
Default
{
Inventory.Amount 2;
Radius 6;
}
}
Class GoldShell4 : GoldShell
{
Default
{
Inventory.Amount 4;
Radius 6;
}
}
// ============================================================================
// Eviscerator ammo
@ -1231,7 +1171,6 @@ Class SilverBullets : MagAmmo
MagAmmo.ParentAmmo "SilverBulletAmmo";
MagAmmo.ClipSize 5;
Inventory.MaxAmount 8;
Inventory.InterHubAmount 8;
+FLOATBOB;
FloatBobStrength 0.25;
Radius 4;
@ -1254,7 +1193,6 @@ Class SilverBullets2 : MagAmmo
MagAmmo.ParentAmmo "SilverBulletAmmo2";
MagAmmo.ClipSize 5;
Inventory.MaxAmount 8;
Inventory.InterHubAmount 8;
+FLOATBOB;
FloatBobStrength 0.25;
Radius 4;
@ -1373,7 +1311,6 @@ Class CandyGunBullets : MagAmmo
MagAmmo.ParentAmmo "CandyGunAmmo";
MagAmmo.ClipSize 7;
Inventory.MaxAmount 10;
Inventory.InterHubAmount 10;
+FLOATBOB;
FloatBobStrength 0.25;
Radius 2;
@ -1461,7 +1398,7 @@ Class YnykronAmmo : Ammo
Inventory.Amount 1;
Inventory.MaxAmount 1;
Ammo.BackpackAmount 0;
Ammo.BackpackMaxAmount 4;
Ammo.BackpackMaxAmount 3;
Ammo.DropAmount 1;
+FLOATBOB;
FloatBobStrength 0.25;

View file

@ -705,6 +705,7 @@ Class EvisceratorCasing : SWWMCasing
Class Eviscerator : SWWMWeapon
{
double casex, casey;
bool isfiring;
// barrel is extended
bool extended;
@ -1024,7 +1025,13 @@ Class Eviscerator : SWWMWeapon
XZW2 A 4;
XZW3 STUV 2;
XZW3 W 1 A_StartSound("eviscerator/eject",CHAN_WEAPON,CHANF_OVERLAP);
XZW3 X 1 A_Overlay(-9999,"EjectSmoke");
XZW3 X 1
{
int layer = PSP_WEAPON+1;
while ( player.FindPSprite(layer) ) layer++;
A_Overlay(layer,"EjectCasing");
A_Overlay(-9999,"EjectSmoke");
}
XZW3 YZ 1;
XZW4 AB 1;
XZW4 C 1
@ -1039,7 +1046,13 @@ Class Eviscerator : SWWMWeapon
XZW4 Z 4;
XZW6 RSTU 2;
XZW6 V 1 A_StartSound("eviscerator/eject",CHAN_WEAPON,CHANF_OVERLAP);
XZW6 W 1 A_Overlay(-9999,"EjectSmoke");
XZW6 W 1
{
int layer = PSP_WEAPON+1;
while ( player.FindPSprite(layer) ) layer++;
A_Overlay(layer,"EjectCasing");
A_Overlay(-9999,"EjectSmoke");
}
XZW6 XYZ 1;
XZW7 A 1;
XZW7 B 1
@ -1050,6 +1063,16 @@ Class Eviscerator : SWWMWeapon
XZW7 CDE 1;
XZW7 FGH 2;
Goto ReadyExt;
EjectCasing:
XZWB D 1
{
A_OverlayOffset(OverlayID(),0,0);
invoker.casex = FRandom[Eviscerator](-2.,2.);
invoker.casey = FRandom[Eviscerator](-2.,2.);
}
XZWB EFGHIJKLM 1 A_OverlayOffset(OverlayID(),invoker.casex,invoker.casey,WOF_ADD|WOF_INTERPOLATE);
TNT1 A 1 A_EvisceratorEject();
Stop;
EjectSmoke:
TNT1 A 1 A_EvisceratorCasingSmoke((10,2,-3));
TNT1 A 1 A_EvisceratorCasingSmoke((10,-1,-2));
@ -1059,7 +1082,6 @@ Class Eviscerator : SWWMWeapon
TNT1 A 1 A_EvisceratorCasingSmoke((10,-8.5,-5));
TNT1 A 1 A_EvisceratorCasingSmoke((10,-10,-9));
TNT1 A 1 A_EvisceratorCasingSmoke((10,-11,-14));
TNT1 A 1 A_EvisceratorEject();
Stop;
AltFire:
XZW2 A 2

View file

@ -929,7 +929,8 @@ Class CBoxLight : SpotLightAttenuated
// Collectible box (recycling of discarded "chance box" item)
Class Chancebox : Actor
{
bool dud;
bool dud; // if true, cannot drop a collectible
bool chanceinit; // internal state has been initialized
static void SpawnChanceboxes()
{
@ -1077,19 +1078,19 @@ Class Chancebox : Actor
if ( Random[Chancebox](0,1) )
{
let a = Spawn(!Random[Chancebox](0,2)?"GoldShell":(Random[Chancebox](0,1)||(gameinfo.gametype&GAME_Strife))?"GrilledCheeseSandwich":"YnykronAmmo",pos);
a.bDROPPED = true;
a.bDROPPED = false;
a.bNOGRAVITY = false;
a.vel.z = FRandom[Chancebox](2,4);
}
else if ( !Random[Chancebox](0,2) )
{
for ( int i=0; i<=12; i++ )
for ( int i=0; i<=6; i++ )
{
let a = Spawn((i==0)?"CandyGun":"CandyGunBullets",pos);
a.bDROPPED = true;
a.bDROPPED = false;
a.bNOGRAVITY = false;
a.vel.z = FRandom[Chancebox](2,4);
if ( i > 0 ) a.vel.xy = (cos(i*30),sin(i*30))*FRandom[Chancebox](1,2);
if ( i > 0 ) a.vel.xy = (cos(i*60),sin(i*60))*FRandom[Chancebox](1,2);
}
}
else if ( !Random[Chancebox](0,2) )
@ -1097,7 +1098,7 @@ Class Chancebox : Actor
for ( int i=0; i<3; i++ )
{
let a = Spawn("SilverBullets2",pos);
a.bDROPPED = true;
a.bDROPPED = false;
a.bNOGRAVITY = false;
a.vel.z = FRandom[Chancebox](2,4);
a.vel.xy = (cos(i*120),sin(i*120))*FRandom[Chancebox](1,2);
@ -1105,7 +1106,7 @@ Class Chancebox : Actor
for ( int i=0; i<6; i++ )
{
let a = Spawn("SilverBullets",pos);
a.bDROPPED = true;
a.bDROPPED = false;
a.bNOGRAVITY = false;
a.vel.z = FRandom[Chancebox](2,4);
a.vel.xy = (cos(i*60),sin(i*60))*FRandom[Chancebox](3,4);
@ -1114,13 +1115,13 @@ Class Chancebox : Actor
else if ( Random[Chancebox](0,1) )
{
let a = Spawn("HellblazerWarheads",pos);
a.bDROPPED = true;
a.bDROPPED = false;
a.bNOGRAVITY = false;
a.vel.z = FRandom[Chancebox](2,4);
for ( int i=0; i<3; i++ )
{
a = Spawn("HellblazerRavagers",pos);
a.bDROPPED = true;
a.bDROPPED = false;
a.bNOGRAVITY = false;
a.vel.z = FRandom[Chancebox](2,4);
a.vel.xy = (cos(i*120),sin(i*120))*FRandom[Chancebox](1,2);
@ -1128,7 +1129,7 @@ Class Chancebox : Actor
for ( int i=0; i<5; i++ )
{
a = Spawn("HellblazerCrackshots",pos);
a.bDROPPED = true;
a.bDROPPED = false;
a.bNOGRAVITY = false;
a.vel.z = FRandom[Chancebox](2,4);
a.vel.xy = (cos(i*72),sin(i*72))*FRandom[Chancebox](3,4);
@ -1136,7 +1137,7 @@ Class Chancebox : Actor
for ( int i=0; i<8; i++ )
{
a = Spawn("HellblazerMissiles",pos);
a.bDROPPED = true;
a.bDROPPED = false;
a.bNOGRAVITY = false;
a.vel.z = FRandom[Chancebox](2,4);
a.vel.xy = (cos(i*45),sin(i*45))*FRandom[Chancebox](5,6);
@ -1145,13 +1146,13 @@ Class Chancebox : Actor
else if ( Random[Chancebox](0,1) )
{
let a = Spawn("BlackShell",pos);
a.bDROPPED = true;
a.bDROPPED = false;
a.bNOGRAVITY = false;
a.vel.z = FRandom[Chancebox](2,4);
for ( int i=0; i<3; i++ )
{
a = Spawn("BlueShell",pos);
a.bDROPPED = true;
a.bDROPPED = false;
a.bNOGRAVITY = false;
a.vel.z = FRandom[Chancebox](2,4);
a.vel.xy = (cos(i*120),sin(i*120))*FRandom[Chancebox](1,2);
@ -1159,7 +1160,7 @@ Class Chancebox : Actor
for ( int i=0; i<8; i++ )
{
a = Spawn((i%2)?"WhiteShell":"PurpleShell",pos);
a.bDROPPED = true;
a.bDROPPED = false;
a.bNOGRAVITY = false;
a.vel.z = FRandom[Chancebox](2,4);
a.vel.xy = (cos(i*72),sin(i*72))*FRandom[Chancebox](3,4);
@ -1167,7 +1168,7 @@ Class Chancebox : Actor
for ( int i=0; i<12; i++ )
{
a = Spawn((i%2)?"RedShell":"GreenShell",pos);
a.bDROPPED = true;
a.bDROPPED = false;
a.bNOGRAVITY = false;
a.vel.z = FRandom[Chancebox](2,4);
a.vel.xy = (cos(i*30),sin(i*30))*FRandom[Chancebox](5,6);
@ -1175,10 +1176,10 @@ Class Chancebox : Actor
}
else if ( Random[Chancebox](0,1) )
{
for ( int i=0; i<100; i++ )
for ( int i=0; i<20; i++ )
{
let a = Spawn("HealthNuggetItem",pos);
a.bDROPPED = true;
a.bDROPPED = false;
a.bNOGRAVITY = false;
a.vel.z = FRandom[Chancebox](2,8);
a.vel.xy = (cos(i*3.6),sin(i*3.6))*FRandom[Chancebox](1,8);
@ -1189,7 +1190,7 @@ Class Chancebox : Actor
for ( int i=0; i<=15; i++ )
{
let a = Spawn((i==0)?"RefresherItem":(i%3)?"HealthNuggetItem":"ArmorNuggetItem",pos);
a.bDROPPED = true;
a.bDROPPED = false;
a.bNOGRAVITY = false;
a.vel.z = FRandom[Chancebox](2,4);
if ( i > 0 ) a.vel.xy = (cos(i*24),sin(i*24))*FRandom[Chancebox](1,2);
@ -1200,7 +1201,7 @@ Class Chancebox : Actor
{
// pop one at random
let a = Spawn(candidates[Random[Chancebox](0,candidates.Size()-1)],pos);
a.bDROPPED = true;
a.bDROPPED = false;
a.bNOGRAVITY = false;
a.vel.z = FRandom[Chancebox](2,4);
}
@ -1236,15 +1237,33 @@ Class Chancebox : Actor
double rang = user.player?PlayerPawn(user.player.mo).UseRange:(user.Height/2);
if ( abs(diff.z) > rang ) return false;
if ( CurState != FindState("Spawn") ) return false;
if ( !dud )
if ( !chanceinit )
{
if ( !Random[Chancebox](0,2) )
int col = 0;
let ti = ThinkerIterator.Create("SWWMCollectible");
SWWMCollectible c;
while ( c = SWWMCollectible(ti.Next()) ) col++;
int tcol = 0;
for ( int i=0; i<AllActorClasses.Size(); i++ )
{
let c = (Class<SWWMCollectible>)(AllActorClasses[i]);
if ( !c || (c == 'SWWMCollectible') ) continue;
let def = GetDefaultByType(c);
// check that we can collect it in this IWAD
if ( !(gameinfo.gametype&def.avail) ) continue;
tcol++;
}
int alldudchance = 5-(4*col)/tcol; // chance for all boxes to be duds (no collectibles)
if ( (col > 0) && !Random[Chancebox](0,alldudchance) )
{
// all boxes are duds
let ti = ThinkerIterator.Create("Chancebox");
Chancebox c;
while ( c = Chancebox(ti.Next()) )
{
c.chanceinit = true;
c.dud = true;
}
}
else if ( Random[Chancebox](0,2) )
{
@ -1265,12 +1284,21 @@ Class Chancebox : Actor
// the others are duds
let ti = ThinkerIterator.Create("Chancebox");
Chancebox c;
bool onemore = !Random[Chancebox](0,2); // unless...
while ( c = Chancebox(ti.Next()) )
{
if ( c == self ) continue;
c.dud = true; // we found one, the others just drop goodies
if ( (c == self) || c.chanceinit ) continue;
c.chanceinit = true;
if ( onemore )
{
onemore = false;
// this one isn't a dud either (wow, how lucky)
c.dud = false;
}
else c.dud = true; // this one's a dud
}
}
chanceinit = true;
}
if ( bCOUNTITEM )
{

View file

@ -2372,7 +2372,7 @@ Class SWWMHandler : EventHandler
// respect final replacements
if ( e.IsFinal ) return;
// shell types (sorted by rarity
static const Class<Actor> redpool[] = {"RedShell","RedShell2","RedShell4","RedShell8"};
static const Class<Actor> redpool[] = {"RedShell","RedShell2","RedShell4"};
static const Class<Actor> greenpool[] = {"GreenShell","GreenShell2","GreenShell4"};
static const Class<Actor> whitepool[] = {"WhiteShell","WhiteShell2"};
static const Class<Actor> purplepool[] = {"PurpleShell","PurpleShell2","PurpleShell4"};

View file

@ -89,6 +89,7 @@ Class Demolitionist : PlayerPawn
DamageFactor "Poison", 0.;
DamageFactor "PoisonCloud", 0.;
DamageFactor "Falling", 0.;
DamageFactor "Crush", .25;
Demolitionist.DashFuel 240.;
+NOBLOOD;
+DONTGIB;

View file

@ -891,6 +891,7 @@ Class CandyGun : SWWMWeapon
{
int clipcount;
bool chambered;
double casex, casey;
transient ui TextureID WeaponBox;
transient ui Font TewiFont;
bool tospecial;
@ -1249,9 +1250,26 @@ Class CandyGun : SWWMWeapon
Wait;
Fire:
XZW2 A 1 A_Schutt();
XZW2 IJKLMNOPQR 1;
XZW2 S 2 A_DropCasing();
XZW2 I 1;
XZW2 J 1
{
int layer = PSP_WEAPON+1;
while ( player.FindPSprite(layer) ) layer++;
A_Overlay(layer,"Casing");
}
XZW2 KLMNOP 1;
XZW2 Q 2;
Goto Ready;
Casing:
XZWC A 1
{
A_OverlayOffset(OverlayID(),0,0);
invoker.casex = FRandom[Explodium](-1.,5.);
invoker.casey = FRandom[Explodium](-2.,1.);
}
XZWC BCDEFGHIJ 1 A_OverlayOffset(OverlayID(),invoker.casex,invoker.casey,WOF_ADD|WOF_INTERPOLATE);
TNT1 A 1 A_DropCasing();
Stop;
AltFire:
XZW2 A 2
{

View file

@ -648,6 +648,7 @@ Class SilverBullet : SWWMWeapon
bool chambered, fired;
bool fcbchambered, fcbloaded, fcbselected;
int clipcount;
double casex, casey;
transient ui TextureID WeaponBox[2], ZoomBar, BulletIcon[2], AmmoIcon[2];
transient ui Font TewiFont;
@ -1133,7 +1134,7 @@ Class SilverBullet : SWWMWeapon
Vector3 x, y, z;
[x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll);
vel += x*min(1.,invoker.specialf1)*(600./Mass);
A_OverlayAlpha(PSP_WEAPON+2,clamp(invoker.specialf1*3.,0.,1.));
A_OverlayAlpha(PSP_WEAPON+1,clamp(invoker.specialf1*3.,0.,1.));
if ( Random[SilverBullet](0,int(invoker.specialf1*2)) )
self.DamageMobj(invoker,self,1,'jet');
Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),-x*10-z*10);
@ -1321,9 +1322,9 @@ Class SilverBullet : SWWMWeapon
TNT1 A 0
{
A_StartSound("silverbullet/jet",CHAN_WEAPON,CHANF_OVERLAP);
A_Overlay(PSP_WEAPON+2,"JetSmoke");
A_OverlayFlags(PSP_WEAPON+2,PSPF_RENDERSTYLE|PSPF_ALPHA|PSPF_FORCESTYLE|PSPF_FORCEALPHA,true);
A_OverlayRenderStyle(PSP_WEAPON+2,STYLE_Add);
A_Overlay(PSP_WEAPON+1,"JetSmoke");
A_OverlayFlags(PSP_WEAPON+1,PSPF_RENDERSTYLE|PSPF_ALPHA|PSPF_FORCESTYLE|PSPF_FORCEALPHA,true);
A_OverlayRenderStyle(PSP_WEAPON+1,STYLE_Add);
}
TNT1 A 1
{
@ -1359,15 +1360,17 @@ Class SilverBullet : SWWMWeapon
A_StartSound("silverbullet/boltopen",CHAN_WEAPON,CHANF_OVERLAP);
if ( invoker.chambered )
{
int layer = PSP_WEAPON+2;
while ( player.FindPSprite(layer) ) layer++;
if ( invoker.fired )
{
if ( invoker.fcbchambered ) A_Overlay(PSP_WEAPON+1,"Casing2");
else A_Overlay(PSP_WEAPON+1,"Casing");
if ( invoker.fcbchambered ) A_Overlay(layer,"Casing2");
else A_Overlay(layer,"Casing");
}
else
{
if ( invoker.fcbchambered ) A_Overlay(PSP_WEAPON+1,"Bullet2");
else A_Overlay(PSP_WEAPON+1,"Bullet");
if ( invoker.fcbchambered ) A_Overlay(layer,"Bullet2");
else A_Overlay(layer,"Bullet");
}
}
invoker.fired = false;
@ -1389,15 +1392,17 @@ Class SilverBullet : SWWMWeapon
A_StartSound("silverbullet/boltopen",CHAN_WEAPON,CHANF_OVERLAP);
if ( invoker.chambered )
{
int layer = PSP_WEAPON+2;
while ( player.FindPSprite(layer) ) layer++;
if ( invoker.fired )
{
if ( invoker.fcbchambered ) A_Overlay(PSP_WEAPON+1,"Casing2");
else A_Overlay(PSP_WEAPON+1,"Casing");
if ( invoker.fcbchambered ) A_Overlay(layer,"Casing2");
else A_Overlay(layer,"Casing");
}
else
{
if ( invoker.fcbchambered ) A_Overlay(PSP_WEAPON+1,"Bullet2");
else A_Overlay(PSP_WEAPON+1,"Bullet");
if ( invoker.fcbchambered ) A_Overlay(layer,"Bullet2");
else A_Overlay(layer,"Bullet");
}
}
invoker.fired = false;
@ -1411,24 +1416,48 @@ Class SilverBullet : SWWMWeapon
XZW9 JKLMNOPQR 2;
Goto Ready2;
Casing:
XZW7 DE 2;
XZW7 FGHIJKLMNO 1;
XZW7 D 2
{
A_OverlayOffset(OverlayID(),0,0);
invoker.casex = FRandom[Silverbullet](-2.,2.);
invoker.casey = FRandom[Silverbullet](-2.,2.);
}
XZW7 E 2;
XZW7 FGHIJKLMNO 1 A_OverlayOffset(OverlayID(),invoker.casex,invoker.casey,WOF_ADD|WOF_INTERPOLATE);
TNT1 A 0 A_DropCasing();
Stop;
Casing2:
XZWD DE 2;
XZWD FGHIJKLMNO 1;
XZWD D 2
{
A_OverlayOffset(OverlayID(),0,0);
invoker.casex = FRandom[Silverbullet](-2.,2.);
invoker.casey = FRandom[Silverbullet](-2.,2.);
}
XZWD E 2;
XZWD FGHIJKLMNO 1 A_OverlayOffset(OverlayID(),invoker.casex,invoker.casey,WOF_ADD|WOF_INTERPOLATE);
TNT1 A 0 A_DropCasing(true);
Stop;
Bullet:
XZWD PQ 2;
XZWD RSTUVWXYZ 1;
XZWE A 1;
XZWD P 2
{
A_OverlayOffset(OverlayID(),0,0);
invoker.casex = FRandom[Silverbullet](-2.,2.);
invoker.casey = FRandom[Silverbullet](-2.,2.);
}
XZWD Q 2;
XZWD RSTUVWXYZ 1 A_OverlayOffset(OverlayID(),invoker.casex,invoker.casey,WOF_ADD|WOF_INTERPOLATE);
XZWE A 1 A_OverlayOffset(OverlayID(),invoker.casex,invoker.casey,WOF_ADD|WOF_INTERPOLATE);
TNT1 A 0 A_DropBullet();
Stop;
Bullet2:
XZWE BC 2;
XZWE DEFGHIJKLM 1;
XZWE B 2
{
A_OverlayOffset(OverlayID(),0,0);
invoker.casex = FRandom[Silverbullet](-2.,2.);
invoker.casey = FRandom[Silverbullet](-2.,2.);
}
XZWE C 2;
XZWE DEFGHIJKLM 1 A_OverlayOffset(OverlayID(),invoker.casex,invoker.casey,WOF_ADD|WOF_INTERPOLATE);
TNT1 A 0 A_DropBullet(true);
Stop;
ZoomFire: