From 30e1a5d04f90f7b3cfd10978d60fa9f0df9ac44b Mon Sep 17 00:00:00 2001
From: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
Date: Sun, 18 May 2025 22:24:06 -0400
Subject: [PATCH] Adds lens functionality to turrets (#29039)
---
code/game/machinery/portable_turret.dm | 45 ++++++++++++++++++++++++--
1 file changed, 43 insertions(+), 2 deletions(-)
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index eb0174856f1..9ec152fc20b 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -73,6 +73,8 @@
var/initial_eprojectile = null
/// What non-lethal mode projectile with the turret start with?
var/initial_projectile = null
+ /// What lens is fitted to the turret/gun?
+ var/obj/item/smithed_item/lens/fitted_lens
/obj/machinery/porta_turret/Initialize(mapload)
@@ -381,6 +383,10 @@ GLOBAL_LIST_EMPTY(turret_icons)
if(installation)
var/obj/item/gun/energy/Gun = new installation(loc)
Gun.cell.charge = gun_charge
+ if(fitted_lens)
+ Gun.current_lens = fitted_lens
+ fitted_lens.forceMove(Gun)
+ Gun.current_lens.on_attached(Gun)
Gun.update_icon()
if(prob(50))
new /obj/item/stack/sheet/metal(loc, rand(1,4))
@@ -390,6 +396,18 @@ GLOBAL_LIST_EMPTY(turret_icons)
to_chat(user, "You remove the turret but did not manage to salvage anything.")
qdel(src) // qdel
+/obj/machinery/porta_turret/screwdriver_act(mob/living/user, obj/item/I)
+ if(user.a_intent != INTENT_HELP)
+ return FALSE
+
+ if(!fitted_lens)
+ to_chat(user, "[src] has no attached lenses.")
+ return
+ to_chat(user, "You remove the lens from [src]")
+ user.put_in_hands(fitted_lens)
+ fitted_lens = null
+ return TRUE
+
/obj/machinery/porta_turret/item_interaction(mob/living/user, obj/item/used, list/modifiers)
if((stat & BROKEN) && !syndicate)
return ITEM_INTERACT_COMPLETE
@@ -406,6 +424,17 @@ GLOBAL_LIST_EMPTY(turret_icons)
return ITEM_INTERACT_COMPLETE
+ if(istype(used, /obj/item/smithed_item/lens))
+ if(used.flags & NODROP || !user.drop_item() || !used.forceMove(src))
+ to_chat(user, "[used] is stuck to your hand!")
+ return ITEM_INTERACT_COMPLETE
+ var/obj/item/smithed_item/lens/new_lens = used
+ if(fitted_lens)
+ to_chat(user, "You swap the fitted lens in [src].")
+ user.put_in_hands(fitted_lens)
+ fitted_lens = new_lens
+ return ITEM_INTERACT_COMPLETE
+
if(user.a_intent == INTENT_HELP)
return ..()
@@ -759,7 +788,7 @@ GLOBAL_LIST_EMPTY(turret_icons)
return
if(!emagged) //if it hasn't been emagged, cooldown before shooting again
- if((last_fired + shot_delay > world.time) || !raised)
+ if((last_fired + (shot_delay / fitted_lens.fire_rate_mult) > world.time) || !raised)
return
last_fired = world.time
@@ -779,9 +808,16 @@ GLOBAL_LIST_EMPTY(turret_icons)
A = new projectile(loc)
playsound(loc, shot_sound, 75, 1)
+ var/lens_power_mult = 1
+ if(fitted_lens)
+ A.damage = A.damage * fitted_lens.damage_mult
+ A.stamina = A.damage * fitted_lens.damage_mult
+ A.speed = A.speed / fitted_lens.laser_speed_mult
+ lens_power_mult = fitted_lens.power_mult
+
// Lethal/emagged turrets use twice the power due to higher energy beams
// Emagged turrets again use twice as much power due to higher firing rates
- use_power(reqpower * (2 * (emagged || lethal)) * (2 * emagged))
+ use_power(lens_power_mult * (reqpower * (2 * (emagged || lethal)) * (2 * emagged)))
if(istype(A))
A.original = target
@@ -868,6 +904,8 @@ GLOBAL_LIST_EMPTY(turret_icons)
var/finish_name="turret" //the name applied to the product turret
var/installation = null //the gun type installed
var/gun_charge = 0 //the gun charge of the gun type installed
+ /// The lens attached to the gun used
+ var/obj/item/smithed_item/lens/gun_lens
/obj/machinery/porta_turret_construct/item_interaction(mob/living/user, obj/item/used, list/modifiers)
//this is a bit unwieldy but self-explanatory
@@ -925,6 +963,7 @@ GLOBAL_LIST_EMPTY(turret_icons)
return ITEM_INTERACT_COMPLETE
installation = used.type //installation becomes used.type
gun_charge = E.cell.charge //the gun's charge is stored in gun_charge
+ gun_lens = E.current_lens
to_chat(user, "You add [used] to the turret.")
if(istype(E, /obj/item/gun/energy/laser/tag/blue))
@@ -1018,6 +1057,8 @@ GLOBAL_LIST_EMPTY(turret_icons)
Turret.name = finish_name
Turret.installation = installation
Turret.gun_charge = gun_charge
+ gun_lens.forceMove(Turret)
+ Turret.fitted_lens = gun_lens
Turret.enabled = FALSE
Turret.setup()