diff --git a/_maps/templates/shelter_2.dmm b/_maps/templates/shelter_2.dmm
new file mode 100644
index 0000000000..e8fee96717
--- /dev/null
+++ b/_maps/templates/shelter_2.dmm
@@ -0,0 +1,41 @@
+"a" = (/turf/closed/wall/mineral/titanium/survival/pod,/area/survivalpod)
+"b" = (/obj/structure/sign/mining/survival{tag = "icon-survival (NORTH)"; icon_state = "survival"; dir = 1},/turf/closed/wall/mineral/titanium/survival/pod,/area/survivalpod)
+"c" = (/turf/closed/wall/mineral/titanium/survival,/area/survivalpod)
+"d" = (/obj/structure/sign/mining/survival{dir = 8},/turf/closed/wall/mineral/titanium/survival/pod,/area/survivalpod)
+"e" = (/obj/structure/fans,/turf/open/floor/pod,/area/survivalpod)
+"f" = (/obj/machinery/smartfridge/survival_pod,/turf/open/floor/pod,/area/survivalpod)
+"g" = (/obj/item/device/gps/computer,/turf/open/floor/pod,/area/survivalpod)
+"h" = (/obj/machinery/shower,/obj/item/weapon/soap/deluxe,/obj/structure/curtain{alpha = 240; color = "#454545"; icon_state = "closed"; open = 0},/turf/open/floor/pod,/area/survivalpod)
+"i" = (/obj/structure/toilet/secret{secret_type = /obj/item/weapon/kitchen/knife/combat/survival},/turf/open/floor/pod,/area/survivalpod)
+"j" = (/obj/structure/sign/mining/survival{tag = "icon-survival (EAST)"; icon_state = "survival"; dir = 4},/turf/closed/wall/mineral/titanium/survival/pod,/area/survivalpod)
+"k" = (/obj/machinery/sleeper/survival_pod,/turf/open/floor/pod,/area/survivalpod)
+"l" = (/turf/open/floor/pod,/area/survivalpod)
+"m" = (/obj/structure/bed/pod,/obj/item/weapon/bedsheet/black,/turf/open/floor/pod,/area/survivalpod)
+"n" = (/obj/structure/window/reinforced/survival_pod{dir = 8; icon_state = "pwindow"; layer = 3; tag = "icon-pwindow (WEST)"},/obj/machinery/door/window/survival_pod{dir = 1; icon_state = "windoor"; tag = "icon-windoor (NORTH)"},/turf/open/floor/carpet/black,/area/survivalpod)
+"o" = (/obj/structure/chair/comfy/black,/obj/item/cardboard_cutout{desc = "A cardboard cutout of a xenomorph maid."; icon_state = "cutout_lusty"; name = "lusty xenomorph maid"},/obj/structure/window/reinforced/survival_pod{tag = "icon-pwindow (NORTH)"; icon_state = "pwindow"; dir = 1},/turf/open/floor/carpet/black,/area/survivalpod)
+"p" = (/obj/structure/table/survival_pod,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/brute{pixel_x = 5},/turf/open/floor/pod,/area/survivalpod)
+"q" = (/obj/structure/tubes,/obj/item/weapon/twohanded/required/kirbyplants/random,/turf/open/floor/pod,/area/survivalpod)
+"r" = (/obj/structure/window/reinforced/survival_pod{dir = 8; icon_state = "pwindow"; tag = "icon-pwindow (WEST)"},/turf/open/floor/carpet/black,/area/survivalpod)
+"s" = (/obj/machinery/light{dir = 4; light_color = "#DDFFD3"},/obj/structure/table/wood/fancy/black,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 7; pixel_y = 2},/obj/item/weapon/reagent_containers/food/drinks/bottle/wine{pixel_x = -6; pixel_y = 10},/turf/open/floor/carpet/black,/area/survivalpod)
+"t" = (/obj/machinery/microwave{pixel_y = -2},/obj/structure/window/reinforced/survival_pod{tag = "icon-pwindow (NORTH)"; icon_state = "pwindow"; dir = 1},/obj/structure/table/wood/fancy/black{pixel_y = -9; pixel_z = 0},/turf/open/floor/carpet/black,/area/survivalpod)
+"u" = (/obj/machinery/door/window/survival_pod{tag = "icon-windoor (NORTH)"; icon_state = "windoor"; dir = 1},/turf/open/floor/carpet/black,/area/survivalpod)
+"v" = (/obj/structure/window/reinforced/survival_pod{tag = "icon-pwindow (NORTH)"; icon_state = "pwindow"; dir = 1},/obj/structure/displaycase{alert = 0; desc = "A display case containing an expensive forgery, probably."; pixel_w = 0; pixel_x = 0; pixel_y = -4; pixel_z = 0; req_access = 48; start_showpiece_type = /obj/item/fakeartefact},/turf/open/floor/carpet/black,/area/survivalpod)
+"w" = (/obj/structure/window/reinforced/survival_pod{density = 0; dir = 9; icon_state = "pwindow"; tag = "icon-pwindow (NORTHWEST)"},/turf/open/floor/carpet/black,/area/survivalpod)
+"x" = (/obj/structure/table/wood/fancy/black,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 7; pixel_y = 2},/obj/effect/spawner/lootdrop/three_course_meal,/turf/open/floor/carpet/black,/area/survivalpod)
+"y" = (/obj/structure/sink/kitchen{tag = "icon-sink_alt (EAST)"; icon_state = "sink_alt"; dir = 4; pixel_x = -13; pixel_y = 0},/turf/open/floor/carpet/black,/area/survivalpod)
+"z" = (/obj/machinery/light,/turf/open/floor/carpet/black,/area/survivalpod)
+"A" = (/turf/open/floor/carpet/black,/area/survivalpod)
+"B" = (/obj/structure/chair/comfy/black{dir = 1},/turf/open/floor/carpet/black,/area/survivalpod)
+"C" = (/obj/structure/sign/mining/survival,/turf/closed/wall/mineral/titanium/survival/pod,/area/survivalpod)
+"D" = (/obj/structure/fans/tiny,/obj/machinery/door/airlock/survival_pod,/turf/open/floor/pod,/area/survivalpod)
+"E" = (/obj/structure/sign/mining,/turf/closed/wall/mineral/titanium/survival/pod,/area/survivalpod)
+
+(1,1,1) = {"
+abcbcba
+defghij
+cklmnoc
+dplqrsj
+ctuvwxc
+dyzAABj
+aCcDcEa
+"}
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index d6a4d33c7c..4ad01f509a 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -54,6 +54,35 @@
/obj/item/trash/sosjerky = 1,
/obj/item/trash/syndi_cakes = 1)
+/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/soup/beet,
+ /obj/item/weapon/reagent_containers/food/snacks/soup/sweetpotato,
+ /obj/item/weapon/reagent_containers/food/snacks/soup/stew,
+ /obj/item/weapon/reagent_containers/food/snacks/soup/hotchili,
+ /obj/item/weapon/reagent_containers/food/snacks/soup/nettle,
+ /obj/item/weapon/reagent_containers/food/snacks/soup/meatball)
+ var/salads = list(
+ /obj/item/weapon/reagent_containers/food/snacks/salad/herbsalad,
+ /obj/item/weapon/reagent_containers/food/snacks/salad/validsalad,
+ /obj/item/weapon/reagent_containers/food/snacks/salad/fruit,
+ /obj/item/weapon/reagent_containers/food/snacks/salad/jungle,
+ /obj/item/weapon/reagent_containers/food/snacks/salad/aesirsalad)
+ var/mains = list(
+ /obj/item/weapon/reagent_containers/food/snacks/bearsteak,
+ /obj/item/weapon/reagent_containers/food/snacks/enchiladas,
+ /obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat,
+ /obj/item/weapon/reagent_containers/food/snacks/burger/bigbite,
+ /obj/item/weapon/reagent_containers/food/snacks/burger/superbite,
+ /obj/item/weapon/reagent_containers/food/snacks/burger/fivealarm)
+
+/obj/effect/spawner/lootdrop/three_course_meal/Initialize(mapload)
+ loot = list(pick(soups) = 1,pick(salads) = 1,pick(mains) = 1)
+ . = ..()
+
/obj/effect/spawner/lootdrop/maintenance
name = "maintenance loot spawner"
// see code/_globalvars/lists/maintenance_loot.dm for loot table
diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm
index 287b34ec82..06017c8865 100644
--- a/code/game/objects/items/cardboard_cutouts.dm
+++ b/code/game/objects/items/cardboard_cutouts.dm
@@ -10,7 +10,7 @@
// add an entry in change_appearance() if you add to here
var/list/possible_appearances = list("Assistant", "Clown", "Mime",
"Traitor", "Nuke Op", "Cultist", "Clockwork Cultist",
- "Revolutionary", "Wizard", "Shadowling", "Xenomorph", "Swarmer",
+ "Revolutionary", "Wizard", "Shadowling", "Xenomorph", "Xenomorph Maid", "Swarmer",
"Ash Walker", "Deathsquad Officer", "Ian", "Slaughter Demon",
"Laughter Demon", "Private Security Officer")
var/pushed_over = FALSE //If the cutout is pushed over and has to be righted
@@ -142,6 +142,10 @@
icon_state = "cutout_fukken_xeno"
if(prob(25))
alpha = 75 //Spooky sneaking!
+ if("Xenomorph Maid")
+ name = "lusty xenomorph maid ([rand(1, 999)])"
+ desc = "A cardboard cutout of a xenomorph maid."
+ icon_state = "cutout_lusty"
if("Swarmer")
name = "Swarmer ([rand(1, 999)])"
desc = "A cardboard cutout of a swarmer."
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index 8b97bda160..de0cdaf494 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -107,6 +107,11 @@
turf_type = /turf/open/floor/carpet
resistance_flags = FLAMMABLE
+/obj/item/stack/tile/carpet/black
+ name = "black carpet"
+ icon_state = "tile-carpet-black"
+ turf_type = /turf/open/floor/carpet/black
+
/obj/item/stack/tile/fakespace
name = "astral carpet"
diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm
index 50aa23434e..0c2886533f 100644
--- a/code/game/objects/structures/table_frames.dm
+++ b/code/game/objects/structures/table_frames.dm
@@ -61,6 +61,14 @@
to_chat(user, "You start adding [S] to [src]...")
if(do_after(user, 20, target = src) && S.use(1))
make_new_table(/obj/structure/table/optable)
+ else if(istype(I, /obj/item/stack/tile/carpet/black))
+ var/obj/item/stack/tile/carpet/black/C = I
+ if(C.get_amount() < 1)
+ to_chat(user, "You need one black carpet sheet to do this!")
+ return
+ to_chat(user, "You start adding [C] to [src]...")
+ if(do_after(user, 20, target = src) && C.use(1))
+ make_new_table(/obj/structure/table/wood/fancy/black)
else if(istype(I, /obj/item/stack/tile/carpet))
var/obj/item/stack/tile/carpet/C = I
if(C.get_amount() < 1)
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 41ef527e1e..73c75e2cc5 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -271,12 +271,20 @@
frame = /obj/structure/table_frame
framestack = /obj/item/stack/rods
buildstack = /obj/item/stack/tile/carpet
- canSmoothWith = list(/obj/structure/table/wood/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"
+ buildstack = /obj/item/stack/tile/carpet/black
+
+/obj/structure/table/wood/fancy/black/New()
+ ..()
+ icon = 'icons/obj/smooth_structures/fancy_table_black.dmi'
+
/*
* Reinforced tables
*/
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 3db570db83..1e5c16f665 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -11,10 +11,10 @@
var/mob/living/swirlie = null //the mob being given a swirlie
-/obj/structure/toilet/New()
+/obj/structure/toilet/Initialize()
+ . = ..()
open = round(rand(0, 1))
update_icon()
- ..()
/obj/structure/toilet/attack_hand(mob/living/user)
@@ -104,6 +104,21 @@
else
return ..()
+/obj/structure/toilet/secret
+ var/obj/item/secret
+ var/secret_type = null
+
+/obj/structure/toilet/secret/Initialize(mapload)
+ . = ..()
+ if (secret_type)
+ secret = new secret_type(src)
+ secret.desc += " It's a secret!"
+ w_items += secret.w_class
+ contents += secret
+
+
+
+
/obj/structure/urinal
name = "urinal"
desc = "The HU-452, an experimental urinal. Comes complete with experimental urinal cake."
@@ -239,7 +254,7 @@
qdel(mymist)
if(on)
- add_overlay(mutable_appearance('icons/obj/watercloset.dmi', "water", MOB_LAYER + 1))
+ add_overlay(mutable_appearance('icons/obj/watercloset.dmi', "water", ABOVE_MOB_LAYER))
if(watertemp == "freezing")
return
if(!ismist)
@@ -552,7 +567,7 @@
icon_state = "open"
color = "#ACD1E9" //Default color, didn't bother hardcoding other colors, mappers can and should easily change it.
alpha = 200 //Mappers can also just set this to 255 if they want curtains that can't be seen through
- layer = WALL_OBJ_LAYER
+ layer = SIGN_LAYER
anchored = 1
opacity = 0
density = 0
@@ -575,13 +590,48 @@
density = 0
open = TRUE
+/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(istype(W, /obj/item/weapon/screwdriver))
+ if(anchored)
+ playsound(src.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(src.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(src.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/attack_hand(mob/user)
playsound(loc, 'sound/effects/curtain.ogg', 50, 1)
toggle()
..()
/obj/structure/curtain/deconstruct(disassembled = TRUE)
- new /obj/item/stack/sheet/cloth (loc, 3)
+ 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/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm
index 91ed7a7cd6..375697ff9b 100644
--- a/code/game/turfs/simulated/floor/fancy_floor.dm
+++ b/code/game/turfs/simulated/floor/fancy_floor.dm
@@ -158,6 +158,12 @@
if(smooth)
queue_smooth_neighbors(src)
+/turf/open/floor/carpet/black
+ icon = 'icons/turf/floors/carpet_black.dmi'
+ floor_tile = /obj/item/stack/tile/carpet/black
+ canSmoothWith = list(/turf/open/floor/carpet/black)
+
+
/turf/open/floor/carpet/narsie_act(force, ignore_mobs, probability = 20)
. = (prob(probability) || force)
for(var/I in src)
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index b5fe59f019..67464adc12 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -379,6 +379,19 @@
result = /obj/item/toy/sword
category = CAT_MISC
+/datum/crafting_recipe/blackcarpet
+ name = "Black Carpet"
+ reqs = list(/obj/item/stack/tile/carpet = 50, /obj/item/toy/crayon/black = 1)
+ result = /obj/item/stack/tile/carpet/black
+ category = CAT_MISC
+
+/datum/crafting_recipe/showercurtain
+ name = "Shower Curtains"
+ reqs = list(/obj/item/stack/sheet/cloth = 2, /obj/item/stack/sheet/plastic = 2, /obj/item/stack/rods = 1)
+ result = /obj/structure/curtain
+ category = CAT_MISC
+
+
/datum/crafting_recipe/chemical_payload
name = "Chemical Payload (C4)"
result = /obj/item/weapon/bombcore/chemical
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index 5e3064eeb5..c2ae6f7e35 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -39,6 +39,7 @@
new /datum/data/mining_equipment("Mining Hardsuit", /obj/item/clothing/suit/space/hardsuit/mining, 2000),
new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 2000),
new /datum/data/mining_equipment("Super Resonator", /obj/item/weapon/resonator/upgraded, 2500),
+ new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/weapon/survivalcapsule/luxury, 3000),
new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100),
new /datum/data/mining_equipment("KA Adjustable Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer/adjustable, 150),
new /datum/data/mining_equipment("KA Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 250),
diff --git a/code/modules/mining/shelters.dm b/code/modules/mining/shelters.dm
index efb14b9b14..78ef880200 100644
--- a/code/modules/mining/shelters.dm
+++ b/code/modules/mining/shelters.dm
@@ -40,3 +40,18 @@
/datum/map_template/shelter/alpha/New()
. = ..()
whitelisted_turfs = typecacheof(/turf/closed/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/templates/shelter_2.dmm"
+
+/datum/map_template/shelter/beta/New()
+ . = ..()
+ whitelisted_turfs = typecacheof(/turf/closed/mineral)
diff --git a/html/changelogs/AutoChangeLog-pr-1308.yml b/html/changelogs/AutoChangeLog-pr-1308.yml
new file mode 100644
index 0000000000..af53d19554
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1308.yml
@@ -0,0 +1,8 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - rscadd: "Luxury versions of the bluespace shelter capsule are now available! Purchase them at the mining equipment vendor."
+ - rscadd: "Cardboard cutouts have a new option: Xenomorph Maid"
+ - rscadd: "Black Carpet can now be crafted using a stack of carpet and a black crayon."
+ - rscadd: "Black fancy tables can now be crafted using Black Carpet."
+ - rscadd: "Shower curtains can now be recoloured with crayons, unscrewed from the floor, disassembled with wire cutters, and reassembled using cloth, plastic, and a metal rod."
diff --git a/icons/obj/lavaland/survival_pod.dmi b/icons/obj/lavaland/survival_pod.dmi
index 51358dfe4c..84ea0e1e83 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_black.dmi b/icons/obj/smooth_structures/fancy_table_black.dmi
new file mode 100644
index 0000000000..d4570e8a7c
Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_black.dmi differ
diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi
index 5a8afeee51..5372e24c05 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 0000000000..d1174203aa
Binary files /dev/null and b/icons/turf/floors/carpet_black.dmi differ