diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index 4ed35c5b707..63dec0b95f9 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -11,6 +11,13 @@ materials = list(MAT_METAL=500) var/obj/item/weapon/disk/nuclear/the_disk = null var/active = 0 + var/shows_nuke_timer = TRUE + var/icon_off = "pinoff" + var/icon_null = "pinonnull" + var/icon_direct = "pinondirect" + var/icon_close = "pinonclose" + var/icon_medium = "pinonmedium" + var/icon_far = "pinonfar" /obj/item/weapon/pinpointer/New() ..() @@ -29,7 +36,7 @@ to_chat(usr, "You activate the pinpointer.") else active = 0 - icon_state = "pinoff" + icon_state = icon_off to_chat(usr, "You deactivate the pinpointer.") /obj/item/weapon/pinpointer/proc/scandisk() @@ -40,25 +47,25 @@ if(!active) return if(!target) - icon_state = "pinonnull" + icon_state = icon_null return var/turf/T = get_turf(target) var/turf/L = get_turf(src) if(T.z != L.z) - icon_state = "pinonnull" + icon_state = icon_null else dir = get_dir(L, T) switch(get_dist(L, T)) if(-1) - icon_state = "pinondirect" + icon_state = icon_direct if(1 to 8) - icon_state = "pinonclose" + icon_state = icon_close if(9 to 16) - icon_state = "pinonmedium" + icon_state = icon_medium if(16 to INFINITY) - icon_state = "pinonfar" + icon_state = icon_far if(spawnself) spawn(5) .() @@ -71,6 +78,9 @@ /obj/item/weapon/pinpointer/examine(mob/user) ..(user) + if(!shows_nuke_timer) + return + for(var/obj/machinery/nuclearbomb/bomb in machines) if(bomb.timing) to_chat(user, "Extreme danger. Arming signal detected. Time remaining: [bomb.timeleft]") @@ -94,7 +104,7 @@ to_chat(usr, "You activate the pinpointer.") else active = 0 - icon_state = "pinoff" + icon_state = icon_off to_chat(usr, "You deactivate the pinpointer.") /obj/item/weapon/pinpointer/advpinpointer/workdisk() @@ -113,7 +123,7 @@ return active = 0 - icon_state = "pinoff" + icon_state = icon_off target = null location = null @@ -192,7 +202,7 @@ to_chat(user, "Shuttle Locator active.") else active = 0 - icon_state = "pinoff" + icon_state = icon_off to_chat(user, "You deactivate the pinpointer.") /obj/item/weapon/pinpointer/nukeop/workdisk() @@ -208,18 +218,18 @@ return //Get outta here scandisk() if(!the_disk) - icon_state = "pinonnull" + icon_state = icon_null return dir = get_dir(src, the_disk) switch(get_dist(src, the_disk)) if(0) - icon_state = "pinondirect" + icon_state = icon_direct if(1 to 8) - icon_state = "pinonclose" + icon_state = icon_close if(9 to 16) - icon_state = "pinonmedium" + icon_state = icon_medium if(16 to INFINITY) - icon_state = "pinonfar" + icon_state = icon_far spawn(5) .() @@ -238,21 +248,21 @@ if(!home) home = shuttle_master.getShuttle("syndicate") if(!home) - icon_state = "pinonnull" + icon_state = icon_null return if(loc.z != home.z) //If you are on a different z-level from the shuttle - icon_state = "pinonnull" + icon_state = icon_null else dir = get_dir(src, home) switch(get_dist(src, home)) if(0) - icon_state = "pinondirect" + icon_state = icon_direct if(1 to 8) - icon_state = "pinonclose" + icon_state = icon_close if(9 to 16) - icon_state = "pinonmedium" + icon_state = icon_medium if(16 to INFINITY) - icon_state = "pinonfar" + icon_state = icon_far spawn(5) .() @@ -272,7 +282,7 @@ to_chat(usr, "You activate the pinpointer.") else active = 0 - icon_state = "pinoff" + icon_state = icon_off to_chat(usr, "You deactivate the pinpointer.") /obj/item/weapon/pinpointer/operative/proc/scan_for_ops() @@ -300,3 +310,83 @@ to_chat(user, "Nearest operative detected is [nearest_op.real_name].") else to_chat(user, "No operatives detected within scanning range.") + +/obj/item/weapon/pinpointer/crew + name = "crew pinpointer" + desc = "A handheld tracking device that points to crew suit sensors." + shows_nuke_timer = FALSE + icon_state = "pinoff_crew" + icon_off = "pinoff_crew" + icon_null = "pinonnull_crew" + icon_direct = "pinondirect_crew" + icon_close = "pinonclose_crew" + icon_medium = "pinonmedium_crew" + icon_far = "pinonfar_crew" + +/obj/item/weapon/pinpointer/crew/proc/trackable(mob/living/carbon/human/H) + var/turf/here = get_turf(src) + if((H.z == 0 || H.z == here.z) && istype(H.w_uniform, /obj/item/clothing/under)) + var/obj/item/clothing/under/U = H.w_uniform + + // Suit sensors must be on maximum. + if(!U.has_sensor || U.sensor_mode < 3) + return FALSE + + var/turf/there = get_turf(H) + return (H.z != 0 || (there && there.z == H.z)) + + return FALSE + +/obj/item/weapon/pinpointer/crew/attack_self(mob/living/user) + if(active) + active = FALSE + icon_state = icon_off + user.visible_message("[user] deactivates their pinpointer.", "You deactivate your pinpointer.") + return + + var/list/name_counts = list() + var/list/names = list() + + for(var/mob/living/carbon/human/H in mob_list) + if(!trackable(H)) + continue + + var/name = "Unknown" + if(H.wear_id) + var/obj/item/weapon/card/id/I = H.wear_id.GetID() + name = I.registered_name + + while(name in name_counts) + name_counts[name]++ + name = text("[] ([])", name, name_counts[name]) + names[name] = H + name_counts[name] = 1 + + if(!names.len) + user.visible_message("[user]'s pinpointer fails to detect a signal.", "Your pinpointer fails to detect a signal.") + return + + var/A = input(user, "Person to track", "Pinpoint") in names + if(!src || !user || (user.get_active_hand() != src) || user.incapacitated() || !A) + return + + var/target = names[A] + active = TRUE + user.visible_message("[user] activates their pinpointer.", "You activate your pinpointer.") + point_at(target) + +/obj/item/weapon/pinpointer/crew/point_at(atom/target, spawnself = 1) + if(!active) + return + + if(!trackable(target) || !target) + icon_state = icon_null + return + + ..(target, spawnself = 0) + if(spawnself) + spawn(5) + .() + +/obj/item/weapon/pinpointer/crew/examine(mob/user) + ..(user) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index dadfad2985a..a45ddd32c0d 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -898,7 +898,8 @@ /obj/item/weapon/reagent_containers/glass/bottle/toxin = 4,/obj/item/weapon/reagent_containers/syringe/antiviral = 6,/obj/item/weapon/reagent_containers/syringe/insulin = 4, /obj/item/weapon/reagent_containers/syringe = 12,/obj/item/device/healthanalyzer = 5,/obj/item/device/healthupgrade = 5,/obj/item/weapon/reagent_containers/glass/beaker = 4, /obj/item/weapon/reagent_containers/dropper = 2,/obj/item/stack/medical/bruise_pack/advanced = 3, /obj/item/stack/medical/ointment/advanced = 3, - /obj/item/stack/medical/bruise_pack = 3,/obj/item/stack/medical/splint = 4, /obj/item/device/sensor_device = 2, /obj/item/weapon/reagent_containers/hypospray/autoinjector = 4) + /obj/item/stack/medical/bruise_pack = 3,/obj/item/stack/medical/splint = 4, /obj/item/device/sensor_device = 2, /obj/item/weapon/reagent_containers/hypospray/autoinjector = 4, + /obj/item/weapon/pinpointer/crew = 2) contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/pancuronium = 1,/obj/item/weapon/reagent_containers/glass/bottle/sulfonal = 1) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 9f1783381f5..2805d0c0c51 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -247,6 +247,7 @@ new /obj/item/clothing/head/helmet/space/eva/paramedic(src) new /obj/item/device/sensor_device(src) new /obj/item/key/ambulance(src) + new /obj/item/weapon/pinpointer/crew(src) /obj/structure/closet/secure_closet/reagents name = "chemical storage closet" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 38a8fe42377..36ff8dc2455 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -234,6 +234,7 @@ ..() new /obj/item/weapon/storage/briefcase(src) new /obj/item/weapon/storage/firstaid/adv(src) + new /obj/item/weapon/pinpointer/crew(src) new /obj/item/weapon/storage/belt/security/sec(src) new /obj/item/weapon/grenade/flashbang(src) new /obj/item/device/flash(src) diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 65ebfa597a1..f1c8b87aaa4 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ