diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm
index 02a93ee610..dbee8bd677 100644
--- a/code/game/mecha/equipment/tools/mining_tools.dm
+++ b/code/game/mecha/equipment/tools/mining_tools.dm
@@ -106,36 +106,19 @@
icon_state = "mecha_analyzer"
selectable = 0
equip_cooldown = 30
- var/scanning = 0
+ var/scanning_time = 0
/obj/item/mecha_parts/mecha_equipment/mining_scanner/New()
..()
START_PROCESSING(SSobj, src)
-/obj/item/mecha_parts/mecha_equipment/mining_scanner/attach(obj/mecha/M)
- ..()
- M.occupant_sight_flags |= SEE_TURFS
- if(M.occupant)
- M.occupant.update_sight()
-
-/obj/item/mecha_parts/mecha_equipment/mining_scanner/detach()
- chassis.occupant_sight_flags &= ~SEE_TURFS
- if(chassis.occupant)
- chassis.occupant.update_sight()
- return ..()
-
/obj/item/mecha_parts/mecha_equipment/mining_scanner/process()
if(!loc)
STOP_PROCESSING(SSobj, src)
qdel(src)
- if(scanning)
- return
- if(istype(loc,/obj/mecha/working))
+ if(istype(loc,/obj/mecha/working) && scanning_time <= world.time)
var/obj/mecha/working/mecha = loc
if(!mecha.occupant)
return
- var/list/L = list(mecha.occupant)
- scanning = 1
- mineral_scan_pulse(L,get_turf(loc))
- spawn(equip_cooldown)
- scanning = 0
+ scanning_time = world.time + equip_cooldown
+ mineral_scan_pulse(get_turf(src))
diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm
index 54f3ad5ad5..708427a11a 100644
--- a/code/game/turfs/simulated/minerals.dm
+++ b/code/game/turfs/simulated/minerals.dm
@@ -73,6 +73,8 @@
for(i in 1 to mineralAmt)
new mineralType(src)
SSblackbox.add_details("ore_mined",mineralType)
+ for(var/obj/effect/temp_visual/mining_overlay/M in src)
+ qdel(M)
ChangeTurf(turf_type, defer_change)
addtimer(CALLBACK(src, .proc/AfterChange), 1, TIMER_UNIQUE)
playsound(src, 'sound/effects/break_stone.ogg', 50, 1) //beautiful destruction
diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm
index 6a9ac41a0d..2f70c3bfdf 100644
--- a/code/modules/clothing/glasses/engine_goggles.dm
+++ b/code/modules/clothing/glasses/engine_goggles.dm
@@ -7,25 +7,34 @@
actions_types = list(/datum/action/item_action/toggle_mode)
origin_tech = "materials=3;magnets=3;engineering=3;plasmatech=3"
- var/mode = 0 //0 - regular mesons mode 1 - t-ray mode
+ mode = FALSE //FALSE - regular mesons mode TRUE - t-ray mode
var/range = 1
-/obj/item/clothing/glasses/meson/engine/attack_self(mob/user)
+/obj/item/clothing/glasses/meson/engine/toggle_mode(mob/user, voluntary)
+ var/turf/T = get_turf(src)
+ if(T && T.z == ZLEVEL_MINING && mode)
+ if(picked_excuse)
+ to_chat(user, "Due to [picked_excuse], the [name] cannot currently be swapped to \[Meson] mode.")
+ return
mode = !mode
if(mode)
- START_PROCESSING(SSobj, src)
vision_flags = 0
darkness_view = 2
invis_view = SEE_INVISIBLE_LIVING
lighting_alpha = null
- to_chat(user, "You toggle the goggles' scanning mode to \[T-Ray].")
+ if(voluntary)
+ to_chat(user, "You toggle the goggles' scanning mode to \[T-Ray].")
+ else
+ to_chat(user, "The goggles abruptly toggle to \[T-Ray] mode!")
else
- STOP_PROCESSING(SSobj, src)
vision_flags = SEE_TURFS
darkness_view = 1
lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE
- to_chat(loc, "You toggle the goggles' scanning mode to \[Meson].")
+ if(voluntary)
+ to_chat(user, "You toggle the goggles' scanning mode to \[Meson].")
+ else
+ to_chat(user, "The goggles abruptly toggle to \[Meson] mode!")
if(ishuman(user))
var/mob/living/carbon/human/H = user
@@ -37,8 +46,14 @@
var/datum/action/A = X
A.UpdateButtonIcon()
+/obj/item/clothing/glasses/meson/engine/attack_self(mob/user)
+ toggle_mode(user, TRUE)
+
/obj/item/clothing/glasses/meson/engine/process()
if(!mode)
+ var/turf/T = get_turf(src)
+ if(T && T.z == ZLEVEL_MINING)
+ toggle_mode(loc)
return
if(!ishuman(loc))
@@ -47,7 +62,6 @@
var/mob/living/carbon/human/user = loc
if(user.glasses != src)
return
-
scan()
/obj/item/clothing/glasses/meson/engine/proc/scan()
@@ -89,13 +103,17 @@
icon_state = "trayson-tray_off"
origin_tech = "materials=3;magnets=2;engineering=2"
- mode = 1
- var/on = 0
+ mode = TRUE
+ var/on = FALSE
vision_flags = 0
darkness_view = 2
invis_view = SEE_INVISIBLE_LIVING
range = 2
+/obj/item/clothing/glasses/meson/engine/tray/Initialize()
+ . = ..()
+ picked_excuse = null
+
/obj/item/clothing/glasses/meson/engine/tray/process()
if(!on)
return
@@ -108,15 +126,10 @@
if(user.glasses == src)
user.update_inv_glasses()
-/obj/item/clothing/glasses/meson/engine/tray/attack_self(mob/user)
+/obj/item/clothing/glasses/meson/engine/tray/toggle_mode(mob/user, voluntary)
on = !on
- if(on)
- START_PROCESSING(SSobj, src)
- to_chat(user, "You turn the goggles on.")
- else
- STOP_PROCESSING(SSobj, src)
- to_chat(user, "You turn the goggles off.")
+ to_chat(user, "[voluntary ? "You turn the goggles":"The goggles turn"] [on ? "on":"off"][voluntary ? ".":"!"]")
update_icon()
for(var/X in actions)
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index 2f6089bc56..1cc0cc6163 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -31,14 +31,60 @@
/obj/item/clothing/glasses/meson
name = "Optical Meson Scanner"
- desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition."
+ desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting conditions."
icon_state = "meson"
item_state = "meson"
origin_tech = "magnets=1;engineering=2"
darkness_view = 2
vision_flags = SEE_TURFS
- lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE
+ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
glass_colour_type = /datum/client_colour/glass_colour/lightgreen
+ var/static/list/meson_mining_failure_excuses = list("seismic activity", "excessive lava", "ambient radiation", "electromagnetic storms", "bluespace disruption", \
+ "gravity", "dust", "dense rock", "ash", "badly understood science", "radiant heat")
+ var/picked_excuse
+ var/mode = FALSE //if FALSE, is in normal meson mode.
+
+/obj/item/clothing/glasses/meson/Initialize()
+ . = ..()
+ picked_excuse = pick(meson_mining_failure_excuses)
+ START_PROCESSING(SSobj, src)
+
+/obj/item/clothing/glasses/meson/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ return ..()
+
+/obj/item/clothing/glasses/meson/examine(mob/user)
+ ..()
+ var/turf/T = get_turf(src)
+ if(T && T.z == ZLEVEL_MINING && mode && picked_excuse)
+ to_chat(user, "Due to [picked_excuse], these Meson Scanners will not be able to display terrain layouts in this area.")
+
+/obj/item/clothing/glasses/meson/proc/toggle_mode(mob/user)
+ if(vision_flags & SEE_TURFS)
+ mode = TRUE
+ vision_flags &= ~SEE_TURFS
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(picked_excuse)
+ to_chat(H, "Due to [picked_excuse], your Meson Scanners will not be able to display terrain layouts in this area.")
+ if(H.glasses == src)
+ H.update_sight()
+ else if(!(vision_flags & SEE_TURFS))
+ mode = FALSE
+ vision_flags |= SEE_TURFS
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ to_chat(H, "Your Meson Scanners have reactivated.")
+ if(H.glasses == src)
+ H.update_sight()
+
+/obj/item/clothing/glasses/meson/process()
+ var/turf/T = get_turf(src)
+ if(T && T.z == ZLEVEL_MINING)
+ if(!mode)
+ toggle_mode(loc)
+ else if(mode)
+ toggle_mode(loc)
/obj/item/clothing/glasses/meson/night
name = "Night Vision Optical Meson Scanner"
@@ -47,7 +93,7 @@
item_state = "nvgmeson"
origin_tech = "magnets=4;engineering=5;plasmatech=4"
darkness_view = 8
- lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
+ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
glass_colour_type = /datum/client_colour/glass_colour/green
/obj/item/clothing/glasses/meson/gar
diff --git a/code/modules/mining/equipment.dm b/code/modules/mining/equipment.dm
index f33f73f7c6..46982a1bbf 100644
--- a/code/modules/mining/equipment.dm
+++ b/code/modules/mining/equipment.dm
@@ -345,28 +345,23 @@
/**********************Mining Scanners**********************/
/obj/item/device/mining_scanner
- desc = "A scanner that checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results."
+ desc = "A scanner that checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations."
name = "manual mining scanner"
icon_state = "mining1"
item_state = "analyzer"
w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
slot_flags = SLOT_BELT
- var/cooldown = 0
+ var/cooldown = 35
+ var/current_cooldown = 0
origin_tech = "engineering=1;magnets=1"
/obj/item/device/mining_scanner/attack_self(mob/user)
if(!user.client)
return
- if(!cooldown)
- cooldown = TRUE
- addtimer(CALLBACK(src, .proc/clear_cooldown), 40)
- var/list/mobs = list()
- mobs |= user
- mineral_scan_pulse(mobs, get_turf(user))
-
-/obj/item/device/mining_scanner/proc/clear_cooldown()
- cooldown = FALSE
+ if(current_cooldown <= world.time)
+ current_cooldown = world.time + cooldown
+ mineral_scan_pulse(get_turf(user))
//Debug item to identify all ore spread quickly
@@ -379,7 +374,7 @@
qdel(src)
/obj/item/device/t_scanner/adv_mining_scanner
- desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear meson scanners for optimal results. This one has an extended range."
+ desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. This one has an extended range."
name = "advanced automatic mining scanner"
icon_state = "mining0"
item_state = "analyzer"
@@ -387,77 +382,47 @@
flags = CONDUCT
slot_flags = SLOT_BELT
var/cooldown = 35
- var/on_cooldown = 0
+ var/current_cooldown = 0
var/range = 7
- var/meson = TRUE
origin_tech = "engineering=3;magnets=3"
-/obj/item/device/t_scanner/adv_mining_scanner/material
- meson = FALSE
- desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results. This one has an extended range."
-
/obj/item/device/t_scanner/adv_mining_scanner/lesser
name = "automatic mining scanner"
- desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear meson scanners for optimal results."
+ desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations."
range = 4
cooldown = 50
-/obj/item/device/t_scanner/adv_mining_scanner/lesser/material
- desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results."
- meson = FALSE
-
/obj/item/device/t_scanner/adv_mining_scanner/scan()
- if(!on_cooldown)
- on_cooldown = 1
- spawn(cooldown)
- on_cooldown = 0
+ if(current_cooldown <= world.time)
+ current_cooldown = world.time + cooldown
var/turf/t = get_turf(src)
- var/list/mobs = recursive_mob_check(t, 1,0,0)
- if(!mobs.len)
- return
- if(meson)
- mineral_scan_pulse(mobs, t, range)
- else
- mineral_scan_pulse_material(mobs, t, range)
+ mineral_scan_pulse(t, range)
-//For use with mesons
-/proc/mineral_scan_pulse(list/mobs, turf/T, range = world.view)
+/proc/mineral_scan_pulse(turf/T, range = world.view)
var/list/minerals = list()
for(var/turf/closed/mineral/M in range(range, T))
if(M.scan_state)
minerals += M
- if(minerals.len)
- for(var/mob/user in mobs)
- if(user.client)
- var/client/C = user.client
- for(var/turf/closed/mineral/M in minerals)
- var/turf/F = get_turf(M)
- var/image/I = image('icons/turf/smoothrocks.dmi', loc = F, icon_state = M.scan_state, layer = FLASH_LAYER)
- I.plane = FULLSCREEN_PLANE
- C.images += I
- spawn(30)
- if(C)
- C.images -= I
-
-//For use with material scanners
-/proc/mineral_scan_pulse_material(list/mobs, turf/T, range = world.view)
- var/list/minerals = list()
- for(var/turf/closed/mineral/M in range(range, T))
- if(M.scan_state)
- minerals += M
- if(minerals.len)
+ if(LAZYLEN(minerals))
for(var/turf/closed/mineral/M in minerals)
+ var/obj/effect/temp_visual/mining_overlay/oldC = locate(/obj/effect/temp_visual/mining_overlay) in M
+ if(oldC)
+ qdel(oldC)
var/obj/effect/temp_visual/mining_overlay/C = new /obj/effect/temp_visual/mining_overlay(M)
C.icon_state = M.scan_state
/obj/effect/temp_visual/mining_overlay
+ plane = FULLSCREEN_PLANE
layer = FLASH_LAYER
- icon = 'icons/turf/smoothrocks.dmi'
- anchored = 1
- mouse_opacity = 0
- duration = 30
- pixel_x = -4
- pixel_y = -4
+ icon = 'icons/effects/ore_visuals.dmi'
+ appearance_flags = 0 //to avoid having TILE_BOUND in the flags, so that the 480x480 icon states let you see it no matter where you are
+ duration = 35
+ pixel_x = -224
+ pixel_y = -224
+
+/obj/effect/temp_visual/mining_overlay/Initialize()
+ . = ..()
+ animate(src, alpha = 0, time = duration, easing = EASE_IN)
/**********************Xeno Warning Sign**********************/
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index ae0ad90dfe..371fb11fec 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -19,7 +19,7 @@
new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/weapon/hivelordstabilizer, 400),
new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400),
new /datum/data/mining_equipment("Shelter Capsule", /obj/item/weapon/survivalcapsule, 400),
- new /datum/data/mining_equipment("GAR scanners", /obj/item/clothing/glasses/meson/gar, 500),
+ new /datum/data/mining_equipment("GAR Meson Scanners", /obj/item/clothing/glasses/meson/gar, 500),
new /datum/data/mining_equipment("Explorer's Webbing", /obj/item/weapon/storage/belt/mining, 500),
new /datum/data/mining_equipment("Survival Medipen", /obj/item/weapon/reagent_containers/hypospray/medipen/survival, 500),
new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/weapon/storage/firstaid/brute, 600),
diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm
index 67b29af1e4..7ee5ed51c7 100644
--- a/code/modules/mining/minebot.dm
+++ b/code/modules/mining/minebot.dm
@@ -44,7 +44,6 @@
var/light_on = 0
var/datum/action/innate/minedrone/toggle_light/toggle_light_action
- var/datum/action/innate/minedrone/toggle_meson_vision/toggle_meson_vision_action
var/datum/action/innate/minedrone/toggle_mode/toggle_mode_action
var/datum/action/innate/minedrone/dump_ore/dump_ore_action
@@ -52,8 +51,6 @@
..()
toggle_light_action = new()
toggle_light_action.Grant(src)
- toggle_meson_vision_action = new()
- toggle_meson_vision_action.Grant(src)
toggle_mode_action = new()
toggle_mode_action.Grant(src)
dump_ore_action = new()
@@ -189,23 +186,6 @@
user.light_on = !user.light_on
to_chat(user, "You toggle your light [user.light_on ? "on" : "off"].")
-/datum/action/innate/minedrone/toggle_meson_vision
- name = "Toggle Meson Vision"
- button_icon_state = "meson"
-
-/datum/action/innate/minedrone/toggle_meson_vision/Activate()
- var/mob/living/simple_animal/hostile/mining_drone/user = owner
- if(user.sight & SEE_TURFS)
- user.sight &= ~SEE_TURFS
- user.lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE
- else
- user.sight |= SEE_TURFS
- user.lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE
-
- user.sync_lighting_plane_alpha()
-
- to_chat(user, "You toggle your meson vision [(user.sight & SEE_TURFS) ? "on" : "off"].")
-
/datum/action/innate/minedrone/toggle_mode
name = "Toggle Mode"
button_icon_state = "mech_cycle_equip_off"
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 7ab7fa928d..cdbb5e77aa 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -526,7 +526,6 @@
name = "Miner"
basic_modules = list(
/obj/item/device/assembly/flash/cyborg,
- /obj/item/borg/sight/meson,
/obj/item/weapon/storage/bag/ore/cyborg,
/obj/item/weapon/pickaxe/drill/cyborg,
/obj/item/weapon/shovel,
diff --git a/icons/effects/ore_visuals.dmi b/icons/effects/ore_visuals.dmi
new file mode 100644
index 0000000000..30a05b043a
Binary files /dev/null and b/icons/effects/ore_visuals.dmi differ
diff --git a/icons/turf/mining.dmi b/icons/turf/mining.dmi
index 66c07a8146..8770f77cd9 100644
Binary files a/icons/turf/mining.dmi and b/icons/turf/mining.dmi differ
diff --git a/icons/turf/smoothrocks.dmi b/icons/turf/smoothrocks.dmi
index a7e9864617..ba2bbce955 100644
Binary files a/icons/turf/smoothrocks.dmi and b/icons/turf/smoothrocks.dmi differ