diff --git a/code/datums/mapgen/planetary/BeachGenerator.dm b/code/datums/mapgen/planetary/BeachGenerator.dm
index 68c21cec7224..61118c27aaa5 100644
--- a/code/datums/mapgen/planetary/BeachGenerator.dm
+++ b/code/datums/mapgen/planetary/BeachGenerator.dm
@@ -113,7 +113,7 @@
)
mob_spawn_chance = 1
- feature_spawn_chance = 0.2
+ feature_spawn_chance = 1
feature_spawn_list = list(
/obj/effect/survey_point
)
@@ -163,8 +163,8 @@
/obj/structure/flora/rock/pile = 1,
/obj/structure/flora/ash/garden/seaweed = 1
)
- flora_spawn_chance = 1
- feature_spawn_chance = 0.2
+ flora_spawn_chance = 10
+ feature_spawn_chance = 1
feature_spawn_list = list(
/obj/effect/survey_point
)
@@ -182,7 +182,7 @@
/mob/living/simple_animal/hostile/bear/cave = 5,
/mob/living/simple_animal/hostile/asteroid/lobstrosity/beach = 1,
)
- feature_spawn_chance = 0.2
+ feature_spawn_chance = 1
feature_spawn_list = list(
/obj/effect/survey_point
)
diff --git a/code/datums/mapgen/planetary/JungleGenerator.dm b/code/datums/mapgen/planetary/JungleGenerator.dm
index ed9a676acb17..a5fc36ca000b 100644
--- a/code/datums/mapgen/planetary/JungleGenerator.dm
+++ b/code/datums/mapgen/planetary/JungleGenerator.dm
@@ -256,6 +256,6 @@
)
feature_spawn_chance = 2
feature_spawn_list = list(
- /obj/item/rod_of_asclepius = 0.1,
- /obj/effect/survey_point = 10
+ /obj/item/rod_of_asclepius = 1,
+ /obj/effect/survey_point = 100
)
diff --git a/code/datums/mapgen/planetary/LavaGenerator.dm b/code/datums/mapgen/planetary/LavaGenerator.dm
index ed3657ca1370..806bed5d5dc6 100644
--- a/code/datums/mapgen/planetary/LavaGenerator.dm
+++ b/code/datums/mapgen/planetary/LavaGenerator.dm
@@ -94,13 +94,13 @@
/obj/structure/flora/ash/fireblossom = 1,
/obj/structure/flora/ash/puce = 5,
)
- feature_spawn_chance = 0.6
+ feature_spawn_chance = 1
feature_spawn_list = list(
- /obj/effect/survey_point = 3,
- /obj/structure/flora/rock/hell = 5,
- /obj/structure/elite_tumor = 1,
- /obj/structure/geyser/random = 1,
- /obj/effect/spawner/lootdrop/anomaly/lava = 0.5
+ /obj/effect/survey_point = 30,
+ /obj/structure/flora/rock/hell = 50,
+ /obj/structure/elite_tumor = 10,
+ /obj/structure/geyser/random = 10,
+ /obj/effect/spawner/lootdrop/anomaly/lava = 5
)
mob_spawn_chance = 4
@@ -160,10 +160,10 @@
)
feature_spawn_chance = 10
feature_spawn_list = list(
- /obj/structure/flora/tree/dead/barren = 1,
- /obj/structure/flora/tree/dead/tall/grey = 1,
- /obj/effect/survey_point = 0.5,
- /obj/effect/spawner/lootdrop/anomaly/lava = 0.1
+ /obj/structure/flora/tree/dead/barren = 10,
+ /obj/structure/flora/tree/dead/tall/grey = 10,
+ /obj/effect/survey_point = 5,
+ /obj/effect/spawner/lootdrop/anomaly/lava = 1
)
/datum/biome/lavaland/plains/dense/mixed
diff --git a/code/datums/mapgen/planetary/RockGenerator.dm b/code/datums/mapgen/planetary/RockGenerator.dm
index c98baa10fcef..502b45fbffe5 100644
--- a/code/datums/mapgen/planetary/RockGenerator.dm
+++ b/code/datums/mapgen/planetary/RockGenerator.dm
@@ -85,11 +85,11 @@
feature_spawn_chance = 0.2
feature_spawn_list = list(
- /obj/structure/geyser/random = 1,
- /obj/structure/elite_tumor = 2,
- /obj/effect/survey_point = 4,
- /obj/effect/spawner/lootdrop/anomaly/rock = 1,
- /obj/effect/spawner/lootdrop/anomaly/big = 0.1 //get out of here stalker
+ /obj/structure/geyser/random = 10,
+ /obj/structure/elite_tumor = 20,
+ /obj/effect/survey_point = 40,
+ /obj/effect/spawner/lootdrop/anomaly/rock = 10,
+ /obj/effect/spawner/lootdrop/anomaly/big = 1 //get out of here stalker
)
flora_spawn_chance = 5
diff --git a/code/datums/mapgen/planetary/SnowGenerator.dm b/code/datums/mapgen/planetary/SnowGenerator.dm
index 2960fca6351d..5c0c54c8aeb4 100644
--- a/code/datums/mapgen/planetary/SnowGenerator.dm
+++ b/code/datums/mapgen/planetary/SnowGenerator.dm
@@ -316,13 +316,13 @@
feature_spawn_chance = 0.4
feature_spawn_list = list(
/obj/effect/survey_point = 4,
- /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 3,
- /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 5,
- /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 0.6,
- /obj/structure/spawner/ice_moon/demonic_portal/extreme_threat = 0.2,
- /obj/structure/spawner/ice_moon = 3,
- /obj/structure/spawner/ice_moon/polarbear = 3,
- /obj/effect/spawner/lootdrop/anomaly/ice/cave = 1
+ /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 30,
+ /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 50,
+ /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 6,
+ /obj/structure/spawner/ice_moon/demonic_portal/extreme_threat = 2,
+ /obj/structure/spawner/ice_moon = 30,
+ /obj/structure/spawner/ice_moon/polarbear = 30,
+ /obj/effect/spawner/lootdrop/anomaly/ice/cave = 10
)
/datum/biome/cave/volcanic/lava
diff --git a/code/game/objects/effects/survey_points.dm b/code/game/objects/effects/survey_points.dm
index 1c8e0340b191..15ddb272f92f 100644
--- a/code/game/objects/effects/survey_points.dm
+++ b/code/game/objects/effects/survey_points.dm
@@ -1,12 +1,16 @@
+GLOBAL_LIST_EMPTY(active_survey_points)
+
/obj/effect/survey_point //sure effects shouldn't be attackable, sue me.
name = "Survey Point"
desc = "A location of particular survey value."
icon = 'icons/effects/landmarks_static.dmi'
icon_state = "x"
+ alpha = 0
var/research_value
/obj/effect/survey_point/Initialize()
. = ..()
+ GLOB.active_survey_points += src
research_value = rand(750, 1500)
/obj/effect/survey_point/examine(mob/user)
@@ -22,8 +26,6 @@
var/turf/user_turf = get_turf(user)
-
-
if(!scangler.pack.powered)
to_chat(user, "Insufficient power to scan [src]")
return
@@ -31,7 +33,7 @@
to_chat(user, "You begin to scan [src] with [scangler].")
scangler.active = TRUE
- if(do_after(user, scangler.survey_delay, TRUE))
+ if(do_after(user, scangler.survey_delay, TRUE)) //note to self: refactor this into 3 procs - an attack by, do_scan, and drop_reward
flick(icon_state + "-print", item)
playsound(src, 'sound/machines/whirr_beep.ogg', 20)
user_turf.visible_message("Data recorded and enscribed to research packet.")
@@ -67,3 +69,7 @@
var/obj/item/research_notes/research = user.get_inactive_held_item()
research.merge(result)
return
+
+/obj/effect/survey_point/Destroy()
+ . = ..()
+ GLOB.active_survey_points -= src
diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm
index 12f91f99fb8c..3c47a36eda60 100644
--- a/code/game/objects/items/pinpointer.dm
+++ b/code/game/objects/items/pinpointer.dm
@@ -186,6 +186,60 @@
size = "small"
return "pinondirect[size]"
+//this makes me feel dirty.
+/obj/item/pinpointer/survey_data
+ name = "survey pinpointer"
+ desc = "A small electronic handheld tuned to detect planetary irregularities"
+
+/obj/item/pinpointer/survey_data/proc/trackable(mob/living/user)
+ var/turf/here = get_turf(src)
+ if((user.z == 0 || user.virtual_z() == here.virtual_z()))
+ var/turf/there = get_turf(user)
+ return (user.z != 0 || (there && ((there.virtual_z() == here.virtual_z()))))
+ return FALSE
+
+/obj/item/pinpointer/survey_data/attack_self(mob/living/user)
+ var/list/possible_targets
+ if(active)
+ toggle_on()
+ user.visible_message("[user] deactivates [user.p_their()] pinpointer.", "You deactivate your pinpointer.")
+ return
+ for(var/i in GLOB.active_survey_points)
+ var/obj/effect/survey_point/my_target = i
+ if(!trackable(my_target))
+ continue
+ possible_targets += my_target
+ if(!possible_targets.len)
+ user.visible_message("[user]'s pinpointer fails to detect a signal.", "Your pinpointer fails to detect a signal.")
+ return
+
+ target = get_closest_target(possible_targets)
+ toggle_on()
+ user.visible_message("[user] activates [user.p_their()] pinpointer.", "You activate your pinpointer.")
+
+/obj/item/pinpointer/survey_data/proc/get_closest_target(var/list/targets)
+ var/final_target
+ for(var/obj/effect/survey_point/targetee in targets)
+ if(targetee)
+ if(get_dist(src,targetee) < get_dist(src,final_target))
+ final_target = targetee
+ return final_target
+
+/obj/item/pinpointer/survey_data/get_direction_icon(here, there)
+ var/size = ""
+ if(here == there)
+ size = "small"
+ else
+ switch(get_dist(here, there))
+ if(1 to 4)
+ size = "xtrlarge"
+ if(5 to 16)
+ size = "large"
+ //17 through 28 use the normal pinion, "pinondirect"
+ if(29 to INFINITY)
+ size = "small"
+ return "pinondirect[size]"
+
/obj/item/pinpointer/pair
name = "pair pinpointer"
desc = "A handheld tracking device that locks onto its other half of the matching pair."
diff --git a/code/game/objects/items/survery_handheld.dm b/code/game/objects/items/survery_handheld.dm
index e24c9ff9008b..37ab8278e993 100644
--- a/code/game/objects/items/survery_handheld.dm
+++ b/code/game/objects/items/survery_handheld.dm
@@ -117,6 +117,13 @@
. += "Alt-click [src] to activate the barometer function."
/obj/item/attachment/survey_scanner/attack_self(mob/user)
+ playsound(src, 'sound/effects/ping.ogg', 75)
+ for(var/obj/effect/survey_point/revealed in range(2, src))
+ revealed.alpha = 255 //could use an effect but I'm lazy
+ src.pack.deductcharge(usecost / 2)
+
+
+/obj/item/attachment/survey_scanner/AltClick(mob/living/user)
add_fingerprint(user)
if (user.stat || user.is_blind())