From eff6ca9a7b84022fe1750b6008b89d59092a1e72 Mon Sep 17 00:00:00 2001 From: Sparky Date: Wed, 19 Jun 2024 20:51:25 +0100 Subject: [PATCH] Expedition Fluff Expansion - Tents & Sleeping Bags (#19362) Adds tents, in two variants (A larger and smaller one). These utilise a new large structure framework allowing a single item to spawn multiple structures (The parts of the tent) in the correct places. The tents count as inside, so can be used to shelter from weather. Tents have roofs which become semi-transparent when entered. There are also mappable effects which generate a tent at round start for mapping. Adds sleeping bags, which can be attached to the outside of bags for easy carrying. Ideally this would be an accessories interaction, but backpacks aren't clothing and converting them to be such is outside of the scope of this PR. Adds foldable tables, for setting up on expeditions. --- aurorastation.dme | 3 + code/__DEFINES/large_structures.dm | 3 + code/__DEFINES/layers.dm | 10 +- code/_onclick/hud/rendering/_renderer.dm | 28 +- code/game/objects/items/camping.dm | 386 ++++++++++++++++++ .../objects/items/weapons/storage/backpack.dm | 54 ++- .../closets/secure/operations.dm | 1 + code/game/objects/structures/large.dm | 167 ++++++++ code/game/turfs/turf.dm | 5 +- code/modules/research/xenoarchaeology/misc.dm | 1 + html/changelogs/camping.yml | 8 + icons/obj/item/camping.dmi | Bin 0 -> 4984 bytes icons/obj/item/tent_decals.dmi | Bin 0 -> 731 bytes icons/obj/structure/tables/table.dmi | Bin 18281 -> 19544 bytes maps/sccv_horizon/sccv_horizon-1_deck_1.dmm | 19 +- 15 files changed, 667 insertions(+), 18 deletions(-) create mode 100644 code/__DEFINES/large_structures.dm create mode 100644 code/game/objects/items/camping.dm create mode 100644 code/game/objects/structures/large.dm create mode 100644 html/changelogs/camping.yml create mode 100644 icons/obj/item/camping.dmi create mode 100644 icons/obj/item/tent_decals.dmi diff --git a/aurorastation.dme b/aurorastation.dme index 380e739331b..f6ed7fd669e 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -74,6 +74,7 @@ #include "code\__DEFINES\important_recursive_contents.dm" #include "code\__DEFINES\items_clothing.dm" #include "code\__DEFINES\jobs.dm" +#include "code\__DEFINES\large_structures.dm" #include "code\__DEFINES\layers.dm" #include "code\__DEFINES\lighting.dm" #include "code\__DEFINES\logging.dm" @@ -1074,6 +1075,7 @@ #include "code\game\objects\items\apc_frame.dm" #include "code\game\objects\items\blueprints.dm" #include "code\game\objects\items\bodybag.dm" +#include "code\game\objects\items\camping.dm" #include "code\game\objects\items\canvas.dm" #include "code\game\objects\items\contraband.dm" #include "code\game\objects\items\crayons.dm" @@ -1352,6 +1354,7 @@ #include "code\game\objects\structures\inflatable.dm" #include "code\game\objects\structures\janicart.dm" #include "code\game\objects\structures\kitchen_spike.dm" +#include "code\game\objects\structures\large.dm" #include "code\game\objects\structures\lattice.dm" #include "code\game\objects\structures\light_pole.dm" #include "code\game\objects\structures\mirror.dm" diff --git a/code/__DEFINES/large_structures.dm b/code/__DEFINES/large_structures.dm new file mode 100644 index 00000000000..dc95150c20a --- /dev/null +++ b/code/__DEFINES/large_structures.dm @@ -0,0 +1,3 @@ +#define STAGE_DISASSEMBLED 0 //Stage needs to be assembled, or has been disassembled already +#define STAGE_PROGRESS 1 //Stage is being assembled or disassembled +#define STAGE_ASSEMBLED 2 //Stage needs to be disassembled, or has been assembled already diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 5d194a938d2..27ce7dc0a83 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -138,23 +138,25 @@ #define OBSERVER_PLANE 3 -#define LIGHTING_PLANE 4 +#define ROOF_PLANE 4 + +#define LIGHTING_PLANE 5 #define LIGHTING_LAYER 1 -#define EFFECTS_ABOVE_LIGHTING_PLANE 5 +#define EFFECTS_ABOVE_LIGHTING_PLANE 6 #define EYE_GLOW_LAYER 1 #define BEAM_PROJECTILE_LAYER 2 #define SUPERMATTER_WALL_LAYER 3 #define LIGHTNING_LAYER 4 -#define FULLSCREEN_PLANE 6 +#define FULLSCREEN_PLANE 7 #define FULLSCREEN_LAYER 1 #define DAMAGE_LAYER 2 #define IMPAIRED_LAYER 3 #define BLIND_LAYER 4 #define CRIT_LAYER 5 -#define HUD_PLANE 7 +#define HUD_PLANE 8 #define UNDER_HUD_LAYER 1 #define HUD_BASE_LAYER 2 #define HUD_BELOW_ITEM_LAYER 2.9 diff --git a/code/_onclick/hud/rendering/_renderer.dm b/code/_onclick/hud/rendering/_renderer.dm index 5cd80fb2634..3d5547ba0b0 100644 --- a/code/_onclick/hud/rendering/_renderer.dm +++ b/code/_onclick/hud/rendering/_renderer.dm @@ -90,14 +90,14 @@ INITIALIZE_IMMEDIATE(/atom/movable/renderer) /mob/proc/CreateRenderers() if (!renderers) renderers = list() - for (var/atom/movable/renderer/renderer as anything in subtypesof(/atom/movable/renderer)) + for (var/renderer as anything in subtypesof(/atom/movable/renderer)) if(ispath(renderer, /atom/movable/renderer/shared)) continue - renderer = new renderer (null, src) - renderers[renderer] = renderer.plane // (renderer = plane) format for visual debugging - if (renderer.relay) - my_client.screen += renderer.relay - my_client.screen += renderer + var/atom/movable/renderer/render = new renderer (null, src) + renderers["[render.plane]"] = render // (render = plane) format for visual debugging + if (render.relay) + my_client.screen += render.relay + my_client.screen += render for (var/atom/movable/renderer/zrenderer as anything in GLOB.zmimic_renderers) if (zrenderer.relay) @@ -107,11 +107,12 @@ INITIALIZE_IMMEDIATE(/atom/movable/renderer) /// Removes the mob's renderers on /Logout() /mob/proc/RemoveRenderers() if(my_client) - for(var/atom/movable/renderer/renderer as anything in renderers) - my_client.screen -= renderer - if (renderer.relay) - my_client.screen -= renderer.relay - qdel(renderer) + for(var/renderer as anything in renderers) + var/atom/movable/renderer/render = renderers[renderer] + my_client.screen -= render + if (render.relay) + my_client.screen -= render.relay + qdel(render) for (var/atom/movable/renderer/renderer as anything in GLOB.zmimic_renderers) my_client.screen -= renderer if (renderers) @@ -181,6 +182,11 @@ GLOBAL_LIST_EMPTY(zmimic_renderers) group = RENDER_GROUP_SCENE plane = OBSERVER_PLANE +/atom/movable/renderer/roofs + name = "Roofs" + group = RENDER_GROUP_SCENE + plane = ROOF_PLANE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT /// Draws darkness effects. /atom/movable/renderer/lighting diff --git a/code/game/objects/items/camping.dm b/code/game/objects/items/camping.dm new file mode 100644 index 00000000000..5dd66b6e1be --- /dev/null +++ b/code/game/objects/items/camping.dm @@ -0,0 +1,386 @@ +/* + + Tents + +*/ + +/datum/large_structure/tent + stages = list("poles" = STAGE_DISASSEMBLED, + "canvas" = STAGE_DISASSEMBLED, + "guy lines" = STAGE_DISASSEMBLED, + "pegs" = STAGE_DISASSEMBLED) + component_structure = /obj/structure/component/tent_canvas + source_item_type = /obj/item/tent + /** + * The state name of an overlay in `icons/obj/item/tent_decals.dmi` + * Used for branded tents, such as the SCC base camp tent + */ + var/decal + +/datum/large_structure/tent/build_structures() + . = ..() + var/list/roofs = list() + for(var/obj/structure/component/tent_canvas/C in grouped_structures) + if(dir & (NORTH | SOUTH)) + if(C.x == x1 || C.x == x2) + C.icon_state = "canvas_dir" + var/mid = Mean(x1, x2) + if(C.x < mid) + C.dir = WEST + else + C.dir = EAST + else + if(C.y == y1 || C.y == y2) + C.icon_state = "canvas_dir" + var/mid = Mean(y1, y2) + if(C.y < mid) + C.dir = SOUTH + else + C.dir = NORTH + var/obj/structure/component/tent_canvas/roof/roof = new /obj/structure/component/tent_canvas/roof(C.loc) + roofs += roof + roof.color = color + roof.dir = C.dir + if(decal && C.x == x1 && C.y == y1) + roof.AddOverlays(overlay_image('icons/obj/item/tent_decals.dmi', decal, flags=RESET_COLOR)) + roof.icon_state = "roof_[get_roof_type(C)]" + grouped_structures += roofs + +/datum/large_structure/tent/structure_entered(turf/entry_point, atom/movable/entering) + . = ..() + if(!.) + return + var/mob/M = entering + if(!M.renderers) + return + var/atom/movable/renderer/roofs/roof_plane = M.renderers["[ROOF_PLANE]"] + if(roof_plane) + roof_plane.alpha = 76 + +/datum/large_structure/tent/mob_moved(mob/mover, turf/exit_point) + . = ..() + if(!.) + var/atom/movable/renderer/roofs/roof_plane = mover.renderers["[ROOF_PLANE]"] + if(roof_plane) + roof_plane.alpha = 255 + +/** + * Determines roof state over each canvas structure + * Returns `edge` for structures on the edge of the tent, so they don't cover the walls + * Returns `mid` for structures in the centre of the tent, for odd number widths + * Otherwise returns `norm` for other structures + */ +/datum/large_structure/tent/proc/get_roof_type(var/obj/structure/component/tent_canvas/canvas) + var/edge1 + var/edge2 + var/axis + if(dir & (NORTH | SOUTH)) + edge1 = x1 + edge2 = x2 + axis = canvas.x + else + edge1 = y1 + edge2 = y2 + axis = canvas.y + if(axis == edge1 || axis == edge2) + return "edge" + else if(axis == Mean(edge1, edge2)) + return "mid" + return "norm" + +/obj/item/tent + name = "expedition tent" + desc = "A rolled up tent, ready to be assembled to make a base camp, shelter, or just a cozy place to chat." + desc_info = "Drag this to yourself to begin assembly. This will take some time, in 4 stages. Others can start working on the other stages by dragging it to themselves as well." + icon = 'icons/obj/item/camping.dmi' + icon_state = "tent" + item_state = "tent" + contained_sprite = TRUE + w_class = ITEMSIZE_LARGE + color = "#58a178" + var/width = 2 + var/length = 3 + var/decal + + var/datum/large_structure/tent/my_tent + +/obj/item/tent/Initialize() + . = ..() + w_class = min(ceil(width * length / 1.5), ITEMSIZE_IMMENSE) // 2x2 = ITEMSIZE_NORMAL + desc += "\nThis one is [width] x [length] in size." + +/obj/item/tent/Destroy() + if(my_tent) + my_tent.source_item = null + if(!my_tent.grouped_structures) + QDEL_NULL(my_tent) + return ..() + +/obj/item/tent/MouseDrop(over_object, src_location, over_location) + . = ..() + if(use_check(usr) || !Adjacent(usr)) + return + var/turf/T = get_turf(src) + if(istype(T)) + deploy_tent(T, usr) + +/obj/item/tent/proc/deploy_tent(var/turf/target, var/mob/user) + if(my_tent) + if(my_tent.origin == get_turf(src)) //Not moved + my_tent.assemble(1 SECOND, user) + return + else + QDEL_NULL(my_tent) + + var/deploy_dir = get_compass_dir(user,target) + if(target == get_turf(user)) + deploy_dir = user.dir + + my_tent = new /datum/large_structure/tent(src) + setup_my_tent(deploy_dir, target) + + my_tent.assemble(1 SECOND, user) + +/obj/item/tent/proc/setup_my_tent(var/deploy_dir, var/turf/target) + my_tent.name = name + my_tent.color = color + my_tent.decal = decal + my_tent.dir = deploy_dir + my_tent.z1 = target.z + my_tent.z2 = target.z + my_tent.source_item_type = type + my_tent.source_item = src + my_tent.origin = get_turf(src) + + if(deploy_dir & NORTH) + my_tent.x1 = target.x - floor((width-1)/2) + my_tent.x2 = target.x + ceil((width-1)/2) + my_tent.y1 = target.y + my_tent.y2 = target.y + (length-1) + else if(deploy_dir & SOUTH) + my_tent.x1 = target.x - ceil((width-1)/2) + my_tent.x2 = target.x + floor((width-1)/2) + my_tent.y1 = target.y - (length-1) + my_tent.y2 = target.y + else if(deploy_dir & EAST) + my_tent.x1 = target.x + my_tent.x2 = target.x + (length-1) + my_tent.y1 = target.y - ceil((width-1)/2) + my_tent.y2 = target.y + floor((width-1)/2) + else + my_tent.x1 = target.x - (length-1) + my_tent.x2 = target.x + my_tent.y1 = target.y - floor((width-1)/2) + my_tent.y2 = target.y + ceil((width-1)/2) + +/obj/item/tent/big + name = "base camp tent" + color = "#2e3763" + width = 3 + length = 4 + +/obj/item/tent/big/scc + name = "scc base camp tent" + decal = "scc" + +/obj/item/tent/mining + name = "miners' tent" + color = "#8b7242" + width = 3 + length = 3 + +/obj/structure/component/tent_canvas + name = "tent canvas" + icon = 'icons/obj/item/camping.dmi' + icon_state = "canvas" + item_state = "canvas" + anchored = TRUE + density = TRUE + atom_flags = ATOM_FLAG_CHECKS_BORDER + atmos_canpass = CANPASS_ALWAYS //Tents are not air tight + layer = ABOVE_HUMAN_LAYER + +/obj/structure/component/tent_canvas/CanPass(atom/movable/mover, turf/target, height, air_group) + . = ..() + if(icon_state == "canvas") + return TRUE //Non-directional, always allow passage + if(get_dir(loc, target) & dir) + return !density + return TRUE + +/obj/structure/component/tent_canvas/CheckExit(atom/movable/O, turf/target) + . = ..() + if(icon_state == "canvas") + return TRUE //Non-directional, always allow passage + if(get_dir(O.loc, target) & dir) + return !density + return TRUE + +/obj/structure/component/tent_canvas/MouseDrop(over_object, src_location, over_location) + ..() + if(use_check(usr) || !Adjacent(usr)) + return + part_of.disassemble(2 SECONDS, usr, src) + +/obj/structure/component/tent_canvas/roof + plane = ROOF_PLANE + +//Pre-fabricated tents for mapping +/obj/effect/tent + name = "Pre-frabricated expedition tent" + icon = 'icons/effects/map_effects.dmi' + icon_state = "portal_side_a" + var/builds = /obj/item/tent + +/obj/effect/tent/Initialize(mapload, ...) + . = ..() + var/obj/item/tent/tent_item = new builds(src) + var/datum/large_structure/tent/tent = new /datum/large_structure/tent(src) + tent_item.my_tent = tent + tent_item.setup_my_tent(dir, get_turf(src)) + tent.get_target_turfs(null, TRUE) + tent.build_structures() + qdel(tent_item) + qdel(src) + +/* + Sleeping bags +*/ +/obj/item/sleeping_bag + name = "sleeping bag" + desc = "A rolled up sleeping bag, ready to be taken on a camping trip." + desc_extended = "This item can be attached to a backpack." + icon = 'icons/obj/item/camping.dmi' + icon_state = "sleepingbag" + item_state = "sleepingbag" + contained_sprite = TRUE + w_class = ITEMSIZE_LARGE + +/obj/item/sleeping_bag/Initialize(mapload, ...) + . = ..() + if(!color) + color = pick(COLOR_NAVY_BLUE, COLOR_GREEN, COLOR_MAROON, COLOR_VIOLET, COLOR_OLIVE, COLOR_SEDONA) + +/obj/item/sleeping_bag/afterattack(obj/target, mob/user, proximity) + . = ..() + if(!proximity) + return + var/turf/T = target + if(istype(T)) + unroll(T, user) + +/obj/item/sleeping_bag/attack_self(mob/user) + . = ..() + var/turf/T = get_turf(user) + if(istype(T)) + unroll(T, user) + +/obj/item/sleeping_bag/MouseDrop(over_object, src_location, over_location) + . = ..() + if(use_check(usr) || !Adjacent(usr)) + return + var/turf/T = get_turf(src) + if(istype(T)) + unroll(T, usr) + +/** + * Creates sleeping bag structure on the target turf, deleting this item in the process + */ +/obj/item/sleeping_bag/proc/unroll(var/turf/target, var/mob/user) + user.visible_message(SPAN_NOTICE("\The [user] unrolls \the [src].")) + var/obj/structure/bed/sleeping_bag/S = new /obj/structure/bed/sleeping_bag(target, MATERIAL_CLOTH) + S.color = color + qdel(src) + +/obj/item/sleeping_bag/mining + color = COLOR_DARK_BROWN + +/obj/structure/bed/sleeping_bag + name = "sleeping bag" + desc = "A bag for sleeping in. Great for trying to pretend you're somewhere more comfortable than you really are." + icon = 'icons/obj/item/camping.dmi' + icon_state = "sleepingbag_floor" + base_icon = "sleepingbag_floor" + density = FALSE + anchored = FALSE + buckling_sound = 'sound/items/drop/cloth.ogg' + held_item = /obj/item/sleeping_bag + can_dismantle = FALSE + can_pad = FALSE + +/obj/structure/bed/sleeping_bag/update_icon() + return + +/obj/structure/bed/sleeping_bag/buckle(mob/living/M) + . = ..() + var/image/I = overlay_image(icon, "[base_icon]_top", color) + M.AddOverlays(I) + +/obj/structure/bed/sleeping_bag/unbuckle() + if(buckled) + buckled.update_icon() + . = ..() + +/obj/structure/bed/sleeping_bag/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) + . = ..() + if(use_check(usr) || !Adjacent(usr)) + return + if(!ishuman(usr) && (!isrobot(usr) || isDrone(usr))) //Humans and borgs can roll, but not drones + return + if(buckled) + to_chat(usr, SPAN_WARNING("You can't roll up \the [src] while someone is sleeping inside.")) + return + var/obj/item/sleeping_bag/S = new held_item(get_turf(src)) + S.color = color + usr.visible_message(SPAN_NOTICE("\The [usr] rolls up \the [src].")) + qdel(src) + +/* + Folding Tables +*/ +/obj/item/material/folding_table + name = "folding table" + desc = "A temporary surface, for when you need a table, but only for a little while." + icon = 'icons/obj/item/camping.dmi' + icon_state = "table_folded" + item_state = "table_folded" + contained_sprite = TRUE + default_material = MATERIAL_ALUMINIUM + +/obj/item/material/folding_table/attack_self(mob/user) + if(use_check(user) || !Adjacent(user)) + return + deploy(get_turf(user), user.dir, user) + +/obj/item/material/folding_table/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(use_check(user) || !Adjacent(user)) + return + if(isturf(target)) + deploy(target, user.dir, user) + +/obj/item/material/folding_table/proc/deploy(var/turf/T, var/direction, var/mob/user) + new /obj/structure/table/rack/folding_table(T) + user.visible_message(SPAN_NOTICE("\The [user] sets up \the [src].")) + qdel(src) + +/obj/structure/table/rack/folding_table + name = "folding table" + desc = "A temporary surface, for when you need a table, but only for a little while." + icon_state = "camping_table" + table_mat = MATERIAL_ALUMINIUM + +/obj/structure/table/rack/folding_table/dismantle(obj/item/wrench/W, mob/user) + return FALSE + +/obj/structure/table/rack/folding_table/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) + . = ..() + if(use_check(usr) || !Adjacent(usr)) + return + if(!ishuman(usr) && (!isrobot(usr) || isDrone(usr))) //Humans and borgs can collapse, but not drones + return + new /obj/item/material/folding_table(get_turf(src)) + usr.visible_message(SPAN_NOTICE("\The [usr] collapses \the [src].")) + qdel(src) + +/obj/item/material/stool/chair/folding/camping + default_material = MATERIAL_ALUMINIUM diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index c6cf0e8b505..fbeae0dcabc 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -24,6 +24,14 @@ allow_quick_empty = TRUE empty_delay = 0.5 SECOND var/straps = FALSE // Only really used for the verb. + /** + * References a sleeping bag attached to this bag. Should convert this to use accessories later, but that means making backpacks clothing. + */ + var/obj/item/sleeping_bag/attached_bag + /** + * Suffix used for overlays with an attached sleeping bag, because satchels are at people's sides while other bags are on people's backs. + */ + var/attached_icon = "backpack" /obj/item/storage/backpack/Initialize() . = ..() @@ -31,6 +39,10 @@ alpha_mask = "normal" verbs += /obj/item/storage/backpack/proc/adjust_backpack_straps +/obj/item/storage/backpack/Destroy() + QDEL_NULL(attached_bag) + . = ..() + /obj/item/storage/backpack/proc/adjust_backpack_straps() set name = "Adjust Bag Straps" set desc = "Adjust your bag straps." @@ -79,6 +91,44 @@ return 0 return 1 +/obj/item/storage/backpack/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/sleeping_bag) && !attached_bag && ishuman(user)) + var/mob/living/carbon/human/H = user + attached_bag = attacking_item + update_icon() + if(H.back == src) + H.update_inv_back() // Add overlay to backpack if on back + H.drop_from_inventory(attached_bag) + attached_bag.loc = null + return + return ..() + +/obj/item/storage/backpack/update_icon() + . = ..() + ClearOverlays() + if(attached_bag) + var/image/I = overlay_image(attached_bag.icon, "[attached_bag.icon_state]_[attached_icon]", attached_bag.color) + AddOverlays(I) + +/obj/item/storage/backpack/get_mob_overlay(mob/living/carbon/human/H, mob_icon, mob_state, slot, main_call) + var/image/I = ..() + if(slot == slot_back_str && attached_bag) + var/image/over = overlay_image(attached_bag.icon, "[attached_bag.icon_state]_[attached_icon]_ba", attached_bag.color) + I.AddOverlays(over) + return I + +/obj/item/storage/backpack/AltClick(mob/usr) + if(attached_bag && ishuman(usr)) + var/mob/living/carbon/human/H = usr + H.put_in_hands(attached_bag) + attached_bag = null + update_icon() + if(H.back == src) + H.update_inv_back() + return + return ..() + + /* * Backpack Types */ @@ -333,6 +383,7 @@ icon_state = "satchel" item_state = "satchel" straps = TRUE + attached_icon = "satchel" /obj/item/storage/backpack/satchel/leather/withwallet/New() ..() @@ -927,6 +978,7 @@ contained_sprite = FALSE sprite_sheets = list(BODYTYPE_VAURCA = 'icons/mob/species/vaurca/back.dmi', BODYTYPE_VAURCA_BULWARK = 'icons/mob/species/bulwark/back.dmi') var/hooded = FALSE + var/cape_backing_state = "cape_backing" /obj/item/storage/backpack/cloak/verb/toggle_cloak_hood() set name = "Toggle Cloak Hood" @@ -945,7 +997,7 @@ /obj/item/storage/backpack/cloak/get_mob_overlay(var/mob/living/carbon/human/human, var/mob_icon, var/mob_state, var/slot) var/image/I = ..() - var/image/cape_backing = image(mob_icon, null, "[initial(icon_state)]_backing", MOB_SHADOW_LAYER) + var/image/cape_backing = image(mob_icon, null, "[icon_state]_backing", MOB_SHADOW_LAYER) I.AddOverlays(cape_backing) return I diff --git a/code/game/objects/structures/crates_lockers/closets/secure/operations.dm b/code/game/objects/structures/crates_lockers/closets/secure/operations.dm index 4384a2c5a2e..06e08e1e8cd 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/operations.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/operations.dm @@ -102,6 +102,7 @@ new /obj/item/clothing/head/hardhat/orange(src) new /obj/item/device/radio(src) new /obj/item/device/flashlight/lantern(src) + new /obj/item/sleeping_bag/mining(src) // Merchant /obj/structure/closet/secure_closet/merchant diff --git a/code/game/objects/structures/large.dm b/code/game/objects/structures/large.dm new file mode 100644 index 00000000000..8bb9d198ea3 --- /dev/null +++ b/code/game/objects/structures/large.dm @@ -0,0 +1,167 @@ +/* + * # Large Structure + * + * This datum controls a large, multi-tile structure, capable of being assembled or disassembled as a unit (i.e. tents). + */ +/datum/large_structure + /** + * Name of this structure + */ + var/name = "structure" + /** + * Turfs this structure exists on + */ + var/list/turf/target_turfs = list() + /** + * Structures that are part of this structure + */ + var/list/obj/structure/component/grouped_structures = list() + /** + * Mobs assembling or disassembling this structure + */ + var/list/mob/interacting = list() + /** + * A list of the stages required to assemble or disassemble the large structure. Format: "string" = STAGE + */ + var/list/stages = list() + /** + * The smaller structure which makes up this large one + */ + var/component_structure + /** + * The type item used to set up this structure in the first place, made on disassembly + */ + var/source_item_type + /** + * The item used to set up this structure, deleted after assembly + */ + var/obj/item/source_item + /** + * The turf this structure started from. Used to check if the source_item building this has moved. + */ + var/turf/origin + var/color + var/dir + var/x1 + var/x2 + var/y1 + var/y2 + var/z1 + var/z2 + +/** + * Returns the first stage with value `type` + */ +/datum/large_structure/proc/get_next_stage(var/type) + for(var/stage in stages) + if(stages[stage] == type) + return stage + +/datum/large_structure/proc/assemble(var/time_per_structure, var/mob/user) + if(user in interacting) + to_chat(user, SPAN_INFO("You are already working on assembling \the [src].")) + return FALSE + + var/stage_to_do = get_next_stage(STAGE_DISASSEMBLED) + + if(!stage_to_do) + to_chat(user, SPAN_INFO("There is no more work to be done assembling \the [src].")) + return FALSE + + + if(!LAZYLEN(target_turfs)) + get_target_turfs(user) + + interacting += user + + user.visible_message(SPAN_NOTICE("\The [user] begins assembling \the [src]'s [stage_to_do].")) + stages[stage_to_do] = STAGE_PROGRESS + if(!do_after(user, time_per_structure * LAZYLEN(target_turfs))) + stages[stage_to_do] = STAGE_DISASSEMBLED + return + user.visible_message(SPAN_NOTICE("\The [user] finishes assembling the [stage_to_do].")) + stages[stage_to_do] = STAGE_ASSEMBLED + + interacting -= user + + if(get_next_stage(STAGE_DISASSEMBLED)) //Still work to do + assemble(time_per_structure, user) + return FALSE + + if(get_next_stage(STAGE_PROGRESS)) //Still work being done + return FALSE + + build_structures() + QDEL_NULL(source_item) + return TRUE + +/datum/large_structure/proc/get_target_turfs(var/mob/user, var/force = FALSE) + target_turfs = block(x1,y1,z1,x2,y2,z2) + for(var/turf/T in target_turfs) + if(!(istype(T) || force)) + to_chat(user, SPAN_ALERT("You cannot set up \the [src] here. Try and find a big enough solid surface.")) + return FALSE + +/datum/large_structure/proc/build_structures() + for(var/turf/T in target_turfs) + var/obj/structure/component/C = new component_structure(T) + C.part_of = src + C.color = color + grouped_structures += C + RegisterSignal(T, COMSIG_ATOM_ENTERED, PROC_REF(structure_entered), override = TRUE) + +/datum/large_structure/proc/disassemble(var/time_per_structure, var/mob/user) + if(user in interacting) + to_chat(user, SPAN_INFO("You are already working on disassembling \the [src].")) + return FALSE + + var/stage_to_do = get_next_stage(STAGE_ASSEMBLED) + + if(!stage_to_do) + to_chat(user, SPAN_INFO("There is no more work to be done disassembling \the [src].")) + return FALSE + + interacting += user + + user.visible_message(SPAN_NOTICE("\The [user] begins disassembling \the [src]'s [stage_to_do].")) + stages[stage_to_do] = STAGE_PROGRESS + if(!do_after(user, time_per_structure * LAZYLEN(grouped_structures))) + stages[stage_to_do] = STAGE_ASSEMBLED + return FALSE + user.visible_message(SPAN_NOTICE("\The [user] finishes disassembling the [stage_to_do].")) + stages[stage_to_do] = STAGE_DISASSEMBLED + + interacting -= user + + if(get_next_stage(STAGE_ASSEMBLED)) //Still work to do + return disassemble(time_per_structure, user) + + if(get_next_stage(STAGE_PROGRESS)) //Still work being done + return + + QDEL_LIST(grouped_structures) + + var/obj/item/I = new source_item_type(get_turf(user)) + I.color = color + qdel(src) + return TRUE + +/datum/large_structure/proc/structure_entered(var/turf/entry_point, var/atom/movable/entering) + if(!isliving(entering)) + return FALSE + RegisterSignal(entering, COMSIG_MOVABLE_MOVED, PROC_REF(mob_moved), override = TRUE) + return TRUE + +/datum/large_structure/proc/mob_moved(var/mob/mover) + if(!(get_turf(mover) in target_turfs)) + UnregisterSignal(mover, COMSIG_MOVABLE_MOVED) + return FALSE + return TRUE + +/obj/structure/component + var/datum/large_structure/part_of + +/obj/structure/component/Destroy() + if(part_of) + part_of.grouped_structures -= src + return ..() diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 52b1e861c62..3a551be472f 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -561,10 +561,13 @@ var/const/enterloopsanity = 100 /turf/proc/is_outside() // Can't rain inside or through solid walls. - // TODO: dense structures like full windows should probably also block weather. if(density) return OUTSIDE_NO + for(var/obj/structure/S in src) // Dense structures like full windows should probably also block weather. + if(S.density || istype(S, /obj/structure/component/tent_canvas)) + return OUTSIDE_NO + if(last_outside_check != OUTSIDE_UNCERTAIN) return last_outside_check diff --git a/code/modules/research/xenoarchaeology/misc.dm b/code/modules/research/xenoarchaeology/misc.dm index 3ce7a0d802e..f58fc6dd655 100644 --- a/code/modules/research/xenoarchaeology/misc.dm +++ b/code/modules/research/xenoarchaeology/misc.dm @@ -99,6 +99,7 @@ new /obj/item/device/hand_labeler(src) new /obj/item/ore_detector(src) new /obj/item/device/spaceflare(src) + new /obj/item/tent(src) // 2 Drills new /obj/item/pickaxe/drill(src) diff --git a/html/changelogs/camping.yml b/html/changelogs/camping.yml new file mode 100644 index 00000000000..9662d921e25 --- /dev/null +++ b/html/changelogs/camping.yml @@ -0,0 +1,8 @@ +author: Sparky_hotdog + +delete-after: True + +changes: + - rscadd: "Added tents, which can be set up individually, or as a team with greater efficiency, and provide shelter from the weather. There is one tent in each excavation tools locker, one in the Intrepid hangar, one in the Spark, and two larger tents in the Intrepid." + - rscadd: "Added sleeping bags, which can be attached to bags for ease of carrying. Four are available in the Intrepid hangar, and one in each miner's locker." + - rscadd: "Added foldable tables. Added a foldable table to the Intrepid hangar, along with four folding chairs." diff --git a/icons/obj/item/camping.dmi b/icons/obj/item/camping.dmi new file mode 100644 index 0000000000000000000000000000000000000000..0f3a84ea3053d628d050d7cf09d96eb93679fecb GIT binary patch literal 4984 zcmbVPXIvA_w@zrGNC}`IL_&`Suh03t<2=^aIyk={X+ z-U12)NTfrM-ix%m-uHgEU+(|I-QVx*?9R@d**WJt&p8umiq>ak=3@qdK&%GWQ8$2g z@~<#50CzrV=P96>3N*jtje3Z&_j>%q`>}^R2;`rdHek&BO_qax(g*WWdvAK8l0W}C zPvCP|w~xlM#)fhWJNF~*pbQpe!qy&k)QiGm^8U~a)tpmi9`J{VF5h-BqeR=WiY`}X z_d5jk68~{n%6Ec^+^UVhVnE$oB4oWw2Fe9LozozD61ktAkG^GC~b59)RkXN zF8q$XkahjmRZemDOL#p2v!X2XR$T`}dOkZlr=L37QO$JhNpg%qi_==o7&irf<`%jz zo&muR&v9ziml8idEfIKX^ctx|ce7PdL8X7Gzp?ALchgSe9_9BjR-i>ZZB@fyZy_XO zZ*^R`qN&M5l}skft8_oGwnlf3SyYh~Rnyp@&^a%Jd)qN#WCt{QfAO zE1!P;HYJdRg|dyr$M~n+dEly?(rZYjMn$oZiKjbDB;D?)sHkBQtMo**r@hl? zpcS#NZ|r>rk?IEbs3M2$wil}Bd3|(+4_y~~D=3t0O;Fyyr}*ySEy=Ua3VdCa(lj^E zErm(@)2AvTiy+mvag4)Xea6x&>NCMq^O#+5V)q=wsd9?3#+2eciQS*7s!$__+H=02Dh{-{P3U{KEz;~sv3U(w0BmK71wAkY2 zusXM~2_|XI>#o6F^xW;jp{!K&rFVwrm(M}Kd}m!U8MQHAGr{ z`YwV+VWXO3!BD~A-Wmf!U~BdK+DaB9-`$M~PbdwI`mjBbGwI~{UURoLICy$FMGxCZGoB)XuqjE(c$J_(i0 z-xy_i3Fxk|k};Ql-97gr+0V8rOKldH{5HVW)9O$uQJVE znF8S+P3&2wa$mXM$^r0*IZ*4 z<#hp#j~CRFo(e?{G-kuNCD1Lr%Gi`#vuKF!GgzDks8}P@S9h;-QeoC6{yU9c=O4{u zCD9dhb>TAoHDE5qAlps_Ddlorbr6T&hjNCd)Ufsxa(W>j4fmZLO;8PZhsaNpMdw+f zR)$@bAhA1v4b5NceWhcqWb$0SU1xDUJ=7Dqq*p&|`ypE^IUd{hE;3wzQ`zJAK*;I>lkjIh_hj1 zq-nbCv%*lt`t_aP+1jCE^b#h3N&gccRo*I>=A zDB#D|k@j>UX6w-M6r_Dzh>?VFKl~l2mAQjCm%T`fWbJr$sGfO~HIrp^>nkJj5d~qx zeG}Yr-V50)2$^k7r(M*PQ`+koq#!1jmy62Rb6N8UX{iod+=9oJPCI22e&d z2AM}e@c=#Hus9w+wg`~J{GO#L0S6O@3?>zA;k0RQAVGlbI{<$g0k$IVe!J##RnlzT z+H^^sYFFCpT)}5>rKo2!r#6so`teIO2vd+&^1(%!E$?o#DH*ufckchTXTu(+jgGM( z1UxC<8gh{t=@{7y28(GgZp^eVlY|%=uxoi4SibYu^GHhrw;zO@?L3Z<>!voIJL@k9 zp|fcLc7&A{S^zvx*MB~U?K-zQyQ@-4CE`xLIdd?a-|xWM{s#;O@ z;qmgLH9;T1Q8@q}07sh#^@N9clkD;_Owf||YgIfd3EjZLm2TK6 zA?J$M^;Z(Q4+7m}5^|!WS%cfIhVy&b7XZJRZ=S7}b9KAgXVf5PAoE7P1KFNsW8bs^=S7Re+{>|RDkjI9wQ=uNN60z{ z1RyG^svJ91^v7J49s_TK+HZhyRx+4= zpkyQT^w^KWzF_0w;j#WJ;-c}D;hk>`@PT!DaI~Hn_N*P1! zy>R2i9UR;X`DAcu$BLj4Eqv>+$hmGAA+Q=BOYlr4SedVs6|9s}aXdUcS$ZEUyPLCN z=kHk@7%bb;1;o+P$l4LX(8NsnT^I+_@#ZiRnw<=1rQO2!ai-8FuklV+55KMpPCO%_ zzzW{4Z*QOlsp^7gWOe?7eCrtD;79L$Os1N8TZ(toT4Ut&n81uB{VTrFLqoU7R9`>8 zXdnQ+?g1a|(n|a+X{=b7mr-A=tgXj1wdCb>fnut>vU0u}9p~ft=#i73AE{EzwZihV z;$>*Vj{kUqPS(06)EODURP~jU7(kyf;j@y?6}GoNr7I+)s-f}WUX?p*y0WxMkh)1; zULFdyJ=^)VDg*mR0t!7o-kbOtdbH6_j@3Hx|8u(enfdv*Lq=r8bG;mG-x>D;$?l>d z=kr4A4khE+kJvQjxA8ickF?$rHoc0%J`3$foYZMq3}W3)X?0vj=%=bHvX@s5cE*EF z7M17(T3#w5d%)beFSwWV&OWgf1clvin#fc37$4E}TN~F95*iyF&3gCl>;tkqVX6EV zwu#`%cpBJ%&IsO&B#hsf#erUlDS>|eE+-wNUaykRFUl}UB)VX+nzsm~3mF8UERjjL zPhu){Z?MigI0$$sK7D#Xg-Jx=pZO7m zg@suUt(a&nrMQ{%)6y=?kUg3%1RgCfyB5vW`K|q!ni34zp9=qpLXij$LZ$FT*t2Ru z9^CjZ_Wc8D2Kz-d1R|@Zrl!9;JUrav8i*5`mXXoafIa@R{UG#s$AS_U1)`IUoR0B_ z2BVztG-o8ZnP2ZNXLB*&pfnu+r@VFnX@;I0Ego!9Z@Vw4Jg%_3U2GvW=mPeh@)tEK z9ICAiJw5RzkaCWXkF^CtHd=Ys)Ee4gMS!c*#DrAU)$8RR1k!@m{H=+7dJX}>?gLUS~v2r__DC03px5D2rH z09*^E7~G!U3gkQ|clVe+B2m|a*5(JjJDvfkD8F9l15m8P#`u---(nE-N>=R5{*M)3 z$kVeA%SPi#r9EDU$5cL*4^S%q3)vFb3$yjz83+xKvGT^?*;prNCqqqo05uXE8gm$L8(fB^jBJe~!} z7|gZz4h#%T>OTZ9F;@ZGIcbgFSFhJ(`2gNuA~gK~Ffj>Is5P|EP|FpUJiR1NY~HTw=I3KlTu-5JG zTO;z0{VkD1m!>Hu4TJ8eyMPR43%MAY=`!^$W00Wx0w6H2;D3$+cT!N0TM z2f-I_o8J`x*+wun5}Hmd7kvTB(+3h91O5qba;B_~?|S~&ya@6yi*s?qiU|aEX%9Cy ziIB7y4xEikNJv`a!90I*N(z5qk5u9?iS*db&FxFDm)G=?54y6llHr2R($Z215&m@b z3JnKLBjk_w>{YY6yR=|B%B!d=ORD)ci=)JTw|py2V`E#E5+2Pz;V7H?DR5 zJcM#HKvgc0=}RAko*Yp7Pd$0OL!mg?>EYsg9Pax=z>LBud3m<3IWK1q58|bS?vgc}Aaf(I5bx&p@0+ACR~V2- zJ{#Y$<#rcXr%@!ESl;00RJ(E|E#%Hlt;G@A!Udz+O0gNlg&?G3zBB^dU_jbYgOfpz3EgP(5~ykX*El2 zQ{()Lb+ri}*ryRvbx-W-Ew=f`CKn%o89~mISR_b~@qa`G%5Hhj%F00+t_Ym>=>8w_ zph`FrK`gS@OQ!0S1zC&bg+%a=ZjFliVCyf%&^Q0CHu^@Lt7D*yjPM4yK7Jhe{{4H` zjGKZ5UTr1i%b zo0m+_sWq|W(iNw)>vG0Mn=1ZQb7tca5FL&+L9>F3n|L`QJ5T#cev8lL#Mt)S^My=& zdp5Yvgl+pLMIfWDcr)3WH`p^VznHjoARK$_R=dHz2FY;tcAY1U`fcMBig&O~K@GV@ zlbiYZ^)8n0>RPFYCm3jigT8MC7}v%vrW0tiV&K~#90?U_Mt zfR zCvCl&T$s3T8`0J?=B0v%%_lH=9)3k$8Z^(q;MEDH`|z{*6eiEYgoml{(zc$d$$1Im zL0eD16BUB%tl9IGBPjj?0qcQ2z~C`ibFKc#-$FqDK=W4+;B0B09+1~N z#RC9Nkc+AN=Rx<+L~=m)Z>G)z$P0`sSR-}5P9!dM$%}3Ba-ZCAkXs&d(?xIlsEsGN z^(8moD zFc|srDL;CU@n~1swKaJ)K)5m%>MrwT#Ong|J}(w7-_^BozNM%yCY?VG$npVMb3n5{ z7K@vu`4qz}sxKz3R|7`#?DryN`%zth-m7A9vh&}RZR?6j@6~|fjZzn&_g7Gjy>hXv zY&|_-P<~|XY&|_-QGRSMZ9O@Ff0SQckHXH=1IVv;000000001};|I7=b99xDgRB4m N002ovPDHLkV1koJM-2b~ literal 0 HcmV?d00001 diff --git a/icons/obj/structure/tables/table.dmi b/icons/obj/structure/tables/table.dmi index 19efabc5e484a7c1c5641c65be018c5e338d3db8..9424edeeb41f8642cd6805e967e421dcfa488db6 100644 GIT binary patch literal 19544 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�@Xyr{ENwaD?2vC(e! z{Wej>7;wx>M)B{<|9kQ-Pao?5}ubeB}Ca<_YRaRiAA!SXC5#$rLOrOq%!x%XOZAfHeP1HN(O9KXH-wfavS09g<`S)K#fih-OYx- z4{^8J#NA)d155y$9y`wl7JqwgU+}D(QXw?u*|lKF_+^)`E!Ao5VU+q}72Avpg($f9b ze{apU&F}vDJ34IF$^J!?6ogAxDJdH}cBkzBu}}(F3FzdKCWR!lePuWHxx|CGE)_M^m~2Uj0#jzv63FuciRwHttb!e@Y&_->hP<6{wk1<1_L0x0&C96BaLCT)X>v zRqUS%t~FAhj>TWB?K)Ww6rAYyY4LB7yY~OZ<9oa6zU&qM>QNQ+bN_Gu|0ie7|NpoC zhriqZb*KJc|NlyR<*^eh>iKsSh!rYskF{I1{>|-_bt*}>I48XS_U>->Zr}{pf|Thu z*D(M$A>M>6U?Ya?(P_O1Y@!KHOxv89RLpED#VaV7Hi?aaVP}e8L&&DZz%3k^CQ?Sg zF3Z;{+soUQEnDWI^1CVw)R@oOngXl>gHBFx3IgsCV>>y80aRcE+xI6O0V+}15W0NVQi>Y5)rcCD9F zD;PM84P-94nlX zI%a12w`3SIDuURR2Er!5bs>ElSzf%jxOla&v{)u^i5zgXa#V#S(4o74A+_)syU@fK z&wzQ~3x0DmFg!^u(KVQub2{otB$xBvcFFmS3=VN_LJEQtfjcjzeDe779h2d zl$5XKU#srk%H8ns<44m{;EKhBI^cA^K>%n5@rR6m1#l~ei4?CTaJk^eQ(qUIng#9< zZd}*5G!z(t6)S;DC$^d|%CiM-Sb3Yfbm1g9;gjd??X4~~2ZoN#=l{&l9vqMnd^tNE Qn8X-7UHx3vIVCg!08WVf;s5{u literal 18281 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 diff --git a/maps/sccv_horizon/sccv_horizon-1_deck_1.dmm b/maps/sccv_horizon/sccv_horizon-1_deck_1.dmm index c553428ba0f..97ba6f189f3 100644 --- a/maps/sccv_horizon/sccv_horizon-1_deck_1.dmm +++ b/maps/sccv_horizon/sccv_horizon-1_deck_1.dmm @@ -15444,6 +15444,20 @@ /obj/effect/map_effect/window_spawner/full/reinforced/grille/firedoor, /turf/simulated/floor/tiled/dark/full, /area/hangar/intrepid) +"kHa" = ( +/obj/item/tent, +/obj/item/sleeping_bag, +/obj/item/sleeping_bag, +/obj/item/sleeping_bag, +/obj/item/sleeping_bag, +/obj/structure/closet/crate, +/obj/item/material/stool/chair/folding/camping, +/obj/item/material/stool/chair/folding/camping, +/obj/item/material/stool/chair/folding/camping, +/obj/item/material/stool/chair/folding/camping, +/obj/item/material/folding_table, +/turf/simulated/floor/plating, +/area/hangar/intrepid) "kHg" = ( /obj/structure/cable/green{ icon_state = "1-2" @@ -27770,6 +27784,7 @@ pixel_y = -2 }, /obj/item/clothing/mask/breath, +/obj/item/tent/big/scc, /turf/simulated/floor/lino, /area/shuttle/intrepid/quarters) "tgR" = ( @@ -29179,6 +29194,7 @@ /obj/item/material/hatchet/machete/steel, /obj/item/clothing/accessory/holster/utility/machete, /obj/item/clothing/accessory/holster/utility/machete, +/obj/item/tent/mining, /turf/simulated/floor/tiled/dark, /area/shuttle/mining) "ucG" = ( @@ -29208,6 +29224,7 @@ dir = 4 }, /obj/effect/floor_decal/industrial/outline/engineering, +/obj/item/tent/big/scc, /turf/simulated/floor/carpet/rubber, /area/shuttle/intrepid/crew_compartment) "udC" = ( @@ -56985,7 +57002,7 @@ aEl kLb qeD rPN -iRC +kHa iRC iRC iRC