diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index a338588df0..4d7179bbfc 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -504,7 +504,7 @@ var/global/list/robot_modules = list(
src.modules += L
src.modules += new /obj/item/weapon/tray/robotray(src)
- src.modules += new /obj/item/weapon/reagent_containers/food/drinks/shaker(src)
+ src.modules += new /obj/item/weapon/reagent_containers/borghypo/service(src)
src.emag = new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
var/datum/reagents/R = new/datum/reagents(50)
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index 985ed3d9d2..47c80d42a1 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -1,5 +1,5 @@
/obj/item/weapon/reagent_containers/borghypo
- name = "Cyborg Hypospray"
+ name = "cyborg hypospray"
desc = "An advanced chemical synthesizer and injection system, designed for heavy-duty medical equipment."
icon = 'icons/obj/syringe.dmi'
item_state = "hypo"
@@ -7,13 +7,15 @@
amount_per_transfer_from_this = 5
volume = 30
possible_transfer_amounts = null
+
var/mode = 1
var/charge_cost = 50
var/charge_tick = 0
var/recharge_time = 5 //Time it takes for shots to recharge (in seconds)
- var/list/datum/reagents/reagent_list = list()
var/list/reagent_ids = list("tricordrazine", "inaprovaline", "spaceacillin")
+ var/list/reagent_volumes = list()
+ var/list/reagent_names = list()
/obj/item/weapon/reagent_containers/borghypo/surgeon
reagent_ids = list("bicaridine", "inaprovaline", "dexalin")
@@ -23,79 +25,114 @@
/obj/item/weapon/reagent_containers/borghypo/New()
..()
- for(var/R in reagent_ids)
- add_reagent(R)
+
+ for(var/T in reagent_ids)
+ reagent_volumes[T] = volume
+ var/datum/reagent/R = chemical_reagents_list[T]
+ reagent_names += R.name
processing_objects.Add(src)
-
/obj/item/weapon/reagent_containers/borghypo/Destroy()
processing_objects.Remove(src)
..()
-/obj/item/weapon/reagent_containers/borghypo/process() //Every [recharge_time] seconds, recharge some reagents for the cyborg
- charge_tick++
- if(charge_tick < recharge_time) return 0
+/obj/item/weapon/reagent_containers/borghypo/process() //Every [recharge_time] seconds, recharge some reagents for the cyborg+
+ if(++charge_tick < recharge_time)
+ return 0
charge_tick = 0
if(isrobot(loc))
var/mob/living/silicon/robot/R = loc
if(R && R.cell)
- var/datum/reagents/RG = reagent_list[mode]
- if(RG.total_volume < RG.maximum_volume) //Don't recharge reagents and drain power if the storage is full.
- R.cell.use(charge_cost) //Take power from borg...
- RG.add_reagent(reagent_ids[mode], 5) //And fill hypo with reagent.
+ for(var/T in reagent_ids)
+ if(reagent_volumes[T] < volume)
+ R.cell.use(charge_cost)
+ reagent_volumes[T] = min(reagent_volumes[T] + 5, volume)
return 1
-// Use this to add more chemicals for the borghypo to produce.
-/obj/item/weapon/reagent_containers/borghypo/proc/add_reagent(var/reagent)
- reagent_ids |= reagent
- var/datum/reagents/RG = new(30)
- RG.my_atom = src
- reagent_list += RG
+/obj/item/weapon/reagent_containers/borghypo/attack(var/mob/living/M, var/mob/user)
+ if(!istype(M))
+ return
- var/datum/reagents/R = reagent_list[reagent_list.len]
- R.add_reagent(reagent, 30)
-
-/obj/item/weapon/reagent_containers/borghypo/attack(mob/living/M as mob, mob/user as mob)
- var/datum/reagents/R = reagent_list[mode]
- if(!R.total_volume)
+ if(!reagent_volumes[reagent_ids[mode]])
user << "The injector is empty."
return
- if (!istype(M))
- return
- if (R.total_volume && M.can_inject(user, 1))
+ if(M.can_inject(user, 1))
user << "You inject [M] with the injector."
M << "You feel a tiny prick!"
if(M.reagents)
- var/trans = R.trans_to_mob(M, amount_per_transfer_from_this, CHEM_BLOOD)
- user << "[trans] units injected. [R.total_volume] units remaining."
+ var/t = min(amount_per_transfer_from_this, reagent_volumes[reagent_ids[mode]])
+ M.reagents.add_reagent(reagent_ids[mode], t)
+ reagent_volumes[reagent_ids[mode]] -= t
+ admin_inject_log(user, M, src, reagent_ids[mode], t)
+ user << "[t] units injected. [reagent_volumes[reagent_ids[mode]]] units remaining."
return
-/obj/item/weapon/reagent_containers/borghypo/attack_self(mob/user as mob)
- playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) //Change the mode
- mode++
- if(mode > reagent_list.len)
- mode = 1
+/obj/item/weapon/reagent_containers/borghypo/attack_self(mob/user as mob) //Change the mode
+ var/t = ""
+ for(var/i = 1 to reagent_ids.len)
+ if(t)
+ t += ", "
+ if(mode == i)
+ t += "[reagent_names[i]]"
+ else
+ t += "[reagent_names[i]]"
+ t = "Available reagents: [t]."
+ user << t
- charge_tick = 0 //Prevents wasted chems/cell charge if you're cycling through modes.
- var/datum/reagent/R = chemical_reagents_list[reagent_ids[mode]]
- user << "Synthesizer is now producing '[R.name]'."
return
+/obj/item/weapon/reagent_containers/borghypo/Topic(var/href, var/list/href_list)
+ if(href_list["reagent"])
+ var/t = reagent_ids.Find(href_list["reagent"])
+ if(t)
+ playsound(loc, 'sound/effects/pop.ogg', 50, 0)
+ mode = t
+ var/datum/reagent/R = chemical_reagents_list[reagent_ids[mode]]
+ usr << "Synthesizer is now producing '[R.name]'."
+
/obj/item/weapon/reagent_containers/borghypo/examine(mob/user)
if(!..(user, 2))
return
- var/empty = 1
+ var/datum/reagent/R = chemical_reagents_list[reagent_ids[mode]]
- for(var/datum/reagents/RS in reagent_list)
- var/datum/reagent/R = locate() in RS.reagent_list
- if(R)
- user << "It currently has [R.volume] units of [R.name] stored."
- empty = 0
+ user << "It is currently producing [R.name] and has [reagent_volumes[reagent_ids[mode]]] out of [volume] units left."
- if(empty)
- user << "It is currently empty. Allow some time for the internal syntheszier to produce more."
+/obj/item/weapon/reagent_containers/borghypo/service
+ name = "cyborg drink synthesizer"
+ desc = "A portable drink dispencer."
+ icon = 'icons/obj/drinks.dmi'
+ icon_state = "shaker"
+ charge_cost = 20
+ recharge_time = 3
+ volume = 60
+ possible_transfer_amounts = list(5, 10, 20, 30)
+ reagent_ids = list("beer", "kahlua", "whiskey", "wine", "vodka", "gin", "rum", "tequilla", "vermouth", "cognac", "ale", "mead", "water", "sugar", "ice", "tea", "icetea", "cola", "spacemountainwind", "dr_gibb", "space_up", "tonic", "sodawater", "lemon_lime", "orangejuice", "limejuice", "watermelonjuice")
+
+/obj/item/weapon/reagent_containers/borghypo/service/attack(var/mob/M, var/mob/user)
+ return
+
+/obj/item/weapon/reagent_containers/borghypo/service/afterattack(var/obj/target, var/mob/user, var/proximity)
+ if(!proximity)
+ return
+
+ if(!target.is_open_container() || !target.reagents)
+ return
+
+ if(!reagent_volumes[reagent_ids[mode]])
+ user << "[src] is out of this reagent, give it some time to refill."
+ return
+
+ if(!target.reagents.get_free_space())
+ user << "[target] is full."
+ return
+
+ var/t = min(amount_per_transfer_from_this, reagent_volumes[reagent_ids[mode]])
+ target.reagents.add_reagent(reagent_ids[mode], t)
+ reagent_volumes[reagent_ids[mode]] -= t
+ user << "You transfer [t] units of the solution to [target]."
+ return
diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm
index 43a406153c..f70e06f421 100644
--- a/code/modules/reagents/reagent_containers/food/drinks.dm
+++ b/code/modules/reagents/reagent_containers/food/drinks.dm
@@ -18,7 +18,6 @@
attack(mob/M as mob, mob/user as mob, def_zone)
if(standard_feed_mob(user, M))
- robot_refill(user)
return
return 0
@@ -29,22 +28,10 @@
if(standard_dispenser_refill(user, target))
return
if(standard_pour_into(user, target))
- robot_refill(user)
return
return ..()
- proc/robot_refill(var/mob/living/silicon/robot/user)
- if(!istype(user))
- return 0
-
- user.cell.use(30)
- var/refill = reagents.get_master_reagent_id()
- user << "Now synthesizing [amount_per_transfer_from_this] units of [refill]..."
- spawn(300)
- reagents.add_reagent(refill, amount_per_transfer_from_this)
- user << "Cyborg [src] refilled."
-
self_feed_message(var/mob/user)
user << "You swallow a gulp from \the [src]."
diff --git a/html/changelogs/Kelenius-ofBorgsAndShakers.yml b/html/changelogs/Kelenius-ofBorgsAndShakers.yml
new file mode 100644
index 0000000000..5f33874986
--- /dev/null
+++ b/html/changelogs/Kelenius-ofBorgsAndShakers.yml
@@ -0,0 +1,6 @@
+author: Kelenius
+
+delete-after: True
+changes:
+ - tweak: "Borg shaker now works similarly to hypospray. It generates reagents that can be poured into glasses."
+ - bugfix: "Therefore, they can no longer duplicate rare reagents such as phoron."