diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm
index 342bcac090..461ef78ef3 100644
--- a/code/game/gamemodes/nuclear/pinpointer.dm
+++ b/code/game/gamemodes/nuclear/pinpointer.dm
@@ -1,56 +1,7 @@
-//Pinpointers are used to track atoms from a distance as long as they're on the same z-level. The captain and nuke ops have ones that track the nuclear authentication disk.
-/obj/item/pinpointer
- name = "pinpointer"
- desc = "A handheld tracking device that locks onto certain signals."
- icon = 'icons/obj/device.dmi'
- icon_state = "pinoff"
- flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT
- w_class = WEIGHT_CLASS_SMALL
- item_state = "electronic"
- lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
- throw_speed = 3
- throw_range = 7
- materials = list(MAT_METAL = 500, MAT_GLASS = 250)
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
- var/active = FALSE
- var/atom/movable/target = null //The thing we're searching for
- var/atom/movable/constant_target = null //The thing we're always focused on, if we're in the right mode
- var/target_x = 0 //The target coordinates if we're tracking those
- var/target_y = 0
- var/minimum_range = 0 //at what range the pinpointer declares you to be at your destination
- var/nuke_warning = FALSE // If we've set off a miniature alarm about an armed nuke
- var/mode = TRACK_NUKE_DISK //What are we looking for?
+/obj/item/pinpointer/nuke
+ var/mode = TRACK_NUKE_DISK
-/obj/item/pinpointer/New()
- ..()
- GLOB.pinpointer_list += src
-
-/obj/item/pinpointer/Destroy()
- STOP_PROCESSING(SSfastprocess, src)
- GLOB.pinpointer_list -= src
- return ..()
-
-/obj/item/pinpointer/attack_self(mob/living/user)
- active = !active
- user.visible_message("[user] [active ? "" : "de"]activates their pinpointer.", "You [active ? "" : "de"]activate your pinpointer.")
- playsound(user, 'sound/items/screwdriver2.ogg', 50, 1)
- icon_state = "pin[active ? "onnull" : "off"]"
- if(active)
- START_PROCESSING(SSfastprocess, src)
- else
- target = null //Restarting the pinpointer forces a target reset
- STOP_PROCESSING(SSfastprocess, src)
-
-/obj/item/pinpointer/attackby(obj/item/I, mob/living/user, params)
- if(mode != TRACK_ATOM)
- return ..()
- user.visible_message("[user] tunes [src] to [I].", "You fine-tune [src]'s tracking to track [I].")
- playsound(src, 'sound/machines/click.ogg', 50, 1)
- constant_target = I
-
-/obj/item/pinpointer/examine(mob/user)
+/obj/item/pinpointer/nuke/examine(mob/user)
..()
var/msg = "Its tracking indicator reads "
switch(mode)
@@ -67,22 +18,20 @@
if(bomb.timing)
to_chat(user, "Extreme danger. Arming signal detected. Time remaining: [bomb.get_time_left()]")
-/obj/item/pinpointer/process()
- if(!active)
- STOP_PROCESSING(SSfastprocess, src)
- return
- scan_for_target()
- point_to_target()
- my_god_jc_a_bomb()
- addtimer(CALLBACK(src, .proc/refresh_target), 50, TIMER_UNIQUE)
+/obj/item/pinpointer/nuke/process()
+ ..()
+ if(active) // If shit's going down
+ for(var/obj/machinery/nuclearbomb/bomb in GLOB.nuke_list)
+ if(bomb.timing)
+ if(!alert)
+ alert = TRUE
+ playsound(src, 'sound/items/nuke_toy_lowpower.ogg', 50, 0)
+ if(isliving(loc))
+ var/mob/living/L = loc
+ to_chat(L, "Your [name] vibrates and lets out a tinny alarm. Uh oh.")
-/obj/item/pinpointer/proc/scan_for_target() //Looks for whatever it's tracking
- if(target)
- if(isliving(target))
- var/mob/living/L = target
- if(L.stat == DEAD)
- target = null
- return
+/obj/item/pinpointer/nuke/scan_for_target()
+ target = null
switch(mode)
if(TRACK_NUKE_DISK)
var/obj/item/disk/nuclear/N = locate() in GLOB.poi_list
@@ -98,76 +47,36 @@
target = A
if(TRACK_INFILTRATOR)
target = SSshuttle.getShuttle("syndicate")
- if(TRACK_OPERATIVES)
- var/list/possible_targets = list()
- var/turf/here = get_turf(src)
- for(var/V in SSticker.mode.syndicates)
- var/datum/mind/M = V
- if(M.current && M.current.stat != DEAD)
- possible_targets |= M.current
- var/mob/living/closest_operative = get_closest_atom(/mob/living/carbon/human, possible_targets, here)
- if(closest_operative)
- target = closest_operative
- if(TRACK_ATOM)
- if(constant_target)
- target = constant_target
- if(TRACK_COORDINATES)
- var/turf/T = get_turf(src)
- target = locate(target_x, target_y, T.z)
+ ..()
-/obj/item/pinpointer/proc/point_to_target() //If we found what we're looking for, show the distance and direction
- if(!active)
- return
- if(!target || (mode == TRACK_ATOM && !constant_target))
- icon_state = "pinon[nuke_warning ? "alert" : ""]null"
- return
- var/turf/here = get_turf(src)
- var/turf/there = get_turf(target)
- if(here.z != there.z)
- icon_state = "pinon[nuke_warning ? "alert" : ""]null"
- return
- if(get_dist_euclidian(here,there)<=minimum_range)
- icon_state = "pinon[nuke_warning ? "alert" : ""]direct"
- else
- setDir(get_dir(here, there))
- switch(get_dist(here, there))
- if(1 to 8)
- icon_state = "pinon[nuke_warning ? "alert" : "close"]"
- if(9 to 16)
- icon_state = "pinon[nuke_warning ? "alert" : "medium"]"
- if(16 to INFINITY)
- icon_state = "pinon[nuke_warning ? "alert" : "far"]"
-
-/obj/item/pinpointer/proc/my_god_jc_a_bomb() //If we should get the hell back to the ship
- for(var/obj/machinery/nuclearbomb/bomb in GLOB.nuke_list)
- if(bomb.timing)
- if(!nuke_warning)
- nuke_warning = TRUE
- playsound(src, 'sound/items/nuke_toy_lowpower.ogg', 50, 0)
- if(isliving(loc))
- var/mob/living/L = loc
- to_chat(L, "Your [name] vibrates and lets out a tinny alarm. Uh oh.")
-
-/obj/item/pinpointer/proc/switch_mode_to(new_mode) //If we shouldn't be tracking what we are
+/obj/item/pinpointer/nuke/proc/switch_mode_to(new_mode)
if(isliving(loc))
var/mob/living/L = loc
to_chat(L, "Your [name] beeps as it reconfigures its tracking algorithms.")
playsound(L, 'sound/machines/triple_beep.ogg', 50, 1)
mode = new_mode
- target = null //Switch modes so we can find the new target
+ scan_for_target()
-/obj/item/pinpointer/proc/refresh_target() //Periodically removes the target to allow the pinpointer to update (i.e. malf AI shunts, an operative dies)
- target = null
-
-/obj/item/pinpointer/syndicate //Syndicate pinpointers automatically point towards the infiltrator once the nuke is active.
+/obj/item/pinpointer/nuke/syndicate // Syndicate pinpointers automatically point towards the infiltrator once the nuke is active.
name = "syndicate pinpointer"
desc = "A handheld tracking device that locks onto certain signals. It's configured to switch tracking modes once it detects the activation signal of a nuclear device."
+ icon_state = "pinpointer_syndicate"
-/obj/item/pinpointer/syndicate/cyborg //Cyborg pinpointers just look for a random operative.
+/obj/item/pinpointer/syndicate_cyborg // Cyborg pinpointers just look for a random operative.
name = "cyborg syndicate pinpointer"
desc = "An integrated tracking device, jury-rigged to search for living Syndicate operatives."
- mode = TRACK_OPERATIVES
flags_1 = NODROP_1
-
+/obj/item/pinpointer/syndicate_cyborg/scan_for_target()
+ target = null
+ var/list/possible_targets = list()
+ var/turf/here = get_turf(src)
+ for(var/V in SSticker.mode.syndicates)
+ var/datum/mind/M = V
+ if(M.current && M.current.stat != DEAD)
+ possible_targets |= M.current
+ var/mob/living/closest_operative = get_closest_atom(/mob/living/carbon/human, possible_targets, here)
+ if(closest_operative)
+ target = closest_operative
+ ..()