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