diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm
index b1f9e2ff159..653d4e6167b 100644
--- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm
+++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm
@@ -86,3 +86,6 @@
/// generally called before temporary non-parallel animate()s on the atom (animation_duration)
#define COMSIG_ATOM_TEMPORARY_ANIMATION_START "atom_temp_animate_start"
+
+/// from internal loop in /atom/proc/propagate_radiation_pulse: (atom/pulse_source)
+#define COMSIG_ATOM_PROPAGATE_RAD_PULSE "atom_propagate_radiation_pulse"
diff --git a/code/__HELPERS/radiation.dm b/code/__HELPERS/radiation.dm
index 8c527ff8377..477cbbd197d 100644
--- a/code/__HELPERS/radiation.dm
+++ b/code/__HELPERS/radiation.dm
@@ -62,5 +62,11 @@
else
return PERCEIVED_RADIATION_DANGER_LOW
+/// A common proc used to send COMSIG_ATOM_PROPAGATE_RAD_PULSE to adjacent atoms
+/// Only used for uranium (false/tram)walls to spread their radiation pulses
+/atom/proc/propagate_radiation_pulse()
+ for(var/atom/atom in orange(1,src))
+ SEND_SIGNAL(atom, COMSIG_ATOM_PROPAGATE_RAD_PULSE, src)
+
#undef MEDIUM_RADIATION_THRESHOLD_RANGE
#undef EXTREME_RADIATION_CHANCE
diff --git a/code/controllers/subsystem/materials.dm b/code/controllers/subsystem/materials.dm
index 244ba96fde9..99a7025e2f9 100644
--- a/code/controllers/subsystem/materials.dm
+++ b/code/controllers/subsystem/materials.dm
@@ -26,6 +26,7 @@ SUBSYSTEM_DEF(materials)
new /datum/stack_recipe("Toilet", /obj/structure/toilet/greyscale, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE),
new /datum/stack_recipe("Sink Frame", /obj/structure/sinkframe, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE),
new /datum/stack_recipe("Material floor tile", /obj/item/stack/tile/material, 1, 4, 20, applies_mats = TRUE),
+ new /datum/stack_recipe("Material airlock assembly", /obj/structure/door_assembly/door_assembly_material, 4, time = 50, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE),
)
///List of stackcrafting recipes for materials using rigid recipes
var/list/rigid_stack_recipes = list(
diff --git a/code/datums/greyscale/config_types/greyscale_configs.dm b/code/datums/greyscale/config_types/greyscale_configs.dm
index 88979895259..a217ca104e2 100644
--- a/code/datums/greyscale/config_types/greyscale_configs.dm
+++ b/code/datums/greyscale/config_types/greyscale_configs.dm
@@ -512,3 +512,8 @@
name = "Worn Skull Bandana Up"
icon_file = 'icons/mob/clothing/mask.dmi'
json_config = 'code/datums/greyscale/json_configs/bandskull_worn_up.json'
+
+/datum/greyscale_config/material_airlock
+ name = "Material Airlock"
+ icon_file = 'icons/obj/doors/airlocks/material/material.dmi'
+ json_config = 'code/datums/greyscale/json_configs/material_airlock.json'
diff --git a/code/datums/greyscale/json_configs/material_airlock.json b/code/datums/greyscale/json_configs/material_airlock.json
new file mode 100644
index 00000000000..12934c4946d
--- /dev/null
+++ b/code/datums/greyscale/json_configs/material_airlock.json
@@ -0,0 +1,114 @@
+{
+ "closed": [
+ {
+ "type": "icon_state",
+ "icon_state": "base_closed",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "frame_closed",
+ "blend_mode": "overlay"
+ }
+ ],
+ "open": [
+ {
+ "type": "icon_state",
+ "icon_state": "base_open",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "frame_open",
+ "blend_mode": "overlay"
+ }
+ ],
+ "opening": [
+ {
+ "type": "icon_state",
+ "icon_state": "base_opening",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "frame_opening",
+ "blend_mode": "overlay"
+ }
+ ],
+ "closing": [
+ {
+ "type": "icon_state",
+ "icon_state": "base_closing",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "frame_closing",
+ "blend_mode": "overlay"
+ }
+ ],
+ "construction": [
+ {
+ "type": "icon_state",
+ "icon_state": "base_construction",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "frame_construction",
+ "blend_mode": "overlay"
+ }
+ ],
+ "fill_closed": [
+ {
+ "type": "icon_state",
+ "icon_state": "fill_closed",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ }
+ ],
+ "fill_open": [
+ {
+ "type": "icon_state",
+ "icon_state": "fill_open",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ }
+ ],
+ "fill_opening": [
+ {
+ "type": "icon_state",
+ "icon_state": "fill_opening",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ }
+ ],
+ "fill_closing": [
+ {
+ "type": "icon_state",
+ "icon_state": "fill_closing",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ }
+ ],
+ "fill_construction": [
+ {
+ "type": "icon_state",
+ "icon_state": "fill_construction",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ }
+ ],
+ "" : [
+ {
+ "type": "icon_state",
+ "icon_state": "fill_open",
+ "blend_mode": "overlay"
+ }
+ ]
+}
diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm
index 7eed429ad3d..8f84ea199e3 100644
--- a/code/datums/materials/_material.dm
+++ b/code/datums/materials/_material.dm
@@ -92,6 +92,8 @@ Simple datum which is instanced once per type and is used for every object of sa
else if(istype(source, /turf)) //turfs
on_applied_turf(source, amount, material_flags)
+ source.update_appearance()
+
source.mat_update_desc(src)
///This proc is called when a material updates an object's description
diff --git a/code/datums/materials/alloys.dm b/code/datums/materials/alloys.dm
index f92df020843..b656edf2002 100644
--- a/code/datums/materials/alloys.dm
+++ b/code/datums/materials/alloys.dm
@@ -82,7 +82,7 @@
name = "plasmaglass"
desc = "Plasma-infused silicate. It is much more durable and heat resistant than either of its component materials."
color = "#ff80f4"
- greyscale_colors = "#ff80f4"
+ greyscale_colors = "#ff80f496"
alpha = 150
init_flags = MATERIAL_INIT_MAPLOAD
integrity_modifier = 0.5
@@ -101,7 +101,7 @@
name = "titanium glass"
desc = "A specialized silicate-titanium alloy that is commonly used in shuttle windows."
color = "#cfbee0"
- greyscale_colors = "#cfbee0"
+ greyscale_colors = "#cfbee096"
alpha = 150
init_flags = MATERIAL_INIT_MAPLOAD
armor_modifiers = list(MELEE = 1.2, BULLET = 1.2, LASER = 0.8, ENERGY = 0.8, BOMB = 0.5, BIO = 1.2, FIRE = 0.8, ACID = 2)
@@ -119,7 +119,7 @@
name = "plastitanium glass"
desc = "A specialized silicate-plastitanium alloy."
color = "#5d3369"
- greyscale_colors = "#5d3369"
+ greyscale_colors = "#5d336996"
alpha = 150
init_flags = MATERIAL_INIT_MAPLOAD
integrity_modifier = 1.1
diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm
index c16526aface..6526d4e1ff1 100644
--- a/code/datums/materials/basemats.dm
+++ b/code/datums/materials/basemats.dm
@@ -17,7 +17,7 @@
name = "glass"
desc = "Glass forged by melting sand."
color = "#88cdf1"
- greyscale_colors = "#88cdf1"
+ greyscale_colors = "#88cdf196"
alpha = 150
categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE)
integrity_modifier = 0.1
@@ -73,7 +73,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
name = "diamond"
desc = "Highly pressurized carbon"
color = list(48/255, 272/255, 301/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0)
- greyscale_colors = "#71c8f7"
+ greyscale_colors = "#71c8f784"
categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE)
sheet_type = /obj/item/stack/sheet/mineral/diamond
alpha = 132
@@ -157,7 +157,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
name = "bluespace crystal"
desc = "Crystals with bluespace properties"
color = list(119/255, 217/255, 396/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0)
- greyscale_colors = "#4e7dff"
+ greyscale_colors = "#4e7dffC8"
alpha = 200
categories = list(MAT_CATEGORY_ORE = TRUE)
beauty_modifier = 0.5
@@ -337,9 +337,9 @@ Unless you know what you're doing, only use the first three numbers. They're in
name = "hot ice"
desc = "A weird kind of ice, feels warm to the touch"
color = "#88cdf1"
- greyscale_colors = "#88cdf1"
+ greyscale_colors = "#88cdf196"
alpha = 150
- categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE)
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE)
sheet_type = /obj/item/stack/sheet/hot_ice
value_per_unit = 0.2
beauty_modifier = 0.2
@@ -361,9 +361,9 @@ Unless you know what you're doing, only use the first three numbers. They're in
name = "Metal Hydrogen"
desc = "Solid metallic hydrogen. Some say it should be impossible"
color = "#f2d5d7"
- greyscale_colors = "#f2d5d7"
+ greyscale_colors = "#f2d5d796"
alpha = 150
- categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE)
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE)
sheet_type = /obj/item/stack/sheet/mineral/metal_hydrogen
value_per_unit = 0.35
beauty_modifier = 0.35
@@ -400,7 +400,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
desc = "Bialtaakid 'ant taerif ma hdha."
color = "#B77D31"
greyscale_colors = "#B77D31"
- categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE)
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE)
sheet_type = /obj/item/stack/sheet/mineral/sandstone
value_per_unit = 0.0025
armor_modifiers = list(MELEE = 0.5, BULLET = 0.5, LASER = 1.25, ENERGY = 0.5, BOMB = 0.5, BIO = 0.25, FIRE = 1.5, ACID = 1.5)
@@ -430,7 +430,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
desc = "Mir'ntrath barhah Nar'sie."
color = "#3C3434"
greyscale_colors = "#3C3434"
- categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE)
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE)
sheet_type = /obj/item/stack/sheet/runed_metal
value_per_unit = 0.75
armor_modifiers = list(MELEE = 1.2, BULLET = 1.2, LASER = 1, ENERGY = 1, BOMB = 1.2, BIO = 1.2, FIRE = 1.5, ACID = 1.5)
@@ -447,7 +447,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
desc = "Clock Cult? Never heard of it."
color = "#92661A"
greyscale_colors = "#92661A"
- categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE)
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE)
sheet_type = /obj/item/stack/sheet/bronze
value_per_unit = 0.025
armor_modifiers = list(MELEE = 1, BULLET = 1, LASER = 1, ENERGY = 1, BOMB = 1, BIO = 1, FIRE = 1.5, ACID = 1.5)
@@ -458,7 +458,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
desc = "Ten thousand folds of pure starchy power."
color = "#E5DCD5"
greyscale_colors = "#E5DCD5"
- categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE)
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE)
sheet_type = /obj/item/stack/sheet/paperframes
value_per_unit = 0.0025
armor_modifiers = list(MELEE = 0.1, BULLET = 0.1, LASER = 0.1, ENERGY = 0.1, BOMB = 0.1, BIO = 0.1, FIRE = 0, ACID = 1.5)
@@ -484,7 +484,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
desc = "They say cardboard is used by hobos to make incredible things."
color = "#5F625C"
greyscale_colors = "#5F625C"
- categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE)
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE)
sheet_type = /obj/item/stack/sheet/cardboard
value_per_unit = 0.003
armor_modifiers = list(MELEE = 0.25, BULLET = 0.25, LASER = 0.25, ENERGY = 0.25, BOMB = 0.25, BIO = 0.25, FIRE = 0, ACID = 1.5)
@@ -508,7 +508,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
desc = "Man, building with this will make you the coolest caveman on the block."
color = "#e3dac9"
greyscale_colors = "#e3dac9"
- categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE)
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE)
sheet_type = /obj/item/stack/sheet/bone
value_per_unit = 0.05
armor_modifiers = list(MELEE = 1.2, BULLET = 0.75, LASER = 0.75, ENERGY = 1.2, BOMB = 1, BIO = 1, FIRE = 1.5, ACID = 1.5)
@@ -519,7 +519,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
desc = "If it's good enough for pandas, it's good enough for you."
color = "#87a852"
greyscale_colors = "#87a852"
- categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE)
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE)
sheet_type = /obj/item/stack/sheet/mineral/bamboo
value_per_unit = 0.0025
armor_modifiers = list(MELEE = 0.5, BULLET = 0.5, LASER = 0.5, ENERGY = 0.5, BOMB = 0.5, BIO = 0.51, FIRE = 0.5, ACID = 1.5)
@@ -532,7 +532,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
desc = "A light absorbing crystal"
color = COLOR_ALMOST_BLACK
greyscale_colors = COLOR_ALMOST_BLACK
- categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE)
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE)
sheet_type = /obj/item/stack/sheet/mineral/zaukerite
value_per_unit = 0.45
armor_modifiers = list(MELEE = 0.9, BULLET = 0.9, LASER = 1.75, ENERGY = 1.75, BOMB = 0.5, BIO = 1, FIRE = 0.1, ACID = 1)
diff --git a/code/datums/materials/hauntium.dm b/code/datums/materials/hauntium.dm
index 431b96f188d..f00d1c73e6d 100644
--- a/code/datums/materials/hauntium.dm
+++ b/code/datums/materials/hauntium.dm
@@ -2,9 +2,9 @@
name = "hauntium"
desc = "very scary!"
color = list(460/255, 464/255, 460/255, 0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0)
- greyscale_colors = "#FFFFFF"
+ greyscale_colors = "#FFFFFF64"
alpha = 100
- categories = list(MAT_CATEGORY_ITEM_MATERIAL=TRUE)
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE)
sheet_type = /obj/item/stack/sheet/hauntium
value_per_unit = 0.05
beauty_modifier = 0.25
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 9aed2c3ebbf..ab3b34c3e8e 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -1360,6 +1360,15 @@
if(atom_integrity < (0.75 * max_integrity))
update_appearance()
+/obj/machinery/door/airlock/proc/prepare_deconstruction_assembly(obj/structure/door_assembly/assembly)
+ assembly.heat_proof_finished = heat_proof //tracks whether there's rglass in
+ assembly.set_anchored(TRUE)
+ assembly.glass = glass
+ assembly.state = AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS
+ assembly.created_name = name
+ assembly.previous_assembly = previous_airlock
+ assembly.update_name()
+ assembly.update_appearance()
/obj/machinery/door/airlock/deconstruct(disassembled = TRUE, mob/user)
if(!(flags_1 & NODECONSTRUCT_1))
@@ -1369,14 +1378,7 @@
else
A = new /obj/structure/door_assembly(loc)
//If you come across a null assemblytype, it will produce the default assembly instead of disintegrating.
- A.heat_proof_finished = heat_proof //tracks whether there's rglass in
- A.set_anchored(TRUE)
- A.glass = glass
- A.state = AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS
- A.created_name = name
- A.previous_assembly = previous_airlock
- A.update_name()
- A.update_appearance()
+ prepare_deconstruction_assembly(A)
if(!disassembled)
A?.update_integrity(A.max_integrity * 0.5)
diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm
index 7c352c3a91d..42e4bcf23db 100644
--- a/code/game/machinery/doors/airlock_types.dm
+++ b/code/game/machinery/doors/airlock_types.dm
@@ -593,6 +593,34 @@
damage_deflection = 5
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0)
+
+//////////////////////////////////
+/*
+ Material Airlocks
+*/
+/obj/machinery/door/airlock/material
+ name = "airlock"
+ material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_GREYSCALE | MATERIAL_AFFECT_STATISTICS
+ greyscale_config = /datum/greyscale_config/material_airlock
+ assemblytype = /obj/structure/door_assembly/door_assembly_material
+
+/obj/machinery/door/airlock/material/close(forced, force_crush)
+ . = ..()
+ if(!.)
+ return
+ for(var/datum/material/mat in custom_materials)
+ if(mat.alpha < 255)
+ set_opacity(FALSE)
+ break
+
+/obj/machinery/door/airlock/material/prepare_deconstruction_assembly(obj/structure/door_assembly/assembly)
+ assembly.set_custom_materials(custom_materials)
+ ..()
+
+/obj/machinery/door/airlock/material/glass
+ opacity = FALSE
+ glass = TRUE
+
//////////////////////////////////
/*
Misc Airlocks
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index 66372fcc4eb..3852db9239e 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -281,7 +281,6 @@ GLOBAL_LIST_INIT(bananium_recipes, list ( \
merge_type = /obj/item/stack/sheet/mineral/titanium
material_type = /datum/material/titanium
walltype = /turf/closed/wall/mineral/titanium
- tram_wall_type = /obj/structure/tramwall/titanium
GLOBAL_LIST_INIT(titanium_recipes, list ( \
new/datum/stack_recipe("titanium tile", /obj/item/stack/tile/mineral/titanium, 1, 4, 20), \
@@ -315,7 +314,6 @@ GLOBAL_LIST_INIT(titanium_recipes, list ( \
merge_type = /obj/item/stack/sheet/mineral/plastitanium
material_flags = NONE
walltype = /turf/closed/wall/mineral/plastitanium
- tram_wall_type = /obj/structure/tramwall/plastitanium
GLOBAL_LIST_INIT(plastitanium_recipes, list ( \
new/datum/stack_recipe("plastitanium tile", /obj/item/stack/tile/mineral/plastitanium, 1, 4, 20), \
@@ -483,6 +481,7 @@ GLOBAL_LIST_INIT(metalhydrogen_recipes, list(
resistance_flags = FIRE_PROOF | LAVA_PROOF | ACID_PROOF | INDESTRUCTIBLE
point_value = 100
mats_per_unit = list(/datum/material/metalhydrogen = MINERAL_MATERIAL_AMOUNT)
+ material_type = /datum/material/metalhydrogen
merge_type = /obj/item/stack/sheet/mineral/metal_hydrogen
/obj/item/stack/sheet/mineral/metal_hydrogen/get_main_recipes()
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 4ec51231657..485423f381f 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -143,7 +143,6 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
matter_amount = 4
cost = 500
source = /datum/robot_energy_storage/iron
- tram_wall_type = /obj/structure/tramwall
/obj/item/stack/sheet/iron/examine(mob/user)
. = ..()
diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm
index 99a26832268..9bf0591c74a 100644
--- a/code/game/objects/items/stacks/sheets/sheets.dm
+++ b/code/game/objects/items/stacks/sheets/sheets.dm
@@ -16,7 +16,6 @@
var/point_value = 0 //turn-in value for the gulag stacker - loosely relative to its rarity.
///What type of wall does this sheet spawn
var/walltype
- var/tram_wall_type
/obj/item/stack/sheet/Initialize(mapload, new_amount, merge = TRUE, list/mat_override=null, mat_amt=1)
. = ..()
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index 319e15c171f..2f51da90514 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -17,6 +17,7 @@
var/heat_proof_finished = 0 //whether to heat-proof the finished airlock
var/previous_assembly = /obj/structure/door_assembly
var/noglass = FALSE //airlocks with no glass version, also cannot be modified with sheets
+ var/nomineral = FALSE //airlock with glass version, but cannot be modified with sheets
var/material_type = /obj/item/stack/sheet/iron
var/material_amt = 4
@@ -40,11 +41,11 @@
. += span_notice("The maintenance panel is wired, but the circuit slot is empty.")
if(AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER)
. += span_notice("The circuit is connected loosely to its slot, but the maintenance panel is unscrewed and open.")
- if(!mineral && !glass && !noglass)
+ if(!mineral && !nomineral && !glass && !noglass)
. += span_notice("There is a small paper placard on the assembly[doorname]. There are empty slots for glass windows and mineral covers.")
- else if(!mineral && glass && !noglass)
+ else if(!mineral && !nomineral && glass && !noglass)
. += span_notice("There is a small paper placard on the assembly[doorname]. There are empty slots for mineral covers.")
- else if(mineral && !glass && !noglass)
+ else if(!glass && !noglass)
. += span_notice("There is a small paper placard on the assembly[doorname]. There are empty slots for glass windows.")
else
. += span_notice("There is a small paper placard on the assembly[doorname].")
@@ -202,7 +203,7 @@
name = "near finished window airlock assembly"
G.use(1)
glass = TRUE
- if(!mineral)
+ if(!nomineral && !mineral)
if(istype(G, /obj/item/stack/sheet/mineral) && G.sheettype)
var/M = G.sheettype
var/mineralassembly = text2path("/obj/structure/door_assembly/door_assembly_[M]")
@@ -245,39 +246,43 @@
if(W.use_tool(src, user, 40, volume=100))
if(loc && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER)
to_chat(user, span_notice("You finish the airlock."))
- var/obj/machinery/door/airlock/door
- if(glass)
- door = new glass_type( loc )
- else
- door = new airlock_type( loc )
- door.setDir(dir)
- door.unres_sides = electronics.unres_sides
- //door.req_access = req_access
- door.electronics = electronics
- door.heat_proof = heat_proof_finished
- door.security_level = 0
- if(electronics.one_access)
- door.req_one_access = electronics.accesses
- else
- door.req_access = electronics.accesses
- if(created_name)
- door.name = created_name
- else if(electronics.passed_name)
- door.name = sanitize(electronics.passed_name)
- else
- door.name = base_name
- if(electronics.passed_cycle_id)
- door.closeOtherId = electronics.passed_cycle_id
- door.update_other_id()
- door.previous_airlock = previous_assembly
- electronics.forceMove(door)
- door.update_appearance()
- qdel(src)
+ finish_door()
else
return ..()
update_name()
update_appearance()
+/obj/structure/door_assembly/proc/finish_door()
+ var/obj/machinery/door/airlock/door
+ if(glass)
+ door = new glass_type( loc )
+ else
+ door = new airlock_type( loc )
+ door.setDir(dir)
+ door.unres_sides = electronics.unres_sides
+ //door.req_access = req_access
+ door.electronics = electronics
+ door.heat_proof = heat_proof_finished
+ door.security_level = 0
+ if(electronics.one_access)
+ door.req_one_access = electronics.accesses
+ else
+ door.req_access = electronics.accesses
+ if(created_name)
+ door.name = created_name
+ else if(electronics.passed_name)
+ door.name = sanitize(electronics.passed_name)
+ else
+ door.name = base_name
+ if(electronics.passed_cycle_id)
+ door.closeOtherId = electronics.passed_cycle_id
+ door.update_other_id()
+ door.previous_airlock = previous_assembly
+ electronics.forceMove(door)
+ door.update_appearance()
+ qdel(src)
+ return door
+
/obj/structure/door_assembly/update_overlays()
. = ..()
if(!glass)
diff --git a/code/game/objects/structures/door_assembly_types.dm b/code/game/objects/structures/door_assembly_types.dm
index 859d7584a2e..8566891b4fb 100644
--- a/code/game/objects/structures/door_assembly_types.dm
+++ b/code/game/objects/structures/door_assembly_types.dm
@@ -258,3 +258,35 @@
/obj/structure/door_assembly/door_assembly_bronze/seethru
airlock_type = /obj/machinery/door/airlock/bronze/seethru
+
+/obj/structure/door_assembly/door_assembly_material
+ name = "airlock assembly"
+ airlock_type = /obj/machinery/door/airlock/material
+ glass_type = /obj/machinery/door/airlock/material/glass
+ greyscale_config = /datum/greyscale_config/material_airlock
+ nomineral = TRUE
+ material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_GREYSCALE | MATERIAL_AFFECT_STATISTICS
+
+/obj/structure/door_assembly/door_assembly_material/deconstruct(disassembled = TRUE)
+ if(!(flags_1 & NODECONSTRUCT_1))
+ var/turf/T = get_turf(src)
+ for(var/material in custom_materials)
+ var/datum/material/material_datum = material
+ var/material_count = FLOOR(custom_materials[material_datum] / MINERAL_MATERIAL_AMOUNT, 1)
+ if(!disassembled)
+ material_count = rand(FLOOR(material_count/2, 1), material_count)
+ new material_datum.sheet_type(T, material_count)
+ if(glass)
+ if(disassembled)
+ if(heat_proof_finished)
+ new /obj/item/stack/sheet/rglass(T)
+ else
+ new /obj/item/stack/sheet/glass(T)
+ else
+ new /obj/item/shard(T)
+ qdel(src)
+
+/obj/structure/door_assembly/door_assembly_material/finish_door()
+ var/obj/machinery/door/airlock/door = ..()
+ door.set_custom_materials(custom_materials)
+ return door
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index 2cac5b155ae..3cd80f84400 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -179,34 +179,42 @@
smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_URANIUM_WALLS)
canSmoothWith = list(SMOOTH_GROUP_URANIUM_WALLS)
+
+ /// Mutex to prevent infinite recursion when propagating radiation pulses
var/active = null
+
+ /// The last time a radiation pulse was performed
var/last_event = 0
+/obj/structure/falsewall/uranium/Initialize(mapload)
+ . = ..()
+ RegisterSignal(src, COMSIG_ATOM_PROPAGATE_RAD_PULSE, .proc/radiate)
+
/obj/structure/falsewall/uranium/attackby(obj/item/W, mob/user, params)
radiate()
return ..()
/obj/structure/falsewall/uranium/attack_hand(mob/user, list/modifiers)
radiate()
- . = ..()
+ return ..()
/obj/structure/falsewall/uranium/proc/radiate()
- if(!active)
- if(world.time > last_event+15)
- active = 1
- radiation_pulse(
- src,
- max_range = 2,
- threshold = RAD_LIGHT_INSULATION,
- chance = URANIUM_IRRADIATION_CHANCE,
- minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME,
- )
- for(var/turf/closed/wall/mineral/uranium/T in orange(1,src))
- T.radiate()
- last_event = world.time
- active = null
- return
- return
+ SIGNAL_HANDLER
+ if(active)
+ return
+ if(world.time <= last_event + 1.5 SECONDS)
+ return
+ active = TRUE
+ radiation_pulse(
+ src,
+ max_range = 3,
+ threshold = RAD_LIGHT_INSULATION,
+ chance = URANIUM_IRRADIATION_CHANCE,
+ minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME,
+ )
+ propagate_radiation_pulse()
+ last_event = world.time
+ active = FALSE
/*
* Other misc falsewall types
*/
@@ -357,3 +365,66 @@
smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_PLASTITANIUM_WALLS)
canSmoothWith = list(SMOOTH_GROUP_PLASTITANIUM_WALLS, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTLE_PARTS)
+
+/obj/structure/falsewall/material
+ name = "wall"
+ desc = "A huge chunk of material used to separate rooms."
+ icon = 'icons/turf/walls/materialwall.dmi'
+ icon_state = "materialwall-0"
+ base_icon_state = "materialwall"
+ walltype = /turf/closed/wall/material
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_MATERIAL_WALLS)
+ canSmoothWith = list(SMOOTH_GROUP_MATERIAL_WALLS)
+ material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
+
+/obj/structure/falsewall/material/deconstruct(disassembled = TRUE)
+ if(!(flags_1 & NODECONSTRUCT_1))
+ if(disassembled)
+ new girder_type(loc)
+ for(var/material in custom_materials)
+ var/datum/material/material_datum = material
+ new material_datum.sheet_type(loc, FLOOR(custom_materials[material_datum] / MINERAL_MATERIAL_AMOUNT, 1))
+ qdel(src)
+
+/obj/structure/falsewall/material/mat_update_desc(mat)
+ desc = "A huge chunk of [mat] used to separate rooms."
+
+/obj/structure/falsewall/material/toggle_open()
+ if(!QDELETED(src))
+ set_density(!density)
+ var/mat_opacity = TRUE
+ for(var/datum/material/mat in custom_materials)
+ if(mat.alpha < 255)
+ mat_opacity = FALSE
+ break
+ set_opacity(density && mat_opacity)
+ opening = FALSE
+ update_appearance()
+ air_update_turf(TRUE, !density)
+
+/obj/structure/falsewall/material/ChangeToWall(delete = 1)
+ var/turf/current_turf = get_turf(src)
+ var/turf/closed/wall/material/new_wall = current_turf.PlaceOnTop(/turf/closed/wall/material)
+ new_wall.set_custom_materials(custom_materials)
+ if(delete)
+ qdel(src)
+ return current_turf
+
+/obj/structure/falsewall/material/update_icon(updates)
+ . = ..()
+ for(var/datum/material/mat in custom_materials)
+ if(mat.alpha < 255)
+ update_transparency_underlays()
+ return
+
+/obj/structure/falsewall/material/proc/update_transparency_underlays()
+ underlays.Cut()
+ var/girder_icon_state = "displaced"
+ if(opening)
+ girder_icon_state += "_[density ? "opening" : "closing"]"
+ else if(!density)
+ girder_icon_state += "_open"
+ var/mutable_appearance/girder_underlay = mutable_appearance('icons/obj/structures.dmi', girder_icon_state, layer = LOW_OBJ_LAYER-0.01)
+ girder_underlay.appearance_flags = RESET_ALPHA | RESET_COLOR
+ underlays += girder_underlay
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index a5641e47fff..e69b6e77231 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -129,7 +129,7 @@
if(sheets.get_amount() < amount)
return
sheets.use(2)
- var/obj/structure/tramwall/tram_wall = new sheets.tram_wall_type(loc)
+ var/obj/structure/tramwall/tram_wall = new(loc)
transfer_fingerprints_to(tram_wall)
qdel(src)
return
@@ -199,9 +199,6 @@
var/M = sheets.sheettype
var/amount = construction_cost["exotic_material"]
if(state == GIRDER_TRAM)
- if(!sheets.tram_wall_type)
- balloon_alert(user, "need titanium, plastitanium, or iron!")
- return
if(sheets.get_amount() < amount)
balloon_alert(user, "need [amount] sheets!")
return
@@ -210,15 +207,22 @@
if(sheets.get_amount() < amount)
return
sheets.use(amount)
- var/obj/structure/tramwall/tram_wall = new sheets.tram_wall_type(loc)
+ var/obj/structure/tramwall/tram_wall
+ var/tram_wall_type = text2path("/obj/structure/tramwall/[M]")
+ if(tram_wall_type)
+ tram_wall = new tram_wall_type(loc)
+ else
+ var/obj/structure/tramwall/material/mat_tram_wall = new(loc)
+ var/list/material_list = list()
+ material_list[GET_MATERIAL_REF(sheets.material_type)] = MINERAL_MATERIAL_AMOUNT * 2
+ if(material_list)
+ mat_tram_wall.set_custom_materials(material_list)
+ tram_wall = mat_tram_wall
transfer_fingerprints_to(tram_wall)
qdel(src)
return
if(state == GIRDER_DISPLACED)
var/falsewall_type = text2path("/obj/structure/falsewall/[M]")
- if(!falsewall_type)
- balloon_alert(user, "need comptatiable sheets!")
- return
if(sheets.get_amount() < amount)
balloon_alert(user, "need [amount] sheets!")
return
@@ -227,8 +231,17 @@
if(sheets.get_amount() < amount)
return
sheets.use(amount)
- var/obj/structure/falsewall/FW = new falsewall_type (loc)
- transfer_fingerprints_to(FW)
+ var/obj/structure/falsewall/falsewall
+ if(falsewall_type)
+ falsewall = new falsewall_type (loc)
+ else
+ var/obj/structure/falsewall/material/mat_falsewall = new(loc)
+ var/list/material_list = list()
+ material_list[GET_MATERIAL_REF(sheets.material_type)] = MINERAL_MATERIAL_AMOUNT * 2
+ if(material_list)
+ mat_falsewall.set_custom_materials(material_list)
+ falsewall = mat_falsewall
+ transfer_fingerprints_to(falsewall)
qdel(src)
return
else
diff --git a/code/game/objects/structures/tram_walls.dm b/code/game/objects/structures/tram_walls.dm
index bb077f16bac..092b1d5e2e5 100644
--- a/code/game/objects/structures/tram_walls.dm
+++ b/code/game/objects/structures/tram_walls.dm
@@ -23,7 +23,7 @@
var/mineral_amount = 2
var/tram_wall_type = /obj/structure/tramwall
var/girder_type = /obj/structure/girder/tram
-
+ var/slicing_duration = 100
/obj/structure/tramwall/Initialize(mapload)
. = ..()
@@ -38,7 +38,7 @@
return FALSE
to_chat(user, span_notice("You begin slicing through the outer plating..."))
- if(welder.use_tool(src, user, 10 SECONDS, volume=100))
+ if(welder.use_tool(src, user, slicing_duration, volume=100))
to_chat(user, span_notice("You remove the outer plating."))
dismantle(user, TRUE)
else
@@ -96,3 +96,231 @@
smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_PLASTITANIUM_WALLS)
canSmoothWith = list(SMOOTH_GROUP_PLASTITANIUM_WALLS, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTLE_PARTS)
+
+/obj/structure/tramwall/gold
+ name = "gold wall"
+ desc = "A wall with gold plating. Swag!"
+ icon = 'icons/turf/walls/gold_wall.dmi'
+ icon_state = "gold_wall-0"
+ base_icon_state = "gold_wall"
+ mineral = /obj/item/stack/sheet/mineral/gold
+ tram_wall_type = /obj/structure/tramwall/gold
+ explosion_block = 0 //gold is a soft metal you dingus.
+ smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_GOLD_WALLS)
+ canSmoothWith = list(SMOOTH_GROUP_GOLD_WALLS)
+ custom_materials = list(/datum/material/gold = 4000)
+
+/obj/structure/tramwall/silver
+ name = "silver wall"
+ desc = "A wall with silver plating. Shiny!"
+ icon = 'icons/turf/walls/silver_wall.dmi'
+ icon_state = "silver_wall-0"
+ base_icon_state = "silver_wall"
+ mineral = /obj/item/stack/sheet/mineral/silver
+ tram_wall_type = /obj/structure/tramwall/silver
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_SILVER_WALLS)
+ canSmoothWith = list(SMOOTH_GROUP_SILVER_WALLS)
+ custom_materials = list(/datum/material/silver = 4000)
+
+/obj/structure/tramwall/diamond
+ name = "diamond wall"
+ desc = "A wall with diamond plating. You monster."
+ icon = 'icons/turf/walls/diamond_wall.dmi'
+ icon_state = "diamond_wall-0"
+ base_icon_state = "diamond_wall"
+ mineral = /obj/item/stack/sheet/mineral/diamond
+ tram_wall_type = /obj/structure/tramwall/diamond
+ slicing_duration = 200 //diamond wall takes twice as much time to slice
+ max_integrity = 800
+ explosion_block = 3
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_DIAMOND_WALLS)
+ canSmoothWith = list(SMOOTH_GROUP_DIAMOND_WALLS)
+ custom_materials = list(/datum/material/diamond = 4000)
+
+/obj/structure/tramwall/bananium
+ name = "bananium wall"
+ desc = "A wall with bananium plating. Honk!"
+ icon = 'icons/turf/walls/bananium_wall.dmi'
+ icon_state = "bananium_wall-0"
+ base_icon_state = "bananium_wall"
+ mineral = /obj/item/stack/sheet/mineral/bananium
+ tram_wall_type = /obj/structure/tramwall/bananium
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_BANANIUM_WALLS)
+ canSmoothWith = list(SMOOTH_GROUP_BANANIUM_WALLS)
+ custom_materials = list(/datum/material/bananium = 4000)
+
+/obj/structure/tramwall/sandstone
+ name = "sandstone wall"
+ desc = "A wall with sandstone plating. Rough."
+ icon = 'icons/turf/walls/sandstone_wall.dmi'
+ icon_state = "sandstone_wall-0"
+ base_icon_state = "sandstone_wall"
+ mineral = /obj/item/stack/sheet/mineral/sandstone
+ tram_wall_type = /obj/structure/tramwall/sandstone
+ explosion_block = 0
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_SANDSTONE_WALLS)
+ canSmoothWith = list(SMOOTH_GROUP_SANDSTONE_WALLS)
+ custom_materials = list(/datum/material/sandstone = 4000)
+
+/obj/structure/tramwall/uranium
+ article = "a"
+ name = "uranium wall"
+ desc = "A wall with uranium plating. This is probably a bad idea."
+ icon = 'icons/turf/walls/uranium_wall.dmi'
+ icon_state = "uranium_wall-0"
+ base_icon_state = "uranium_wall"
+ mineral = /obj/item/stack/sheet/mineral/uranium
+ tram_wall_type = /obj/structure/tramwall/uranium
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_URANIUM_WALLS)
+ canSmoothWith = list(SMOOTH_GROUP_URANIUM_WALLS)
+ custom_materials = list(/datum/material/uranium = 4000)
+
+ /// Mutex to prevent infinite recursion when propagating radiation pulses
+ var/active = null
+
+ /// The last time a radiation pulse was performed
+ var/last_event = 0
+
+/obj/structure/tramwall/uranium/attackby(obj/item/W, mob/user, params)
+ radiate()
+ return ..()
+
+/obj/structure/tramwall/uranium/attack_hand(mob/user, list/modifiers)
+ radiate()
+ return ..()
+
+/obj/structure/tramwall/uranium/proc/radiate()
+ SIGNAL_HANDLER
+ if(active)
+ return
+ if(world.time <= last_event + 1.5 SECONDS)
+ return
+ active = TRUE
+ radiation_pulse(
+ src,
+ max_range = 3,
+ threshold = RAD_LIGHT_INSULATION,
+ chance = URANIUM_IRRADIATION_CHANCE,
+ minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME,
+ )
+ propagate_radiation_pulse()
+ last_event = world.time
+ active = FALSE
+
+/obj/structure/tramwall/plasma
+ name = "plasma wall"
+ desc = "A wall with plasma plating. This is definitely a bad idea."
+ icon = 'icons/turf/walls/plasma_wall.dmi'
+ icon_state = "plasma_wall-0"
+ base_icon_state = "plasma_wall"
+ mineral = /obj/item/stack/sheet/mineral/plasma
+ tram_wall_type = /obj/structure/tramwall/plasma
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_PLASMA_WALLS)
+ canSmoothWith = list(SMOOTH_GROUP_PLASMA_WALLS)
+ custom_materials = list(/datum/material/plasma = 4000)
+
+/obj/structure/tramwall/wood
+ name = "wooden wall"
+ desc = "A wall with wooden plating. Stiff."
+ icon = 'icons/turf/walls/wood_wall.dmi'
+ icon_state = "wood_wall-0"
+ base_icon_state = "wood_wall"
+ mineral = /obj/item/stack/sheet/mineral/wood
+ tram_wall_type = /obj/structure/tramwall/wood
+ explosion_block = 0
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WOOD_WALLS)
+ canSmoothWith = list(SMOOTH_GROUP_WOOD_WALLS)
+ custom_materials = list(/datum/material/wood = 4000)
+
+/obj/structure/tramwall/wood/attackby(obj/item/W, mob/user)
+ if(W.get_sharpness() && W.force)
+ var/duration = ((4.8 SECONDS) / W.force) * 2 //In seconds, for now.
+ if(istype(W, /obj/item/hatchet) || istype(W, /obj/item/fireaxe))
+ duration /= 4 //Much better with hatchets and axes.
+ if(do_after(user, duration * (1 SECONDS), target=src)) //Into deciseconds.
+ dismantle(user, disassembled = FALSE, tool = W)
+ return
+ return ..()
+
+/obj/structure/tramwall/bamboo
+ name = "bamboo wall"
+ desc = "A wall with a bamboo finish."
+ icon = 'icons/turf/walls/bamboo_wall.dmi'
+ icon_state = "bamboo"
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_BAMBOO_WALLS)
+ canSmoothWith = list(SMOOTH_GROUP_BAMBOO_WALLS)
+ mineral = /obj/item/stack/sheet/mineral/bamboo
+ tram_wall_type = /obj/structure/tramwall/bamboo
+
+/obj/structure/tramwall/iron
+ name = "rough iron wall"
+ desc = "A wall with rough iron plating."
+ icon = 'icons/turf/walls/iron_wall.dmi'
+ icon_state = "iron_wall-0"
+ base_icon_state = "iron_wall"
+ mineral = /obj/item/stack/rods
+ mineral_amount = 5
+ tram_wall_type = /obj/structure/tramwall/iron
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_IRON_WALLS)
+ canSmoothWith = list(SMOOTH_GROUP_IRON_WALLS)
+ custom_materials = list(/datum/material/iron = 5000)
+
+/obj/structure/tramwall/abductor
+ name = "alien wall"
+ desc = "A wall with alien alloy plating."
+ icon = 'icons/turf/walls/abductor_wall.dmi'
+ icon_state = "abductor_wall-0"
+ base_icon_state = "abductor_wall"
+ mineral = /obj/item/stack/sheet/mineral/abductor
+ tram_wall_type = /obj/structure/tramwall/abductor
+ slicing_duration = 200 //alien wall takes twice as much time to slice
+ explosion_block = 3
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_ABDUCTOR_WALLS)
+ canSmoothWith = list(SMOOTH_GROUP_ABDUCTOR_WALLS)
+ custom_materials = list(/datum/material/alloy/alien = 4000)
+
+/obj/structure/tramwall/material
+ name = "wall"
+ desc = "A huge chunk of material used to separate rooms."
+ icon = 'icons/turf/walls/materialwall.dmi'
+ icon_state = "materialwall-0"
+ base_icon_state = "materialwall"
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_MATERIAL_WALLS)
+ canSmoothWith = list(SMOOTH_GROUP_MATERIAL_WALLS)
+ material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
+
+/obj/structure/tramwall/material/deconstruct(disassembled = TRUE)
+ if(!(flags_1 & NODECONSTRUCT_1))
+ if(disassembled)
+ new girder_type(loc)
+ for(var/material in custom_materials)
+ var/datum/material/material_datum = material
+ new material_datum.sheet_type(loc, FLOOR(custom_materials[material_datum] / MINERAL_MATERIAL_AMOUNT, 1))
+ qdel(src)
+
+/obj/structure/tramwall/material/mat_update_desc(mat)
+ desc = "A huge chunk of [mat] used to separate rooms."
+
+/obj/structure/tramwall/material/update_icon(updates)
+ . = ..()
+ for(var/datum/material/material in custom_materials)
+ if(material.alpha < 255)
+ update_transparency_underlays()
+ return
+
+/obj/structure/tramwall/material/proc/update_transparency_underlays()
+ underlays.Cut()
+ var/mutable_appearance/girder_underlay = mutable_appearance('icons/obj/structures.dmi', "girder", layer = LOW_OBJ_LAYER-0.01)
+ girder_underlay.appearance_flags = RESET_ALPHA | RESET_COLOR
+ underlays += girder_underlay
diff --git a/code/game/turfs/closed/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm
index 67fc5685339..b98fb232b45 100644
--- a/code/game/turfs/closed/wall/mineral_walls.dm
+++ b/code/game/turfs/closed/wall/mineral_walls.dm
@@ -6,8 +6,6 @@
canSmoothWith = null
rcd_memory = null
material_flags = MATERIAL_EFFECTS
- var/last_event = 0
- var/active = null
/turf/closed/wall/mineral/gold
name = "gold wall"
@@ -88,35 +86,45 @@
canSmoothWith = list(SMOOTH_GROUP_URANIUM_WALLS)
custom_materials = list(/datum/material/uranium = 4000)
+ /// Mutex to prevent infinite recursion when propagating radiation pulses
+ var/active = null
+
+ /// The last time a radiation pulse was performed
+ var/last_event = 0
+
+/turf/closed/wall/mineral/uranium/Initialize(mapload)
+ . = ..()
+ RegisterSignal(src, COMSIG_ATOM_PROPAGATE_RAD_PULSE, .proc/radiate)
+
/turf/closed/wall/mineral/uranium/proc/radiate()
- if(!active)
- if(world.time > last_event+15)
- active = 1
- radiation_pulse(
- src,
- max_range = 3,
- threshold = RAD_LIGHT_INSULATION,
- chance = URANIUM_IRRADIATION_CHANCE,
- minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME,
- )
- for(var/turf/closed/wall/mineral/uranium/T in orange(1,src))
- T.radiate()
- last_event = world.time
- active = null
- return
- return
+ SIGNAL_HANDLER
+ if(active)
+ return
+ if(world.time <= last_event + 1.5 SECONDS)
+ return
+ active = TRUE
+ radiation_pulse(
+ src,
+ max_range = 3,
+ threshold = RAD_LIGHT_INSULATION,
+ chance = URANIUM_IRRADIATION_CHANCE,
+ minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME,
+ )
+ propagate_radiation_pulse()
+ last_event = world.time
+ active = FALSE
/turf/closed/wall/mineral/uranium/attack_hand(mob/user, list/modifiers)
radiate()
- . = ..()
+ return ..()
/turf/closed/wall/mineral/uranium/attackby(obj/item/W, mob/user, params)
radiate()
- ..()
+ return ..()
/turf/closed/wall/mineral/uranium/Bumped(atom/movable/AM)
radiate()
- ..()
+ return ..()
/turf/closed/wall/mineral/uranium/hulk_recoil(obj/item/bodypart/arm, mob/living/carbon/human/hulkman, damage = 41)
return ..()
@@ -151,10 +159,10 @@
/turf/closed/wall/mineral/wood/attackby(obj/item/W, mob/user)
if(W.get_sharpness() && W.force)
- var/duration = (48/W.force) * 2 //In seconds, for now.
+ var/duration = ((4.8 SECONDS)/W.force) * 2 //In seconds, for now.
if(istype(W, /obj/item/hatchet) || istype(W, /obj/item/fireaxe))
duration /= 4 //Much better with hatchets and axes.
- if(do_after(user, duration*10, target=src)) //Into deciseconds.
+ if(do_after(user, duration * (1 SECONDS), target=src)) //Into deciseconds.
dismantle_wall(FALSE,FALSE)
return
return ..()
diff --git a/icons/obj/doors/airlocks/material/material.dmi b/icons/obj/doors/airlocks/material/material.dmi
new file mode 100644
index 00000000000..e0d7912f47a
Binary files /dev/null and b/icons/obj/doors/airlocks/material/material.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index bc3a2f1ba4c..0b475d707e2 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/icons/turf/walls/cult_wall.dmi b/icons/turf/walls/cult_wall.dmi
index 4990c4474ff..d1ea0a85413 100644
Binary files a/icons/turf/walls/cult_wall.dmi and b/icons/turf/walls/cult_wall.dmi differ
diff --git a/icons/turf/walls/materialwall.dmi b/icons/turf/walls/materialwall.dmi
index 1027effda94..c81fd64c21b 100644
Binary files a/icons/turf/walls/materialwall.dmi and b/icons/turf/walls/materialwall.dmi differ