diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 39bdb360f06..0a719f111c1 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -1,8 +1,7 @@
/**********************Mineral deposits**************************/
-
-datum/controller/game_controller/var/list/artifact_spawning_turfs = list()
-var/list/artifact_spawn = list() // Runtime fix for geometry loading before controller is instantiated.
+/datum/controller/game_controller
+ var/list/artifact_spawning_turfs = list()
/turf/simulated/mineral //wall piece
name = "Rock"
diff --git a/code/modules/research/xenoarchaeology/misc.dm b/code/modules/research/xenoarchaeology/misc.dm
index 438513c2ab6..19336a07199 100644
--- a/code/modules/research/xenoarchaeology/misc.dm
+++ b/code/modules/research/xenoarchaeology/misc.dm
@@ -4,28 +4,32 @@
proc/SetupXenoarch()
for(var/turf/simulated/mineral/M in block(locate(1,1,1), locate(world.maxx, world.maxy, world.maxz)))
- if(!M.geologic_data)
- M.geologic_data = new/datum/geosample(M)
-
if(!prob(XENOARCH_SPAWN_CHANCE))
continue
var/digsite = get_random_digsite_type()
var/list/processed_turfs = list()
var/list/turfs_to_process = list(M)
- for(var/turf/simulated/mineral/archeo_turf in turfs_to_process)
+
+ while(turfs_to_process.len)
+ var/turf/simulated/mineral/archeo_turf = turfs_to_process[1]
for(var/turf/simulated/mineral/T in orange(1, archeo_turf))
if(T.finds)
continue
+
if(T in processed_turfs)
continue
+
if(prob(XENOARCH_SPREAD_CHANCE))
turfs_to_process.Add(T)
+ turfs_to_process.Remove(archeo_turf)
processed_turfs.Add(archeo_turf)
- if(!archeo_turf.finds)
+
+ if(isnull(archeo_turf.finds))
archeo_turf.finds = list()
+
if(prob(50))
archeo_turf.finds.Add(new /datum/find(digsite, rand(5,95)))
else if(prob(75))
@@ -38,6 +42,7 @@ proc/SetupXenoarch()
//sometimes a find will be close enough to the surface to show
var/datum/find/F = archeo_turf.finds[1]
+
if(F.excavation_required <= F.view_range)
archeo_turf.archaeo_overlay = "overlay_archaeo[rand(1,3)]"
archeo_turf.overlays += archeo_turf.archaeo_overlay
@@ -45,8 +50,14 @@ proc/SetupXenoarch()
//dont create artifact machinery in animal or plant digsites, or if we already have one
if(!M.artifact_find && digsite != 1 && digsite != 2 && prob(ARTIFACT_SPAWN_CHANCE))
M.artifact_find = new()
- artifact_spawn.Add(src)
+ master_controller.artifact_spawning_turfs.Add(M)
+ if(isnull(M.geologic_data))
+ M.geologic_data = new/datum/geosample(M)
+
+#undef XENOARCH_SPAWN_CHANCE
+#undef XENOARCH_SPREAD_CHANCE
+#undef ARTIFACT_SPAWN_CHANCE
//---- Noticeboard
diff --git a/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm b/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm
index d20a8582574..eb62d485719 100644
--- a/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm
+++ b/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm
@@ -1,4 +1,3 @@
-
/obj/item/device/ano_scanner
name = "Alden-Saraspova counter"
desc = "Aids in triangulation of exotic particles."
@@ -13,36 +12,37 @@
var/last_scan_time = 0
var/scan_delay = 25
-/obj/item/device/ano_scanner/New()
- ..()
- spawn(0)
- scan()
-
/obj/item/device/ano_scanner/attack_self(var/mob/user as mob)
return src.interact(user)
/obj/item/device/ano_scanner/interact(var/mob/user as mob)
- var/message = "Background radiation levels detected."
- if(nearest_artifact_distance >= 0)
- message = "Exotic energy detected on wavelength '[nearest_artifact_id]' in a radius of [nearest_artifact_distance]m"
- user << "[message]"
if(world.time - last_scan_time >= scan_delay)
spawn(0)
scan()
-/obj/item/device/ano_scanner/proc/scan()
- set background = 1
+ var/message = "Background radiation levels detected."
+ if(nearest_artifact_distance >= 0)
+ message = "Exotic energy detected on wavelength '[nearest_artifact_id]' in a radius of [nearest_artifact_distance]m"
+
+ user << "[message]"
+
+/obj/item/device/ano_scanner/proc/scan()
last_scan_time = world.time
nearest_artifact_distance = -1
+
var/turf/cur_turf = get_turf(src)
- for(var/turf/simulated/mineral/T in master_controller.artifact_spawning_turfs)
- if(T.artifact_find)
- if(T.z == cur_turf.z)
- var/cur_dist = get_dist(cur_turf, T) * 2
- if( (nearest_artifact_distance < 0 || cur_dist < nearest_artifact_distance) && cur_dist <= T.artifact_find.artifact_detect_range )
- nearest_artifact_distance = cur_dist + rand() * 2 - 1
- nearest_artifact_id = T.artifact_find.artifact_id
- else
- master_controller.artifact_spawning_turfs.Remove(T)
+
+ if(master_controller) //Sanity check due to runtimes ~Z
+ for(var/turf/simulated/mineral/T in master_controller.artifact_spawning_turfs)
+ if(T.artifact_find)
+ if(T.z == cur_turf.z)
+ var/cur_dist = get_dist(cur_turf, T) * 2
+
+ if((nearest_artifact_distance < 0 || cur_dist < nearest_artifact_distance) && cur_dist <= T.artifact_find.artifact_detect_range)
+ nearest_artifact_distance = cur_dist + rand() * 2 - 1
+ nearest_artifact_id = T.artifact_find.artifact_id
+ else
+ master_controller.artifact_spawning_turfs.Remove(T)
+
cur_turf.visible_message("[src] clicks.")