From 887b3348c0b4b4e6fe176e98596b1803e752fa1b Mon Sep 17 00:00:00 2001 From: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com> Date: Thu, 5 Feb 2026 19:25:04 -0500 Subject: [PATCH] Adds IK-134 laser gatling gun (#31483) * Adds IK-134 laser gatling gun * Attack chain * Fixes spread * Linter * Apply suggestions from code review Co-authored-by: JimKil3 <47290811+JimKil3@users.noreply.github.com> Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com> * Update code/modules/projectiles/guns/energy/laser_gatling.dm Co-authored-by: JimKil3 <47290811+JimKil3@users.noreply.github.com> Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com> --------- Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com> Co-authored-by: JimKil3 <47290811+JimKil3@users.noreply.github.com> --- code/datums/components/fullauto.dm | 2 +- .../projectiles/ammunition/energy_lens.dm | 6 + .../projectiles/guns/energy/laser_gatling.dm | 149 ++++++++++++++++++ code/modules/projectiles/projectile/beams.dm | 4 + icons/obj/guns/minigun.dmi | Bin 0 -> 753 bytes paradise.dme | 1 + 6 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 code/modules/projectiles/guns/energy/laser_gatling.dm create mode 100644 icons/obj/guns/minigun.dmi diff --git a/code/datums/components/fullauto.dm b/code/datums/components/fullauto.dm index 59a6dd13437..e8648fed766 100644 --- a/code/datums/components/fullauto.dm +++ b/code/datums/components/fullauto.dm @@ -258,7 +258,7 @@ var/next_delay = autofire_shot_delay if(windup_autofire) next_delay = clamp(next_delay - current_windup_reduction, round(autofire_shot_delay * windup_autofire_cap), autofire_shot_delay) - current_windup_reduction = (current_windup_reduction + round(autofire_shot_delay * windup_autofire_reduction_multiplier)) + current_windup_reduction = (current_windup_reduction + round(autofire_shot_delay * windup_autofire_reduction_multiplier, 0.01)) timerid = addtimer(CALLBACK(src, PROC_REF(windup_reset), FALSE), windup_spindown, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) if(shooter.next_move_modifier != 1) //DNA vault, mephemdrone, bluespace slowness debuff. diff --git a/code/modules/projectiles/ammunition/energy_lens.dm b/code/modules/projectiles/ammunition/energy_lens.dm index 133c87b2fbc..1f824564b5f 100644 --- a/code/modules/projectiles/ammunition/energy_lens.dm +++ b/code/modules/projectiles/ammunition/energy_lens.dm @@ -53,6 +53,12 @@ /obj/item/ammo_casing/energy/laser/eshotgun/cyborg e_cost = 500 +/obj/item/ammo_casing/energy/laser/minigun + projectile_type = /obj/projectile/beam/laser/minigun + click_cooldown_override = 2 + variance = 20 + randomspread = 1 + /obj/item/ammo_casing/energy/laser/heavy projectile_type = /obj/projectile/beam/laser/heavylaser select_name = "anti-vehicle" diff --git a/code/modules/projectiles/guns/energy/laser_gatling.dm b/code/modules/projectiles/guns/energy/laser_gatling.dm new file mode 100644 index 00000000000..c3b3dd8ae49 --- /dev/null +++ b/code/modules/projectiles/guns/energy/laser_gatling.dm @@ -0,0 +1,149 @@ +// The ammo/gun is stored in a back slot item +/obj/item/minigunpack + name = "IK-134 backpack power supply" + desc = "An IK-134 gatling gun's massive external power source." + icon = 'icons/obj/guns/minigun.dmi' + icon_state = "holstered" + inhand_icon_state = "satchel-sec" + lefthand_file = 'icons/mob/inhands/clothing_lefthand.dmi' + righthand_file = 'icons/mob/inhands/clothing_righthand.dmi' + slot_flags = ITEM_SLOT_BACK + w_class = WEIGHT_CLASS_HUGE + /// The stored gun + var/obj/item/gun/energy/gun/minigun/gun + /// whether the gun is attached, FALSE is attached, TRUE is the gun is wielded. + var/armed = FALSE + +/obj/item/minigunpack/Initialize(mapload) + . = ..() + gun = new(src) + START_PROCESSING(SSobj, src) + +/obj/item/minigunpack/Destroy() + if(!QDELETED(gun)) + qdel(gun) + gun = null + STOP_PROCESSING(SSobj, src) + return ..() + +/// ATTACK HAND IGNORING PARENT RETURN VALUE +/obj/item/minigunpack/attack_hand(mob/living/carbon/user, list/modifiers) + if(src.loc != user) + return ..() + if(armed) + to_chat(user, SPAN_WARNING("You are already holding the gun!")) + return + if(user.get_item_by_slot(ITEM_SLOT_BACK) == src) + armed = TRUE + if(!user.put_in_hands(gun)) + armed = FALSE + to_chat(user, SPAN_WARNING("You need a free hand to hold the gun!")) + return + update_icon(UPDATE_ICON_STATE) + +/obj/item/minigunpack/MouseDrop(atom/over_object, src_location, over_location, src_control, over_control, params) + if(armed) + return + if(!iscarbon(usr)) + return + var/mob/living/carbon/M = usr + if(!M.restrained() && !M.stat) + switch(over_object.name) + if("r_hand") + if(!M.has_right_hand() || !M.unequip(src)) + return + M.put_in_r_hand(src) + if("l_hand") + if(!M.has_left_hand() || !M.unequip(src)) + return + M.put_in_l_hand(src) + add_fingerprint(usr) + return + +/obj/item/minigunpack/equipped(mob/user, slot, initial) + . = ..() + if(slot == ITEM_SLOT_BACK) + RegisterSignal(user, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, PROC_REF(on_borg_charge)) + +/obj/item/minigunpack/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) + . = ..() + // Don't need armed check, because if you have the gun assume its armed. + if(I == gun) + user.drop_item_to_ground(gun, force = TRUE) + else + ..() + +/obj/item/minigunpack/dropped(mob/user) + . = ..() + UnregisterSignal(user, COMSIG_PROCESS_BORGCHARGER_OCCUPANT) + if(armed) + user.drop_item_to_ground(gun, force = TRUE) + +/obj/item/minigunpack/update_icon_state() + icon_state = armed ? "notholstered" : "holstered" + return ..() + +/obj/item/minigunpack/proc/on_borg_charge(datum/source, amount) + SIGNAL_HANDLER + + gun.cell.give(amount) + +/obj/item/minigunpack/proc/attach_gun(mob/user) + if(!gun) + gun = new(src) + gun.forceMove(src) + armed = FALSE + if(user) + to_chat(user, SPAN_NOTICE("You attach \the [gun] to \the [src].")) + else + src.visible_message(SPAN_WARNING("\The [gun] snaps back onto \the [src]!")) + update_icon(UPDATE_ICON_STATE) + +/obj/item/gun/energy/gun/minigun + name = "IK-134 gatling gun" + desc = "An advanced laser cannon with an incredible rate of fire. Requires a bulky backpack power source to use." + icon = 'icons/obj/guns/minigun.dmi' + icon_state = "minigun_spin" + inhand_icon_state = "minigun" + slowdown = 1.5 + slot_flags = null + w_class = WEIGHT_CLASS_HUGE + weapon_weight = WEAPON_HEAVY + ammo_type = list(/obj/item/ammo_casing/energy/laser/minigun) + cell_type = /obj/item/stock_parts/cell/minigun + can_charge = FALSE + selfcharge = TRUE + charge_delay = 1 + can_fit_in_turrets = FALSE + shaded_charge = FALSE + /// Associated ammo pack + var/obj/item/minigunpack/ammo_pack + +/obj/item/gun/energy/gun/minigun/Initialize(mapload) + . = ..() + if(!istype(loc, /obj/item/minigunpack)) // We should spawn inside an ammo pack so let's use that one. + return INITIALIZE_HINT_QDEL // No pack, no gun + ammo_pack = loc + AddComponent(/datum/component/automatic_fire, 0.1 SECONDS, allow_akimbo = FALSE) + +/obj/item/gun/energy/gun/minigun/Destroy() + if(!QDELETED(ammo_pack)) + qdel(ammo_pack) + ammo_pack = null + return ..() + +/obj/item/gun/energy/gun/minigun/attack_self__legacy__attackchain(mob/living/user) + return + +/obj/item/gun/energy/gun/minigun/dropped(mob/user) + SHOULD_CALL_PARENT(FALSE) + if(ammo_pack) + ammo_pack.attach_gun(user) + else + qdel(src) + +/obj/item/stock_parts/cell/minigun + name = "gatling gun fusion core" + desc = "Where did these come from?" + charge = 15000 + maxcharge = 15000 diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 776918cb6f9..2b0c30417e7 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -28,6 +28,10 @@ do_sparks(1, 1, src) ..() +/obj/projectile/beam/laser/minigun + damage = 15 + armor_penetration_percentage = 50 + /obj/projectile/beam/laser/heavylaser name = "heavy laser" icon_state = "heavylaser" diff --git a/icons/obj/guns/minigun.dmi b/icons/obj/guns/minigun.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c0d84547dcedecf84fbc32bbc54601c4e5d90544 GIT binary patch literal 753 zcmVQq*Oxs20004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRL zOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5DK|4OGrcq~zPKPWPl<~&C9|j)C~U~ZnO2mT zn+jr^07X-C5-WjB13g0>B#ba6BR{9OB(*3t1-lVQD)aJ72r5=qaP@Nm`vw32iaeg` z45bSI00G%aL_t(YiS1Q8Qo}G1T{J#G;uu#HvSLzE5S&R0C}dlh8cskGk4;aJf}VmS zP-lkW3~4Ai7OU9!Cz~i8naS&(cK7YBH1h;-#Nnck(B~A$6=OrH%gF=?5<)dOklRMW z4i1C^F@ZT$lf#G;#+bIY&j`%mQ`*v@i{FCd| z%lHq0=6`?%o6We!D*{dbmoQP$>{Sa&0mc7ie35#y#k^fW@qbys($#9=vVPK^?}P`G