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 f409a5c38b1..9f8b0142e9c 100644 Binary files a/icons/mob/silicon/robot_items.dmi and b/icons/mob/silicon/robot_items.dmi differ diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index 55ef7645645..4ec74abe726 100644 Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ 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"