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