From 6baa8b8215e0f6dc14e394ffbce36b77cc3a35a0 Mon Sep 17 00:00:00 2001 From: Marisa the Magician Date: Thu, 15 Sep 2022 13:46:46 +0200 Subject: [PATCH] Allow embiggener to give mag ammo like in the sidemods. --- README.md | 16 +++--- language.version | 4 +- zscript/dlc1/swwm_ammoitems_dlc.zsc | 2 + zscript/items/swwm_ammoextra.zsc | 78 +++++++++++++++++++++++++++++ zscript/items/swwm_ammoitems.zsc | 2 + zscript/items/swwm_ammospawn.zsc | 40 +++++++-------- zscript/items/swwm_baseammo.zsc | 56 +++++---------------- zscript/utility/swwm_utility.zsc | 4 +- 8 files changed, 127 insertions(+), 75 deletions(-) diff --git a/README.md b/README.md index dc704e32d..beb7652ad 100644 --- a/README.md +++ b/README.md @@ -350,16 +350,16 @@ Note that going prone *(crouching)* will automatically disable the recoil compen ### 1.150 XSB Bullets ~ Replaces Cells, Runes ![](docimg/xsbbullet.png) -The 1.150 caliber **eXplosive Super Burst** bullets employ an **Explodium** shaped charge to be shot with enough energy to reach a relatively high velocity, allowing their massive bulk to penetrate several targets including walls. They are hard to come by, so spawns are scarce, and they won't even pop up in **Hammerspace Embiggeners**, and in **Hexen** only on the highest tier **Fabricators**. +The 1.150 caliber **eXplosive Super Burst** bullets employ an **Explodium** shaped charge to be shot with enough energy to reach a relatively high velocity, allowing their massive bulk to penetrate several targets including walls. -In the world, they may pop up as spare bullets or full mags. Each five bullets picked up will be automatically converted to a full mag in your inventory. +In the world, they may pop up as spare bullets or full mags. Each five bullets picked up will be automatically converted to a full mag in your inventory. They are hard to come by as full mags, so expect to be finding singular rounds more often than not. ### 1.150 FCB Bullets ~ Replaces Cells, Runes ![](docimg/fcbbullet.png) The more directly explosive counterpart of the **XSB**. Personally baptized by **Blackmann Arms** CEO **Hermann E. Ischer** himself as ***"Fat Chode Bombs"***, these **High-Explosive Squash Head** rounds will blast through walls on impact, hitting anything standing behind them, and in some cases, tearing down the wall itself too. -Same spawn conditions as the standard bullets. +These are a bit more rare than the standard rounds. You won't even get them from **Embiggeners**. ### Ray-Khom *(slot 8)* ~ Replaces Plasma Rifle, Hellstaff, Arc of Death ![](docimg/raykhom.png) @@ -379,7 +379,7 @@ By the way, those sharp claws aren't just for show, they hurt real bad when you ### Ray-Khom Bolts ~ Replaces Cells, Runes ![](docimg/raybolt.png) -40mm magnetized bolts with a plasma payload. They're basically just grenades, really. +40mm magnetized bolts with a plasma payload. They're basically just grenades, really. Fairly uncommon, but very rewarding to find. ### Candy Gun *(slot 9)* ~ Replaces BFG9000, Firemace, Bloodscourge (stub) ![](docimg/candygun.png) @@ -419,12 +419,12 @@ Don't rely too much on this thing, the ammo tends to be scarce, and it might pot ### Mortal Bullets ~ Replaces Cells, Runes ![](docimg/mrbullet.png) -These 4.44x44.4mm, square-shaped telescoped rounds have a lot of *"fours"* in them for sure. You can find 'em as-is in bundless or rarely in full 12-round mags. +These 4.44x44.4mm, square-shaped telescoped rounds have a lot of *"fours"* in them for sure. You can sometimes find 'em as-is in bundless or very rarely in full 12-round mags. ### Mortal Grenades ~ Replaces Cells, Runes ![](docimg/mrgrenade.png) -44.4mm grenades that burst into target-seeking micro-bombs. That sure is a thing, yes. They're more rare than the standard ammo, however. +44.4mm grenades that burst into target-seeking micro-bombs. That sure is a thing, yes. They're even more rare than the standard ammo, however. ### Ynykron Artifact *(slot 0)* ~ Replaces BFG9000, Firemace, Wraithverge (arc) ![](docimg/ynykron.png) @@ -565,14 +565,14 @@ You're fucking invincible for a total of 20 seconds. ### Hammerspace Embiggener ~ Replaces Backpack, Bag of Holding, Dragonskin Bracers ![](docimg/embiggener.png) -Each of these you pick up increases your ammo capacity *(not necessarily doubling it)*, stacking up to 8 times. They also give you some extra ammo, like a vanilla backpack would *(though not for all weapons)*. +Each of these you pick up increases your ammo capacity *(not necessarily doubling it)*, stacking up to 8 times. They also give you some extra ammo, like a vanilla backpack would *(though not for ALL ammo types)*. In some special cases you may find *"Bulk"* versions. These generally only pop up if the mapper decided to spawn several overlapping backpacks in one spot, as they result from all of those items merging together. ### Universal Ammo Fabricator ~ Replaces Mana / Krater of Might ![](docimg/fabricator.png) -Separated into four tiers, they work pretty much like the ammo cubes in **Doom Tournament**, except they try to *"balance"* the total ammo given. The max tier fabricator is the only one capable of producing ammo for all weapons *(excluding the **Ynykron Artifact**)*. Due to some unspecified reasons, they cannot be held in your inventory, something to do with their nature conflicting with **Hammerspace**. +Separated into four tiers, they work pretty much like the ammo cubes in **Doom Tournament**, except they try to *"balance"* the total ammo given. The max tier fabricator is the only one capable of producing ammo for all weapons, as long as it can be bought at the store *(so this excludes slot 0 weapons, for example)*. Due to some unspecified reasons, they cannot be held in your inventory, something to do with their nature conflicting with **Hammerspace**. ### Lamp ~ Replaces Lite-Amp, Torch ![](docimg/lamp.png) diff --git a/language.version b/language.version index 5ca88c31f..04da6b033 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r459 \cu(Thu 15 Sep 01:59:10 CEST 2022)\c-"; -SWWM_SHORTVER="\cw1.3pre r459 \cu(2022-09-15 01:59:10)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r460 \cu(Thu 15 Sep 13:46:46 CEST 2022)\c-"; +SWWM_SHORTVER="\cw1.3pre r460 \cu(2022-09-15 13:46:46)\c-"; diff --git a/zscript/dlc1/swwm_ammoitems_dlc.zsc b/zscript/dlc1/swwm_ammoitems_dlc.zsc index 06b9d22f0..1fd1d8ec2 100644 --- a/zscript/dlc1/swwm_ammoitems_dlc.zsc +++ b/zscript/dlc1/swwm_ammoitems_dlc.zsc @@ -239,6 +239,7 @@ Class RayBolt : MagAmmo Stamina -8000; MagAmmo.ParentAmmo "RayAmmo"; MagAmmo.ClipSize 10; + MagAmmo.BackpackAmount 2; Inventory.MaxAmount 10; +FLOATBOB; FloatBobStrength 0.25; @@ -299,6 +300,7 @@ Class MisterRound : MagAmmo Stamina -16000; MagAmmo.ParentAmmo "MisterAmmo"; MagAmmo.ClipSize 12; + MagAmmo.BackpackAmount 1; Inventory.MaxAmount 12; +FLOATBOB; FloatBobStrength 0.25; diff --git a/zscript/items/swwm_ammoextra.zsc b/zscript/items/swwm_ammoextra.zsc index ab38662b9..c810e0056 100644 --- a/zscript/items/swwm_ammoextra.zsc +++ b/zscript/items/swwm_ammoextra.zsc @@ -354,6 +354,59 @@ Class HammerspaceEmbiggener : Inventory } } } + // do the same for mag ammo, in a separate loop + for ( int i=0; i)(AllActorClasses[i]); + if ( !type || (type.GetParentClass() != 'MagAmmo') ) continue; + let magitem = MagAmmo(other.FindInventory(type)); + int amount = GetDefaultByType(type).BackpackAmount*self.Amount; + if ( traded ) amount = 0; + if ( amount < 0 ) amount = 0; + int mags = amount/GetDefaultByType(type).ClipSize; + amount = amount%GetDefaultByType(type).ClipSize; + if ( !magitem ) + { + // The player did not have the magitem. Add it. + magitem = MagAmmo(Spawn(type)); + magitem.Amount = amount; + magitem.AttachToOwner(other); + // by this point, we assume that the parent ammo pointer is valid, so... + let ammoitem = magitem.pamo; + // append some mags to it + if ( ammoitem.Amount < ammoitem.MaxAmount ) + { + if ( (ammoitem.Amount > 0) && (ammoitem.Amount+mags < 0) ) + ammoitem.Amount = int.max; + else ammoitem.Amount += mags; + if ( (ammoitem.Amount > ammoitem.MaxAmount) && !sv_unlimited_pickup ) + ammoitem.Amount = ammoitem.MaxAmount; + } + // we can't add extra mags, just max out the spare ammo + else if ( mags > 0 ) magitem.Amount = min(magitem.MaxAmount,magitem.Amount+magitem.ClipSize); + } + else + { + if ( magitem.Amount+amount >= magitem.MaxAmount ) + { + mags++; + amount -= magitem.MaxAmount; + } + magitem.Amount += amount; + let ammoitem = magitem.pamo; + // append some mags to it + if ( ammoitem.Amount < ammoitem.MaxAmount ) + { + if ( (ammoitem.Amount > 0) && (ammoitem.Amount+mags < 0) ) + ammoitem.Amount = int.max; + else ammoitem.Amount += mags; + if ( (ammoitem.Amount > ammoitem.MaxAmount) && !sv_unlimited_pickup ) + ammoitem.Amount = ammoitem.MaxAmount; + } + // we can't add extra mags, just max out the spare ammo + else if ( mags > 0 ) magitem.Amount = min(magitem.MaxAmount,magitem.Amount+magitem.ClipSize); + } + } self.Amount = min(self.Amount,MaxAmount); if ( GetParentClass() == 'HammerspaceEmbiggener' ) { @@ -403,6 +456,31 @@ Class HammerspaceEmbiggener : Inventory if ( (i.Amount > i.MaxAmount) && !sv_unlimited_pickup ) i.Amount = i.MaxAmount; } + if ( traded ) return true; + // give spare mag ammo separately + for ( Inventory i=Owner.Inv; i; i=i.Inv ) + { + if ( !(i is 'MagAmmo') ) continue; + int amount = MagAmmo(i).BackpackAmount*item.Amount; + int mags = amount/MagAmmo(i).ClipSize; + amount = amount%MagAmmo(i).ClipSize; + if ( i.Amount+amount >= MagAmmo(i).ClipSize ) + { + mags++; + amount -= MagAmmo(i).ClipSize; + } + i.Amount += amount; + Ammo a = MagAmmo(i).pamo; + if ( a.Amount < a.MaxAmount ) + { + if ( (a.Amount > 0) && (a.Amount+mags < 0) ) + a.Amount = int.max; + else a.Amount += mags; + if ( (a.Amount > a.MaxAmount) && !sv_unlimited_pickup ) + a.Amount = a.MaxAmount; + } + else if ( mags > 0 ) i.Amount = min(i.MaxAmount,i.Amount+MagAmmo(i).ClipSize); + } return true; } // new ammo suddenly added? upgrade it (this shouldn't happen unless fucky scripting has been involved) diff --git a/zscript/items/swwm_ammoitems.zsc b/zscript/items/swwm_ammoitems.zsc index 10910ae44..729f92595 100644 --- a/zscript/items/swwm_ammoitems.zsc +++ b/zscript/items/swwm_ammoitems.zsc @@ -644,6 +644,7 @@ Class SilverBullets : MagAmmo Stamina -12000; MagAmmo.ParentAmmo "SilverBulletAmmo"; MagAmmo.ClipSize 5; + MagAmmo.BackpackAmount 2; Inventory.MaxAmount 5; +FLOATBOB; FloatBobStrength 0.25; @@ -756,6 +757,7 @@ Class CandyGunBullets : MagAmmo Stamina -14000; MagAmmo.ParentAmmo "CandyGunAmmo"; MagAmmo.ClipSize 7; + MagAmmo.BackpackAmount 1; Inventory.MaxAmount 7; +FLOATBOB; FloatBobStrength 0.25; diff --git a/zscript/items/swwm_ammospawn.zsc b/zscript/items/swwm_ammospawn.zsc index 846457f6e..3347c676d 100644 --- a/zscript/items/swwm_ammospawn.zsc +++ b/zscript/items/swwm_ammospawn.zsc @@ -148,7 +148,7 @@ Class SWWMClipAmmoMed : SWWMAmmoSpawner bex = SWWMUtility.ItemExists('HeavyMahSheenGun',ownedonly:enemydrop); if ( (!aex && bex) || (Random[Replacements](0,1) && bex) ) return 'SheenSmallAmmo'; - return Random[Replacements](0,1)?'EvisceratorShell2':'EvisceratorShell'; + return Random[Replacements](0,2)?'EvisceratorShell':'EvisceratorShell2'; } } Class SWWMClipAmmoBig : SWWMAmmoSpawner @@ -159,7 +159,7 @@ Class SWWMClipAmmoBig : SWWMAmmoSpawner bex = SWWMUtility.ItemExists('HeavyMahSheenGun',ownedonly:enemydrop); if ( (!aex && bex) || (Random[Replacements](0,1) && bex) ) return 'SheenBigAmmo'; - return Random[Replacements](0,1)?'EvisceratorShell2':'EvisceratorShell3'; + return Random[Replacements](0,2)?'EvisceratorShell2':'EvisceratorShell3'; } } Class SWWMBlastAmmoSmall : SWWMAmmoSpawner @@ -181,7 +181,7 @@ Class SWWMBlastAmmoBig : SWWMAmmoSpawner bex = SWWMUtility.ItemExists('HeavyMahSheenGun',ownedonly:enemydrop); if ( (!aex && bex) || (Random[Replacements](0,1) && bex) ) return 'SheenBigAmmo'; - return Random[Replacements](0,2)?'EvisceratorShell3':'EvisceratorShell2'; + return Random[Replacements](0,2)?'EvisceratorShell2':'EvisceratorShell3'; } } Class SWWMRocketAmmoSmall : SWWMAmmoSpawner @@ -201,7 +201,7 @@ Class SWWMRocketAmmoBig : SWWMAmmoSpawner 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,4)?'QuadravolAmmo2':'QuadravolAmmo3'; + return Random[Replacements](0,3)?'QuadravolAmmo2':'QuadravolAmmo3'; switch ( Random[Replacements](0,11) ) { case 0: @@ -209,12 +209,12 @@ Class SWWMRocketAmmoBig : SWWMAmmoSpawner case 2: case 3: case 4: - return Random[Replacements](0,4)?'HellblazerMissiles':'HellblazerMissiles2'; + return Random[Replacements](0,3)?'HellblazerMissiles':'HellblazerMissiles2'; case 5: case 6: case 7: case 8: - return Random[Replacements](0,7)?'HellblazerCrackshots':'HellblazerCrackshots2'; + return Random[Replacements](0,5)?'HellblazerCrackshots':'HellblazerCrackshots2'; case 9: case 10: return 'HellblazerRavagers'; @@ -229,13 +229,13 @@ Class SWWMCellAmmoSmall : SWWMAmmoSpawner { if ( !Random[Replacements](0,2) ) { - if ( !Random[Replacements](0,3) ) - { - 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)?'MisterRound':'MisterRound2'; - if ( aex ) return 'CandyGunBullets'; - } + 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)?'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'; @@ -258,6 +258,13 @@ Class SWWMCellAmmoBig : SWWMAmmoSpawner 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)?'MisterGAmmo2':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), @@ -269,13 +276,6 @@ Class SWWMCellAmmoBig : SWWMAmmoSpawner return Random[Replacements](0,2)?'SilverBulletAmmo':'SilverBulletAmmo2'; } } - 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)?'MisterGAmmo2':Random[Replacements](0,2)?'MisterRound5':'MisterAmmo'; - if ( aex ) return Random[Replacements](0,3)?'CandyGunBullets3':'CandyGunAmmo'; - } bool aex = SWWMUtility.ItemExists('Sparkster',ownedonly:enemydrop), bex = SWWMUtility.ItemExists('ModernSparkster',ownedonly:enemydrop); if ( (!aex && bex) || (Random[Replacements](0,1) && bex) ) diff --git a/zscript/items/swwm_baseammo.zsc b/zscript/items/swwm_baseammo.zsc index fc30e8868..9eabf11b4 100644 --- a/zscript/items/swwm_baseammo.zsc +++ b/zscript/items/swwm_baseammo.zsc @@ -236,30 +236,6 @@ Class SWWMAmmo : Ammo return Super.HandlePickup(item); } - override bool CanPickup( Actor toucher ) - { - // don't allow picking up ammo for weapons we can't pick up - if ( !Super.CanPickup(toucher) ) return false; - for ( int i=0; i)(AllActorClasses[i]); - if ( !w ) continue; - if ( w is 'SWWMWeapon' ) - { - let def = GetDefaultByType((Class)(w)); - if ( !def.UsesAmmo(GetClass()) ) continue; - if ( !def.CanPickup(toucher) ) return false; - } - else - { - let def = GetDefaultByType(w); - if ( (def.AmmoType1 != GetClass()) && (def.AmmoType2 != GetClass()) ) continue; - if ( !def.CanPickup(toucher) ) return false; - } - } - return true; - } - override void AttachToOwner( Actor other ) { Super.AttachToOwner(other); @@ -310,6 +286,7 @@ Class MagAmmo : Inventory abstract Property ParentAmmo : ParentAmmo; Property ClipSize : ClipSize; Property PickupTag : PickupTag; + Property BackpackAmount : BackpackAmount; default { @@ -378,17 +355,6 @@ Class MagAmmo : Inventory abstract // drop excess mag ammo if ( (item is 'MagAmmo') && (MagAmmo(item).GetParentMagAmmo() == GetClass()) ) { - // can somehow happen - if ( !pamo ) - { - pamo = Ammo(Owner.FindInventory(ParentAmmo)); - if ( !pamo ) - { - pamo = Ammo(Spawn(ParentAmmo)); - pamo.AttachToOwner(Owner); - pamo.Amount = 0; - } - } if ( bUNDROPPABLE || bUNTOSSABLE ) { // undroppable mag ammo only drops full mags. @@ -503,14 +469,6 @@ Class MagAmmo : Inventory abstract return copy; } - override bool CanPickup( Actor toucher ) - { - // don't allow picking up ammo for weapons we can't pick up - if ( !Super.CanPickup(toucher) ) return false; - let def = GetDefaultByType(ParentAmmo); - return def.CanPickup(toucher); - } - private Inventory DoDrop( Class type ) { let copy = Inventory(Spawn(type,Owner.Pos,NO_REPLACE)); @@ -564,6 +522,18 @@ Class MagAmmo : Inventory abstract MagFill(); } + override void AttachToOwner( Actor other ) + { + Super.AttachToOwner(other); + pamo = Ammo(other.FindInventory(ParentAmmo)); + if ( !pamo ) + { + pamo = Ammo(Spawn(ParentAmmo)); + pamo.AttachToOwner(other); + pamo.Amount = 0; + } + } + bool MagFill() { // double-check that parent ammo exists diff --git a/zscript/utility/swwm_utility.zsc b/zscript/utility/swwm_utility.zsc index a29d3149f..42f680527 100644 --- a/zscript/utility/swwm_utility.zsc +++ b/zscript/utility/swwm_utility.zsc @@ -2236,8 +2236,8 @@ Class SWWMUtility // first bfg spawn static Class PickSWWMSlot9() { - // 33% chance to still drop another candy gun if it's not at max capacity - if ( !Random[Replacements](0,2) && ItemExists('CandyGun') && CheckNeedsItem('CandyGunSpares',true) ) + // 25% chance to still drop another candy gun if it's not at max capacity + if ( !Random[Replacements](0,3) && ItemExists('CandyGun') && CheckNeedsItem('CandyGunSpares',true) ) return 'CandyGun'; return PickPair('CandyGun','MisterRifle'); }