From 79e3acc95ee2f287076f5cfa42c53508857ac0e6 Mon Sep 17 00:00:00 2001
From: Zuhayr
Date: Wed, 22 Apr 2015 23:19:31 +0930
Subject: [PATCH] Finalized wall refactor.
---
baystation12.dme | 11 +-
code/game/machinery/alarm.dm | 96 +-
code/game/machinery/autolathe.dm | 2 +-
code/game/machinery/doors/airlock.dm | 6 +-
code/game/machinery/wall_frames.dm | 83 +
code/game/mecha/equipment/tools/tools.dm | 14 +-
code/game/objects/effects/overlays.dm | 14 +
code/game/objects/explosion_recursive.dm | 3 -
code/game/objects/items/blueprints.dm | 4 -
.../objects/items/stacks/sheets/mineral.dm | 4 -
.../items/stacks/sheets/sheet_types.dm | 16 +-
code/game/objects/items/weapons/RCD.dm | 3 +-
code/game/objects/items/weapons/policetape.dm | 1 -
code/game/objects/structures/false_walls.dm | 313 ---
code/game/objects/structures/girders.dm | 289 ++-
code/game/objects/structures/mineral_doors.dm | 2 +-
code/game/smoothwall.dm | 141 --
code/game/turfs/simulated/wall_attacks.dm | 315 +++
code/game/turfs/simulated/wall_icon.dm | 121 ++
code/game/turfs/simulated/wall_types.dm | 43 +
code/game/turfs/simulated/walls.dm | 429 +---
code/game/turfs/simulated/walls_mineral.dm | 121 --
code/game/turfs/simulated/walls_misc.dm | 8 -
code/game/turfs/simulated/walls_reinforced.dm | 307 ---
code/modules/clothing/glasses/glasses.dm | 10 +-
code/modules/materials/materials.dm | 170 ++
code/modules/mining/machine_processing.dm | 15 +-
code/modules/mining/mine_items.dm | 2 +-
code/modules/mining/mineral_effect.dm | 15 +-
code/modules/mining/minerals.dm | 96 -
code/modules/mining/ore.dm | 26 +-
code/modules/mining/ore_datum.dm | 8 +-
.../human/species/xenomorphs/alien_powers.dm | 17 +-
.../living/silicon/robot/drone/drone_items.dm | 5 +-
code/modules/mob/living/simple_animal/worm.dm | 7 +-
code/modules/power/lighting.dm | 58 -
.../rust/fuel_assembly_port_construction.dm | 36 +-
.../rust/fuel_compressor_construction.dm | 37 +-
code/modules/power/singularity/act.dm | 23 +-
.../modules/projectiles/projectile/bullets.dm | 10 +-
code/modules/reagents/Chemistry-Reagents.dm | 10 +-
code/modules/research/rdconsole.dm | 4 +-
code/setup.dm | 3 +
code/world.dm | 3 +
icons/obj/mining.dmi | Bin 53367 -> 53359 bytes
icons/turf/wall_masks.dmi | Bin 0 -> 20703 bytes
icons/turf/walls.dmi | Bin 140505 -> 26039 bytes
maps/exodus-1.dmm | 1814 ++++++++---------
48 files changed, 2017 insertions(+), 2698 deletions(-)
create mode 100644 code/game/machinery/wall_frames.dm
delete mode 100644 code/game/objects/structures/false_walls.dm
delete mode 100644 code/game/smoothwall.dm
create mode 100644 code/game/turfs/simulated/wall_attacks.dm
create mode 100644 code/game/turfs/simulated/wall_icon.dm
create mode 100644 code/game/turfs/simulated/wall_types.dm
delete mode 100644 code/game/turfs/simulated/walls_mineral.dm
delete mode 100644 code/game/turfs/simulated/walls_misc.dm
delete mode 100644 code/game/turfs/simulated/walls_reinforced.dm
create mode 100644 code/modules/materials/materials.dm
delete mode 100644 code/modules/mining/minerals.dm
create mode 100644 icons/turf/wall_masks.dmi
diff --git a/baystation12.dme b/baystation12.dme
index c5e45a2729b..5fe8a14b154 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -214,7 +214,6 @@
#include "code\game\response_team.dm"
#include "code\game\shuttle_engines.dm"
#include "code\game\skincmd.dm"
-#include "code\game\smoothwall.dm"
#include "code\game\sound.dm"
#include "code\game\supplyshuttle.dm"
#include "code\game\antagonist\antagonist.dm"
@@ -372,6 +371,7 @@
#include "code\game\machinery\turret_control.dm"
#include "code\game\machinery\turrets.dm"
#include "code\game\machinery\vending.dm"
+#include "code\game\machinery\wall_frames.dm"
#include "code\game\machinery\washing_machine.dm"
#include "code\game\machinery\wishgranter.dm"
#include "code\game\machinery\atmoalter\area_atmos_computer.dm"
@@ -710,7 +710,6 @@
#include "code\game\objects\structures\door_assembly.dm"
#include "code\game\objects\structures\electricchair.dm"
#include "code\game\objects\structures\extinguisher.dm"
-#include "code\game\objects\structures\false_walls.dm"
#include "code\game\objects\structures\flora.dm"
#include "code\game\objects\structures\girders.dm"
#include "code\game\objects\structures\grille.dm"
@@ -774,10 +773,10 @@
#include "code\game\turfs\unsimulated.dm"
#include "code\game\turfs\simulated\floor.dm"
#include "code\game\turfs\simulated\floor_types.dm"
+#include "code\game\turfs\simulated\wall_attacks.dm"
+#include "code\game\turfs\simulated\wall_icon.dm"
+#include "code\game\turfs\simulated\wall_types.dm"
#include "code\game\turfs\simulated\walls.dm"
-#include "code\game\turfs\simulated\walls_mineral.dm"
-#include "code\game\turfs\simulated\walls_misc.dm"
-#include "code\game\turfs\simulated\walls_reinforced.dm"
#include "code\game\turfs\space\space.dm"
#include "code\game\turfs\space\transit.dm"
#include "code\game\turfs\unsimulated\beach.dm"
@@ -1035,6 +1034,7 @@
#include "code\modules\maps\reader.dm"
#include "code\modules\maps\swapmaps.dm"
#include "code\modules\maps\writer.dm"
+#include "code\modules\materials\materials.dm"
#include "code\modules\mining\abandonedcrates.dm"
#include "code\modules\mining\alloys.dm"
#include "code\modules\mining\coins.dm"
@@ -1045,7 +1045,6 @@
#include "code\modules\mining\mine_items.dm"
#include "code\modules\mining\mine_turfs.dm"
#include "code\modules\mining\mineral_effect.dm"
-#include "code\modules\mining\minerals.dm"
#include "code\modules\mining\mint.dm"
#include "code\modules\mining\money_bag.dm"
#include "code\modules\mining\ore.dm"
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index c0d743d379e..0926ccaf3ed 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -838,8 +838,7 @@
else if(istype(W, /obj/item/weapon/wrench))
user << "You remove the fire alarm assembly from the wall!"
- var/obj/item/alarm_frame/frame = new /obj/item/alarm_frame()
- frame.loc = user.loc
+ new /obj/item/frame/air_alarm(get_turf(user))
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
del(src)
@@ -868,50 +867,6 @@ Just a object used in constructing air alarms
w_class = 2.0
matter = list("steel" = 50, "glass" = 50)
-
-/*
-AIR ALARM ITEM
-Handheld air alarm frame, for placing on walls
-Code shamelessly copied from apc_frame
-*/
-/obj/item/alarm_frame
- name = "air alarm frame"
- desc = "Used for building Air Alarms"
- icon = 'icons/obj/monitors.dmi'
- icon_state = "alarm_bitem"
- flags = CONDUCT
-
-/obj/item/alarm_frame/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (istype(W, /obj/item/weapon/wrench))
- new /obj/item/stack/sheet/metal( get_turf(src.loc), 2 )
- del(src)
- return
- ..()
-
-/obj/item/alarm_frame/proc/try_build(turf/on_wall)
- if (get_dist(on_wall,usr)>1)
- return
-
- var/ndir = get_dir(on_wall,usr)
- if (!(ndir in cardinal))
- return
-
- var/turf/loc = get_turf(usr)
- var/area/A = loc.loc
- if (!istype(loc, /turf/simulated/floor))
- usr << "\red Air Alarm cannot be placed on this spot."
- return
- if (A.requires_power == 0 || A.name == "Space")
- usr << "\red Air Alarm cannot be placed in this area."
- return
-
- if(gotwallitem(loc, ndir))
- usr << "\red There's already an item on this wall!"
- return
-
- new /obj/machinery/alarm(loc, ndir, 1)
- del(src)
-
/*
FIRE ALARM
*/
@@ -1021,8 +976,7 @@ FIRE ALARM
else if(istype(W, /obj/item/weapon/wrench))
user << "You remove the fire alarm assembly from the wall!"
- var/obj/item/firealarm_frame/frame = new /obj/item/firealarm_frame()
- frame.loc = user.loc
+ new /obj/item/frame/fire_alarm(get_turf(user))
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
del(src)
return
@@ -1190,52 +1144,6 @@ Just a object used in constructing fire alarms
w_class = 2.0
matter = list("steel" = 50, "glass" = 50)
-
-/*
-FIRE ALARM ITEM
-Handheld fire alarm frame, for placing on walls
-Code shamelessly copied from apc_frame
-*/
-/obj/item/firealarm_frame
- name = "fire alarm frame"
- desc = "Used for building Fire Alarms"
- icon = 'icons/obj/monitors.dmi'
- icon_state = "fire_bitem"
- flags = CONDUCT
-
-/obj/item/firealarm_frame/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (istype(W, /obj/item/weapon/wrench))
- new /obj/item/stack/sheet/metal( get_turf(src.loc), 2 )
- del(src)
- return
- ..()
-
-/obj/item/firealarm_frame/proc/try_build(turf/on_wall)
- if (get_dist(on_wall,usr)>1)
- return
-
- var/ndir = get_dir(on_wall,usr)
- if (!(ndir in cardinal))
- return
-
- var/turf/loc = get_turf(usr)
- var/area/A = loc.loc
- if (!istype(loc, /turf/simulated/floor))
- usr << "\red Fire Alarm cannot be placed on this spot."
- return
- if (A.requires_power == 0 || A.name == "Space")
- usr << "\red Fire Alarm cannot be placed in this area."
- return
-
- if(gotwallitem(loc, ndir))
- usr << "\red There's already an item on this wall!"
- return
-
- new /obj/machinery/firealarm(loc, ndir, 1)
-
- del(src)
-
-
/obj/machinery/partyalarm
name = "\improper PARTY BUTTON"
desc = "Cuban Pete is in the house!"
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 54e242c0f16..8113dfafd9a 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -287,7 +287,7 @@
/obj/machinery/autolathe/dismantle()
for(var/mat in stored_material)
- var/material/M = name_to_mineral[mat]
+ var/material/M = name_to_material[mat]
if(!istype(M))
continue
var/obj/item/stack/sheet/S = new M.stack_type(get_turf(src))
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 565d50c452d..69962e93ad6 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -261,11 +261,7 @@
for(var/turf/simulated/floor/target_tile in range(2,loc))
target_tile.assume_gas("phoron", 35, 400+T0C)
spawn (0) target_tile.hotspot_expose(temperature, 400)
- for(var/obj/structure/falsewall/phoron/F in range(3,src))//Hackish as fuck, but until temperature_expose works, there is nothing I can do -Sieve
- var/turf/T = get_turf(F)
- T.ChangeTurf(/turf/simulated/wall/mineral/phoron/)
- del (F)
- for(var/turf/simulated/wall/mineral/phoron/W in range(3,src))
+ for(var/turf/simulated/wall/W in range(3,src))
W.ignite((temperature/4))//Added so that you can't set off a massive chain reaction with a small flame
for(var/obj/machinery/door/airlock/phoron/D in range(3,src))
D.ignite(temperature/4)
diff --git a/code/game/machinery/wall_frames.dm b/code/game/machinery/wall_frames.dm
new file mode 100644
index 00000000000..ee8ca69ed0e
--- /dev/null
+++ b/code/game/machinery/wall_frames.dm
@@ -0,0 +1,83 @@
+/obj/item/frame
+ name = "frame"
+ desc = "Used for building machines."
+ icon = 'icons/obj/monitors.dmi'
+ icon_state = "fire_bitem"
+ flags = CONDUCT
+ var/build_machine_type
+ var/refund_amt = 2
+ var/refund_type = /obj/item/stack/sheet/metal
+
+/obj/item/frame/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if (istype(W, /obj/item/weapon/wrench))
+ new refund_type( get_turf(src.loc), refund_amt)
+ del(src)
+ return
+ ..()
+
+/obj/item/frame/proc/try_build(turf/on_wall)
+ if(!build_machine_type)
+ return
+
+ if (get_dist(on_wall,usr)>1)
+ return
+
+ var/ndir = get_dir(on_wall,usr)
+ if (!(ndir in cardinal))
+ return
+
+ var/turf/loc = get_turf(usr)
+ var/area/A = loc.loc
+ if (!istype(loc, /turf/simulated/floor))
+ usr << "\The [src] Alarm cannot be placed in this area."
+ return
+
+ if(gotwallitem(loc, ndir))
+ usr << ""
+ return
+
+ var/obj/machinery/M = new build_machine_type(loc, ndir, 1)
+ M.fingerprints = src.fingerprints
+ M.fingerprintshidden = src.fingerprintshidden
+ M.fingerprintslast = src.fingerprintslast
+ del(src)
+
+/obj/item/frame/fire_alarm
+ name = "fire alarm frame"
+ desc = "Used for building fire alarms."
+ build_machine_type = /obj/machinery/firealarm
+
+/obj/item/frame/air_alarm
+ name = "air alarm frame"
+ desc = "Used for building air alarms."
+ build_machine_type = /obj/machinery/alarm
+
+/obj/item/frame/light
+ name = "light fixture frame"
+ desc = "Used for building lights."
+ icon = 'icons/obj/lighting.dmi'
+ icon_state = "tube-construct-item"
+ build_machine_type = /obj/machinery/light_construct
+
+/obj/item/frame/light/small
+ name = "small light fixture frame"
+ icon_state = "bulb-construct-item"
+ refund_amt = 1
+ build_machine_type = /obj/machinery/light_construct/small
+
+/obj/item/frame/rust
+ name = "Fuel Compressor frame"
+ icon = 'icons/rust.dmi'
+ icon_state = "fuel_compressor0"
+ w_class = 4
+ refund_type = /obj/item/stack/sheet/plasteel
+ refund_amt = 12
+ build_machine_type = /obj/machinery/rust_fuel_compressor
+
+/obj/item/frame/rust/assembly
+ name = "Fuel Assembly Port frame"
+ icon_state = "port2"
+ build_machine_type = /obj/machinery/rust_fuel_assembly_port
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index d1c5c197480..f59ec960372 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -89,8 +89,13 @@
var/C = target.loc //why are these backwards? we may never know -Pete
if(do_after_cooldown(target))
if(T == chassis.loc && src == chassis.selected)
- if(istype(target, /turf/simulated/wall/r_wall))
- occupant_message("[target] is too durable to drill through.")
+ if(istype(target, /turf/simulated/wall))
+ var/turf/simulated/wall/W = target
+ if(W.reinf_material)
+ occupant_message("[target] is too durable to drill through.")
+ else
+ log_message("Drilled through [target]")
+ target.ex_act(2)
else if(istype(target, /turf/simulated/mineral))
for(var/turf/simulated/mineral/M in range(chassis,1))
if(get_dir(chassis,M)&chassis.dir)
@@ -140,8 +145,9 @@
var/C = target.loc //why are these backwards? we may never know -Pete
if(do_after_cooldown(target))
if(T == chassis.loc && src == chassis.selected)
- if(istype(target, /turf/simulated/wall/r_wall))
- if(do_after_cooldown(target))//To slow down how fast mechs can drill through the station
+ if(istype(target, /turf/simulated/wall))
+ var/turf/simulated/wall/W = target
+ if(!W.reinf_material || do_after_cooldown(target))//To slow down how fast mechs can drill through the station
log_message("Drilled through [target]")
target.ex_act(3)
else if(istype(target, /turf/simulated/mineral))
diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm
index 6dd26f7774c..cc3e9ca1f31 100644
--- a/code/game/objects/effects/overlays.dm
+++ b/code/game/objects/effects/overlays.dm
@@ -42,3 +42,17 @@
icon = 'icons/turf/space.dmi'
icon_state = "bluespacify"
layer = LIGHTING_LAYER
+
+/obj/effect/overlay/wallrot
+ name = "wallrot"
+ desc = "Ick..."
+ icon = 'icons/effects/wallrot.dmi'
+ anchored = 1
+ density = 1
+ layer = 5
+ mouse_opacity = 0
+
+/obj/effect/overlay/wallrot/New()
+ ..()
+ pixel_x += rand(-10, 10)
+ pixel_y += rand(-10, 10)
\ No newline at end of file
diff --git a/code/game/objects/explosion_recursive.dm b/code/game/objects/explosion_recursive.dm
index 9dc04ff6301..2b901f08758 100644
--- a/code/game/objects/explosion_recursive.dm
+++ b/code/game/objects/explosion_recursive.dm
@@ -88,9 +88,6 @@ proc/explosion_rec(turf/epicenter, power)
/turf/simulated/wall
explosion_resistance = 5
-/turf/simulated/wall/r_wall
- explosion_resistance = 25
-
//Code-wise, a safe value for power is something up to ~25 or ~30.. This does quite a bit of damage to the station.
//direction is the direction that the spread took to come to this tile. So it is pointing in the main blast direction - meaning where this tile should spread most of it's force.
/turf/proc/explosion_spread(power, direction)
diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm
index facafe41f25..c96aa8de8f5 100644
--- a/code/game/objects/items/blueprints.dm
+++ b/code/game/objects/items/blueprints.dm
@@ -207,10 +207,6 @@ move an amendment to the drawing.
return BORDER_BETWEEN
if (locate(/obj/machinery/door) in T2)
return BORDER_2NDTILE
- if (locate(/obj/structure/falsewall) in T2)
- return BORDER_2NDTILE
- if (locate(/obj/structure/falserwall) in T2)
- return BORDER_2NDTILE
return BORDER_NONE
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index 6506ec0aba0..46415bb8af7 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -63,10 +63,6 @@ var/global/list/datum/stack_recipe/iron_recipes = list ( \
w_class = 3.0
throw_speed = 3
throw_range = 3
- var/walltype_solid
- var/walltype_false
- var/doortype_solid
- var/doortype_machine
/obj/item/stack/sheet/mineral/New()
..()
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 5ed88a3a66e..abaf5b5195c 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -69,12 +69,12 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
), 4), \
null, \
new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade), \
- new/datum/stack_recipe("light fixture frame", /obj/item/light_fixture_frame, 2), \
- new/datum/stack_recipe("small light fixture frame", /obj/item/light_fixture_frame/small, 1), \
+ new/datum/stack_recipe("light fixture frame", /obj/item/frame/light, 2), \
+ new/datum/stack_recipe("small light fixture frame", /obj/item/frame/light/small, 1), \
null, \
new/datum/stack_recipe("apc frame", /obj/item/apc_frame, 2), \
- new/datum/stack_recipe("air alarm frame", /obj/item/alarm_frame, 2), \
- new/datum/stack_recipe("fire alarm frame", /obj/item/firealarm_frame, 2), \
+ new/datum/stack_recipe("air alarm frame", /obj/item/frame/air_alarm, 2), \
+ new/datum/stack_recipe("fire alarm frame", /obj/item/frame/fire_alarm, 2), \
null, \
new/datum/stack_recipe("knife blade", /obj/item/butterflyblade, 6, time = 20, one_per_turf = 0, on_floor = 1) \
)
@@ -88,6 +88,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
throwforce = 14.0
flags = CONDUCT
origin_tech = "materials=1"
+ sheettype = "steel"
/obj/item/stack/sheet/metal/cyborg
name = "steel synthesizer"
@@ -109,21 +110,22 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
var/global/list/datum/stack_recipe/plasteel_recipes = list ( \
new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = 1), \
new/datum/stack_recipe("Metal crate", /obj/structure/closet/crate, 10, time = 50, one_per_turf = 1), \
- new/datum/stack_recipe("RUST fuel assembly port frame", /obj/item/rust_fuel_assembly_port_frame, 12, time = 50, one_per_turf = 1), \
- new/datum/stack_recipe("RUST fuel compressor frame", /obj/item/rust_fuel_compressor_frame, 12, time = 50, one_per_turf = 1), \
+ new/datum/stack_recipe("RUST fuel assembly port frame", /obj/item/frame/rust/assembly, 12, time = 50, one_per_turf = 1), \
+ new/datum/stack_recipe("RUST fuel compressor frame", /obj/item/frame/rust, 12, time = 50, one_per_turf = 1), \
new/datum/stack_recipe("knife grip", /obj/item/butterflyhandle, 4, time = 20, one_per_turf = 0, on_floor = 1),
)
/obj/item/stack/sheet/plasteel
name = "plasteel"
singular_name = "plasteel sheet"
- desc = "This sheet is an alloy of iron and phoron."
+ desc = "This sheet is an alloy of iron and platinum."
icon_state = "sheet-plasteel"
item_state = "sheet-metal"
matter = list("steel" = 7500)
throwforce = 15.0
flags = CONDUCT
origin_tech = "materials=2"
+ sheettype = "plasteel"
/obj/item/stack/sheet/plasteel/cyborg
name = "plasteel synthesizer"
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index 2d9a37647df..aa4612c1bd2 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -100,9 +100,10 @@
build_type = "floor"
build_turf = /turf/simulated/floor/plating/airless
else if(deconstruct && istype(T,/turf/simulated/wall))
+ var/turf/simulated/wall/W = T
build_delay = deconstruct ? 50 : 40
build_cost = 5
- build_type = (!canRwall && istype(T,/turf/simulated/wall/r_wall)) ? null : "wall"
+ build_type = (!canRwall && W.reinf_material) ? null : "wall"
build_turf = /turf/simulated/floor
else if(istype(T,/turf/simulated/floor))
build_delay = deconstruct ? 50 : 20
diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm
index 283e7e5877a..91474ddea1e 100644
--- a/code/game/objects/items/weapons/policetape.dm
+++ b/code/game/objects/items/weapons/policetape.dm
@@ -106,7 +106,6 @@ var/list/tape_roll_applications = list()
var/obj/item/tape/P = new tape_type(cur)
P.icon_state = "[P.icon_base]_[dir]"
cur = get_step_towards(cur,end)
- //is_blocked_turf(var/turf/T)
usr << "\blue You finish placing the [src]." //Git Test
/obj/item/taperoll/afterattack(var/atom/A, mob/user as mob, proximity)
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
deleted file mode 100644
index 4d9ce03488d..00000000000
--- a/code/game/objects/structures/false_walls.dm
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * False Walls
- */
-/obj/structure/falsewall
- name = "wall"
- desc = "A huge chunk of metal used to seperate rooms."
- anchored = 1
- icon = 'icons/turf/walls.dmi'
- var/mineral = "steel"
- var/opening = 0
-
-/obj/structure/falsewall/New()
- relativewall_neighbours()
- ..()
-
-/obj/structure/falsewall/Del()
-
- var/temploc = src.loc
-
- spawn(10)
- for(var/turf/simulated/wall/W in range(temploc,1))
- W.relativewall()
-
- for(var/obj/structure/falsewall/W in range(temploc,1))
- W.relativewall()
-
- for(var/obj/structure/falserwall/W in range(temploc,1))
- W.relativewall()
- ..()
-
-
-/obj/structure/falsewall/relativewall()
-
- if(!density)
- icon_state = "[mineral]fwall_open"
- return
-
- var/junction = 0 //will be used to determine from which side the wall is connected to other walls
-
- for(var/turf/simulated/wall/W in orange(src,1))
- if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
- if(src.mineral == W.mineral)//Only 'like' walls connect -Sieve
- junction |= get_dir(src,W)
- for(var/obj/structure/falsewall/W in orange(src,1))
- if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
- if(src.mineral == W.mineral)
- junction |= get_dir(src,W)
- for(var/obj/structure/falserwall/W in orange(src,1))
- if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
- if(src.mineral == W.mineral)
- junction |= get_dir(src,W)
- icon_state = "[mineral][junction]"
- return
-
-/obj/structure/falsewall/attack_hand(mob/user as mob)
- if(opening)
- return
-
- if(density)
- opening = 1
- icon_state = "[mineral]fwall_open"
- flick("[mineral]fwall_opening", src)
- sleep(15)
- src.density = 0
- SetOpacity(0)
- opening = 0
- else
- opening = 1
- flick("[mineral]fwall_closing", src)
- icon_state = "[mineral]0"
- density = 1
- sleep(15)
- SetOpacity(1)
- src.relativewall()
- opening = 0
-
-/obj/structure/falsewall/update_icon()//Calling icon_update will refresh the smoothwalls if it's closed, otherwise it will make sure the icon is correct if it's open
- ..()
- if(density)
- icon_state = "[mineral]0"
- src.relativewall()
- else
- icon_state = "[mineral]fwall_open"
-
-/obj/structure/falsewall/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(opening)
- user << "\red You must wait until the door has stopped moving."
- return
-
- var/material/M = name_to_mineral[mineral]
-
- if(istype(W, /obj/item/weapon/screwdriver))
- if(!istype(M) || !M.walltype_solid)
- user << "You cannot find any bolts on the wall."
- return
- user.visible_message("[user] tightens some bolts on the wall.", "You tighten the bolts on the wall.")
- var/turf/T = get_turf(src)
- if(T)
- T.ChangeTurf(M.walltype_solid)
- del(src)
- return
-
- var/cutting
- if(istype(W, /obj/item/weapon/melee/energy/blade) || istype(W, /obj/item/weapon/pickaxe))
- cutting = 1
- else if(istype(W, /obj/item/weapon/weldingtool))
- var/obj/item/weapon/weldingtool/WT = W
- if(WT.welding)
- cutting = 1
-
- if(cutting)
- if(density)
- var/turf/T = get_turf(src)
- if(T.density)
- user << "\red The wall is blocked!"
- return
-
- if(!istype(M) || !M.walltype_solid)
- user << "You cannot weld this wall."
- return
- T.ChangeTurf(M.walltype_solid)
- if(mineral != "phoron")//Stupid shit keeps me from pushing the attackby() to phoron walls -Sieve
- T = get_turf(src) // Still not sure what the above is for, leaving it for now. ~Z
- T.attackby(W,user)
- del(src)
- else
- user << "\blue You can't reach, close it first!"
-
-
-/obj/structure/falsewall/update_icon()//Calling icon_update will refresh the smoothwalls if it's closed, otherwise it will make sure the icon is correct if it's open
- ..()
- if(density)
- icon_state = "[mineral]0"
- src.relativewall()
- else
- icon_state = "[mineral]fwall_open"
-
-/*
- * False R-Walls
- */
-
-/obj/structure/falserwall
- name = "reinforced wall"
- desc = "A huge chunk of reinforced metal used to seperate rooms."
- icon = 'icons/turf/walls.dmi'
- icon_state = "r_wall"
- density = 1
- opacity = 1
- anchored = 1
- var/mineral = "steel"
- var/opening = 0
-
-/obj/structure/falserwall/New()
- relativewall_neighbours()
- ..()
-
-
-/obj/structure/falserwall/attack_hand(mob/user as mob)
- if(opening)
- return
-
- if(density)
- opening = 1
- // Open wall
- icon_state = "frwall_open"
- flick("frwall_opening", src)
- sleep(15)
- density = 0
- SetOpacity(0)
- opening = 0
- else
- opening = 1
- icon_state = "r_wall"
- flick("frwall_closing", src)
- density = 1
- sleep(15)
- SetOpacity(1)
- relativewall()
- opening = 0
-
-/obj/structure/falserwall/relativewall()
-
- if(!density)
- icon_state = "frwall_open"
- return
-
- var/junction = 0 //will be used to determine from which side the wall is connected to other walls
-
- for(var/turf/simulated/wall/W in orange(src,1))
- if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
- if(src.mineral == W.mineral)//Only 'like' walls connect -Sieve
- junction |= get_dir(src,W)
- for(var/obj/structure/falsewall/W in orange(src,1))
- if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
- if(src.mineral == W.mineral)
- junction |= get_dir(src,W)
- for(var/obj/structure/falserwall/W in orange(src,1))
- if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
- if(src.mineral == W.mineral)
- junction |= get_dir(src,W)
- icon_state = "rwall[junction]"
- return
-
-
-
-/obj/structure/falserwall/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(opening)
- user << "\red You must wait until the door has stopped moving."
- return
-
- if(istype(W, /obj/item/weapon/screwdriver))
- var/turf/T = get_turf(src)
- user.visible_message("[user] tightens some bolts on the r wall.", "You tighten the bolts on the wall.")
- T.ChangeTurf(/turf/simulated/wall) //Intentionally makes a regular wall instead of an r-wall (no cheap r-walls for you).
- del(src)
-
- if( istype(W, /obj/item/weapon/weldingtool) )
- var/obj/item/weapon/weldingtool/WT = W
- if( WT.remove_fuel(0,user) )
- var/turf/T = get_turf(src)
- T.ChangeTurf(/turf/simulated/wall)
- T = get_turf(src)
- T.attackby(W,user)
- del(src)
-
- else if( istype(W, /obj/item/weapon/pickaxe/plasmacutter) )
- var/turf/T = get_turf(src)
- T.ChangeTurf(/turf/simulated/wall)
- T = get_turf(src)
- T.attackby(W,user)
- del(src)
-
- //DRILLING
- else if (istype(W, /obj/item/weapon/pickaxe/diamonddrill))
- var/turf/T = get_turf(src)
- T.ChangeTurf(/turf/simulated/wall)
- T = get_turf(src)
- T.attackby(W,user)
- del(src)
-
- else if( istype(W, /obj/item/weapon/melee/energy/blade) )
- var/turf/T = get_turf(src)
- T.ChangeTurf(/turf/simulated/wall)
- T = get_turf(src)
- T.attackby(W,user)
- del(src)
-
-
-/*
- * Uranium Falsewalls
- */
-
-/obj/structure/falsewall/uranium
- name = "uranium wall"
- desc = "A wall with uranium plating. This is probably a bad idea."
- icon_state = ""
- mineral = "uranium"
- var/active = null
- var/last_event = 0
-
-/obj/structure/falsewall/uranium/attackby(obj/item/weapon/W as obj, mob/user as mob)
- radiate()
- ..()
-
-/obj/structure/falsewall/uranium/attack_hand(mob/user as mob)
- radiate()
- ..()
-
-/obj/structure/falsewall/uranium/proc/radiate()
- if(!active)
- if(world.time > last_event+15)
- active = 1
- for(var/mob/living/L in range(3,src))
- L.apply_effect(12,IRRADIATE,0)
- for(var/turf/simulated/wall/mineral/uranium/T in range(3,src))
- T.radiate()
- last_event = world.time
- active = null
- return
- return
-/*
- * Other misc falsewall types
- */
-
-/obj/structure/falsewall/gold
- name = "gold wall"
- desc = "A wall with gold plating. Swag!"
- icon_state = ""
- mineral = "gold"
-
-/obj/structure/falsewall/silver
- name = "silver wall"
- desc = "A wall with silver plating. Shiny."
- icon_state = ""
- mineral = "silver"
-
-/obj/structure/falsewall/diamond
- name = "diamond wall"
- desc = "A wall with diamond plating. You monster."
- icon_state = ""
- mineral = "diamond"
-
-/obj/structure/falsewall/phoron
- name = "phoron wall"
- desc = "A wall with phoron plating. This is definately a bad idea."
- icon_state = ""
- mineral = "phoron"
-
-/obj/structure/falsewall/sandstone
- name = "sandstone wall"
- desc = "A wall with sandstone plating."
- icon_state = ""
- mineral = "sandstone"
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index a5bd415107e..731e19b6141 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -2,10 +2,18 @@
icon_state = "girder"
anchored = 1
density = 1
- layer = 2
+ layer = 4
+
var/state = 0
var/health = 200
var/cover = 50 //how much cover the girder provides against projectiles.
+ var/material/reinf_material
+
+/obj/structure/girder/displaced
+ icon_state = "displaced"
+ anchored = 0
+ health = 50
+ cover = 25
/obj/structure/girder/attack_generic(var/mob/user, var/damage, var/attack_message = "smashes apart", var/wallbreaker)
if(!damage || !wallbreaker)
@@ -30,136 +38,165 @@
health -= damage
..()
if(health <= 0)
- new /obj/item/stack/sheet/metal(get_turf(src))
- del(src)
+ dismantle()
return
+/obj/structure/girder/proc/reset_girder()
+ cover = initial(cover)
+ health = min(health,initial(health))
+ state = 0
+ icon_state = initial(icon_state)
+ if(reinf_material)
+ reinforce_girder()
+
/obj/structure/girder/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/wrench) && state == 0)
- if(anchored && !istype(src,/obj/structure/girder/displaced))
+ if(anchored && !reinf_material)
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
- user << "\blue Now disassembling the girder"
+ user << "Now disassembling the girder..."
if(do_after(user,40))
if(!src) return
- user << "\blue You dissasembled the girder!"
+ user << "You dissasembled the girder!"
dismantle()
else if(!anchored)
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
- user << "\blue Now securing the girder"
+ user << "Now securing the girder..."
if(get_turf(user, 40))
- user << "\blue You secured the girder!"
- new/obj/structure/girder( src.loc )
- del(src)
+ user << "You secured the girder!"
+ reset_girder()
else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter))
- user << "\blue Now slicing apart the girder"
+ user << "Now slicing apart the girder..."
if(do_after(user,30))
if(!src) return
- user << "\blue You slice apart the girder!"
+ user << "You slice apart the girder!"
dismantle()
else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill))
- user << "\blue You drill through the girder!"
+ user << "You drill through the girder!"
dismantle()
- else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 && istype(src,/obj/structure/girder/reinforced))
+ else if(istype(W, /obj/item/weapon/screwdriver) && state == 2)
playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
- user << "\blue Now unsecuring support struts"
+ user << "Now unsecuring support struts..."
if(do_after(user,40))
if(!src) return
- user << "\blue You unsecured the support struts!"
+ user << "You unsecured the support struts!"
state = 1
- else if(istype(W, /obj/item/weapon/wirecutters) && istype(src,/obj/structure/girder/reinforced) && state == 1)
+ else if(istype(W, /obj/item/weapon/wirecutters) && state == 1)
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
- user << "\blue Now removing support struts"
+ user << "Now removing support struts..."
if(do_after(user,40))
if(!src) return
- user << "\blue You removed the support struts!"
- new/obj/structure/girder( src.loc )
- del(src)
+ user << "You removed the support struts!"
+ reinf_material.place_dismantled_product(get_turf(src))
+ reinf_material = null
+ reset_girder()
- else if(istype(W, /obj/item/weapon/crowbar) && state == 0 && anchored )
+ else if(istype(W, /obj/item/weapon/crowbar) && state == 0 && anchored)
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
- user << "\blue Now dislodging the girder"
+ user << "Now dislodging the girder..."
if(do_after(user, 40))
if(!src) return
- user << "\blue You dislodged the girder!"
- new/obj/structure/girder/displaced( src.loc )
- del(src)
-
- else if(istype(W, /obj/item/stack/sheet/plasteel))
- var/obj/item/stack/sheet/S = W
- if(!anchored)
- if(S.use(2))
- user << "\blue You create a false wall! Push on it to open or close the passage."
- new /obj/structure/falserwall (src.loc)
- del(src)
- else
- if (src.icon_state == "reinforced") //I cant believe someone would actually write this line of code...
- if(S.get_amount() < 1) return ..()
- user << "Now finalising reinforced wall."
- if(do_after(user, 50))
- if (S.use(1))
- user << "Wall fully reinforced!"
- var/turf/Tsrc = get_turf(src)
- Tsrc.ChangeTurf(/turf/simulated/wall/r_wall)
- for(var/turf/simulated/wall/r_wall/X in Tsrc.loc)
- if(X) X.add_hiddenprint(usr)
- del(src)
- return
- else
- if(S.get_amount() < 1) return ..()
- user << "Now reinforcing girders..."
- if (do_after(user,60))
- if(S.use(1))
- user << "Girders reinforced!"
- new/obj/structure/girder/reinforced( src.loc )
- del(src)
- return
+ user << "You dislodged the girder!"
+ icon_state = "displaced"
+ anchored = 0
+ health = 50
+ cover = 25
else if(istype(W, /obj/item/stack/sheet))
var/obj/item/stack/sheet/S = W
- var/material/M = name_to_mineral[S.sheettype]
+ if(S.get_amount() < 2)
+ return ..()
+
+ var/material/M = name_to_material[S.sheettype]
+ if(!istype(M))
+ return ..()
+
+ var/wall_fake
add_hiddenprint(usr)
- if(!anchored)
- if(!istype(M) || !M.walltype_false)
- user << "You cannot make a false wall using this material."
- return
- if(S.use(2))
- user << "You create a false wall! Push on it to open or close the passage."
- new M.walltype_false (src.loc)
- del(src)
- else
- if(!istype(M) || !M.walltype_solid)
- user << "You cannot plate a wall in this material."
- return
- if(S.get_amount() < 2)
- return ..()
- user << "Now adding plating..."
- if (do_after(user,40))
- if (S.use(2))
- user << "You added the plating!"
- var/turf/Tsrc = get_turf(src)
- Tsrc.ChangeTurf(M.walltype_solid)
- for(var/turf/simulated/wall/X in Tsrc.loc)
- if(X)
- X.add_hiddenprint(usr)
- del(src)
+ if(M.integrity < 50)
+ user << "This material is too soft for use in wall construction."
return
+ user << "You begin adding the plating..."
+
+ if(!do_after(user,40) || !S.use(2))
+ return
+
+ if(anchored)
+ user << "You added the plating!"
+ else
+ user << "You create a false wall! Push on it to open or close the passage."
+ wall_fake = 1
+
+ var/turf/Tsrc = get_turf(src)
+ Tsrc.ChangeTurf(/turf/simulated/wall)
+ var/turf/simulated/wall/T = get_turf(src)
+ T.set_material(M, reinf_material)
+ if(wall_fake)
+ T.can_open = 1
+ T.add_hiddenprint(usr)
+ del(src)
+ return
+
else if(istype(W, /obj/item/pipe))
var/obj/item/pipe/P = W
if (P.pipe_type in list(0, 1, 5)) //simple pipes, simple bends, and simple manifolds.
user.drop_item()
P.loc = src.loc
- user << "\blue You fit the pipe into the [src]!"
+ user << "You fit the pipe into the [src]!"
else
..()
+/obj/structure/girder/proc/reinforce_girder()
+ cover = reinf_material.hardness
+ health = 500
+ state = 2
+ icon_state = "reinforced"
+
+/obj/structure/girder/verb/reinforce_with_material()
+ set name = "Reinforce girder"
+ set desc = "Reinforce a girder with metal."
+ set src in view(1)
+
+ var/mob/living/user = usr
+ if(!istype(user) || !(user.l_hand || user.r_hand))
+ return
+
+ if(reinf_material)
+ user << "\The [src] is already reinforced."
+ return
+
+ var/obj/item/stack/sheet/S = user.l_hand
+ if(!istype(S))
+ S = user.r_hand
+ if(!istype(S))
+ user << "You cannot plate \the [src] with that."
+ return
+
+ if(S.get_amount() < 2)
+ user << "There is not enough material here to reinforce the girder."
+ return
+
+ var/material/M = name_to_material[S.sheettype]
+ if(!istype(M) || M.integrity < 50)
+ user << "You cannot reinforce \the [src] with that; it is too soft."
+ return
+
+ user << "Now reinforcing..."
+ if (!do_after(user,40) || !S.use(2))
+ return
+ user << "You added reinforcement!"
+
+ reinf_material = M
+ reinforce_girder()
+
+
/obj/structure/girder/proc/dismantle()
new /obj/item/stack/sheet/metal(get_turf(src))
del(src)
@@ -175,7 +212,6 @@
if(prob(40))
del(src)
-
/obj/structure/girder/ex_act(severity)
switch(severity)
if(1.0)
@@ -183,101 +219,38 @@
return
if(2.0)
if (prob(30))
- var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal)
- new remains(loc)
- del(src)
+ dismantle()
return
if(3.0)
if (prob(5))
- var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal)
- new remains(loc)
- del(src)
+ dismantle()
return
else
return
-/obj/structure/girder/displaced
- icon_state = "displaced"
- anchored = 0
- health = 50
- cover = 25
-
-/obj/structure/girder/reinforced
- icon_state = "reinforced"
- state = 2
- health = 500
- cover = 80
-
-/obj/structure/cultgirder
+/obj/structure/girder/cult
icon= 'icons/obj/cult.dmi'
icon_state= "cultgirder"
- anchored = 1
- density = 1
- layer = 2
- var/health = 250
- var/cover = 70
+ health = 250
+ cover = 70
-/obj/structure/cultgirder/attack_generic(var/mob/user, var/damage, var/attack_message = "smashes apart", var/wallbreaker)
- if(!damage || !wallbreaker)
- return 0
- visible_message("[user] [attack_message] the [src]!")
- dismantle()
- return 1
-
-/obj/structure/cultgirder/proc/dismantle()
+/obj/structure/girder/cult/dismantle()
new /obj/effect/decal/remains/human(get_turf(src))
del(src)
-/obj/structure/cultgirder/attackby(obj/item/W as obj, mob/user as mob)
+/obj/structure/girder/cult/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/wrench))
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
- user << "\blue Now disassembling the girder"
+ user << "Now disassembling the girder..."
if(do_after(user,40))
- user << "\blue You dissasembled the girder!"
+ user << "You dissasembled the girder!"
dismantle()
-
else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter))
- user << "\blue Now slicing apart the girder"
+ user << "Now slicing apart the girder..."
if(do_after(user,30))
- user << "\blue You slice apart the girder!"
+ user << "You slice apart the girder!"
dismantle()
-
else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill))
- user << "\blue You drill through the girder!"
+ user << "You drill through the girder!"
new /obj/effect/decal/remains/human(get_turf(src))
dismantle()
-
-/obj/structure/cultgirder/blob_act()
- if(prob(40))
- dismantle()
-
-/obj/structure/cultgirder/bullet_act(var/obj/item/projectile/Proj) //No beam check- How else will you destroy the cult girder with silver bullets?????
- //Girders only provide partial cover. There's a chance that the projectiles will just pass through. (unless you are trying to shoot the girder)
- if(Proj.original != src && !prob(cover))
- return -1 //pass through
-
- //Tasers and the like should not damage cultgirders.
- if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN))
- return
-
- health -= Proj.damage
- ..()
- if(health <= 0)
- dismantle()
- return
-
-/obj/structure/cultgirder/ex_act(severity)
- switch(severity)
- if(1.0)
- del(src)
- return
- if(2.0)
- if (prob(30))
- dismantle()
- return
- if(3.0)
- if (prob(5))
- dismantle()
- return
- else
- return
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index abc9c2150a2..2ac2301a94c 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -119,7 +119,7 @@
Dismantle(1)
proc/Dismantle(devastated = 0)
- var/material/M = name_to_mineral[mineralType]
+ var/material/M = name_to_material[mineralType]
if(istype(M))
for(var/i = (devastated? 1 : 3), i <= oreAmount, i++)
new M.stack_type(get_turf(src))
diff --git a/code/game/smoothwall.dm b/code/game/smoothwall.dm
deleted file mode 100644
index 7692ea8e505..00000000000
--- a/code/game/smoothwall.dm
+++ /dev/null
@@ -1,141 +0,0 @@
-//Separate dm because it relates to two types of atoms + ease of removal in case it's needed.
-//Also assemblies.dm for falsewall checking for this when used.
-//I should really make the shuttle wall check run every time it's moved, but centcom uses unsimulated floors so !effort
-
-/atom/proc/relativewall() //atom because it should be useable both for walls and false walls
- if(istype(src,/turf/simulated/floor/vault)||istype(src,/turf/simulated/wall/vault)) //HACK!!!
- return
-
- var/junction = 0 //will be used to determine from which side the wall is connected to other walls
-
- if(!istype(src,/turf/simulated/shuttle/wall)) //or else we'd have wacky shuttle merging with walls action
- for(var/turf/simulated/wall/W in orange(src,1))
- if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
- junction |= get_dir(src,W)
- for(var/obj/structure/falsewall/W in orange(src,1))
- if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
- junction |= get_dir(src,W)
- for(var/obj/structure/falserwall/W in orange(src,1))
- if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
- junction |= get_dir(src,W)
-
-/* Commenting this out for now until we figure out what to do with shuttle smooth walls, if anything.
- As they are now, they sort of work screwy and may need further coding. Or just be scrapped.*/
- /*else
- for(var/turf/simulated/shuttle/wall/W in orange(src,1))
- if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
- junction |= get_dir(src,W)
- for(var/obj/machinery/shuttle/W in orange(src,1)) //stuff like engine and propulsion should merge with walls
- if(abs(src.x-W.x)-abs(src.y-W.y))
- junction |= get_dir(src,W)
- for(var/obj/machinery/door/W in orange(src,1)) //doors should not result in diagonal walls, it just looks ugly. checking if area is shuttle so it won't merge with the station
- if((abs(src.x-W.x)-abs(src.y-W.y)) && (istype(W.loc.loc,/area/shuttle) || istype(W.loc.loc,/area/supply)))
- junction |= get_dir(src,W)
- for(var/obj/structure/grille/W in orange(src,1)) //same for grilles. checking if area is shuttle so it won't merge with the station
- if((abs(src.x-W.x)-abs(src.y-W.y)) && (istype(W.loc.loc,/area/shuttle) || istype(W.loc.loc,/area/supply)))
- junction |= get_dir(src,W)*/
-
- if(istype(src,/turf/simulated/wall))
- var/turf/simulated/wall/wall = src
- wall.icon_state = "[wall.walltype][junction]"
- else if (istype(src,/obj/structure/falserwall))
- src.icon_state = "rwall[junction]"
- else if (istype(src,/obj/structure/falsewall))
- var/obj/structure/falsewall/fwall = src
- fwall.icon_state = "[fwall.mineral][junction]"
-/* else if(istype(src,/turf/simulated/shuttle/wall))
- var/newicon = icon;
- var/newiconstate = icon_state;
- if(junction!=5 && junction!=6 && junction!=9 && junction!=10) //if it's not diagonal, all is well, no additional calculations needed
- src.icon_state = "swall[junction]"
- else //if it's diagonal, we need to figure out if we're using the floor diagonal or the space diagonal sprite
- var/is_floor = 0
- for(var/turf/unsimulated/floor/F in orange(src,1))
- if(abs(src.x-F.x)-abs(src.y-F.y))
- if((15-junction) & get_dir(src,F)) //if there's a floor in at least one of the empty space directions, return 1
- is_floor = 1
- newicon = F.icon
- newiconstate = F.icon_state //we'll save these for later
- for(var/turf/simulated/floor/F in orange(src,1))
- if(abs(src.x-F.x)-abs(src.y-F.y))
- if((15-junction) & get_dir(src,F)) //if there's a floor in at least one of the empty space directions, return 1
- is_floor = 1
- newicon = F.icon
- newiconstate = F.icon_state //we'll save these for later
- for(var/turf/simulated/shuttle/floor/F in orange(src,1))
- if(abs(src.x-F.x)-abs(src.y-F.y))
- if((15-junction) & get_dir(src,F)) //if there's a floor in at least one of the empty space directions, return 1
- is_floor = 1
- newicon = F.icon
- newiconstate = F.icon_state //we'll save these for later
- if(is_floor) //if is_floor = 1, we use the floor diagonal sprite
- src.icon = newicon; //we'll set the floor's icon to the floor next to it and overlay the wall segment. shuttle floor sprites have priority
- src.icon_state = newiconstate; //
- src.overlays += icon('icons/turf/shuttle.dmi',"swall_f[junction]")
- else //otherwise, the space one
- src.icon_state = "swall_s[junction]"*/
-
- return
-
-/atom/proc/relativewall_neighbours()
- for(var/turf/simulated/wall/W in range(src,1))
- W.relativewall()
- for(var/obj/structure/falsewall/W in range(src,1))
- W.relativewall()
- W.update_icon()//Refreshes the wall to make sure the icons don't desync
- for(var/obj/structure/falserwall/W in range(src,1))
- W.relativewall()
- return
-
-/turf/simulated/wall/New()
- relativewall_neighbours()
- ..()
-
-/*/turf/simulated/shuttle/wall/New()
-
- spawn(20) //testing if this will make /obj/machinery/shuttle and /door count - It does, it stays.
- if(src.icon_state in list("wall1", "wall", "diagonalWall", "wall_floor", "wall_space")) //so wizard den, syndie shuttle etc will remain black
- for(var/turf/simulated/shuttle/wall/W in range(src,1))
- W.relativewall()
-
- ..()*/
-
-/turf/simulated/wall/Del()
- spawn(10)
- for(var/turf/simulated/wall/W in range(src,1))
- W.relativewall()
-
- for(var/obj/structure/falsewall/W in range(src,1))
- W.relativewall()
-
- for(var/direction in cardinal)
- for(var/obj/effect/plant/shroom in get_step(src,direction))
- if(!shroom.floor) //shrooms drop to the floor
- shroom.floor = 1
- shroom.update_icon()
- shroom.pixel_x = 0
- shroom.pixel_y = 0
-
- ..()
-
-/turf/simulated/wall/relativewall()
- if(istype(src,/turf/simulated/wall/vault)) //HACK!!!
- return
-
- var/junction = 0 //will be used to determine from which side the wall is connected to other walls
-
- for(var/turf/simulated/wall/W in orange(src,1))
- if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
- if(mineral == W.mineral)//Only 'like' walls connect -Sieve
- junction |= get_dir(src,W)
- for(var/obj/structure/falsewall/W in orange(src,1))
- if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
- if(mineral == W.mineral)
- junction |= get_dir(src,W)
- for(var/obj/structure/falserwall/W in orange(src,1))
- if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
- if(mineral == W.mineral)
- junction |= get_dir(src,W)
- var/turf/simulated/wall/wall = src
- wall.icon_state = "[wall.walltype][junction]"
- return
\ No newline at end of file
diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm
new file mode 100644
index 00000000000..9ff4ae5ba33
--- /dev/null
+++ b/code/game/turfs/simulated/wall_attacks.dm
@@ -0,0 +1,315 @@
+//Interactions
+/turf/simulated/wall/proc/toggle_open(var/mob/user)
+
+ if(can_open == WALL_OPENING)
+ return
+
+ if(density)
+ can_open = WALL_OPENING
+ set_wall_state("[material.icon_base]fwall_open")
+ //flick("[material.icon_base]fwall_opening", src)
+ sleep(15)
+ density = 0
+ SetOpacity(0)
+ else
+ can_open = WALL_OPENING
+ //flick("[material.icon_base]fwall_closing", src)
+ set_wall_state("[material.icon_base]0")
+ density = 1
+ sleep(15)
+ SetOpacity(1)
+
+ can_open = WALL_CAN_OPEN
+ update_icon()
+
+/turf/simulated/wall/proc/fail_smash(var/mob/user)
+ user << "You smash against the wall!"
+ take_damage(rand(25,75))
+
+/turf/simulated/wall/proc/success_smash(var/mob/user)
+ user << "You smash through the wall!"
+ spawn(1)
+ dismantle_wall(1)
+
+/turf/simulated/wall/proc/try_touch(var/mob/user, var/rotting)
+
+ if(rotting)
+ if(reinf_material)
+ user << "\The [reinf_material.display_name] feels porous and crumbly."
+ else
+ user << "\The [material.display_name] crumbles under your touch!"
+ dismantle_wall()
+ return 1
+
+ if(..()) return 1
+
+ if(!can_open)
+ user << "You push the wall, but nothing happens."
+ playsound(src, 'sound/weapons/Genhit.ogg', 25, 1)
+ else
+ toggle_open(user)
+ return 0
+
+
+/turf/simulated/wall/attack_hand(var/mob/user)
+
+ radiate()
+ add_fingerprint(user)
+ var/rotting = (locate(/obj/effect/overlay/wallrot) in src)
+ if (HULK in user.mutations)
+ if (rotting || !prob(material.hardness))
+ success_smash(user)
+ else
+ fail_smash(user)
+ return 1
+
+ try_touch(user, rotting)
+
+/turf/simulated/wall/attack_generic(var/mob/user, var/damage, var/attack_message, var/wallbreaker)
+
+ radiate()
+ var/rotting = (locate(/obj/effect/overlay/wallrot) in src)
+ if(!damage || !wallbreaker)
+ try_touch(user, rotting)
+ return
+
+ if(rotting || !prob(material.hardness))
+ success_smash(user)
+ else
+ fail_smash(user)
+ return 1
+
+/turf/simulated/wall/attackby(obj/item/weapon/W as obj, mob/user as mob)
+
+ if (!user.)
+ user << "You don't have the dexterity to do this!"
+ return
+
+ //get the user's location
+ if(!istype(user.loc, /turf)) return //can't do this stuff whilst inside objects and such
+
+ if(W)
+ radiate()
+ if(is_hot(W))
+ ignite(is_hot(W))
+
+ if(locate(/obj/effect/overlay/wallrot) in src)
+ if(istype(W, /obj/item/weapon/weldingtool) )
+ var/obj/item/weapon/weldingtool/WT = W
+ if( WT.remove_fuel(0,user) )
+ user << "You burn away the fungi with \the [WT]."
+ playsound(src, 'sound/items/Welder.ogg', 10, 1)
+ for(var/obj/effect/overlay/wallrot/WR in src)
+ del(WR)
+ return
+ else if(!is_sharp(W) && W.force >= 10 || W.force >= 20)
+ user << "\The [src] crumbles away under the force of your [W.name]."
+ src.dismantle_wall(1)
+ return
+
+ //THERMITE related stuff. Calls src.thermitemelt() which handles melting simulated walls and the relevant effects
+ if(thermite)
+ if( istype(W, /obj/item/weapon/weldingtool) )
+ var/obj/item/weapon/weldingtool/WT = W
+ if( WT.remove_fuel(0,user) )
+ thermitemelt(user)
+ return
+
+ else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter))
+ thermitemelt(user)
+ return
+
+ else if( istype(W, /obj/item/weapon/melee/energy/blade) )
+ var/obj/item/weapon/melee/energy/blade/EB = W
+
+ EB.spark_system.start()
+ user << "You slash \the [src] with \the [EB]; the thermite ignites!"
+ playsound(src, "sparks", 50, 1)
+ playsound(src, 'sound/weapons/blade1.ogg', 50, 1)
+
+ thermitemelt(user)
+ return
+
+ var/turf/T = user.loc //get user's location for delay checks
+
+ if(damage && istype(W, /obj/item/weapon/weldingtool))
+
+ var/obj/item/weapon/weldingtool/WT = W
+
+ if(!WT.isOn())
+ return
+
+ if(WT.remove_fuel(0,user))
+ user << "You start repairing the damage to [src]."
+ playsound(src, 'sound/items/Welder.ogg', 100, 1)
+ if(do_after(user, max(5, damage / 5)) && WT && WT.isOn())
+ user << "You finish repairing the damage to [src]."
+ take_damage(-damage)
+ else
+ user << "You need more welding fuel to complete this task."
+ return
+ return
+
+ // Basic dismantling.
+ if(isnull(construction_stage) || !reinf_material)
+
+ var/cut_delay = 60 - material.cut_delay
+ var/dismantle_verb
+ var/dismantle_sound
+
+ if(istype(W,/obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/WT = W
+ if(!WT.isOn())
+ return
+ if(!WT.remove_fuel(0,user))
+ user << "You need more welding fuel to complete this task."
+ return
+ dismantle_verb = "cutting"
+ dismantle_sound = 'sound/items/Welder.ogg'
+ cut_delay *= 0.7
+ else if(istype(W,/obj/item/weapon/melee/energy/blade))
+ dismantle_sound = "sparks"
+ dismantle_verb = "slicing"
+ cut_delay *= 0.5
+ else if(istype(W,/obj/item/weapon/pickaxe))
+ var/obj/item/weapon/pickaxe/P = W
+ dismantle_verb = P.drill_verb
+ dismantle_sound = P.drill_sound
+ cut_delay -= P.digspeed
+
+ if(dismantle_verb)
+
+ user << "You begin [dismantle_verb] through the outer plating."
+ if(dismantle_sound)
+ playsound(src, dismantle_sound, 100, 1)
+
+ if(cut_delay<0)
+ cut_delay = 0
+
+ if(!do_after(user,cut_delay))
+ return
+
+ user << "You remove the outer plating."
+ dismantle_wall()
+ user.visible_message("The wall was torn open by [user]!")
+ return
+
+ //Reinforced dismantling.
+ else
+ switch(construction_stage)
+ if(6)
+ if (istype(W, /obj/item/weapon/wirecutters))
+ playsound(src, 'sound/items/Wirecutter.ogg', 100, 1)
+ construction_stage = 5
+ //src.icon_state = "r_wall-1"
+ //new /obj/item/stack/rods( src )
+ user << "You cut the outer grille."
+ return
+ if(5)
+ if (istype(W, /obj/item/weapon/screwdriver))
+ user << "You begin removing the support lines."
+ playsound(src, 'sound/items/Screwdriver.ogg', 100, 1)
+ sleep(40)
+ if(!istype(src, /turf/simulated/wall) || !user || !W || !T )
+ return
+ if(construction_stage == 5 && user.loc == T && user.get_active_hand() == W )
+ construction_stage = 4
+ //src.icon_state = "r_wall-2"
+ user << "You remove the support lines."
+ return
+ else if( istype(W, /obj/item/stack/rods) )
+ var/obj/item/stack/O = W
+ if(O.get_amount()>0)
+ O.use(1)
+ construction_stage = 6
+ //src.icon_state = "r_wall"
+ user << "You replace the outer grille."
+ if(4)
+ var/cut_cover
+ if(istype(W,/obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/WT = W
+ if(!WT.isOn())
+ return
+ if(WT.remove_fuel(0,user))
+ cut_cover=1
+ else
+ user << "You need more welding fuel to complete this task."
+ return
+ else if (istype(W, /obj/item/weapon/pickaxe/plasmacutter))
+ cut_cover = 1
+
+ if(cut_cover)
+ user << "You begin slicing through the metal cover."
+ playsound(src, 'sound/items/Welder.ogg', 100, 1)
+ sleep(60)
+ if( !istype(src, /turf/simulated/wall) || !user || !W || !T ) return
+ if(construction_stage == 2 && user.loc == T && user.get_active_hand() == W)
+ construction_stage = 3
+ //src.icon_state = "r_wall-3"
+ user << "You press firmly on the cover, dislodging it."
+ return
+ if(3)
+ if (istype(W, /obj/item/weapon/crowbar))
+ user << "You struggle to pry off the cover."
+ playsound(src, 'sound/items/Crowbar.ogg', 100, 1)
+ sleep(100)
+ if( !istype(src, /turf/simulated/wall) || !user || !W || !T ) return
+ if( construction_stage == 3 && user.loc == T && user.get_active_hand() == W )
+ construction_stage = 2
+ //src.icon_state = "r_wall-4"
+ user << "You pry off the cover."
+ return
+ if(2)
+ if (istype(W, /obj/item/weapon/wrench))
+ user << "You start loosening the anchoring bolts which secure the support rods to their frame."
+ playsound(src, 'sound/items/Ratchet.ogg', 100, 1)
+ sleep(40)
+ if( !istype(src, /turf/simulated/wall) || !user || !W || !T ) return
+ if( construction_stage == 4 && user.loc == T && user.get_active_hand() == W )
+ construction_stage = 1
+ //src.icon_state = "r_wall-5"
+ user << "You remove the bolts anchoring the support rods."
+ return
+ if(1)
+
+ var/cut_cover
+ if( istype(W, /obj/item/weapon/weldingtool) )
+ var/obj/item/weapon/weldingtool/WT = W
+ if( WT.remove_fuel(0,user) )
+ cut_cover=1
+ else
+ user << "You need more welding fuel to complete this task."
+ return
+ else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter))
+ cut_cover = 1
+
+ if(cut_cover)
+ user << "You begin slicing through the support rods."
+ playsound(src, 'sound/items/Welder.ogg', 100, 1)
+ sleep(70)
+ if( !istype(src, /turf/simulated/wall) || !user || !W || !T ) return
+ if( construction_stage == 5 && user.loc == T && user.get_active_hand() == W )
+ construction_stage = 0
+ //src.icon_state = "r_wall-6"
+ //new /obj/item/stack/rods( src )
+ user << "The support rods drop out as you cut them loose from the frame."
+ return
+ if(0)
+ if( istype(W, /obj/item/weapon/crowbar) )
+ user << "You struggle to pry off the outer sheath."
+ playsound(src, 'sound/items/Crowbar.ogg', 100, 1)
+ sleep(100)
+ if(!istype(src, /turf/simulated/wall) || !user || !W || !T ) return
+ if(user.loc == T && user.get_active_hand() == W )
+ user << "You pry off the outer sheath."
+ dismantle_wall()
+ return
+
+ if(istype(W,/obj/item/frame))
+ var/obj/item/frame/F = W
+ F.try_build(src)
+ return
+
+ else if(!istype(W,/obj/item/weapon/rcd) && !istype(W, /obj/item/weapon/reagent_containers))
+ return attack_hand(user)
+
diff --git a/code/game/turfs/simulated/wall_icon.dm b/code/game/turfs/simulated/wall_icon.dm
new file mode 100644
index 00000000000..a4074c91393
--- /dev/null
+++ b/code/game/turfs/simulated/wall_icon.dm
@@ -0,0 +1,121 @@
+/turf/simulated/wall/proc/update_material()
+
+ if(!material)
+ return
+
+ if(reinf_material)
+ construction_stage = 6
+ else
+ construction_stage = null
+ if(!material)
+ material = name_to_material["steel"]
+ if(material)
+ explosion_resistance = material.explosion_resistance
+ if(reinf_material && reinf_material.explosion_resistance > explosion_resistance)
+ explosion_resistance = reinf_material.explosion_resistance
+
+ if(reinf_material)
+ name = "reinforced [material.display_name] wall"
+ desc = "It seems to be a section of hull reinforced with [reinf_material.display_name] and plated with [material.display_name]."
+ else
+ name = "[material.display_name] wall"
+ desc = "It seems to be a section of hull plated with [material.display_name]."
+
+ set_wall_state("[material.icon_base]0")
+
+ if(material.opacity > 0.5 && !opacity)
+ SetOpacity(1)
+ else if(material.opacity < 0.5 && opacity)
+ SetOpacity(0)
+
+ update_icon()
+ check_relatives()
+
+/turf/simulated/wall/proc/set_wall_state(var/new_state)
+
+ if(!material)
+ return
+
+ if(new_state)
+ last_state = new_state
+ else if(last_state)
+ new_state = last_state
+ else
+ return
+
+ overlays.Cut()
+
+ if(!wall_cache["[new_state]-[material.icon_colour]"])
+ var/image/I = image(icon='icons/turf/wall_masks.dmi',icon_state="[new_state]")
+ I.color = material.icon_colour
+ wall_cache["[new_state]-[material.icon_colour]"] = I
+ overlays |= wall_cache["[new_state]-[material.icon_colour]"]
+ if(reinf_material)
+ if(!wall_cache["[material.icon_reinf]-[reinf_material.icon_colour]"])
+ var/image/I = image(icon='icons/turf/wall_masks.dmi',icon_state="[material.icon_reinf]")
+ I.color = reinf_material.icon_colour
+ wall_cache["[material.icon_reinf]-[reinf_material.icon_colour]"] = I
+ overlays |= wall_cache["[material.icon_reinf]-[reinf_material.icon_colour]"]
+
+/turf/simulated/wall/proc/set_material(var/material/newmaterial, var/material/newrmaterial)
+ material = newmaterial
+ reinf_material = newrmaterial
+ check_relatives()
+ check_relatives(1)
+
+/turf/simulated/wall/proc/update_icon()
+
+ if(!material)
+ return
+
+ if(!damage_overlays[1]) //list hasn't been populated
+ generate_overlays()
+
+ if(density)
+ check_relatives(1)
+ else
+ set_wall_state("[material.icon_base]fwall_open")
+
+ var/overlay = round(damage / material.integrity * damage_overlays.len) + 1
+ if(overlay > damage_overlays.len)
+ overlay = damage_overlays.len
+ if(density)
+ if(damage_overlay && overlay == damage_overlay) //No need to update.
+ return
+ overlays += damage_overlays[overlay]
+ damage_overlay = overlay
+ return
+
+/turf/simulated/wall/proc/generate_overlays()
+ var/alpha_inc = 256 / damage_overlays.len
+
+ for(var/i = 1; i <= damage_overlays.len; i++)
+ var/image/img = image(icon = 'icons/turf/walls.dmi', icon_state = "overlay_damage")
+ img.blend_mode = BLEND_MULTIPLY
+ img.alpha = (i * alpha_inc) - 1
+ damage_overlays[i] = img
+
+//Smoothwall code. update_self for relativewall(), not for relativewall_neighbors()
+/turf/simulated/wall/proc/check_relatives(var/update_self)
+ if(!material)
+ return
+ var/junction
+ if(update_self)
+ junction = 0
+ for(var/checkdir in cardinal)
+ var/turf/simulated/wall/T = get_step(src, checkdir)
+ if(!istype(T) || !T.material)
+ continue
+ if(T.material && can_join_with(T))
+ if(update_self)
+ junction |= get_dir(src,T) //Not too sure why, but using checkdir just breaks walls.
+ else
+ T.check_relatives(1)
+ if(!isnull(junction))
+ set_wall_state("[material.icon_base][junction]")
+ return
+
+/turf/simulated/wall/proc/can_join_with(var/turf/simulated/wall/W)
+ if(material && W.material && material.name == W.material.name)
+ return 1
+ return 0
\ No newline at end of file
diff --git a/code/game/turfs/simulated/wall_types.dm b/code/game/turfs/simulated/wall_types.dm
new file mode 100644
index 00000000000..22909cc0e70
--- /dev/null
+++ b/code/game/turfs/simulated/wall_types.dm
@@ -0,0 +1,43 @@
+/turf/simulated/wall/r_wall
+ icon_state = "rgeneric"
+/turf/simulated/wall/r_wall/New(var/newloc)
+ ..(newloc, "steel","plasteel") //3strong
+/turf/simulated/wall/cult
+ icon_state = "cult"
+/turf/simulated/wall/cult/New(var/newloc)
+ ..(newloc,"cult","cult2")
+
+/turf/unsimulated/wall/cult
+ name = "cult wall"
+ desc = "Hideous images dance beneath the surface."
+ icon = 'icons/turf/wall_masks.dmi'
+ icon_state = "cult"
+
+
+/turf/simulated/wall/iron/New(var/newloc)
+ ..(newloc,"iron")
+/turf/simulated/wall/uranium/New(var/newloc)
+ ..(newloc,"uranium")
+/turf/simulated/wall/diamond/New(var/newloc)
+ ..(newloc,"diamond")
+/turf/simulated/wall/gold/New(var/newloc)
+ ..(newloc,"gold")
+/turf/simulated/wall/silver/New(var/newloc)
+ ..(newloc,"silver")
+/turf/simulated/wall/phoron/New(var/newloc)
+ ..(newloc,"phoron")
+/turf/simulated/wall/sandstone/New(var/newloc)
+ ..(newloc,"sandstone")
+
+/turf/simulated/wall/ironphoron/New(var/newloc)
+ ..(newloc,"iron","phoron")
+/turf/simulated/wall/golddiamond/New(var/newloc)
+ ..(newloc,"gold","diamond")
+/turf/simulated/wall/silvergold/New(var/newloc)
+ ..(newloc,"silver","gold")
+/turf/simulated/wall/sandstonediamond/New(var/newloc)
+ ..(newloc,"sandstone","diamond")
+
+
+/turf/simulated/wall/cult/New(var/newloc)
+ ..(newloc,"cult","cult2")
\ No newline at end of file
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 8fdd9036a7e..0163466e48f 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -1,29 +1,47 @@
+var/list/global/wall_cache = list()
+
/turf/simulated/wall
name = "wall"
desc = "A huge chunk of metal used to seperate rooms."
- icon = 'icons/turf/walls.dmi'
- var/mineral = "steel"
- var/rotting = 0
-
- var/damage = 0
- var/damage_cap = 150 //Wall will break down to girders if damage reaches this point
-
- var/damage_overlay
- var/global/damage_overlays[8]
-
- var/max_temperature = 1800 //K, walls will take damage if they're next to a fire hotter than this
-
+ icon = 'icons/turf/wall_masks.dmi'
+ icon_state = "generic"
opacity = 1
density = 1
blocks_air = 1
-
thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT
heat_capacity = 312500 //a little over 5 cm thick , 312500 for 1 m by 2.5 m by 0.25 m plasteel wall
- var/walltype = "steel"
+ var/damage = 0
+ var/damage_overlay
+ var/global/damage_overlays[8]
+ var/active
+ var/last_event
+ var/can_open = 0
+ var/material/material
+ var/material/reinf_material
+ var/last_state
+ var/construction_stage
+
+/turf/simulated/wall/New(var/newloc, var/materialtype, var/rmaterialtype)
+ ..(newloc)
+ icon_state = "blank"
+ if(!name_to_material)
+ populate_material_list()
+ if(!materialtype)
+ materialtype = "steel"
+ material = name_to_material[materialtype]
+ if(!isnull(rmaterialtype))
+ reinf_material = name_to_material[rmaterialtype]
+ update_material()
/turf/simulated/wall/bullet_act(var/obj/item/projectile/Proj)
+ radiate()
+ if(istype(Proj,/obj/item/projectile/beam))
+ ignite(2500)
+ else if(istype(Proj,/obj/item/projectile/ion))
+ ignite(500)
+
// Tasers and stuff? No thanks. Also no clone or tox damage crap.
if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN))
return
@@ -45,25 +63,29 @@
take_damage(tforce)
-/turf/simulated/wall/Del()
- for(var/obj/effect/E in src) if(E.name == "Wallrot") del E
- ..()
+/turf/simulated/wall/proc/clear_plants()
+ for(var/obj/effect/overlay/wallrot/WR in src)
+ del(WR)
+ for(var/obj/effect/plant/plant in range(src, 1))
+ if(!plant.floor) //shrooms drop to the floor
+ plant.floor = 1
+ plant.update_icon()
+ plant.pixel_x = 0
+ plant.pixel_y = 0
+ plant.update_neighbors()
/turf/simulated/wall/ChangeTurf(var/newtype)
- for(var/obj/effect/E in src) if(E.name == "Wallrot") del E
- for(var/obj/effect/plant/plant in range(1))
- plant.update_neighbors()
+ clear_plants()
..(newtype)
//Appearance
-
/turf/simulated/wall/examine(mob/user)
. = ..(user)
if(!damage)
user << "It looks fully intact."
else
- var/dam = damage / damage_cap
+ var/dam = damage / material.integrity
if(dam <= 0.3)
user << "It looks slightly damaged."
else if(dam <= 0.6)
@@ -71,39 +93,9 @@
else
user << "It looks heavily damaged."
- if(rotting)
+ if(locate(/obj/effect/overlay/wallrot) in src)
user << "There is fungus growing on [src]."
-/turf/simulated/wall/proc/update_icon()
- if(!damage_overlays[1]) //list hasn't been populated
- generate_overlays()
-
- if(!damage)
- overlays.Cut()
- return
-
- var/overlay = round(damage / damage_cap * damage_overlays.len) + 1
- if(overlay > damage_overlays.len)
- overlay = damage_overlays.len
-
- if(damage_overlay && overlay == damage_overlay) //No need to update.
- return
-
- overlays.Cut()
- overlays += damage_overlays[overlay]
- damage_overlay = overlay
-
- return
-
-/turf/simulated/wall/proc/generate_overlays()
- var/alpha_inc = 256 / damage_overlays.len
-
- for(var/i = 1; i <= damage_overlays.len; i++)
- var/image/img = image(icon = 'icons/turf/walls.dmi', icon_state = "overlay_damage")
- img.blend_mode = BLEND_MULTIPLY
- img.alpha = (i * alpha_inc) - 1
- damage_overlays[i] = img
-
//Damage
/turf/simulated/wall/melt()
@@ -128,8 +120,11 @@
return
/turf/simulated/wall/proc/update_damage()
- var/cap = damage_cap
- if(rotting)
+ var/cap = material.integrity
+ if(reinf_material)
+ cap += reinf_material.integrity
+
+ if(locate(/obj/effect/overlay/wallrot) in src)
cap = cap / 10
if(damage >= cap)
@@ -139,42 +134,25 @@
return
+/turf/simulated/wall/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)//Doesn't fucking work because walls don't interact with air :(
+ ignite(exposed_temperature)
+
/turf/simulated/wall/adjacent_fire_act(turf/simulated/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume)
- if(adj_temp > max_temperature)
- take_damage(log(RAND_F(0.9, 1.1) * (adj_temp - max_temperature)))
+ ignite(adj_temp)
+ if(adj_temp > material.melting_point)
+ take_damage(log(RAND_F(0.9, 1.1) * (adj_temp - material.melting_point)))
return ..()
/turf/simulated/wall/proc/dismantle_wall(devastated=0, explode=0)
- if(istype(src,/turf/simulated/wall/r_wall))
- if(!devastated)
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
- new /obj/structure/girder/reinforced(src)
- new /obj/item/stack/sheet/plasteel( src )
- else
- new /obj/item/stack/sheet/metal( src )
- new /obj/item/stack/sheet/metal( src )
- new /obj/item/stack/sheet/plasteel( src )
- else if(istype(src,/turf/simulated/wall/cult))
- if(!devastated)
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
- new /obj/effect/decal/cleanable/blood(src)
- new /obj/structure/cultgirder(src)
- else
- new /obj/effect/decal/cleanable/blood(src)
- new /obj/effect/decal/remains/human(src)
+ playsound(src, 'sound/items/Welder.ogg', 100, 1)
+ if(reinf_material)
+ reinf_material.place_dismantled_girder(src, reinf_material)
+ reinf_material.place_dismantled_product(src,devastated)
else
- if(!devastated)
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
- new /obj/structure/girder(src)
- var/material/M = name_to_mineral[mineral]
- if(istype(M) && M.stack_type)
- for(var/x=1;x<(devastated?2:3);x++)
- new M.stack_type(src)
- else
- for(var/x=1;x<(devastated?2:3);x++)
- new /obj/item/stack/sheet/metal(src)
+ material.place_dismantled_girder(src)
+ material.place_dismantled_product(src,devastated)
for(var/obj/O in src.contents) //Eject contents!
if(istype(O,/obj/structure/sign/poster))
@@ -206,26 +184,14 @@
// Wall-rot effect, a nasty fungus that destroys walls.
/turf/simulated/wall/proc/rot()
- if(!rotting)
- rotting = 1
-
- var/number_rots = rand(2,3)
- for(var/i=0, iYou don't have the dexterity to do this!"
- return
-
- //get the user's location
- if( !istype(user.loc, /turf) ) return //can't do this stuff whilst inside objects and such
-
- if(rotting)
- if(istype(W, /obj/item/weapon/weldingtool) )
- var/obj/item/weapon/weldingtool/WT = W
- if( WT.remove_fuel(0,user) )
- user << "You burn away the fungi with \the [WT]."
- playsound(src, 'sound/items/Welder.ogg', 10, 1)
- for(var/obj/effect/E in src) if(E.name == "Wallrot")
- del E
- rotting = 0
- return
- else if(!is_sharp(W) && W.force >= 10 || W.force >= 20)
- user << "\The [src] crumbles away under the force of your [W.name]."
- src.dismantle_wall(1)
+ if(!active)
+ if(world.time > last_event+15)
+ active = 1
+ for(var/mob/living/L in range(3,src))
+ L.apply_effect(M.radioactivity,IRRADIATE,0)
+ for(var/turf/simulated/wall/T in range(3,src))
+ T.radiate()
+ last_event = world.time
+ active = null
return
-
- //THERMITE related stuff. Calls src.thermitemelt() which handles melting simulated walls and the relevant effects
- if( thermite )
- if( istype(W, /obj/item/weapon/weldingtool) )
- var/obj/item/weapon/weldingtool/WT = W
- if( WT.remove_fuel(0,user) )
- thermitemelt(user)
- return
-
- else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter))
- thermitemelt(user)
- return
-
- else if( istype(W, /obj/item/weapon/melee/energy/blade) )
- var/obj/item/weapon/melee/energy/blade/EB = W
-
- EB.spark_system.start()
- user << "You slash \the [src] with \the [EB]; the thermite ignites!"
- playsound(src, "sparks", 50, 1)
- playsound(src, 'sound/weapons/blade1.ogg', 50, 1)
-
- thermitemelt(user)
- return
-
- var/turf/T = user.loc //get user's location for delay checks
-
- var/cut_delay = 60
- var/material/M = name_to_mineral[mineral]
- if(istype(M))
- cut_delay -= M.cut_delay
-
- //DECONSTRUCTION
- if( istype(W, /obj/item/weapon/weldingtool) )
-
- var/response = "Dismantle"
- if(damage)
- response = alert(user, "Would you like to repair or dismantle [src]?", "[src]", "Repair", "Dismantle")
-
- var/obj/item/weapon/weldingtool/WT = W
-
- if(WT.remove_fuel(0,user))
- if(response == "Repair")
- user << "You start repairing the damage to [src]."
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
- if(do_after(user, max(5, damage / 5)) && WT && WT.isOn())
- user << "You finish repairing the damage to [src]."
- take_damage(-damage)
-
- else if(response == "Dismantle")
- user << "You begin slicing through the outer plating."
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
- if(!do_after(user,100))
- return
- if(WT.isOn())
- user << "You remove the outer plating."
- dismantle_wall()
- for(var/mob/O in viewers(user, 5))
- O.show_message("The wall was sliced apart by [user]!", 1, "You hear metal being sliced apart.", 2)
- return
- return
- else
- user << "You need more welding fuel to complete this task."
- return
-
- else if( istype(W, /obj/item/weapon/pickaxe) )
-
- var/obj/item/weapon/pickaxe/P = W
- user << "You begin [P.drill_verb] through the outer plating."
- if(P.drill_sound)
- playsound(src, P.drill_sound, 100, 1)
-
- cut_delay -= P.digspeed
- if(cut_delay<0)
- cut_delay = 0
-
- if(!do_after(user,cut_delay))
- return
-
- user << "You remove the outer plating."
- dismantle_wall()
- for(var/mob/O in viewers(user, 5))
- O.show_message("The wall was torn open by [user]!", 1, "You hear metal being sliced apart.", 2)
- return
-
- else if( istype(W, /obj/item/weapon/melee/energy/blade) )
- var/obj/item/weapon/melee/energy/blade/EB = W
-
- EB.spark_system.start()
- user << "You stab \the [EB] into the wall and begin to slice it apart."
- playsound(src, "sparks", 50, 1)
-
- if(!do_after(user,cut_delay))
- return
-
- if( !istype(src, /turf/simulated/wall) || !user || !EB || !T ) return
-
- if( user.loc == T && user.get_active_hand() == W )
- EB.spark_system.start()
- playsound(src, "sparks", 50, 1)
- playsound(src, 'sound/weapons/blade1.ogg', 50, 1)
- dismantle_wall(1)
- for(var/mob/O in viewers(user, 5))
- O.show_message("The wall was sliced apart by [user]!", 1, "You hear metal being sliced apart and sparks flying.", 2)
- return
-
- else if(istype(W,/obj/item/apc_frame))
- var/obj/item/apc_frame/AH = W
- AH.try_build(src)
- return
-
- else if(istype(W,/obj/item/alarm_frame))
- var/obj/item/alarm_frame/AH = W
- AH.try_build(src)
- return
-
- else if(istype(W,/obj/item/firealarm_frame))
- var/obj/item/firealarm_frame/AH = W
- AH.try_build(src)
- return
-
- else if(istype(W,/obj/item/light_fixture_frame))
- var/obj/item/light_fixture_frame/AH = W
- AH.try_build(src)
- return
-
- else if(istype(W,/obj/item/light_fixture_frame/small))
- var/obj/item/light_fixture_frame/small/AH = W
- AH.try_build(src)
- return
-
- else if(istype(W,/obj/item/rust_fuel_compressor_frame))
- var/obj/item/rust_fuel_compressor_frame/AH = W
- AH.try_build(src)
- return
-
- else if(istype(W,/obj/item/rust_fuel_assembly_port_frame))
- var/obj/item/rust_fuel_assembly_port_frame/AH = W
- AH.try_build(src)
- return
-
- else if(istype(W,/obj/item/weapon/rcd)) //I bitterly resent having to write this. ~Z
- return
-
- else if(istype(W, /obj/item/weapon/reagent_containers))
- return // They tend to have meaningful afterattack - let them apply it without destroying a rotting wall
-
- else
- return attack_hand(user)
return
+
+/turf/simulated/wall/proc/burn(temperature)
+ spawn(2)
+ new /obj/structure/girder(src)
+ src.ChangeTurf(/turf/simulated/floor)
+ for(var/turf/simulated/floor/target_tile in range(0,src))
+ if(material == "phoron") //ergh
+ target_tile.assume_gas("phoron", 20, 400+T0C)
+ spawn (0) target_tile.hotspot_expose(temperature, 400)
+ for(var/turf/simulated/wall/W in range(3,src))
+ W.ignite((temperature/4))
+ for(var/obj/machinery/door/airlock/phoron/D in range(3,src))
+ D.ignite(temperature/4)
+
+/turf/simulated/wall/proc/ignite(var/exposed_temperature)
+
+ var/material/M = name_to_material[material]
+ if(!istype(M) || !isnull(M.ignition_point))
+ return
+ if(exposed_temperature > M.ignition_point)//If the temperature of the object is over 300, then ignite
+ burn(exposed_temperature)
+ return
+ ..()
+
+/turf/simulated/wall/Bumped(AM as mob|obj)
+ radiate()
+ ..()
+
+/turf/simulated/wall/Del()
+ clear_plants()
+ check_relatives()
+ ..()
diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm
deleted file mode 100644
index 32ecc15225b..00000000000
--- a/code/game/turfs/simulated/walls_mineral.dm
+++ /dev/null
@@ -1,121 +0,0 @@
-/turf/simulated/wall/mineral
- name = "mineral wall"
- desc = "This shouldn't exist"
- icon_state = ""
- var/last_event = 0
- var/active = null
-
-/turf/simulated/wall/mineral/gold
- name = "gold wall"
- desc = "A wall with gold plating. Swag!"
- icon_state = "gold0"
- walltype = "gold"
-
-/turf/simulated/wall/mineral/silver
- name = "silver wall"
- desc = "A wall with silver plating. Shiny!"
- icon_state = "silver0"
- walltype = "silver"
-
-/turf/simulated/wall/mineral/diamond
- name = "diamond wall"
- desc = "A wall with diamond plating. You monster."
- icon_state = "diamond0"
- walltype = "diamond"
-
-/turf/simulated/wall/mineral/sandstone
- name = "sandstone wall"
- desc = "A wall with sandstone plating."
- icon_state = "sandstone0"
- walltype = "sandstone"
-
-/turf/simulated/wall/mineral/uranium
- name = "uranium wall"
- desc = "A wall with uranium plating. This is probably a bad idea."
- icon_state = "uranium0"
- walltype = "uranium"
-
-/turf/simulated/wall/mineral/uranium/proc/radiate()
- if(!active)
- if(world.time > last_event+15)
- active = 1
- for(var/mob/living/L in range(3,src))
- L.apply_effect(12,IRRADIATE,0)
- for(var/turf/simulated/wall/mineral/uranium/T in range(3,src))
- T.radiate()
- last_event = world.time
- active = null
- return
- return
-
-/turf/simulated/wall/mineral/uranium/attack_hand(mob/user as mob)
- radiate()
- ..()
-
-/turf/simulated/wall/mineral/uranium/attackby(obj/item/weapon/W as obj, mob/user as mob)
- radiate()
- ..()
-
-/turf/simulated/wall/mineral/uranium/Bumped(AM as mob|obj)
- radiate()
- ..()
-
-/turf/simulated/wall/mineral/phoron
- name = "phoron wall"
- desc = "A wall with phoron plating. This is definately a bad idea."
- icon_state = "phoron0"
- walltype = "phoron"
- mineral = "phoron"
-
-/turf/simulated/wall/mineral/phoron/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(is_hot(W) > 300)//If the temperature of the object is over 300, then ignite
- ignite(is_hot(W))
- return
- ..()
-
-/turf/simulated/wall/mineral/phoron/proc/PhoronBurn(temperature)
- spawn(2)
- new /obj/structure/girder(src)
- src.ChangeTurf(/turf/simulated/floor)
- for(var/turf/simulated/floor/target_tile in range(0,src))
- target_tile.assume_gas("phoron", 20, 400+T0C)
- spawn (0) target_tile.hotspot_expose(temperature, 400)
- for(var/obj/structure/falsewall/phoron/F in range(3,src))//Hackish as fuck, but until temperature_expose works, there is nothing I can do -Sieve
- var/turf/T = get_turf(F)
- T.ChangeTurf(/turf/simulated/wall/mineral/phoron/)
- del (F)
- for(var/turf/simulated/wall/mineral/phoron/W in range(3,src))
- W.ignite((temperature/4))//Added so that you can't set off a massive chain reaction with a small flame
- for(var/obj/machinery/door/airlock/phoron/D in range(3,src))
- D.ignite(temperature/4)
-
-/turf/simulated/wall/mineral/phoron/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)//Doesn't fucking work because walls don't interact with air :(
- if(exposed_temperature > 300)
- PhoronBurn(exposed_temperature)
-
-/turf/simulated/wall/mineral/phoron/proc/ignite(exposed_temperature)
- if(exposed_temperature > 300)
- PhoronBurn(exposed_temperature)
-
-/turf/simulated/wall/mineral/phoron/bullet_act(var/obj/item/projectile/Proj)
- if(istype(Proj,/obj/item/projectile/beam))
- PhoronBurn(2500)
- else if(istype(Proj,/obj/item/projectile/ion))
- PhoronBurn(500)
- ..()
-
-/*
-/turf/simulated/wall/mineral/proc/shock()
- if (electrocute_mob(user, C, src))
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(5, 1, src)
- s.start()
- return 1
- else
- return 0
-
-/turf/simulated/wall/mineral/proc/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if((mineral == "gold") || (mineral == "silver"))
- if(shocked)
- shock()
-*/
diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm
deleted file mode 100644
index fdc5d929955..00000000000
--- a/code/game/turfs/simulated/walls_misc.dm
+++ /dev/null
@@ -1,8 +0,0 @@
-/turf/simulated/wall/cult
- name = "wall"
- desc = "The patterns engraved on the wall seem to shift as you try to focus on them. You feel sick"
- icon_state = "cult"
- walltype = "cult"
-
-/turf/unsimulated/wall/cult/cultify()
- return
diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm
deleted file mode 100644
index 497371eb5f6..00000000000
--- a/code/game/turfs/simulated/walls_reinforced.dm
+++ /dev/null
@@ -1,307 +0,0 @@
-/turf/simulated/wall/r_wall
- name = "reinforced wall"
- desc = "A huge chunk of reinforced metal used to seperate rooms."
- icon_state = "r_wall"
- opacity = 1
- density = 1
-
- damage_cap = 800
- max_temperature = 6000
-
- walltype = "rwall"
-
- var/d_state = 0
-
-/turf/simulated/wall/r_wall
- hulk_destroy_prob = 10
- hulk_take_damage = 0
- rotting_destroy_touch = 0
- rotting_touch_message = "\blue This wall feels rather unstable."
-
-/turf/simulated/wall/r_wall/attack_generic(var/mob/user, var/damage, var/attack_message, var/wallbreaker)
- if(!rotting && wallbreaker < 2)
- user << "You push the wall but nothing happens."
- return
-
- return ..()
-
-/turf/simulated/wall/r_wall/attackby(obj/item/W as obj, mob/user as mob)
-
- if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
- user << "You don't have the dexterity to do this!"
- return
-
- //get the user's location
- if( !istype(user.loc, /turf) ) return //can't do this stuff whilst inside objects and such
-
- if(rotting)
- if(istype(W, /obj/item/weapon/weldingtool) )
- var/obj/item/weapon/weldingtool/WT = W
- if( WT.remove_fuel(0,user) )
- user << "You burn away the fungi with \the [WT]."
- playsound(src, 'sound/items/Welder.ogg', 10, 1)
- for(var/obj/effect/E in src) if(E.name == "Wallrot")
- del E
- rotting = 0
- return
- else if(!is_sharp(W) && W.force >= 10 || W.force >= 20)
- user << "\The [src] crumbles away under the force of your [W.name]."
- src.dismantle_wall()
- return
-
- //THERMITE related stuff. Calls src.thermitemelt() which handles melting simulated walls and the relevant effects
- if( thermite )
- if( istype(W, /obj/item/weapon/weldingtool) )
- var/obj/item/weapon/weldingtool/WT = W
- if( WT.remove_fuel(0,user) )
- thermitemelt(user)
- return
-
- else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter))
- thermitemelt(user)
- return
-
- else if( istype(W, /obj/item/weapon/melee/energy/blade) )
- var/obj/item/weapon/melee/energy/blade/EB = W
-
- EB.spark_system.start()
- user << "You slash \the [src] with \the [EB]; the thermite ignites!"
- playsound(src, "sparks", 50, 1)
- playsound(src, 'sound/weapons/blade1.ogg', 50, 1)
-
- thermitemelt(user)
- return
-
- else if(istype(W, /obj/item/weapon/melee/energy/blade))
- user << "This wall is too thick to slice through. You will need to find a different path."
- return
-
- if(damage && istype(W, /obj/item/weapon/weldingtool))
- var/obj/item/weapon/weldingtool/WT = W
- if(WT.remove_fuel(0,user))
- user << "You start repairing the damage to [src]."
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
- if(do_after(user, max(5, damage / 5)) && WT && WT.isOn())
- user << "You finish repairing the damage to [src]."
- take_damage(-damage)
- return
- else
- user << "You need more welding fuel to complete this task."
- return
-
- var/turf/T = user.loc //get user's location for delay checks
-
- //DECONSTRUCTION
- switch(d_state)
- if(0)
- if (istype(W, /obj/item/weapon/wirecutters))
- playsound(src, 'sound/items/Wirecutter.ogg', 100, 1)
- src.d_state = 1
- src.icon_state = "r_wall-1"
- new /obj/item/stack/rods( src )
- user << "You cut the outer grille."
- return
-
- if(1)
- if (istype(W, /obj/item/weapon/screwdriver))
- user << "You begin removing the support lines."
- playsound(src, 'sound/items/Screwdriver.ogg', 100, 1)
-
- sleep(40)
- if( !istype(src, /turf/simulated/wall/r_wall) || !user || !W || !T ) return
-
- if( d_state == 1 && user.loc == T && user.get_active_hand() == W )
- src.d_state = 2
- src.icon_state = "r_wall-2"
- user << "You remove the support lines."
- return
-
- //REPAIRING (replacing the outer grille for cosmetic damage)
- else if( istype(W, /obj/item/stack/rods) )
- var/obj/item/stack/O = W
- src.d_state = 0
- src.icon_state = "r_wall"
- relativewall_neighbours() //call smoothwall stuff
- user << "You replace the outer grille."
- if (O.amount > 1)
- O.amount--
- else
- del(O)
- return
-
- if(2)
- if( istype(W, /obj/item/weapon/weldingtool) )
- var/obj/item/weapon/weldingtool/WT = W
- if( WT.remove_fuel(0,user) )
-
- user << "You begin slicing through the metal cover."
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
-
- sleep(60)
- if( !istype(src, /turf/simulated/wall/r_wall) || !user || !WT || !WT.isOn() || !T ) return
-
- if( d_state == 2 && user.loc == T && user.get_active_hand() == WT )
- src.d_state = 3
- src.icon_state = "r_wall-3"
- user << "You press firmly on the cover, dislodging it."
- else
- user << "You need more welding fuel to complete this task."
- return
-
- if( istype(W, /obj/item/weapon/pickaxe/plasmacutter) )
-
- user << "You begin slicing through the metal cover."
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
-
- sleep(40)
- if( !istype(src, /turf/simulated/wall/r_wall) || !user || !W || !T ) return
-
- if( d_state == 2 && user.loc == T && user.get_active_hand() == W )
- src.d_state = 3
- src.icon_state = "r_wall-3"
- user << "You press firmly on the cover, dislodging it."
- return
-
- if(3)
- if (istype(W, /obj/item/weapon/crowbar))
-
- user << "You struggle to pry off the cover."
- playsound(src, 'sound/items/Crowbar.ogg', 100, 1)
-
- sleep(100)
- if( !istype(src, /turf/simulated/wall/r_wall) || !user || !W || !T ) return
-
- if( d_state == 3 && user.loc == T && user.get_active_hand() == W )
- src.d_state = 4
- src.icon_state = "r_wall-4"
- user << "You pry off the cover."
- return
-
- if(4)
- if (istype(W, /obj/item/weapon/wrench))
-
- user << "You start loosening the anchoring bolts which secure the support rods to their frame."
- playsound(src, 'sound/items/Ratchet.ogg', 100, 1)
-
- sleep(40)
- if( !istype(src, /turf/simulated/wall/r_wall) || !user || !W || !T ) return
-
- if( d_state == 4 && user.loc == T && user.get_active_hand() == W )
- src.d_state = 5
- src.icon_state = "r_wall-5"
- user << "You remove the bolts anchoring the support rods."
- return
-
- if(5)
- if( istype(W, /obj/item/weapon/weldingtool) )
- var/obj/item/weapon/weldingtool/WT = W
- if( WT.remove_fuel(0,user) )
-
- user << "You begin slicing through the support rods."
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
-
- sleep(100)
- if( !istype(src, /turf/simulated/wall/r_wall) || !user || !WT || !WT.isOn() || !T ) return
-
- if( d_state == 5 && user.loc == T && user.get_active_hand() == WT )
- src.d_state = 6
- src.icon_state = "r_wall-6"
- new /obj/item/stack/rods( src )
- user << "The support rods drop out as you cut them loose from the frame."
- else
- user << "You need more welding fuel to complete this task."
- return
-
- if( istype(W, /obj/item/weapon/pickaxe/plasmacutter) )
-
- user << "You begin slicing through the support rods."
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
-
- sleep(70)
- if( !istype(src, /turf/simulated/wall/r_wall) || !user || !W || !T ) return
-
- if( d_state == 5 && user.loc == T && user.get_active_hand() == W )
- src.d_state = 6
- src.icon_state = "r_wall-6"
- new /obj/item/stack/rods( src )
- user << "The support rods drop out as you cut them loose from the frame."
- return
-
- if(6)
- if( istype(W, /obj/item/weapon/crowbar) )
-
- user << "You struggle to pry off the outer sheath."
- playsound(src, 'sound/items/Crowbar.ogg', 100, 1)
-
- sleep(100)
- if( !istype(src, /turf/simulated/wall/r_wall) || !user || !W || !T ) return
-
- if( user.loc == T && user.get_active_hand() == W )
- user << "You pry off the outer sheath."
- dismantle_wall()
- return
-
-//vv OK, we weren't performing a valid deconstruction step or igniting thermite,let's check the other possibilities vv
-
- //DRILLING
- if (istype(W, /obj/item/weapon/pickaxe/diamonddrill))
-
- user << "You begin to drill though the wall."
-
- sleep(200)
- if( !istype(src, /turf/simulated/wall/r_wall) || !user || !W || !T ) return
-
- if( user.loc == T && user.get_active_hand() == W )
- user << "Your drill tears though the last of the reinforced plating."
- dismantle_wall()
-
- //REPAIRING
- else if( istype(W, /obj/item/stack/sheet/metal) && d_state )
- var/obj/item/stack/sheet/metal/MS = W
-
- user << "You begin patching-up the wall with \a [MS]."
-
- sleep( max(20*d_state,100) ) //time taken to repair is proportional to the damage! (max 10 seconds)
- if( !istype(src, /turf/simulated/wall/r_wall) || !user || !MS || !T ) return
-
- if( user.loc == T && user.get_active_hand() == MS && d_state )
- src.d_state = 0
- src.icon_state = "r_wall"
- relativewall_neighbours() //call smoothwall stuff
- user << "You repair the last of the damage."
- if (MS.amount > 1)
- MS.amount--
- else
- del(MS)
-
- //APC
- else if( istype(W,/obj/item/apc_frame) )
- var/obj/item/apc_frame/AH = W
- AH.try_build(src)
-
- else if( istype(W,/obj/item/alarm_frame) )
- var/obj/item/alarm_frame/AH = W
- AH.try_build(src)
-
- else if(istype(W,/obj/item/firealarm_frame))
- var/obj/item/firealarm_frame/AH = W
- AH.try_build(src)
- return
-
- else if(istype(W,/obj/item/light_fixture_frame))
- var/obj/item/light_fixture_frame/AH = W
- AH.try_build(src)
- return
-
- else if(istype(W,/obj/item/light_fixture_frame/small))
- var/obj/item/light_fixture_frame/small/AH = W
- AH.try_build(src)
- return
-
- else if(istype(W, /obj/item/weapon/reagent_containers))
- return // They tend to have meaningful afterattack - let them apply it without destroying a rotting wall
-
- //Finally, CHECKING FOR FALSE WALLS if it isn't damaged
- else if(!d_state)
- return attack_hand(user)
- return
\ No newline at end of file
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index f033f1e3783..fb30591746f 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -271,6 +271,7 @@
icon_state = "thermalimplants"
item_state = "syringe_kit"
+/* These do not currently work, commenting out pending fixes.
/obj/item/clothing/glasses/minerals
name = "resonance scanners"
desc = "A set of goggles geared towards detecting different concentrations of minerals."
@@ -312,8 +313,8 @@
return
for(var/obj/effect/mineral/M in range(wearer,6))
// Maybe make a cache for this so multiple miners aren't spawning copies.
- ore_nodes += M.scanner_image
- if(ore_nodes.len && wearer.client)
+ ore_nodes |= M.get_scan_overlay()
+ if(wearer.client)
wearer.client.images |= ore_nodes
/obj/item/clothing/glasses/minerals/proc/remove_ore_images()
@@ -325,7 +326,4 @@
wearer.client.images -= I
del(I)
ore_nodes.Cut()
-
-/obj/item/clothing/glasses/minerals/dropped()
- remove_ore_images()
- wearer = null
\ No newline at end of file
+*/
\ No newline at end of file
diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm
new file mode 100644
index 00000000000..649cb86500e
--- /dev/null
+++ b/code/modules/materials/materials.dm
@@ -0,0 +1,170 @@
+var/list/name_to_material
+
+/proc/populate_material_list()
+ name_to_material = list()
+ for(var/type in typesof(/material) - /material)
+ var/material/new_mineral = new type
+ if(!new_mineral.name)
+ continue
+ name_to_material[lowertext(new_mineral.name)] = new_mineral
+ return 1
+
+/*
+ Valid sprite masks:
+ stone
+ metal
+ solid
+ cult
+*/
+
+/material
+ var/name // Tag for use in overlay generation/list population .
+ var/display_name
+ var/icon_base = "metal"
+ var/icon_colour
+ var/icon_reinf = "reinf_metal"
+ var/stack_type
+ var/unmeltable
+ var/cut_delay = 0
+ var/radioactivity
+ var/ignition_point
+ var/melting_point = 1800 // K, walls will take damage if they're next to a fire hotter than this
+ var/integrity = 150 // Damage before wall falls apart, essentially.
+ var/hardness = 60 // Used to determine if a hulk can punch through this wall.
+ var/rotting_touch_message = "crumbles under your touch"
+ var/opacity = 1
+ var/explosion_resistance = 5
+
+/material/New()
+ ..()
+ if(!display_name)
+ display_name = name
+
+/material/proc/place_dismantled_girder(var/turf/target, var/material/reinf_material)
+ var/obj/structure/girder/G = new(target)
+ if(reinf_material)
+ G.reinf_material = reinf_material
+ G.reinforce_girder()
+
+/material/proc/place_dismantled_product(var/turf/target,var/is_devastated)
+ for(var/x=1;x<(is_devastated?2:3);x++)
+ place_sheet(target)
+
+/material/proc/place_sheet(var/turf/target)
+ if(stack_type)
+ new stack_type(target)
+
+/material/uranium
+ name = "uranium"
+ stack_type = /obj/item/stack/sheet/mineral/uranium
+ radioactivity = 12
+ icon_base = "stone"
+ icon_reinf = "reinf_stone"
+ icon_colour = "#007A00"
+
+/material/diamond
+ name = "diamond"
+ stack_type = /obj/item/stack/sheet/mineral/diamond
+ unmeltable = 1
+ cut_delay = 60
+ icon_colour = "#00FFE1"
+ opacity = 0.4
+
+/material/gold
+ name = "gold"
+ stack_type = /obj/item/stack/sheet/mineral/gold
+ icon_colour = "#EDD12F"
+
+/material/silver
+ name = "silver"
+ stack_type = /obj/item/stack/sheet/mineral/silver
+ icon_colour = "#D1E6E3"
+
+/material/phoron
+ name = "phoron"
+ stack_type = /obj/item/stack/sheet/mineral/phoron
+ ignition_point = 300
+ icon_base = "stone"
+ icon_colour = "#FC2BC5"
+
+/material/sandstone
+ name = "sandstone"
+ stack_type = /obj/item/stack/sheet/mineral/sandstone
+ icon_base = "stone"
+ icon_reinf = "reinf_stone"
+ icon_colour = "#D9C179"
+
+/material/steel
+ name = "steel"
+ stack_type = /obj/item/stack/sheet/metal
+ icon_base = "solid"
+ icon_reinf = "reinf_over"
+ icon_colour = "#666666"
+
+/material/plasteel
+ name = "plasteel"
+ stack_type = /obj/item/stack/sheet/plasteel
+ integrity = 800
+ melting_point = 6000
+ icon_base = "solid"
+ icon_reinf = "reinf_over"
+ icon_colour = "#777777"
+ explosion_resistance = 25
+
+/material/glass
+ name = "glass"
+ stack_type = /obj/item/stack/sheet/glass
+ icon_colour = "#00E1FF"
+ opacity = 0.3
+
+/material/plastic
+ name = "plastic"
+ stack_type = /obj/item/stack/sheet/mineral/plastic
+ icon_base = "solid"
+ icon_reinf = "reinf_over"
+ icon_colour = "#CCCCCC"
+
+/material/osmium
+ name = "osmium"
+ stack_type = /obj/item/stack/sheet/mineral/osmium
+ icon_colour = "#9999FF"
+
+/material/tritium
+ name = "tritium"
+ stack_type = /obj/item/stack/sheet/mineral/tritium
+ icon_colour = "#777777"
+
+/material/mhydrogen
+ name = "mhydrogen"
+ stack_type = /obj/item/stack/sheet/mineral/mhydrogen
+ icon_colour = "#E6C5DE"
+
+/material/platinum
+ name = "platinum"
+ stack_type = /obj/item/stack/sheet/mineral/platinum
+ icon_colour = "#9999FF"
+
+/material/iron
+ name = "iron"
+ stack_type = /obj/item/stack/sheet/mineral/iron
+ icon_colour = "#5C5454"
+
+/material/cult
+ name = "cult"
+ display_name = "disturbing stone"
+ icon_base = "cult"
+ icon_colour = "#402821"
+ icon_reinf = "reinf_cult"
+
+/material/cult/place_dismantled_girder(var/turf/target)
+ new /obj/structure/girder/cult(target)
+
+/material/cult/place_dismantled_product(var/turf/target)
+ new /obj/effect/decal/cleanable/blood(target)
+
+/material/cult/reinf
+ name = "cult2"
+ display_name = "human remains"
+
+/material/cult/reinf/place_dismantled_product(var/turf/target)
+ new /obj/effect/decal/remains/human(target)
diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm
index 86a58dcfccf..de0d92d305d 100644
--- a/code/modules/mining/machine_processing.dm
+++ b/code/modules/mining/machine_processing.dm
@@ -42,8 +42,9 @@
for(var/ore in machine.ores_processing)
if(!machine.ores_stored[ore] && !show_all_ores) continue
-
- dat += "| [capitalize(ore)] | [machine.ores_stored[ore]] | 0) can_make--
- var/material/M = name_to_mineral[O.compresses_to]
+ var/material/M = name_to_material[O.compresses_to]
if(!istype(M) || !can_make || ores_stored[metal] < 1)
continue
@@ -220,7 +223,7 @@
var/can_make = Clamp(ores_stored[metal],0,sheets_per_tick-sheets)
- var/material/M = name_to_mineral[O.smelts_to]
+ var/material/M = name_to_material[O.smelts_to]
if(!istype(M) || !can_make || ores_stored[metal] < 1)
continue
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 15d1f511482..5295c26bd45 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -26,7 +26,7 @@
new /obj/item/device/flashlight/lantern(src)
new /obj/item/weapon/shovel(src)
new /obj/item/weapon/pickaxe(src)
- new /obj/item/clothing/glasses/minerals(src)
+ new /obj/item/clothing/glasses/material(src)
/******************************Lantern*******************************/
diff --git a/code/modules/mining/mineral_effect.dm b/code/modules/mining/mineral_effect.dm
index 408ab74c334..bc0ce899ea4 100644
--- a/code/modules/mining/mineral_effect.dm
+++ b/code/modules/mining/mineral_effect.dm
@@ -5,15 +5,22 @@
mouse_opacity = 0
density = 0
anchored = 1
+ var/ore_key
var/image/scanner_image
/obj/effect/mineral/New(var/newloc, var/ore/M)
..(newloc)
name = "[M.display_name] deposit"
- icon_state = "rock_[M.name]"
+ ore_key = M.name
+ icon_state = "rock_[ore_key]"
var/turf/T = get_turf(src)
layer = T.layer+0.1
- var/ore/O = ore_data[M.name]
- if(O)
- scanner_image = image(icon, loc = get_turf(src), icon_state = (O.scan_icon ? O.scan_icon : icon_state))
\ No newline at end of file
+/obj/effect/mineral/proc/get_scan_overlay()
+ if(!scanner_image)
+ var/ore/O = ore_data[ore_key]
+ if(O)
+ scanner_image = image(icon, loc = get_turf(src), icon_state = (O.scan_icon ? O.scan_icon : icon_state))
+ else
+ world << "No ore data for [src]!"
+ return scanner_image
\ No newline at end of file
diff --git a/code/modules/mining/minerals.dm b/code/modules/mining/minerals.dm
deleted file mode 100644
index 67ddfdbdef1..00000000000
--- a/code/modules/mining/minerals.dm
+++ /dev/null
@@ -1,96 +0,0 @@
-var/list/name_to_mineral
-
-/proc/SetupMinerals()
- name_to_mineral = list()
- for(var/type in typesof(/material) - /material)
- var/material/new_mineral = new type
- if(!new_mineral.name)
- continue
- name_to_mineral[lowertext(new_mineral.name)] = new_mineral
- return 1
-
-/material
- var/name // Tag for use in overlay generation/list population .
- var/walltype_solid
- var/walltype_false
- var/doortype
- var/stack_type
- var/unmeltable
- var/cut_delay
-
-/material/uranium
- name = "uranium"
- walltype_solid = /turf/simulated/wall/mineral/uranium
- walltype_false = /obj/structure/falsewall/uranium
- doortype = /obj/machinery/door/airlock/uranium
- stack_type = /obj/item/stack/sheet/mineral/uranium
-
-/material/diamond
- name = "diamond"
- walltype_solid = /turf/simulated/wall/mineral/diamond
- walltype_false = /obj/structure/falsewall/diamond
- doortype = /obj/machinery/door/airlock/diamond
- stack_type = /obj/item/stack/sheet/mineral/diamond
- unmeltable = 1
- cut_delay = 60
-
-/material/gold
- name = "gold"
- walltype_solid = /turf/simulated/wall/mineral/gold
- walltype_false = /obj/structure/falsewall/gold
- doortype = /obj/machinery/door/airlock/gold
- stack_type = /obj/item/stack/sheet/mineral/gold
-
-/material/silver
- name = "silver"
- walltype_solid = /turf/simulated/wall/mineral/silver
- walltype_false = /obj/structure/falsewall/silver
- doortype = /obj/machinery/door/airlock/silver
- stack_type = /obj/item/stack/sheet/mineral/silver
-
-/material/phoron
- name = "phoron"
- walltype_solid = /turf/simulated/wall/mineral/phoron
- walltype_false = /obj/structure/falsewall/phoron
- doortype = /obj/machinery/door/airlock/phoron
- stack_type = /obj/item/stack/sheet/mineral/phoron
-
-/material/sandstone
- name = "sandstone"
- walltype_solid = /turf/simulated/wall/mineral/sandstone
- walltype_false = /obj/structure/falsewall/sandstone
- stack_type = /obj/item/stack/sheet/mineral/sandstone
-
-/material/steel
- name = "steel"
- stack_type = /obj/item/stack/sheet/metal
- walltype_solid = /turf/simulated/wall
- walltype_false = /obj/structure/falsewall
-
-/material/glass
- name = "glass"
- stack_type = /obj/item/stack/sheet/glass
-
-/material/plastic
- name = "plastic"
- stack_type = /obj/item/stack/sheet/mineral/plastic
-
-/material/osmium
- name = "osmium"
- stack_type = /obj/item/stack/sheet/mineral/osmium
-
-/material/tritium
- name = "tritium"
- stack_type = /obj/item/stack/sheet/mineral/tritium
-
-/material/mhydrogen
- name = "mhydrogen"
- stack_type = /obj/item/stack/sheet/mineral/mhydrogen
-
-/material/platinum
- name = "platinum"
- stack_type = /obj/item/stack/sheet/mineral/platinum
-
-/material/iron
- name = "iron"
- stack_type = /obj/item/stack/sheet/mineral/iron
diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm
index 2c2ac1b1d3b..a46b2631520 100644
--- a/code/modules/mining/ore.dm
+++ b/code/modules/mining/ore.dm
@@ -4,71 +4,71 @@
icon_state = "ore2"
w_class = 2
var/datum/geosample/geologic_data
- var/mineral
+ var/material
/obj/item/weapon/ore/uranium
name = "pitchblende"
icon_state = "ore_uranium"
origin_tech = "materials=5"
- mineral = "uranium"
+ material = "uranium"
/obj/item/weapon/ore/iron
name = "hematite"
icon_state = "ore_iron"
origin_tech = "materials=1"
- mineral = "hematite"
+ material = "hematite"
/obj/item/weapon/ore/coal
- name = "carbonaceous rock"
+ name = "raw carbon"
icon_state = "ore_coal"
origin_tech = "materials=1"
- mineral = "coal"
+ material = "carbon"
/obj/item/weapon/ore/glass
name = "impure silicates"
icon_state = "ore_glass"
origin_tech = "materials=1"
- mineral = "sand"
+ material = "sand"
/obj/item/weapon/ore/phoron
name = "phoron crystals"
icon_state = "ore_phoron"
origin_tech = "materials=2"
- mineral = "phoron"
+ material = "phoron"
/obj/item/weapon/ore/silver
name = "native silver ore"
icon_state = "ore_silver"
origin_tech = "materials=3"
- mineral = "silver"
+ material = "silver"
/obj/item/weapon/ore/gold
name = "native gold ore"
icon_state = "ore_gold"
origin_tech = "materials=4"
- mineral = "gold"
+ material = "gold"
/obj/item/weapon/ore/diamond
name = "diamonds"
icon_state = "ore_diamond"
origin_tech = "materials=6"
- mineral = "diamond"
+ material = "diamond"
/obj/item/weapon/ore/osmium
name = "raw platinum"
icon_state = "ore_platinum"
- mineral = "platinum"
+ material = "platinum"
/obj/item/weapon/ore/hydrogen
name = "raw hydrogen"
icon_state = "ore_hydrogen"
- mineral = "mhydrogen"
+ material = "mhydrogen"
/obj/item/weapon/ore/slag
name = "Slag"
desc = "Someone screwed up..."
icon_state = "slag"
- mineral = "slag"
+ material = null
/obj/item/weapon/ore/New()
pixel_x = rand(0,16)-8
diff --git a/code/modules/mining/ore_datum.dm b/code/modules/mining/ore_datum.dm
index e662eb913ea..32f03c072f9 100644
--- a/code/modules/mining/ore_datum.dm
+++ b/code/modules/mining/ore_datum.dm
@@ -38,7 +38,7 @@ var/global/list/ore_data = list()
xarch_source_mineral = "potassium"
/ore/hematite
- name = "iron"
+ name = "hematite"
display_name = "hematite"
smelts_to = "iron"
alloy = 1
@@ -48,8 +48,8 @@ var/global/list/ore_data = list()
scan_icon = "mineral_common"
/ore/coal
- name = "coal"
- display_name = "carbonaceous rock"
+ name = "carbon"
+ display_name = "raw carbon"
smelts_to = "plastic"
alloy = 1
result_amount = 5
@@ -105,7 +105,7 @@ var/global/list/ore_data = list()
)
/ore/diamond
- name = "diamonds"
+ name = "diamond"
display_name = "diamond"
compresses_to = "diamond"
result_amount = 5
diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm
index caea1ae7a80..7bab6d074cb 100644
--- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm
+++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm
@@ -134,13 +134,20 @@
return
// OBJ CHECK
+ var/cannot_melt
if(isobj(O))
var/obj/I = O
- if(I.unacidable) //So the aliens don't destroy energy fields/singularies/other aliens/etc with their acid.
- src << "You cannot dissolve this object."
- return
- // TURF CHECK
- else if(istype(O, /turf/simulated/wall/r_wall) || istype(O, /turf/simulated/floor/engine))
+ if(I.unacidable)
+ cannot_melt = 1
+ else
+ if(istype(O, /turf/simulated/wall))
+ var/turf/simulated/wall/W = O
+ if(W.material.unmeltable)
+ cannot_melt = 1
+ else if(istype(O, /turf/simulated/floor/engine))
+ cannot_melt = 1
+
+ if(cannot_melt)
src << "You cannot dissolve this object."
return
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
index 8353972ba2d..3d5159bb753 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
@@ -16,10 +16,7 @@
/obj/item/weapon/airlock_electronics,
/obj/item/weapon/module/power_control,
/obj/item/weapon/stock_parts,
- /obj/item/light_fixture_frame,
- /obj/item/apc_frame,
- /obj/item/alarm_frame,
- /obj/item/firealarm_frame,
+ /obj/item/frame,
/obj/item/weapon/table_parts,
/obj/item/weapon/table_parts/rack,
/obj/item/weapon/camera_assembly,
diff --git a/code/modules/mob/living/simple_animal/worm.dm b/code/modules/mob/living/simple_animal/worm.dm
index fe76fa87b44..cb1891360cf 100644
--- a/code/modules/mob/living/simple_animal/worm.dm
+++ b/code/modules/mob/living/simple_animal/worm.dm
@@ -137,10 +137,9 @@
proc/AttemptToEat(var/atom/target)
if(istype(target,/turf/simulated/wall))
- if((!istype(target,/turf/simulated/wall/r_wall) && eatingDuration >= 100) || eatingDuration >= 200) //need 20 ticks to eat an rwall, 10 for a regular one
- var/turf/simulated/wall/wall = target
- wall.ChangeTurf(/turf/simulated/floor)
- new /obj/item/stack/sheet/metal(src, flatPlasmaValue)
+ var/turf/simulated/wall/W = target
+ if((!W.reinf_material && eatingDuration >= 100) || eatingDuration >= 200) //need 20 ticks to eat an rwall, 10 for a regular one
+ W.dismantle_wall()
return 1
else if(istype(target,/atom/movable))
if(istype(target,/mob) || eatingDuration >= 50) //5 ticks to eat stuff like airlocks
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 901b841d169..d76bfe99801 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -9,64 +9,6 @@
#define LIGHT_BROKEN 2
#define LIGHT_BURNED 3
-
-
-/obj/item/light_fixture_frame
- name = "light fixture frame"
- desc = "Used for building lights."
- icon = 'icons/obj/lighting.dmi'
- icon_state = "tube-construct-item"
- flags = CONDUCT
- var/fixture_type = "tube"
- var/obj/machinery/light/newlight = null
- var/sheets_refunded = 2
-
-/obj/item/light_fixture_frame/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (istype(W, /obj/item/weapon/wrench))
- new /obj/item/stack/sheet/metal( get_turf(src.loc), sheets_refunded )
- del(src)
- return
- ..()
-
-/obj/item/light_fixture_frame/proc/try_build(turf/on_wall)
- if (get_dist(on_wall,usr)>1)
- return
- var/ndir = get_dir(usr,on_wall)
- if (!(ndir in cardinal))
- return
- var/turf/loc = get_turf(usr)
- if (!istype(loc, /turf/simulated/floor))
- usr << "\red [src.name] cannot be placed on this spot."
- return
- usr << "Attaching [src] to the wall."
- playsound(src.loc, 'sound/machines/click.ogg', 75, 1)
- var/constrdir = usr.dir
- var/constrloc = usr.loc
- if (!do_after(usr, 30))
- return
- switch(fixture_type)
- if("bulb")
- newlight = new /obj/machinery/light_construct/small(constrloc)
- if("tube")
- newlight = new /obj/machinery/light_construct(constrloc)
- newlight.dir = constrdir
- newlight.fingerprints = src.fingerprints
- newlight.fingerprintshidden = src.fingerprintshidden
- newlight.fingerprintslast = src.fingerprintslast
-
- usr.visible_message("[usr.name] attaches [src] to the wall.", \
- "You attach [src] to the wall.")
- del(src)
-
-/obj/item/light_fixture_frame/small
- name = "small light fixture frame"
- desc = "Used for building small lights."
- icon = 'icons/obj/lighting.dmi'
- icon_state = "bulb-construct-item"
- flags = CONDUCT
- fixture_type = "bulb"
- sheets_refunded = 1
-
/obj/machinery/light_construct
name = "light fixture frame"
desc = "A light fixture under construction."
diff --git a/code/modules/power/rust/fuel_assembly_port_construction.dm b/code/modules/power/rust/fuel_assembly_port_construction.dm
index 092805de789..592a8f917cf 100644
--- a/code/modules/power/rust/fuel_assembly_port_construction.dm
+++ b/code/modules/power/rust/fuel_assembly_port_construction.dm
@@ -1,37 +1,3 @@
-
-//frame assembly
-
-/obj/item/rust_fuel_assembly_port_frame
- name = "Fuel Assembly Port frame"
- icon = 'icons/rust.dmi'
- icon_state = "port2"
- w_class = 4
- flags = CONDUCT
-
-/obj/item/rust_fuel_assembly_port_frame/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (istype(W, /obj/item/weapon/wrench))
- new /obj/item/stack/sheet/plasteel( get_turf(src.loc), 12 )
- del(src)
- return
- ..()
-
-/obj/item/rust_fuel_assembly_port_frame/proc/try_build(turf/on_wall)
- if (get_dist(on_wall,usr)>1)
- return
- var/ndir = get_dir(usr,on_wall)
- if (!(ndir in cardinal))
- return
- var/turf/loc = get_turf(usr)
- var/area/A = loc.loc
- if (!istype(loc, /turf/simulated/floor))
- usr << "\red Port cannot be placed on this spot."
- return
- if (A.requires_power == 0 || A.name == "Space")
- usr << "\red Port cannot be placed in this area."
- return
- new /obj/machinery/rust_fuel_assembly_port(loc, ndir, 1)
- del(src)
-
//construction steps
/obj/machinery/rust_fuel_assembly_port/New(turf/loc, var/ndir, var/building=0)
..()
@@ -122,7 +88,7 @@
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
if(do_after(user, 50))
if(!src || !WT.remove_fuel(3, user)) return
- new /obj/item/rust_fuel_assembly_port_frame(loc)
+ new /obj/item/frame/rust/assembly(loc)
user.visible_message(\
"\red [src] has been cut away from the wall by [user.name].",\
"You detached the port frame.",\
diff --git a/code/modules/power/rust/fuel_compressor_construction.dm b/code/modules/power/rust/fuel_compressor_construction.dm
index c9c3895f2b0..e0001d22cdd 100644
--- a/code/modules/power/rust/fuel_compressor_construction.dm
+++ b/code/modules/power/rust/fuel_compressor_construction.dm
@@ -1,38 +1,3 @@
-
-//frame assembly
-
-/obj/item/rust_fuel_compressor_frame
- name = "Fuel Compressor frame"
- icon = 'icons/rust.dmi'
- icon_state = "fuel_compressor0"
- w_class = 4
- flags = CONDUCT
-
-/obj/item/rust_fuel_compressor_frame/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (istype(W, /obj/item/weapon/wrench))
- new /obj/item/stack/sheet/plasteel( get_turf(src.loc), 12 )
- del(src)
- return
- ..()
-
-/obj/item/rust_fuel_compressor_frame/proc/try_build(turf/on_wall)
- if (get_dist(on_wall,usr)>1)
- return
- var/ndir = get_dir(usr,on_wall)
- if (!(ndir in cardinal))
- return
- var/turf/loc = get_turf(usr)
- var/area/A = loc.loc
- if (!istype(loc, /turf/simulated/floor))
- usr << "\red Compressor cannot be placed on this spot."
- return
- if (A.requires_power == 0 || A.name == "Space")
- usr << "\red Compressor cannot be placed in this area."
- return
- new /obj/machinery/rust_fuel_assembly_port(loc, ndir, 1)
- del(src)
-
-//construction steps
/obj/machinery/rust_fuel_compressor/New(turf/loc, var/ndir, var/building=0)
..()
@@ -149,7 +114,7 @@
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
if(do_after(user, 50))
if(!src || !WT.remove_fuel(3, user)) return
- new /obj/item/rust_fuel_assembly_port_frame(loc)
+ new /obj/item/frame/rust(loc)
user.visible_message(\
"\red [src] has been cut away from the wall by [user.name].",\
"You detached the compressor frame.",\
diff --git a/code/modules/power/singularity/act.dm b/code/modules/power/singularity/act.dm
index 5b0303c9b53..111c6d11d5f 100644
--- a/code/modules/power/singularity/act.dm
+++ b/code/modules/power/singularity/act.dm
@@ -106,18 +106,19 @@
return 2
/turf/simulated/wall/singularity_pull(S, current_size)
- if(current_size >= STAGE_FIVE)
- if(prob(75))
- dismantle_wall()
- return
- if(current_size == STAGE_FOUR)
- if(prob(30))
- dismantle_wall()
-/turf/simulated/wall/r_wall/singularity_pull(S, current_size)
- if(current_size >= STAGE_FIVE)
- if(prob(30))
- dismantle_wall()
+ if(!reinf_material)
+ if(current_size >= STAGE_FIVE)
+ if(prob(75))
+ dismantle_wall()
+ return
+ if(current_size == STAGE_FOUR)
+ if(prob(30))
+ dismantle_wall()
+ else
+ if(current_size >= STAGE_FIVE)
+ if(prob(30))
+ dismantle_wall()
/turf/space/singularity_act()
return
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 977c9e26f49..c3baa862c5d 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -8,7 +8,7 @@
embed = 1
sharp = 1
var/mob_passthrough_check = 0
-
+
muzzle_type = /obj/effect/projectile/bullet/muzzle
/obj/item/projectile/bullet/on_hit(var/atom/target, var/blocked = 0)
@@ -38,19 +38,19 @@
if(ismob(A))
if(!mob_passthrough_check)
return 0
- if(iscarbon(A))
- damage *= 0.7 //squishy mobs absorb KE
+ if(iscarbon(A))
+ damage *= 0.7 //squishy mobs absorb KE
return 1
var/chance = 0
if(istype(A, /turf/simulated/wall))
var/turf/simulated/wall/W = A
- chance = round(damage/W.damage_cap*180)
+ chance = round(damage/W.material.integrity*180)
else if(istype(A, /obj/machinery/door))
var/obj/machinery/door/D = A
chance = round(damage/D.maxhealth*180)
if(D.glass) chance *= 2
- else if(istype(A, /obj/structure/girder) || istype(A, /obj/structure/cultgirder))
+ else if(istype(A, /obj/structure/girder))
chance = 100
else if(istype(A, /obj/machinery) || istype(A, /obj/structure))
chance = 25
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index 44ee2987c42..490516ccb92 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -1845,12 +1845,10 @@ datum
reaction_turf(var/turf/T, var/volume)
if(istype(T, /turf/simulated/wall))
var/turf/simulated/wall/W = T
- if(W.rotting)
- W.rotting = 0
- for(var/obj/effect/E in W) if(E.name == "Wallrot") del E
-
- for(var/mob/O in viewers(W, null))
- O.show_message(text("\blue The fungi are completely dissolved by the solution!"), 1)
+ if(locate(/obj/effect/overlay/wallrot) in W)
+ for(var/obj/effect/overlay/wallrot/E in W)
+ del(E)
+ W.visible_message("The fungi are completely dissolved by the solution!")
reaction_obj(var/obj/O, var/volume)
if(istype(O,/obj/effect/alien/weeds/))
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index d842b52edc2..b6a46a5f87c 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -438,11 +438,11 @@ won't update every console in existence) but it's more of a hassle to do. Also,
else if(href_list["lathe_ejectsheet"] && linked_lathe) //Causes the protolathe to eject a sheet of material
var/desired_num_sheets = text2num(href_list["amount"])
var/res_amount, type
- var/material/M = name_to_mineral[href_list["lathe_ejectsheet"]]
+ var/material/M = name_to_material[href_list["lathe_ejectsheet"]]
if(istype(M))
type = M.stack_type
- switch(name_to_mineral[href_list["lathe_ejectsheet"]])
+ switch(name_to_material[href_list["lathe_ejectsheet"]])
if("steel")
res_amount = "m_amount"
if("glass")
diff --git a/code/setup.dm b/code/setup.dm
index 38836d54d52..f82ded20413 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -917,3 +917,6 @@ var/list/be_special_flags = list(
#define STAGE_FOUR 7
#define STAGE_FIVE 9
#define STAGE_SUPER 11
+
+#define WALL_CAN_OPEN 1
+#define WALL_OPENING 2
\ No newline at end of file
diff --git a/code/world.dm b/code/world.dm
index 01c6b0d1c5e..5dbe389f31d 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -55,6 +55,9 @@ var/global/datum/global_init/init = new ()
// Set up roundstart seed list.
plant_controller = new()
+ // This is kinda important. Set up details of what the hell things are made of.
+ populate_material_list()
+
//Create the asteroid Z-level.
if(config.generate_asteroid)
new /datum/random_map(null,13,32,5,217,223)
diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi
index 5c0200528c51f7c6cd410ef3ff0b7bc50e3f0e56..213946eb68bfd0e86ad22f385ae015f917a46a88 100644
GIT binary patch
delta 525
zcmV+o0`mR$pabuq1CS(t>UvaIbVOxyV{&P5bZKvH004NLrItaD+At7>&&jW_cCS$d
zEL6SZQh`<+mdhUYXgSW1jN*8ru>+;Qz6V%9t*8g~mPp@w9#6*4c~(DHuj`FkzOC~e
za6s~^RP%3>JlkU(TUDx;S)R3kO&gCdA({xPR8PS~+k$(_vl=;ns8UVyY|EyHU|
z9bFo%VQ_S?Y+||*Z1BqP$8AWXkH7(JMDq75^yYo_fa-nq@z7cisRU~^*qEBpIo;Fl
z{*gG#lcOh@bUiqK6VZ>o2)2&)>478$U8CvA*CMuYCIlHtPG*TrvN|mZP7N{W_E0l5
zAafmBk`@rq?SPYLaHbLYjchy$KIba~c;&`^5bntQ7VIdr05NzIZ7bN6zFmQgEJ*XsEZ&G@6E66MPkaIg4UZEQ-ZNeE{cZ{{@4F
z0sI&Ar}C5AycC*5&n2aMN466mD<<2?(uc`*vOr_9T_R9tm*#z+9B+)`pNGF3g~`KY
zJ87UDS?P_!WII^^_vnF*)0X;PP{t=d`a1<|_~!4P3-^x
PAOJ~3K~#9NC<0H;FNOeY
delta 525
zcmV+o0`mRupab`y1CS(t@_JNQbVOxyV{&P5bZKvH004NLrIo>s+At7?&*Ukr-D^|<
z3so<?P`(MqW5(K61EjN*8ru>(t=z6U6vR;&m1=1AW^o*B>lc~;-&i{(nqUYFSp
zI3RgdsL7XMHrQhsYgMS1aW<#{t2!P(LNpOnp`LJ9p29vk$!GaS*RTd+Z|
zx4lb)C3KDsmQ74If(>2;{B|4C=p%3d8KFz23^rAk1bF}|NfQkY9
zC-kTElVx5KO`_+N(!C?w=%2#1VzP~1N|v9=HhLlPF(%vS*@r$lzBKRa@c5(1|2zB>
zaV>KmCfn#YnV}t7>5qiTHu{IecU$zp#%W7!D@fxn-upWRY;GI;vzo7FYWBL!{s8KX
P8ctCznHd1H7y?($P80zK
diff --git a/icons/turf/wall_masks.dmi b/icons/turf/wall_masks.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..a6d21453ace5c2ffe0d2aaf0d4efc769cfced32e
GIT binary patch
literal 20703
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%0A5B|iE;!sECh&)Cs@ZZFCJ&!g%^m^jeZzq(UxxS
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%0D$
z)m%5MCB?=I6}g;>O>KSsW_`Ytufj=ekjJid8J^U>*I4hny1drF(5ncws(;kL9%)>a
l!t}ShU8hUJj|LplP}>fWp$K--a5Ksu8U^e
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 | | |