swwmgz_m/zscript/items/swwm_ammospawn.zsc

286 lines
8.4 KiB
Text

// on-demand ammo spawners
Mixin Class SWWMOndemandAmmoSpawner
{
Actor dropper;
bool enemydrop;
override bool SpecialDropAction( Actor dropper )
{
self.dropper = dropper;
enemydrop = true;
return false;
}
override void SpawnAmmo()
{
let ac = PickAmmo();
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;
if ( i.SpecialDropAction(dropper) )
{
i.Destroy();
return;
}
}
}
SWWMUtility.TransferItemProp(self,a);
}
}
Class SWWMShellAmmoSmall : SWWMAmmoSpawner
{
Mixin SWWMOndemandAmmoSpawner;
static Class<Actor> PickAmmo()
{
bool aex = (SWWMUtility.ItemExists('Spreadgun')||SWWMUtility.ItemExists('Wallbuster')),
bex = (SWWMUtility.ItemExists('PuntzerBeta')||SWWMUtility.ItemExists('PuntzerGamma'));
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) )
return Random[Replacements](0,2)?'SMW05SmallAmmo':'SMW05Ammo3';
switch( Random[Replacements](0,9) )
{
case 0:
case 1:
case 2:
return 'RedShell';
case 3:
case 4:
case 5:
return 'GreenShell';
case 6:
case 7:
return 'BlueShell';
}
// case 8-9
return 'PurpleShell';
}
}
Class SWWMShellAmmoBig : SWWMAmmoSpawner
{
Mixin SWWMOndemandAmmoSpawner;
static Class<Actor> PickAmmo()
{
bool aex = (SWWMUtility.ItemExists('Spreadgun')||SWWMUtility.ItemExists('Wallbuster')),
bex = (SWWMUtility.ItemExists('PuntzerBeta')||SWWMUtility.ItemExists('PuntzerGamma'));
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) )
return Random[Replacements](0,2)?'SMW05SmallAmmo':'SMW05BigAmmo';
switch( Random[Replacements](0,14) )
{
case 0:
case 1:
case 2:
case 3:
return 'RedShell2';
case 4:
case 5:
case 6:
case 7:
return 'GreenShell2';
case 8:
case 9:
case 10:
return 'BlueShell';
case 11:
case 12:
return 'PurpleShell';
}
// case 13-14
return 'BlackShell';
}
}
Class SWWMClipAmmoSmall : SWWMAmmoSpawner
{
Mixin SWWMOndemandAmmoSpawner;
static Class<Actor> PickAmmo()
{
if ( !Random[Replacements](0,4) )
{
bool aex = SWWMUtility.ItemExists('Eviscerator'),
bex = SWWMUtility.ItemExists('HeavyMahSheenGun');
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) )
return Random[Replacements](0,2)?'SheenAmmo3':'SheenSmallAmmo';
if ( aex )
return 'EvisceratorShell';
}
bool aex = (SWWMUtility.ItemExists('Spreadgun')||SWWMUtility.ItemExists('Wallbuster')),
bex = (SWWMUtility.ItemExists('PuntzerBeta')||SWWMUtility.ItemExists('PuntzerGamma'));
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) )
return Random[Replacements](0,2)?'SMW05Ammo':'SMW05Ammo2';
return Random[Replacements](0,1)?'RedShell':'GreenShell';
}
}
// special for chaingun ammo drops
Class SWWMClipAmmoMed : SWWMAmmoSpawner
{
Mixin SWWMOndemandAmmoSpawner;
static Class<Actor> PickAmmo()
{
bool aex = SWWMUtility.ItemExists('Eviscerator'),
bex = SWWMUtility.ItemExists('HeavyMahSheenGun');
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) )
return Random[Replacements](0,1)?'SheenAmmo3':'SheenSmallAmmo';
return Random[Replacements](0,1)?'EvisceratorShell':'EvisceratorShell2';
}
}
Class SWWMClipAmmoBig : SWWMAmmoSpawner
{
Mixin SWWMOndemandAmmoSpawner;
static Class<Actor> PickAmmo()
{
bool aex = SWWMUtility.ItemExists('Eviscerator'),
bex = SWWMUtility.ItemExists('HeavyMahSheenGun');
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) )
return Random[Replacements](0,2)?'SheenSmallAmmo':'SheenBigAmmo';
return Random[Replacements](0,5)?'EvisceratorShell':Random[Replacements](0,2)?'EvisceratorShell2':'EvisceratorShell3';
}
}
Class SWWMBlastAmmoSmall : SWWMAmmoSpawner
{
Mixin SWWMOndemandAmmoSpawner;
static Class<Actor> PickAmmo()
{
bool aex = SWWMUtility.ItemExists('Eviscerator'),
bex = SWWMUtility.ItemExists('HeavyMahSheenGun');
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) )
return Random[Replacements](0,2)?'SheenAmmo3':'SheenSmallAmmo';
return 'EvisceratorShell';
}
}
Class SWWMBlastAmmoBig : SWWMAmmoSpawner
{
Mixin SWWMOndemandAmmoSpawner;
static Class<Actor> PickAmmo()
{
bool aex = SWWMUtility.ItemExists('Eviscerator'),
bex = SWWMUtility.ItemExists('HeavyMahSheenGun');
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) )
return Random[Replacements](0,2)?'SheenSmallAmmo':'SheenBigAmmo';
return Random[Replacements](0,2)?'EvisceratorShell':Random[Replacements](0,1)?'EvisceratorShell2':'EvisceratorShell3';
}
}
Class SWWMRocketAmmoSmall : SWWMAmmoSpawner
{
Mixin SWWMOndemandAmmoSpawner;
static Class<Actor> PickAmmo()
{
bool aex = SWWMUtility.ItemExists('Hellblazer'),
bex = SWWMUtility.ItemExists('Quadravol');
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) ) return 'QuadravolAmmo';
return Random[Replacements](0,2)?'HellblazerMissiles':'HellblazerCrackshots';
}
}
Class SWWMRocketAmmoBig : SWWMAmmoSpawner
{
Mixin SWWMOndemandAmmoSpawner;
static Class<Actor> PickAmmo()
{
bool aex = SWWMUtility.ItemExists('Hellblazer'),
bex = SWWMUtility.ItemExists('Quadravol');
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) )
return Random[Replacements](0,4)?'QuadravolAmmo2':'QuadravolAmmo3';
switch ( Random[Replacements](0,11) )
{
case 0:
case 1:
case 2:
case 3:
case 4:
return Random[Replacements](0,4)?'HellblazerMissiles':'HellblazerMissiles2';
case 5:
case 6:
case 7:
case 8:
return Random[Replacements](0,7)?'HellblazerCrackshots':'HellblazerCrackshots2';
case 9:
case 10:
return 'HellblazerRavagers';
}
// case 11
return 'HellblazerWarheads';
}
}
Class SWWMCellAmmoSmall : SWWMAmmoSpawner
{
Mixin SWWMOndemandAmmoSpawner;
static Class<Actor> PickAmmo()
{
if ( !Random[Replacements](0,2) )
{
if ( !Random[Replacements](0,3) )
{
bool aex = SWWMUtility.ItemExists('CandyGun'),
bex = SWWMUtility.ItemExists('MisterRifle');
if ( (!aex && bex) || (!Random[Replacements](0,2) && bex) ) return 'MisterGAmmo';
if ( aex ) return 'CandyGunBullets';
}
bool aex = SWWMUtility.ItemExists('SilverBullet'),
bex = SWWMUtility.ItemExists('RayKhom');
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) ) return 'RayBolt2';
if ( aex ) return Random[Replacements](0,2)?'SilverBullets':'SilverBullets2';
}
bool aex = SWWMUtility.ItemExists('Sparkster'),
bex = SWWMUtility.ItemExists('ModernSparkster');
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) ) return Random[Replacements](0,2)?'SparksterBAmmo':'SparksterRAmmo';
return 'SparkUnit';
}
}
Class SWWMCellAmmoBig : SWWMAmmoSpawner
{
Mixin SWWMOndemandAmmoSpawner;
static Class<Actor> PickAmmo()
{
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,1) )
{
bool aex = SWWMUtility.ItemExists('SilverBullet'),
bex = SWWMUtility.ItemExists('RayKhom');
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) ) return Random[Replacements](0,2)?'RayBolt5':'RayAmmo';
if ( aex )
{
if ( Random[Replacements](0,3) ) return Random[Replacements](0,2)?'SilverBullets_2':'SilverBullets2_2';
return Random[Replacements](0,2)?'SilverBulletAmmo':'SilverBulletAmmo2';
}
}
if ( !Random[Replacements](0,2) )
{
bool aex = SWWMUtility.ItemExists('CandyGun'),
bex = SWWMUtility.ItemExists('MisterRifle');
if ( (!aex && bex) || (Random[Replacements](0,1) && bex) ) return Random[Replacements](0,2)?'MisterRound5':'MisterAmmo';
if ( aex ) return Random[Replacements](0,3)?'CandyGunBullets3':'CandyGunAmmo';
}
bool aex = SWWMUtility.ItemExists('Sparkster'),
bex = SWWMUtility.ItemExists('ModernSparkster');
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';
}
}