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}}