From 9bf319e34bded0a26845f2b9462d132d07d69de8 Mon Sep 17 00:00:00 2001 From: UndeadZeratul Date: Sat, 6 Jun 2026 20:42:24 -0500 Subject: [PATCH] Add Randomized Weapon/Ammo upon Marine Recruitment --- zscript/FollowerWeapon.zsc | 1 + zscript/Recruitment.zsc | 36 ++++++++++++++++++++++++++---- zscript/Weapons/Boss.zsc | 9 ++++++++ zscript/Weapons/Brontornis.zsc | 5 +++++ zscript/Weapons/Hunter.zsc | 18 +++++++++++++++ zscript/Weapons/Liberator.zsc | 13 +++++++++++ zscript/Weapons/RocketLauncher.zsc | 8 +++++++ zscript/Weapons/SMG.zsc | 9 ++++++++ zscript/Weapons/ZM66.zsc | 9 ++++++++ 9 files changed, 104 insertions(+), 4 deletions(-) diff --git a/zscript/FollowerWeapon.zsc b/zscript/FollowerWeapon.zsc index c6faa36..f4d7a2f 100644 --- a/zscript/FollowerWeapon.zsc +++ b/zscript/FollowerWeapon.zsc @@ -99,6 +99,7 @@ class FollowerWeapon abstract // So if it starts at 0 and you want to reset the loop, set it internally to -1 to compensate. abstract play FireSequenceResult DoFiringSequence(out int ticker, Actor trgt); abstract play bool DoReloadSequence(out int ticker); + abstract play void OnRecruit(); abstract play void OnTransfer(HDWeapon wpn); abstract play void OnBackTransfer(HDWeapon wpn); diff --git a/zscript/Recruitment.zsc b/zscript/Recruitment.zsc index 41bbc6c..5e1cd79 100644 --- a/zscript/Recruitment.zsc +++ b/zscript/Recruitment.zsc @@ -99,19 +99,47 @@ extend class FollowerHandler recruit.Translation = m.Translation; recruit.voicepitch = m.voicepitch; + FollowerWeapon fw; + switch (m.wep) { case HDOperator.HDMW_SMG: - case -HDOperator.HDMW_SMG: FollowerWeapon.CreateAndAdd('FW_SMG', recruit); break; + case -HDOperator.HDMW_SMG: fw = FollowerWeapon.CreateAndAdd('FW_SMG', recruit); break; case HDOperator.HDMW_HUNTER: - case -HDOperator.HDMW_HUNTER: FollowerWeapon.CreateAndAdd('FW_Hunter', recruit); break; + case -HDOperator.HDMW_HUNTER: fw = FollowerWeapon.CreateAndAdd('FW_Hunter', recruit); break; case HDOperator.HDMW_ZM66: - case -HDOperator.HDMW_ZM66: FollowerWeapon.CreateAndAdd('FW_ZM66', recruit); break; + case -HDOperator.HDMW_ZM66: fw = FollowerWeapon.CreateAndAdd('FW_ZM66', recruit); break; case HDOperator.HDMW_ROCKET: - case -HDOperator.HDMW_ROCKET: FollowerWeapon.CreateAndAdd('FW_RocketLauncher', recruit); break; + case -HDOperator.HDMW_ROCKET: fw = FollowerWeapon.CreateAndAdd('FW_RocketLauncher', recruit); break; + } + + if (fw) { + fw.OnRecruit(); + + class fwAmmo; + class fwMag; + int fwAmt; + + [fwAmmo, fwMag, fwAmt] = fw.GetAmmoType(); + + let numMags = random(0, 5); + let numAmmo = random(0, fwAmt * numMags); + if (fwMag) { + for (let i = 0; i < numMags; i++) { + let spawned = HDMagAmmo(Actor.Spawn(fwMag, recruit.pos)); + spawned.SyncAmount(); + + if (!recruit.AddMag(spawned, flags: HDFollower.FIF_FORCE)) spawned.destroy(); + } + } else if (fwAmmo) { + for (let i = 0; i < numAmmo; i++) { + let spawned = HDAmmo(Actor.Spawn(fwAmmo, recruit.pos)); + if (!recruit.AddItem(spawned, flags: HDFollower.FIF_FORCE)) spawned.destroy(); + } + } } let Armor = HDArmourWorn(m.FindInventory('HDArmourWorn')); diff --git a/zscript/Weapons/Boss.zsc b/zscript/Weapons/Boss.zsc index a19f56f..369e47e 100644 --- a/zscript/Weapons/Boss.zsc +++ b/zscript/Weapons/Boss.zsc @@ -224,6 +224,15 @@ class FW_Boss : FollowerWeapon Mag = 0; } + override void OnRecruit() + { + Mag = random(0, 10); + ChamberedRound = random(0, 2); + + frontreticle = random(0, 2); + customchamb = !random(0, 3); + } + override void OnTransfer(HDWeapon wpn) { Mag = wpn.WeaponStatus[BOSSS_MAG]; diff --git a/zscript/Weapons/Brontornis.zsc b/zscript/Weapons/Brontornis.zsc index a349fb7..14dbce0 100644 --- a/zscript/Weapons/Brontornis.zsc +++ b/zscript/Weapons/Brontornis.zsc @@ -87,6 +87,11 @@ class FW_Bronto : FollowerWeapon return ChamberedRound == CRType_Chambered ? RResult_MagFull : Super.TryReload(flags); } + override void OnRecruit() + { + ChamberedRound = random(0, 2); + } + override void OnTransfer(HDWeapon wpn) { ChamberedRound = wpn.WeaponStatus[BRONS_CHAMBER]; diff --git a/zscript/Weapons/Hunter.zsc b/zscript/Weapons/Hunter.zsc index 383b1de..7eb7d41 100644 --- a/zscript/Weapons/Hunter.zsc +++ b/zscript/Weapons/Hunter.zsc @@ -162,6 +162,24 @@ class FW_Hunter : FollowerWeapon return WPriority_VeryHigh; } + override void OnRecruit() + { + if (!random(0, 7)) choke = random(0, 7); + + if (!random(0, 32)) { + semi = 0; + fullauto = 1; + } else if (!random(0, 7)) { + semi = 1; + fullauto = 0; + } + + int tubesize = semi ? 5 : 7; + + Mag = random(0, tubesize); + ChamberedRound = random(0, 2); + } + override void OnTransfer(HDWeapon wpn) { Mag = wpn.WeaponStatus[HUNTS_TUBE]; diff --git a/zscript/Weapons/Liberator.zsc b/zscript/Weapons/Liberator.zsc index 9925111..4964648 100644 --- a/zscript/Weapons/Liberator.zsc +++ b/zscript/Weapons/Liberator.zsc @@ -103,6 +103,19 @@ class FW_Liberator : FollowerWeapon return WPriority_Medium; } + override void OnRecruit() + { + Mag = random(0, 30); + ChamberedRound = random(0, 2); + + nogl = !random(0, 2); + nobull = !random(0, 3); + noauto = !random(0, 5); + lefty = !random(0, 5); + altreticle = !random(0, 2); + frontreticle = !random(0, 2); + } + override void OnTransfer(HDWeapon wpn) { Mag = wpn.WeaponStatus[LIBS_MAG]; diff --git a/zscript/Weapons/RocketLauncher.zsc b/zscript/Weapons/RocketLauncher.zsc index 0313818..7d519bb 100644 --- a/zscript/Weapons/RocketLauncher.zsc +++ b/zscript/Weapons/RocketLauncher.zsc @@ -128,6 +128,14 @@ class FW_RocketLauncher : FollowerWeapon return otherFollowersSafe && otherPlayersSafe; } + override void OnRecruit() + { + Mag = random(0, 5); + ChamberedRound = random(0, 2); + + nomag = random(0, 3); + } + override void OnTransfer(HDWeapon wpn) { Mag = wpn.WeaponStatus[RLS_MAG]; diff --git a/zscript/Weapons/SMG.zsc b/zscript/Weapons/SMG.zsc index 47bec77..7de0b8f 100644 --- a/zscript/Weapons/SMG.zsc +++ b/zscript/Weapons/SMG.zsc @@ -83,6 +83,15 @@ class FW_SMG : FollowerWeapon return WPriority_Lowest; } + override void OnRecruit() + { + Mag = random(0,30); + ChamberedRound = random(0,2); + + fireswitch = random(0, 3); + reflexsight = !random(0,2); + } + override void OnTransfer(HDWeapon wpn) { Mag = wpn.WeaponStatus[SMGS_MAG]; diff --git a/zscript/Weapons/ZM66.zsc b/zscript/Weapons/ZM66.zsc index 5941c03..86d0258 100644 --- a/zscript/Weapons/ZM66.zsc +++ b/zscript/Weapons/ZM66.zsc @@ -108,6 +108,15 @@ class FW_ZM66 : FollowerWeapon return WPriority_High; } + override void OnRecruit() + { + Mag = random(0, 51); + ChamberedRound = random(0, 2); + + nogl = !random(0, 2); + noauto = !random(0, 3); + } + override void OnTransfer(HDWeapon wpn) { Mag = wpn.WeaponStatus[ZM66S_MAG];