diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index e05302cfc1..dde3b7f6f7 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -28,6 +28,7 @@
sharp = 1
var/excavation_amount = 200
+ var/destroy_artefacts = FALSE // some mining tools will destroy artefacts completely while avoiding side-effects.
/obj/item/weapon/pickaxe/silver
name = "silver pickaxe"
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index c253301d1a..ae388a717d 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -24,7 +24,6 @@ var/list/mining_overlay_cache = list()
var/sand_dug
var/mined_ore = 0
var/last_act = 0
- var/emitter_blasts_taken = 0 // EMITTER MINING! Muhehe.
var/overlay_detail
var/datum/geosample/geologic_data
@@ -208,14 +207,22 @@ var/list/mining_overlay_cache = list()
new oretype(src)
resources[ore] = 0
-/turf/simulated/mineral/bullet_act(var/obj/item/projectile/Proj)
+/turf/simulated/mineral/bullet_act(var/obj/item/projectile/Proj) // only emitters for now
+ if(Proj.excavation_amount)
+ var/newDepth = excavation_level + Proj.excavation_amount // Used commonly below
+ if(newDepth >= 200) // first, if the turf is completely drilled then don't bother checking for finds and just drill it
+ GetDrilled(0)
- // Emitter blasts
- if(istype(Proj, /obj/item/projectile/beam/emitter) || istype(Proj, /obj/item/projectile/beam/heavylaser/fakeemitter))
- emitter_blasts_taken++
- if(emitter_blasts_taken > 2) // 3 blasts per tile
- mined_ore = 1
- GetDrilled()
+ //destroy any archaeological finds
+ if(finds && finds.len)
+ var/datum/find/F = finds[1]
+ if(newDepth > F.excavation_required) // Digging too deep with something as clumsy or random as a blaster will destroy artefacts
+ finds.Remove(finds[1])
+ if(prob(50))
+ artifact_debris()
+
+ excavation_level += Proj.excavation_amount
+ update_archeo_overlays(Proj.excavation_amount)
/turf/simulated/mineral/Bumped(AM)
@@ -383,17 +390,9 @@ var/list/mining_overlay_cache = list()
var/datum/find/F = finds[1]
if(newDepth > F.excavation_required) // Digging too deep can break the item. At least you won't summon a Balrog (probably)
fail_message = ". [pick("There is a crunching noise","[W] collides with some different rock","Part of the rock face crumbles away","Something breaks under [W]")]"
-
+ wreckfinds(P.destroy_artefacts)
to_chat(user, "You start [P.drill_verb][fail_message].")
- if(fail_message && prob(90))
- if(prob(25))
- excavate_find(prob(5), finds[1])
- else if(prob(50))
- finds.Remove(finds[1])
- if(prob(50))
- artifact_debris()
-
if(do_after(user,P.digspeed))
if(finds && finds.len)
@@ -406,63 +405,14 @@ var/list/mining_overlay_cache = list()
to_chat(user, "You finish [P.drill_verb] \the [src].")
if(newDepth >= 200) // This means the rock is mined out fully
- var/obj/structure/boulder/B
- if(artifact_find)
- if( excavation_level > 0 || prob(15) )
- //boulder with an artifact inside
- B = new(src)
- if(artifact_find)
- B.artifact_find = artifact_find
- else
- artifact_debris(1)
- else if(prob(5))
- //empty boulder
- B = new(src)
-
- if(B)
+ if(P.destroy_artefacts)
GetDrilled(0)
else
- GetDrilled(1)
+ excavate_turf()
return
excavation_level += P.excavation_amount
- var/updateIcon = 0
-
- //archaeo overlays
- if(!archaeo_overlay && finds && finds.len)
- var/datum/find/F = finds[1]
- if(F.excavation_required <= excavation_level + F.view_range)
- cut_overlay(archaeo_overlay)
- archaeo_overlay = "overlay_archaeo[rand(1,3)]"
- add_overlay(archaeo_overlay)
-
- else if(archaeo_overlay && (!finds || !finds.len))
- cut_overlay(archaeo_overlay)
- archaeo_overlay = null
-
- //there's got to be a better way to do this
- var/update_excav_overlay = 0
- if(excavation_level >= 150)
- if(excavation_level - P.excavation_amount < 150)
- update_excav_overlay = 1
- else if(excavation_level >= 100)
- if(excavation_level - P.excavation_amount < 100)
- update_excav_overlay = 1
- else if(excavation_level >= 50)
- if(excavation_level - P.excavation_amount < 50)
- update_excav_overlay = 1
-
- //update overlays displaying excavation level
- if( !(excav_overlay && excavation_level > 0) || update_excav_overlay )
- var/excav_quadrant = round(excavation_level / 25) + 1
- if(excav_quadrant > 5)
- excav_quadrant = 5
- cut_overlay(excav_overlay)
- excav_overlay = "overlay_excv[excav_quadrant]_[rand(1,3)]"
- add_overlay(excav_overlay)
-
- if(updateIcon)
- update_icon()
+ update_archeo_overlays(P.excavation_amount)
//drop some rocks
next_rock += P.excavation_amount
@@ -475,6 +425,54 @@ var/list/mining_overlay_cache = list()
return attack_hand(user)
+/turf/simulated/mineral/proc/wreckfinds(var/destroy = FALSE)
+ if(!destroy && prob(90)) //nondestructive methods have a chance of letting you step away to not trash things
+ if(prob(25))
+ excavate_find(prob(5), finds[1])
+ else if(prob(50) || destroy) //destructive methods will always destroy finds, no bowls menacing with spikes for you
+ finds.Remove(finds[1])
+ if(prob(50))
+ artifact_debris()
+
+/turf/simulated/mineral/proc/update_archeo_overlays(var/excavation_amount = 0)
+ var/updateIcon = 0
+
+ //archaeo overlays
+ if(!archaeo_overlay && finds && finds.len)
+ var/datum/find/F = finds[1]
+ if(F.excavation_required <= excavation_level + F.view_range)
+ cut_overlay(archaeo_overlay)
+ archaeo_overlay = "overlay_archaeo[rand(1,3)]"
+ add_overlay(archaeo_overlay)
+
+ else if(archaeo_overlay && (!finds || !finds.len))
+ cut_overlay(archaeo_overlay)
+ archaeo_overlay = null
+
+ //there's got to be a better way to do this
+ var/update_excav_overlay = 0
+ if(excavation_level >= 150)
+ if(excavation_level - excavation_amount < 150)
+ update_excav_overlay = 1
+ else if(excavation_level >= 100)
+ if(excavation_level - excavation_amount < 100)
+ update_excav_overlay = 1
+ else if(excavation_level >= 50)
+ if(excavation_level - excavation_amount < 50)
+ update_excav_overlay = 1
+
+ //update overlays displaying excavation level
+ if( !(excav_overlay && excavation_level > 0) || update_excav_overlay )
+ var/excav_quadrant = round(excavation_level / 25) + 1
+ if(excav_quadrant > 5)
+ excav_quadrant = 5
+ cut_overlay(excav_overlay)
+ excav_overlay = "overlay_excv[excav_quadrant]_[rand(1,3)]"
+ add_overlay(excav_overlay)
+
+ if(updateIcon)
+ update_icon()
+
/turf/simulated/mineral/proc/clear_ore_effects()
for(var/obj/effect/mineral/M in contents)
qdel(M)
@@ -489,6 +487,26 @@ var/list/mining_overlay_cache = list()
O.geologic_data = geologic_data
return O
+/turf/simulated/mineral/proc/excavate_turf()
+ var/obj/structure/boulder/B
+ if(artifact_find)
+ if( excavation_level > 0 || prob(15) )
+ //boulder with an artifact inside
+ B = new(src)
+ if(artifact_find)
+ B.artifact_find = artifact_find
+ else
+ artifact_debris(1)
+ else if(prob(5))
+ //empty boulder
+ B = new(src)
+
+ if(B)
+ GetDrilled(0)
+ else
+ GetDrilled(1)
+ return
+
/turf/simulated/mineral/proc/GetDrilled(var/artifact_fail = 0)
if(!density)
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index ed7fc4a1b1..9073ead831 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -63,6 +63,7 @@
icon_state = "emitter"
fire_sound = 'sound/weapons/emitter.ogg'
light_color = "#00CC33"
+ excavation_amount = 70 // 3 shots to mine a turf
muzzle_type = /obj/effect/projectile/muzzle/emitter
tracer_type = /obj/effect/projectile/tracer/emitter
@@ -118,6 +119,7 @@
fire_sound = 'sound/weapons/emitter.ogg'
damage = 0 // The actual damage is computed in /code/modules/power/singularity/emitter.dm
light_color = "#00CC33"
+ excavation_amount = 70 // 3 shots to mine a turf
muzzle_type = /obj/effect/projectile/muzzle/emitter
tracer_type = /obj/effect/projectile/tracer/emitter