swwmgz_m/zscript/items/swwm_ammospawn.zsc

230 lines
8.3 KiB
Text

// on-demand ammo spawners
// Ref class for ammo spawners, used by on-demand replacers
Class SWWMAmmoSpawner : Inventory abstract
{
Actor dropper;
bool enemydrop;
override bool SpecialDropAction( Actor dropper )
{
self.dropper = dropper;
enemydrop = true;
return false;
}
abstract Class<Actor> PickAmmo( bool enemydrop = false );
void SpawnAmmo()
{
let ac = PickAmmo(enemydrop);
if ( !ac ) return;
let a = Spawn(ac,pos);
if ( enemydrop )
{
a.bDropped = true;
a.bNoGravity = false;
if ( !(level.compatflags&COMPATF_NOTOSSDROPS) )
a.TossItem();
if ( a is 'Inventory' )
{
let i = Inventory(a);
i.bTossed = true;
i.ModifyDropAmount(i.Amount);
if ( i.SpecialDropAction(dropper) )
{
i.Destroy();
return;
}
}
}
SWWMUtility.TransferItemProp(self,a);
}
override void PostBeginPlay()
{
SpawnAmmo();
ClearCounters();
Destroy();
}
override bool CanPickup( Actor toucher )
{
return false;
}
override bool TryPickup( in out Actor toucher )
{
return false;
}
default
{
+NOGRAVITY;
+NOTELEPORT;
+DONTSPLASH;
+DONTGIB;
-SPECIAL;
}
}
Class SWWMShellAmmoSmall : SWWMAmmoSpawner
{
override Class<Actor> PickAmmo( bool enemydrop )
{
bool aex = (SWWMUtility.ItemExists('Spreadgun',ownedonly:enemydrop)||SWWMUtility.ItemExists('Wallbuster',ownedonly:enemydrop)),
bex = (SWWMUtility.ItemExists('PuntzerBeta',ownedonly:enemydrop)||SWWMUtility.ItemExists('PuntzerGamma',ownedonly:enemydrop));
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) )
return Random[Replacements](0,2)?'SMW05SmallAmmo':'SMW05Ammo3';
return Random[Replacements](0,2)?'RedShell':'RedShell2';
}
}
Class SWWMShellAmmoBig : SWWMAmmoSpawner
{
override Class<Actor> PickAmmo( bool enemydrop )
{
bool aex = (SWWMUtility.ItemExists('Spreadgun',ownedonly:enemydrop)||SWWMUtility.ItemExists('Wallbuster',ownedonly:enemydrop)),
bex = (SWWMUtility.ItemExists('PuntzerBeta',ownedonly:enemydrop)||SWWMUtility.ItemExists('PuntzerGamma',ownedonly:enemydrop));
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) )
return Random[Replacements](0,2)?'SMW05SmallAmmo':'SMW05BigAmmo';
return Random[Replacements](0,2)?'RedShell4':'RedShell8';
}
}
Class SWWMClipAmmoSmall : SWWMAmmoSpawner
{
override Class<Actor> PickAmmo( bool enemydrop )
{
bool aex = SWWMUtility.ItemExists('Eviscerator',ownedonly:enemydrop),
bex = SWWMUtility.ItemExists('HeavyMahSheenGun',ownedonly:enemydrop);
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) )
return Random[Replacements](0,1)?'SheenAmmo2':'SheenAmmo3';
if ( aex ) return 'EvisceratorShell';
aex = (SWWMUtility.ItemExists('Spreadgun',ownedonly:enemydrop)||SWWMUtility.ItemExists('Wallbuster',ownedonly:enemydrop));
bex = (SWWMUtility.ItemExists('PuntzerBeta',ownedonly:enemydrop)||SWWMUtility.ItemExists('PuntzerGamma',ownedonly:enemydrop));
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) )
return Random[Replacements](0,2)?'SMW05Ammo':'SMW05Ammo2';
return 'RedShell';
}
}
// special for chaingun ammo drops
Class SWWMClipAmmoMed : SWWMAmmoSpawner
{
override Class<Actor> PickAmmo( bool enemydrop )
{
bool aex = SWWMUtility.ItemExists('Eviscerator',ownedonly:enemydrop),
bex = SWWMUtility.ItemExists('HeavyMahSheenGun',ownedonly:enemydrop);
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) )
return 'SheenSmallAmmo';
return Random[Replacements](0,2)?'EvisceratorShell':'EvisceratorShell2';
}
}
Class SWWMClipAmmoBig : SWWMAmmoSpawner
{
override Class<Actor> PickAmmo( bool enemydrop )
{
bool aex = SWWMUtility.ItemExists('Eviscerator',ownedonly:enemydrop),
bex = SWWMUtility.ItemExists('HeavyMahSheenGun',ownedonly:enemydrop);
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) )
return 'SheenBigAmmo';
return Random[Replacements](0,2)?'EvisceratorShell2':'EvisceratorShell3';
}
}
Class SWWMBlastAmmoSmall : SWWMAmmoSpawner
{
override Class<Actor> PickAmmo( bool enemydrop )
{
bool aex = SWWMUtility.ItemExists('Eviscerator',ownedonly:enemydrop),
bex = SWWMUtility.ItemExists('HeavyMahSheenGun',ownedonly:enemydrop);
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) )
return Random[Replacements](0,1)?'SheenAmmo3':'SheenSmallAmmo';
return 'EvisceratorShell';
}
}
Class SWWMBlastAmmoBig : SWWMAmmoSpawner
{
override Class<Actor> PickAmmo( bool enemydrop )
{
bool aex = SWWMUtility.ItemExists('Eviscerator',ownedonly:enemydrop),
bex = SWWMUtility.ItemExists('HeavyMahSheenGun',ownedonly:enemydrop);
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) )
return 'SheenBigAmmo';
return Random[Replacements](0,2)?'EvisceratorShell2':'EvisceratorShell3';
}
}
Class SWWMRocketAmmoSmall : SWWMAmmoSpawner
{
override Class<Actor> PickAmmo( bool enemydrop )
{
bool aex = SWWMUtility.ItemExists('Hellblazer',ownedonly:enemydrop),
bex = SWWMUtility.ItemExists('Quadravol',ownedonly:enemydrop);
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) ) return 'QuadravolAmmo';
return 'HellblazerMissiles';
}
}
Class SWWMRocketAmmoBig : SWWMAmmoSpawner
{
override Class<Actor> PickAmmo( bool enemydrop )
{
bool aex = SWWMUtility.ItemExists('Hellblazer',ownedonly:enemydrop),
bex = SWWMUtility.ItemExists('Quadravol',ownedonly:enemydrop);
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) )
return Random[Replacements](0,3)?'QuadravolAmmo2':'QuadravolAmmo3';
return Random[Replacements](0,3)?'HellblazerMissiles2':'HellblazerMissiles3';
}
}
Class SWWMCellAmmoSmall : SWWMAmmoSpawner
{
override Class<Actor> PickAmmo( bool enemydrop )
{
if ( !Random[Replacements](0,2) )
{
bool aex = SWWMUtility.ItemExists('CandyGun',ownedonly:enemydrop),
bex = SWWMUtility.ItemExists('MisterRifle',ownedonly:enemydrop);
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) ) return Random[Replacements](0,1)?'MisterRound':'MisterRound2';
if ( aex ) return 'CandyGunBullets';
}
if ( Random[Replacements](0,1) )
{
bool aex = SWWMUtility.ItemExists('SilverBullet',ownedonly:enemydrop),
bex = SWWMUtility.ItemExists('RayKhom',ownedonly:enemydrop);
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) ) return 'RayBolt2';
if ( aex ) return Random[Replacements](0,2)?'SilverBullets':'SilverBullets2';
}
bool aex = SWWMUtility.ItemExists('Sparkster',ownedonly:enemydrop),
bex = SWWMUtility.ItemExists('ModernSparkster',ownedonly:enemydrop);
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) ) return Random[Replacements](0,2)?'SparksterBAmmo':'SparksterRAmmo';
return 'SparkUnit';
}
}
Class SWWMCellAmmoBig : SWWMAmmoSpawner
{
override Class<Actor> PickAmmo( bool enemydrop )
{
if ( !Random[Replacements](0,3) )
{
if ( Random[Replacements](0,1) && SWWMUtility.ItemExists('RafanKos') && SWWMUtility.CheckNeedsItem('UltimateAmmo',true) && !SWWMUtility.ItemExists('UltimateAmmo',worldonly:true) && !SWWMUtility.ItemExists('RafanKos',worldonly:true) )
return 'UltimateAmmo';
if ( (SWWMUtility.ItemExists('Ynykron')) && SWWMUtility.CheckNeedsItem('YnykronAmmo',true) && !SWWMUtility.ItemExists('YnykronAmmo',worldonly:true) && !SWWMUtility.ItemExists('Ynykron',worldonly:true) )
return 'YnykronAmmo';
}
if ( !Random[Replacements](0,2) )
{
bool aex = SWWMUtility.ItemExists('CandyGun',ownedonly:enemydrop),
bex = SWWMUtility.ItemExists('MisterRifle',ownedonly:enemydrop);
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) ) return !Random[Replacements](0,2)?'MisterGAmmo':Random[Replacements](0,2)?'MisterRound5':'MisterAmmo';
if ( aex ) return Random[Replacements](0,2)?'CandyGunBullets3':'CandyGunAmmo';
}
if ( Random[Replacements](0,1) )
{
bool aex = SWWMUtility.ItemExists('SilverBullet',ownedonly:enemydrop),
bex = SWWMUtility.ItemExists('RayKhom',ownedonly:enemydrop);
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) ) return Random[Replacements](0,2)?'RayBolt5':'RayAmmo';
if ( aex ) return Random[Replacements](0,3)?'SilverBullets3':'SilverBulletAmmo';
}
bool aex = SWWMUtility.ItemExists('Sparkster',ownedonly:enemydrop),
bex = SWWMUtility.ItemExists('ModernSparkster',ownedonly:enemydrop);
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) )
{
if ( Random[Replacements](0,1) ) return Random[Replacements](0,2)?'SparksterBAmmo2':'SparksterBAmmo3';
return Random[Replacements](0,2)?'SparksterRAmmo2':'SparksterRAmmo3';
}
return Random[Replacements](0,3)?'SparkUnit':'SparkUnit2';
}
}