From b7d64987dab26712106fd6b35f5b2e4121aac2dd Mon Sep 17 00:00:00 2001
From: Dawnseer <126404225+Dawnseer@users.noreply.github.com>
Date: Sun, 23 Apr 2023 14:17:06 +0200
Subject: [PATCH 01/25] Borger uprising
Yeah okay next time I am going to make a commit for every change instead of making one big change this is hard to organize
---
code/__DEFINES/exosuit_fab.dm | 2 +
.../__DEFINES/research/research_categories.dm | 1 +
code/game/objects/items/kitchen.dm | 10 ++
code/game/objects/items/rcd/RSF.dm | 5 +
code/game/objects/items/robot/items/hypo.dm | 95 ++++++++++++++--
.../objects/items/robot/robot_upgrades.dm | 105 ++++++++++++++++++
code/game/objects/items/rollertable_dock.dm | 58 ++++++++++
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 +++
tgstation.dme | 1 +
12 files changed, 332 insertions(+), 15 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 439ed6b6162911..706daf6e2dec29 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 f9ce318d3add20..e8d426fcfc5a7c 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/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm
index 48b916e1f44f1e..4c171b2b13d713 100644
--- a/code/game/objects/items/kitchen.dm
+++ b/code/game/objects/items/kitchen.dm
@@ -102,6 +102,16 @@
. = ..()
AddElement(/datum/element/easily_fragmented, PLASTIC_BREAK_PROBABILITY)
+/obj/item/knife/kitchen/silicon
+ name= "Silicon Knife"
+ icon_state = "knife"
+ desc = "A breakthrough in synthetic engineering, this knife is programmed to dull when not used for cooking purposes."
+ force = 0
+ throwforce = 0
+ sharpness = SHARP_EDGED
+ 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 f4688c8283a209..473a2b15719950 100644
--- a/code/game/objects/items/rcd/RSF.dm
+++ b/code/game/objects/items/rcd/RSF.dm
@@ -36,6 +36,11 @@ RSF
/obj/item/storage/dice = 200,
/obj/item/pen = 50,
/obj/item/clothing/mask/cigarette = 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,
)
///An associated list of fuel and it's value
var/list/matter_by_item = list(/obj/item/rcd_ammo = 10,)
diff --git a/code/game/objects/items/robot/items/hypo.dm b/code/game/objects/items/robot/items/hypo.dm
index 5c501a59c15cc5..3ab381008c1f52 100644
--- a/code/game/objects/items/robot/items/hypo.dm
+++ b/code/game/objects/items/robot/items/hypo.dm
@@ -52,14 +52,14 @@
/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/ethanol/ale, /datum/reagent/consumable/ethanol/applejack, /datum/reagent/consumable/ethanol/beer,\
@@ -69,6 +69,10 @@
/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/flour, /datum/reagent/consumable/cornmeal, /datum/reagent/consumable/corn_syrup,\
+ /datum/reagent/consumable/rice, /datum/reagent/consumable/salt, /datum/reagent/consumable/blackpepper, /datum/reagent/consumable/sugar,\
+ /datum/reagent/consumable/coco, /datum/reagent/consumable/vanilla, /datum/reagent/consumable/eggwhite, /datum/reagent/consumable/eggyolk\
+ )
#define HACKED_SERVICE_REAGENTS list(\
/datum/reagent/toxin/fakebeer,\
/datum/reagent/consumable/ethanol/fernet\
@@ -215,7 +219,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
@@ -310,6 +313,8 @@
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 +325,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 +374,76 @@
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/condimentsynthesizer // Solids! Condiments! The borger uprising!
+ name = "Condiment Synthesizer"
+ desc = "An advanced condiment synthesizer"
+ icon = 'icons/obj/food/containers.dmi'
+ icon_state = "flour"
+ inhand_icon_state = "carton"
+ possible_transfer_amounts = list(5,10,20)
+ // 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/condimentsynthesizer/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/condimentsynthesizer/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,
+ ))) // 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/condimentbag/attack(mob/M, mob/user)
+ return //Can't inject stuff with a shaker, can we? //not with that attitude
+
+/obj/item/reagent_containers/borghypo/condimentsynthesizer/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())
+ 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")
+ return .
+
+
+
/obj/item/reagent_containers/borghypo/borgshaker/hacked
name = "cyborg shaker"
@@ -389,4 +463,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/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 1336a043e7f5a1..b4c1230692cce3 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -750,6 +750,111 @@
var/obj/item/pushbroom/cyborg/BR = locate() in R.model.modules
if (BR)
R.model.remove_module(BR, TRUE)
+
+/obj/item/borg/upgrade/condimentsynthesizer
+ 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/condimentsynthesizer/action(mob/living/silicon/robot/R, user = usr)
+ . = ..()
+ if(.)
+ var/obj/item/reagent_containers/borghypo/condimentsynthesizer/CS = locate() in R.model.modules
+ if(CS)
+ to_chat(user, span_warning("This unit has no room for another condiment synthesizer!"))
+ return FALSE
+ CS = new(R.model)
+ R.model.basic_modules += CS
+ R.model.add_module(CS, FALSE, TRUE)
+
+/obj/item/borg/upgrade/condimentsynthesizer/deactivate(mob/living/silicon/robot/R, user = usr)
+ . = ..()
+ if (.)
+ var/obj/item/reagent_containers/borghypo/condimentsynthesizer/CS = locate() in R.model.modules
+ if (CS)
+ R.model.remove_module(CS, TRUE)
+
+/obj/item/borg/upgrade/siliconknife
+ name = "Service Cyborg silicon Knife"
+ 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/siliconknife/action(mob/living/silicon/robot/R, user = usr)
+ . = ..()
+ if(.)
+ var/obj/item/knife/kitchen/silicon/SK = locate() in R.model.modules
+ if(SK)
+ to_chat(user, span_warning("This unit has no room for another silicon knife!"))
+ return FALSE
+ SK = new(R.model)
+ R.model.basic_modules += SK
+ R.model.add_module(SK, FALSE, TRUE)
+
+/obj/item/borg/upgrade/siliconknife/deactivate(mob/living/silicon/robot/R, user = usr)
+ . = ..()
+ if (.)
+ var/obj/item/knife/kitchen/silicon/SK = locate() in R.model.modules
+ if (SK)
+ R.model.remove_module(SK, TRUE)
+
+/obj/item/borg/upgrade/rollingpin
+ name = "Service Cyborg Rolling Pin"
+ 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/rollingpin/action(mob/living/silicon/robot/R, user = usr)
+ . = ..()
+ if(.)
+ var/obj/item/kitchen/rollingpin/RP = locate() in R.model.modules
+ if(RP)
+ to_chat(user, span_warning("This unit has no room for another rolling pin!"))
+ return FALSE
+ RP = new(R.model)
+ R.model.basic_modules += RP
+ R.model.add_module(RP, FALSE, TRUE)
+
+/obj/item/borg/upgrade/rollingpin/deactivate(mob/living/silicon/robot/R, user = usr)
+ . = ..()
+ if (.)
+ var/obj/item/kitchen/rollingpin/RP = locate() in R.model.modules
+ if (RP)
+ R.model.remove_module(RP, TRUE)
+
+/obj/item/borg/upgrade/rollingtable
+ 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/rollingtable/action(mob/living/silicon/robot/R, user = usr)
+ . = ..()
+ if(.)
+ var/obj/item/rollingtable_dock/RT = locate() in R.model.modules
+ if(RT)
+ to_chat(user, span_warning("This unit has no room for another rolling table dock!"))
+ return FALSE
+ RT = new(R.model)
+ R.model.basic_modules += RT
+ R.model.add_module(RT, FALSE, TRUE)
+
+/obj/item/borg/upgrade/rollingtable/deactivate(mob/living/silicon/robot/R, user = usr)
+ . = ..()
+ if (.)
+ var/obj/item/rollingtable_dock/RT = locate() in R.model.modules
+ if (RT)
+ R.model.remove_module(RT, 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 00000000000000..f1a1fb4b715b52
--- /dev/null
+++ b/code/game/objects/items/rollertable_dock.dm
@@ -0,0 +1,58 @@
+/obj/item/rollingtable_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/rollingtable_dock/Initialize(mapload)
+ . = ..()
+ loaded = new(src)
+
+/obj/structure/table/rolling/attackby(obj/item/WT, mob/user, params)
+ if(istype(WT, /obj/item/rollingtable_dock))
+ var/obj/item/rollingtable_dock/RT = WT
+ var/turf/target_table = get_turf(src)
+ if(RT.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
+ RT.loaded = src
+ forceMove(RT)
+ user.visible_message(span_notice("[user] collects [src]."), span_notice("You collect [src]."))
+ return 1
+ else
+ return ..()
+
+
+/obj/item/rollingtable_dock/afterattack(obj/target, mob/user , proximity)
+ . = ..()
+ var/turf/target_turf = get_turf(target)
+ if(!proximity)
+ return
+ if(target_turf.is_blocked_turf(TRUE))
+ return
+ if(locate(/mob/living) in target_turf)
+ return
+ if(isopenturf(target))
+ deploy_rollingtable(user, target)
+
+/obj/item/rollingtable_dock/proc/deploy_rollingtable(mob/user, atom/location)
+ var/obj/structure/table/rolling/RT = new /obj/structure/table/rolling(location)
+ RT.add_fingerprint(user)
+ qdel(src)
+
+/obj/item/rollingtable_dock/examine(mob/user)
+ . = ..()
+ . += "The dock is [loaded ? "loaded" : "empty"]."
+
+/obj/item/rollingtable_dock/deploy_rollingtable(mob/user, atom/location)
+ if(loaded)
+ loaded.forceMove(location)
+ user.visible_message(span_notice("[user] deploys [loaded]."), span_notice("You deploy [loaded]."))
+ loaded = null
+ else
+ to_chat(user, span_warning("The dock is empty!"))
diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm
index 14f50ca0dab867..3a7687ebebf280 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 ecaac0431def76..cf602c3905b2a2 100644
--- a/code/modules/mob/living/silicon/robot/robot_model.dm
+++ b/code/modules/mob/living/silicon/robot/robot_model.dm
@@ -744,24 +744,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 f4a333e2cb5b8d..5e14866b57428c 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_rollingtable
+ name = "Rolling Table Dock"
+ id = "borg_upgrade_rollingtable"
+ build_type = MECHFAB
+ build_path = /obj/item/borg/upgrade/rollingtable
+ 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 = 40
+ category = list(
+ RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_SERVICE
+ )
+
+/datum/design/borg_upgrade_condimentsynthesizer
+ name = "Condiment Synthesizer"
+ id = "borg_upgrade_condimentsynthesizer"
+ build_type = MECHFAB
+ build_path = /obj/item/borg/upgrade/condimentsynthesizer
+ materials = list(/datum/material/iron = 15000, /datum/material/glass = 15000, /datum/material/plasma = 8000, /datum/material/uranium = 8000) //Same price as an expanded hypo for medical borg
+ construction_time = 40
+ category = list(
+ RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_SERVICE
+ )
+
+/datum/design/borg_upgrade_siliconknife
+ name = "Silicon Knife"
+ id = "borg_upgrade_siliconknife"
+ build_type = MECHFAB
+ build_path = /obj/item/borg/upgrade/siliconknife
+ materials = list(/datum/material/iron = 12000, /datum/material/gold = 1000) //Cost of a kitchen knife with some added gold. It is a silicon knife after all
+ construction_time = 40
+ category = list(
+ RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_SERVICE
+ )
+
+/datum/design/borg_upgrade_rollingpin
+ name = "Rolling Pin"
+ id = "borg_upgrade_rollingpin"
+ build_type = MECHFAB
+ build_path = /obj/item/borg/upgrade/rollingpin
+ materials = list(/datum/material/iron = 12000)
+ construction_time = 40
+ 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 5742528ad74d5c..d39c7c5f144dd0 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_rollingtable",
+ "borg_upgrade_condimentsynthesizer",
+ "borg_upgrade_siliconknife",
+ "borg_upgrade_rollingpin",
+ )
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
/datum/techweb_node/cyborg_upg_engiminer
id = "cyborg_upg_engiminer"
diff --git a/tgstation.dme b/tgstation.dme
index f69048e98c0519..3a2a058fe6901a 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1842,6 +1842,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"
From 8fd6d5f2857c28e334f613342a023f199c9dc2ac Mon Sep 17 00:00:00 2001
From: Dawnseer <126404225+Dawnseer@users.noreply.github.com>
Date: Sun, 23 Apr 2023 15:03:07 +0200
Subject: [PATCH 02/25] empty space n fix
---
code/game/objects/items/robot/items/hypo.dm | 8 +-------
code/game/objects/items/rollertable_dock.dm | 5 ++---
2 files changed, 3 insertions(+), 10 deletions(-)
diff --git a/code/game/objects/items/robot/items/hypo.dm b/code/game/objects/items/robot/items/hypo.dm
index 3ab381008c1f52..47d46b97344a7c 100644
--- a/code/game/objects/items/robot/items/hypo.dm
+++ b/code/game/objects/items/robot/items/hypo.dm
@@ -375,7 +375,6 @@
balloon_alert(user, "[amount_per_transfer_from_this] unit\s poured")
return .
-
/obj/item/reagent_containers/borghypo/condimentsynthesizer // Solids! Condiments! The borger uprising!
name = "Condiment Synthesizer"
desc = "An advanced condiment synthesizer"
@@ -411,9 +410,7 @@
data["reagents"] = condiments
data["selectedReagent"] = selected_reagent?.name
return data
-
-
-
+
/obj/item/reagent_containers/borghypo/condimentbag/attack(mob/M, mob/user)
return //Can't inject stuff with a shaker, can we? //not with that attitude
@@ -441,9 +438,6 @@
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/borgshaker/hacked
name = "cyborg shaker"
diff --git a/code/game/objects/items/rollertable_dock.dm b/code/game/objects/items/rollertable_dock.dm
index f1a1fb4b715b52..57105367947a30 100644
--- a/code/game/objects/items/rollertable_dock.dm
+++ b/code/game/objects/items/rollertable_dock.dm
@@ -1,8 +1,8 @@
/obj/item/rollingtable_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"
+ icon = 'icons/obj/medical/rollerbed.dmi'
+ icon_state = "folded""
var/obj/structure/table/rolling/loaded = null
/obj/item/rollingtable_dock/Initialize(mapload)
@@ -27,7 +27,6 @@
else
return ..()
-
/obj/item/rollingtable_dock/afterattack(obj/target, mob/user , proximity)
. = ..()
var/turf/target_turf = get_turf(target)
From 1be2dfad36395e6c29023da2ed076eaf36f99972 Mon Sep 17 00:00:00 2001
From: Dawnseer <126404225+Dawnseer@users.noreply.github.com>
Date: Sun, 23 Apr 2023 15:09:37 +0200
Subject: [PATCH 03/25] Whoops
---
code/game/objects/items/rollertable_dock.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/game/objects/items/rollertable_dock.dm b/code/game/objects/items/rollertable_dock.dm
index 57105367947a30..6be47516a535bc 100644
--- a/code/game/objects/items/rollertable_dock.dm
+++ b/code/game/objects/items/rollertable_dock.dm
@@ -2,7 +2,7 @@
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/medical/rollerbed.dmi'
- icon_state = "folded""
+ icon_state = "folded"
var/obj/structure/table/rolling/loaded = null
/obj/item/rollingtable_dock/Initialize(mapload)
From d7ad8fa931670650319434ae38599f309f3fc345 Mon Sep 17 00:00:00 2001
From: Dawnseer <126404225+Dawnseer@users.noreply.github.com>
Date: Sun, 23 Apr 2023 15:25:33 +0200
Subject: [PATCH 04/25] Come on now
---
code/game/objects/items/robot/items/hypo.dm | 1 -
code/game/objects/items/rollertable_dock.dm | 4 ++--
2 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/code/game/objects/items/robot/items/hypo.dm b/code/game/objects/items/robot/items/hypo.dm
index 47d46b97344a7c..de8c19c5c447d0 100644
--- a/code/game/objects/items/robot/items/hypo.dm
+++ b/code/game/objects/items/robot/items/hypo.dm
@@ -380,7 +380,6 @@
desc = "An advanced condiment synthesizer"
icon = 'icons/obj/food/containers.dmi'
icon_state = "flour"
- inhand_icon_state = "carton"
possible_transfer_amounts = list(5,10,20)
// 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
diff --git a/code/game/objects/items/rollertable_dock.dm b/code/game/objects/items/rollertable_dock.dm
index 6be47516a535bc..89bbe83e30d25c 100644
--- a/code/game/objects/items/rollertable_dock.dm
+++ b/code/game/objects/items/rollertable_dock.dm
@@ -1,8 +1,8 @@
/obj/item/rollingtable_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/medical/rollerbed.dmi'
- icon_state = "folded"
+ icon = 'icons/obj/smooth_structures/rollingtable.dmi'
+ icon_state = "rollingtable"
var/obj/structure/table/rolling/loaded = null
/obj/item/rollingtable_dock/Initialize(mapload)
From c838f915aa467c99479f1824f45782c33e0c0977 Mon Sep 17 00:00:00 2001
From: Dawnseer <126404225+Dawnseer@users.noreply.github.com>
Date: Mon, 24 Apr 2023 19:58:57 +0200
Subject: [PATCH 05/25] Knifepin, service apparatus
Added the suggested knife/rolling pin power tool, but made some alterations such as it not being faster, and still keeping the whole 'no stabby' part, while also making the rolling pin sound blunt
---
code/game/objects/items/kitchen.dm | 35 ++++++++++++++++--
.../game/objects/items/robot/items/storage.dm | 31 ++++++++++++++++
.../objects/items/robot/robot_upgrades.dm | 16 ++++----
.../designs/mechfabricator_designs.dm | 14 +++----
code/modules/research/techweb/all_nodes.dm | 2 +-
icons/obj/kitchen.dmi | Bin 29190 -> 30987 bytes
6 files changed, 79 insertions(+), 19 deletions(-)
diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm
index cec4106297c7f0..88eb2c03d5b0a7 100644
--- a/code/game/objects/items/kitchen.dm
+++ b/code/game/objects/items/kitchen.dm
@@ -104,14 +104,43 @@
/obj/item/knife/kitchen/silicon
name= "Silicon Knife"
- icon_state = "knife"
- desc = "A breakthrough in synthetic engineering, this knife is programmed to dull when not used for cooking purposes."
+ icon_state = "SiliKnife"
+ desc = "A breakthrough in synthetic engineering, this cyborg tool is 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
+ usesound = 'sound/items/drill_use.ogg'
+ 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 == TOOL_KNIFE ? "knife" : "rolling pin"] 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 = "SiliRollingpin"
+ 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 = "SiliKnife"
+ 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/robot/items/storage.dm b/code/game/objects/items/robot/items/storage.dm
index c67aa202089650..e6a770e1ce5916 100644
--- a/code/game/objects/items/robot/items/storage.dm
+++ b/code/game/objects/items/robot/items/storage.dm
@@ -300,3 +300,34 @@
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 and oven trays"
+ icon_state = "borg_hardware_apparatus"
+ storable = list(/obj/item/plate/oven_tray,
+ /obj/item/food)
+
+/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. ")
\ No newline at end of file
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index b4c1230692cce3..4063360ae364f0 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -804,29 +804,29 @@
if (SK)
R.model.remove_module(SK, TRUE)
-/obj/item/borg/upgrade/rollingpin
- name = "Service Cyborg Rolling Pin"
- desc = "An upgrade to the service model cyborg, to help process foods"
+/obj/item/borg/upgrade/serviceapparatus
+ name = "Service Cyborg Service Apparatus"
+ desc = "An upgrade to the service model cyborg, to help handle 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/rollingpin/action(mob/living/silicon/robot/R, user = usr)
+/obj/item/borg/upgrade/serviceapparatus/action(mob/living/silicon/robot/R, user = usr)
. = ..()
if(.)
- var/obj/item/kitchen/rollingpin/RP = locate() in R.model.modules
+ var/obj/item/borg/apparatus/service/RP = locate() in R.model.modules
if(RP)
- to_chat(user, span_warning("This unit has no room for another rolling pin!"))
+ to_chat(user, span_warning("This unit has no room for another service apparatus!"))
return FALSE
RP = new(R.model)
R.model.basic_modules += RP
R.model.add_module(RP, FALSE, TRUE)
-/obj/item/borg/upgrade/rollingpin/deactivate(mob/living/silicon/robot/R, user = usr)
+/obj/item/borg/upgrade/serviceapparatus/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..()
if (.)
- var/obj/item/kitchen/rollingpin/RP = locate() in R.model.modules
+ var/obj/item/borg/apparatus/service/RP = locate() in R.model.modules
if (RP)
R.model.remove_module(RP, TRUE)
diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm
index 5e14866b57428c..8193c9da5628f8 100644
--- a/code/modules/research/designs/mechfabricator_designs.dm
+++ b/code/modules/research/designs/mechfabricator_designs.dm
@@ -1164,7 +1164,7 @@
id = "borg_upgrade_condimentsynthesizer"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/condimentsynthesizer
- materials = list(/datum/material/iron = 15000, /datum/material/glass = 15000, /datum/material/plasma = 8000, /datum/material/uranium = 8000) //Same price as an expanded hypo for medical borg
+ 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 = 40
category = list(
RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_SERVICE
@@ -1175,18 +1175,18 @@
id = "borg_upgrade_siliconknife"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/siliconknife
- materials = list(/datum/material/iron = 12000, /datum/material/gold = 1000) //Cost of a kitchen knife with some added gold. It is a silicon knife after all
+ materials = list(/datum/material/iron = 15000, /datum/material/gold = 1000, datum/material/silver = 1000,)
construction_time = 40
category = list(
RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_SERVICE
)
-/datum/design/borg_upgrade_rollingpin
- name = "Rolling Pin"
- id = "borg_upgrade_rollingpin"
+/datum/design/borg_upgrade_serviceapparatus
+ name = "Service apparatus"
+ id = "borg_upgrade_serviceapparatus"
build_type = MECHFAB
- build_path = /obj/item/borg/upgrade/rollingpin
- materials = list(/datum/material/iron = 12000)
+ build_path = /obj/item/borg/upgrade/serviceapparatus
+ materials = list(/datum/material/iron = 5000)
construction_time = 40
category = list(
RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_SERVICE
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index d39c7c5f144dd0..a2b012a9f2820c 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -953,7 +953,7 @@
"borg_upgrade_rollingtable",
"borg_upgrade_condimentsynthesizer",
"borg_upgrade_siliconknife",
- "borg_upgrade_rollingpin",
+ "borg_upgrade_serviceapparatus",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi
index 37cf5ca6904f263bf82d82e0b9ecc832d2667b98..b3d407c87d8e6ba1796cc8ea83153c581bba305b 100644
GIT binary patch
literal 30987
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