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 7e1bb227ef3..bedd145d308 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ