diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm
index 41d298fffb1..be40fb0f2ab 100644
--- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm
+++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm
@@ -968,7 +968,7 @@
/turf/simulated/floor/mineral/bananium/lubed,
/area/ruin/powered/clownplanet)
"bD" = (
-/obj/effect/decal/mecha_wreckage/honker,
+/obj/structure/mecha_wreckage/honker,
/obj/structure/disposalpipe/segment{
dir = 4;
invisibility = 101
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm b/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm
index ae055f8bc63..2a5c0eae533 100644
--- a/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm
+++ b/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm
@@ -91,7 +91,7 @@
},
/area/ruin/powered)
"s" = (
-/obj/effect/decal/mecha_wreckage/phazon,
+/obj/structure/mecha_wreckage/phazon,
/turf/simulated/shuttle/floor{
tag = "icon-floor2";
icon_state = "floor2"
@@ -104,14 +104,14 @@
},
/area/ruin/powered)
"u" = (
-/obj/effect/decal/mecha_wreckage/ripley/firefighter,
+/obj/structure/mecha_wreckage/ripley/firefighter,
/turf/simulated/shuttle/floor{
tag = "icon-floor2";
icon_state = "floor2"
},
/area/ruin/powered)
"v" = (
-/obj/effect/decal/mecha_wreckage/ripley,
+/obj/structure/mecha_wreckage/ripley,
/turf/simulated/shuttle/floor{
tag = "icon-floor2";
icon_state = "floor2"
@@ -150,7 +150,7 @@
},
/area/ruin/powered)
"A" = (
-/obj/effect/decal/mecha_wreckage/durand,
+/obj/structure/mecha_wreckage/durand,
/turf/simulated/shuttle/floor{
tag = "icon-floor2";
icon_state = "floor2"
@@ -194,7 +194,7 @@
/turf/simulated/floor/plating/airless,
/area/ruin/powered)
"J" = (
-/obj/effect/decal/mecha_wreckage/odysseus,
+/obj/structure/mecha_wreckage/odysseus,
/turf/simulated/shuttle/floor{
tag = "icon-floor2";
icon_state = "floor2"
@@ -205,7 +205,7 @@
/turf/space,
/area/space/nearstation)
"L" = (
-/obj/effect/decal/mecha_wreckage/gygax,
+/obj/structure/mecha_wreckage/gygax,
/turf/simulated/shuttle/floor{
tag = "icon-floor3";
icon_state = "floor3"
diff --git a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm
index 77e09164224..af52a542c18 100644
--- a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm
+++ b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm
@@ -3156,7 +3156,7 @@
},
/area/awaymission/BMPship/Aft)
"ia" = (
-/obj/effect/decal/mecha_wreckage/ripley,
+/obj/structure/mecha_wreckage/ripley,
/turf/simulated/floor/plating/airless,
/area/awaymission)
"ib" = (
diff --git a/_maps/map_files/RandomZLevels/centcomAway.dmm b/_maps/map_files/RandomZLevels/centcomAway.dmm
index e64c25da157..27ddb6f8a93 100644
--- a/_maps/map_files/RandomZLevels/centcomAway.dmm
+++ b/_maps/map_files/RandomZLevels/centcomAway.dmm
@@ -3483,7 +3483,7 @@
},
/area/awaymission/centcomAway/general)
"iP" = (
-/obj/effect/decal/mecha_wreckage/ripley,
+/obj/structure/mecha_wreckage/ripley,
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
@@ -4924,7 +4924,7 @@
},
/area/awaymission/centcomAway/general)
"lW" = (
-/obj/effect/decal/mecha_wreckage/seraph,
+/obj/structure/mecha_wreckage/seraph,
/turf/simulated/floor/plasteel{
tag = "icon-vault (NORTHEAST)";
icon_state = "vault";
diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm
index ffb4f0fbc7f..684365ada39 100644
--- a/_maps/map_files/cyberiad/z2.dmm
+++ b/_maps/map_files/cyberiad/z2.dmm
@@ -9138,7 +9138,7 @@
},
/area/admin)
"vH" = (
-/obj/effect/decal/mecha_wreckage/phazon,
+/obj/structure/mecha_wreckage/phazon,
/turf/unsimulated/floor{
tag = "icon-floor";
icon_state = "floor"
diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm
index 61c4eaf0dff..354f28a45b7 100644
--- a/code/game/gamemodes/blob/blobs/core.dm
+++ b/code/game/gamemodes/blob/blobs/core.dm
@@ -56,18 +56,6 @@
if(overmind) //we should have an overmind, but...
overmind.update_health_hud()
-/obj/structure/blob/core/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
- return
-
-/obj/structure/blob/core/update_icon()
- cut_overlays()
- color = null
- var/mutable_appearance/blob_overlay = mutable_appearance('icons/mob/blob.dmi', "blob")
- if(overmind)
- blob_overlay.color = overmind.blob_reagent_datum.color
- add_overlay(blob_overlay)
- add_overlay(mutable_appearance('icons/mob/blob.dmi', "blob_core_overlay"))
-
/obj/structure/blob/core/RegenHealth()
return // Don't regen, we handle it in Life()
diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm
index d4164997184..7d21bcc7946 100644
--- a/code/game/gamemodes/blob/blobs/node.dm
+++ b/code/game/gamemodes/blob/blobs/node.dm
@@ -20,9 +20,6 @@
var/image/C = new('icons/mob/blob.dmi', "blob_node_overlay")
src.overlays += C
-/obj/structure/blob/node/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
- return
-
/obj/structure/blob/node/Destroy()
blob_nodes -= src
STOP_PROCESSING(SSobj, src)
@@ -36,13 +33,4 @@
for(var/i = 1; i < 8; i += i)
Pulse(5, i, color)
obj_integrity = min(max_integrity, obj_integrity + 1)
- color = null
-
-/obj/structure/blob/node/update_icon()
- cut_overlays()
- color = null
- var/mutable_appearance/blob_overlay = mutable_appearance('icons/mob/blob.dmi', "blob")
- if(overmind)
- blob_overlay.color = overmind.blob_reagent_datum.color
- add_overlay(blob_overlay)
- add_overlay(mutable_appearance('icons/mob/blob.dmi', "blob_node_overlay"))
\ No newline at end of file
+ color = null
\ No newline at end of file
diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm
index c5a7f241d49..d35aaccea37 100644
--- a/code/game/gamemodes/blob/blobs/shield.dm
+++ b/code/game/gamemodes/blob/blobs/shield.dm
@@ -1,7 +1,7 @@
/obj/structure/blob/shield
name = "strong blob"
icon = 'icons/mob/blob.dmi'
- icon_state = "blob_idle"
+ icon_state = "blob_shield"
desc = "Some blob creature thingy"
max_integrity = 150
brute_resist = 0.25
@@ -26,9 +26,6 @@
atmosblock = TRUE
air_update_turf(1)
-/obj/structure/blob/shield/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
- return
-
/obj/structure/blob/shield/CanPass(atom/movable/mover, turf/target, height=0)
if(istype(mover) && mover.checkpass(PASSBLOB)) return 1
return 0
@@ -36,7 +33,7 @@
/obj/structure/blob/shield/reflective
name = "reflective blob"
desc = "A solid wall of slightly twitching tendrils with a reflective glow."
- icon_state = "blob_idle_glow"
+ icon_state = "blob_glow"
max_integrity = 100
brute_resist = 0.5
explosion_block = 2
diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm
index 34db0a40478..37251cabbf2 100644
--- a/code/game/gamemodes/blob/theblob.dm
+++ b/code/game/gamemodes/blob/theblob.dm
@@ -53,12 +53,6 @@
var/atom/movable/mover = caller
. = . || mover.checkpass(PASSBLOB)
-/obj/structure/blob/update_icon() //Updates color based on overmind color if we have an overmind.
- if(overmind)
- add_atom_colour(overmind.blob_reagent_datum.color, FIXED_COLOUR_PRIORITY)
- else
- remove_atom_colour(FIXED_COLOUR_PRIORITY)
-
/obj/structure/blob/process()
Life()
return
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 735a423a230..7e0508ba24f 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -234,8 +234,8 @@
return ..()
/obj/machinery/camera/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
- if(!(stat & BROKEN))
- return 0
+ if(stat & BROKEN)
+ return damage_amount
. = ..()
/obj/machinery/camera/obj_break(damage_flag)
diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm
index 008dc26f834..e9cf036d3ca 100644
--- a/code/game/machinery/computer/aifixer.dm
+++ b/code/game/machinery/computer/aifixer.dm
@@ -69,6 +69,7 @@
if(occupant.health >= 0 && occupant.stat == DEAD)
occupant.update_revive()
occupant.lying = 0
+ update_icon()
sleep(10)
active = 0
add_fingerprint(usr)
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index a56d5c40236..28f847d81eb 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -8,18 +8,17 @@
light_color = "#00FF00"
var/prize = /obj/item/stack/tickets
-/obj/machinery/computer/arcade/power_change()
- ..()
- if(!(stat & (BROKEN|NOPOWER)))
- set_light(2)
- else
- set_light(0)
+/obj/machinery/computer/arcade/proc/Reset()
+ return
/obj/machinery/computer/arcade/New()
..()
- var/choice = pick(subtypesof(/obj/machinery/computer/arcade))
- new choice(loc)
- qdel(src)
+ if(!circuit)
+ var/choice = pick(subtypesof(/obj/machinery/computer/arcade))
+ new choice(loc)
+ qdel(src)
+ return
+ Reset()
/obj/machinery/computer/arcade/proc/prizevend(var/score)
@@ -65,7 +64,7 @@
var/blocked = 0 //Player cannot attack/heal while set
var/turtle = 0
-/obj/machinery/computer/arcade/battle/New()
+/obj/machinery/computer/arcade/battle/Reset()
var/name_action
var/name_part1
var/name_part2
@@ -166,7 +165,7 @@
turtle = 0
if(emagged)
- New()
+ Reset()
emagged = 0
add_fingerprint(usr)
@@ -186,7 +185,7 @@
new /obj/item/clothing/head/collectable/petehat(get_turf(src))
message_admins("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.")
log_game("[key_name(usr)] has outbombed Cuban Pete and been awarded a bomb.")
- New()
+ Reset()
emagged = 0
else
feedback_inc("arcade_win_normal")
@@ -311,7 +310,7 @@
var/spaceport_freebie = 0
var/last_spaceport_action = ""
-/obj/machinery/computer/arcade/orion_trail/New()
+/obj/machinery/computer/arcade/orion_trail/Reset()
// Sets up the main trail
stops = list("Pluto","Asteroid Belt","Proxima Centauri","Dead Space","Rigel Prime","Tau Ceti Beta","Black Hole","Space Outpost Beta-9","Orion Prime")
stopblurbs = list(
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index ab75682aeb3..9e8bc08f9b2 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -453,6 +453,7 @@
to_chat(user, "You wrench the frame into place.")
anchored = 1
state = 1
+ return
if(istype(P, /obj/item/weldingtool))
var/obj/item/weldingtool/WT = P
if(!WT.remove_fuel(0, user))
@@ -463,7 +464,7 @@
if(!src || !WT.isOn()) return
to_chat(user, "You deconstruct the frame.")
deconstruct(TRUE)
- return
+ return
if(1)
if(istype(P, /obj/item/wrench))
playsound(loc, P.usesound, 50, 1)
@@ -471,6 +472,7 @@
to_chat(user, "You unfasten the frame.")
anchored = 0
state = 0
+ return
if(istype(P, /obj/item/circuitboard) && !circuit)
var/obj/item/circuitboard/B = P
if(B.board_type == "computer")
@@ -482,11 +484,13 @@
P.loc = src
else
to_chat(user, "This frame does not accept circuit boards of this type!")
+ return
if(istype(P, /obj/item/screwdriver) && circuit)
playsound(loc, P.usesound, 50, 1)
to_chat(user, "You screw the circuit board into place.")
state = 2
icon_state = "2"
+ return
if(istype(P, /obj/item/crowbar) && circuit)
playsound(loc, P.usesound, 50, 1)
to_chat(user, "You remove the circuit board.")
@@ -494,13 +498,14 @@
icon_state = "0"
circuit.loc = loc
circuit = null
- return
+ return
if(2)
if(istype(P, /obj/item/screwdriver) && circuit)
playsound(loc, P.usesound, 50, 1)
to_chat(user, "You unfasten the circuit board.")
state = 1
icon_state = "1"
+ return
if(istype(P, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = P
if(C.amount >= 5)
@@ -516,7 +521,7 @@
return
else
to_chat(user, "You need five lengths of cable to wire the frame.")
- return
+ return
if(3)
if(istype(P, /obj/item/wirecutters))
playsound(loc, P.usesound, 50, 1)
@@ -525,7 +530,7 @@
icon_state = "2"
var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( loc )
A.amount = 5
-
+ return
if(istype(P, /obj/item/stack/sheet/glass))
var/obj/item/stack/sheet/glass/G = P
if(G.amount >= 2)
@@ -541,7 +546,7 @@
return
else
to_chat(user, "You need two sheets of glass for this.")
- return
+ return
if(4)
if(istype(P, /obj/item/crowbar))
playsound(loc, P.usesound, 50, 1)
@@ -549,6 +554,7 @@
state = 3
icon_state = "3"
new /obj/item/stack/sheet/glass(loc, 2)
+ return
if(istype(P, /obj/item/screwdriver))
playsound(loc, P.usesound, 50, 1)
to_chat(user, "You connect the monitor.")
@@ -562,8 +568,9 @@
var/obj/item/circuitboard/supplycomp/C = circuit
SC.can_order_contraband = C.contraband_enabled
qdel(src)
- return
- return ..()
+ return
+ if(user.a_intent == INTENT_HARM)
+ return ..()
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index 57a77ecad2e..2d082afb9c2 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -19,7 +19,7 @@
/obj/machinery/constructable_frame/deconstruct(disassembled = TRUE)
if(!(flags & NODECONSTRUCT))
new /obj/item/stack/sheet/metal(loc, 5)
- if(state >= 3)
+ if(state >= 2)
var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil(loc)
A.amount = 5
if(circuit)
@@ -88,13 +88,13 @@
return
else
to_chat(user, "You need five lengths of cable to wire the frame.")
- return
+ return
if(istype(P, /obj/item/wrench))
playsound(src.loc, P.usesound, 75, 1)
to_chat(user, "You dismantle the frame.")
deconstruct(TRUE)
- return
+ return
if(2)
if(istype(P, /obj/item/circuitboard))
var/obj/item/circuitboard/B = P
@@ -121,8 +121,6 @@
var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil(src.loc,5)
A.amount = 5
return
- return
-
if(3)
if(istype(P, /obj/item/crowbar))
playsound(src.loc, P.usesound, 50, 1)
@@ -213,8 +211,10 @@
if(!success)
to_chat(user, "You cannot add that to the machine!")
return 0
- return
- return ..()
+ return
+ if(user.a_intent == INTENT_HARM)
+ return ..()
+
//Machine Frame Circuit Boards
/*Common Parts: Parts List: Ignitor, Timer, Infra-red laser, Infra-red sensor, t_scanner, Capacitor, Valve, sensor unit,
diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm
index a30f50a69d0..52b3b122c18 100644
--- a/code/game/mecha/combat/durand.dm
+++ b/code/game/mecha/combat/durand.dm
@@ -11,7 +11,7 @@
max_temperature = 30000
infra_luminosity = 8
force = 40
- wreckage = /obj/effect/decal/mecha_wreckage/durand
+ wreckage = /obj/structure/mecha_wreckage/durand
/obj/mecha/combat/durand/GrantActions(mob/living/user, human_occupant = 0)
..()
@@ -41,4 +41,4 @@
max_temperature = 30000
infra_luminosity = 8
force = 40
- wreckage = /obj/effect/decal/mecha_wreckage/durand/old
\ No newline at end of file
+ wreckage = /obj/structure/mecha_wreckage/durand/old
\ No newline at end of file
diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm
index 4a26149ec2f..b47693f1dcb 100644
--- a/code/game/mecha/combat/gygax.dm
+++ b/code/game/mecha/combat/gygax.dm
@@ -11,7 +11,7 @@
max_temperature = 25000
infra_luminosity = 6
leg_overload_coeff = 2
- wreckage = /obj/effect/decal/mecha_wreckage/gygax
+ wreckage = /obj/structure/mecha_wreckage/gygax
internal_damage_threshold = 35
max_equip = 3
maxsize = 2
@@ -44,7 +44,7 @@
max_temperature = 35000
leg_overload_coeff = 100
operation_req_access = list(access_syndicate)
- wreckage = /obj/effect/decal/mecha_wreckage/gygax/dark
+ wreckage = /obj/structure/mecha_wreckage/gygax/dark
max_equip = 4
maxsize = 2
starting_voice = /obj/item/mecha_modkit/voice/syndicate
diff --git a/code/game/mecha/combat/honker.dm b/code/game/mecha/combat/honker.dm
index a9f72b2a67f..35df97e3bea 100644
--- a/code/game/mecha/combat/honker.dm
+++ b/code/game/mecha/combat/honker.dm
@@ -11,7 +11,7 @@
max_temperature = 25000
infra_luminosity = 5
operation_req_access = list(access_clown)
- wreckage = /obj/effect/decal/mecha_wreckage/honker
+ wreckage = /obj/structure/mecha_wreckage/honker
add_req_access = 0
max_equip = 3
starting_voice = /obj/item/mecha_modkit/voice/honk
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm
index 2347813b2ce..4b17b172c55 100644
--- a/code/game/mecha/combat/marauder.dm
+++ b/code/game/mecha/combat/marauder.dm
@@ -11,7 +11,7 @@
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
infra_luminosity = 3
operation_req_access = list(access_cent_specops)
- wreckage = /obj/effect/decal/mecha_wreckage/marauder
+ wreckage = /obj/structure/mecha_wreckage/marauder
add_req_access = 0
internal_damage_threshold = 25
force = 45
@@ -52,7 +52,7 @@
operation_req_access = list(access_cent_commander)
step_in = 3
max_integrity = 550
- wreckage = /obj/effect/decal/mecha_wreckage/seraph
+ wreckage = /obj/structure/mecha_wreckage/seraph
internal_damage_threshold = 20
force = 80
max_equip = 8
@@ -89,7 +89,7 @@
icon_state = "mauler"
initial_icon = "mauler"
operation_req_access = list(access_syndicate)
- wreckage = /obj/effect/decal/mecha_wreckage/mauler
+ wreckage = /obj/structure/mecha_wreckage/mauler
starting_voice = /obj/item/mecha_modkit/voice/syndicate
/obj/mecha/combat/marauder/mauler/loaded/New()
diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm
index 0350f73985d..be166c3b8f3 100644
--- a/code/game/mecha/combat/phazon.dm
+++ b/code/game/mecha/combat/phazon.dm
@@ -12,7 +12,7 @@
armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 30, "bio" = 0, "rad" = 50, "fire" = 100, "acid" = 100)
max_temperature = 25000
infra_luminosity = 3
- wreckage = /obj/effect/decal/mecha_wreckage/phazon
+ wreckage = /obj/structure/mecha_wreckage/phazon
add_req_access = 1
//operation_req_access = list()
internal_damage_threshold = 25
diff --git a/code/game/mecha/combat/reticence.dm b/code/game/mecha/combat/reticence.dm
index 2e86a2ab35e..35fb7dff7f8 100644
--- a/code/game/mecha/combat/reticence.dm
+++ b/code/game/mecha/combat/reticence.dm
@@ -9,7 +9,7 @@
deflect_chance = 30
armor = list("melee" = 25, "bullet" = 20, "laser" = 30, "energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
max_temperature = 15000
- wreckage = /obj/effect/decal/mecha_wreckage/reticence
+ wreckage = /obj/structure/mecha_wreckage/reticence
operation_req_access = list(access_mime)
add_req_access = 0
internal_damage_threshold = 60
diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm
index ae2bf716018..f61a1383309 100644
--- a/code/game/mecha/equipment/tools/mining_tools.dm
+++ b/code/game/mecha/equipment/tools/mining_tools.dm
@@ -40,10 +40,9 @@
if(isliving(target))
drill_mob(target, chassis.occupant)
playsound(src, 'sound/weapons/drill.ogg', 40, TRUE)
- else if(istype(target, /obj))
+ else if(isobj(target))
var/obj/O = target
- //O.take_damage(15, BRUTE, 0, FALSE, get_dir(chassis, target))
- O.ex_act(2)//TO-DO-OBJECT-DAMAGE: Kill off when everything is damageable
+ O.take_damage(15, BRUTE, 0, FALSE, get_dir(chassis, target))
playsound(src, 'sound/weapons/drill.ogg', 40, TRUE)
else
set_ready_state(TRUE)
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index ffd90bed09c..6e86bbed7de 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -113,7 +113,6 @@
smoke_system.set_up(3, src)
smoke_system.attach(src)
add_cell()
-
START_PROCESSING(SSobj, src)
GLOB.poi_list |= src
log_message("[src] created.")
@@ -602,24 +601,31 @@
if(occupant)
occupant.ex_act(severity)
+/obj/mecha/handle_atom_del(atom/A)
+ if(A == occupant)
+ occupant = null
+ icon_state = initial(icon_state)+"-open"
+ setDir(dir_in)
/obj/mecha/Destroy()
if(occupant)
occupant.SetSleeping(destruction_sleep_duration)
go_out()
+ var/mob/living/silicon/ai/AI
for(var/mob/M in src) //Let's just be ultra sure
if(isAI(M))
- M.gib() //AIs are loaded into the mech computer itself. When the mech dies, so does the AI. Forever.
+ occupant = null
+ AI = M //AIs are loaded into the mech computer itself. When the mech dies, so does the AI. They can be recovered with an AI card from the wreck.
else
M.forceMove(loc)
-
for(var/obj/item/mecha_parts/mecha_equipment/E in equipment)
E.detach(loc)
qdel(E)
equipment.Cut()
QDEL_NULL(cell)
QDEL_NULL(internal_tank)
-
+ if(AI)
+ AI.gib() //No wreck, no AI to recover
STOP_PROCESSING(SSobj, src)
GLOB.poi_list.Remove(src)
if(loc)
@@ -638,7 +644,7 @@
/obj/mecha/emp_act(severity)
if(get_charge())
use_power((cell.charge/3)/(severity*2))
- take_damage(50 / severity, "energy")
+ take_damage(30 / severity, BURN, "energy", 1)
log_message("EMP detected", 1)
check_for_internal_damage(list(MECHA_INT_FIRE, MECHA_INT_TEMP_CONTROL, MECHA_INT_CONTROL_LOST, MECHA_INT_SHORT_CIRCUIT), 1)
@@ -646,7 +652,7 @@
..()
if(exposed_temperature > max_temperature)
log_message("Exposed to dangerous temperature.", 1)
- take_damage(5, "fire")
+ take_damage(5, BURN, 0, 1)
check_for_internal_damage(list(MECHA_INT_FIRE, MECHA_INT_TEMP_CONTROL))
//////////////////////
@@ -1355,7 +1361,7 @@
if(cabin_air && cabin_air.return_volume()>0)
cabin_air.temperature = min(6000+T0C, cabin_air.return_temperature()+rand(10,15))
if(cabin_air.return_temperature() > max_temperature/2)
- take_damage(4/round(max_temperature/cabin_air.return_temperature(),0.1),"fire")
+ take_damage(4/round(max_temperature/cabin_air.return_temperature(),0.1), BURN, 0, 0)
if(internal_damage & MECHA_INT_TANK_BREACH) //remove some air from internal tank
if(internal_tank)
@@ -1444,7 +1450,7 @@
if(isAI(occupant))
AI = occupant
occupant = null
- var/obj/effect/decal/mecha_wreckage/WR = new wreckage(loc, AI)
+ var/obj/structure/mecha_wreckage/WR = new wreckage(loc, AI)
for(var/obj/item/mecha_parts/mecha_equipment/E in equipment)
if(E.salvageable && prob(30))
WR.crowbar_salvage += E
diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm
index ebda1140c4b..0e0ed85b727 100644
--- a/code/game/mecha/mecha_wreckage.dm
+++ b/code/game/mecha/mecha_wreckage.dm
@@ -3,230 +3,214 @@
///////////////////////////////////
-/obj/effect/decal/mecha_wreckage
- name = "Exosuit wreckage"
- desc = "Remains of some unfortunate mecha. Completely unrepairable."
+/obj/structure/mecha_wreckage
+ name = "exosuit wreckage"
+ desc = "Remains of some unfortunate mecha. Completely unrepairable, but perhaps something can be salvaged."
icon = 'icons/mecha/mecha.dmi'
- density = 1
- anchored = 0
+ density = TRUE
+ anchored = FALSE
opacity = 0
- var/list/welder_salvage = list(/obj/item/stack/sheet/plasteel,/obj/item/stack/sheet/metal,/obj/item/stack/rods)
- var/list/wirecutters_salvage = list(/obj/item/stack/cable_coil)
- var/list/crowbar_salvage
+ var/list/welder_salvage = list(/obj/item/stack/sheet/plasteel, /obj/item/stack/sheet/metal, /obj/item/stack/rods)
var/salvage_num = 5
+ var/list/crowbar_salvage = list()
+ var/wires_removed = FALSE
+ var/mob/living/silicon/ai/AI //AIs to be salvaged
+ var/list/parts
-/obj/effect/decal/mecha_wreckage/New()
- ..()
- crowbar_salvage = new
- return
-
-/obj/effect/decal/mecha_wreckage/ex_act(severity)
- if(severity < 2)
- qdel(src)
-
-/obj/effect/decal/mecha_wreckage/bullet_act(obj/item/projectile/Proj)
- return
-
-
-/obj/effect/decal/mecha_wreckage/attackby(obj/item/W as obj, mob/user as mob, params)
- if(istype(W, /obj/item/weldingtool))
- var/obj/item/weldingtool/WT = W
- if(salvage_num <= 0)
- user.visible_message("[user] begins to slice apart the now completely stripped [src].", "You begin to slice apart the [src].", "You hear the sound of a welder nearby.")
- if(WT.remove_fuel(0,user) && do_after(user, 80 * WT.toolspeed, target = src))
- user.visible_message("The now-dilapidated [src] falls apart in a clatter.", "As you slice apart the final support structures, the [src] falls apart in a heap.", "You hear metal clanking to the floor.")
- new /obj/item/stack/sheet/metal(src.loc)
- var/obj/item/stack/rods/rods = new /obj/item/stack/rods(src.loc)
- rods.amount = 2
- qdel(src)
- else
- if(isemptylist(welder_salvage))
- to_chat(user, "What's left on the [src] cannot be removed with a welder, besides the frame itself")
- else if(WT.remove_fuel(0,user))
- var/type = prob(70)?pick(welder_salvage):null
- if(type)
- var/N = new type(get_turf(user))
- user.visible_message("[user] cuts [N] from [src]", "You cut [N] from [src]", "You hear a sound of welder nearby")
- if(istype(N, /obj/item/mecha_parts/part))
- welder_salvage -= type
- salvage_num--
- else
- to_chat(user, "You failed to salvage anything valuable from [src].")
- else
- to_chat(user, "You need more welding fuel to complete this task.")
- else if(istype(W, /obj/item/wirecutters))
- if(salvage_num <= 0)
- to_chat(user, "You don't see anything that can be cut with [W].")
- return
- else if(!isemptylist(wirecutters_salvage))
- var/type = prob(70)?pick(wirecutters_salvage):null
- if(type)
- var/N = new type(get_turf(user))
- user.visible_message("[user] cuts [N] from [src].", "You cut [N] from [src].")
- salvage_num--
- else
- to_chat(user, "You failed to salvage anything valuable from [src].")
- else if(istype(W, /obj/item/crowbar))
- if(!isemptylist(crowbar_salvage))
- var/obj/S = pick(crowbar_salvage)
- if(S)
- S.loc = get_turf(user)
- crowbar_salvage -= S
- user.visible_message("[user] pries [S] from [src].", "You pry [S] from [src].")
- else
- to_chat(user, "You don't see anything that can be pried with [W].")
- else
- return ..()
-
-
-/obj/effect/decal/mecha_wreckage/gygax
- name = "Gygax wreckage"
- icon_state = "gygax-broken"
-
-/obj/effect/decal/mecha_wreckage/gygax/New()
- ..()
- var/list/parts = list(/obj/item/mecha_parts/part/gygax_torso,
- /obj/item/mecha_parts/part/gygax_head,
- /obj/item/mecha_parts/part/gygax_left_arm,
- /obj/item/mecha_parts/part/gygax_right_arm,
- /obj/item/mecha_parts/part/gygax_left_leg,
- /obj/item/mecha_parts/part/gygax_right_leg)
- for(var/i=0;i<2;i++)
- if(!isemptylist(parts) && prob(40))
+/obj/structure/mecha_wreckage/Initialize(mapload, mob/living/silicon/ai/AI_pilot)
+ . = ..()
+ if(parts)
+ for(var/i in 1 to 2)
+ if(!parts.len)
+ break
+ if(prob(60))
+ continue
var/part = pick(parts)
welder_salvage += part
- parts -= part
- return
+ parts = null
+ if(!AI_pilot) //Type-checking for this is already done in mecha/Destroy()
+ return
+ AI = AI_pilot
+ AI.apply_damage(150, BURN) //Give the AI a bit of damage from the "shock" of being suddenly shut down
+ AI.death() //The damage is not enough to kill the AI, but to be 'corrupted files' in need of repair.
+ AI.forceMove(src) //Put the dead AI inside the wreckage for recovery
+ add_overlay(mutable_appearance('icons/obj/projectiles.dmi', "green_laser")) //Overlay for the recovery beacon
+ AI.controlled_mech = null
+ AI.remote_control = null
-/obj/effect/decal/mecha_wreckage/gygax/dark
- name = "Dark Gygax wreckage"
+/obj/structure/mecha_wreckage/Destroy()
+ QDEL_NULL(AI)
+ QDEL_LIST(crowbar_salvage)
+ return ..()
+
+/obj/structure/mecha_wreckage/examine(mob/user)
+ . = ..()
+ if(!AI)
+ return
+ . += "The AI recovery beacon is active."
+
+/obj/structure/mecha_wreckage/attackby(obj/item/I, mob/user, params)
+ if(iswelder(I))
+ if(salvage_num <= 0 || !length(welder_salvage))
+ to_chat(user, "You don't see anything that can be cut with [I]!")
+ return
+ var/obj/item/weldingtool/WT = I
+ playsound(get_turf(src), WT.usesound, 50, TRUE)
+ if(!WT.remove_fuel(0, user))
+ return
+ if(prob(30))
+ to_chat(user, "You fail to salvage anything valuable from [src]!")
+ return
+ var/type = pick(welder_salvage)
+ var/N = new type(get_turf(user))
+ user.visible_message("[user] cuts [N] from [src].", "You cut [N] from [src].")
+ if(!istype(N, /obj/item/stack))
+ welder_salvage -= type
+ salvage_num--
+ return
+
+ if(iswirecutter(I))
+ if(wires_removed)
+ to_chat(user, "You don't see anything that can be cut with [I]!")
+ return
+ var/N = new /obj/item/stack/cable_coil(get_turf(user), rand(1, 3))
+ user.visible_message("[user] cuts [N] from [src].", "You cut [N] from [src].")
+ wires_removed = TRUE
+ return
+
+ if(iscrowbar(I))
+ if(crowbar_salvage.len)
+ var/obj/S = pick(crowbar_salvage)
+ S.forceMove(user.drop_location())
+ user.visible_message("[user] pries [S] from [src].", "You pry [S] from [src].")
+ crowbar_salvage -= S
+ return
+ to_chat(user, "You don't see anything that can be cut with [I]!")
+ return
+ return ..()
+
+
+/obj/structure/mecha_wreckage/transfer_ai(interaction, mob/user, null, obj/item/aicard/card)
+ if(!..())
+ return
+
+ //Proc called on the wreck by the AI card.
+ if(interaction != AI_TRANS_TO_CARD) //AIs can only be transferred in one direction, from the wreck to the card.
+ return
+ if(!AI) //No AI in the wreck
+ to_chat(user, "No AI backups found.")
+ return
+ cut_overlays() //Remove the recovery beacon overlay
+ AI.forceMove(card) //Move the dead AI to the card.
+ if(AI.client) //AI player is still in the dead AI and is connected
+ to_chat(AI, "The remains of your file system have been recovered on a mobile storage device.")
+ else //Give the AI a heads-up that it is probably going to get fixed.
+ AI.notify_ghost_cloning("You have been recovered from the wreckage!", source = card)
+ to_chat(user, "Backup files recovered: [AI.name] ([rand(1000, 9999)].exe) salvaged from [name] and stored within local memory.")
+ AI = null
+
+/obj/structure/mecha_wreckage/gygax
+ name = "\improper Gygax wreckage"
+ icon_state = "gygax-broken"
+ parts = list(
+ /obj/item/mecha_parts/part/gygax_torso,
+ /obj/item/mecha_parts/part/gygax_head,
+ /obj/item/mecha_parts/part/gygax_left_arm,
+ /obj/item/mecha_parts/part/gygax_right_arm,
+ /obj/item/mecha_parts/part/gygax_left_leg,
+ /obj/item/mecha_parts/part/gygax_right_leg
+ )
+
+/obj/structure/mecha_wreckage/gygax/dark
+ name = "\improper Dark Gygax wreckage"
icon_state = "darkgygax-broken"
-/obj/effect/decal/mecha_wreckage/marauder
- name = "Marauder wreckage"
+/obj/structure/mecha_wreckage/marauder
+ name = "\improper Marauder wreckage"
icon_state = "marauder-broken"
-/obj/effect/decal/mecha_wreckage/mauler
- name = "Mauler wreckage"
+/obj/structure/mecha_wreckage/mauler
+ name = "\improper Mauler wreckage"
icon_state = "mauler-broken"
desc = "The syndicate won't be very happy about this..."
-/obj/effect/decal/mecha_wreckage/seraph
- name = "Seraph wreckage"
+/obj/structure/mecha_wreckage/seraph
+ name = "\improper Seraph wreckage"
icon_state = "seraph-broken"
-/obj/effect/decal/mecha_wreckage/reticence
+/obj/structure/mecha_wreckage/reticence
name = "\improper Reticence wreckage"
- icon_state = "mime-broken"
+ icon_state = "reticence-broken"
+ color = "#87878715"
+ desc = "..."
-/obj/effect/decal/mecha_wreckage/ripley
- name = "Ripley wreckage"
+/obj/structure/mecha_wreckage/ripley
+ name = "\improper Ripley wreckage"
icon_state = "ripley-broken"
+ parts = list(/obj/item/mecha_parts/part/ripley_torso,
+ /obj/item/mecha_parts/part/ripley_left_arm,
+ /obj/item/mecha_parts/part/ripley_right_arm,
+ /obj/item/mecha_parts/part/ripley_left_leg,
+ /obj/item/mecha_parts/part/ripley_right_leg)
-/obj/effect/decal/mecha_wreckage/ripley/New()
- ..()
- var/list/parts = list(/obj/item/mecha_parts/part/ripley_torso,
- /obj/item/mecha_parts/part/ripley_left_arm,
- /obj/item/mecha_parts/part/ripley_right_arm,
- /obj/item/mecha_parts/part/ripley_left_leg,
- /obj/item/mecha_parts/part/ripley_right_leg)
- for(var/i=0;i<2;i++)
- if(!isemptylist(parts) && prob(40))
- var/part = pick(parts)
- welder_salvage += part
- parts -= part
- return
+/obj/structure/mecha_wreckage/ripley/mkii
+ name = "\improper Ripley MK-II wreckage"
+ icon_state = "ripleymkii-broken"
-/obj/effect/decal/mecha_wreckage/ripley/firefighter
- name = "Firefighter wreckage"
+/obj/structure/mecha_wreckage/ripley/firefighter
+ name = "\improper Firefighter wreckage"
icon_state = "firefighter-broken"
+ parts = list(/obj/item/mecha_parts/part/ripley_torso,
+ /obj/item/mecha_parts/part/ripley_left_arm,
+ /obj/item/mecha_parts/part/ripley_right_arm,
+ /obj/item/mecha_parts/part/ripley_left_leg,
+ /obj/item/mecha_parts/part/ripley_right_leg,
+ /obj/item/clothing/suit/fire)
-/obj/effect/decal/mecha_wreckage/ripley/firefighter/New()
- ..()
- var/list/parts = list(/obj/item/mecha_parts/part/ripley_torso,
- /obj/item/mecha_parts/part/ripley_left_arm,
- /obj/item/mecha_parts/part/ripley_right_arm,
- /obj/item/mecha_parts/part/ripley_left_leg,
- /obj/item/mecha_parts/part/ripley_right_leg,
- /obj/item/clothing/suit/fire)
- for(var/i=0;i<2;i++)
- if(!isemptylist(parts) && prob(40))
- var/part = pick(parts)
- welder_salvage += part
- parts -= part
- return
-
-/obj/effect/decal/mecha_wreckage/ripley/deathripley
- name = "Death-Ripley wreckage"
+/obj/structure/mecha_wreckage/ripley/deathripley
+ name = "\improper Death-Ripley wreckage"
icon_state = "deathripley-broken"
+ parts = null
-/obj/effect/decal/mecha_wreckage/honker
- name = "Honker wreckage"
+/obj/structure/mecha_wreckage/honker
+ name = "\improper H.O.N.K wreckage"
icon_state = "honker-broken"
+ desc = "All is right in the universe."
+ parts = list(
+ /obj/item/mecha_parts/chassis/honker,
+ /obj/item/mecha_parts/part/honker_torso,
+ /obj/item/mecha_parts/part/honker_head,
+ /obj/item/mecha_parts/part/honker_left_arm,
+ /obj/item/mecha_parts/part/honker_right_arm,
+ /obj/item/mecha_parts/part/honker_left_leg,
+ /obj/item/mecha_parts/part/honker_right_leg)
-/obj/effect/decal/mecha_wreckage/honker/New()
- ..()
- var/list/parts = list(
- /obj/item/mecha_parts/chassis/honker,
- /obj/item/mecha_parts/part/honker_torso,
- /obj/item/mecha_parts/part/honker_head,
- /obj/item/mecha_parts/part/honker_left_arm,
- /obj/item/mecha_parts/part/honker_right_arm,
- /obj/item/mecha_parts/part/honker_left_leg,
- /obj/item/mecha_parts/part/honker_right_leg)
- for(var/i=0;i<2;i++)
- if(!isemptylist(parts) && prob(40))
- var/part = pick(parts)
- welder_salvage += part
- parts -= part
- return
-
-/obj/effect/decal/mecha_wreckage/durand
- name = "Durand wreckage"
+/obj/structure/mecha_wreckage/durand
+ name = "\improper Durand wreckage"
icon_state = "durand-broken"
+ parts = list(
+ /obj/item/mecha_parts/part/durand_torso,
+ /obj/item/mecha_parts/part/durand_head,
+ /obj/item/mecha_parts/part/durand_left_arm,
+ /obj/item/mecha_parts/part/durand_right_arm,
+ /obj/item/mecha_parts/part/durand_left_leg,
+ /obj/item/mecha_parts/part/durand_right_leg)
-/obj/effect/decal/mecha_wreckage/durand/New()
- ..()
- var/list/parts = list(
- /obj/item/mecha_parts/part/durand_torso,
- /obj/item/mecha_parts/part/durand_head,
- /obj/item/mecha_parts/part/durand_left_arm,
- /obj/item/mecha_parts/part/durand_right_arm,
- /obj/item/mecha_parts/part/durand_left_leg,
- /obj/item/mecha_parts/part/durand_right_leg)
- for(var/i=0;i<2;i++)
- if(!isemptylist(parts) && prob(40))
- var/part = pick(parts)
- welder_salvage += part
- parts -= part
- return
-
-
-/obj/effect/decal/mecha_wreckage/durand/old
- name = "Durand wreckage"
+/obj/structure/mecha_wreckage/durand/old
icon_state = "old_durand-broken"
-/obj/effect/decal/mecha_wreckage/phazon
- name = "Phazon wreckage"
+/obj/structure/mecha_wreckage/phazon
+ name = "\improper Phazon wreckage"
icon_state = "phazon-broken"
-/obj/effect/decal/mecha_wreckage/odysseus
- name = "Odysseus wreckage"
+/obj/structure/mecha_wreckage/odysseus
+ name = "\improper Odysseus wreckage"
icon_state = "odysseus-broken"
-
-/obj/effect/decal/mecha_wreckage/odysseus/New()
- ..()
- var/list/parts = list(
- /obj/item/mecha_parts/part/odysseus_torso,
- /obj/item/mecha_parts/part/odysseus_head,
- /obj/item/mecha_parts/part/odysseus_left_arm,
- /obj/item/mecha_parts/part/odysseus_right_arm,
- /obj/item/mecha_parts/part/odysseus_left_leg,
- /obj/item/mecha_parts/part/odysseus_right_leg)
- for(var/i=0;i<2;i++)
- if(!isemptylist(parts) && prob(40))
- var/part = pick(parts)
- welder_salvage += part
- parts -= part
- return
+ parts = list(
+ /obj/item/mecha_parts/part/odysseus_torso,
+ /obj/item/mecha_parts/part/odysseus_head,
+ /obj/item/mecha_parts/part/odysseus_left_arm,
+ /obj/item/mecha_parts/part/odysseus_right_arm,
+ /obj/item/mecha_parts/part/odysseus_left_leg,
+ /obj/item/mecha_parts/part/odysseus_right_leg)
\ No newline at end of file
diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm
index ead74cfcc08..dcee2c1e74e 100644
--- a/code/game/mecha/medical/odysseus.dm
+++ b/code/game/mecha/medical/odysseus.dm
@@ -6,7 +6,7 @@
step_in = 3
max_temperature = 15000
max_integrity = 120
- wreckage = /obj/effect/decal/mecha_wreckage/odysseus
+ wreckage = /obj/structure/mecha_wreckage/odysseus
internal_damage_threshold = 35
deflect_chance = 15
step_energy_drain = 6
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index 2f37642d78d..0e095f7ca12 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -12,7 +12,7 @@
deflect_chance = 15
armor = list("melee" = 40, "bullet" = 20, "laser" = 10, "energy" = 20, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
max_equip = 6
- wreckage = /obj/effect/decal/mecha_wreckage/ripley
+ wreckage = /obj/structure/mecha_wreckage/ripley
var/list/cargo = new
var/cargo_capacity = 15
var/hides = 0
@@ -72,7 +72,7 @@
lights_power = 7
armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 60, "bio" = 0, "rad" = 70, "fire" = 100, "acid" = 100)
max_equip = 5 // More armor, less tools
- wreckage = /obj/effect/decal/mecha_wreckage/ripley/firefighter
+ wreckage = /obj/structure/mecha_wreckage/ripley/firefighter
/obj/mecha/working/ripley/deathripley
desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE"
@@ -86,7 +86,7 @@
max_integrity = 300
lights_power = 7
armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 0, "bomb" = 70, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
- wreckage = /obj/effect/decal/mecha_wreckage/ripley/deathripley
+ wreckage = /obj/structure/mecha_wreckage/ripley/deathripley
step_energy_drain = 0
normal_step_energy_drain = 0
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 62ff1fb8281..deaf07cbe78 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -74,6 +74,7 @@
trigger_alarm()
/obj/structure/displaycase/proc/trigger_alarm()
+ set waitfor = FALSE
if(alert && is_station_contact(z))
var/area/alarmed = get_area(src)
alarmed.burglaralert(src)
diff --git a/code/game/objects/structures/door_assembly_types.dm b/code/game/objects/structures/door_assembly_types.dm
index 2475e9e1b4d..2873686e4f4 100644
--- a/code/game/objects/structures/door_assembly_types.dm
+++ b/code/game/objects/structures/door_assembly_types.dm
@@ -150,7 +150,7 @@
else
bound_width = world.icon_size
bound_height = width * world.icon_size
- update_icon()
+ ..()
/obj/structure/door_assembly/multi_tile/Move()
. = ..()
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 345bada5151..69eda1e4269 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
@@ -25,6 +25,7 @@
/obj/machinery/icemachine/New()
+ ..()
create_reagents(500)
/obj/machinery/icemachine/attackby(obj/item/I, mob/user, params)
diff --git a/code/modules/mob/living/simple_animal/bot/syndicate.dm b/code/modules/mob/living/simple_animal/bot/syndicate.dm
index ae26bfee220..6aa15ba0270 100644
--- a/code/modules/mob/living/simple_animal/bot/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/bot/syndicate.dm
@@ -167,7 +167,7 @@
visible_message("[src] blows apart!")
do_sparks(3, 1, src)
new /obj/effect/decal/cleanable/blood/oil(loc)
- var/obj/effect/decal/mecha_wreckage/gygax/dark/wreck = new /obj/effect/decal/mecha_wreckage/gygax/dark(loc)
+ var/obj/structure/mecha_wreckage/gygax/dark/wreck = new /obj/structure/mecha_wreckage/gygax/dark(loc)
wreck.name = "sentry bot wreckage"
raise_alert("[src] destroyed.")
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 23b51fc899b..f24b990a608 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -673,8 +673,8 @@
to_chat(user, "Access denied.")
/obj/machinery/power/apc/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
- if((!(stat & BROKEN) || malfai))
- return 0
+ if(stat & BROKEN)
+ return damage_amount
. = ..()
/obj/machinery/power/apc/obj_break(damage_flag)
diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm
index befb2a4931a..327c29cebda 100644
--- a/code/modules/power/singularity/particle_accelerator/particle.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle.dm
@@ -38,6 +38,10 @@
else if(istype(A, /obj/singularity))
var/obj/singularity/S = A
S.energy += energy
+ else if(istype(A, /obj/structure/blob))
+ var/obj/structure/blob/B = A
+ B.take_damage(energy * 0.6)
+ movement_range = 0
/obj/effect/accelerated_particle/Crossed(atom/A, oldloc)
if(isliving(A))
diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm
index 754479a69ca..7d7910b45d4 100644
--- a/code/modules/power/tesla/energy_ball.dm
+++ b/code/modules/power/tesla/energy_ball.dm
@@ -247,7 +247,7 @@
else if(closest_blob)
continue
- else if(istype(A, /obj/structure))
+ else if(isstructure(A))
var/obj/structure/S = A
var/dist = get_dist(source, A)
if(dist <= zap_range && (dist < closest_dist || !closest_tesla_coil) && !S.being_shocked)
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index b10ffc106e4..8efd181ac1a 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -169,7 +169,7 @@
if(!user.drop_item())
return
if(I)
- I.loc = src
+ I.forceMove(src)
to_chat(user, "You place \the [I] into the [src].")
for(var/mob/M in viewers(src))
@@ -833,14 +833,14 @@
// will expel any holder inside at the time
// then delete the pipe
// remains : set to leave broken pipe pieces in place
-/obj/structure/disposalpipe/proc/broken(var/remains = 0)
+/obj/structure/disposalpipe/proc/broken(remains = 0)
if(remains)
for(var/D in cardinal)
if(D & dpdir)
var/obj/structure/disposalpipe/broken/P = new(src.loc)
- P.dir = D
+ P.setDir(D)
- src.invisibility = 101 // make invisible (since we won't delete the pipe immediately)
+ invisibility = 101 // make invisible (since we won't delete the pipe immediately)
var/obj/structure/disposalholder/H = locate() in src
if(H)
// holder was present
@@ -863,6 +863,18 @@
spawn(2) // delete pipe after 2 ticks to ensure expel proc finished
qdel(src)
+// pipe affected by explosion
+/obj/structure/disposalpipe/ex_act(severity)
+ switch(severity)
+ if(1)
+ broken(0)
+ if(2)
+ health -= rand(5, 15)
+ healthcheck()
+ if(3)
+ health -= rand(0, 15)
+ healthcheck()
+
// test health for brokenness
/obj/structure/disposalpipe/proc/healthcheck()
if(health < -2)
diff --git a/icons/mob/blob.dmi b/icons/mob/blob.dmi
index 809c68bd59b..63633844b83 100644
Binary files a/icons/mob/blob.dmi and b/icons/mob/blob.dmi differ