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