From 3b33c6c3414491805f7039f1bd9d01685721cc65 Mon Sep 17 00:00:00 2001
From: Ghom <42542238+Ghommie@users.noreply.github.com>
Date: Sat, 1 Feb 2020 18:22:57 +0100
Subject: [PATCH] Ports chem dispenser macro recording
---
.../chemistry/machinery/chem_dispenser.dm | 188 ++++++++----------
tgui/src/interfaces/chem_dispenser.ract | 38 +++-
2 files changed, 119 insertions(+), 107 deletions(-)
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index ba791f83..1234d733 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -31,8 +31,8 @@
var/working_state = "dispenser_working"
var/nopower_state = "dispenser_nopower"
var/has_panel_overlay = TRUE
- var/macrotier = 1
var/obj/item/reagent_containers/beaker = null
+ //dispensable_reagents is copypasted in plumbing synthesizers. Please update accordingly. (I didn't make it global because that would limit custom chem dispensers)
var/list/dispensable_reagents = list(
/datum/reagent/hydrogen,
/datum/reagent/lithium,
@@ -61,7 +61,7 @@
/datum/reagent/bromine,
/datum/reagent/stable_plasma
)
-//these become available once upgraded.
+ //These become available once upgraded.
var/list/upgrade_reagents = list(
/datum/reagent/oil,
/datum/reagent/ammonia,
@@ -87,13 +87,22 @@
/datum/reagent/toxin/histamine,
/datum/reagent/medicine/morphine
)
+ var/list/recording_recipe
var/list/saved_recipes = list()
/obj/machinery/chem_dispenser/Initialize()
. = ..()
- for(var/list/L in list(dispensable_reagents, emagged_reagents, upgrade_reagents, upgrade_reagents2, upgrade_reagents3))
- L = sortList(L, /proc/cmp_reagents_asc)
+ dispensable_reagents = sortList(dispensable_reagents, /proc/cmp_reagents_asc)
+ if(emagged_reagents)
+ emagged_reagents = sortList(emagged_reagents, /proc/cmp_reagents_asc)
+ if(upgrade_reagents)
+ upgrade_reagents = sortList(upgrade_reagents, /proc/cmp_reagents_asc)
+ if(upgrade_reagents2)
+ upgrade_reagents2 = sortList(upgrade_reagents2, /proc/cmp_reagents_asc)
+ if(upgrade_reagents3)
+ upgrade_reagents3 = sortList(upgrade_reagents3, /proc/cmp_reagents_asc)
+ dispensable_reagents = sortList(dispensable_reagents, /proc/cmp_reagents_asc)
update_icon()
/obj/machinery/chem_dispenser/Destroy()
@@ -106,16 +115,9 @@
if(panel_open)
. += "[src]'s maintenance hatch is open!"
if(in_range(user, src) || isobserver(user))
- . += "The status display reads:
Recharging [recharge_amount] power units per interval.
Power efficiency increased by [round((powerefficiency*1000)-100, 1)]%."
- switch(macrotier)
- if(1)
- . += "Macro granularity at 5u."
- if(2)
- . += "Macro granularity at 3u."
- if(3)
- . += "Macro granularity at 2u."
- if(4)
- . += "Macro granularity at 1u."
+ . += "The status display reads:\n\
+ Recharging [recharge_amount] power units per interval.\n\
+ Power efficiency increased by [round((powerefficiency*1000)-100, 1)]%."
/obj/machinery/chem_dispenser/process()
if (recharge_counter >= 4)
@@ -129,7 +131,6 @@
recharge_counter++
/obj/machinery/chem_dispenser/proc/display_beaker()
- ..()
var/mutable_appearance/b_o = beaker_overlay || mutable_appearance(icon, "disp_beaker")
b_o.pixel_y = -4
b_o.pixel_x = -7
@@ -152,14 +153,15 @@
beaker_overlay = display_beaker()
add_overlay(beaker_overlay)
-
/obj/machinery/chem_dispenser/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
to_chat(user, "[src] has no functional safeties to emag.")
return
to_chat(user, "You short out [src]'s safeties.")
dispensable_reagents |= emagged_reagents//add the emagged reagents to the dispensable ones
obj_flags |= EMAGGED
+ return TRUE
/obj/machinery/chem_dispenser/ex_act(severity, target)
if(severity < 3)
@@ -170,11 +172,11 @@
if(beaker)
beaker.ex_act(severity, target)
-/obj/machinery/chem_dispenser/handle_atom_del(atom/A)
- ..()
+/obj/machinery/chem_dispenser/Exited(atom/movable/A, atom/newloc)
+ . = ..()
if(A == beaker)
beaker = null
- cut_overlays()
+ update_icon()
/obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
@@ -215,8 +217,7 @@
data["beakerTransferAmounts"] = null
data["beakerCurrentpH"] = null
- var/chemicals[0]
- var/recipes[0]
+ var/list/chemicals = list()
var/is_hallucinating = FALSE
if(user.hallucinating())
is_hallucinating = TRUE
@@ -227,10 +228,10 @@
if(is_hallucinating && prob(5))
chemname = "[pick_list_replacements("hallucination.json", "chemicals")]"
chemicals.Add(list(list("title" = chemname, "id" = ckey(temp.name))))
- for(var/recipe in saved_recipes)
- recipes.Add(list(recipe))
data["chemicals"] = chemicals
- data["recipes"] = recipes
+ data["recipes"] = saved_recipes
+
+ data["recordingRecipe"] = recording_recipe
return data
/obj/machinery/chem_dispenser/ui_act(action, params)
@@ -248,21 +249,25 @@
if("dispense")
if(!is_operational() || QDELETED(cell))
return
- var/reagent = GLOB.name2reagent[params["reagent"]]
- if(beaker && dispensable_reagents.Find(reagent))
- var/datum/reagents/R = beaker.reagents
- var/free = R.maximum_volume - R.total_volume
- var/actual = min(amount, (cell.charge * powerefficiency)*10, free)
+ var/reagent_name = params["reagent"]
+ if(!recording_recipe)
+ var/reagent = GLOB.name2reagent[reagent_name]
+ if(beaker && dispensable_reagents.Find(reagent))
+ var/datum/reagents/R = beaker.reagents
+ var/free = R.maximum_volume - R.total_volume
+ var/actual = min(amount, (cell.charge * powerefficiency)*10, free)
- if(!cell.use(actual / powerefficiency))
- say("Not enough energy to complete operation!")
- return
- R.add_reagent(reagent, actual)
+ if(!cell.use(actual / powerefficiency))
+ say("Not enough energy to complete operation!")
+ return
+ R.add_reagent(reagent, actual)
- work_animation()
- . = TRUE
+ work_animation()
+ else
+ recording_recipe[reagent_name] += amount
+ . = TRUE
if("remove")
- if(!is_operational())
+ if(!is_operational() || recording_recipe)
return
var/amount = text2num(params["amount"])
if(beaker && amount in beaker.possible_transfer_amounts)
@@ -275,57 +280,65 @@
if("dispense_recipe")
if(!is_operational() || QDELETED(cell))
return
- var/recipe_to_use = params["recipe"]
- var/list/chemicals_to_dispense = process_recipe_list(recipe_to_use)
- var/res = get_macro_resolution()
- for(var/key in chemicals_to_dispense) // i suppose you could edit the list locally before passing it
- var/list/keysplit = splittext(key," ")
- var/r_id = GLOB.name2reagent[translate_legacy_chem_id(keysplit[1])]
- if(beaker && dispensable_reagents.Find(r_id)) // but since we verify we have the reagent, it'll be fine
+ var/list/chemicals_to_dispense = saved_recipes[params["recipe"]]
+ if(!LAZYLEN(chemicals_to_dispense))
+ return
+ for(var/key in chemicals_to_dispense)
+ var/reagent = GLOB.name2reagent[translate_legacy_chem_id(key)]
+ var/dispense_amount = chemicals_to_dispense[key]
+ if(!dispensable_reagents.Find(reagent))
+ return
+ if(!recording_recipe)
+ if(!beaker)
+ return
var/datum/reagents/R = beaker.reagents
var/free = R.maximum_volume - R.total_volume
- var/actual = min(max(chemicals_to_dispense[key], res), (cell.charge * powerefficiency)*10, free)
+ var/actual = min(dispense_amount, (cell.charge * powerefficiency)*10, free)
if(actual)
if(!cell.use(actual / powerefficiency))
say("Not enough energy to complete operation!")
return
- R.add_reagent(r_id, actual)
+ R.add_reagent(reagent, actual)
work_animation()
+ else
+ recording_recipe[key] += dispense_amount
+ . = TRUE
if("clear_recipes")
if(!is_operational())
return
var/yesno = alert("Clear all recipes?",, "Yes","No")
if(yesno == "Yes")
saved_recipes = list()
- if("add_recipe")
+ . = TRUE
+ if("record_recipe")
+ if(!is_operational())
+ return
+ recording_recipe = list()
+ . = TRUE
+ if("save_recording")
if(!is_operational())
return
var/name = stripped_input(usr,"Name","What do you want to name this recipe?", "Recipe", MAX_NAME_LEN)
- var/recipe = stripped_input(usr,"Recipe","Insert recipe with chem IDs")
if(!usr.canUseTopic(src, !issilicon(usr)))
return
- if(name && recipe)
- var/list/first_process = splittext(recipe, ";")
- if(!LAZYLEN(first_process))
- return
- var/res = get_macro_resolution()
- var/resmismatch = FALSE
- for(var/reagents in first_process)
- var/list/reagent = splittext(reagents, "=")
- var/reagent_id = GLOB.name2reagent[translate_legacy_chem_id(reagent[1])]
- if(dispensable_reagents.Find(reagent_id))
- if (!resmismatch && !check_macro_part(reagents, res))
- resmismatch = TRUE
- continue
- else
- var/chemid = reagent[1]
+ if(saved_recipes[name] && alert("\"[name]\" already exists, do you want to overwrite it?",, "Yes", "No") == "No")
+ return
+ if(name && recording_recipe)
+ for(var/reagent in recording_recipe)
+ var/reagent_id = GLOB.name2reagent[translate_legacy_chem_id(reagent)]
+ if(!dispensable_reagents.Find(reagent_id))
visible_message("[src] buzzes.", "You hear a faint buzz.")
- to_chat(usr, "[src] cannot find Chemical ID: [chemid]!")
+ to_chat(usr, "[src] cannot find [reagent]!")
playsound(src, 'sound/machines/buzz-two.ogg', 50, 1)
return
- if (resmismatch && alert("[src] is not yet capable of replicating this recipe with the precision it needs, do you want to save it anyway?",, "Yes","No") == "No")
- return
- saved_recipes += list(list("recipe_name" = name, "contents" = recipe))
+ saved_recipes[name] = recording_recipe
+ recording_recipe = null
+ . = TRUE
+ if("cancel_recording")
+ if(!is_operational())
+ return
+ recording_recipe = null
+ . = TRUE
/obj/machinery/chem_dispenser/attackby(obj/item/I, mob/user, params)
if(default_unfasten_wrench(user, I))
@@ -333,7 +346,6 @@
if(default_deconstruction_screwdriver(user, icon_state, icon_state, I))
update_icon()
return
-
if(default_deconstruction_crowbar(I))
return
if(istype(I, /obj/item/reagent_containers) && !(I.item_flags & ABSTRACT) && I.is_open_container())
@@ -374,7 +386,6 @@
work_animation()
visible_message("[src] malfunctions, spraying chemicals everywhere!")
-
/obj/machinery/chem_dispenser/RefreshParts()
recharge_amount = initial(recharge_amount)
var/newpowereff = 0.0666666
@@ -385,21 +396,20 @@
for(var/obj/item/stock_parts/capacitor/C in component_parts)
recharge_amount *= C.rating
for(var/obj/item/stock_parts/manipulator/M in component_parts)
- if (M.rating > macrotier)
- macrotier = M.rating
- if (M.rating > 1)
+ if(M.rating > 1)
dispensable_reagents |= upgrade_reagents
- if (M.rating > 2)
+ if(M.rating > 2)
dispensable_reagents |= upgrade_reagents2
- if (M.rating > 3)
+ if(M.rating > 3)
dispensable_reagents |= upgrade_reagents3
powerefficiency = round(newpowereff, 0.01)
/obj/machinery/chem_dispenser/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker)
if(beaker)
- beaker.forceMove(drop_location())
+ var/obj/item/reagent_containers/B = beaker
+ B.forceMove(drop_location())
if(user && Adjacent(user) && !issiliconoradminghost(user))
- user.put_in_hands(beaker)
+ user.put_in_hands(B)
if(new_beaker)
beaker = new_beaker
else
@@ -414,33 +424,6 @@
beaker = null
return ..()
-/obj/machinery/chem_dispenser/proc/get_macro_resolution()
- . = 5
- if (macrotier > 1)
- . -= macrotier // 5 for tier1, 3 for 2, 2 for 3, 1 for 4.
-
-/obj/machinery/chem_dispenser/proc/check_macro(macro)
- var/res = get_macro_resolution()
- for (var/reagent in splittext(trim(macro), ";"))
- if (!check_macro_part(reagent, res))
- return FALSE
- return TRUE
-
-/obj/machinery/chem_dispenser/proc/check_macro_part(var/part, var/res = get_macro_resolution())
- var/detail = splittext(part, "=")
- if (round(text2num(detail[2]), res) != text2num(detail[2]))
- return FALSE
- return TRUE
-
-/obj/machinery/chem_dispenser/proc/process_recipe_list(var/fucking_hell)
- var/list/key_list = list()
- var/list/final_list = list()
- var/list/first_process = splittext(fucking_hell, ";")
- for(var/reagents in first_process)
- var/list/fuck = splittext(reagents, "=")
- final_list += list(avoid_assoc_duplicate_keys(fuck[1],key_list) = text2num(fuck[2]))
- return final_list
-
/obj/machinery/chem_dispenser/AltClick(mob/living/user)
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return
@@ -504,6 +487,7 @@
/datum/reagent/consumable/pwr_game,
/datum/reagent/consumable/shamblers,
/datum/reagent/consumable/sugar,
+ /datum/reagent/consumable/applejuice,
/datum/reagent/consumable/pineapplejuice,
/datum/reagent/consumable/orangejuice,
/datum/reagent/consumable/grenadine,
diff --git a/tgui/src/interfaces/chem_dispenser.ract b/tgui/src/interfaces/chem_dispenser.ract
index 50443ebf..e7f10b5f 100644
--- a/tgui/src/interfaces/chem_dispenser.ract
+++ b/tgui/src/interfaces/chem_dispenser.ract
@@ -1,14 +1,42 @@
+
+
{{Math.fixed(adata.energy)}} Units
+
+{{#if data.recordingRecipe && true}}
+
+ Recording
+
+
+
+ {{#each data.recordingRecipe: chemical}}
+ {{adata.recordingRecipe[chemical]}}
+ {{/each}}
+
+
+ Save
+ Cancel
+
+
+{{/if}}
+
- Add Recipe
- Clear Recipes
- {{#each data.recipes}}
- {{recipe_name}}
+ Record Recipe
+ Clear Recipes
+ {{#each data.recipes: recipe_name}}
+ {{recipe_name}}
{{/each}}
@@ -27,7 +55,7 @@
{{#partial button}}
{{#each data.beakerTransferAmounts}}
- {{.}}
+ {{.}}
{{/each}}
Eject
{{/partial}}