From 824b47d91bfb43881e913b3b0e2764d1b8eebe15 Mon Sep 17 00:00:00 2001 From: Geeves Date: Wed, 24 Feb 2021 17:01:28 +0200 Subject: [PATCH] Plasma Cutter Improvements (#11231) --- code/game/machinery/constructable_frame.dm | 4 +-- code/game/objects/items.dm | 3 ++ code/game/objects/items/weapons/tools.dm | 4 +++ code/game/objects/structures/girders.dm | 12 +++++--- code/game/objects/structures/grille.dm | 6 ++-- code/game/turfs/simulated/wall_attacks.dm | 15 ++++------ code/modules/mining/mine_turfs.dm | 6 +++- .../modules/projectiles/guns/energy/mining.dm | 28 +++++++++++++++++++ .../geeves-plasma_cutter_improvements.yml | 8 ++++++ 9 files changed, 67 insertions(+), 19 deletions(-) create mode 100644 html/changelogs/geeves-plasma_cutter_improvements.yml 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."