From 22f68874f475190fe8cb797c732baf4a672cb90a Mon Sep 17 00:00:00 2001
From: SkyratBot <59378654+SkyratBot@users.noreply.github.com>
Date: Wed, 3 May 2023 08:10:27 +0100
Subject: [PATCH] [MIRROR] Service Borger Upri- Kitchen Upgrades [MDB IGNORE]
(#20909)
* Service Borger Upri- Kitchen Upgrades
* Update robot_model.dm
---------
Co-authored-by: Dawnseer <126404225+Dawnseer@users.noreply.github.com>
Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
---
code/__DEFINES/exosuit_fab.dm | 2 +
.../__DEFINES/research/research_categories.dm | 1 +
code/__DEFINES/tools.dm | 2 +-
code/game/objects/items/kitchen.dm | 38 ++++++
code/game/objects/items/rcd/RSF.dm | 22 +++-
code/game/objects/items/robot/items/hypo.dm | 108 ++++++++++++++---
.../game/objects/items/robot/items/storage.dm | 37 ++++++
.../objects/items/robot/robot_upgrades.dm | 112 ++++++++++++++++++
code/game/objects/items/rollertable_dock.dm | 52 ++++++++
.../modules/food_and_drinks/machinery/oven.dm | 25 ++++
code/modules/mining/money_bag.dm | 1 +
.../mob/living/silicon/robot/robot_model.dm | 11 +-
.../designs/mechfabricator_designs.dm | 44 +++++++
code/modules/research/techweb/all_nodes.dm | 13 ++
icons/mob/silicon/robot_items.dmi | Bin 2139 -> 2188 bytes
icons/obj/kitchen.dmi | Bin 30468 -> 31115 bytes
tgstation.dme | 1 +
17 files changed, 446 insertions(+), 23 deletions(-)
create mode 100644 code/game/objects/items/rollertable_dock.dm
diff --git a/code/__DEFINES/exosuit_fab.dm b/code/__DEFINES/exosuit_fab.dm
index f739cc31d3e..5ac95686801 100644
--- a/code/__DEFINES/exosuit_fab.dm
+++ b/code/__DEFINES/exosuit_fab.dm
@@ -8,6 +8,8 @@
#define BORG_MODEL_MEDICAL (1<<3)
/// Module is compatible with Engineering Cyborg model
#define BORG_MODEL_ENGINEERING (1<<4)
+/// Module is compatible with Service Cyborg model
+#define BORG_MODEL_SERVICE (1<<5)
/// Module is compatible with Ripley Exosuit models
#define EXOSUIT_MODULE_RIPLEY (1<<0)
diff --git a/code/__DEFINES/research/research_categories.dm b/code/__DEFINES/research/research_categories.dm
index f9ce318d3ad..e8d426fcfc5 100644
--- a/code/__DEFINES/research/research_categories.dm
+++ b/code/__DEFINES/research/research_categories.dm
@@ -159,6 +159,7 @@
#define RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_JANITOR "/Janitorial Cyborgs"
#define RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_SECURITY "/Security Cyborgs"
#define RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_MINING "/Mining Cyborgs"
+#define RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_SERVICE "/Service Cyborgs"
#define RND_CATEGORY_MODSUITS "/MOD Suits"
#define RND_SUBCATEGORY_MODUITS_CHASSIS "/Chassis"
diff --git a/code/__DEFINES/tools.dm b/code/__DEFINES/tools.dm
index 76031d5a383..591aa22aa2b 100644
--- a/code/__DEFINES/tools.dm
+++ b/code/__DEFINES/tools.dm
@@ -17,7 +17,7 @@
#define TOOL_BONESET "bonesetter"
#define TOOL_KNIFE "knife"
#define TOOL_BLOODFILTER "bloodfilter"
-#define TOOL_ROLLINGPIN "rollingpin"
+#define TOOL_ROLLINGPIN "rolling pin"
/// Can be used to scrape rust off an any atom; which will result in the Rust Component being qdel'd
#define TOOL_RUSTSCRAPER "rustscraper"
diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm
index 1633147c5b7..185615d042c 100644
--- a/code/game/objects/items/kitchen.dm
+++ b/code/game/objects/items/kitchen.dm
@@ -102,6 +102,44 @@
. = ..()
AddElement(/datum/element/easily_fragmented, PLASTIC_BREAK_PROBABILITY)
+/obj/item/knife/kitchen/silicon
+ name = "Kitchen Toolset"
+ icon_state = "sili_knife"
+ desc = "A breakthrough in synthetic engineering, this tool is a knife programmed to dull when not used for cooking purposes, and can exchange the blade for a rolling pin"
+ force = 0
+ throwforce = 0
+ sharpness = SHARP_EDGED
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ attack_verb_continuous = list("prods", "whiffs", "scratches", "pokes")
+ attack_verb_simple = list("prod", "whiff", "scratch", "poke")
+ tool_behaviour = TOOL_KNIFE
+
+/obj/item/knife/kitchen/silicon/examine()
+ . = ..()
+ . += " It's fitted with a [tool_behaviour] head."
+
+/obj/item/knife/kitchen/silicon/attack_self(mob/user)
+ playsound(get_turf(user), 'sound/items/change_drill.ogg', 50, TRUE)
+ if(tool_behaviour != TOOL_ROLLINGPIN)
+ tool_behaviour = TOOL_ROLLINGPIN
+ to_chat(user, span_notice("You attach the rolling pin bit to the [src]."))
+ icon_state = "sili_rolling_pin"
+ force = 8
+ sharpness = NONE
+ hitsound = SFX_SWING_HIT
+ attack_verb_continuous = list("bashes", "batters", "bludgeons", "thrashes", "whacks")
+ attack_verb_simple = list("bash", "batter", "bludgeon", "thrash", "whack")
+
+ else
+ tool_behaviour = TOOL_KNIFE
+ to_chat(user, span_notice("You attach the knife bit to the [src]."))
+ icon_state = "sili_knife"
+ force = 0
+ sharpness = SHARP_EDGED
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ attack_verb_continuous = list("prods", "whiffs", "scratches", "pokes")
+ attack_verb_simple = list("prod", "whiff", "scratch", "poke")
+
/obj/item/kitchen/rollingpin
name = "rolling pin"
desc = "Used to knock out the Bartender."
diff --git a/code/game/objects/items/rcd/RSF.dm b/code/game/objects/items/rcd/RSF.dm
index f4688c8283a..ef5cedf77b0 100644
--- a/code/game/objects/items/rcd/RSF.dm
+++ b/code/game/objects/items/rcd/RSF.dm
@@ -31,12 +31,22 @@ RSF
var/dispense_cost = 0
w_class = WEIGHT_CLASS_NORMAL
///An associated list of atoms and charge costs. This can contain a separate list, as long as it's associated item is an object
- var/list/cost_by_item = list(/obj/item/reagent_containers/cup/glass/drinkingglass = 20,
- /obj/item/paper = 10,
- /obj/item/storage/dice = 200,
- /obj/item/pen = 50,
- /obj/item/clothing/mask/cigarette = 10,
- )
+ ///The RSF item list below shows in the player facing ui in this order, this is why it isn't in alphabetical order, but instead sorted by category
+ var/list/cost_by_item = list(
+ /obj/item/reagent_containers/cup/glass/drinkingglass = 20,
+ /obj/item/reagent_containers/cup/glass/sillycup = 10,
+ /obj/item/plate = 70,
+ /obj/item/reagent_containers/cup/bowl = 70,
+ /obj/item/kitchen/fork/plastic = 30,
+ /obj/item/knife/plastic = 30,
+ /obj/item/kitchen/spoon/plastic = 30,
+ /obj/item/food/seaweedsheet = 30,
+ /obj/item/storage/dice = 200,
+ /obj/item/toy/cards/deck = 200,
+ /obj/item/paper = 10,
+ /obj/item/pen = 50,
+ /obj/item/clothing/mask/cigarette = 10,
+ )
///An associated list of fuel and it's value
var/list/matter_by_item = list(/obj/item/rcd_ammo = 10,)
///A list of surfaces that we are allowed to place things on.
diff --git a/code/game/objects/items/robot/items/hypo.dm b/code/game/objects/items/robot/items/hypo.dm
index 6d65c8d4cac..aa3ca4a6d0e 100644
--- a/code/game/objects/items/robot/items/hypo.dm
+++ b/code/game/objects/items/robot/items/hypo.dm
@@ -53,16 +53,16 @@
/datum/reagent/medicine/syndicate_nanites\
)
#define BASE_SERVICE_REAGENTS list(/datum/reagent/consumable/applejuice, /datum/reagent/consumable/banana,\
- /datum/reagent/consumable/coffee, /datum/reagent/consumable/cream, /datum/reagent/consumable/dr_gibb,\
- /datum/reagent/consumable/grenadine, /datum/reagent/consumable/ice, /datum/reagent/consumable/lemonjuice,\
- /datum/reagent/consumable/lemon_lime, /datum/reagent/consumable/limejuice, /datum/reagent/consumable/menthol,\
- /datum/reagent/consumable/milk, /datum/reagent/consumable/nothing, /datum/reagent/consumable/orangejuice,\
- /datum/reagent/consumable/peachjuice, /datum/reagent/consumable/pineapplejuice,\
- /datum/reagent/consumable/pwr_game, /datum/reagent/consumable/shamblers, /datum/reagent/consumable/sodawater,\
- /datum/reagent/consumable/sol_dry, /datum/reagent/consumable/soymilk, /datum/reagent/consumable/space_cola,\
- /datum/reagent/consumable/spacemountainwind, /datum/reagent/consumable/space_up, /datum/reagent/consumable/sugar,\
+ /datum/reagent/consumable/berryjuice, /datum/reagent/consumable/cherryjelly, /datum/reagent/consumable/coffee,\
+ /datum/reagent/consumable/cream, /datum/reagent/consumable/dr_gibb, /datum/reagent/consumable/grenadine,\
+ /datum/reagent/consumable/ice, /datum/reagent/consumable/lemon_lime, /datum/reagent/consumable/limejuice,\
+ /datum/reagent/consumable/lemonjuice, /datum/reagent/consumable/menthol, /datum/reagent/consumable/nothing,\
+ /datum/reagent/consumable/milk, /datum/reagent/consumable/orangejuice, /datum/reagent/consumable/peachjuice,\
+ /datum/reagent/consumable/pineapplejuice, /datum/reagent/consumable/pwr_game, /datum/reagent/consumable/shamblers,\
+ /datum/reagent/consumable/sodawater, /datum/reagent/consumable/sol_dry, /datum/reagent/consumable/soymilk,\
+ /datum/reagent/consumable/space_cola, /datum/reagent/consumable/spacemountainwind, /datum/reagent/consumable/space_up,\
/datum/reagent/consumable/tea, /datum/reagent/consumable/tomatojuice, /datum/reagent/consumable/tonic,\
- /datum/reagent/water,\
+ /datum/reagent/consumable/vinegar, /datum/reagent/water,\
/datum/reagent/consumable/ethanol/ale, /datum/reagent/consumable/ethanol/applejack, /datum/reagent/consumable/ethanol/beer,\
/datum/reagent/consumable/ethanol/champagne, /datum/reagent/consumable/ethanol/cognac, /datum/reagent/consumable/ethanol/creme_de_coconut,\
/datum/reagent/consumable/ethanol/creme_de_cacao, /datum/reagent/consumable/ethanol/creme_de_menthe, /datum/reagent/consumable/ethanol/gin,\
@@ -70,10 +70,26 @@
/datum/reagent/consumable/ethanol/tequila, /datum/reagent/consumable/ethanol/triple_sec, /datum/reagent/consumable/ethanol/vermouth,\
/datum/reagent/consumable/ethanol/vodka, /datum/reagent/consumable/ethanol/whiskey, /datum/reagent/consumable/ethanol/wine\
)
+#define EXPANDED_SERVICE_REAGENTS list(\
+ /datum/reagent/consumable/blackpepper,\
+ /datum/reagent/consumable/coco,\
+ /datum/reagent/consumable/cornmeal,\
+ /datum/reagent/consumable/cornoil,\
+ /datum/reagent/consumable/corn_starch,\
+ /datum/reagent/consumable/eggwhite,\
+ /datum/reagent/consumable/eggyolk,\
+ /datum/reagent/consumable/flour,\
+ /datum/reagent/consumable/rice,\
+ /datum/reagent/consumable/sugar,\
+ /datum/reagent/consumable/salt,\
+ /datum/reagent/consumable/vanilla,\
+)
#define HACKED_SERVICE_REAGENTS list(\
+ /datum/reagent/blood,\
+ /datum/reagent/toxin/carpotoxin,\
/datum/reagent/toxin/fakebeer,\
- /datum/reagent/consumable/ethanol/fernet\
- )
+ /datum/reagent/consumable/ethanol/fernet,\
+)
///Borg Hypospray
/obj/item/reagent_containers/borghypo
@@ -216,7 +232,6 @@
if(reagent.name == action)
selected_reagent = reagent
. = TRUE
-
var/mob/living/silicon/robot/cyborg = loc
if(istype(loc, /obj/item/robot_model))
var/obj/item/robot_model/container_model = loc
@@ -307,12 +322,13 @@
desc = "An advanced drink synthesizer and mixer."
icon = 'icons/obj/drinks/bottles.dmi'
icon_state = "shaker"
- possible_transfer_amounts = list(5,10,20)
+ possible_transfer_amounts = list(5,10,20,1)
// Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster.
charge_cost = 20
recharge_time = 3
dispensed_temperature = WATER_MATTERSTATE_CHANGE_TEMP //Water stays wet, ice stays ice
default_reagent_types = BASE_SERVICE_REAGENTS
+ expanded_reagent_types = EXPANDED_SERVICE_REAGENTS
/obj/item/reagent_containers/borghypo/borgshaker/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
@@ -323,7 +339,6 @@
/obj/item/reagent_containers/borghypo/borgshaker/ui_data(mob/user)
var/list/drink_reagents = list()
var/list/alcohol_reagents = list()
-
for(var/datum/reagent/reagent in stored_reagents.reagent_list)
// Split the reagents into alcoholic/non-alcoholic
if(istype(reagent, /datum/reagent/consumable/ethanol))
@@ -373,6 +388,70 @@
shaker.trans_to(target, amount_per_transfer_from_this, transfered_by = user)
balloon_alert(user, "[amount_per_transfer_from_this] unit\s poured")
return .
+
+/obj/item/reagent_containers/borghypo/condiment_synthesizer // Solids! Condiments! The borger uprising!
+ name = "Condiment Synthesizer"
+ desc = "An advanced condiment synthesizer"
+ icon = 'icons/obj/food/containers.dmi'
+ icon_state = "flour"
+ possible_transfer_amounts = list(5,10,20,1)
+ // Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster.
+ charge_cost = 40 //Costs double the power of the borgshaker due to synthesizing solids
+ recharge_time = 6 //Double the recharge time too, for the same reason.
+ dispensed_temperature = WATER_MATTERSTATE_CHANGE_TEMP
+ default_reagent_types = EXPANDED_SERVICE_REAGENTS
+
+/obj/item/reagent_containers/borghypo/condiment_synthesizer/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "BorgHypo", name)
+ ui.open()
+
+/obj/item/reagent_containers/borghypo/condiment_synthesizer/ui_data(mob/user)
+ var/list/condiments = list()
+ for(var/datum/reagent/reagent in stored_reagents.reagent_list)
+ if(reagent)
+ condiments.Add(list(list(
+ "name" = reagent.name,
+ "volume" = round(reagent.volume, 0.01) - 1,
+ "description" = reagent.description,
+ ))) // list in a list because Byond merges the first list...
+
+ var/data = list()
+ data["theme"] = tgui_theme
+ data["minVolume"] = amount_per_transfer_from_this
+ data["maxVolume"] = max_volume_per_reagent
+ data["reagents"] = condiments
+ data["selectedReagent"] = selected_reagent?.name
+ return data
+
+/obj/item/reagent_containers/borghypo/condiment_synthesizer/attack(mob/M, mob/user)
+ return
+
+/obj/item/reagent_containers/borghypo/condiment_synthesizer/afterattack(obj/target, mob/user, proximity)
+ . = ..()
+ if(!proximity)
+ return .
+ if(!selected_reagent)
+ balloon_alert(user, "no reagent selected!")
+ return .
+ . |= AFTERATTACK_PROCESSED_ITEM
+ if(!target.is_refillable())
+ return .
+ if(!stored_reagents.has_reagent(selected_reagent.type, amount_per_transfer_from_this))
+ balloon_alert(user, "not enough [selected_reagent.name]!")
+ return .
+ if(target.reagents.total_volume >= target.reagents.maximum_volume)
+ balloon_alert(user, "[target] is full!")
+ return .
+ // This is the in-between where we're storing the reagent we're going to pour into the container
+ // because we cannot specify a singular reagent to transfer in trans_to
+ var/datum/reagents/shaker = new()
+ stored_reagents.remove_reagent(selected_reagent.type, amount_per_transfer_from_this)
+ shaker.add_reagent(selected_reagent.type, amount_per_transfer_from_this, reagtemp = dispensed_temperature, no_react = TRUE)
+ shaker.trans_to(target, amount_per_transfer_from_this, transfered_by = user)
+ balloon_alert(user, "[amount_per_transfer_from_this] unit\s poured")
+
/obj/item/reagent_containers/borghypo/borgshaker/hacked
name = "cyborg shaker"
@@ -392,4 +471,5 @@
#undef HACKED_CLOWN_REAGENTS
#undef BASE_SYNDICATE_REAGENTS
#undef BASE_SERVICE_REAGENTS
+#undef EXPANDED_SERVICE_REAGENTS
#undef HACKED_SERVICE_REAGENTS
diff --git a/code/game/objects/items/robot/items/storage.dm b/code/game/objects/items/robot/items/storage.dm
index c67aa202089..54793794d6b 100644
--- a/code/game/objects/items/robot/items/storage.dm
+++ b/code/game/objects/items/robot/items/storage.dm
@@ -300,3 +300,40 @@
if(istype(atom, /obj/item/ai_module) && !stored) //If an admin wants a borg to upload laws, who am I to stop them? Otherwise, we can hint that it fails
to_chat(user, span_warning("This circuit board doesn't seem to have standard robot apparatus pin holes. You're unable to pick it up."))
return ..()
+
+/obj/item/borg/apparatus/service
+ name = "Service apparatus"
+ desc = "A special apparatus for carrying food, bowls, plates, oven trays, soup pots and paper."
+ icon_state = "borg_service_apparatus"
+ storable = list(
+ /obj/item/food,
+ /obj/item/paper,
+ /obj/item/plate,
+ /obj/item/plate/oven_tray,
+ /obj/item/reagent_containers/cup/bowl,
+ /obj/item/reagent_containers/cup/soup_pot,
+ )
+
+/obj/item/borg/apparatus/service/Initialize(mapload)
+ update_appearance()
+ return ..()
+
+/obj/item/borg/apparatus/service/update_overlays()
+ . = ..()
+ var/mutable_appearance/arm = mutable_appearance(icon, "borg_hardware_apparatus_arm1")
+ if(stored)
+ stored.pixel_x = -3
+ stored.pixel_y = 0
+ if((!istype(stored, /obj/item/plate/oven_tray)) || (!istype(stored, /obj/item/food)))
+ arm.icon_state = "borg_hardware_apparatus_arm2"
+ var/mutable_appearance/stored_copy = new /mutable_appearance(stored)
+ stored_copy.layer = FLOAT_LAYER
+ stored_copy.plane = FLOAT_PLANE
+ . += stored_copy
+ . += arm
+
+/obj/item/borg/apparatus/service/examine()
+ . = ..()
+ if(stored)
+ . += "The apparatus currently has [stored] secured."
+ . += span_notice("Alt-click will drop the currently secured item.")
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index add94e019d8..452947fbc3c 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -759,6 +759,118 @@
var/obj/item/pushbroom/cyborg/BR = locate() in R.model.modules
if (BR)
R.model.remove_module(BR, TRUE)
+
+/obj/item/borg/upgrade/condiment_synthesizer
+ name = "Service Cyborg Condiment Synthesiser"
+ desc = "An upgrade to the service model cyborg, allowing it to produce solid condiments."
+ icon_state = "cyborg_upgrade3"
+ require_model = TRUE
+ model_type = list(/obj/item/robot_model/service)
+ model_flags = BORG_MODEL_SERVICE
+
+/obj/item/borg/upgrade/condiment_synthesizer/action(mob/living/silicon/robot/install, user = usr)
+ . = ..()
+ if(!.)
+ return FALSE
+ var/obj/item/reagent_containers/borghypo/condiment_synthesizer/cynthesizer = locate() in install.model.modules
+ if(cynthesizer)
+ install.balloon_alert_to_viewers("already installed!")
+ return FALSE
+ cynthesizer = new(install.model)
+ install.model.basic_modules += cynthesizer
+ install.model.add_module(cynthesizer, FALSE, TRUE)
+
+/obj/item/borg/upgrade/condiment_synthesizer/deactivate(mob/living/silicon/robot/install, user = usr)
+ . = ..()
+ if (!.)
+ return FALSE
+ var/obj/item/reagent_containers/borghypo/condiment_synthesizer/cynthesizer = locate() in install.model.modules
+ if (cynthesizer)
+ install.model.remove_module(cynthesizer, TRUE)
+
+/obj/item/borg/upgrade/silicon_knife
+ name = "Service Cyborg Kitchen Toolset"
+ desc = "An upgrade to the service model cyborg, to help process foods."
+ icon_state = "cyborg_upgrade3"
+ require_model = TRUE
+ model_type = list(/obj/item/robot_model/service)
+ model_flags = BORG_MODEL_SERVICE
+
+/obj/item/borg/upgrade/silicon_knife/action(mob/living/silicon/robot/install, user = usr)
+ . = ..()
+ if(!.)
+ return FALSE
+ var/obj/item/knife/kitchen/silicon/snife = locate() in install.model.modules
+ if(snife)
+ install.balloon_alert_to_viewers("already installed!")
+ return FALSE
+ snife = new(install.model)
+ install.model.basic_modules += snife
+ install.model.add_module(snife, FALSE, TRUE)
+
+/obj/item/borg/upgrade/silicon_knife/deactivate(mob/living/silicon/robot/install, user = usr)
+ . = ..()
+ if (!.)
+ return FALSE
+ var/obj/item/knife/kitchen/silicon/snife = locate() in install.model.modules
+ if (snife)
+ install.model.remove_module(snife, TRUE)
+
+/obj/item/borg/upgrade/service_apparatus
+ name = "Service Cyborg Service Apparatus"
+ desc = "An upgrade to the service model cyborg, to help handle foods and paper."
+ icon_state = "cyborg_upgrade3"
+ require_model = TRUE
+ model_type = list(/obj/item/robot_model/service)
+ model_flags = BORG_MODEL_SERVICE
+
+/obj/item/borg/upgrade/service_apparatus/action(mob/living/silicon/robot/install, user = usr)
+ . = ..()
+ if(!.)
+ return FALSE
+ var/obj/item/borg/apparatus/service/saparatus = locate() in install.model.modules
+ if(saparatus)
+ install.balloon_alert_to_viewers("already installed!")
+ return FALSE
+ saparatus = new(install.model)
+ install.model.basic_modules += saparatus
+ install.model.add_module(saparatus, FALSE, TRUE)
+
+/obj/item/borg/upgrade/service_apparatus/deactivate(mob/living/silicon/robot/install, user = usr)
+ . = ..()
+ if (!.)
+ return FALSE
+ var/obj/item/borg/apparatus/service/saparatus = locate() in install.model.modules
+ if (saparatus)
+ install.model.remove_module(saparatus, TRUE)
+
+/obj/item/borg/upgrade/rolling_table
+ name = "Service Cyborg Rolling Table Dock"
+ desc = "An upgrade to the service model cyborg, to help provide mobile service."
+ icon_state = "cyborg_upgrade3"
+ require_model = TRUE
+ model_type = list(/obj/item/robot_model/service)
+ model_flags = BORG_MODEL_SERVICE
+
+/obj/item/borg/upgrade/rolling_table/action(mob/living/silicon/robot/install, user = usr)
+ . = ..()
+ if(!.)
+ return FALSE
+ var/obj/item/rolling_table_dock/rtable = locate() in install.model.modules
+ if(rtable)
+ install.balloon_alert_to_viewers("already installed!")
+ return FALSE
+ rtable = new(install.model)
+ install.model.basic_modules += rtable
+ install.model.add_module(rtable, FALSE, TRUE)
+
+/obj/item/borg/upgrade/rolling_table/deactivate(mob/living/silicon/robot/install, user = usr)
+ . = ..()
+ if (!.)
+ return FALSE
+ var/obj/item/rolling_table_dock/rtable = locate() in install.model.modules
+ if (rtable)
+ install.model.remove_module(rtable, TRUE)
///This isn't an upgrade or part of the same path, but I'm gonna just stick it here because it's a tool used on cyborgs.
//A reusable tool that can bring borgs back to life. They gotta be repaired first, though.
diff --git a/code/game/objects/items/rollertable_dock.dm b/code/game/objects/items/rollertable_dock.dm
new file mode 100644
index 00000000000..222c8287ac9
--- /dev/null
+++ b/code/game/objects/items/rollertable_dock.dm
@@ -0,0 +1,52 @@
+/obj/item/rolling_table_dock
+ name = "rolling table dock"
+ desc = "A collapsed roller table that can be ejected for service on the go. Must be collected or replaced after use."
+ icon = 'icons/obj/smooth_structures/rollingtable.dmi'
+ icon_state = "rollingtable"
+ var/obj/structure/table/rolling/loaded = null
+
+/obj/item/rolling_table_dock/Initialize(mapload)
+ . = ..()
+ loaded = new(src)
+
+/obj/structure/table/rolling/attackby(obj/item/wtable, mob/user, params)
+ if(!istype(wtable, /obj/item/rolling_table_dock))
+ return ..()
+ var/obj/item/rolling_table_dock/rable = wtable
+ var/turf/target_table = get_turf(src)
+ if(rable.loaded)
+ to_chat(user, span_warning("You already have a roller table docked!"))
+ return
+ if(locate(/mob/living) in target_table)
+ to_chat(user, span_warning("You can't collect the table with that much on top!"))
+ return
+ else
+ rable.loaded = src
+ forceMove(rable)
+ user.visible_message(span_notice("[user] collects [src]."), balloon_alert(user, "you collect the [src]."))
+ return TRUE
+
+/obj/item/rolling_table_dock/afterattack(obj/target, mob/user , proximity)
+ . = ..()
+ var/turf/target_turf = get_turf(target)
+ if(!proximity || target_turf.is_blocked_turf(TRUE) || locate(/mob/living) in target_turf)
+ return
+ if(isopenturf(target))
+ deploy_rolling_table(user, target)
+
+/obj/item/rolling_table_dock/proc/deploy_rolling_table(mob/user, atom/location)
+ var/obj/structure/table/rolling/rable = new /obj/structure/table/rolling(location)
+ rable.add_fingerprint(user)
+ qdel(src)
+
+/obj/item/rolling_table_dock/examine(mob/user)
+ . = ..()
+ . += "The dock is [loaded ? "loaded" : "empty"]."
+
+/obj/item/rolling_table_dock/deploy_rolling_table(mob/user, atom/location)
+ if(loaded)
+ loaded.forceMove(location)
+ user.visible_message(span_notice("[user] deploys [loaded]."), balloon_alert(user, "you deploy the [loaded]."))
+ loaded = null
+ else
+ balloon_alert(user, "the dock is Empty!")
diff --git a/code/modules/food_and_drinks/machinery/oven.dm b/code/modules/food_and_drinks/machinery/oven.dm
index 077d775a442..17cb13acce6 100644
--- a/code/modules/food_and_drinks/machinery/oven.dm
+++ b/code/modules/food_and_drinks/machinery/oven.dm
@@ -160,6 +160,31 @@
update_baking_audio()
return TRUE
+/obj/machinery/oven/attack_robot(mob/user, modifiers)
+ . = ..()
+ open = !open
+ if(open)
+ playsound(src, 'sound/machines/oven/oven_open.ogg', 75, TRUE)
+ set_smoke_state(OVEN_SMOKE_STATE_NONE)
+ to_chat(user, span_notice("You open [src]."))
+ end_processing()
+ if(used_tray)
+ used_tray.vis_flags &= ~VIS_HIDE
+ else
+ playsound(src, 'sound/machines/oven/oven_close.ogg', 75, TRUE)
+ to_chat(user, span_notice("You close [src]."))
+ if(used_tray)
+ begin_processing()
+ used_tray.vis_flags |= VIS_HIDE
+
+ // yeah yeah i figure you don't need connect loc for just baking trays
+ for(var/obj/item/baked_item in used_tray.contents)
+ SEND_SIGNAL(baked_item, COMSIG_ITEM_OVEN_PLACED_IN, src, user)
+
+ update_appearance()
+ update_baking_audio()
+ return TRUE
+
/obj/machinery/oven/proc/update_baking_audio()
if(!oven_loop)
return
diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm
index 14f50ca0dab..3a7687ebebf 100644
--- a/code/modules/mining/money_bag.dm
+++ b/code/modules/mining/money_bag.dm
@@ -2,6 +2,7 @@
/obj/item/storage/bag/money
name = "money bag"
+ desc = "A bag for storing your profits."
icon_state = "moneybag"
worn_icon_state = "moneybag"
force = 10
diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm
index 900dcec1a0c..9f01ca5a80b 100644
--- a/code/modules/mob/living/silicon/robot/robot_model.dm
+++ b/code/modules/mob/living/silicon/robot/robot_model.dm
@@ -796,15 +796,20 @@
name = "Service"
basic_modules = list(
/obj/item/assembly/flash/cyborg,
+ /obj/item/reagent_containers/borghypo/borgshaker,
+ /obj/item/borg/apparatus/beaker/service,
/obj/item/reagent_containers/cup/beaker/large, //I know a shaker is more appropiate but this is for ease of identification
//Skyrat Edit Start: Borg Buff
//obj/item/reagent_containers/condiment/enzyme, //edit
+ /obj/item/reagent_containers/condiment/enzyme,
+ /obj/item/reagent_containers/dropper,
+ /obj/item/rsf,
+ /obj/item/storage/bag/tray,
/obj/item/pen,
/obj/item/toy/crayon/spraycan/borg,
/obj/item/extinguisher/mini,
/obj/item/hand_labeler/borg,
/obj/item/razor,
- /obj/item/rsf,
/obj/item/instrument/guitar,
/obj/item/instrument/piano_synth,
/obj/item/reagent_containers/dropper,
@@ -818,10 +823,12 @@
//obj/item/reagent_containers/borghypo/borgshaker, //edit
/obj/item/reagent_containers/syringe, //edit
/obj/item/cooking/cyborg/power, //edit
+ /obj/item/lighter,
/obj/item/borg/lollipop,
/obj/item/stack/pipe_cleaner_coil/cyborg,
- /obj/item/borg/apparatus/beaker/service,
/obj/item/chisel,
+ /obj/item/reagent_containers/cup/rag,
+ /obj/item/storage/bag/money,
)
radio_channels = list(RADIO_CHANNEL_SERVICE)
emag_modules = list(
diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm
index 2f1d479160f..d934b565bab 100644
--- a/code/modules/research/designs/mechfabricator_designs.dm
+++ b/code/modules/research/designs/mechfabricator_designs.dm
@@ -1148,6 +1148,50 @@
RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_JANITOR
)
+/datum/design/borg_upgrade_rolling_table
+ name = "Rolling Table Dock"
+ id = "borg_upgrade_rolling_table"
+ build_type = MECHFAB
+ build_path = /obj/item/borg/upgrade/rolling_table
+ materials = list(/datum/material/iron = 20000, /datum/material/titanium = 750) //steeper price than a regular rolling table, with some added titanium to make up for the relative rarity of regular rolling tables
+ construction_time = 4 SECONDS
+ category = list(
+ RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_SERVICE
+ )
+
+/datum/design/borg_upgrade_condiment_synthesizer
+ name = "Condiment Synthesizer"
+ id = "borg_upgrade_condiment_synthesizer"
+ build_type = MECHFAB
+ build_path = /obj/item/borg/upgrade/condiment_synthesizer
+ materials = list(/datum/material/iron = 15000, /datum/material/glass = 12000, /datum/material/plasma = 6000, /datum/material/uranium = 6000) //a bit cheaper than an expanded hypo for medical borg,
+ construction_time = 4 SECONDS
+ category = list(
+ RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_SERVICE
+ )
+
+/datum/design/borg_upgrade_silicon_knife
+ name = "Kitchen toolset"
+ id = "borg_upgrade_silicon_knife"
+ build_type = MECHFAB
+ build_path = /obj/item/borg/upgrade/silicon_knife
+ materials = list(/datum/material/iron = 15000, /datum/material/gold = 1000, /datum/material/silver = 1000,)
+ construction_time = 4 SECONDS
+ category = list(
+ RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_SERVICE
+ )
+
+/datum/design/borg_upgrade_service_apparatus
+ name = "Service apparatus"
+ id = "borg_upgrade_service_apparatus"
+ build_type = MECHFAB
+ build_path = /obj/item/borg/upgrade/service_apparatus
+ materials = list(/datum/material/iron = 5000)
+ construction_time = 4 SECONDS
+ category = list(
+ RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_SERVICE
+ )
+
/datum/design/borg_upgrade_expand
name = "Expand Module"
id = "borg_upgrade_expand"
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 4d2326a0045..21d11034044 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -991,6 +991,19 @@
. = ..()
if(!CONFIG_GET(flag/disable_secborg))
design_ids += "borg_upgrade_disablercooler"
+
+/datum/techweb_node/cyborg_upg_serv
+ id = "cyborg_upg_serv"
+ display_name = "Cyborg Upgrades: Service"
+ description = "Service upgrades for cyborgs."
+ prereq_ids = list("adv_robotics")
+ design_ids = list(
+ "borg_upgrade_rolling_table",
+ "borg_upgrade_condiment_synthesizer",
+ "borg_upgrade_silicon_knife",
+ "borg_upgrade_service_apparatus",
+ )
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
/datum/techweb_node/cyborg_upg_engiminer
id = "cyborg_upg_engiminer"
diff --git a/icons/mob/silicon/robot_items.dmi b/icons/mob/silicon/robot_items.dmi
index f409a5c38b15c19ccbefd62a7bab0bfbf340f3df..9f8b0142e9c62a9828ad720a274660e4dcbe1a4d 100644
GIT binary patch
delta 1836
zcmV+{2h;f55R4I!Bmq9LB|iZe>gwvL`&eZF0004WQchCYnFDuudH@sflH5%YCoF?cs&mDCh+K4aB4K`x%}S5;I<7R;bd
zA(*ICl7mW{Bk6*c0YxGm4<${}f1m)ek9F_4iUtm+^3%;>6=A2Hylo~FP=i!oV&Cjv
zQAyB^1HE%7qNm|ar^b4jOs}!4(s*NZ>)S!$)>Bh&5q8-*v@HE;yf{1NFoz~Vl>0WeOr`>eVzW*24
zy-8r;eT(D;?sk3;N*+(nz5hS=oqfbKE?>~!TAk?R1h`aL)CLCD`^1Q45IkZ
z{MtMrAZmVKz%UpFH1p|#WmyZRX)S14KA$J!i?(eqnx?%-iw~Xqv9|P30Lov+nC9}b
zFyELa@_PmlECX1+WtyL$=lrME!x=Oa%ePJQGxVI#WFN*?rcARie^tQqYWdG;23CFj
ztEAP8a=rqsTCz>Khw6-GOFV&n&dMo(&Bz@$d|qZGT~-xMzbBFL?S3
zSX#-LpC=8hEtktEe+{`PQ}ThB1$}e=u1C<+7K*RxZ=>*Nf{&f2A^4VdMu6m^FZ_%9frD0U4<2hF(KarVR
zGAcDg&1ICF#0Hj>rJ9nJR=-k1KbcfM%_Rj|fpJR!00000e*gdgCZgW;q{l`5_eqb7
z`tOq-7xv#LJ*{1~kdFBbB@;M4{oF`E9{eYkeb^zvC}e}v0tJLr$kJR#`6GX)6x^Ff>~FkHS^AM*r3|2<@!Eih#MsBvNc-H&sY
zI8;39{Oq{6|32w)00000001CKzTO_Uf@oB?pFdA_hJ^2JuR6{)!@<{MzaZf*Q1sbhZ
zgJ)o`bJXz+^!3vW@OqQk91^E*ZnFBrqPW6cfktb8A310>TEhm8kB`5_kMlZ^z;Nj+PH|@
z=%CqT8{qWcGwPFBT@M8E;(t52mjUpVc?{B@$QEof4cbj>Y7r-iQb>D=&s|qIyHo@Lf&;0
zl>**N16QGgUr65ldhy%!``<|eiQb=I?>hJ@}_ei*oi&wy<2n`Iq
zk@>GVKI%C@7HINA^xq@Vbrd8W{i2rf@W*L-r7Jfd{`hd~9sNm-CwzZ?*INU|WhflC
zJqI0nJmLO(7q37R{m8-X8Gi8@`X!;$f00{1000000059YcjFcil~fJfCotw+5`!{H
zU^0dQr$@ZA-N*0X?yuN~8W0!U{i9bX_9DI`
z4icO!i7`_*5O)ovZD7PAW|O*sbhpqQCf@n}qXtHQCzhm$IRg?012HIKl9Y=$f9A=O
z7!wRUcD^)gKnmnH&}ZCAA|SPRjPwQo0001Kkp3-4egmm~Kac?O8+bZy1rhmMdIQpL
zp-D9Gm~WrtH!z7c@E8LVS;UVrApI5s0|@{{JZ_+f$IbuCz&L6^Brv8sagqZJj2rn3
a`~yqQWX(0I6{`RM002ovPDHLk0$_sTt&-9J
delta 1786
zcmV*GX6O`ilepMxn0G;@vh6f>RoY;!X+qO0+y<(vEyAuiho%97l;hv1s`C}@$+9Wc0^!(+
zKe^M)`G4TWFt}uLH`eYQG{WlxveW2PtTxN@H*f?l3OiI!O+hLE0DlFtNklJCh|}
zq~|^dC5M|k^S;d7z+SVGgdhllAlV_8&^$9C^JjtA=j4PuDDmXy@)i0b%py
z!n~Y}{*VTse0g4#3x813N7}*&ZG!mt{F>%h5H{aNRtqweGzM!1QQR}Xvgi{KHs3X%
zX@CJm|9GibEH3GKaY<21rIJ6sY#7F}t{cm&xaZtYl$FN4C`P!^6e`tUJ
z8KCluy8bD7E`3&fJcFWB`G&54PM%A-{NwoAjINhw%5+|(^na9PVBOKbzP`Fa4Lr)<
zoYnQpY{kjfDu4l5-P%&w4wPc?iy~QF+lE4y*gJz_7+)GBZrfnQ%eMY9l~&aj7ySk{
zR%Bo82J@je}(4PS^2Jk?ObCUT7n|gy`X$mboBca7=|7H+Avu0welL#U#%`w
zHEoe>VSf$OYJYbAMyhsB{q_1n9msbbfHgp?Omm({4JnKP1o5>p)nBb@RdT{2
z<0>M^->gvm^}1FE@*M-RJO>#F&qx}}e>C|k>OA;4kOi8mrZ&k(@lM)8CZ(y#g`8B#
zuz?k6r77hzt6yr8pIjo}=Hh~^K-v-z1VIo4K@bE))PK94_PD73KJ9T)|9#ry!v6cT
z$NByD48*zp_e{jOy~ixXIsNyH#NqyXCgPI3-N-@xcP9?_=cCJq8*ifgX!a@(|-p~vE!Tp0>wEe1j*-iMxFjUe2Uwj2Tur;&rv|*Jb|LW4~Y8jZXBFqm=B#1
zEFX3-8h;-=!R^0;0tEeeHx3I7mM_)^o*?MI2aLl41LjW}7xv$sIA@6i#ly}I$Ho2k
zX^$faf*=TjAaU}|ZrTdM(b#?VEZ!MnzPG($n!A95Jr9#k5c~c4mIVa%zV#q*uuovU
z9{c_IR;vX#AO_lPu7LxBbF{zTA+RjOeSf~CT7Trh3=sp*yF3F2hc8~fv>ohsUcKtr
z7JMg(`|lwMu>!sR;fsTwG^W4PIr5#w>A$=GmPy@93jvh;vPBZbYKIV{(DY-
zGOwzxKwjK6Nb#Ap%vQ?;4UifjzaANQeRh8CJbDCrFp~fMn+u--PJe%nUZUJB!dijx
zIC})@z=A#q_S$p<(L%5tj0~K-K0Wn5hJW&Zxcu?TzlAt8khgaiyvamy!ho*8fNg;8
z9E~ZAf4#n86mhKg=S!+(nwH88k*kn>9VMke_tMx^=T>JG4`|qK!On-~6
zfW<6h?{^`Ff#YN8_U`=dmb`LwboK7y&5>Wfxc?pslf3gS`eOyMnqBGA?fbvp-`PihGvhJepFgnI0JsbV<8J7n&yL63e;?2l
z2&11kxI3qBKA=A%^!wS?k01zwAb$vg#Ls=&0>YB0frl8zypLm0kQgQd446Zro$Vod
z2lxL(J|t(d2V!BI2*%u*%)n$T|y|0;``__-@9J{Qv*}07*qoM6N<$g646I8UO$Q
diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi
index 55ef7645645590703698fd8abed619e4f6f83569..4ec74abe726024e691a849fd8b7b6b44bf3c1691 100644
GIT binary patch
delta 10688
zcmZvB1y~eq^zS0Aq;v}iC@3x6NJ*)r)DlvX(me~(NK3br(v8&84N?Nq-5|9HEG*pN
z`~Kg(_qorVXLhIFIp=-Pocx`@KWGuBXfcn`YGPTq0qeA|XH;L-A9*9`;sk!qO8p|j
zP=rNGvV=2zzdD&7Je)p1xjd*%ju98uw;vqtG^-SPO@egNFVpG%s<4Z6M6RJ@JgeWx
zV6cvM@BYg8ccZQ(TyBtidFT9v7R^>FGo?(L8MjbVui1D&2G4uZ7jZ8a8u%wg7TI!I
z@IMMF6Y?wx@PPtm}`bd1mChGMJt~+_`bSZBOVQBvZ%t=oJ*io7$7+4dEUH8i;r?
zi$*Rs;Z-5&4ap*~@M#C_8jQ-yNrr^1DwNn_q~{)S2tQRE;A@C5#L7@xBdi+M^EYs(
zXu>-%!c=4%*-EY6Hr(eubFaK2WGG$zOuJLPEe0G+M6r-JDN09_A%ooM~L7ws#
zhBSeV{@EO#Ei$hyNj!~tNuv2dX;N<4`kgO|^g$2$%x0DqRH=BI
zh2`09%d>U5cpmhl#lhE9EQ4cwUg+1CEc4ZhhMUCb5;59e(f*<*25o*yR2`-FWJ;s&
zM_QrJs5J+|1_&SFTt8v=Ws^gHMyWWm=)KGeEL2+@v11!;wWZNsJoU9upz%T=wx$v?
zpqC+q8~azKeS}GCZznzWSgKO57M>M{49m5vT4@<8o{yoSQzo41{%SLGy)JZ|X{zQw#V{z8oPGW1F9lhp@()s?Ju
z0;*=(X`AM05B1~a9VR}!Yk6U0r(*iSy1CzQRy$20i>Jo=lTKLbO9v7&(!kI*E2*$R
zJi-tmn1&+%02~7iui%X4s4o@U=sfA{cW4x8}nRBjfb
zJH5xJ9;Dbo+i?BKC}V#h2O(Vt>U@by4$hDz5>(8F0ss8=@ymyo;g0d^n@^(NzD_M4
z_ds))&`zV;vdO>!E*EcZZblb@7|4^_zxy+0_h(@V)*9}Nd>B%4S(#{
z8%0_9`(>X_5ctv?!Z%{esbI=%;EaqJ;
zpuf&^UDR_|bNDRbCG{mzW>_lWDLPbkv}@~rhAmN~p=xza4Jk}?__dxMdp`bkK6yZX
zYb&&}!8Z#%6;;;EUOw7q%DH-StC*yeBiCSa0#eo1G
z%l_DqzDS|uFM+dbw|_3DuX7ntitI~`t~ORrablGx3eaFhRHv;H83forUEM=8e5DNN
zeP8ei$h3CmmRt15Zwq?$q!*=B5+g&zksmB<18>x#;i*(KIU~K-|J;r*Y{WJM&!&*y
z{~Vu{w6rYbnXeBLJ2$~a*1rH))K8X*_pKh(lpRf#>YLkru(63((Rg4hKr=o*o~Ie2
zsEAddhM-2?T
z($vvG$8n-e^s|LmQA3<$g!W#
z?iW(rIcl1gaRR-u#YOww?d>)?_jyJ>DCF%r&4*d($1`HP^#dywuzE(0LiVdh>R^u-
zky4u+Z{NMcO&i7n_mED1KFgnN7S$#Pz-+Ces%m#nBn{e+;TOrMTAS$(i)tkj9*>2D
zgaqCNn8W=3yg_1GJbK!|OxD_t-5GK&R}Mo8nWv5%n}F6>J>1)AfHe7%zSYpkU%Ya3
zhQFFx$gFxPJdYRS{_UxA*L6dV%dbn`MSQZ1jSsS8o5N{r3rnqlBsr%64g**r-=FDMFxwgm=gtEPWT~kdu6ialklYcwrB85
z@ON6q_AHX{OJp)iyDXil+2h!hHPyn@l!<8uyTjmtshd3~jify-sI$rsd_paCYf&=|
z4XKf$kA274P}|$5edn_&7M}stWq}oemDcMGt_rf9H#djCFdvY6L=ux9yV|w~V16qrOWZvU${Cy_#^9-WBM-M@IDa}!0Yg%*IO@84
z4?N8Oh)lK3aeJnFdiH|!;QY|fE4ND3N3I5((>nyaTK01FX4i~ebGn9}-hHF!&A~Sh
zF?g=GcN$=Md1G)U0E$~WPDl%w!4iZ`YBhtZRGz15Ctle^TNS0B?MJr<2ss>IKMQbGdGT#aI8SxX|~QHLI(plTIJ;
z9KXe&k#vy}2tp-=p@whx_E+e0J4
z;AvjA4w-A+{pn6kcFBHhUT`y{Q%dhQKmBXXc$sgSmyb`@D6t9*JbEP|(`ygHVYsXJ
z*`8YSdwFp#9|8b1FDN;zg&XGt_d=}x<~5ijIw+i%L^0a8vl7E?T^D-t_|EGQ{WEv?FcfP3*y
zG-`%MPeZ#SDENSC$u3?$Pkcb*3`3XO;ojZQc)uD%WRE4m#qUb9zW#n`W#x!zo=TO2
zABtvX%oZb=bWWXjR+NRv%|DDNDq^>&)kA}<3d}$GeJHdnFKH8lg)W|zsXkH&Z1wJ*
zMz&dE%uh^w%FBDqFCeg5R9tqyVKst+>(yBx`hVO$NkNwk-(OKs~(gL)!W+^KRb5dJ8;P@NpkHB%hk7@*r%Z)_gl$BE#`d^a&ks9!1
z8(UUOi)`@cPkCo&z5hx<%%_ff?AP@?~t?}Bsj1+`
zMiDR+x$AW>{K?SMn08C@;0KwkJa{wnp
zm9G)uPDtU%-U_l=+<(BcNl}v5cVlbtJfZR0S%;p@_ZAtO-95@@%@q72J18-hYpG}_
zG<4&7=&VVYwM25K?S2Giu>t3`eH5-f9f7StS|ymikW4)HK%fV2o%oj$VEYO724+pk
zxTR;IDM^Zsa}awf%cXDjd>i{Sg8A207T2`C$;U&Ex#|wnc6A&7
ztrJF3HDvpqLIg4FJb+v;t=zIy4L3j2DXZ1`dRWu%yH10Fu1Te$WH878S@DH|;FkN2
z2V245nJ3C1D^23|qgWE*%*Sy;C{*k+ynrh;R`=%|(5~K-$B^#FpF_)iCq`%`(kO^A
zTaLhk6!JguczpGtKpOtLckjk;W@~LKz0d7;lxPI)@qPfyZD^1`9D$j_&hm{SRsbN$
z&cR`Bh6)(FUE+d2DV7|)siPD9*ACEk6-eTRPG2^R@<8@~SE7Ia{(Tz^oTc6N4(ps`x9
zSB+rKC@U)iZ{EHQ@I2jI$@Kp7##aRlFt3!AwW2}SlmjL#MQob?nXv<@1pbeb5XNpK9L<9_c+BaSS=g2Mq?CzisPa
z4v_x{ev+F`aclqs`p8S%jsNY2Bz5^4n6RXYFo?|%XJh1mYU^KdjI(d#EjmIV~b
zs_JU=)$!%r~I*fmP#(}&o)j)%=#y@5CyJ+u#9^M#UXCeYC%%0V`6-09jJU!W@{R<1bec=hAi@(uehRDMN-Y^reohG?
zZVD|ZzRn?B<+S|F1KGBce6bE(x3@(KmbYCMb;yQ&E_n)6q2kZZAoE$huO*%a-_g$2
zG5b|9cc7@Qo>b?>oXY-4P}^^4g_ae8
zZ#FKlfsp1|!S=X&5TT00CE3})5El&F`Z=w7FD5<%yyc-8Vxs~)yaK8pGvVLw8xgea
zT~b)DyXazE>F5@>W**q7K1<(L=eME{3i?oBkVZ3DA}siFQcT<7x0M&UaXsh9!Y!kj
z8(sm_N)V&9)hkxrw~oe3tsz6Ws{JvMum|_=tAO!O%XTQ4=i>Twq`lrNI$*hny@2?~
z(^E6kGM$vf*HbL{yqYRv+Q(!;yJwh$-FUSZd;MojsJY?X3Q%y;G_cga$AkoxIqy3v
zP2uUdiCmiMa($Ai>F8D-5-*>**JP7*B7%Z!ERE9_Aiz&D2XNuTpKNgh?Lc
z0Hz(SjzXrplJgvM&>qy_B!v^heY_bQA-&KHM;|CHCR(3@@DYxVilk!|D?tIb2dQtR
zdT-C3BKMnZf8X0g`eL~};xH=tlWC1;0yaO>P*+nHogT^Vs-xQ@EC?MzirZB0$~PA6eY
z6l!UqDWoe&T$dSdi_1MP)qj>`X9;*tRRnx8%cvjZXddVy>E6Ys3E96=C9Y^oe6C;N
zwDAh^DVCj~_K{oWag}|ynb38mDcyDD-gJ3yrg(csSnJuaL-4f`7ZN%B=KN#;fJM(4
z<-$q7$2qE4KiQf$jRonN{`t@<&-(>mfJj#2ow5i5J7b;@AI`~m1OQ#-DCzl%Mxa
zXN+-fFPd4?sc~^}3-Z}zE~A$^Iut6b
zB>QfnSXlEr7!o46g@xEHEiH;_YVtBN_f}U|V-gaA0s}D+2t;;S8Nt>_R_|vjzR~F|
zQCzVDW#~BK>^j$l<)<&}5;m+%BD?*Cw8nE5l%G*yEM9^eMkgpZRZ*Z0h3i>e-aEHJ
zrrTnY8#d(bLE?llRLHp3LZr^$H!vXc>eYSFJq3a3V8@P&DPnspncL(Zt4cDYhcYfM
z?#@XiCX$nqk}AGAshu{8ctF9qe0_OJDd{KH*w`48nHhyZxTFg^V<{;qZSU>LYHKGZ
zl~H0U1W-z6UEwVQ#D9k4+ac!?t&*MBPpP^6g)_2{D1VOJD&rJ=&A_d!Yt?UDjHZUA
zb0+-so#yYGD59y1tV!N
z2=u}R-XIb#=s+(YMH`l$PJ6v?DXB4O)Zmnl>*zipcS8LGH)02K17%b8k>>El^rLKY
z!NAu;+@7YqnZSu4@maF-f|j~iWTV+(h?c^)gV6zmFOTo$P_`P@dw3@y^tP)5nGFR{
zt~(*#z_g+J4$^#Vch$YU!ghvtYH_iw5Tit!!^r1Y&d{hA)al=8-se~^yaLi3D_kX;
z?D6%_x+WmY6GZWBtmsl*o5ck*MYti}53L+*OueWaPrBAkDkU&Lfne|0w~
zL*@r%cZc_9s*it)9vXviW1|fkl6t+$d=PL!ZMEfY8{>5Q__v3WLjHJPU>8NNjAbO6
z$#vt%w?}E_yj|W*!607C4T2&jt};ed#s^E
z**uMbiGloN?*f^O10IF;;S9o}=|q9xni~F2Z7Y%0Q<+eVyU?zSWm~C>7Xcd_7liKOG`^?YZE4?r>nQJ06$2m
zF)Qs|Qj+}lubY6|zAgl|VBhPHjtwz>3`k+A5Or~zpZN0W`V@H=b@mUtzDbc;oSkLo
zgAy{+d++mLfkpJo-##apX=sr6RTca<r}_F
z<#uzzK*WV)>xDa5I4vN&dG7hBFkJ*#TC1_MVgO@aj*=E-a6Ga(UduDwz>w(FAh^FtI
zpvg>35QqQyxIU64hs-PIm{VX~_1==`fi8Mcn2Aa5jZhtR&e``sd)0eR23u}8Mq!`V
zU;a8n>!nY0IuDEYxr2F^t>o|#>y?#)xQhN6V7OtM3naS5NV}+_KjyC_aN_Oz|6<1bK`SKQ@
z2|nG#v>$lOoCw4Y=33So?C&PVx++e9-Jzo|&W1D!=wDmIseK{(;Tdd+C
zKJ4FBF)g9D;`VF*yOLvf$4-Rv$I!>{9^^!!J295Xwr;ru8#7#S+
zb;a;qMrR(rCYUrIR#4JXRfP}b>ZzN+_Ym^Ns>`sK>d@b{d|ZmKBUxv-8F9GeyqOvg
z%})`&&{t;e(b31BRPRq`vE~{cYR{ZDkjN~JgrA_)2Q#@^&Iv6?+Lrv5fSlr+Go4%V
zUcp|osUknInsV&unUZl-5+_F0HEae|Mr*FzhKgss-#U-8`DkqUV|e
z%>SIbPDEqPXcSbJFTg1wqpuw%S~{OIGk0S2g`^&T(;dP*HL;+Tc*v9-OUPt|HNQC3
z1?D0_sC$Ub2T4Ao8>b3@O$9%n!t5V^KP(K$M~h4ED?Nt?^l6e5b83Rim6y)P^&e1p
zimK3Gi*Ai*xTA*{7#^*+OG-mue6iMYmT+-kb1uZuYiVo#^YoCm*g|o~BNHWK?qLGmo3Z1%R^m0p(|P
z+hw;w5&ib_u!|`x-#1sHVJVG!9817)3t)R=uy7_h9~0hD?9Xr;v62v7I*#fnUg$-z
z1{o$UtzyNTWNrcEg}0wW)g}}#4a}1MyM%e)!;~_d9-cFyY->`n&5-oH6
zx-+iuTc;9Rj4Y?{(h0=N*(OJv+vZ&^y$C^db!#%@T{0G35;7t_y34B|zl+#1u@WcP>^m+xZJQo@Y{
zjAj)4XFb4{c;|sG;V~MhbVZo+psl2NO~|NlWH*M8(;H%lMvm!4B+`0&9~C>$Yn8`^
zlv23*Ua{wCel_?T5kk?yJHT~cz5|VIRYM`W(7IwC=XB$!xq|Y*>6C1O_}Z@`!+~~^
zwnCBw@M~&j%A?3;@$#)yk`zE(nu^B%Wr#~qp9OHTo;9O^7cw{3?;5EbYoM)T$a(B*
z@tzgOi&AETQ?lt(@#Z!Dg2+a4$mo%Dq{-&s3hU5mJN)g#9Qjr$*cmL#us(R<{D=?&
z5#yqbB=`}~A!jmNS6<|!5nmVQhd66(SO?TVKS1o*T|Jxo2gk$x@~6oeGWWX!|3LRI
z?^Lgt`L!siNC9Z94%9bcW3zD@Mm|A2A0xZtvxec*0oHQdkY#y1%K9EQX~+BbDJln;
zukJ|_NtujIn@;)Q7$b|s$V-e4pYPwGS?U@wg`dAfv%K_f@6o$KjGcvXt%h$YHCV*YGGlxv8m~)tP~N33IEyI
z+2``F`Sm{&X!q@2VAED}~IAp(1%@Itv4;ylN2}
zH9DXxi6Pd>r_!n%&I@RXgOR~i%5~Hrq
z0xN0uMnjP7>WQmymaa#amzO1Vb#A&egl799`Iqb|ynuvKcxZnp?xPOciUs>5rdBXp
z?}WdWeAkjHeml1`FyMAL7g@iEj5dj_;N8t94HVG{xO5_rJQb>*rk8uw^AaLux%Y0e
z_eGX7wEvSza_CGklY557trLkXcK+q&))wKO=CEt4a64Oj<$OtJ@E&n}fr;FIAL@
zbOcOjDga7Urnooxix)3~uYY*#GJ0MwQ#2J9KL~QZ|8dT)zVD>tC1Rz(n?gI>wJ!6HGZ!0e=K!D4>VIz_3;NYMY?4jC#o2pLHWq9ZqcL+)du(c)X>#W89eFy(PtV>}txsiUW-}vj*^_^0
zf&}kb-U^=sdPzR37lnLiokUJ{K|%23uU{4Ci{2xngy#L?=aq)u?mQu#?X(2gz+A06
zh1usymh*W_E72&yUsY@PwL1G0acG~>Y#X+;H8uGKB_*>qwzjTX9n%Q#Tu&nd>(TzY
zk(Mix*r8TbUarBwAV-tXSKe$Jvj3qJ%vQLcvqdw#L9fuGnro`3=Q}+yei+Qdc{k$`
zeZ3++K0XHyF0N_RNz2gbr6hot%`V9>Fh<_Vco3VKI&d>P=C7Yy^B$&+1VKRFQ@_iN
zB(t09vG8QNU~QwiPQ;Y{EgGZ*a3V=5m;Uw3Wwk4eM7PyGL$mIEf1JL)p5EfX&!6y?
z=H_d=mYP!Sp55JDO7vu0?i9#`TeL7<{TMljIzHp#B3x2d#f%f=10FjF@ZX!%15Vca
zlf^u%w1;T~x=PSUdO9FeV`J@$o?CSDUHctJd`2EoU>E6X>c-A%
z@+^an&f};Z`*;+PB{UiPD))q)z2oYzm9S|cipQ*{`L(|O6?01sRhx*YNZT*~4$!T)
zr&~j=^+aB6t#pR87AL`DeLRsaOIXvj17Cy%118#bk~B
zg2>--WiF}@a2RmPV83}~K9b<3{@XVBORT@|)n88q1TfcDaBXoPj>zZAS=A?lz{XGW
zLFg-F!CnC@n00UOA%3}MND{*EbaC?^g=WuGn0)HDI>nsdglcMHHmHAn=#pt4}fU8bbwRn0YXXFLyYp+N2XJKH1GtB%^O=$fvQWXqPH?Hd_$n
zA~ZGglmi52tFGwgM6n3%vF#n2=*X|{TtjgRSOsd)*y8{Z^55C)3UV5DN8fD!6ONFvrnd>A)PBy?(X&bJFOSp
zT)zuc(==6e2~m}1z4x+dE4cb#%u)vNrb5iA9tiyF=QY
zXK86^su~3Qm>1l
zr~z&iN4t;kJO)~J6HwT@_hWFQ;|sm}7i1rEbaq|=hI3L=G}t6_adlNHsJEVAg+P|z
zSAUw`jBN>t#|q)g#*<7G9LG-<&)C&31W-Wzf<~hF@HR---|?N8AzL(av$L1`6B83_
zwTtikT5uZF&+mo{tPcg{m9s{J!QN~Sn~Bf$aW6lK8Vq1sCR*va+LFALtM&Ooc?@C%
z)1jMbDJhp-xa`HzrtgkXkTyhAK(yd5
z-uz=HkIUm=y@EpATaetbXw7z_zI~XkKGkJGe!jSomR2p#xYwtkA@>XE498v2$m?h4
z-T?1>e>pA`^ssimkb|EjltYe;LM4QS-^C*nHuu7O`hCJev(HcGP(8?o7Orzo&}zM)U8NymSOvxIa?_w1qbE)(q>;b|__
zIwzGh|17w=|CzUj+km*XrW4c+KRY1r@*ZsRgW(#_N^ieU2sRlRS?5>iOTs>w>~d83
zlF7r6tgs`V_DUhz=d;$>#L+tvvcx1GS%{o1+Ea8qn44~TWUOyd=j?9`FEbg-dy{Z`
zzk&q2O-=5fqM&2;B+^8(>7GG?ynYdG`lcy+<*o2vrj-?UNB&tmMw|eeM>qka8MlN(
XILp_{iZbsZ;HD&}_OeXIIN*N)5Nlry
delta 10036
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
C(CG63
diff --git a/tgstation.dme b/tgstation.dme
index b5aa04be630..2f156d67542 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1940,6 +1940,7 @@
#include "code\game\objects\items\powerfist.dm"
#include "code\game\objects\items\puzzle_pieces.dm"
#include "code\game\objects\items\religion.dm"
+#include "code\game\objects\items\rollertable_dock.dm"
#include "code\game\objects\items\scrolls.dm"
#include "code\game\objects\items\secret_documents.dm"
#include "code\game\objects\items\sharpener.dm"