// 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 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 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 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 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 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 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 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 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 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 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 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 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'; } }