diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/bluemoon/engine_rbmk_bluemoon.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/bluemoon/engine_rbmk_bluemoon.dmm
index 39eff27ac125..70a10ee558b3 100644
--- a/_maps/RandomRuins/StationRuins/Box/Engine/bluemoon/engine_rbmk_bluemoon.dmm
+++ b/_maps/RandomRuins/StationRuins/Box/Engine/bluemoon/engine_rbmk_bluemoon.dmm
@@ -510,7 +510,6 @@
/obj/effect/turf_decal/stripes/line{
dir = 5
},
-/obj/structure/noticeboard/directional/east,
/obj/structure/table/reinforced,
/obj/machinery/microwave{
pixel_x = -3;
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 494377a0147e..a25bedb443d7 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -31203,7 +31203,6 @@
/obj/effect/turf_decal/tile/dark_green{
dir = 1
},
-/obj/structure/noticeboard/directional/west,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
diff --git a/code/__DEFINES/layers_planes.dm b/code/__DEFINES/layers_planes.dm
index 6d4c5a776218..cb38e28c2f62 100644
--- a/code/__DEFINES/layers_planes.dm
+++ b/code/__DEFINES/layers_planes.dm
@@ -109,6 +109,7 @@
#define ON_EDGED_TURF_LAYER 4.35
#define LARGE_MOB_LAYER 4.4
#define ABOVE_ALL_MOB_LAYER 4.5
+#define RAILING_LAYER 4.7
#define SPACEVINE_LAYER 4.8
#define SPACEVINE_MOB_LAYER 4.9
diff --git a/code/controllers/subsystem/materials.dm b/code/controllers/subsystem/materials.dm
index 1b0d893768f6..9e1c685b899b 100644
--- a/code/controllers/subsystem/materials.dm
+++ b/code/controllers/subsystem/materials.dm
@@ -22,11 +22,11 @@ SUBSYSTEM_DEF(materials)
var/list/list/material_combos
///List of stackcrafting recipes for materials using base recipes
var/list/base_stack_recipes = list(
- new /datum/stack_recipe("Chair", /obj/structure/chair/greyscale, time = 5, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE),
- new /datum/stack_recipe("Toilet", /obj/structure/toilet/greyscale, time = 5, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE),
- new /datum/stack_recipe("Sink Frame", /obj/structure/sink/greyscale, time = 5, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE),
- new /datum/stack_recipe("Material Airlock Assembly", /obj/structure/door_assembly/door_assembly_material, 4, time = 5, 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("chair", /obj/structure/chair/greyscale, time = 5, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE),
+ new /datum/stack_recipe("toilet", /obj/structure/toilet/greyscale, time = 5, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE),
+ new /datum/stack_recipe("sink frame", /obj/structure/sink/greyscale, time = 5, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE),
+ new /datum/stack_recipe("material airlock assembly", /obj/structure/door_assembly/door_assembly_material, 4, time = 5, 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),
)
///List of stackcrafting recipes for materials using rigid recipes
var/list/rigid_stack_recipes = list(
diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm
index cc1c03941f6e..e968be75ef0e 100644
--- a/code/game/objects/items/stacks/rods.dm
+++ b/code/game/objects/items/stacks/rods.dm
@@ -1,12 +1,17 @@
GLOBAL_LIST_INIT(rod_recipes, list ( \
- new/datum/stack_recipe("Grille", /obj/structure/grille, 2, time = 10, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("Table Frame", /obj/structure/table_frame, 2, time = 10, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("Scooter Frame", /obj/item/scooter_frame, 10, time = 25, one_per_turf = 0), \
- new/datum/stack_recipe("Railing", /obj/structure/railing, 3, time = 18, window_checks = TRUE), \
- new/datum/stack_recipe("Catwalk Tile", /obj/item/stack/tile/catwalk, 1, 4, 20), \
- new/datum/stack_recipe("Guard Rail", /obj/structure/deployable_barricade/guardrail, 2, time = 1 SECONDS, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("Tank Holder", /obj/structure/tank_holder, 2, time = 5, one_per_turf = TRUE, on_floor = FALSE), \
- new/datum/stack_recipe("Glasses Frame", /obj/item/glasswork/glass_base/glasses_frame, 3, 1, 1, 30 SECONDS), \
+ new/datum/stack_recipe("grille", /obj/structure/grille, 2, time = 10, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("table frame", /obj/structure/table_frame, 2, time = 10, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("scooter frame", /obj/item/scooter_frame, 10, time = 25, one_per_turf = 0), \
+ new/datum/stack_recipe("catwalk tile", /obj/item/stack/tile/catwalk, 1, 4, 20), \
+ new/datum/stack_recipe("guard rail", /obj/structure/deployable_barricade/guardrail, 2, time = 1 SECONDS, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("tank holder", /obj/structure/tank_holder, 2, time = 5, one_per_turf = TRUE, on_floor = FALSE), \
+ new/datum/stack_recipe("glasses frame", /obj/item/glasswork/glass_base/glasses_frame, 3, 1, 1, 30 SECONDS), \
+ new /datum/stack_recipe_list("railing", list( \
+ new/datum/stack_recipe("railing", /obj/structure/railing, 2, time = 18, window_checks = TRUE), \
+ new/datum/stack_recipe("railing corner", /obj/structure/railing/corner, 2, time = 18, window_checks = TRUE), \
+ new/datum/stack_recipe("railing end", /obj/structure/railing/corner/end, 2, time = 18, window_checks = TRUE), \
+ new/datum/stack_recipe("flipped railing end", /obj/structure/railing/corner/end/flip, 2, time = 18, window_checks = TRUE), \
+ )), \
))
/obj/item/stack/rods
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index a1ee6198fe05..d80ff82a1e53 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -42,8 +42,8 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
//END OF CIT CHANGES
new/datum/stack_recipe_list("fancy sofas", list( \
new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa/corp, one_per_turf = TRUE, on_floor = TRUE), \
- new /datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/corp/right, one_per_turf = TRUE, on_floor = TRUE), \
- new /datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/corp/left, one_per_turf = TRUE, on_floor = TRUE), \
+ new /datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/corp/left, one_per_turf = TRUE, on_floor = TRUE), \
+ new /datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/corp/right, one_per_turf = TRUE, on_floor = TRUE), \
new /datum/stack_recipe("sofa (corner)", /obj/structure/chair/sofa/corp/corner, one_per_turf = TRUE, on_floor = TRUE), \
)), \
null, \
@@ -136,7 +136,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
new/datum/stack_recipe("iron ingot", /obj/item/ingot/iron, 6, time = 100), \
null, \
new/datum/stack_recipe("tiny fan", /obj/structure/fans/tiny, 2, time = 4, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("Metal Barricade", /obj/structure/deployable_barricade/metal, 2, time = 1 SECONDS, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("metal barricade", /obj/structure/deployable_barricade/metal, 2, time = 1 SECONDS, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("desk bell", /obj/structure/desk_bell, 2, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
))
@@ -252,9 +252,9 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \
* Wood
*/
GLOBAL_LIST_INIT(wood_recipes, list ( \
- new/datum/stack_recipe("Wooden Sandals", /obj/item/clothing/shoes/sandal, 1), \
- new/datum/stack_recipe("Sauna Oven", /obj/structure/sauna_oven, 50, time = 15 SECONDS, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("Wooden Half-Barricade", /obj/structure/deployable_barricade/wooden, 5, time = 2 SECONDS, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1), \
+ new/datum/stack_recipe("sauna oven", /obj/structure/sauna_oven, 50, time = 15 SECONDS, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("wooden half-barricade", /obj/structure/deployable_barricade/wooden, 5, time = 2 SECONDS, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("tiki mask", /obj/item/clothing/mask/gas/tiki_mask, 2), \
new/datum/stack_recipe("wood table frame", /obj/structure/table_frame/wood, 2, time = 10), \
null, \
@@ -302,6 +302,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
new/datum/stack_recipe("painting frame", /obj/item/wallframe/painting, 1, time = 10),\
new/datum/stack_recipe("urn", /obj/item/reagent_containers/glass/mortar/urn, 3), \
new/datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10),\
+ new/datum/stack_recipe("notice board frame", /obj/item/wallframe/noticeboard, 5, time = 10),\
))
/obj/item/stack/sheet/mineral/wood
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index a9ec3fd36c45..a56d4683f831 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -183,10 +183,7 @@
//prevents remote "kicks" with TK
if (!Adjacent(user))
return
- user.visible_message(span_danger("[user] kicks the display case."), null, null, COMBAT_MESSAGE_RANGE)
- log_combat(user, src, "kicks")
- user.do_attack_animation(src, ATTACK_EFFECT_KICK)
- take_damage(2)
+ to_chat(user, span_notice("You poke the [src] glass."))
/obj/structure/displaycase_chassis
anchored = TRUE
diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm
index 34fbdb302912..915ad1153efa 100644
--- a/code/game/objects/structures/noticeboard.dm
+++ b/code/game/objects/structures/noticeboard.dm
@@ -2,37 +2,27 @@
/obj/structure/noticeboard
name = "notice board"
- desc = "A board for pinning important notices upon."
- icon = 'icons/obj/stationobjs.dmi'
- icon_state = "nboard00"
- plane = ABOVE_WALL_PLANE
+ desc = "A board for pinning important notices upon. It is made of the finest Spanish cork."
+ icon = 'icons/obj/wallmounts.dmi'
+ icon_state = "noticeboard"
density = FALSE
anchored = TRUE
- max_integrity = 150
+ max_integrity = 100
/// Current number of a pinned notices
var/notices = 0
-/obj/structure/noticeboard/directional/north
- dir = SOUTH
- pixel_y = 32
-
-/obj/structure/noticeboard/directional/south
- dir = NORTH
- pixel_y = -32
-
-/obj/structure/noticeboard/directional/east
- dir = WEST
- pixel_x = 32
-
-/obj/structure/noticeboard/directional/west
- dir = EAST
- pixel_x = -32
-
-/obj/structure/noticeboard/Initialize(mapload)
+/obj/structure/noticeboard/Initialize(mapload, ndir, building)
. = ..()
- if(!mapload)
- return
+ if(building)
+ setDir(ndir)
+
+ var/static/list/tool_behaviors = list(
+ TOOL_WRENCH = list(
+ SCREENTIP_CONTEXT_LMB = list(INTENT_ANY = "Detach"),
+ )
+ )
+ AddElement(/datum/element/contextual_screentip_tools, tool_behaviors)
for(var/obj/item/I in loc)
if(notices >= MAX_NOTICES)
@@ -40,7 +30,7 @@
if(istype(I, /obj/item/paper))
I.forceMove(src)
notices++
- icon_state = "nboard0[notices]"
+ update_appearance(UPDATE_ICON)
//attaching papers!!
/obj/structure/noticeboard/attackby(obj/item/O, mob/user, params)
@@ -52,12 +42,21 @@
if(!user.transferItemToLoc(O, src))
return
notices++
- icon_state = "nboard0[notices]"
- to_chat(user, span_notice("You pin the [O] to the noticeboard."))
+ update_appearance(UPDATE_ICON)
+ to_chat(user, span_notice("You pin the [O] to the [src]."))
else
- to_chat(user, span_warning("The notice board is full!"))
+ to_chat(user, span_warning("There is no space left on the [src]!"))
+ else if(O.tool_behaviour == TOOL_WRENCH)
+ user.visible_message("[user] starts unsecuring [src]...", "You start unsecuring [src]...")
+ O.play_tool_sound(src)
+ if(O.use_tool(src, user, 80))
+ user.visible_message("[user] unsecures [src]!", "You detach [src] from the wall.")
+ playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
+ deconstruct()
+ return
else
return ..()
+ return ..()
/obj/structure/noticeboard/ui_state(mob/user)
return GLOB.physical_state
@@ -80,7 +79,7 @@
data["items"] += list(content_data)
return data
-/obj/structure/noticeboard/ui_act(action, params)
+/obj/structure/noticeboard/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
. = ..()
if(.)
return
@@ -111,22 +110,41 @@
* * item - The item that is to be removed
* * user - The mob that is trying to get the item removed, if there is one
*/
+
/obj/structure/noticeboard/proc/remove_item(obj/item/item, mob/user)
item.forceMove(drop_location())
if(user)
user.put_in_hands(item)
+ to_chat(user, span_notice("You tear the [item] off the [src]."))
balloon_alert(user, "removed from board")
notices--
- icon_state = "nboard0[notices]"
+ update_appearance(UPDATE_ICON)
/obj/structure/noticeboard/deconstruct(disassembled = TRUE)
- if(!(flags_1 & NODECONSTRUCT_1))
- new /obj/item/stack/sheet/metal (loc, 1)
+ if(!disassembled)
+ new /obj/item/stack/sheet/mineral/wood(loc, 2)
+ else
+ new /obj/item/wallframe/noticeboard(loc)
for(var/obj/item/content in contents)
remove_item(content)
qdel(src)
-// Notice boards for the heads of staff (plus the qm)
+/obj/item/wallframe/noticeboard
+ name = "notice board"
+ desc = "Right now it's more of a clipboard. Attach to a wall to use."
+ icon = 'icons/obj/wallframe.dmi'
+ icon_state = "noticeboard"
+ pixel_shift = -32
+ custom_materials = list(
+ /datum/material/wood = SHEET_MATERIAL_AMOUNT,
+ )
+ resistance_flags = FLAMMABLE
+ result_path = /obj/structure/noticeboard
+
+/obj/structure/noticeboard/update_overlays()
+ . = ..()
+ if(notices)
+ . += "notices_[notices]"
/obj/structure/noticeboard/captain
name = "Captain's Notice Board"
diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm
index 922da0f1ebe0..1ed10fcde179 100644
--- a/code/game/objects/structures/railings.dm
+++ b/code/game/objects/structures/railings.dm
@@ -1,26 +1,75 @@
/obj/structure/railing
name = "railing"
desc = "Basic railing meant to protect idiots like you from falling."
- icon = 'icons/obj/fluff.dmi'
+ icon = 'icons/obj/railings.dmi'
icon_state = "railing"
density = TRUE
anchored = TRUE
climbable = TRUE
+ layer = ABOVE_ALL_MOB_LAYER
///Initial direction of the railing.
var/ini_dir
+/datum/armor/structure_railing
+ melee = 35
+ bullet = 50
+ laser = 50
+ energy = 100
+ bomb = 10
+
+/obj/structure/railing/unbreakable
+ resistance_flags = INDESTRUCTIBLE
+
/obj/structure/railing/corner //aesthetic corner sharp edges hurt oof ouch
icon_state = "railing_corner"
density = FALSE
climbable = FALSE
+/obj/structure/railing/corner/unbreakable
+ resistance_flags = INDESTRUCTIBLE
+
+/obj/structure/railing/corner/end //end of a segment of railing without making a loop
+ icon_state = "railing_end"
+
+/obj/structure/railing/corner/end/unbreakable
+ resistance_flags = INDESTRUCTIBLE
+
+/obj/structure/railing/corner/end/flip //same as above but flipped around
+ icon_state = "railing_end_flip"
+
+/obj/structure/railing/corner/end/flip/unbreakable
+ resistance_flags = INDESTRUCTIBLE
+
/obj/structure/railing/ComponentInitialize()
. = ..()
AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS ,null,CALLBACK(src, PROC_REF(can_be_rotated)),CALLBACK(src, PROC_REF(after_rotation)))
+/obj/structure/railing/examine(mob/user)
+ . = ..()
+ if(anchored == TRUE)
+ . += span_notice("The railing is bolted to the floor.")
+ else
+ . += span_notice("The railing is unbolted from the floor and can be deconstructed with wirecutters.")
+
/obj/structure/railing/Initialize(mapload)
. = ..()
- ini_dir = dir
+
+ var/static/list/tool_behaviors = list(
+ TOOL_WELDER = list(
+ SCREENTIP_CONTEXT_LMB = list(INTENT_HELP = "Repair"),
+ ),
+ TOOL_WRENCH = list(
+ SCREENTIP_CONTEXT_LMB = list(INTENT_ANY = "Anchor/Unanchor"),
+ ),
+ TOOL_WIRECUTTER= list(
+ SCREENTIP_CONTEXT_LMB = list(INTENT_ANY = "Cut"),
+ )
+ )
+
+ AddElement(/datum/element/contextual_screentip_tools, tool_behaviors)
+
+ RegisterSignal(src, COMSIG_ATOM_DIR_CHANGE, PROC_REF(on_change_layer))
+ adjust_dir_layer(dir)
/obj/structure/railing/attackby(obj/item/I, mob/living/user, params)
..()
@@ -34,13 +83,13 @@
obj_integrity = max_integrity
to_chat(user, "Вы починили [src].")
else
- to_chat(user, "[src] is already in good condition!")
+ to_chat(user, "[src] выглядит целым.")
return
/obj/structure/railing/wirecutter_act(mob/living/user, obj/item/I)
. = ..()
if(!anchored)
- to_chat(user, "You cut apart the railing.")
+ to_chat(user, "Вы перекусываете крепление [src].")
I.play_tool_sound(src, 100)
deconstruct()
return TRUE
@@ -50,8 +99,7 @@
if(!loc) //quick check if it's qdeleted already.
return
if(!(flags_1 & NODECONSTRUCT_1))
- var/obj/item/stack/rods/rod = new /obj/item/stack/rods(drop_location(), 3)
- transfer_fingerprints_to(rod)
+ new /obj/item/stack/rods(loc, 2)
qdel(src)
///Implements behaviour that makes it possible to unanchor the railing.
/obj/structure/railing/wrench_act(mob/living/user, obj/item/I)
@@ -105,3 +153,14 @@
air_update_turf(TRUE)
ini_dir = dir
add_fingerprint(user)
+
+/obj/structure/railing/proc/on_change_layer(datum/source, old_dir, new_dir)
+ SIGNAL_HANDLER
+ adjust_dir_layer(new_dir)
+
+/obj/structure/railing/proc/adjust_dir_layer(direction)
+ layer = (direction & NORTH) ? MOB_LAYER : initial(layer)
+
+
+
+
diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi
index 919a1883f4d0..e63ec4a7d506 100644
Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ
diff --git a/icons/obj/railings.dmi b/icons/obj/railings.dmi
new file mode 100644
index 000000000000..49b560d2c870
Binary files /dev/null and b/icons/obj/railings.dmi differ
diff --git a/icons/obj/stairs.dmi b/icons/obj/stairs.dmi
index 685609a533de..8c5ae6f4ac28 100644
Binary files a/icons/obj/stairs.dmi and b/icons/obj/stairs.dmi differ
diff --git a/icons/obj/wallframe.dmi b/icons/obj/wallframe.dmi
index c447263db585..0993c6e967ae 100644
Binary files a/icons/obj/wallframe.dmi and b/icons/obj/wallframe.dmi differ
diff --git a/icons/obj/wallmounts.dmi b/icons/obj/wallmounts.dmi
index 6c491ff25735..e7be7af936f7 100644
Binary files a/icons/obj/wallmounts.dmi and b/icons/obj/wallmounts.dmi differ
diff --git a/icons/obj/wallmounts2.dmi b/icons/obj/wallmounts2.dmi
new file mode 100644
index 000000000000..2ea6eda3d6ab
Binary files /dev/null and b/icons/obj/wallmounts2.dmi differ
diff --git a/icons/turf/decals.dmi b/icons/turf/decals.dmi
index f3f960c29cd5..b62de82252d5 100644
Binary files a/icons/turf/decals.dmi and b/icons/turf/decals.dmi differ