From 5535d7e2ee7b4a5294357f45a91129f1e59dd9db Mon Sep 17 00:00:00 2001 From: DeltaFire <46569814+DeltaFire15@users.noreply.github.com> Date: Thu, 30 Jan 2025 14:01:20 +0100 Subject: [PATCH] Munitions Pinpointers (#2738) --- nsv13.dme | 1 + .../game/objects/items/nsv_circuitboards.dm | 40 ++++++++++ .../game/objects/structures/custom_closets.dm | 1 + nsv13/code/modules/cargo/packs.dm | 12 +++ .../munitions/ammunition/gauss_ammo.dm | 5 ++ nsv13/code/modules/munitions/muni_pointer.dm | 73 ++++++++++++++++++ .../ballistic_weapons/broadsides.dm | 5 ++ .../ship_weapons/ship_weapon_parts.dm | 17 ++-- nsv13/icons/obj/device.dmi | Bin 912 -> 2043 bytes 9 files changed, 149 insertions(+), 5 deletions(-) create mode 100644 nsv13/code/modules/munitions/muni_pointer.dm diff --git a/nsv13.dme b/nsv13.dme index da4b47161e6..a682c1bb318 100644 --- a/nsv13.dme +++ b/nsv13.dme @@ -3963,6 +3963,7 @@ #include "nsv13\code\modules\mob\living\simple_animal\bot\secbot.dm" #include "nsv13\code\modules\mob\living\simple_animal\hostile\dioclown.dm" #include "nsv13\code\modules\modular_computer\wiki_uplink.dm" +#include "nsv13\code\modules\munitions\muni_pointer.dm" #include "nsv13\code\modules\munitions\munitions_trolley.dm" #include "nsv13\code\modules\munitions\ammunition\broadside_ammo.dm" #include "nsv13\code\modules\munitions\ammunition\cannon_ammo.dm" diff --git a/nsv13/code/game/objects/items/nsv_circuitboards.dm b/nsv13/code/game/objects/items/nsv_circuitboards.dm index 65d59ef91c6..699cdea80b0 100644 --- a/nsv13/code/game/objects/items/nsv_circuitboards.dm +++ b/nsv13/code/game/objects/items/nsv_circuitboards.dm @@ -71,9 +71,14 @@ build_path = /obj/machinery/computer/ams resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF +/obj/item/circuitboard/computer/ams/Initialize(mapload) + . = ..() + GLOB.critical_muni_items += src + /obj/item/circuitboard/computer/ams/Destroy(force=FALSE) if(!force) return QDEL_HINT_LETMELIVE + GLOB.critical_muni_items -= src return ..() /obj/item/circuitboard/computer/anti_air @@ -81,9 +86,14 @@ build_path = /obj/machinery/computer/anti_air resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF +/obj/item/circuitboard/computer/anti_air/Initialize(mapload) + . = ..() + GLOB.critical_muni_items += src + /obj/item/circuitboard/computer/anti_air/Destroy(force=FALSE) if(!force) return QDEL_HINT_LETMELIVE + GLOB.critical_muni_items -= src return ..() /obj/item/circuitboard/computer/ship/fighter_controller @@ -108,9 +118,14 @@ build_path = /obj/machinery/ship_weapon/anti_air resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF +/obj/item/circuitboard/machine/anti_air/Initialize(mapload) + . = ..() + GLOB.critical_muni_items += src + /obj/item/circuitboard/machine/anti_air/Destroy(force=FALSE) if(!force) return QDEL_HINT_LETMELIVE + GLOB.critical_muni_items -= src return ..() /obj/item/circuitboard/machine/anti_air/heavy @@ -150,9 +165,14 @@ build_path = PATH_FLAK */ +/obj/item/circuitboard/machine/pdc_mount/Initialize(mapload) + . = ..() + GLOB.critical_muni_items += src + /obj/item/circuitboard/machine/pdc_mount/Destroy(force=FALSE) if(!force) return QDEL_HINT_LETMELIVE + GLOB.critical_muni_items -= src return ..() /* Flak isn't used right now @@ -191,9 +211,14 @@ /obj/item/circuitboard/machine/deck_turret/apply_default_parts() //dont +/obj/item/circuitboard/machine/deck_turret/Initialize(mapload) + . = ..() + GLOB.critical_muni_items += src + /obj/item/circuitboard/machine/deck_turret/Destroy(force=FALSE) if(!force) return QDEL_HINT_LETMELIVE + GLOB.critical_muni_items -= src return ..() /obj/item/circuitboard/computer/deckgun @@ -297,9 +322,14 @@ /obj/item/stack/cable_coil = 10) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF +/obj/item/circuitboard/machine/vls/Initialize(mapload) + . = ..() + GLOB.critical_muni_items += src + /obj/item/circuitboard/machine/vls/Destroy(force=FALSE) if(!force) return QDEL_HINT_LETMELIVE + GLOB.critical_muni_items -= src return ..() //Gauss guns @@ -309,9 +339,14 @@ req_components = list() resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF +/obj/item/circuitboard/machine/gauss_turret/Initialize(mapload) + . = ..() + GLOB.critical_muni_items += src + /obj/item/circuitboard/machine/gauss_turret/Destroy(force=FALSE) if(!force) return QDEL_HINT_LETMELIVE + GLOB.critical_muni_items -= src return ..() /obj/item/circuitboard/computer/iff @@ -384,9 +419,14 @@ build_path = /obj/machinery/computer/laser_pd resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF +/obj/item/circuitboard/computer/laser_pd/Initialize(mapload) + . = ..() + GLOB.critical_muni_items += src + /obj/item/circuitboard/computer/laser_pd/Destroy(force=FALSE) if(!force) return QDEL_HINT_LETMELIVE + GLOB.critical_muni_items -= src return ..() // Laser PD diff --git a/nsv13/code/game/objects/structures/custom_closets.dm b/nsv13/code/game/objects/structures/custom_closets.dm index dac7189462f..b41586b473f 100644 --- a/nsv13/code/game/objects/structures/custom_closets.dm +++ b/nsv13/code/game/objects/structures/custom_closets.dm @@ -23,6 +23,7 @@ new /obj/item/encryptionkey/atc(src) new /obj/item/circuitboard/machine/techfab/department/munitions(src) new /obj/item/stamp/maa(src) + new /obj/item/pinpointer/munitions(src) /obj/structure/closet/secure_closet/munitions_technician name = "munitions technician's locker" diff --git a/nsv13/code/modules/cargo/packs.dm b/nsv13/code/modules/cargo/packs.dm index 5adf8681e81..c951e0f6e11 100644 --- a/nsv13/code/modules/cargo/packs.dm +++ b/nsv13/code/modules/cargo/packs.dm @@ -53,6 +53,18 @@ crate_type = /obj/structure/closet/crate/wooden crate_name = "Captain Plasmasalt's finest gunpowder" +/datum/supply_pack/munitions/muni_pointer + name = "Munitions Pinpointer" + desc = "Clown spaced your turrets? MAA slipped and threw their pointer into the recycler? This is the solution to your problems!" + cost = 5000 //Don't lose yours, MAA. + contains = list(/obj/item/pinpointer/munitions) + +/datum/supply_pack/munitions/muni_pointer/fill(obj/structure/closet/crate/C) + if(prob(1)) + new /obj/item/pinpointer/munitions/not_puce(C) + else + new /obj/item/pinpointer/munitions(C) + /datum/supply_pack/munitions/pdc_ammo name = "PDC mount rounds (x5)" desc = "5 boxes of PDC rounds, ideal for repelling torpedoes and missiles." diff --git a/nsv13/code/modules/munitions/ammunition/gauss_ammo.dm b/nsv13/code/modules/munitions/ammunition/gauss_ammo.dm index 0fb7aabbe20..47ffda245ce 100644 --- a/nsv13/code/modules/munitions/ammunition/gauss_ammo.dm +++ b/nsv13/code/modules/munitions/ammunition/gauss_ammo.dm @@ -16,9 +16,14 @@ /obj/item/ship_weapon/parts/loading_tray = 1) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF +/obj/item/circuitboard/machine/gauss_dispenser/Initialize(mapload) + . = ..() + GLOB.critical_muni_items += src + /obj/item/circuitboard/machine/gauss_dispenser/Destroy(force=FALSE) if(!force) return QDEL_HINT_LETMELIVE + GLOB.critical_muni_items -= src return ..() /obj/machinery/gauss_dispenser diff --git a/nsv13/code/modules/munitions/muni_pointer.dm b/nsv13/code/modules/munitions/muni_pointer.dm new file mode 100644 index 00000000000..78143466b91 --- /dev/null +++ b/nsv13/code/modules/munitions/muni_pointer.dm @@ -0,0 +1,73 @@ +GLOBAL_LIST_EMPTY(critical_muni_items) + +/obj/item/pinpointer/munitions + name = "munitions pinpointer" + desc = "A device designed to track critical munitions objects." + icon_state = "pinpointer_muni" + icon = 'nsv13/icons/obj/device.dmi' + resistance_flags = NONE + +//Some crew pinpointer copypasta because I only need part of their functions. + +/obj/item/pinpointer/munitions/examine(mob/user) + . = ..() + if(!active || !target) + return + . += "It is currently tracking [target]." + +/obj/item/pinpointer/munitions/attack_self(mob/living/user) + if(active) + toggle_on() + user.visible_message("[user] deactivates [user.p_their()] pinpointer.", "You deactivate your pinpointer.") + return + + var/list/found_items = list() + var/obj/structure/overmap/current_overmap = get_overmap() + for(var/obj/critical_item as anything in GLOB.critical_muni_items) + if(critical_item.get_overmap() != current_overmap) + continue + if(isnull(critical_item.loc)) + continue + var/prefix = "" + if(istype(critical_item, /obj/item/circuitboard)) + var/obj/item/circuitboard/critical_circuit = critical_item + if(istype(critical_circuit.loc, critical_circuit.build_path)) + prefix = "\[NRM\]" + else + prefix = "\[LSE\]" + else + prefix = "\[OTR\]" + var/effective_basename = "[prefix] [critical_item]" + var/final_name = effective_basename + var/number_bonus = 1 + while(TRUE) + if(!found_items[final_name]) + found_items[final_name] = critical_item + break + else + final_name = "[effective_basename] ([number_bonus])" + number_bonus++ + + if(!length(found_items)) + user.visible_message("[user]'s pinpointer fails to detect a signal.", "Your pinpointer fails to detect a signal.") + return + + var/A = input(user, "Item Beacon to Track", "Pinpoint") in sortList(found_items) + if(!A || QDELETED(src) || !user || !user.is_holding(src) || user.incapacitated()) + return + + target = found_items[A] + toggle_on() + user.visible_message("[user] activates [user.p_their()] pinpointer.", "You activate your pinpointer.") + +/obj/item/pinpointer/munitions/scan_for_target() + if(target) + if(QDELETED(target) || (get_overmap() != target.get_overmap())) + target = null + + if(!target) //target can be set to null from above code, or elsewhere + active = FALSE + +/obj/item/pinpointer/munitions/not_puce + desc = "A device designed to track critical munitions objects. Wait.. Is this..?" + icon_state = "pinpointer_not_puce" diff --git a/nsv13/code/modules/munitions/ship_weapons/ballistic_weapons/broadsides.dm b/nsv13/code/modules/munitions/ship_weapons/ballistic_weapons/broadsides.dm index 3ee8b764174..df5e32eadec 100644 --- a/nsv13/code/modules/munitions/ship_weapons/ballistic_weapons/broadsides.dm +++ b/nsv13/code/modules/munitions/ship_weapons/ballistic_weapons/broadsides.dm @@ -52,9 +52,14 @@ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF build_path = /obj/machinery/ship_weapon/broadside +/obj/item/circuitboard/machine/broadside/Initialize(mapload) + . = ..() + GLOB.critical_muni_items += src + /obj/item/circuitboard/machine/broadside/Destroy(force=FALSE) if(!force) return QDEL_HINT_LETMELIVE + GLOB.critical_muni_items -= src return ..() /datum/ship_weapon/broadside diff --git a/nsv13/code/modules/munitions/ship_weapons/ship_weapon_parts.dm b/nsv13/code/modules/munitions/ship_weapons/ship_weapon_parts.dm index 5e4a7495e9f..dfc0babd1d0 100644 --- a/nsv13/code/modules/munitions/ship_weapons/ship_weapon_parts.dm +++ b/nsv13/code/modules/munitions/ship_weapons/ship_weapon_parts.dm @@ -5,11 +5,6 @@ icon_state = "mcontroller" resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF -/obj/item/ship_weapon/parts/Destroy(force=FALSE) - if(!force) - return QDEL_HINT_LETMELIVE - return ..() - /** * Firing electronics - used in construction of new old munitions machinery */ @@ -19,6 +14,18 @@ icon = 'icons/obj/module.dmi' icon_state = "mcontroller" +/obj/item/ship_weapon/parts/firing_electronics/Initialize(mapload) + . = ..() + GLOB.critical_muni_items += src + +//Almost all of the ship weapon parts are supposed to be destroyed a LOT, this is the only one where that is not the case. +/obj/item/ship_weapon/parts/firing_electronics/Destroy(force=FALSE) + if(!force) + return QDEL_HINT_LETMELIVE + GLOB.critical_muni_items -= src + return ..() + + /** * Railgun loading tray */ diff --git a/nsv13/icons/obj/device.dmi b/nsv13/icons/obj/device.dmi index a5186b23f1c58bd223028f3faf5a588ae9d53961..fa6a1e47d071c59b4a19f2bfe36f36089f804656 100644 GIT binary patch literal 2043 zcmY*Z2~<;O7JknFkFZ)`2DF4l5!9hXp&}3=PXz(d00M#zORz311|y54lwce{kVRBv zX;~7j>`T-dS%rw!*Z@W_L0M!`lVAcw(6A)J8|=)q(|gW6_rL!==eytko%`QQJ_L7d zjrAG;0BC!9xE=xk5dPxosMQ+4y*jy?tR(pd#k-z}`z|(;93Ocm1^_6f75N9VySA;p$m?aQClyqfb|npF`~O{6 z8n*ckW*WBL5_xQPtc0c6T9M)=vbAgH;SLlZSc;WD82#}1RId*4DF1Qi;^&PgeKQIg zs8=hjYrzH9boPLTrc2poi(AxP;lAmW^0G8H+(v^>OK{OH{tl1aeRqi(LiMn|{QGWi z_fszR`DZq`j66?K*m#`%6zSCF`o{DzoZ+9lMA|Kxc``*A`G8d;;KFU}v;R@@iQY{+ z=1@!fDs2SR?W_whzL-Ziuwy}@NPfz`F`qQn@iK=AQ zZ#-mCC7ZTxROjx^NdQnY_jKLuPbr-qp(YO58*t7BA2r$c)NfdOM|A%;YoCoGUzZ*y zw^?`ueq>n>uB4nJ%ySw@OB|L~P{yFvX19uZ?@{Okbxz%d~(|H?9 z3qeC3-9=5;Tmbco?C?vso3CH-XHxZaHV886V+XB`m7QLohJ5gJOO$olf;{1EEOoqA z($xEgd*t+eL)`NLW?8pGfd7k)!+lZ;95K*Q2UL^{cpdlh5s1*zLgSl zR3SqIc)GBLo)Y9W8{C`O?qp>=8L^hlR#QQ$)ei!FT`FN?+s?@c%Dzn2zhKc`5J~RfSryGZnT* zjM#*J6-l?yb}eJrUO7~7Q`&u^j8PTJ2C|vmn4m@UaV8{Y>!~@sOPU9@9_ai*AE?Nt z*d*;T3E%~!4%4&d&nTB=2L^Qq@;C|$eNvcMyy7cemgQ_uhnoG=jD|)FF4qFNHTqgH zrnMz}aA5hy52~rF;m1Y2`)H-al1dvC!&}Vm%upoa719Hw88Bd8xwqVc_=8-`ttnXP zos5O&1qV476P3k|1T7y&NP(lMV~XWAxQoCq9lYqdk80|FvP*yAVn`}1T)e+C_xXJP zP{D|ty;MW*`8u5B`535J7VB=iZF`dj@E~|I$aFz~3i`>$uG!MX+gfFKyGvi5F@P zG_Rl|MI!RSzv%wHC88&8%oD$}pu9()VP*;UO6vOZ4_i&AjWu2y=*TJO@9t+-dDbyc zBBd0F7`?ArmYzgLYCPkLTTw#V)RR^qRnFhAhTnVPD-aFJ7L*sD>Q+tn;G0}82V-*7 nCY8;-R}VQyLu005u}0{{R3yb+fl0000^P)t-sz`(#d zBNSIa9&}YFQZgO?005Rf%7}=Fa4wk2{{L!fYAVeC|LOqc<>mhXGiLt)prD|A{Qpn; z{}uZGK0Q4E&C;fMH_S8t`H%p>z`zqiK05#a00DGTPE!Ct=GbNc006goR9JLGWpiV4 zX>fFDZ*Bkpc$}3{K?;K~5IiTZ2zr$gwa`;9MJXQY7bN1=Ea;}hRO#;PWfB^t^L_@G55NZPjRg;dh9p0-;8AbTS_F;(h_8dE;&t$z z59eVR^adBN(h9-;aiK0W#QD46YtWH%Lmz_D;HMDVpeAU1*IIcvzdu(BzgDa~9HMa? zn`Rsf$G7r$i1c5~Rt^9F0000004{=e2Hfxe3;}a{%`NB?Ft*o{Joq0Rf<6Ij!1Q=5 z7jz0#3F-}I=PC9rf~i0C^=?7eDwpK#hR+6uJfo|B!nJSp70$o?-w1 z00000001D6weO271haGRC0=m4w|C@O&$IUWEeNXlCIm0q?$y`Cx`JARESEMem{QUO zy{p)@$}1XN`8sF`0ssI200000008`Fti2J=vXQI%dv2`luL?mmcVjo0bKbU~)u29r m8|yPvk;gU&0001hKj$0z_+sUA=#w%40000