Metastation kitchen area redesign and related features, take 2 (#30754)

* Metastation kitchen area redesign and related features, take 2

* reviews
This commit is contained in:
warriorstar-orion
2025-12-18 18:46:17 -05:00
committed by GitHub
parent e2efb09016
commit 481f035722
15 changed files with 2344 additions and 2236 deletions
File diff suppressed because it is too large Load Diff
+36 -1
View File
@@ -8,6 +8,8 @@
var/list/used_places = list()
/// A list of types which are are valid to place on this shelf.
var/list/allowed_types = list()
/// A list of types whose subtypes are valid to place on this shelf. Used in addition to [allowed_types].
var/list/allowed_subtypes = list()
/// The default scale transformation for objects placed on the shelf.
var/default_scale = 0.70
/// The default rotation transformation for objects placed on the shelf.
@@ -23,6 +25,9 @@
allowed_types += allowed_types_
random_pickup_locations = random_pickup_locations_
if(allowed_subtypes)
allowed_subtypes = typecacheof(allowed_subtypes)
/datum/component/shelver/RegisterWithParent()
RegisterSignal(parent, COMSIG_SHELF_ATTEMPT_PICKUP, PROC_REF(on_shelf_attempt_pickup))
RegisterSignal(parent, COMSIG_ATTACK_BY, PROC_REF(on_attackby))
@@ -130,7 +135,11 @@
if(user.a_intent == INTENT_HARM)
return
if(length(allowed_types) && !(attacker.type in allowed_types))
var/restrictions = length(allowed_types) || length(allowed_subtypes)
var/in_allowed_types = is_type_in_list(attacker, allowed_types)
var/in_allowed_subtypes = is_type_in_typecache(attacker, allowed_subtypes)
if(restrictions && !(in_allowed_types || in_allowed_subtypes))
to_chat(user, SPAN_NOTICE("[attacker] won't fit on [parent]!"))
return COMPONENT_SKIP_AFTERATTACK
@@ -173,6 +182,7 @@
to_add.appearance_flags |= PIXEL_SCALE
if("layer" in position_details)
to_add.layer = position_details["layer"]
to_add.layer -= 0.001 * placement_idx
used_places[placement_idx] = to_add.UID()
var/obj/O = parent
if(istype(O))
@@ -216,6 +226,31 @@
default_scale = 0.80
default_rotation = -45
/datum/component/shelver/spice_rack
default_scale = 0.80
allowed_subtypes = list(
// this also means larger containers like flour/sugar but the
// alternative is not allowing any custom condiment containers
/obj/item/reagent_containers/condiment,
)
placement_zones = list(
// Bottom Shelf
list(1, 1, 6, 16) = list("x" = -10, "y" = -3, "layer" = BELOW_OBJ_LAYER),
list(7, 1, 12, 16) = list("x" = -5, "y" = -3, "layer" = BELOW_OBJ_LAYER),
list(13, 1, 18, 16) = list("x" = 0, "y" = -3, "layer" = BELOW_OBJ_LAYER),
list(19, 1, 24, 16) = list("x" = 5, "y" = -3, "layer" = BELOW_OBJ_LAYER),
list(25, 1, 32, 16) = list("x" = 10, "y" = -3, "layer" = BELOW_OBJ_LAYER),
// Top Shelf
list(1, 17, 6, 32) = list("x" = -10, "y" = 12),
list(7, 17, 12, 32) = list("x" = -5, "y" = 12),
list(13, 17, 18, 32) = list("x" = 0, "y" = 12),
list(19, 17, 24, 32) = list("x" = 5, "y" = 12),
list(25, 17, 32, 32) = list("x" = 10, "y" = 12),
)
/// A component for items stored on shelves, propagated by [/datum/component/shelver] components.
/datum/component/shelved
/// The UID of the object acting as the shelf
+32
View File
@@ -0,0 +1,32 @@
/// Shelf positioning allows for custom positioning on shelves for individual items.
/datum/element/shelf_positioning
element_flags = ELEMENT_BESPOKE
argument_hash_start_idx = 2
var/x_offset
var/y_offset
var/scale
var/rotation
// Allow for custom offsets, scales, and rotations for specific items
// when added to a shelf.
/datum/element/shelf_positioning/Attach(datum/target, x_offset_ = 0, y_offset_ = 0, scale_ = 0, rotation_ = 0)
. = ..()
if(!isitem(target))
return ELEMENT_INCOMPATIBLE
x_offset = x_offset_
y_offset = y_offset_
scale = scale_
rotation = rotation_
RegisterSignal(target, COMSIG_SHELF_ITEM_ADDED, PROC_REF(on_shelf_item_added))
/datum/element/shelf_positioning/proc/on_shelf_item_added(obj/item/target, default_scale)
SIGNAL_HANDLER // COMSIG_SHELF_ITEM_ADDED
target.pixel_x += x_offset
target.pixel_y += y_offset
if(rotation)
target.transform = turn(target.transform, rotation)
if((!default_scale) && scale)
target.transform *= scale
@@ -11,6 +11,23 @@
icon_state = "kitchen"
request_console_flags = RC_SUPPLY
/area/station/service/break_room
name = "\improper Service Break Room"
icon_state = "servbreak"
request_console_flags = RC_SUPPLY
/area/station/service/kitchen/freezer
name = "\improper Kitchen Freezer"
icon_state = "kitchen_freezer"
/area/station/service/kitchen/storage
name = "\improper Kitchen Storage"
icon_state = "kitchen_store"
/area/station/service/pasture
name = "\improper Pasture"
icon_state = "pasture"
/area/station/service/bar
name = "\improper Bar"
icon_state = "bar"
+31 -27
View File
@@ -93,34 +93,38 @@
icon_state = "dinnerware"
icon_lightmask = "dinnerware"
category = VENDOR_TYPE_DEPARTMENTAL
products = list(/obj/item/storage/bag/tray = 8,
/obj/item/kitchen/utensil/fork = 6,
/obj/item/trash/plate = 20,
/obj/item/trash/bowl = 20,
/obj/item/kitchen/knife = 3,
/obj/item/kitchen/rollingpin = 2,
/obj/item/reagent_containers/cooking/sushimat = 3,
/obj/item/reagent_containers/drinks/drinkingglass = 8,
/obj/item/reagent_containers/condiment/pack/ketchup = 5,
/obj/item/reagent_containers/condiment/pack/hotsauce = 5,
/obj/item/reagent_containers/condiment/saltshaker =5,
/obj/item/reagent_containers/condiment/peppermill =5,
/obj/item/whetstone = 2,
/obj/item/storage/box/papersack = 20,
/obj/item/kitchen/knife/cheese = 2,
/obj/item/kitchen/knife/pizza_cutter = 2,
/obj/item/reagent_containers/cooking/mould/bear = 1,
/obj/item/reagent_containers/cooking/mould/worm = 1,
/obj/item/reagent_containers/cooking/mould/bean = 1,
/obj/item/reagent_containers/cooking/mould/ball = 1,
/obj/item/reagent_containers/cooking/mould/cane = 1,
/obj/item/reagent_containers/cooking/mould/cash = 1,
/obj/item/reagent_containers/cooking/mould/coin = 1,
/obj/item/reagent_containers/cooking/mould/loli = 1,
/obj/item/kitchen/cutter = 2)
products = list(
/obj/item/storage/bag/tray = 8,
/obj/item/kitchen/utensil/fork = 6,
/obj/item/trash/plate = 20,
/obj/item/trash/bowl = 20,
/obj/item/kitchen/knife = 3,
/obj/item/kitchen/rollingpin = 2,
/obj/item/reagent_containers/cooking/sushimat = 3,
/obj/item/reagent_containers/drinks/drinkingglass = 8,
/obj/item/whetstone = 2,
/obj/item/storage/box/papersack = 20,
/obj/item/kitchen/knife/cheese = 2,
/obj/item/kitchen/knife/pizza_cutter = 2,
/obj/item/storage/box/kitchen_moulds = 1,
/obj/item/kitchen/cutter = 2,
/obj/item/storage/box/dish_drive = 1,
/obj/item/storage/box/crewvend = 1,
/obj/item/storage/box/autochef = 1,
/obj/item/cartridge/chef = 2,
)
contraband = list(/obj/item/kitchen/rollingpin = 2,
/obj/item/kitchen/knife/butcher = 2)
contraband = list(
/obj/item/kitchen/rollingpin = 2,
/obj/item/kitchen/knife/butcher = 2,
)
prices = list(
/obj/item/storage/box/dish_drive = 100,
/obj/item/storage/box/crewvend = 100,
/obj/item/storage/box/autochef = 100,
/obj/item/cartridge/chef = 50,
)
refill_canister = /obj/item/vending_refill/dinnerware
+72 -74
View File
@@ -785,85 +785,83 @@
icon_panel = "drobe"
icon_addon = "chefdrobe"
category = VENDOR_TYPE_CLOTHING
ads_list = list("Our clothes are guaranteed to protect you from food splatters!",
"Comfortable enough for a CQC practice!")
ads_list = list(
"Our clothes are guaranteed to protect you from food splatters!",
"Comfortable enough for a CQC practice!",
)
vend_reply = "Thank you for using the ChefDrobe!"
products = list(/obj/item/clothing/under/rank/civilian/chef = 2,
/obj/item/clothing/under/misc/waiter = 2,
/obj/item/clothing/suit/chef = 2,
/obj/item/clothing/suit/chef/bw = 2,
/obj/item/clothing/suit/chef/red = 2,
/obj/item/clothing/suit/chef/darkgreen = 2,
/obj/item/clothing/suit/chef/classic = 2,
/obj/item/clothing/suit/hooded/wintercoat/chef = 2,
/obj/item/storage/belt/chef = 2,
/obj/item/storage/belt/chef/black = 2,
/obj/item/storage/belt/chef/red = 2,
/obj/item/storage/belt/chef/green = 2,
/obj/item/clothing/head/chefhat = 2,
/obj/item/clothing/head/chefhat/bw = 2,
/obj/item/clothing/head/chefhat/black = 2,
/obj/item/clothing/head/chefhat/red = 2,
/obj/item/clothing/head/soft/white = 2,
/obj/item/clothing/head/beret/white = 2,
/obj/item/clothing/shoes/laceup = 2,
/obj/item/clothing/shoes/white = 2,
/obj/item/clothing/shoes/black = 2,
/obj/item/clothing/neck/neckerchief = 2,
/obj/item/clothing/neck/neckerchief/black = 2,
/obj/item/clothing/neck/neckerchief/red = 2,
/obj/item/clothing/neck/neckerchief/green = 2,
/obj/item/clothing/accessory/waistcoat = 2,
/obj/item/clothing/accessory/armband/service = 3,
/obj/item/reagent_containers/glass/rag = 3,
/obj/item/storage/box/dish_drive = 1,
/obj/item/storage/box/crewvend = 1,
/obj/item/storage/box/autochef = 1,
/obj/item/clothing/head/helmet/space/plasmaman/chef = 2,
/obj/item/clothing/head/helmet/space/plasmaman/chef/bw = 2,
/obj/item/clothing/under/plasmaman/chef = 2,
/obj/item/clothing/under/plasmaman/chef/bw = 2,
/obj/item/cartridge/chef = 2)
products = list(
/obj/item/clothing/under/rank/civilian/chef = 2,
/obj/item/clothing/under/misc/waiter = 2,
/obj/item/clothing/suit/chef = 2,
/obj/item/clothing/suit/chef/bw = 2,
/obj/item/clothing/suit/chef/red = 2,
/obj/item/clothing/suit/chef/darkgreen = 2,
/obj/item/clothing/suit/chef/classic = 2,
/obj/item/clothing/suit/hooded/wintercoat/chef = 2,
/obj/item/storage/belt/chef = 2,
/obj/item/storage/belt/chef/black = 2,
/obj/item/storage/belt/chef/red = 2,
/obj/item/storage/belt/chef/green = 2,
/obj/item/clothing/head/chefhat = 2,
/obj/item/clothing/head/chefhat/bw = 2,
/obj/item/clothing/head/chefhat/black = 2,
/obj/item/clothing/head/chefhat/red = 2,
/obj/item/clothing/head/soft/white = 2,
/obj/item/clothing/head/beret/white = 2,
/obj/item/clothing/shoes/laceup = 2,
/obj/item/clothing/shoes/white = 2,
/obj/item/clothing/shoes/black = 2,
/obj/item/clothing/neck/neckerchief = 2,
/obj/item/clothing/neck/neckerchief/black = 2,
/obj/item/clothing/neck/neckerchief/red = 2,
/obj/item/clothing/neck/neckerchief/green = 2,
/obj/item/clothing/accessory/waistcoat = 2,
/obj/item/clothing/accessory/armband/service = 3,
/obj/item/reagent_containers/glass/rag = 3,
/obj/item/clothing/head/helmet/space/plasmaman/chef = 2,
/obj/item/clothing/head/helmet/space/plasmaman/chef/bw = 2,
/obj/item/clothing/under/plasmaman/chef = 2,
/obj/item/clothing/under/plasmaman/chef/bw = 2,
)
contraband = list(/obj/item/toy/figure/crew/chef = 1)
prices = list(/obj/item/clothing/under/rank/civilian/chef = 50,
/obj/item/clothing/under/misc/waiter = 50,
/obj/item/clothing/suit/chef = 50,
/obj/item/clothing/suit/chef/bw = 50,
/obj/item/clothing/suit/chef/red = 50,
/obj/item/clothing/suit/chef/darkgreen = 50,
/obj/item/clothing/suit/chef/classic = 50,
/obj/item/clothing/suit/hooded/wintercoat/chef = 75,
/obj/item/storage/belt/chef = 50,
/obj/item/storage/belt/chef/black = 50,
/obj/item/storage/belt/chef/red = 50,
/obj/item/storage/belt/chef/green = 50,
/obj/item/clothing/head/chefhat = 50,
/obj/item/clothing/head/chefhat/bw = 50,
/obj/item/clothing/head/chefhat/black = 50,
/obj/item/clothing/head/chefhat/red = 50,
/obj/item/clothing/head/soft/white = 30,
/obj/item/clothing/head/beret/white = 20,
/obj/item/clothing/shoes/laceup = 30,
/obj/item/clothing/shoes/white = 20,
/obj/item/clothing/shoes/black = 20,
/obj/item/clothing/neck/neckerchief = 20,
/obj/item/clothing/neck/neckerchief/black = 20,
/obj/item/clothing/neck/neckerchief/red = 20,
/obj/item/clothing/neck/neckerchief/green = 20,
/obj/item/clothing/accessory/waistcoat = 20,
/obj/item/clothing/accessory/armband/service = 20,
/obj/item/reagent_containers/glass/rag = 5,
/obj/item/storage/box/dish_drive = 100,
/obj/item/storage/box/crewvend = 100,
/obj/item/storage/box/autochef = 100,
/obj/item/clothing/head/helmet/space/plasmaman/chef = 60,
/obj/item/clothing/head/helmet/space/plasmaman/chef/bw = 60,
/obj/item/clothing/under/plasmaman/chef = 60,
/obj/item/clothing/under/plasmaman/chef/bw = 60,
/obj/item/cartridge/chef = 50)
prices = list(
/obj/item/clothing/under/rank/civilian/chef = 50,
/obj/item/clothing/under/misc/waiter = 50,
/obj/item/clothing/suit/chef = 50,
/obj/item/clothing/suit/chef/bw = 50,
/obj/item/clothing/suit/chef/red = 50,
/obj/item/clothing/suit/chef/darkgreen = 50,
/obj/item/clothing/suit/chef/classic = 50,
/obj/item/clothing/suit/hooded/wintercoat/chef = 75,
/obj/item/storage/belt/chef = 50,
/obj/item/storage/belt/chef/black = 50,
/obj/item/storage/belt/chef/red = 50,
/obj/item/storage/belt/chef/green = 50,
/obj/item/clothing/head/chefhat = 50,
/obj/item/clothing/head/chefhat/bw = 50,
/obj/item/clothing/head/chefhat/black = 50,
/obj/item/clothing/head/chefhat/red = 50,
/obj/item/clothing/head/soft/white = 30,
/obj/item/clothing/head/beret/white = 20,
/obj/item/clothing/shoes/laceup = 30,
/obj/item/clothing/shoes/white = 20,
/obj/item/clothing/shoes/black = 20,
/obj/item/clothing/neck/neckerchief = 20,
/obj/item/clothing/neck/neckerchief/black = 20,
/obj/item/clothing/neck/neckerchief/red = 20,
/obj/item/clothing/neck/neckerchief/green = 20,
/obj/item/clothing/accessory/waistcoat = 20,
/obj/item/clothing/accessory/armband/service = 20,
/obj/item/reagent_containers/glass/rag = 5,
/obj/item/clothing/head/helmet/space/plasmaman/chef = 60,
/obj/item/clothing/head/helmet/space/plasmaman/chef/bw = 60,
/obj/item/clothing/under/plasmaman/chef = 60,
/obj/item/clothing/under/plasmaman/chef/bw = 60,
)
refill_canister = /obj/item/vending_refill/chefdrobe
@@ -80,3 +80,10 @@
return
SSblackbox.record_feedback("tally", "random_spawners", 1, "[/obj/item/trash]")
/obj/effect/spawner/random/trash/spread_tiles
spawn_scatter_radius = 2
/obj/effect/spawner/random/trash/spread_tiles/Initialize(mapload)
spawn_loot_count = roll("3d3")
. = ..()
@@ -88,6 +88,7 @@ GLOBAL_LIST_INIT(metal_recipes, list(
new /datum/stack_recipe("meatspike frame", /obj/structure/kitchenspike_frame, 5, time = 5 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("rack parts", /obj/item/rack_parts),
new /datum/stack_recipe("storage shelf", /obj/structure/shelf, 5, time = 2.5 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("spice rack", /obj/structure/shelf/spice_rack, 5, time = 2.5 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("metal bookcase", /obj/structure/bookcase/metal, 5, time = 2.5 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("gun rack", /obj/structure/gunrack, 5, time = 2.5 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("reflector frame", /obj/structure/reflector, 5, time = 2.5 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
@@ -2047,6 +2047,20 @@
new /obj/item/kitchen/knife/cheese(src)
new /obj/item/kitchen/knife/pizza_cutter(src)
/obj/item/storage/box/kitchen_moulds
name = "kitchen mould kit"
desc = "A box of shaped moulds used for candy. Like gummy bears!"
/obj/item/storage/box/kitchen_moulds/populate_contents()
new /obj/item/reagent_containers/cooking/mould/bear(src)
new /obj/item/reagent_containers/cooking/mould/worm(src)
new /obj/item/reagent_containers/cooking/mould/bean(src)
new /obj/item/reagent_containers/cooking/mould/ball(src)
new /obj/item/reagent_containers/cooking/mould/cane(src)
new /obj/item/reagent_containers/cooking/mould/cash(src)
new /obj/item/reagent_containers/cooking/mould/coin(src)
new /obj/item/reagent_containers/cooking/mould/loli(src)
#undef NODESIGN
#undef NANOTRASEN
#undef SYNDI
+8 -1
View File
@@ -15,12 +15,13 @@ GLOBAL_LIST_INIT(shelf_colors, list("basic", "sci", "sup", "serv", "med", "sec",
/// The current overlay of the top shelf. Used for interleaving objects and shelf layers for the illusion of depth.
var/image/shelf_overlay
var/build_stack_type = /obj/item/stack/sheet/metal
var/shelf_type = /datum/component/shelver/basic_shelf
COOLDOWN_DECLARE(spraypaint_cd)
/obj/structure/shelf/Initialize(mapload)
. = ..()
var/area/A = get_area(src)
AddComponent(/datum/component/shelver/basic_shelf, random_pickup_locations_ = istype(A, /area/station/maintenance) || istype(A, /area/ruin/lavaland_relay))
AddComponent(shelf_type, random_pickup_locations_ = istype(A, /area/station/maintenance) || istype(A, /area/ruin/lavaland_relay))
update_icon()
set_style(shelf_style)
@@ -124,6 +125,12 @@ GLOBAL_LIST_INIT(shelf_colors, list("basic", "sci", "sup", "serv", "med", "sec",
shelf_style = "wood"
build_stack_type = /obj/item/stack/sheet/wood
/obj/structure/shelf/spice_rack
name = "spice rack"
icon_state = "shelf_spice_rack"
shelf_style = "spice_rack"
shelf_type = /datum/component/shelver/spice_rack
/obj/structure/gunrack
name = "gun rack"
desc = "A rack for stowing firearms."
@@ -76,6 +76,14 @@
component_parts += new /obj/item/stock_parts/capacitor/super(null)
RefreshParts()
/obj/machinery/cooking/ice_cream_mixer/loaded/Initialize(mapload)
. = ..()
for(var/i in 1 to length(surfaces))
var/datum/cooking_surface/surface = surfaces[i]
surface.container = new /obj/item/reagent_containers/cooking/icecream_bowl(src)
update_appearance()
/obj/item/circuitboard/cooking/ice_cream_mixer
board_name = "Ice Cream Mixer"
build_path = /obj/machinery/cooking/ice_cream_mixer
@@ -138,6 +138,10 @@
list_reagents = list("sodiumchloride" = 20)
possible_states = list()
/obj/item/reagent_containers/condiment/saltshaker/Initialize(mapload)
. = ..()
AddElement(/datum/element/shelf_positioning, y_offset_ = -3)
/obj/item/reagent_containers/condiment/saltshaker/suicide_act(mob/user)
user.visible_message(SPAN_SUICIDE("[user] begins to swap forms with the salt shaker! It looks like [user.p_theyre()] trying to commit suicide!"))
var/newname = "[name]"
@@ -160,6 +164,10 @@
list_reagents = list("blackpepper" = 20)
possible_states = list()
/obj/item/reagent_containers/condiment/peppermill/Initialize(mapload)
. = ..()
AddElement(/datum/element/shelf_positioning, y_offset_ = -3)
/obj/item/reagent_containers/condiment/milk
name = "space milk"
desc = "It's milk. White and nutritious goodness!"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

+1
View File
@@ -688,6 +688,7 @@
#include "code\datums\elements\ridable.dm"
#include "code\datums\elements\rust_element.dm"
#include "code\datums\elements\shatters_when_thrown.dm"
#include "code\datums\elements\shelf_positioning.dm"
#include "code\datums\elements\sideways_movement.dm"
#include "code\datums\elements\strippable.dm"
#include "code\datums\elements\waddling.dm"