diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 9831d029b8b..281adc0823c 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -16679,9 +16679,6 @@
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
-/obj/machinery/pinpointer_dispenser{
- pixel_y = 32
- },
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"aQJ" = (
@@ -49555,6 +49552,11 @@
},
/turf/open/floor/plasteel/white,
/area/science/mixing)
+"fxH" = (
+/obj/effect/spawner/structure/window,
+/obj/machinery/pinpointer_dispenser,
+/turf/open/floor/plating,
+/area/hallway/secondary/entry)
"fBs" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/table/wood,
@@ -65848,7 +65850,7 @@ aKj
aLw
aLw
aLw
-aLw
+fxH
aQI
aNh
czK
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 34496964db9..497db92b89b 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -89539,10 +89539,10 @@
/obj/structure/window/reinforced{
dir = 1
},
-/mob/living/carbon/monkey,
/obj/effect/turf_decal/stripes/end{
dir = 8
},
+/mob/living/carbon/monkey,
/turf/open/floor/plasteel/dark,
/area/science/genetics)
"djC" = (
@@ -89560,11 +89560,11 @@
name = "'Monkey Pen";
req_access_txt = "9"
},
-/mob/living/carbon/monkey,
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/mob/living/carbon/monkey,
/turf/open/floor/plasteel/dark,
/area/science/genetics)
"djD" = (
@@ -89579,11 +89579,11 @@
name = "Monkey Pen";
req_access_txt = "9"
},
-/mob/living/carbon/monkey,
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/mob/living/carbon/monkey,
/turf/open/floor/plasteel/dark,
/area/science/genetics)
"djE" = (
@@ -89594,10 +89594,10 @@
/obj/structure/window/reinforced{
dir = 1
},
-/mob/living/carbon/monkey,
/obj/effect/turf_decal/stripes/end{
dir = 4
},
+/mob/living/carbon/monkey,
/turf/open/floor/plasteel/dark,
/area/science/genetics)
"djF" = (
@@ -115390,18 +115390,6 @@
/obj/effect/mapping_helpers/airlock/locked,
/turf/open/floor/engine,
/area/science/mixing/chamber)
-"oJM" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/machinery/pinpointer_dispenser,
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/hallway/secondary/entry)
"oMw" = (
/obj/docking_port/stationary/public_mining_dock{
dir = 4
@@ -116494,6 +116482,11 @@
},
/turf/open/space/basic,
/area/space/nearstation)
+"vVy" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/pinpointer_dispenser,
+/turf/open/floor/plating,
+/area/hallway/secondary/entry)
"wav" = (
/obj/machinery/door/airlock/external{
name = "External Docking Port"
@@ -155718,8 +155711,8 @@ aaa
aaa
aaa
aaa
-aaO
-oJM
+vVy
+ajw
akg
akL
aaO
diff --git a/_maps/map_files/Donutstation/Donutstation.dmm b/_maps/map_files/Donutstation/Donutstation.dmm
index 5a47b806211..f6716360318 100644
--- a/_maps/map_files/Donutstation/Donutstation.dmm
+++ b/_maps/map_files/Donutstation/Donutstation.dmm
@@ -46587,10 +46587,6 @@
},
/turf/open/floor/plating,
/area/maintenance/port/aft)
-"pfp" = (
-/obj/machinery/pinpointer_dispenser,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
"pfT" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable,
@@ -50321,6 +50317,10 @@
},
/turf/open/floor/plasteel/dark,
/area/tcommsat/computer)
+"wVU" = (
+/obj/machinery/pinpointer_dispenser,
+/turf/closed/wall,
+/area/security/checkpoint)
"wXV" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/components/binary/pump/on{
@@ -85825,8 +85825,8 @@ acc
acc
acc
acc
-acc
-pfp
+wVU
+aty
bwq
aMl
aty
diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index f11c7bb2cb7..a8545911149 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -25213,14 +25213,6 @@
},
/turf/open/floor/plasteel/dark,
/area/medical/genetics/cloning)
-"aNJ" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/structure/closet/secure_closet/personal/patient,
-/turf/open/floor/plasteel/dark,
-/area/medical/genetics/cloning)
"aNK" = (
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
@@ -31890,8 +31882,8 @@
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
"aXb" = (
-/mob/living/carbon/monkey,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/mob/living/carbon/monkey,
/turf/open/floor/grass,
/area/science/genetics)
"aXc" = (
@@ -36739,7 +36731,6 @@
},
/obj/structure/window/reinforced,
/obj/effect/turf_decal/box/corners,
-/mob/living/carbon/monkey,
/obj/structure/sink/puddle,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
dir = 8
@@ -36747,6 +36738,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
+/mob/living/carbon/monkey,
/turf/open/floor/grass,
/area/science/genetics)
"bdT" = (
@@ -68639,7 +68631,6 @@
dir = 1
},
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/pinpointer_dispenser,
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"bYO" = (
@@ -93938,6 +93929,11 @@
/obj/machinery/navbeacon/wayfinding,
/turf/open/floor/plasteel/dark,
/area/science/research)
+"xIs" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/pinpointer_dispenser,
+/turf/open/floor/plating,
+/area/hallway/secondary/exit/departure_lounge)
(1,1,1) = {"
aaa
@@ -113579,7 +113575,7 @@ cvJ
amh
anV
aNH
-aNJ
+and
apW
aBi
avG
@@ -113836,7 +113832,7 @@ czM
cwy
anW
aNt
-aNJ
+and
aqo
aMd
avI
@@ -133940,7 +133936,7 @@ bYe
bTs
bSQ
bXB
-bPe
+xIs
bYN
bWX
bXc
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index a17cb27f61f..ff7765bd6a3 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -54606,7 +54606,6 @@
/area/science/genetics)
"crW" = (
/obj/structure/bed/roller,
-/mob/living/carbon/monkey,
/obj/machinery/door/window/westleft{
base_state = "right";
dir = 1;
@@ -54615,6 +54614,7 @@
pixel_y = 2;
req_access_txt = "9"
},
+/mob/living/carbon/monkey,
/turf/open/floor/plasteel/dark,
/area/science/genetics)
"crZ" = (
@@ -73011,22 +73011,6 @@
},
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
-"iGQ" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/machinery/pinpointer_dispenser,
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"iHl" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/vending/tool,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/engine/storage_shared)
"iKA" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -75623,6 +75607,11 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/maintenance/starboard)
+"ttW" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/pinpointer_dispenser,
+/turf/open/floor/plating,
+/area/quartermaster/sorting)
"twp" = (
/obj/effect/turf_decal/tile/yellow,
/obj/effect/turf_decal/tile/yellow{
@@ -94050,8 +94039,8 @@ beV
bgH
biE
bkh
-dmH
-iGQ
+ttW
+bnW
bqn
bsy
bub
diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm
index 58dc2621ba0..e0a26570f74 100644
--- a/code/controllers/subsystem/job.dm
+++ b/code/controllers/subsystem/job.dm
@@ -473,8 +473,6 @@ SUBSYSTEM_DEF(job)
if(ishuman(living_mob))
var/mob/living/carbon/human/wageslave = living_mob
living_mob.add_memory("Your account ID is [wageslave.account_id].")
- if(living_mob.client.player_age < 7 && !living_mob.has_quirk(/datum/quirk/needswayfinder))
- living_mob.add_quirk(/datum/quirk/needswayfinder, TRUE)
if(job && living_mob)
job.after_spawn(living_mob, M, joined_late) // note: this happens before the mob has a key! M will always have a client, H might not.
diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm
index b4d29ef7594..1bc39fd3580 100644
--- a/code/controllers/subsystem/processing/quirks.dm
+++ b/code/controllers/subsystem/processing/quirks.dm
@@ -41,3 +41,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
badquirk = TRUE
if(badquirk)
cli.prefs.save_character()
+
+ // Assign wayfinding pinpointer granting quirk if they're new
+ if(cli.calc_exp_type(EXP_TYPE_LIVING) < 1200 && !user.has_quirk(/datum/quirk/needswayfinder))
+ user.add_quirk(/datum/quirk/needswayfinder, TRUE)
diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm
index 05276760352..0f86aa5b9c1 100644
--- a/code/datums/traits/neutral.dm
+++ b/code/datums/traits/neutral.dm
@@ -137,7 +137,7 @@
/datum/quirk/needswayfinder
name = "Navigationally Challenged"
- desc = "Due to a lack of familiarity with certain station layouts, you will start with a wayfinding pinpointer where available."
+ desc = "Lacking familiarity with certain stations, you start with a wayfinding pinpointer where available."
value = 0
medical_record_text = "Patient demonstrates a keen ability to get lost."
diff --git a/code/game/objects/items/wayfinding.dm b/code/game/objects/items/wayfinding.dm
index b992a79b1ad..7a0b2f10cd0 100644
--- a/code/game/objects/items/wayfinding.dm
+++ b/code/game/objects/items/wayfinding.dm
@@ -5,20 +5,21 @@
desc = "Having trouble finding your way? This machine dispenses pinpointers that point to common locations."
density = FALSE
layer = HIGH_OBJ_LAYER
- pixel_y = 32
var/list/obj/item/pinpointer/wayfinding/pinpointers = list()
+ var/spawn_cooldown = 1200 //deciseconds per person to spawn another pinpointer
/obj/machinery/pinpointer_dispenser/attack_hand(mob/living/carbon/user)
- if(user.name in pinpointers)
- to_chat(user, "There's already a pinpointer registered to [user.name]!")
+ if(world.time < pinpointers[user.real_name])
+ var/secsleft = (pinpointers[user.real_name] - world.time) / 10
+ to_chat(user, "You need to wait [secsleft/60 > 1 ? "[round(secsleft/60)] minute\s" : "[round(secsleft)] second\s"].")
return
to_chat(user, "You take a pinpointer from [src].")
var/obj/item/pinpointer/wayfinding/P = new /obj/item/pinpointer/wayfinding(get_turf(src))
user.put_in_hands(P)
- P.owner = user.name
- pinpointers[user.name] = P
+ P.owner = user.real_name
+ pinpointers[user.real_name] = world.time + spawn_cooldown
/obj/item/pinpointer/wayfinding //For new players or new stations to help players find their way around
name = "wayfinding pinpointer"
@@ -30,14 +31,11 @@
/obj/item/pinpointer/wayfinding/attack_self(mob/living/user)
if(active)
toggle_on()
- user.visible_message("[user] deactivates [user.p_their()] pinpointer.", "You deactivate your pinpointer.")
+ to_chat(user, "You deactivate your pinpointer.")
return
if (!owner)
- owner = user.name
- else if(owner != user.name)
- to_chat(user, "The pinpointer doesn't respond. It seems to only recognise its owner.")
- return
+ owner = user.real_name
if(beacons.len)
beacons.Cut()
@@ -45,7 +43,7 @@
beacons[B.codes["wayfinding"]] = B
if(!beacons.len)
- user.visible_message("[user]'s pinpointer fails to detect a signal.", "Your pinpointer fails to detect a signal.")
+ to_chat(user, "Your pinpointer fails to detect a signal.")
return
var/A = input(user, "", "Pinpoint") in sortNames(beacons)
@@ -54,7 +52,7 @@
target = beacons[A]
toggle_on()
- user.visible_message("[user] activates [user.p_their()] pinpointer.", "You activate your pinpointer.")
+ to_chat(user, "You activate your pinpointer.")
/obj/item/pinpointer/wayfinding/examine(mob/user)
. = ..()
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index aac7e116ba9..afb6b83789b 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -142,6 +142,7 @@
return TRUE //Available in 0 days = available right now = player is old enough to play.
return FALSE
+
/datum/job/proc/available_in_days(client/C)
if(!C)
return 0