diff --git a/cvarinfo.txt b/cvarinfo.txt index cf2ca473a..8cebd188d 100644 --- a/cvarinfo.txt +++ b/cvarinfo.txt @@ -111,6 +111,7 @@ server bool swwm_usetopickup = false; // allow item pickup only by pressing use server bool swwm_meleepickup = false; // allow picking up items through melee nosave bool swwm_buttsfx = true; // buttslam homerun SFX nosave int swwm_sewercount = 0; // I'm sorry Civvie +server bool swwm_ondemandammo = false; // don't spawn ammo for unavailable weapons // minimap settings nosave bool swwm_mm_enable = true; // show a minimap below the score counter diff --git a/language.def_menu b/language.def_menu index e1039ba06..3fe3a7f90 100644 --- a/language.def_menu +++ b/language.def_menu @@ -191,6 +191,7 @@ SWWM_SELFLIGHT = "Self-Lighting"; SWWM_USETOPICKUP = "Exclusive Use To Pickup"; SWWM_MELEEPICKUP = "Allow Item Pickup Through Melee"; SWWM_BUTTSFX = "Clapping Buttcheeks"; +SWWM_ONDEMANDAMMO = "On Demand Ammo Placement"; SWWM_MMTITLE = "Minimap Settings"; SWWM_MM_ENABLE = "Show Minimap"; SWWM_MM_ROTATE = "Rotate Minimap"; @@ -330,6 +331,7 @@ TOOLTIP_SWWM_SELFLIGHT = "Emit blue light from the player's face. Disable if thi TOOLTIP_SWWM_USETOPICKUP = "Prevents picking up mod items through touch, exclusively requiring a use action instead."; TOOLTIP_SWWM_MELEEPICKUP = "Allows picking up items though melee attacks. Do note that some weapons have an extended melee range, allowing you to grab things from farther away."; TOOLTIP_SWWM_BUTTSFX = "The Demolitionist's buttcheeks will VERY AUDIBLY clap upon executing a successful buttslam."; +TOOLTIP_SWWM_ONDEMANDAMMO = "Only ammo for weapons that are currently available (either in the player's inventory or in the map) will spawn in the map. May cause long load times on large maps."; TOOLTIP_SWWM_MM_ENABLE = "Displays a minimap under the score counter."; TOOLTIP_SWWM_MM_ROTATE = "Rotates the minimap view."; TOOLTIP_SWWM_MM_GRID = "Shows a 128x128 grid on the minimap."; diff --git a/language.es_menu b/language.es_menu index 5d9cfed0b..413169d6f 100644 --- a/language.es_menu +++ b/language.es_menu @@ -190,6 +190,7 @@ SWWM_SELFLIGHT = "Luz Propia"; SWWM_USETOPICKUP = "Uso Exclusivo para Recoger"; SWWM_MELEEPICKUP = "Permitir Recoger Ítems con Melé"; SWWM_BUTTSFX = "Azote de Nalgas"; +SWWM_ONDEMANDAMMO = "Colocar Munición por Demanda"; SWWM_MMTITLE = "Opciones de Minimapa"; SWWM_MM_ENABLE = "Mostrar Minimapa"; SWWM_MM_ROTATE = "Rotar Minimapa"; @@ -329,6 +330,7 @@ TOOLTIP_SWWM_SELFLIGHT = "Emite luz azul desde la cara del jugador. Desactiva si TOOLTIP_SWWM_USETOPICKUP = "Evita recoger ítems del mod al tocarlos, en su lugar requiriendo exclusivamente una acción de uso."; TOOLTIP_SWWM_MELEEPICKUP = "Permite recoger ítems por medio de ataques a melé. Ten en cuenta que algunas armas tienen un rango de melé extendido, permitiéndote alcanzar cosas desde una mayor distancia."; TOOLTIP_SWWM_BUTTSFX = "Las nalgas de la Demolicionista emitiran un azote MUY SONORO al ejecutar exitosamente un golpe de culo."; +TOOLTIP_SWWM_ONDEMANDAMMO = "Solo coloca en el mapa munición para armas que estén actualmente disponibles (tanto en el inventario del jugador como en el mapa). Puede causar tiempos de carga largos en mapas grandes."; TOOLTIP_SWWM_MM_ENABLE = "Muestra un minimapa bajo el contador de puntuación."; TOOLTIP_SWWM_MM_ROTATE = "Gira la vista del minimapa."; TOOLTIP_SWWM_MM_GRID = "Muestra una cuadrícula de 128x128 en el minimapa."; diff --git a/language.version b/language.version index 66b4040d6..3e3e9ef15 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r553 \cu(Wed 23 Jun 01:00:39 CEST 2021)\c-"; -SWWM_SHORTVER="\cw0.9.11b-pre r553 \cu(2021-06-23 01:00:39)\c-"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r555 \cu(Wed 23 Jun 01:06:21 CEST 2021)\c-"; +SWWM_SHORTVER="\cw0.9.11b-pre r555 \cu(2021-06-23 01:06:21)\c-"; diff --git a/menudef.txt b/menudef.txt index 19c8e03b5..f45a1cff5 100644 --- a/menudef.txt +++ b/menudef.txt @@ -152,6 +152,7 @@ OptionMenu "SWWMOptionMenu" StaticText "$SWWM_BTITLE", "Blue" Option "$SWWM_PISTOLSTART", "swwm_pistolstart", "YesNo" Option "$SWWM_ENEMYDROPS", "swwm_enemydrops", "SWWMEnemyDropType" + Option "$SWWM_ONDEMANDAMMO", "swwm_ondemandammo", "YesNo" Option "$SWWM_RESETSCORE", "swwm_resetscore", "YesNo" Option "$SWWM_EXTRAALERT", "swwm_extraalert", "YesNo" Option "$SWWM_BOSSENHANCE", "swwm_upgradebosses", "YesNo" diff --git a/zscript.txt b/zscript.txt index 67476e4e1..621dbdb4c 100644 --- a/zscript.txt +++ b/zscript.txt @@ -70,6 +70,7 @@ version "4.6" #include "zscript/items/swwm_powerups.zsc" #include "zscript/items/swwm_ammoitems.zsc" #include "zscript/items/swwm_ammoextra.zsc" +#include "zscript/items/swwm_ammospawn.zsc" #include "zscript/items/swwm_funstuff.zsc" #include "zscript/items/swwm_collectibles.zsc" #include "zscript/items/swwm_collectibles_gesture.zsc" diff --git a/zscript/dlc1/swwm_ammoitems_dlc.zsc b/zscript/dlc1/swwm_ammoitems_dlc.zsc index deea49ffa..fc760ac4a 100644 --- a/zscript/dlc1/swwm_ammoitems_dlc.zsc +++ b/zscript/dlc1/swwm_ammoitems_dlc.zsc @@ -34,26 +34,17 @@ Class SMW05Ammo : Ammo } } -Class SMW05BundleSpawn : Actor +Class SMW05BundleSpawn : SWWMAmmoSpawner { - override void PostBeginPlay() + override void SpawnAmmo() { - if ( bCOUNTSECRET ) level.total_secrets--; int bnd = Random[Bundle](2,3); for ( int i=0; i redpool[] = {'RedShell','RedShell2','RedShell4'}; - static const Class greenpool[] = {'GreenShell','GreenShell2','GreenShell4'}; - static const Class whitepool[] = {'WhiteShell','WhiteShell2'}; - static const Class purplepool[] = {'PurpleShell','PurpleShell2','PurpleShell4'}; - static const Class bluepool[] = {'BlueShell','BlueShell2','BlueShell4'}; // DRLA Monsters stuff if ( hasdrlamonsters ) { @@ -611,7 +605,7 @@ extend Class SWWMHandler } e.Replacement = 'SWWMBossBrain'; } - else if ( e.Replacee is 'RedCard' ) + else if ( (e.Replacee is 'RedCard') && !(e.Replacee is 'ChexRedCard') ) { if ( level.GetChecksum() ~== "3805A661D5C4523AFF7BF86991071043" ) { @@ -620,8 +614,8 @@ extend Class SWWMHandler } e.Replacement = 'SWWMRedCard'; } - else if ( e.Replacee is 'BlueCard' ) e.Replacement = 'SWWMBlueCard'; - else if ( e.Replacee is 'YellowCard' ) e.Replacement = 'SWWMYellowCard'; + else if ( (e.Replacee is 'BlueCard') && !(e.Replacee is 'ChexBlueCard') ) e.Replacement = 'SWWMBlueCard'; + else if ( (e.Replacee is 'YellowCard') && !(e.Replacee is 'ChexYellowCard') ) e.Replacement = 'SWWMYellowCard'; else if ( e.Replacee.GetClassName() == 'GreenCard' ) e.Replacement = 'SWWMGreenCard'; else if ( e.Replacee is 'RedSkull' ) e.Replacement = iskdizd?'SWWMSilverCardKDiZD':'SWWMRedSkull'; else if ( e.Replacee is 'BlueSkull' ) e.Replacement = iskdizd?'SWWMGreenCardKDiZD':'SWWMBlueSkull'; @@ -646,144 +640,49 @@ extend Class SWWMHandler else if ( e.Replacee is 'MWeaponPiece1' ) e.Replacement = SWWMUtility.PickSWWMSlot0(); else if ( (e.Replacee is 'ShellBox') || (e.Replacee is 'CrossbowHefty') ) { - /*if ( Random[Replacements](0,1) ) e.Replacement = Random[Replacements](0,2)?'SMW05SmallAmmo':'SMW05BigAmmo'; - else */switch( Random[Replacements](0,20) ) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - e.Replacement = redpool[Random[Replacements](1,2)]; - break; - case 6: - case 7: - case 8: - case 9: - case 10: - e.Replacement = greenpool[Random[Replacements](1,2)]; - break; - case 11: - case 12: - case 13: - case 14: - e.Replacement = purplepool[Random[Replacements](0,2)]; - break; - case 15: - case 16: - case 17: - e.Replacement = bluepool[Random[Replacements](0,2)]; - break; - case 18: - case 19: - e.Replacement = whitepool[Random[Replacements](0,1)]; - break; - case 20: - e.Replacement = 'BlackShell'; - break; - } + if ( swwm_ondemandammo ) e.Replacement = 'SWWMShellAmmoBig'; + else e.Replacement = SWWMShellAmmoBig.PickAmmo(true); } else if ( (e.Replacee is 'Shell') || (e.Replacee is 'CrossbowAmmo') ) { - /*if ( Random[Replacements](0,1) ) e.Replacement = Random[Replacements](0,2)?'SMW05SmallAmmo':'SMW05BundleSpawn'; - else */switch( Random[Replacements](0,9) ) - { - case 0: - case 1: - case 2: - case 3: - e.Replacement = redpool[0]; - break; - case 4: - case 5: - case 6: - e.Replacement = greenpool[0]; - break; - case 7: - case 8: - e.Replacement = purplepool[0]; - break; - case 9: - e.Replacement = bluepool[0]; - break; - } + if ( swwm_ondemandammo ) e.Replacement = 'SWWMShellAmmoSmall'; + else e.Replacement = SWWMShellAmmoSmall.PickAmmo(true); } else if ( e.Replacee is 'ClipBox' ) { - /*if ( Random[Replacements](0,1) ) e.Replacement = Random[Replacements](0,2)?'SheenSmallAmmo':'SheenBigAmmo'; - else */e.Replacement = Random[Replacements](0,5)?'EvisceratorShell':Random[Replacements](0,9)?'EvisceratorTrioSpawn':'EvisceratorSixPack'; + if ( swwm_ondemandammo ) e.Replacement = 'SWWMClipAmmoBig'; + else e.Replacement = SWWMClipAmmoBig.PickAmmo(true); } - else if ( (e.Replacee is 'Clip') || (e.Replacee is 'GoldWandAmmo') ) e.Replacement = /*(e.Replacee is 'GoldWandHefty')?'SheenSmallAmmo':'SheenTinyAmmo'*/'SWWMNothing'; + else if ( (e.Replacee is 'Clip') || (e.Replacee is 'GoldWandAmmo') ) e.Replacement = 'SWWMNothing'; else if ( e.Replacee is 'BlasterHefty' ) { - /*if ( Random[Replacements](0,1) ) e.Replacement = Random[Replacements](0,2)?'SheenBigAmmo':'SheenSmallAmmo'; - else */e.Replacement = Random[Replacements](0,6)?'EvisceratorTrioSpawn':'EvisceratorSixPack'; + if ( swwm_ondemandammo ) e.Replacement = 'SWWMBlastAmmoBig'; + else e.Replacement = SWWMBlastAmmoBig.PickAmmo(true); } else if ( e.Replacee is 'BlasterAmmo' ) { - /*if ( Random[Replacements](0,1) ) e.Replacement = Random[Replacements](0,2)?'SheenSmallAmmo':'SheenTinyAmmo'; - else */e.Replacement = 'EvisceratorShell'; + if ( swwm_ondemandammo ) e.Replacement = 'SWWMBlastAmmoSmall'; + else e.Replacement = SWWMBlastAmmoSmall.PickAmmo(true); } else if ( (e.Replacee is 'RocketBox') || (e.Replacee is 'PhoenixRodHefty') || (e.Replacee is 'MaceHefty') ) { - /*if ( Random[Replacements](0,1) ) e.Replacement = Random[Replacements](0,2)?'QuadravolAmmo':'QuadravolAmmoBundleSpawn'; - else */switch ( Random[Replacements](0,11) ) - { - case 0: - case 1: - case 2: - case 3: - case 4: - if ( Random[Replacements](0,5) ) e.Replacement = 'HellblazerMissiles'; - else if ( Random[Replacements](0,4) ) e.Replacement = 'HellblazerMissileTrioSpawn'; - else e.Replacement = 'HellblazerMissileMag'; - break; - case 5: - case 6: - case 7: - case 8: - if ( Random[Replacements](0,6) ) e.Replacement = 'HellblazerCrackshots'; - else e.Replacement = 'HellblazerCrackshotMag'; - break; - case 9: - case 10: - if ( Random[Replacements](0,8) ) e.Replacement = 'HellblazerRavagers'; - else e.Replacement = 'HellblazerRavagerMag'; - break; - case 11: - if ( Random[Replacements](0,10) ) e.Replacement = 'HellblazerWarheads'; - else e.Replacement = 'HellblazerWarheadMag'; - break; - } + if ( swwm_ondemandammo ) e.Replacement = 'SWWMRocketAmmoBig'; + else e.Replacement = SWWMRocketAmmoBig.PickAmmo(true); } else if ( (e.Replacee is 'RocketAmmo') || (e.Replacee is 'PhoenixRodAmmo') || (e.Replacee is 'MaceAmmo') ) { - /*if ( Random[Replacements](0,1) ) e.Replacement = 'QuadravolAmmo'; - else */e.Replacement = Random[Replacements](0,2)?'HellblazerMissiles':'HellblazerCrackshots'; + if ( swwm_ondemandammo ) e.Replacement = 'SWWMRocketAmmoSmall'; + else e.Replacement = SWWMRocketAmmoSmall.PickAmmo(true); } else if ( (e.Replacee is 'CellPack') || (e.Replacee is 'SkullRodHefty') ) { - /*if ( Random[Replacements](0,1) ) - { - if ( !Random[Replacements](0,2) ) e.Replacement = Random[Replacements](0,3)?'EMPCoreBundleSpawn':'EMPCore'; - else if ( Random[Replacements](0,2) ) e.Replacement = 'RayBoltBundleSpawn'; - else e.Replacement = 'RayAmmo'; - } - else */if ( !Random[Replacements](0,2) ) - { - if ( Random[Replacements](0,3) ) e.Replacement = Random[Replacements](0,2)?'SilverBulletsBundleSpawn':'SilverBullets2BundleSpawn'; - else e.Replacement = Random[Replacements](0,2)?'SilverBulletAmmo':'SilverBulletAmmo2'; - } - else if ( Random[Replacements](0,2) ) e.Replacement = 'CandyGunBulletsBundleSpawn'; - else e.Replacement = 'CandyGunAmmo'; + if ( swwm_ondemandammo ) e.Replacement = 'SWWMCellAmmoBig'; + else e.Replacement = SWWMCellAmmoBig.PickAmmo(true); } else if ( (e.Replacee is 'Cell') || (e.Replacee is 'SkullRodAmmo') ) { - if ( !Random[Replacements](0,2) ) e.Replacement = /*!Random[Replacements](0,2)?'RayBattery':*/Random[Replacements](0,2)?'HellblazerRavagers':'HellblazerWarheads'; - else if ( Random[Replacements](0,2) ) e.Replacement = /*Random[Replacements](0,1)?'DarkCanister':*/'SparkUnit'; - else if ( !Random[Replacements](0,3) ) e.Replacement = /*Random[Replacements](0,1)?'RayBolt':*/'CandyGunBullets'; - else e.Replacement = /*Random[Replacements](0,1)?'EMPCore':*/Random[Replacements](0,2)?'SilverBullets':'SilverBullets2'; + if ( swwm_ondemandammo ) e.Replacement = 'SWWMCellAmmoSmall'; + else e.Replacement = SWWMCellAmmoSmall.PickAmmo(true); } else if ( e.Replacee is 'Mana1' ) e.Replacement = 'FabricatorTier1'; else if ( e.Replacee is 'Mana2' ) e.Replacement = 'FabricatorTier2'; diff --git a/zscript/items/swwm_ammoextra.zsc b/zscript/items/swwm_ammoextra.zsc index 27d25d91f..72200b2fd 100644 --- a/zscript/items/swwm_ammoextra.zsc +++ b/zscript/items/swwm_ammoextra.zsc @@ -500,25 +500,7 @@ Class HammerspaceEmbiggener : Inventory } let n = Spawn("BulkHammerspaceEmbiggener",pos); Inventory(n).Amount = min(tamount,MaxAmount); - n.spawnpoint = spawnpoint; - n.spawnangle = spawnangle; - n.angle = angle; - n.pitch = pitch; - n.roll = roll; - n.special = special; - for ( int i=0; i<5; i++ ) n.args[i] = args[i]; - n.special1 = special1; - n.special2 = special2; - n.spawnflags = spawnflags&~MTF_SECRET; - n.HandleSpawnFlags(); - n.spawnflags = spawnflags; - n.bCountSecret = spawnflags&MTF_SECRET; - n.ChangeTid(tid); - n.vel = vel; - n.master = master; - n.tracer = tracer; - n.target = target; - if ( !bDROPPED ) n.bDROPPED = false; + SWWMUtility.TransferItemProp(self,n); ClearCounters(); Destroy(); } diff --git a/zscript/items/swwm_ammoitems.zsc b/zscript/items/swwm_ammoitems.zsc index 0f989b4ff..50f710045 100644 --- a/zscript/items/swwm_ammoitems.zsc +++ b/zscript/items/swwm_ammoitems.zsc @@ -522,26 +522,17 @@ Class EvisceratorSixPack : EvisceratorShell } } -Class EvisceratorTrioSpawn : Actor +Class EvisceratorBundleSpawn : SWWMAmmoSpawner { - override void PostBeginPlay() + override void SpawnAmmo() { - if ( bCOUNTSECRET ) level.total_secrets--; - for ( int i=0; i<3; i++ ) + int bnd = Random[Bundle](3,4); + for ( int i=0; i PickAmmo( bool notondemand = false ) + { + /*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('PuntzerBeta') || SWWMUtility.ItemExists('PuntzerGamma')) ) + return Random[Replacements](0,2)?'SMW05SmallAmmo':'SMW05BundleSpawn';*/ + switch( Random[Replacements](0,9) ) + { + case 0: + case 1: + case 2: + case 3: + return 'RedShell'; + case 4: + case 5: + case 6: + return 'GreenShell'; + case 7: + case 8: + return 'PurpleShell'; + } + // case 9 + return 'BlueShell'; + } +} +Class SWWMShellAmmoBig : SWWMAmmoSpawner +{ + Mixin SWWMOndemandAmmoSpawner; + + static Class PickAmmo( bool notondemand = false ) + { + // shell types (sorted by rarity) + static const Class redpool[] = {'RedShell','RedShell2','RedShell4'}; + static const Class greenpool[] = {'GreenShell','GreenShell2','GreenShell4'}; + static const Class whitepool[] = {'WhiteShell','WhiteShell2'}; + static const Class purplepool[] = {'PurpleShell','PurpleShell2','PurpleShell4'}; + static const Class bluepool[] = {'BlueShell','BlueShell2','BlueShell4'}; + /*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('PuntzerBeta') || SWWMUtility.ItemExists('PuntzerGamma')) ) + return Random[Replacements](0,2)?'SMW05SmallAmmo':'SMW05BigAmmo';*/ + switch( Random[Replacements](0,20) ) + { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + return redpool[Random[Replacements](0,2)]; + case 6: + case 7: + case 8: + case 9: + case 10: + return greenpool[Random[Replacements](0,2)]; + case 11: + case 12: + case 13: + case 14: + return purplepool[Random[Replacements](0,2)]; + case 15: + case 16: + case 17: + return bluepool[Random[Replacements](0,2)]; + case 18: + case 19: + return whitepool[Random[Replacements](0,1)]; + } + // case 20 + return 'BlackShell'; + } +} +Class SWWMClipAmmoBig : SWWMAmmoSpawner +{ + Mixin SWWMOndemandAmmoSpawner; + + static Class PickAmmo( bool notondemand = false ) + { + /*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('HeavyMahsheenGun')) ) + return Random[Replacements](0,2)?'SheenSmallAmmo':'SheenBigAmmo';*/ + return Random[Replacements](0,5)?'EvisceratorShell':'EvisceratorBundleSpawn'; + } +} +Class SWWMBlastAmmoSmall : SWWMAmmoSpawner +{ + Mixin SWWMOndemandAmmoSpawner; + + static Class PickAmmo( bool notondemand = false ) + { + /*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('HeavyMahsheenGun')) ) + return Random[Replacements](0,2)?'SheenSmallAmmo':'SheenTinyAmmo';*/ + return 'EvisceratorShell'; + } +} +Class SWWMBlastAmmoBig : SWWMAmmoSpawner +{ + Mixin SWWMOndemandAmmoSpawner; + + static Class PickAmmo( bool notondemand = false ) + { + /*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('HeavyMahsheenGun')) ) + return Random[Replacements](0,2)?'SheenBigAmmo':'SheenSmallAmmo';*/ + return 'EvisceratorBundleSpawn'; + } +} +Class SWWMRocketAmmoSmall : SWWMAmmoSpawner +{ + Mixin SWWMOndemandAmmoSpawner; + + static Class PickAmmo( bool notondemand = false ) + { + /*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('Quadravol')) ) return 'QuadravolAmmo';*/ + return Random[Replacements](0,2)?'HellblazerMissiles':'HellblazerCrackshots'; + } +} +Class SWWMRocketAmmoBig : SWWMAmmoSpawner +{ + Mixin SWWMOndemandAmmoSpawner; + + static Class PickAmmo( bool notondemand = false ) + { + /*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('Quadravol')) ) + return Random[Replacements](0,2)?'QuadravolAmmo':'QuadravolAmmoBundleSpawn';*/ + switch ( Random[Replacements](0,11) ) + { + case 0: + case 1: + case 2: + case 3: + case 4: + return Random[Replacements](0,2)?'HellblazerMissiles':'HellblazerMissileBundleSpawn'; + case 5: + case 6: + case 7: + case 8: + return Random[Replacements](0,3)?'HellblazerCrackshots':'HellblazerCrackshotBundleSpawn'; + case 9: + case 10: + return 'HellblazerRavagers'; + } + // case 11 + return 'HellblazerWarheads'; + } +} +Class SWWMCellAmmoSmall : SWWMAmmoSpawner +{ + Mixin SWWMOndemandAmmoSpawner; + + static Class PickAmmo( bool notondemand = false ) + { + /*if ( !Random[Replacements](0,2) && (notondemand || SWWMUtility.ItemExists('RayKhom') || SWWMUtility.ItemExists('GrandLance')) ) return 'RayBattery';*/ + if ( !Random[Replacements](0,2) ) + { + if ( !Random[Replacements](0,3) ) + { + /*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('RayKhom')) ) return 'RayBolt';*/ + if ( notondemand || SWWMUtility.ItemExists('CandyGun') ) return 'CandyGunBullets'; + } + /*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('EMPCarbine')) ) return 'EMPCore';*/ + if ( notondemand || SWWMUtility.ItemExists('SilverBullet') ) return Random[Replacements](0,2)?'SilverBullets':'SilverBullets2'; + } + /*if ( !Random[Replacements](0,4) && (notondemand || SWWMUtility.ItemExists('BlackfireIgniter')) ) return 'DarkCanister';*/ + return 'SparkUnit'; + } +} +Class SWWMCellAmmoBig : SWWMAmmoSpawner +{ + Mixin SWWMOndemandAmmoSpawner; + + static Class PickAmmo( bool notondemand = false ) + { + /*if ( Random[Replacements](0,1) ) + { + if ( !Random[Replacements](0,2) && (notondemand || SWWMUtility.ItemExists('EMPCarbine')) ) return Random[Replacements](0,3)?'EMPCoreBundleSpawn':'EMPCore'; + if ( notondemand || SWWMUtility.ItemExists('RayKhom') ) return Random[Replacements](0,2)?'RayBoltBundleSpawn':'RayAmmo'; + }*/ + if ( !Random[Replacements](0,2) && (notondemand || SWWMUtility.ItemExists('SilverBullet')) ) + { + if ( Random[Replacements](0,3) ) return Random[Replacements](0,2)?'SilverBulletsBundleSpawn':'SilverBullets2BundleSpawn'; + return Random[Replacements](0,2)?'SilverBulletAmmo':'SilverBulletAmmo2'; + } + if ( notondemand || SWWMUtility.ItemExists('CandyGun') ) return Random[Replacements](0,2)?'CandyGunBulletsBundleSpawn':'CandyGunAmmo'; + /*if ( !Random[Replacements](0,2) && (notondemand || SWWMUtility.ItemExists('BlackfireIgniter')) ) return 'DarkCanister';*/ + return Random[Replacements](0,2)?'SparkUnit':'SparkUnitBundleSpawn'; + } +} diff --git a/zscript/items/swwm_baseammo.zsc b/zscript/items/swwm_baseammo.zsc index 7cdab453f..3d897a0ea 100644 --- a/zscript/items/swwm_baseammo.zsc +++ b/zscript/items/swwm_baseammo.zsc @@ -380,3 +380,25 @@ Mixin Class SWWMShellAmmo Amount = Random[ShellDrop](1,clamp(dropamount,1,4)); } } + +// Ref class for ammo spawners, used by both on-demand replacers and bundles +Class SWWMAmmoSpawner : Actor abstract +{ + virtual void SpawnAmmo() {} + + override void PostBeginPlay() + { + SpawnAmmo(); + ClearCounters(); + Destroy(); + } + + default + { + +NOGRAVITY; + +NOBLOCKMAP; + +NOINTERACTION; + +NOTELEPORT; + +DONTSPLASH; + } +} diff --git a/zscript/items/swwm_funstuff.zsc b/zscript/items/swwm_funstuff.zsc index dd1186178..67b89bbdb 100644 --- a/zscript/items/swwm_funstuff.zsc +++ b/zscript/items/swwm_funstuff.zsc @@ -735,18 +735,8 @@ Class ChanceboxSpawner : Actor } let b = Spawn("Chancebox",pos); // copy all our stuff - b.spawnangle = spawnangle; - b.angle = angle; - b.pitch = pitch; - b.roll = roll; - b.spawnpoint = spawnpoint; - b.special = special; - for ( int i=0; i<5; i++ ) - b.Args[i] = Args[i]; - b.spawnflags = spawnflags&~MTF_SECRET; - b.HandleSpawnFlags(); - b.bCOUNTSECRET = spawnflags&MTF_SECRET; - b.ChangeTid(tid); + SWWMUtility.TransferItemProp(self,b); + ClearCounters(); Destroy(); } diff --git a/zscript/utility/swwm_utility.zsc b/zscript/utility/swwm_utility.zsc index 01305abd5..8b582a30e 100644 --- a/zscript/utility/swwm_utility.zsc +++ b/zscript/utility/swwm_utility.zsc @@ -2099,6 +2099,38 @@ Class SWWMUtility if ( level.maptime ) return PickSWWMSlot3(); // always slot 3 after map start, prevents shotgun guys from dropping wallbusters return PickPair(PickSWWMSlot3(),PickSWWMSlot4(),2); } + // what RandomSpawner does, basically (simplified for items) + static play void TransferItemProp( Actor a, Actor b, bool bundlehack = false ) + { + if ( bundlehack ) + { + b.spawnpoint = b.pos; + b.spawnangle = int(b.angle); + } + else + { + b.spawnpoint = a.spawnpoint; + b.spawnangle = a.spawnangle; + b.angle = a.angle; + b.pitch = a.pitch; + b.roll = a.roll; + } + b.special = a.special; + b.FloatBobPhase = a.FloatBobPhase; // important + for ( int i=0; i<5; i++ ) b.args[i] = a.args[i]; + b.special1 = a.special1; + b.special2 = a.special2; + b.spawnflags = a.spawnflags&~MTF_SECRET; + b.HandleSpawnFlags(); + b.spawnflags = a.spawnflags; + b.bCountSecret = a.spawnflags&MTF_SECRET; + b.ChangeTid(a.tid); + b.vel = b.vel; + b.master = b.master; + b.tracer = b.tracer; + b.target = b.target; + b.bDROPPED = a.bDROPPED; + } } Class RadiusDebugSphere : Actor