From a469d0fcf22142db5feb7f12eb08d7915d519ee2 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Mon, 30 Sep 2019 16:49:15 -0400 Subject: [PATCH] for-God-has-redeemed-us-all --- code/ATMOSPHERICS/atmospherics.dm | 2 +- code/game/machinery/PDApainter.dm | 5 + code/game/machinery/alarm.dm | 13 ++ code/game/machinery/atmoalter/canister.dm | 70 ++++------ code/game/machinery/atmoalter/meter.dm | 8 +- code/game/machinery/camera/camera.dm | 23 ++-- code/game/machinery/camera/camera_assembly.dm | 3 +- code/game/machinery/cell_charger.dm | 5 + code/game/machinery/cloning.dm | 5 + .../game/machinery/computer/buildandrepair.dm | 4 +- code/game/machinery/computer/computer.dm | 75 ++++++---- code/game/machinery/constructable_frame.dm | 15 +- code/game/machinery/deployable.dm | 3 +- code/game/machinery/doors/airlock.dm | 2 +- code/game/machinery/doors/firedoor.dm | 2 +- code/game/machinery/doors/windowdoor.dm | 2 +- code/game/machinery/firealarm.dm | 15 ++ code/game/machinery/iv_drip.dm | 5 + code/game/machinery/machinery.dm | 7 +- code/game/machinery/newscaster.dm | 13 ++ code/game/machinery/portable_turret.dm | 3 + code/game/machinery/suit_storage_unit.dm | 7 +- code/game/machinery/washing_machine.dm | 4 + .../objects/effects/decals/Cleanable/misc.dm | 16 +++ .../structures/crates_lockers/closets.dm | 9 +- code/game/objects/structures/extinguisher.dm | 13 +- code/game/objects/structures/foodcart.dm | 33 +---- code/game/objects/structures/kitchen_spike.dm | 5 +- code/game/objects/structures/noticeboard.dm | 4 + code/game/objects/structures/statues.dm | 130 +++++------------- .../structures/stool_bed_chair_nest/bed.dm | 19 ++- .../structures/stool_bed_chair_nest/chairs.dm | 12 +- code/game/objects/structures/tables_racks.dm | 10 +- .../game/objects/structures/tank_dispenser.dm | 8 ++ code/game/objects/structures/window.dm | 2 +- code/modules/clothing/clothing.dm | 10 ++ .../kitchen_machinery/icecream_vat.dm | 5 + .../kitchen_machinery/icecream_vat_2.dm | 6 + code/modules/hydroponics/grown/misc.dm | 8 +- code/modules/library/lib_items.dm | 37 +---- code/modules/mining/abandonedcrates.dm | 9 +- .../mining/equipment/marker_beacons.dm | 2 +- code/modules/mining/equipment/survival_pod.dm | 5 +- code/modules/mining/satchel_ore_boxdm.dm | 6 +- code/modules/paperwork/filingcabinet.dm | 6 + code/modules/power/apc.dm | 14 ++ code/modules/power/cable.dm | 23 +--- code/modules/power/lighting.dm | 103 +++++++------- .../particle_accelerator.dm | 18 +-- code/modules/power/solar.dm | 43 +++--- code/modules/power/tracker.dm | 30 ++-- code/modules/reagents/reagent_dispenser.dm | 14 +- icons/effects/effects.dmi | Bin 432759 -> 433055 bytes 53 files changed, 485 insertions(+), 406 deletions(-) diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index b26e2570944..99bd0277969 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -214,7 +214,7 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new()) user.throw_at(general_direction,pressures/10,pressures/50) /obj/machinery/atmospherics/deconstruct(disassembled = TRUE) - if(can_deconstruct) + if(!(flags & NODECONSTRUCT)) if(can_unwrench) if(stored) stored.forceMove(get_turf(src)) diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index 1b7ca14f941..00c17fef689 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -62,6 +62,11 @@ else return ..() +/obj/machinery/pdapainter/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + if(!(stat & BROKEN)) + stat |= BROKEN + update_icon() /obj/machinery/pdapainter/attack_hand(mob/user as mob) if(..()) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index ea5eb96cce9..be6abb0d42e 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -1033,6 +1033,19 @@ spawn(rand(0,15)) update_icon() +/obj/machinery/alarm/obj_break(damage_flag) + ..() + update_icon() + +/obj/machinery/alarm/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + new /obj/item/stack/sheet/metal(loc, 2) + var/obj/item/I = new /obj/item/airalarm_electronics(loc) + if(!disassembled) + I.obj_integrity = I.max_integrity * 0.5 + new /obj/item/stack/cable_coil(loc, 3) + qdel(src) + /obj/machinery/alarm/examine(mob/user) . = ..() if(buildstage < 2) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 6fe8d68f7b7..2dcceecba76 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -246,30 +246,38 @@ update_flag /obj/machinery/portable_atmospherics/canister/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) ..() if(exposed_temperature > temperature_resistance) - health -= 5 - healthcheck() + take_damage(5, BURN, 0) -/obj/machinery/portable_atmospherics/canister/proc/healthcheck() - if(destroyed) - return 1 +/obj/machinery/portable_atmospherics/canister/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + if(!(stat & BROKEN)) + canister_break() + if(disassembled) + new /obj/item/stack/sheet/metal (loc, 10) + else + new /obj/item/stack/sheet/metal (loc, 5) + qdel(src) - if(src.health <= 10) - var/atom/location = src.loc - location.assume_air(air_contents) - air_update_turf() +/obj/machinery/portable_atmospherics/canister/obj_break(damage_flag) + if((stat & BROKEN) || (flags & NODECONSTRUCT)) + return + canister_break() - src.destroyed = 1 - playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3) - src.density = 0 - update_icon() +/obj/machinery/portable_atmospherics/canister/proc/canister_break() + disconnect() + var/datum/gas_mixture/expelled_gas = air_contents.remove(air_contents.total_moles()) + var/turf/T = get_turf(src) + T.assume_air(expelled_gas) + air_update_turf() - if(src.holding) - src.holding.loc = src.loc - src.holding = null + stat |= BROKEN + density = FALSE + playsound(src.loc, 'sound/effects/spray.ogg', 10, TRUE, -3) + update_icon() - return 1 - else - return 1 + if(holding) + holding.forceMove(T) + holding = null /obj/machinery/portable_atmospherics/canister/process_atmos() if(destroyed) @@ -336,28 +344,8 @@ update_flag qdel(src) return - if(!istype(W, /obj/item/wrench) && !istype(W, /obj/item/tank) && !istype(W, /obj/item/analyzer) && !istype(W, /obj/item/pda)) - visible_message("[user] hits the [src] with a [W]!") - src.health -= W.force - src.add_fingerprint(user) - healthcheck() - - if(istype(user, /mob/living/silicon/robot) && istype(W, /obj/item/tank/jetpack)) - var/datum/gas_mixture/thejetpack = W:air_contents - var/env_pressure = thejetpack.return_pressure() - var/pressure_delta = min(10*ONE_ATMOSPHERE - env_pressure, (air_contents.return_pressure() - env_pressure)/2) - //Can not have a pressure delta that would cause environment pressure > tank pressure - var/transfer_moles = 0 - if((air_contents.temperature > 0) && (pressure_delta > 0)) - transfer_moles = pressure_delta*thejetpack.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION)//Actually transfer the gas - var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) - thejetpack.merge(removed) - to_chat(user, "You pulse-pressurize your jetpack from the tank.") - return - - ..() - - SSnanoui.update_uis(src) // Update all NanoUIs attached to src + if(istype(W, /obj/item/wrench) && !istype(W, /obj/item/tank) && !istype(W, /obj/item/analyzer) && !istype(W, /obj/item/pda)) + return ..() /obj/machinery/portable_atmospherics/canister/replace_tank(mob/living/user, close_valve) . = ..() diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index 5b68ef2aff0..8989f7d11a9 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -136,8 +136,12 @@ "[user] unfastens \the [src].", \ "You have unfastened \the [src].", \ "You hear ratchet.") - new /obj/item/pipe_meter(src.loc) - qdel(src) + deconstruct(TRUE) + +/obj/machinery/meter/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + new /obj/item/pipe_meter(loc) + qdel(src) /obj/machinery/meter/singularity_pull(S, current_size) ..() diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index fa9adb68e71..78448d44217 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -245,17 +245,18 @@ wires.CutAll() /obj/machinery/camera/deconstruct(disassembled = TRUE) - if(disassembled) - if(!assembly) - assembly = new() - assembly.forceMove(loc) - assembly.state = 1 - assembly.setDir(dir) - assembly.update_icon() - assembly = null - else - new /obj/item/camera_assembly(loc) - new /obj/item/stack/cable_coil(loc, 2) + if(!(flags & NODECONSTRUCT)) + if(disassembled) + if(!assembly) + assembly = new() + assembly.forceMove(drop_location()) + assembly.state = 1 + assembly.setDir(dir) + assembly.update_icon() + assembly = null + else + new /obj/item/camera_assembly(loc) + new /obj/item/stack/cable_coil(loc, 2) qdel(src) /obj/machinery/camera/update_icon() diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 5f9aa6f12a1..c74ad40e6c3 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -176,7 +176,8 @@ return FALSE /obj/item/camera_assembly/deconstruct(disassembled = TRUE) - new /obj/item/stack/sheet/metal(loc) + if(!(flags & NODECONSTRUCT)) + new /obj/item/stack/sheet/metal(loc) qdel(src) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 813120b7c42..e6c957c1779 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -12,6 +12,11 @@ var/obj/item/stock_parts/cell/charging = null var/chargelevel = -1 +/obj/machinery/cell_charger/deconstruct() + if(charging) + charging.forceMove(drop_location()) + return ..() + /obj/machinery/cell_charger/Destroy() QDEL_NULL(charging) return ..() diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 26e6b8f4d7f..89cd7ad3420 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -562,6 +562,11 @@ else return +/obj/machinery/clonepod/deconstruct(disassembled = TRUE) + if(occupant) + go_out() + ..() + /obj/machinery/clonepod/onSoullinkRevive(mob/living/L) if(occupant && L == clonemind.current) // The old body's back in shape, time to ditch the cloning one diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index c0384e63b94..bf7225b3fcc 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -8,10 +8,10 @@ var/state = 0 var/obj/item/circuitboard/circuit = null var/base_mineral = /obj/item/stack/sheet/metal -// weight = 1.0E8 /obj/structure/computerframe/deconstruct(disassembled = TRUE) - drop_computer_parts() + if(!(flags & NODECONSTRUCT)) + drop_computer_parts() return ..() // will qdel the frame /obj/structure/computerframe/obj_break(damage_flag) diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 2137efa42b3..c04de66515f 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -93,6 +93,51 @@ if(BURN) playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) +/obj/machinery/computer/obj_break(damage_flag) + if(circuit && !(flags & NODECONSTRUCT)) //no circuit, no breaking + if(!(stat & BROKEN)) + playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE) + stat |= BROKEN + update_icon() + set_light(0) + +/obj/machinery/computer/emp_act(severity) + ..() + switch(severity) + if(1) + if(prob(50)) + obj_break("energy") + if(2) + if(prob(10)) + obj_break("energy") + +/obj/machinery/computer/deconstruct(disassembled = TRUE, mob/user) + on_deconstruction() + if(!(flags & NODECONSTRUCT)) + if(circuit) //no circuit, no computer frame + var/obj/structure/computerframe/A = new /obj/structure/computerframe(loc) + var/obj/item/circuitboard/M = new circuit(A) + A.setDir(dir) + A.circuit = M + A.anchored = TRUE + if(stat & BROKEN) + if(user) + to_chat(user, "The broken glass falls out.") + else + playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, TRUE) + new /obj/item/shard(drop_location()) + new /obj/item/shard(drop_location()) + A.state = 3 + A.icon_state = "3" + else + if(user) + to_chat(user, "You disconnect the monitor.") + A.state = 4 + A.icon_state = "4" + for(var/obj/C in src) + C.forceMove(loc) + qdel(src) + /obj/machinery/computer/proc/set_broken() if(!(resistance_flags & INDESTRUCTIBLE)) stat |= BROKEN @@ -111,26 +156,10 @@ if(istype(user, /mob/dead/observer)) return 0 return ..() -/obj/machinery/computer/attackby(obj/I, mob/user, params) - if(istype(I, /obj/item/screwdriver) && circuit && !(resistance_flags & INDESTRUCTIBLE)) - var/obj/item/screwdriver/S = I - playsound(src.loc, S.usesound, 50, 1) - if(do_after(user, 20 * S.toolspeed, target = src)) - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - var/obj/item/circuitboard/M = new circuit( A ) - A.circuit = M - A.anchored = 1 - for(var/obj/C in src) - C.loc = src.loc - if(src.stat & BROKEN) - to_chat(user, "The broken glass falls out.") - new /obj/item/shard(loc) - A.state = 3 - A.icon_state = "3" - else - to_chat(user, "You disconnect the monitor.") - A.state = 4 - A.icon_state = "4" - qdel(src) - else - attack_hand(user) \ No newline at end of file +/obj/machinery/computer/attackby(obj/item/I, mob/user, params) + if(isscrewdriver(I) && circuit && !(flags & NODECONSTRUCT)) + playsound(loc, I.usesound, 50, TRUE) + if(do_after(user, 20 * I.toolspeed, target = src)) + deconstruct(TRUE, user) + return + return ..() \ No newline at end of file diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index e1f595f4dfd..7d36ebb7abf 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -17,13 +17,14 @@ var/pattern_idx=0 /obj/machinery/constructable_frame/deconstruct(disassembled = TRUE) - new /obj/item/stack/sheet/metal(src.loc, 5) - if(state >= 3) - var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil(loc) - A.amount = 5 - if(circuit) - circuit.forceMove(loc) - circuit = null + if(!(flags & NODECONSTRUCT)) + new /obj/item/stack/sheet/metal(loc, 5) + if(state >= 3) + var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil(loc) + A.amount = 5 + if(circuit) + circuit.forceMove(loc) + circuit = null return ..() /obj/machinery/constructable_frame/obj_break(damage_flag) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 7333ddca611..60d9953e980 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -20,7 +20,8 @@ var/stacktype = /obj/item/stack/sheet/metal /obj/structure/barricade/deconstruct(disassembled = TRUE) - make_debris() + if(!(flags & NODECONSTRUCT)) + make_debris() qdel(src) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index a36dbe7a9a6..e613efc0689 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1291,7 +1291,7 @@ About the new airlock wires panel: update_icon() /obj/machinery/door/airlock/deconstruct(disassembled = TRUE, mob/user) - if(can_deconstruct) + if(!(flags & NODECONSTRUCT)) var/obj/structure/door_assembly/DA if(assemblytype) DA = new assemblytype(loc) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 689b602af3f..dad6ece80cf 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -214,7 +214,7 @@ close() /obj/machinery/door/firedoor/deconstruct(disassembled = TRUE) - if(can_deconstruct) + if(!(flags & NODECONSTRUCT)) var/obj/structure/firelock_frame/F = new assemblytype(get_turf(src)) if(disassembled) F.constructionStep = CONSTRUCTION_PANEL_OPEN diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 1da2db42ffc..6cb40adfbf1 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -185,7 +185,7 @@ playsound(src, 'sound/items/welder.ogg', 100, TRUE) /obj/machinery/door/window/deconstruct(disassembled = TRUE) - if(can_deconstruct && !disassembled) + if(!(flags & NODECONSTRUCT) && !disassembled) for(var/obj/fragment in debris) fragment.forceMove(get_turf(src)) transfer_fingerprints_to(fragment) diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 3dcb0a4eef4..46ea5f967bd 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -155,6 +155,21 @@ FIRE ALARM deconstruct() ..() +/obj/machinery/firealarm/obj_break(damage_flag) + if(!(stat & BROKEN) && !(flags & NODECONSTRUCT) && buildstage != 0) //can't break the electronics if there isn't any inside. + stat |= BROKEN + update_icon() + +/obj/machinery/firealarm/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + new /obj/item/stack/sheet/metal(loc, 1) + if(!(stat & BROKEN)) + var/obj/item/I = new /obj/item/firealarm_electronics(loc) + if(!disassembled) + I.obj_integrity = I.max_integrity * 0.5 + new /obj/item/stack/cable_coil(loc, 3) + qdel(src) + /obj/machinery/firealarm/process()//Note: this processing was mostly phased out due to other code, and only runs when needed if(stat & (NOPOWER|BROKEN)) return diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 144b441d2de..204a85b426e 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -55,6 +55,11 @@ else return ..() +/obj/machinery/iv_drip/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + new /obj/item/stack/sheet/metal(loc) + qdel(src) + /obj/machinery/iv_drip/examine(mob/user) . = ..() if(bag) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 4f0ef707049..99b2f208c79 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -387,17 +387,18 @@ Class Procs: /obj/machinery/proc/default_deconstruction_crowbar(var/obj/item/crowbar/C, var/ignore_panel = 0) if(istype(C) && (panel_open || ignore_panel)) playsound(loc, C.usesound, 50, 1) - deconstruct() + deconstruct(TRUE) return 1 return 0 /obj/machinery/deconstruct(disassembled = TRUE) - if(can_deconstruct) + if(!(flags & NODECONSTRUCT)) on_deconstruction() if(component_parts && component_parts.len) spawn_frame(disassembled) for(var/obj/item/I in component_parts) I.forceMove(loc) + component_parts.Cut() qdel(src) /obj/machinery/proc/spawn_frame(disassembled) @@ -411,7 +412,7 @@ Class Procs: M.icon_state = "box_1" /obj/machinery/obj_break(damage_flag) - if(can_deconstruct) + if(!(flags & NODECONSTRUCT)) stat |= BROKEN /obj/machinery/proc/default_deconstruction_screwdriver(var/mob/user, var/icon_state_open, var/icon_state_closed, var/obj/item/screwdriver/S) diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 9a6177c40cb..4a115a0d26c 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -625,6 +625,19 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co if(BURN) playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) +/obj/machinery/newscaster/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + new /obj/item/stack/sheet/metal(loc, 2) + new /obj/item/shard(loc) + new /obj/item/shard(loc) + qdel(src) + +/obj/machinery/newscaster/obj_break() + if(!(stat & BROKEN) && !(flags & NODECONSTRUCT)) + stat |= BROKEN + playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE) + update_icon() + /obj/machinery/newscaster/proc/AttachPhoto(mob/user) if(photo) if(!issilicon(user)) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 97f18bddc82..6953b8d7865 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -460,6 +460,9 @@ var/list/turret_icons /obj/machinery/porta_turret/proc/reset_attacked() attacked = FALSE +/obj/machinery/porta_turret/deconstruct(disassembled = TRUE) + qdel(src) + /obj/machinery/porta_turret/ex_act(severity) switch(severity) if(1) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index a4182198d20..5833ec5db38 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -354,9 +354,10 @@ occupant = null /obj/machinery/suit_storage_unit/deconstruct(disassembled = TRUE) - open_machine() - dump_contents() - new /obj/item/stack/sheet/metal (loc, 2) + if(!(flags & NODECONSTRUCT)) + open_machine() + dump_contents() + new /obj/item/stack/sheet/metal (loc, 2) qdel(src) /obj/machinery/suit_storage_unit/MouseDrop_T(atom/A, mob/user) diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index af067f60688..e1288a7b53d 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -320,3 +320,7 @@ update_icon() + +/obj/machinery/washing_machine/deconstruct(disassembled = TRUE) + new /obj/item/stack/sheet/metal(drop_location(), 2) + qdel(src) \ No newline at end of file diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index 122840c1e67..e8d4222eb3c 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -129,6 +129,22 @@ random_icon_states = list("gvomit_1", "gvomit_2", "gvomit_3", "gvomit_4") scoop_reagents = list("green_vomit" = 5) +/obj/effect/decal/cleanable/shreds + name = "shreds" + desc = "The shredded remains of what appears to be clothing." + icon_state = "shreds" + gender = PLURAL + mergeable_decal = FALSE + +/obj/effect/decal/cleanable/shreds/ex_act(severity, target) + if(severity == 1) //so shreds created during an explosion aren't deleted by the explosion. + qdel(src) + +/obj/effect/decal/cleanable/shreds/Initialize(mapload) + pixel_x = rand(-10, 10) + pixel_y = rand(-10, 10) + . = ..() + /obj/effect/decal/cleanable/tomato_smudge name = "tomato smudge" desc = "It's red." diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 8c1e0011264..948a498989d 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -124,6 +124,11 @@ if(!(opened ? close() : open())) to_chat(user, "It won't budge!") +/obj/structure/closet/deconstruct(disassembled = TRUE) + if(ispath(material_drop) && material_drop_amount && !(flags & NODECONSTRUCT)) + new material_drop(loc, material_drop_amount) + qdel(src) + /obj/structure/closet/ex_act(severity) switch(severity) if(1) @@ -239,9 +244,7 @@ visible_message("[user] slices apart \the [src].", "You cut \the [src] apart with \the [WT].", "You hear welding.") - var/turf/T = get_turf(src) - new material_drop(T, material_drop_amount) - qdel(src) + deconstruct(TRUE) return if(isrobot(user)) return diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 1bd5ef9546d..dbcf2bce062 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -47,7 +47,7 @@ /obj/structure/extinguisher_cabinet/Destroy() QDEL_NULL(has_extinguisher) return ..() - + /obj/structure/extinguisher_cabinet/attackby(obj/item/O, mob/user, params) if(isrobot(user) || isalien(user)) return @@ -82,9 +82,7 @@ visible_message("[user] slices apart [src].", "You cut [src] apart with [WT].", "You hear welding.") - var/turf/T = get_turf(src) - new material_drop(T) - qdel(src) + deconstruct(TRUE) else playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) opened = !opened @@ -127,6 +125,13 @@ opened = !opened update_icon() +/obj/structure/extinguisher_cabinet/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + new /obj/item/stack/sheet/metal(loc) + if(has_extinguisher) + has_extinguisher.forceMove(loc) + has_extinguisher = null + qdel(src) /obj/structure/extinguisher_cabinet/update_icon() if(!opened) diff --git a/code/game/objects/structures/foodcart.dm b/code/game/objects/structures/foodcart.dm index 1d48e4851df..da88c16f074 100644 --- a/code/game/objects/structures/foodcart.dm +++ b/code/game/objects/structures/foodcart.dm @@ -173,32 +173,7 @@ update_icon() //Not really needed without overlays, but keeping just in case updateUsrDialog() -/* -Overlays for cart_unused -/obj/structure/foodcart/update_icon() - overlays = null - if(food1) - overlays += "cart_food1" - if(food2) - overlays += "cart_food2" - if(food3) - overlays += "cart_food3" - if(food4) - overlays += "cart_food4" - if(food5) - overlays += "cart_food5" - if(food6) - overlays += "cart_food6" - if(drink1) - overlays += "cart_drink1" - if(drink2) - overlays += "cart_drink2" - if(drink3) - overlays += "cart_drink3" - if(drink4) - overlays += "cart_drink4" - if(drink5) - overlays += "cart_drink5" - if(drink6) - overlays += "cart_drink6" -*/ \ No newline at end of file +/obj/structure/foodcart/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + new /obj/item/stack/sheet/metal(loc, 4) + qdel(src) \ No newline at end of file diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index d5d6af0db79..74d1e2ba8f0 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -52,10 +52,7 @@ playsound(loc, G.usesound, 100, 1) if(do_after(user, 20 * G.toolspeed, target = src)) to_chat(user, "You pry the spikes out of the frame.") - new /obj/item/stack/rods(loc, 4) - new /obj/structure/kitchenspike_frame(loc) - add_fingerprint(user) - qdel(src) + deconstruct(TRUE) else to_chat(user, "You can't do that while something's on the spike!") return diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm index 8ea6a3c0cce..a32fd94b392 100644 --- a/code/game/objects/structures/noticeboard.dm +++ b/code/game/objects/structures/noticeboard.dm @@ -37,6 +37,10 @@ user << browse("Notices[dat]","window=noticeboard") onclose(user, "noticeboard") +/obj/structure/noticeboard/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + new /obj/item/stack/sheet/metal (loc, 1) + qdel(src) /obj/structure/noticeboard/Topic(href, href_list) ..() diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index 07a6869704b..a09e8e13f66 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -5,76 +5,41 @@ icon_state = "" density = 1 anchored = 0 - var/hardness = 1 var/oreAmount = 5 var/material_drop_type = /obj/item/stack/sheet/metal /obj/structure/statue/attackby(obj/item/W, mob/living/user, params) add_fingerprint(user) - user.changeNext_move(CLICK_CD_MELEE) - if(iswrench(W)) - if(anchored) - playsound(loc, W.usesound, 100, 1) - user.visible_message("[user] is loosening the [name]'s bolts.", \ - "You are loosening the [name]'s bolts...") - if(do_after(user, 40 * W.toolspeed, target = src)) - if(!loc || !anchored) - return - user.visible_message("[user] loosened the [name]'s bolts!", \ - "You loosen the [name]'s bolts!") - anchored = 0 - else - if(!isfloorturf(loc)) - user.visible_message("A floor must be present to secure the [name]!") - return - playsound(loc, W.usesound, 100, 1) - user.visible_message("[user] is securing the [name]'s bolts...", \ - "You are securing the [name]'s bolts...") - if(do_after(user, 40 * W.toolspeed, target = src)) - if(!loc || anchored) - return - user.visible_message("[user] has secured the [name]'s bolts.", \ - "You have secured the [name]'s bolts.") - anchored = 1 - - else if(istype(W, /obj/item/gun/energy/plasmacutter)) - playsound(src, W.usesound, 100, 1) - user.visible_message("[user] is slicing apart the [name]...", \ - "You are slicing apart the [name]...") - if(do_after(user, 40 * W.toolspeed, target = src)) - if(!loc) - return - user.visible_message("[user] slices apart the [name].", \ - "You slice apart the [name].") - Dismantle(TRUE) - - else if(istype(W, /obj/item/pickaxe/drill/jackhammer)) - var/obj/item/pickaxe/drill/jackhammer/D = W - if(!loc) + if(!(flags & NODECONSTRUCT)) + if(default_unfasten_wrench(user, W)) return - user.visible_message("[user] destroys the [name]!", \ - "You destroy the [name].") - D.playDigSound() - qdel(src) - - else if(iswelder(W) && !anchored) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0, user)) - playsound(loc, W.usesound, 40, 1) - user.visible_message("[user] is slicing apart the [name].", \ + if(istype(W, /obj/item/gun/energy/plasmacutter)) + playsound(src, W.usesound, 100, 1) + user.visible_message("[user] is slicing apart the [name]...", \ "You are slicing apart the [name]...") if(do_after(user, 40 * W.toolspeed, target = src)) if(!loc) return - playsound(loc, W.usesound, 50, 1) user.visible_message("[user] slices apart the [name].", \ - "You slice apart the [name]!") - Dismantle(TRUE) - else - hardness -= W.force/100 - ..() - CheckHardness() - return ..() + "You slice apart the [name].") + deconstruct(TRUE) + return + + else if(iswelder(W)) + var/obj/item/weldingtool/WT = W + if(WT.remove_fuel(0, user)) + playsound(loc, W.usesound, 40, 1) + user.visible_message("[user] is slicing apart the [name].", \ + "You are slicing apart the [name]...") + if(do_after(user, 40 * W.toolspeed, target = src)) + if(!loc) + return + playsound(loc, W.usesound, 50, 1) + user.visible_message("[user] slices apart the [name].", \ + "You slice apart the [name]!") + deconstruct(TRUE) + return + return ..() /obj/structure/statue/attack_hand(mob/living/user) user.changeNext_move(CLICK_CD_MELEE) @@ -85,35 +50,17 @@ /obj/structure/statue/CanAtmosPass() return !density -/obj/structure/statue/proc/CheckHardness() - if(hardness <= 0) - Dismantle(TRUE) - -/obj/structure/statue/proc/Dismantle(disassembled = TRUE) - if(material_drop_type) - var/drop_amt = oreAmount - if(!disassembled) - drop_amt -= 2 - if(drop_amt > 0) - new material_drop_type(get_turf(src), drop_amt) +/obj/structure/statue/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + if(material_drop_type) + var/drop_amt = oreAmount + if(!disassembled) + drop_amt -= 2 + if(drop_amt > 0) + new material_drop_type(get_turf(src), drop_amt) qdel(src) -/obj/structure/statue/ex_act(severity = 1) - switch(severity) - if(1) - Dismantle(TRUE) - if(2) - if(prob(20)) - Dismantle(TRUE) - else - hardness-- - CheckHardness() - if(3) - hardness -= 0.1 - CheckHardness() - /obj/structure/statue/uranium - hardness = 3 light_range = 2 material_drop_type = /obj/item/stack/sheet/mineral/uranium var/last_event = 0 @@ -151,7 +98,6 @@ active = null /obj/structure/statue/plasma - hardness = 2 material_drop_type = /obj/item/stack/sheet/mineral/plasma desc = "This statue is suitably made from plasma." @@ -192,14 +138,13 @@ /obj/structure/statue/plasma/proc/PlasmaBurn() atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 160) - Dismantle(FALSE) + deconstruct(FALSE) /obj/structure/statue/plasma/proc/ignite(exposed_temperature) if(exposed_temperature > 300) PlasmaBurn() /obj/structure/statue/gold - hardness = 3 material_drop_type = /obj/item/stack/sheet/mineral/gold desc = "This is a highly valuable statue made from gold." @@ -224,7 +169,6 @@ icon_state = "rd" /obj/structure/statue/silver - hardness = 3 material_drop_type = /obj/item/stack/sheet/mineral/silver desc = "This is a valuable statue made from silver." @@ -249,7 +193,6 @@ icon_state = "medborg" /obj/structure/statue/diamond - hardness = 10 material_drop_type = /obj/item/stack/sheet/mineral/diamond desc = "This is a very expensive diamond statue." @@ -266,7 +209,6 @@ icon_state = "ai2" /obj/structure/statue/bananium - hardness = 3 material_drop_type = /obj/item/stack/sheet/mineral/bananium desc = "A bananium statue with a small engraving:'HOOOOOOONK'." var/spam_flag = 0 @@ -295,7 +237,6 @@ spam_flag = 0 /obj/structure/statue/sandstone - hardness = 0.5 material_drop_type = /obj/item/stack/sheet/mineral/sandstone /obj/structure/statue/sandstone/assistant @@ -310,7 +251,6 @@ icon_state = "venus" /obj/structure/statue/tranquillite - hardness = 0.5 material_drop_type = /obj/item/stack/sheet/mineral/tranquillite desc = "..." @@ -328,7 +268,9 @@ to_chat(user, "It is fastened to the floor!") return setDir(turn(dir, 90)) + //////////////////////////////// + /obj/structure/snowman name = "snowman" desc = "Seems someone made a snowman here." @@ -374,4 +316,4 @@ icon = 'icons/obj/decorations.dmi' icon_state = "chickenstatue" anchored = 1 - density = 1 + density = 1 \ No newline at end of file diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index b3bf69265b8..380ddf2e6c0 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -40,11 +40,20 @@ /obj/structure/bed/proc/handle_rotation() return -/obj/structure/bed/attackby(obj/item/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/wrench)) - playsound(loc, W.usesound, 50, 1) - new buildstacktype(loc, buildstackamount) - qdel(src) +/obj/structure/bed/attackby(obj/item/W, mob/user, params) + if(iswrench(W) && !(flags & NODECONSTRUCT)) + playsound(loc, W.usesound, 50, TRUE) + deconstruct(TRUE) + else + return ..() + +/obj/structure/bed/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + if(buildstacktype) + new buildstacktype(loc, buildstackamount) + ..() + + /* * Roller beds */ diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 78f1ffac1d6..f0f1c9c839f 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -51,10 +51,18 @@ SK.loc = E SK.master = E qdel(src) - if(istype(W, /obj/item/wrench)) + return + if(iswrench(W) && !(flags & NODECONSTRUCT)) playsound(loc, W.usesound, 50, 1) + deconstruct(TRUE) + return + return ..() + +/obj/structure/chair/deconstruct() + // If we have materials, and don't have the NOCONSTRUCT flag + if(buildstacktype && (!(flags & NODECONSTRUCT))) new buildstacktype(loc, buildstackamount) - qdel(src) + ..() /obj/structure/chair/MouseDrop(over_object, src_location, over_location) . = ..() diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 100744293fa..87a47293b14 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -244,7 +244,7 @@ return ..() /obj/structure/table/deconstruct(disassembled = TRUE, wrench_disassembly = 0) - if(can_deconstruct) + if(!(flags & NODECONSTRUCT)) var/turf/T = get_turf(src) new buildstack(T, buildstackamount) if(!wrench_disassembly) @@ -422,13 +422,13 @@ qdel(src) /obj/structure/table/glass/deconstruct(disassembled = TRUE, wrench_disassembly = 0) - if(can_deconstruct) + if(!(flags & NODECONSTRUCT)) if(disassembled) ..() return else var/turf/T = get_turf(src) - playsound(T, "shatter", 50, 1) + playsound(T, "shatter", 50, TRUE) for(var/X in debris) var/atom/movable/AM = X AM.forceMove(T) @@ -680,7 +680,7 @@ step(O, get_dir(O, src)) /obj/structure/rack/attackby(obj/item/W, mob/user, params) - if(iswrench(W) && can_deconstruct) + if(iswrench(W) && !(flags & NODECONSTRUCT) && user.a_intent != INTENT_HELP) playsound(loc, W.usesound, 50, 1) deconstruct(TRUE) return @@ -729,7 +729,7 @@ */ /obj/structure/rack/deconstruct(disassembled = TRUE) - if(can_deconstruct) + if(!(flags & NODECONSTRUCT)) density = FALSE var/obj/item/rack_parts/newparts = new(loc) transfer_fingerprints_to(newparts) diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index dbeb827d0b9..0a23f204e22 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -118,3 +118,11 @@ else SSnanoui.close_user_uis(usr,src) return 1 + +/obj/structure/tank_dispenser/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + for(var/X in src) + var/obj/item/I = X + I.forceMove(loc) + new /obj/item/stack/sheet/metal(loc, 2) + qdel(src) \ No newline at end of file diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 00ff1473e15..89e637a5c89 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -345,7 +345,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f return if(!disassembled) playsound(src, breaksound, 70, 1) - if(can_deconstruct) + if(!(flags & NODECONSTRUCT)) for(var/i in debris) var/obj/item/I = i I.forceMove(loc) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index b36dbc0bff9..03e1bb463dd 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -787,3 +787,13 @@ BLIND // can't see anything /obj/item/clothing/under/AltClick() handle_accessories_removal() + +/obj/item/clothing/obj_destruction(damage_flag) + if(damage_flag == "bomb" || damage_flag == "melee") + var/turf/T = get_turf(src) + spawn(1) //so the shred survives potential turf change from the explosion. + var/obj/effect/decal/cleanable/shreds/Shreds = new(T) + Shreds.desc = "The sad remains of what used to be [name]." + deconstruct(FALSE) + else + ..() \ No newline at end of file diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm index 5d758193bae..4212653d891 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm @@ -248,3 +248,8 @@ var/datum/browser/popup = new(user, "cream_master","Cream-Master Deluxe", 700, 400, src) popup.set_content(dat) popup.open() + +/obj/machinery/icemachine/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + new /obj/item/stack/sheet/metal(loc, 4) + qdel(src) diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat_2.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat_2.dm index 3dfdc83cdbc..ee208359801 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat_2.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat_2.dm @@ -214,6 +214,12 @@ var/list/ingredients_source = list( usr << browse(null,"window=icecreamvat") return +/obj/machinery/icecream_vat/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + new /obj/item/stack/sheet/metal(loc, 4) + qdel(src) + + /obj/item/reagent_containers/food/snacks/icecream name = "ice cream cone" desc = "Delicious waffle cone, but no ice cream." diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index 171f777abd7..983f1a20632 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -145,9 +145,11 @@ log_game("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x],[user.y],[user.z]).") prime() -/obj/item/reagent_containers/food/snacks/grown/cherry_bomb/burn() - prime() - ..() +/obj/item/reagent_containers/food/snacks/grown/cherry_bomb/deconstruct(disassembled = TRUE) + if(!disassembled) + prime() + if(!QDELETED(src)) + qdel(src) /obj/item/reagent_containers/food/snacks/grown/cherry_bomb/ex_act(severity) qdel(src) //Ensuring that it's deleted by its own explosion. Also prevents mass chain reaction with piles of cherry bombs diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 2be21e7f3c3..e45ac15b78e 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -61,7 +61,7 @@ "You disassemble \the [src].") busy = 0 density = 0 - qdel(src) + deconstruct(TRUE) else busy = 0 return 1 @@ -71,15 +71,6 @@ name = ("bookcase ([sanitize(newname)])") return 1 else - switch(O.damtype) - if("fire") - health -= O.force * 1 - if("brute") - health -= O.force * 0.75 - else - if(health <= 0) - visible_message("The bookcase is smashed apart!") - qdel(src) return ..() /obj/structure/bookcase/attack_hand(var/mob/user as mob) @@ -94,32 +85,12 @@ choice.forceMove(get_turf(src)) update_icon() -/obj/structure/bookcase/ex_act(severity) - switch(severity) - if(1.0) - for(var/obj/item/I in contents) - qdel(I) - qdel(src) - return - if(2.0) - for(var/obj/item/I in contents) - if(prob(50)) - qdel(I) - qdel(src) - return - if(3.0) - if(prob(50)) - qdel(src) - return - return - -/obj/structure/bookcase/Destroy() - for(var/i in 1 to 5) - new /obj/item/stack/sheet/wood(get_turf(src)) +/obj/structure/bookcase/deconstruct(disassembled = TRUE) + new /obj/item/stack/sheet/wood(loc, 5) for(var/obj/item/I in contents) if(is_type_in_list(I, allowed_books)) I.forceMove(get_turf(src)) - return ..() + qdel(src) /obj/structure/bookcase/update_icon() if(contents.len < 5) diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index 4bf2e005766..70bd904bed2 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -202,8 +202,15 @@ return 1 return ..() +/obj/structure/closet/crate/secure/loot/emag_act(mob/user) + if(locked) + boom(user) + /obj/structure/closet/crate/secure/loot/togglelock(mob/user) if(locked) boom(user) else - ..() \ No newline at end of file + ..() + +/obj/structure/closet/crate/secure/loot/deconstruct(disassembled = TRUE) + boom() \ No newline at end of file diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm index 0db80c84dab..35a1abed814 100644 --- a/code/modules/mining/equipment/marker_beacons.dm +++ b/code/modules/mining/equipment/marker_beacons.dm @@ -86,7 +86,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list( update_icon() /obj/structure/marker_beacon/deconstruct(disassembled = TRUE) - if(can_deconstruct) + if(!(flags & NODECONSTRUCT)) var/obj/item/stack/marker_beacon/M = new(loc) M.picked_color = picked_color M.update_icon() diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index e01fc32511c..c38d1e163d1 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -271,8 +271,9 @@ return !arbitraryatmosblockingvar /obj/structure/fans/deconstruct() - if(buildstacktype) - new buildstacktype(loc, buildstackamount) + if(!(flags & NODECONSTRUCT)) + if(buildstacktype) + new buildstacktype(loc, buildstackamount) qdel(src) /obj/structure/fans/attackby(obj/item/W, mob/user, params) diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index 43bc1b57226..77b270a7f76 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -63,10 +63,6 @@ to_chat(usr, "You empty the box.") updateUsrDialog() -obj/structure/ore_box/ex_act(severity, target) - if(prob(100 / severity) && severity < 3) - qdel(src) //nothing but ores can get inside unless its a bug and ores just return nothing on ex_act, not point in calling it on them - /obj/structure/ore_box/deconstruct(disassembled = TRUE, mob/user) var/obj/item/stack/sheet/wood/W = new (loc, 4) if(user) @@ -84,7 +80,7 @@ obj/structure/ore_box/ex_act(severity, target) CHECK_TICK /obj/structure/ore_box/onTransitZ() - return + return /obj/structure/ore_box/verb/empty_box() set name = "Empty Ore Box" diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index bf69185adcb..f6e52eb2fc2 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -53,6 +53,12 @@ else to_chat(user, "You can't put [P] in [src]!") +/obj/structure/filingcabinet/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + new /obj/item/stack/sheet/metal(loc, 2) + for(var/obj/item/I in src) + I.forceMove(loc) + qdel(src) /obj/structure/filingcabinet/attack_hand(mob/user as mob) if(contents.len <= 0) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index fa805f0590b..662d7390f68 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -660,6 +660,20 @@ return 0 . = ..() +/obj/machinery/power/apc/obj_break(damage_flag) + if(!(flags & NODECONSTRUCT)) + set_broken() + +/obj/machinery/power/apc/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + if(!(stat & BROKEN)) + set_broken() + if(opened != 2) + opened = 2 + coverlocked = FALSE + visible_message("The APC cover is knocked down!") + update_icon() + /obj/machinery/power/apc/emag_act(user as mob) if(!(emagged || malfhack)) // trying to unlock with an emag card if(opened) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 198c5f64356..811c0711074 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -79,11 +79,12 @@ By design, d1 is the smallest direction and d2 is the highest return ..() // then go ahead and delete the cable /obj/structure/cable/deconstruct(disassembled = TRUE) - var/turf/T = get_turf(src) - if(d1) // 0-X cables are 1 unit, X-X cables are 2 units long - new/obj/item/stack/cable_coil(T, 2, paramcolor = color) - else - new/obj/item/stack/cable_coil(T, 1, paramcolor = color) + if(!(flags & NODECONSTRUCT)) + var/turf/T = get_turf(src) + if(d1) // 0-X cables are 1 unit, X-X cables are 2 units long + new/obj/item/stack/cable_coil(T, 2, paramcolor = color) + else + new/obj/item/stack/cable_coil(T, 1, paramcolor = color) qdel(src) /////////////////////////////////// @@ -218,18 +219,6 @@ By design, d1 is the smallest direction and d2 is the highest if(current_size >= STAGE_FIVE) deconstruct() -//explosion handling -/obj/structure/cable/ex_act(severity) - switch(severity) - if(1) - qdel(src) // qdel - if(2) - if(prob(50)) - deconstruct() - if(3) - if(prob(25)) - deconstruct() - obj/structure/cable/proc/cable_color(var/colorC) if(colorC) if(colorC == "rainbow") diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 98c7f2e8e51..9a70ba2f635 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -114,10 +114,15 @@ else return ..() -/obj/structure/light_construct/blob_act(obj/structure/blob/B) +/obj/machinery/light_construct/blob_act(obj/structure/blob/B) if(B && B.loc == loc) qdel(src) +/obj/machinery/light_construct/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + new /obj/item/stack/sheet/metal(loc, sheets_refunded) + qdel(src) + /obj/machinery/light_construct/small name = "small light fixture frame" desc = "A small light fixture under construction." @@ -372,21 +377,7 @@ playsound(src.loc, W.usesound, 75, 1) user.visible_message("[user.name] opens [src]'s casing.", \ "You open [src]'s casing.", "You hear a noise.") - var/obj/machinery/light_construct/newlight = null - switch(fitting) - if("tube") - newlight = new /obj/machinery/light_construct(src.loc) - newlight.icon_state = "tube-construct-stage2" - - if("bulb") - newlight = new /obj/machinery/light_construct/small(src.loc) - newlight.icon_state = "bulb-construct-stage2" - newlight.dir = src.dir - newlight.stage = 2 - newlight.fingerprints = src.fingerprints - newlight.fingerprintshidden = src.fingerprintshidden - newlight.fingerprintslast = src.fingerprintslast - qdel(src) + deconstruct() return to_chat(user, "You stick \the [W] into the light socket!") @@ -397,6 +388,38 @@ else return ..() +/obj/machinery/light/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + var/obj/machinery/light_construct/newlight = null + var/cur_stage = 2 + if(!disassembled) + cur_stage = 1 + switch(fitting) + if("tube") + newlight = new /obj/machinery/light_construct(src.loc) + newlight.icon_state = "tube-construct-stage2" + + if("bulb") + newlight = new /obj/machinery/light_construct/small(src.loc) + newlight.icon_state = "bulb-construct-stage2" + newlight.setDir(src.dir) + newlight.stage = cur_stage + if(!disassembled) + newlight.obj_integrity = newlight.max_integrity * 0.5 + if(status != LIGHT_BROKEN) + break_light_tube() + if(status != LIGHT_EMPTY) + drop_light_tube() + new /obj/item/stack/cable_coil(loc, 1, "red") + transfer_fingerprints_to(newlight) + qdel(src) + +/obj/machinery/light/attacked_by(obj/item/I, mob/living/user) + ..() + if(status == LIGHT_BROKEN || status == LIGHT_EMPTY) + if(on && (I.flags & CONDUCT)) + if(prob(12)) + electrocute_mob(user, get_area(src), src, 0.3, TRUE) /obj/machinery/light/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) . = ..() @@ -483,38 +506,12 @@ return else to_chat(user, "You remove the light [fitting].") - - // create a light tube/bulb item and put it in the user's hand - var/obj/item/light/L = new light_type(get_turf(user)) - L.status = status - L.rigged = rigged - L.brightness_range = brightness_range - L.brightness_power = brightness_power - L.brightness_color = brightness_color - L.materials = lightmaterials - - // light item inherits the switchcount, then zero it - L.switchcount = switchcount - switchcount = 0 - - L.update() - L.add_fingerprint(user) - - user.put_in_hands(L) //puts it in our active hand - - status = LIGHT_EMPTY - update() + drop_light_tube(user) // break the light and make sparks if was on -/obj/machinery/light/attack_tk(mob/user) - if(status == LIGHT_EMPTY) - to_chat(user, "There is no [fitting] in this light.") - return - - to_chat(user, "You telekinetically remove the light [fitting].") - // create a light tube/bulb item and put it in the user's hand +/obj/machinery/light/proc/drop_light_tube(mob/user) var/obj/item/light/L = new light_type() L.status = status L.rigged = rigged @@ -528,11 +525,25 @@ switchcount = 0 L.update() - L.add_fingerprint(user) - L.loc = loc + L.forceMove(loc) + + if(user) //puts it in our active hand + L.add_fingerprint(user) + user.put_in_active_hand(L) status = LIGHT_EMPTY update() + return L + +/obj/machinery/light/attack_tk(mob/user) + if(status == LIGHT_EMPTY) + to_chat(user, "There is no [fitting] in this light.") + return + + to_chat(user, "You telekinetically remove the light [fitting].") + // create a light tube/bulb item and put it in the user's hand + var/obj/item/light/L = drop_light_tube() + L.attack_tk(user) /obj/machinery/light/proc/break_light_tube(skip_sound_and_sparks = 0, overloaded = 0) if(status == LIGHT_EMPTY || status == LIGHT_BROKEN) diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index 60adf9b2fc3..45fdd9d6812 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -142,6 +142,10 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin ..() return +/obj/structure/particle_accelerator/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + new /obj/item/stack/sheet/metal (loc, 5) + qdel(src) /obj/structure/particle_accelerator/Move() . = ..() @@ -149,20 +153,6 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin master.toggle_power() investigate_log("was moved whilst active; it powered down.","singulo") - -/obj/structure/particle_accelerator/ex_act(severity) - switch(severity) - if(1.0) - qdel(src) - return - if(2.0) - if(prob(50)) - qdel(src) - return - if(3.0) - if(prob(25)) - qdel(src) - /obj/machinery/particle_accelerator/control_box/blob_act(obj/structure/blob/B) if(prob(50)) qdel(src) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 9595d37936c..2cdc20d110f 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -55,24 +55,15 @@ /obj/machinery/power/solar/attackby(obj/item/W, mob/user, params) - - if(istype(W, /obj/item/crowbar)) + if(iscrowbar(W)) playsound(src.loc, 'sound/machines/click.ogg', 50, 1) user.visible_message("[user] begins to take the glass off the solar panel.", "You begin to take the glass off the solar panel...") if(do_after(user, 50 * W.toolspeed, target = src)) - var/obj/item/solar_assembly/S = locate() in src - if(S) - S.loc = src.loc - S.give_glass() playsound(src.loc, W.usesound, 50, 1) user.visible_message("[user] takes the glass off the solar panel.", "You take the glass off the solar panel.") - qdel(src) + deconstruct(TRUE) return - else if(W) - src.add_fingerprint(user) - src.health -= W.force - src.healthcheck() - ..() + return ..() /obj/machinery/power/solar/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) @@ -84,17 +75,25 @@ if(BURN) playsound(loc, 'sound/items/welder.ogg', 100, TRUE) -/obj/machinery/power/solar/proc/healthcheck() - if(src.health <= 0) - if(!(stat & BROKEN)) - broken() - else - new /obj/item/shard(src.loc) - new /obj/item/shard(src.loc) - qdel(src) - return - return +/obj/machinery/power/solar/obj_break(damage_flag) + if(!(stat & BROKEN) && !(flags & NODECONSTRUCT)) + playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE) + stat |= BROKEN + unset_control() + update_icon() +/obj/machinery/power/solar/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + if(disassembled) + var/obj/item/solar_assembly/S = locate() in src + if(S) + S.forceMove(loc) + S.give_glass(stat & BROKEN) + else + playsound(src, "shatter", 70, TRUE) + new /obj/item/shard(src.loc) + new /obj/item/shard(src.loc) + qdel(src) /obj/machinery/power/solar/update_icon() ..() diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index 0b7f417b52e..3d0efa7ea9b 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -58,20 +58,34 @@ control.cdir = angle /obj/machinery/power/tracker/attackby(var/obj/item/W, var/mob/user) - - if(istype(W, /obj/item/crowbar)) + if(iscrowbar(W)) playsound(src.loc, 'sound/machines/click.ogg', 50, 1) user.visible_message("[user] begins to take the glass off the solar tracker.") if(do_after(user, 50 * W.toolspeed, target = src)) - var/obj/item/solar_assembly/S = locate() in src - if(S) - S.loc = src.loc - S.give_glass() playsound(src.loc, W.usesound, 50, 1) user.visible_message("[user] takes the glass off the tracker.") - qdel(src) // qdel + deconstruct(TRUE) return - ..() + return ..() + +/obj/machinery/power/tracker/obj_break(damage_flag) + if(!(stat & BROKEN) && !(flags & NODECONSTRUCT)) + playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE) + stat |= BROKEN + unset_control() + +/obj/machinery/power/solar/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + if(disassembled) + var/obj/item/solar_assembly/S = locate() in src + if(S) + S.forceMove(loc) + S.give_glass(stat & BROKEN) + else + playsound(src, "shatter", 70, TRUE) + new /obj/item/shard(src.loc) + new /obj/item/shard(src.loc) + qdel(src) // Tracker Electronic diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 964375a6668..7d0d23120f0 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -40,16 +40,12 @@ chem_splash(loc, 5, list(reagents)) qdel(src) -/obj/structure/reagent_dispensers/ex_act(severity) - switch(severity) - if(1) +/obj/structure/reagent_dispensers/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + if(!disassembled) boom() - if(2) - if(prob(50)) - boom() - if(3) - if(prob(5)) - boom() + else + qdel(src) //Dispensers /obj/structure/reagent_dispensers/watertank diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 7e1bb227ef3ae0611d5cfc2914cbb2abd504d0fb..bedd145d30810298c22c272d36b7580aa6761c02 100644 GIT binary patch delta 12379 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