diff --git a/_maps/map_files/templates/shelter_2.dmm b/_maps/map_files/templates/shelter_2.dmm
new file mode 100644
index 00000000000..4ba11cef609
--- /dev/null
+++ b/_maps/map_files/templates/shelter_2.dmm
@@ -0,0 +1,41 @@
+"a" = (/turf/simulated/wall/survival,/area/survivalpod)
+"b" = (/obj/structure/sign/mining/survival{dir = 8},/turf/simulated/wall/survival,/area/survivalpod)
+"c" = (/obj/machinery/smartfridge/survival_pod/loaded,/turf/simulated/floor/pod,/area/survivalpod)
+"d" = (/turf/simulated/floor/pod,/area/survivalpod)
+"e" = (/obj/machinery/door/window/survival_pod{dir = 1},/turf/simulated/floor/carpet/black,/area/survivalpod)
+"f" = (/obj/machinery/light,/turf/simulated/floor/carpet/black,/area/survivalpod)
+"g" = (/obj/structure/sign/mining/survival{tag = "icon-survival (NORTH)"; icon_state = "survival"; dir = 1},/turf/simulated/wall/survival,/area/survivalpod)
+"h" = (/obj/structure/fans,/turf/simulated/floor/pod,/area/survivalpod)
+"i" = (/obj/machinery/sleeper/survival_pod,/turf/simulated/floor/pod,/area/survivalpod)
+"j" = (/obj/structure/table/survival_pod,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/brute{pixel_x = 4; pixel_y = -2},/turf/simulated/floor/pod,/area/survivalpod)
+"k" = (/obj/structure/table/wood/fancy/black{pixel_y = -9},/obj/structure/window/reinforced/survival_pod{dir = 1},/obj/machinery/microwave,/turf/simulated/floor/carpet/black,/area/survivalpod)
+"l" = (/obj/structure/sink/kitchen{dir = 4; pixel_x = -11},/turf/simulated/floor/carpet/black,/area/survivalpod)
+"m" = (/obj/structure/sign/mining/survival,/turf/simulated/wall/survival,/area/survivalpod)
+"n" = (/obj/structure/curtain/black,/obj/machinery/shower{pixel_y = 20},/turf/simulated/floor/pod{pixel_y = 0},/area/survivalpod)
+"o" = (/obj/structure/window/reinforced/survival_pod{dir = 8},/obj/machinery/door/window/survival_pod{dir = 1},/turf/simulated/floor/carpet/black,/area/survivalpod)
+"p" = (/obj/structure/window/reinforced/survival_pod{dir = 8},/turf/simulated/floor/carpet/black,/area/survivalpod)
+"q" = (/obj/structure/window/reinforced/survival_pod{dir = 9},/turf/simulated/floor/carpet/black,/area/survivalpod)
+"r" = (/turf/simulated/floor/carpet/black,/area/survivalpod)
+"s" = (/obj/item/device/gps/computer,/turf/simulated/floor/pod,/area/survivalpod)
+"t" = (/obj/structure/stool/bed/pod,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor/pod,/area/survivalpod)
+"u" = (/obj/structure/tubes,/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/pod,/area/survivalpod)
+"v" = (/obj/structure/window/reinforced/survival_pod{dir = 1},/obj/structure/displaycase{desc = "A display case containing an expensive forgery, probably."; locked = 1; pixel_y = -4; req_access_txt = "48"; start_showpiece_type = /obj/item/fakeartefact},/turf/simulated/floor/carpet/black{dir = 1},/area/survivalpod)
+"w" = (/obj/structure/fans/tiny,/obj/machinery/door/airlock/survival_pod,/turf/simulated/floor/pod,/area/survivalpod)
+"x" = (/obj/structure/sign/mining/survival{tag = "icon-survival (EAST)"; icon_state = "survival"; dir = 4},/turf/simulated/wall/survival,/area/survivalpod)
+"y" = (/obj/structure/toilet/secret{pixel_y = 12},/turf/simulated/floor/pod,/area/survivalpod)
+"z" = (/obj/structure/window/reinforced/survival_pod{dir = 1},/obj/item/cardboard_cutout{desc = "A cardboard cutout of a xenomorph maid."; icon_state = "cutout_lusty"; name = "lusty xenomorph maid"}, /turf/simulated/floor/carpet/black,/area/survivalpod)
+"A" = (/obj/structure/table/wood/fancy/black,/obj/machinery/light{dir = 4},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 6; pixel_y = 3},/obj/item/weapon/reagent_containers/food/drinks/bottle/wine,/turf/simulated/floor/carpet/black,/area/survivalpod)
+"B" = (/obj/structure/table/wood/fancy/black,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = -4; pixel_y = 1},/obj/effect/spawner/lootdrop/three_course_meal,/turf/simulated/floor/carpet/black,/area/survivalpod)
+"C" = (/obj/structure/stool/bed/chair/comfy/black{dir = 1},/turf/simulated/floor/carpet/black,/area/survivalpod)
+"D" = (/obj/structure/sign/mining,/turf/simulated/wall/survival,/area/survivalpod)
+
+(1,1,1) = {"
+agagaga
+bhcsnyx
+aidtoza
+bjdupAx
+akevqBa
+blfrrCx
+amawaDa
+"}
+
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index 7045a06a875..ebfd177959e 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -198,3 +198,27 @@
/obj/item/weapon/gun/energy/kinetic_accelerator = 1,
/obj/item/pizzabox = 3,
)
+
+/obj/effect/spawner/lootdrop/three_course_meal
+ name = "three course meal spawner"
+ lootcount = 3
+ lootdoubles = FALSE
+ var/soups = list(
+ /obj/item/weapon/reagent_containers/food/snacks/beetsoup,
+ /obj/item/weapon/reagent_containers/food/snacks/stew,
+ /obj/item/weapon/reagent_containers/food/snacks/hotchili,
+ /obj/item/weapon/reagent_containers/food/snacks/nettlesoup,
+ /obj/item/weapon/reagent_containers/food/snacks/meatballsoup)
+ var/salads = list(
+ /obj/item/weapon/reagent_containers/food/snacks/herbsalad,
+ /obj/item/weapon/reagent_containers/food/snacks/validsalad,
+ /obj/item/weapon/reagent_containers/food/snacks/aesirsalad)
+ var/mains = list(
+ /obj/item/weapon/reagent_containers/food/snacks/enchiladas,
+ /obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat,
+ /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger,
+ /obj/item/weapon/reagent_containers/food/snacks/superbiteburger)
+
+/obj/effect/spawner/lootdrop/three_course_meal/New()
+ loot = list(pick(soups) = 1,pick(salads) = 1,pick(mains) = 1)
+ . = ..()
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index 1fec38f491b..f982c89a8c3 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -100,6 +100,11 @@
turf_type = /turf/simulated/floor/carpet
burn_state = FLAMMABLE
+/obj/item/stack/tile/carpet/black
+ name = "black carpet"
+ icon_state = "tile-carpet-black"
+ turf_type = /turf/simulated/floor/carpet/black
+
//Plasteel
/obj/item/stack/tile/plasteel
name = "floor tiles"
diff --git a/code/game/objects/items/weapons/table_rack_parts.dm b/code/game/objects/items/weapons/table_rack_parts.dm
index 684dbc688a1..7655fba3605 100644
--- a/code/game/objects/items/weapons/table_rack_parts.dm
+++ b/code/game/objects/items/weapons/table_rack_parts.dm
@@ -46,6 +46,18 @@
/obj/item/stack/sheet/wood,
/obj/item/stack/sheet/wood)
+/obj/item/weapon/table_parts/wood/attackby(obj/item/W, mob/user)
+ if(istype(W, /obj/item/stack/tile/carpet))
+ var/target = /obj/item/weapon/table_parts/fancy
+ if(istype(W, /obj/item/stack/tile/carpet/black))
+ target = /obj/item/weapon/table_parts/fancy/black
+ var/obj/item/stack/S = W
+ if(S.use(1))
+ new target(get_turf(src))
+ qdel(src)
+ else
+ . = ..()
+
/obj/item/weapon/table_parts/glass
name = "glass table parts"
desc = "fragile!"
@@ -57,6 +69,17 @@
/obj/item/stack/sheet/metal,
/obj/item/stack/sheet/metal)
+/obj/item/weapon/table_parts/fancy
+ name = "fancy table parts"
+ desc = "Pretty!"
+ icon_state = "fancy_tableparts"
+ result = /obj/structure/table/wood/fancy
+
+/obj/item/weapon/table_parts/fancy/black
+ name = "black fancy table parts"
+ icon_state = "black_fancy_tableparts"
+ result = /obj/structure/table/wood/fancy/black
+
/obj/item/weapon/rack_parts
name = "rack parts"
desc = "Parts of a rack."
diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm
index 104fac7fd69..0fbc7b97879 100644
--- a/code/game/objects/structures/curtains.dm
+++ b/code/game/objects/structures/curtains.dm
@@ -35,6 +35,44 @@
icon_state = "open"
layer = SHOWER_OPEN_LAYER
+/obj/structure/curtain/attackby(obj/item/W, mob/user)
+ if(istype(W, /obj/item/toy/crayon))
+ color = input(user, "Choose Color") as color
+ else if(isscrewdriver(W))
+ if(anchored)
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] unscrews [src] from the floor.", "You start to unscrew [src] from the floor...", "You hear rustling noises.")
+ if(do_after(user, 50 * W.toolspeed, target = src))
+ if(!anchored)
+ return
+ anchored = FALSE
+ to_chat(user, "You unscrew [src] from the floor.")
+ else
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] screws [src] to the floor.", "You start to screw [src] to the floor...", "You hear rustling noises.")
+ if(do_after(user, 50 * W.toolspeed, target = src))
+ if(anchored)
+ return
+ anchored = TRUE
+ to_chat(user, "You screw [src] to the floor.")
+ else if(istype(W, /obj/item/weapon/wirecutters))
+ if(!anchored)
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] cuts apart [src].", "You start to cut apart [src].", "You hear cutting.")
+ if(do_after(user, 50 * W.toolspeed, target = src))
+ if(anchored)
+ return
+ to_chat(user, "You cut apart [src].")
+ deconstruct()
+ else
+ . = ..()
+
+/obj/structure/curtain/proc/deconstruct(disassembled = TRUE)
+ new /obj/item/stack/sheet/cloth(loc, 2)
+ new /obj/item/stack/sheet/plastic(loc, 2)
+ new /obj/item/stack/rods(loc, 1)
+ qdel(src)
+
/obj/structure/curtain/black
name = "black curtain"
color = "#222222"
@@ -59,4 +97,4 @@
color = "#000066"
#undef SHOWER_OPEN_LAYER
-#undef SHOWER_CLOSED_LAYER
\ No newline at end of file
+#undef SHOWER_CLOSED_LAYER
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 72638ff0943..158593a973f 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -105,19 +105,21 @@ var/global/list/captain_display_cases = list()
var/ue = null
var/image/occupant_overlay = null
var/obj/item/weapon/airlock_electronics/circuit
+ var/start_showpiece_type = null //add type for items on display
+
+/obj/structure/displaycase/New()
+ . = ..()
+ if(start_showpiece_type)
+ occupant = new start_showpiece_type(src)
+ update_icon()
/obj/structure/displaycase/captains_laser
name = "captain's display case"
desc = "A display case for the captain's antique laser gun. Hooked up with an anti-theft system."
- burglar_alarm = 1
-
-/obj/structure/displaycase/captains_laser/New()
- captain_display_cases += src
- req_access = list(access_captain)
+ burglar_alarm = 1
locked = 1
- spawn(5)
- occupant = new /obj/item/weapon/gun/energy/laser/captain(src)
- update_icon()
+ req_access = list(access_captain)
+ start_showpiece_type = /obj/item/weapon/gun/energy/laser/captain
/obj/structure/displaycase/Destroy()
dump()
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 55181579699..d6bec1019b2 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -412,6 +412,35 @@
/obj/structure/table/woodentable/poker/narsie_act()
return
+/*
+ * Fancy Tables
+ */
+
+/obj/structure/table/wood/fancy
+ name = "fancy table"
+ desc = "A standard metal table frame covered with an amazingly fancy, patterned cloth."
+ icon = 'icons/obj/structures.dmi'
+ icon_state = "fancy_table"
+ parts = /obj/item/weapon/table_parts/fancy
+ canSmoothWith = list(/obj/structure/table/wood/fancy, /obj/structure/table/wood/fancy/black)
+
+/obj/structure/table/wood/fancy/New()
+ icon = 'icons/obj/smooth_structures/fancy_table.dmi' //so that the tables place correctly in the map editor
+ ..()
+
+/obj/structure/table/wood/fancy/black
+ icon_state = "fancy_table_black"
+ parts = /obj/item/weapon/table_parts/fancy/black
+
+/obj/structure/table/wood/fancy/black/New()
+ ..()
+ icon = 'icons/obj/smooth_structures/fancy_table_black.dmi' //so that the tables place correctly in the map editor
+
+
+/*
+ * Glass Tables
+ */
+
/obj/structure/glasstable_frame
name = "glass table frame"
desc = "A metal frame for a glass table."
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index a43406eb3c7..d3cc48d46bf 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -120,6 +120,15 @@
to_chat(user, "You carefully place [I] into the cistern.")
return
+/obj/structure/toilet/secret
+ var/secret_type = null
+
+/obj/structure/toilet/secret/New()
+ . = ..()
+ if(secret_type)
+ var/obj/item/secret = new secret_type(src)
+ secret.desc += " It's a secret!"
+ w_items += secret.w_class
/obj/structure/urinal
diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm
index 94dc68b51f2..f4d281cdf68 100644
--- a/code/game/turfs/simulated/floor/fancy_floor.dm
+++ b/code/game/turfs/simulated/floor/fancy_floor.dm
@@ -145,6 +145,11 @@
burnt = 1
update_icon()
+/turf/simulated/floor/carpet/black
+ icon = 'icons/turf/floors/carpet_black.dmi'
+ floor_tile = /obj/item/stack/tile/carpet/black
+ canSmoothWith = list(/turf/simulated/floor/carpet/black)
+
/turf/simulated/floor/fakespace
icon = 'icons/turf/space.dmi'
icon_state = "0"
@@ -153,4 +158,4 @@
/turf/simulated/floor/fakespace/New()
..()
- icon_state = "[rand(0,25)]"
\ No newline at end of file
+ icon_state = "[rand(0,25)]"
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index ae964af74a8..6f266c121e1 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -307,9 +307,26 @@
/obj/item/weapon/bikehorn)
category = CAT_MISC
+/datum/crafting_recipe/blackcarpet
+ name = "Black Carpet"
+ result = /obj/item/stack/tile/carpet/black
+ time = 20
+ reqs = list(/obj/item/stack/tile/carpet = 1)
+ tools = list(/obj/item/toy/crayon)
+ category = CAT_MISC
+
+/datum/crafting_recipe/showercurtain
+ name = "Shower Curtains"
+ result = /obj/structure/curtain
+ time = 20
+ reqs = list(/obj/item/stack/sheet/cloth = 2,
+ /obj/item/stack/sheet/plastic = 2,
+ /obj/item/stack/rods = 1)
+ category = CAT_MISC
+
/datum/crafting_recipe/bonfire
name = "Bonfire"
time = 60
reqs = list(/obj/item/weapon/grown/log = 5)
result = /obj/structure/bonfire
- category = CAT_PRIMAL
\ No newline at end of file
+ category = CAT_PRIMAL
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 96735d1a078..7852fe0edd8 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -333,8 +333,28 @@
new /obj/effect/effect/harmless_smoke(get_turf(src))
qdel(src)
+/obj/item/weapon/survivalcapsule/luxury
+ name = "luxury bluespace shelter capsule"
+ desc = "An exorbitantly expensive luxury suite stored within a pocket of bluespace."
+ origin_tech = "engineering=3;bluespace=4"
+ template_id = "shelter_beta"
+
//Pod turfs and objects
+//Window
+/obj/structure/window/reinforced/survival_pod
+ name = "pod window"
+ icon = 'icons/obj/lavaland/survival_pod.dmi'
+ icon_state = "pwindow"
+
+// This override can be removed whenever we get rid of the stupid fucking `dir = 9` = full tile!!!! shit
+/obj/structure/window/reinforced/survival_pod/CanPass(atom/movable/mover, turf/target, height=0)
+ if(istype(mover) && mover.checkpass(PASSGLASS))
+ return 1
+ if(get_dir(loc, target) == dir)
+ return !density
+ else
+ return 1
//Floors
/turf/simulated/floor/pod
@@ -364,6 +384,12 @@
base_icon_state = "survival_pod"
glass_type = "/survival_pod"
+//Windoor
+/obj/machinery/door/window/survival_pod
+ icon = 'icons/obj/lavaland/survival_pod.dmi'
+ icon_state = "windoor"
+ base_state = "windoor"
+
//Table
/obj/structure/table/survival_pod
icon = 'icons/obj/lavaland/survival_pod.dmi'
@@ -536,3 +562,31 @@
new /obj/item/stack/rods(loc)
qdel(src)
return ..()
+
+/obj/item/fakeartefact
+ name = "expensive forgery"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "x2"
+ var/possible = list(/obj/item/ship_in_a_bottle,
+ /obj/item/weapon/gun/energy/pulse,
+ /obj/item/weapon/sleeping_carp_scroll,
+ /obj/item/weapon/shield/changeling,
+ /obj/item/weapon/lava_staff,
+ /obj/item/weapon/katana/energy,
+ /obj/item/weapon/storage/toolbox/green/memetic,
+ /obj/item/weapon/gun/projectile/automatic/l6_saw,
+ /obj/item/weapon/gun/magic/staff/chaos,
+ /obj/item/weapon/gun/magic/staff/spellblade,
+ /obj/item/weapon/gun/magic/wand/death,
+ /obj/item/weapon/gun/magic/wand/fireball,
+ /obj/item/stack/telecrystal,
+ /obj/item/weapon/banhammer)
+
+/obj/item/fakeartefact/New()
+ . = ..()
+ var/obj/item/I = pick(possible)
+ name = initial(I.name)
+ icon = initial(I.icon)
+ desc = initial(I.desc)
+ icon_state = initial(I.icon_state)
+ item_state = initial(I.item_state)
diff --git a/code/modules/mining/shelters.dm b/code/modules/mining/shelters.dm
index 38750b12d19..2389470e7f5 100644
--- a/code/modules/mining/shelters.dm
+++ b/code/modules/mining/shelters.dm
@@ -40,3 +40,17 @@
/datum/map_template/shelter/alpha/New()
. = ..()
whitelisted_turfs = typecacheof(/turf/simulated/mineral)
+
+/datum/map_template/shelter/beta
+ name = "Shelter Beta"
+ shelter_id = "shelter_beta"
+ description = "An extremly luxurious shelter, containing all \
+ the amenities of home, including carpeted floors, hot and cold \
+ running water, a gourmet three course meal, cooking facilities, \
+ and a deluxe companion to keep you from getting lonely during \
+ an ash storm."
+ mappath = "_maps/map_files/templates/shelter_2.dmm"
+
+/datum/map_template/shelter/beta/New()
+ . = ..()
+ whitelisted_turfs = typecacheof(/turf/simulated/mineral)
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index 2735d145ac8..cb535c90165 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/lavaland/survival_pod.dmi b/icons/obj/lavaland/survival_pod.dmi
index fae242d524f..a4c207b402c 100644
Binary files a/icons/obj/lavaland/survival_pod.dmi and b/icons/obj/lavaland/survival_pod.dmi differ
diff --git a/icons/obj/smooth_structures/fancy_table.dmi b/icons/obj/smooth_structures/fancy_table.dmi
new file mode 100644
index 00000000000..a57b165f4ac
Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table.dmi differ
diff --git a/icons/obj/smooth_structures/fancy_table_black.dmi b/icons/obj/smooth_structures/fancy_table_black.dmi
new file mode 100644
index 00000000000..d4570e8a7c1
Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_black.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index 85788316c13..2c7fedf90b3 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi
index e4fedae838b..67cc9682cf8 100644
Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ
diff --git a/icons/turf/floors/carpet_black.dmi b/icons/turf/floors/carpet_black.dmi
new file mode 100644
index 00000000000..d1174203aa9
Binary files /dev/null and b/icons/turf/floors/carpet_black.dmi differ