diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index f63951e3ffe..e56fda1ff8c 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -94,9 +94,9 @@
qdel(src)
else if(istype(P, /obj/item/gun/energy/plasmacutter))
var/obj/item/gun/energy/plasmacutter/PC = P
- if(!PC.power_supply)
- to_chat(user, SPAN_WARNING("\The [src] doesn't have a power supply installed!"))
+ if(PC.check_power_and_message(user))
return
+ PC.use_resource(1)
playsound(get_turf(src), PC.fire_sound, 75, TRUE)
to_chat(user, SPAN_NOTICE("You dismantle the blueprint."))
new /obj/item/stack/material/steel(get_turf(src), 2)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 1e22261e75a..46704e8d9c7 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -875,3 +875,6 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
. += "Dismemberment: [edge ? "likely to dismember" : "unlikely to dismember"]
"
. += "Penetration: [armor_penetration]
"
. += "Throw Force: [throwforce]
"
+
+/obj/item/proc/use_resource(var/mob/user, var/use_amount)
+ return
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 255529192e6..5dd1f8c3791 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -465,6 +465,10 @@
to_chat(M, SPAN_NOTICE("You need more welding fuel to complete this task."))
return 0
+/obj/item/weldingtool/use_resource(mob/user, var/use_amount)
+ if(get_fuel() >= use_amount)
+ reagents.remove_reagent(/decl/reagent/fuel, use_amount)
+
//Returns whether or not the welding tool is currently on.
/obj/item/weldingtool/proc/isOn()
return src.welding
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 94a80e4afbd..3bfb2ba1d97 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -87,10 +87,14 @@
reset_girder()
else if(istype(W, /obj/item/gun/energy/plasmacutter))
- to_chat(user, "Now slicing apart the girder...")
- if(do_after(user,30/W.toolspeed))
- if(!src) return
- to_chat(user, "You slice apart the girder!")
+ var/obj/item/gun/energy/plasmacutter/PC = W
+ to_chat(user, SPAN_NOTICE("You start lining up \the [PC] to the joints of \the [src]..."))
+ if(do_after(user, 2 SECONDS))
+ if(!src)
+ return
+ playsound(loc, PC.fire_sound, 100, 1)
+ to_chat(user, SPAN_NOTICE("You blast apart the girder!"))
+ W.use_resource(user, 1)
dismantle()
else if(istype(W, /obj/item/melee/energy))
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 9f437346e4a..13091df3b39 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -102,10 +102,10 @@
qdel(src)
else if(istype(W, /obj/item/gun/energy/plasmacutter))
var/obj/item/gun/energy/plasmacutter/PC = W
- if(!PC.power_supply)
- to_chat(user, SPAN_WARNING("\The [src] doesn't have a power supply installed!"))
+ if(PC.check_power_and_message(user))
return
- playsound(get_turf(src), PC.fire_sound, 100, TRUE)
+ PC.use_resource(user, 1)
+ playsound(loc, PC.fire_sound, 100, TRUE)
new /obj/item/stack/rods(get_turf(src), destroyed ? 1 : 2)
qdel(src)
else if((W.isscrewdriver()) && (istype(loc, /turf/simulated) || anchored))
diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm
index dddcf20ddcb..c4e4478f9e0 100644
--- a/code/game/turfs/simulated/wall_attacks.dm
+++ b/code/game/turfs/simulated/wall_attacks.dm
@@ -204,10 +204,9 @@
cut_delay *= 0.7
else if(istype(W, /obj/item/gun/energy/plasmacutter))
var/obj/item/gun/energy/plasmacutter/PC = W
- if(!PC.power_supply)
- to_chat(user, SPAN_WARNING("\The [src] doesn't have a power supply installed!"))
+ if(PC.check_power_and_message(user))
return
- dismantle_sound = "zapping and melting"
+ dismantle_sound = PC.fire_sound
dismantle_verb = "slicing"
cut_delay *= 0.8
else if(istype(W,/obj/item/melee/energy))
@@ -243,10 +242,7 @@
cut_delay *= 1.5
if(dismantle_verb)
-
to_chat(user, SPAN_NOTICE("You begin [dismantle_verb] through the outer plating."))
- if(dismantle_sound)
- playsound(src, dismantle_sound, 100, 1)
if(cut_delay<0)
cut_delay = 1
@@ -254,14 +250,15 @@
if(!do_after(user,cut_delay/W.toolspeed))
return
-
//This prevents runtime errors if someone clicks the same wall more than once
if (!istype(src, /turf/simulated/wall))
return
- to_chat(user, SPAN_NOTICE("You remove the outer plating."))
+ if(dismantle_sound)
+ playsound(src, dismantle_sound, 100, 1)
+ W.use_resource(user, 1)
dismantle_wall()
- user.visible_message(SPAN_WARNING("The wall was torn open by [user]!"))
+ user.visible_message(SPAN_WARNING("The wall was torn open by \the [user]!"), SPAN_NOTICE("You remove the outer plating."))
return
//Reinforced dismantling.
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 26052d55879..b37a4586b1e 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -129,11 +129,15 @@ var/list/mineral_can_smooth_with = list(
GetDrilled()
/turf/simulated/mineral/bullet_act(var/obj/item/projectile/Proj)
+ if(istype(Proj, /obj/item/projectile/beam/plasmacutter))
+ var/obj/item/projectile/beam/plasmacutter/PC_beam = Proj
+ . = PC_beam.pass_check(src)
+
// Emitter blasts
if(istype(Proj, /obj/item/projectile/beam/emitter))
emitter_blasts_taken++
- if(emitter_blasts_taken > 2) // 3 blasts per tile
+ if(emitter_blasts_taken >= 3)
GetDrilled()
/turf/simulated/mineral/CollidedWith(AM)
diff --git a/code/modules/projectiles/guns/energy/mining.dm b/code/modules/projectiles/guns/energy/mining.dm
index 8d04e38e907..b07e6a64e21 100644
--- a/code/modules/projectiles/guns/energy/mining.dm
+++ b/code/modules/projectiles/guns/energy/mining.dm
@@ -7,6 +7,7 @@
icon = 'icons/obj/mining_contained.dmi'
icon_state = "plasma"
item_state = "plasma"
+ usesound = 'sound/weapons/plasma_cutter.ogg'
fire_sound = 'sound/weapons/plasma_cutter.ogg'
slot_flags = SLOT_BELT|SLOT_BACK
accuracy = 1
@@ -49,6 +50,15 @@
else
..()
+/obj/item/gun/energy/plasmacutter/proc/check_power_and_message(var/mob/user, var/use_amount = 1)
+ if(!power_supply)
+ to_chat(user, SPAN_WARNING("\The [src] doesn't have a power supply installed!"))
+ return TRUE
+ if(!power_supply.check_charge(charge_cost * use_amount))
+ to_chat(user, SPAN_WARNING("\The [src] doesn't have enough power to do this!"))
+ return TRUE
+ return FALSE
+
/obj/item/gun/energy/plasmacutter/mounted
name = "mounted plasma cutter"
self_recharge = TRUE
@@ -65,12 +75,21 @@
range = 5
pass_flags = PASSTABLE
+ var/mineral_passes = 2 // amount of mineral turfs it passes through before ending
+
muzzle_type = /obj/effect/projectile/muzzle/plasma_cutter
tracer_type = /obj/effect/projectile/tracer/plasma_cutter
impact_type = /obj/effect/projectile/impact/plasma_cutter
maiming = TRUE
maim_rate = 1
+/obj/item/projectile/beam/plasmacutter/proc/pass_check(var/turf/simulated/mineral/mine_turf)
+ if(mineral_passes <= 0)
+ return null // the projectile stops
+ mineral_passes--
+ on_impact(mine_turf)
+ return PROJECTILE_CONTINUE // the projectile tunnels deeper
+
/obj/item/projectile/beam/plasmacutter/on_impact(var/atom/A)
if(istype(A, /turf/simulated/mineral))
var/turf/simulated/mineral/M = A
@@ -81,3 +100,12 @@
M.emitter_blasts_taken += 2
M.emitter_blasts_taken += 1
. = ..()
+
+/obj/item/gun/energy/plasmacutter/use_resource(mob/user, var/use_amount)
+ if(use_external_power)
+ var/obj/item/cell/external = get_external_power_supply()
+ if(external)
+ external.use(use_amount * charge_cost)
+ return
+ if(power_supply)
+ power_supply.use(use_amount * charge_cost)
\ No newline at end of file
diff --git a/html/changelogs/geeves-plasma_cutter_improvements.yml b/html/changelogs/geeves-plasma_cutter_improvements.yml
new file mode 100644
index 00000000000..6caa9407793
--- /dev/null
+++ b/html/changelogs/geeves-plasma_cutter_improvements.yml
@@ -0,0 +1,8 @@
+author: Geeves
+
+delete-after: True
+
+changes:
+ - bugfix: "Using a plasma cutter to cut down walls, grilles, and girders, now properly plays the sound and uses its charge."
+ - rscadd: "Using welding tools on walls will now drain their fuel."
+ - rscadd: "Plasma cutters beams can now hit three asteroid walls per shot, making them more useful for mining."