Adds a Fugitive Locator machine to each bounty hunter shuttle (#77270)

## About The Pull Request

This adds a simple but important piece of machinery to every bounty
hunter shuttle, the Fugitive Locator.

Functioning near identically to the Booty Locator (the pirate loot
tracker machine), this machine selects a random fugitive, reads their
_real_ name, and reads the name of the area they occupy. It has a 40
second cooldown, and will track a random fugitive each time.


![image](https://github.com/tgstation/tgstation/assets/28870487/e879344b-c241-4f30-ba28-210cfddc14a6)

The locator will report any location you are in, be it space, lavaland,
some distant ruin or the wastes, the hunters will always know where to
start looking for you.

Since a lot of this code was referenced from the booty locator, that has
also been touched up slightly. A bit of code was moved out of the way,
and the cooldown now uses a COOLDOWN_DECLARE() instead of time tracking.

Lastly, this renames the "fugitive tracker" (which tracks the bounty
hunter shuttle) to the "bounty shuttle tracker", because the name is
misleading.
## Why It's Good For The Game

This seeks to solve the issue of fugitive hunters not knowing who their
targets are, and having no way of knowing where their targets may be.

I decided on this particular implementation because it gives only a
vague area and identity for the fugitives to work with. This allows for
fugitives to make use of hiding spots, disguises, potted plants, and
other popular tactics that would be invalidated if the mechanism were a
hud tracker or pinpointer of sorts. The intent isn't to lead hunters
straight to their targets, but to give them somewhere to start.

As for the impact this may have on the Fugitive experience -- It will be
more difficult to coast through the round in a single hiding spot or
disappear from the z-level and never be heard from again.

Directing the hunters towards the fugitives should lead to a more active
experience, encouraging evasion over just plain hiding. Just remember:
the less fugitives there are, the easier it is for the hunters to
consistently track your area, so make sure you're looking out for each
other!
## Changelog
🆑
add: Fugitive shuttles now have a "Fugitive Tracker" machine, which
gives a readout on the location of a random fugitive on a 40 second
cooldown.
spellcheck: Renames the fugitive pinpointer to the bounty shuttle
pinpointer.
/🆑
This commit is contained in:
Rhials
2023-08-02 19:43:49 +02:00
committed by GitHub
parent a4000b547c
commit 106755de7e
7 changed files with 77 additions and 23 deletions
+5 -1
View File
@@ -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
+5 -1
View File
@@ -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
+2 -2
View File
@@ -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" = (
+1
View File
@@ -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" = (
+1 -1
View File
@@ -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"
@@ -154,3 +154,47 @@
default_raw_text = "<b>Remember!</b> 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
@@ -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"