From 61a034bcd93c95f316759c9215527f4c28779cd1 Mon Sep 17 00:00:00 2001 From: Dawnseer <126404225+Dawnseer@users.noreply.github.com> Date: Wed, 3 May 2023 02:59:53 +0200 Subject: [PATCH] Service Borger Upri- Kitchen Upgrades (#74938) ## About The Pull Request I decided that Service Borgs had been left in the dust for too long, and that since they're named 'Service' cyborgs and not 'Bar' cyborgs I'd give them upgrades to let them assist in the kitchen. To do this I've made 4 upgrades. First up, rolling table dock, to provide mobile service. Nothing worse than offering someone a drink in a hallway and having to drag them to the nearest table or having to drop it on the floor. That's poor service. Secondly there's a condiment synthesizer, which can produce solid condiments like flour, cornmeal, salt, coco powder, etc. Thirdly a kitchen toolset, a knife that can switch to a rolling pin. The blade dulls when not used for cooking. Fourthly, A service apparatus, which can pick up food, oven trays, soup pots, plates, bowls and paper. The upgrades are locked behind a new techweb node, Cyborg Upgrades: Service. This node is locked behind the same nodes as the janitorial cyborg upgrade node. And outside the upgrades, I've also given the cyborg a rag so it can finally clean it's glasses and tables. I've also given it a money bag, to store the profits. This gives cyborgs an opportunity to save up for getting on the deluxe shuttle. Or giving people a new target to hold up and shake down for their hard earned money. Please don't law 2 them into giving you their lunch money. Or do. I've also enabled the RSF to print a few more things. Plates, bowls, plastic cutlery and paper cups. I've also enabled borgs to open and close the oven. Alas, they still can't pick up food or the oven trays from the oven, since the oven is sticky in a manner. I've also added a little bit more to the borgshaker, and moved sugar from the borgshaker to the condiment synthesizer. And not only the borgshaker, but the emagged shaker too. The emagged shaker has been given blood and carpotoxin. And you may ask 'Why those two ingredients?' Both can be used like fernet, both for nice things, and harmful things, staying in line with fernet. Blood can be used to mix drinks or be used for food, or for disease, since the borg or anyone with access to milk and water can easily produce virus food. Meanwhile carpotoxin is well, a rather weak toxin but can also be used to make imitation carpmeat. This'l give more reason to also consider the borg for emagging, or giving illegal tech, instead of just speedlining for the nearest engineering borg or medical borg. ![image](https://user-images.githubusercontent.com/126404225/233840472-7665196c-1052-4e29-9749-6c2b99e5fa9e.png) The Condiment Synthesizer uses the same UI as the medical hypo, due to it's ingredient list being low in comparison to the shaker ![image](https://user-images.githubusercontent.com/126404225/235359571-48157d24-f3c8-448f-bb05-6f8842526aae.png) I've been trying to figure out how to get an item to allow the borg to open the cooking menu when used inhand/inmodule. But I can't figure that one out, sadly. Nor how to let the Service Apparatus pick up trays from the oven. So for now, service borgs will have to settle for simply assisting in the kitchen. ## Why It's Good For The Game Allows Service Cyborgs the tools to help in the kitchen, and elsewhere too. ## Changelog :cl: add: Damp rag and Money bag to service borg add: Service borg upgrades, with accompanying tech web node add: Sprites for kitchen toolset, and service apparatus balance: The RSF can print a few more things, paper cups, seaweed sheets, plates, bowls, plastic cutlery and standard decks of cards. balance: Sugar moved from borgshaker to condiment synthesizer. Berry juice, cherry jelly and vinegar added to borgshaker. balance: Both shaker and synthesizer can also be adjusted to give 1 unit at time, so it goes 5, 10, 20 then 1, and back around. balance: Adds blood and Carpotoxin to the emagged borgshaker. fix: Money bag was missing a description, it now has one. /:cl: --- 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 | 12 +- .../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, 444 insertions(+), 26 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 439ed6b6162..706daf6e2de 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 a1f99493fc0..04990f7d4bd 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 5c501a59c15..1631c64f7d1 100644 --- a/code/game/objects/items/robot/items/hypo.dm +++ b/code/game/objects/items/robot/items/hypo.dm @@ -52,16 +52,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,\ @@ -69,10 +69,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 @@ -215,7 +231,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 @@ -304,12 +319,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) @@ -320,7 +336,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)) @@ -370,6 +385,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" @@ -389,4 +468,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 1336a043e7f..fff81331c97 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -750,6 +750,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 758d6e0c965..8e906d85b06 100644 --- a/code/modules/mob/living/silicon/robot/robot_model.dm +++ b/code/modules/mob/living/silicon/robot/robot_model.dm @@ -780,24 +780,26 @@ 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 /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, /obj/item/lighter, - /obj/item/storage/bag/tray, - /obj/item/reagent_containers/borghypo/borgshaker, /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 f4a333e2cb5..2d2f0914d12 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 5742528ad74..471371e9cf4 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -943,6 +943,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(K&#arVR 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 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 XILp_{iZbsZ;HD&}_OeXIIN*N)5Nlry delta 10036 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 C(CG63 diff --git a/tgstation.dme b/tgstation.dme index a717fa5dffd..64c14f41c5e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1857,6 +1857,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"