diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm
index e4932ff0d2..9cfb46a2e0 100644
--- a/code/game/objects/items/devices/gps.dm
+++ b/code/game/objects/items/devices/gps.dm
@@ -80,7 +80,7 @@ var/list/GPS_list = list()
var/turf/curr = get_turf(src)
var/area/my_area = get_area(src)
- dat += "Current location: [my_area.name] ([curr.x], [curr.y], [curr.z])"
+ dat += "Current location: [my_area.name] ([curr.x], [curr.y], [using_map.get_zlevel_name(curr.z)])"
dat += "[hide_signal ? "Tagged" : "Broadcasting"] as '[gps_tag]'. \[Change Tag\] \
\[Toggle Scan Range\] \
[can_hide_signal ? "\[Toggle Signal Visibility\]":""]"
@@ -103,16 +103,17 @@ var/list/GPS_list = list()
var/area_name = their_area.name
if(istype(their_area, /area/submap))
area_name = "Unknown Area" // Avoid spoilers.
- var/coord = "[T.x], [T.y], [T.z]"
- var/degrees = round(Get_Angle(curr, T))
+ var/Z_name = using_map.get_zlevel_name(T.z)
var/direction = uppertext(dir2text(get_dir(curr, T)))
var/distance = get_dist(curr, T)
var/local = curr.z == T.z ? TRUE : FALSE
if(!direction)
direction = "CENTER"
- degrees = "N/A"
- signals += " [G.gps_tag]: [area_name] ([coord]) [local ? "Dist: [distance]m Dir: [degrees]° ([direction])":""]"
+ if(istype(T, /obj/item/device/gps/internal/poi))
+ signals += " Unidentified Signal: [area_name] [local ? "Dist: [round(distance, 10)]m [direction])" : "in \the [Z_name]"]"
+ else
+ signals += " [G.gps_tag]: [area_name] [local ? "Dist: [round(distance, 10)]m [direction])" : "in \the [Z_name]"]"
if(signals.len)
dat += "Detected signals;"
@@ -179,15 +180,6 @@ var/list/GPS_list = list()
/obj/item/device/gps/explorer/on
tracking = TRUE
-/obj/item/device/gps/syndie
- icon_state = "gps-syndie"
- gps_tag = "NULL"
- desc = "A positioning system that has extended range and can detect other GPS device signals without revealing its own. How that works is best left a mystery. Alt+click to toggle power."
- origin_tech = list(TECH_MATERIAL = 2, TECH_BLUESPACE = 3, TECH_MAGNET = 2, TECH_ILLEGAL = 2)
- long_range = TRUE
- hide_signal = TRUE
- can_hide_signal = TRUE
-
/obj/item/device/gps/robot
icon_state = "gps-b"
gps_tag = "SYNTH0"
@@ -207,6 +199,72 @@ var/list/GPS_list = list()
gps_tag = "NT_BASE"
desc = "A homing signal from NanoTrasen's outpost."
-/obj/item/device/gps/internal/alien_vessel
+/obj/item/device/gps/internal/poi
gps_tag = "Mysterious Signal"
- desc = "A signal that seems forboding."
\ No newline at end of file
+ desc = "A signal that seems forboding."
+
+/obj/item/device/gps/syndie
+ icon_state = "gps-syndie"
+ gps_tag = "NULL"
+ desc = "A positioning system that has extended range and can detect other GPS device signals without revealing its own. How that works is best left a mystery. Alt+click to toggle power."
+ origin_tech = list(TECH_MATERIAL = 2, TECH_BLUESPACE = 3, TECH_MAGNET = 2, TECH_ILLEGAL = 2)
+ long_range = TRUE
+ hide_signal = TRUE
+ can_hide_signal = TRUE
+
+/obj/item/device/gps/syndie/display(mob/user)
+ if(!tracking)
+ to_chat(user, "The device is off. Alt-click it to turn it on.")
+ return
+ if(emped)
+ to_chat(user, "It's busted!")
+ return
+
+ var/list/dat = list()
+
+ var/turf/curr = get_turf(src)
+ var/area/my_area = get_area(src)
+ dat += "Current location: [my_area.name] ([curr.x], [curr.y], [using_map.get_zlevel_name(curr.z)])"
+ dat += "[hide_signal ? "Tagged" : "Broadcasting"] as '[gps_tag]'. \[Change Tag\] \
+ \[Toggle Scan Range\] \
+ [can_hide_signal ? "\[Toggle Signal Visibility\]":""]"
+
+ var/list/signals = list()
+
+ for(var/gps in GPS_list)
+ var/obj/item/device/gps/G = gps
+ if(G.emped || !G.tracking || G.hide_signal || G == src) // Their GPS isn't on or functional.
+ continue
+ var/turf/T = get_turf(G)
+ var/z_level_detection = using_map.get_map_levels(curr.z, long_range)
+
+ if(local_mode && T.z != curr.z) // Only care about the current z-level.
+ continue
+ else if(!(T.z in z_level_detection)) // Too far away.
+ continue
+
+ var/area/their_area = get_area(G)
+ var/area_name = their_area.name
+ if(istype(their_area, /area/submap))
+ area_name = "Unknown Area" // Avoid spoilers.
+ var/Z_name = using_map.get_zlevel_name(T.z)
+ var/coord = "[T.x], [T.y], [Z_name]"
+ var/degrees = round(Get_Angle(curr, T))
+ var/direction = uppertext(dir2text(get_dir(curr, T)))
+ var/distance = get_dist(curr, T)
+ var/local = curr.z == T.z ? TRUE : FALSE
+ if(!direction)
+ direction = "CENTER"
+ degrees = "N/A"
+
+ signals += " [G.gps_tag]: [area_name] ([coord]) [local ? "Dist: [distance]m Dir: [degrees]° ([direction])":""]"
+
+ if(signals.len)
+ dat += "Detected signals;"
+ for(var/line in signals)
+ dat += line
+ else
+ dat += "No other signals detected."
+
+ var/result = dat.Join("
")
+ to_chat(user, result)
\ No newline at end of file
diff --git a/html/changelogs/Atermonera - gps_tweaks.yml b/html/changelogs/Atermonera - gps_tweaks.yml
new file mode 100644
index 0000000000..1c57e76d90
--- /dev/null
+++ b/html/changelogs/Atermonera - gps_tweaks.yml
@@ -0,0 +1,6 @@
+author: Atermonera
+
+delete-after: True
+changes:
+ - tweak: "GPS units won't report the exact location of other GPS units, just range and approximate direction"
+ - tweak: "POI gps units won't give any information about the POI, merely its location"
diff --git a/maps/southern_cross/southern_cross_defines.dm b/maps/southern_cross/southern_cross_defines.dm
index a53dd09ef2..8a6655ff54 100644
--- a/maps/southern_cross/southern_cross_defines.dm
+++ b/maps/southern_cross/southern_cross_defines.dm
@@ -134,19 +134,19 @@
/datum/map_z_level/southern_cross/surface
z = Z_LEVEL_SURFACE
- name = "Planet"
+ name = "Plains"
flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_SEALED
base_turf = /turf/simulated/floor/outdoors/rocks
/datum/map_z_level/southern_cross/surface_mine
z = Z_LEVEL_SURFACE_MINE
- name = "Planet"
+ name = "Mountains"
flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_SEALED
base_turf = /turf/simulated/floor/outdoors/rocks
/datum/map_z_level/southern_cross/surface_wild
z = Z_LEVEL_SURFACE_WILD
- name = "Wild"
+ name = "Wilderness"
flags = MAP_LEVEL_PLAYER|MAP_LEVEL_SEALED
base_turf = /turf/simulated/floor/outdoors/rocks
diff --git a/maps/submaps/surface_submaps/mountains/crashed_ufo.dmm b/maps/submaps/surface_submaps/mountains/crashed_ufo.dmm
index e977d9ba4d..46ea1b90b9 100644
--- a/maps/submaps/surface_submaps/mountains/crashed_ufo.dmm
+++ b/maps/submaps/surface_submaps/mountains/crashed_ufo.dmm
@@ -37,7 +37,7 @@
"aK" = (/obj/item/weapon/crowbar/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
"aL" = (/obj/item/stack/cable_coil/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
"aM" = (/obj/structure/table/alien,/obj/item/prop/alien/junk,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
-"aN" = (/obj/structure/table/alien,/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/obj/item/device/gps/internal/alien_vessel,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
+"aN" = (/obj/structure/table/alien,/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/obj/item/device/gps/internal/poi,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
"aO" = (/obj/structure/prop/alien/computer{tag = "icon-console-c (EAST)"; icon_state = "console-c"; dir = 4},/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo)
"aP" = (/obj/structure/table/alien,/obj/item/clothing/accessory/medal/dungeon/alien_ufo,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
"aQ" = (/obj/structure/table/alien,/obj/item/weapon/weldingtool/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo)
diff --git a/maps/submaps/surface_submaps/wilderness/DJOutpost1.dmm b/maps/submaps/surface_submaps/wilderness/DJOutpost1.dmm
index 51d75e5596..134247d299 100644
--- a/maps/submaps/surface_submaps/wilderness/DJOutpost1.dmm
+++ b/maps/submaps/surface_submaps/wilderness/DJOutpost1.dmm
@@ -26,20 +26,21 @@
"z" = (/obj/structure/table/steel_reinforced,/obj/item/device/radio/intercom/syndicate{desc = "Talk through this."; name = "station intercom (General)"},/obj/item/device/multitool,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
"A" = (/obj/structure/table/steel_reinforced,/obj/item/device/radio,/obj/machinery/power/apc{cell_type = /obj/item/weapon/cell/hyper; dir = 4; environ = 1; equipment = 1; lighting = 1; locked = 0; name = "Sif Free Radio APC"; operating = 0; pixel_x = 24},/obj/structure/cable/yellow,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
"B" = (/obj/effect/overlay/snow/floor,/obj/machinery/power/port_gen/pacman,/obj/structure/cable/yellow,/turf/simulated/floor{outdoors = 1},/area/submap/DJOutpost1)
-"C" = (/obj/machinery/biogenerator,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
-"D" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/unajerky,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/random_multi/single_item/sfr_headset,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
-"E" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/machinery/seed_extractor,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
-"F" = (/obj/structure/bed/chair/wood{tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1},/turf/simulated/floor/wood,/area/submap/DJOutpost1)
-"G" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
-"H" = (/obj/structure/table/woodentable,/obj/item/weapon/material/knife/machete/hatchet,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/material/minihoe,/obj/item/device/analyzer/plant_analyzer,/obj/random_multi/single_item/sfr_headset,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
-"I" = (/obj/structure/undies_wardrobe,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
-"J" = (/obj/structure/table/rack,/obj/item/clothing/shoes/boots/winter,/obj/item/clothing/suit/storage/hooded/wintercoat,/obj/random_multi/single_item/sfr_headset,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
-"K" = (/obj/machinery/light/flamp,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
-"L" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 15; tag = "icon-sink (EAST)"},/turf/simulated/floor/wood,/area/submap/DJOutpost1)
-"M" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/clown,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
-"N" = (/obj/structure/table/rack,/obj/item/ammo_magazine/clip/c545/hunter,/obj/item/weapon/gun/projectile/shotgun/pump/rifle,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
-"O" = (/obj/structure/table/rack,/obj/item/device/gps/on{gps_tag = "Sif Free Radio"},/obj/item/device/flashlight/lantern,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
-"P" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"C" = (/obj/machinery/door/airlock/glass,/obj/item/device/gps/internal/poi,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"D" = (/obj/machinery/biogenerator,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"E" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/unajerky,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/random_multi/single_item/sfr_headset,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"F" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/machinery/seed_extractor,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"G" = (/obj/structure/bed/chair/wood{tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1},/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"H" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"I" = (/obj/structure/table/woodentable,/obj/item/weapon/material/knife/machete/hatchet,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/material/minihoe,/obj/item/device/analyzer/plant_analyzer,/obj/random_multi/single_item/sfr_headset,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"J" = (/obj/structure/undies_wardrobe,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"K" = (/obj/structure/table/rack,/obj/item/clothing/shoes/boots/winter,/obj/item/clothing/suit/storage/hooded/wintercoat,/obj/random_multi/single_item/sfr_headset,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"L" = (/obj/machinery/light/flamp,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"M" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 15; tag = "icon-sink (EAST)"},/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"N" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/clown,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"O" = (/obj/structure/table/rack,/obj/item/ammo_magazine/clip/c545/hunter,/obj/item/weapon/gun/projectile/shotgun/pump/rifle,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"P" = (/obj/structure/table/rack,/obj/item/device/flashlight/lantern,/obj/item/device/gps{gps_tag = "Sif Free Radio"},/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"Q" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
(1,1,1) = {"
aaaaaaaaaaaaaaaa
@@ -49,12 +50,12 @@ abbehebeeeeibbaa
adehjekeeelemnoa
abpeeqbeeelrsbta
abuvewbeexyzAbBa
-abbbbbbkbbbbbbaa
-abpeeeeeeeeeCbaa
-abDeeeeeeeeeEbaa
-adFeebbGbbeeHdaa
-abbIebJeKbeLbbaa
-aabbMbNeObPbbaaa
-aaabdbbGbbdbaaaa
+abbbbbbCbbbbbbaa
+abpeeeeeeeeeDbaa
+abEeeeeeeeeeFbaa
+adGeebbHbbeeIdaa
+abbJebKeLbeMbbaa
+aabbNbOePbQbbaaa
+aaabdbbHbbdbaaaa
aaaaaaaaaaaaaaaa
"}
diff --git a/maps/~map_system/maps.dm b/maps/~map_system/maps.dm
index 986ade2162..8b4a4ab8ab 100644
--- a/maps/~map_system/maps.dm
+++ b/maps/~map_system/maps.dm
@@ -142,6 +142,10 @@ var/list/all_maps = list()
else
return list()
+/datum/map/proc/get_zlevel_name(var/index)
+ var/datum/map_z_level/Z = zlevels["[index]"]
+ return Z.name
+
// Another way to setup the map datum that can be convenient. Just declare all your zlevels as subtypes of a common
// subtype of /datum/map_z_level and set zlevel_datum_type on /datum/map to have the lists auto-initialized.