diff --git a/_maps/shuttles/hunter_bounty.dmm b/_maps/shuttles/hunter_bounty.dmm index b654996b63e..3087fa376fe 100644 --- a/_maps/shuttles/hunter_bounty.dmm +++ b/_maps/shuttles/hunter_bounty.dmm @@ -102,6 +102,10 @@ /obj/item/phone, /turf/open/floor/pod/dark, /area/shuttle/hunter) +"x" = ( +/obj/machinery/fugitive_locator, +/turf/open/floor/pod/light, +/area/shuttle/hunter) "y" = ( /obj/structure/chair/office{ dir = 8 @@ -491,7 +495,7 @@ a b i A -n +x I i b diff --git a/_maps/shuttles/hunter_psyker.dmm b/_maps/shuttles/hunter_psyker.dmm index 9bd35f025d5..311f5aac15f 100644 --- a/_maps/shuttles/hunter_psyker.dmm +++ b/_maps/shuttles/hunter_psyker.dmm @@ -280,6 +280,10 @@ /obj/effect/turf_decal/tile/dark_blue/diagonal_centre, /turf/open/floor/iron/white/diagonal, /area/shuttle/hunter) +"mc" = ( +/obj/machinery/fugitive_locator, +/turf/open/floor/iron/kitchen/small, +/area/shuttle/hunter) "mz" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/etherealball, @@ -1218,7 +1222,7 @@ oL CW zY xF -lu +mc PC XX CW diff --git a/_maps/shuttles/hunter_russian.dmm b/_maps/shuttles/hunter_russian.dmm index e82db9f5e29..9788549705a 100644 --- a/_maps/shuttles/hunter_russian.dmm +++ b/_maps/shuttles/hunter_russian.dmm @@ -381,6 +381,7 @@ req_access = list("hunter"); specialfunctions = 4 }, +/obj/item/soap, /turf/open/floor/mineral/plastitanium, /area/shuttle/hunter/russian) "Dw" = ( @@ -451,8 +452,7 @@ /area/shuttle/hunter/russian) "GF" = ( /obj/effect/turf_decal/bot, -/obj/structure/reagent_dispensers/watertank, -/obj/item/soap, +/obj/machinery/fugitive_locator, /turf/open/floor/pod/dark, /area/shuttle/hunter/russian) "IV" = ( diff --git a/_maps/shuttles/hunter_space_cop.dmm b/_maps/shuttles/hunter_space_cop.dmm index 826ecef4852..50e2093174d 100644 --- a/_maps/shuttles/hunter_space_cop.dmm +++ b/_maps/shuttles/hunter_space_cop.dmm @@ -21,6 +21,7 @@ /area/shuttle/hunter) "ag" = ( /obj/effect/turf_decal/delivery, +/obj/machinery/fugitive_locator, /turf/open/floor/mineral/titanium/blue, /area/shuttle/hunter) "ah" = ( diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm index 8659b0e1715..4c2c526c2c1 100644 --- a/code/game/objects/items/pinpointer.dm +++ b/code/game/objects/items/pinpointer.dm @@ -199,7 +199,7 @@ B.other_pair = A /obj/item/pinpointer/shuttle - name = "fugitive pinpointer" + name = "bounty shuttle pinpointer" desc = "A handheld tracking device that locates the bounty hunter shuttle for quick escapes." icon_state = "pinpointer_hunter" worn_icon_state = "pinpointer_black" diff --git a/code/modules/antagonists/fugitive/hunters/hunter_gear.dm b/code/modules/antagonists/fugitive/hunters/hunter_gear.dm index d343ca78e2d..71082f199e0 100644 --- a/code/modules/antagonists/fugitive/hunters/hunter_gear.dm +++ b/code/modules/antagonists/fugitive/hunters/hunter_gear.dm @@ -154,3 +154,47 @@ default_raw_text = "Remember! The customers love that gumball we have as a crystal ball. \ Even if it's completely useless to us, resist the urge to chew it." +/** + * # Bounty Locator + * + * Locates a random, living fugitive and reports their name/location on a 40 second cooldown. + * + * Locates a random fugitive antagonist via the GLOB.antagonists list, and reads out their real name and area name. + * Captured or dead fugitives are not reported. + */ +/obj/machinery/fugitive_locator + name = "Bounty Locator" + desc = "Tracks the signatures of bounty targets in your sector. Nobody actually knows what mechanism this thing uses to track its targets. \ + Whether it be bluespace entanglement or a simple RFID implant, this machine will find you who you're looking for no matter where they're hiding." + icon = 'icons/obj/machines/dominator.dmi' + icon_state = "dominator-Purple" + density = TRUE + /// Cooldown on locating a fugitive. + COOLDOWN_DECLARE(locate_cooldown) + +/obj/machinery/fugitive_locator/interact(mob/user) + if(!COOLDOWN_FINISHED(src, locate_cooldown)) + balloon_alert_to_viewers("locator recharging!", vision_distance = 3) + return + var/mob/living/bounty = locate_fugitive() + if(!bounty) + say("No bounty targets detected.") + else + say("Bounty Target Located. Bounty ID: [bounty.real_name]. Location: [get_area_name(bounty)]") + + COOLDOWN_START(src, locate_cooldown, 40 SECONDS) + +///Locates a random fugitive via their antag datum and returns them. +/obj/machinery/fugitive_locator/proc/locate_fugitive() + var/list/datum_list = shuffle(GLOB.antagonists) + for(var/datum/antagonist/fugitive/fugitive_datum in datum_list) + if(!fugitive_datum.owner) + stack_trace("Fugitive locator tried to locate a fugitive antag datum with no owner.") + continue + if(fugitive_datum.is_captured) + continue + var/mob/living/found_fugitive = fugitive_datum.owner.current + if(found_fugitive.stat == DEAD) + continue + + return found_fugitive diff --git a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm index 49a87d05461..a99735a2d5c 100644 --- a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm +++ b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm @@ -123,33 +123,21 @@ icon = 'icons/obj/machines/research.dmi' icon_state = "tdoppler" density = TRUE - var/cooldown = 300 - var/next_use = 0 - -/// Surgery disk for the space IRS (I don't know where to dump them anywhere else) -/obj/item/disk/surgery/irs - name = "Advanced Surgery Disk" - desc = "A disk that contains advanced surgery procedures, must be loaded into an Operating Console." - surgeries = list( - /datum/surgery/advanced/lobotomy, - /datum/surgery/advanced/bioware/vein_threading, - /datum/surgery/advanced/bioware/nerve_splicing, - /datum/surgery_step/heal/combo/upgraded, - /datum/surgery_step/pacify, - /datum/surgery_step/revive, - ) + /// Cooldown on locating booty. + COOLDOWN_DECLARE(locate_cooldown) /obj/machinery/loot_locator/interact(mob/user) - if(world.time <= next_use) - to_chat(user,span_warning("[src] is recharging.")) + if(!COOLDOWN_FINISHED(src, locate_cooldown)) + balloon_alert_to_viewers("locator recharging!", vision_distance = 3) return - next_use = world.time + cooldown var/atom/movable/found_loot = find_random_loot() if(!found_loot) say("No valuables located. Try again later.") else say("Located: [found_loot.name] at [get_area_name(found_loot)]") + COOLDOWN_START(src, locate_cooldown, 10 SECONDS) + /// Looks across the station for items that are pirate specific exports /obj/machinery/loot_locator/proc/find_random_loot() if(!GLOB.exports_list.len) @@ -164,6 +152,19 @@ found_loot = selected_export.find_loot() return found_loot +/// Surgery disk for the space IRS (I don't know where to dump them anywhere else) +/obj/item/disk/surgery/irs + name = "Advanced Surgery Disk" + desc = "A disk that contains advanced surgery procedures, must be loaded into an Operating Console." + surgeries = list( + /datum/surgery/advanced/lobotomy, + /datum/surgery/advanced/bioware/vein_threading, + /datum/surgery/advanced/bioware/nerve_splicing, + /datum/surgery_step/heal/combo/upgraded, + /datum/surgery_step/pacify, + /datum/surgery_step/revive, + ) + //Pad & Pad Terminal /obj/machinery/piratepad name = "cargo hold pad"