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(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 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"