Merge pull request #5988 from Citadel-Station-13/upstream-merge-36449
[MIRROR] Chem dispenser upgrade
This commit is contained in:
@@ -599,8 +599,8 @@
|
|||||||
/obj/item/stock_parts/capacitor = 6)
|
/obj/item/stock_parts/capacitor = 6)
|
||||||
|
|
||||||
/obj/item/circuitboard/machine/chem_dispenser
|
/obj/item/circuitboard/machine/chem_dispenser
|
||||||
name = "Portable Chem Dispenser (Machine Board)"
|
name = "Chem Dispenser (Machine Board)"
|
||||||
build_path = /obj/machinery/chem_dispenser/constructable
|
build_path = /obj/machinery/chem_dispenser
|
||||||
req_components = list(
|
req_components = list(
|
||||||
/obj/item/stock_parts/matter_bin = 2,
|
/obj/item/stock_parts/matter_bin = 2,
|
||||||
/obj/item/stock_parts/capacitor = 1,
|
/obj/item/stock_parts/capacitor = 1,
|
||||||
|
|||||||
@@ -9,15 +9,17 @@
|
|||||||
idle_power_usage = 40
|
idle_power_usage = 40
|
||||||
interact_offline = TRUE
|
interact_offline = TRUE
|
||||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||||
|
circuit = /obj/item/circuitboard/machine/chem_dispenser
|
||||||
var/cell_type = /obj/item/stock_parts/cell/high
|
var/cell_type = /obj/item/stock_parts/cell/high
|
||||||
var/obj/item/stock_parts/cell/cell
|
var/obj/item/stock_parts/cell/cell
|
||||||
var/powerefficiency = 0.01
|
var/powerefficiency = 0.1
|
||||||
var/amount = 30
|
var/amount = 30
|
||||||
var/recharged = 0
|
var/recharged = 0
|
||||||
var/recharge_delay = 5
|
var/recharge_delay = 5
|
||||||
var/mutable_appearance/beaker_overlay
|
var/mutable_appearance/beaker_overlay
|
||||||
var/working_state = "dispenser_working"
|
var/working_state = "dispenser_working"
|
||||||
var/nopower_state = "dispenser_nopower"
|
var/nopower_state = "dispenser_nopower"
|
||||||
|
var/macrotier = 1
|
||||||
var/obj/item/reagent_containers/beaker = null
|
var/obj/item/reagent_containers/beaker = null
|
||||||
var/list/dispensable_reagents = list(
|
var/list/dispensable_reagents = list(
|
||||||
"hydrogen",
|
"hydrogen",
|
||||||
@@ -199,7 +201,7 @@ obj/machinery/chem_dispenser/update_icon()
|
|||||||
var/actual = min(amount, (cell.charge * powerefficiency)*10, free)
|
var/actual = min(amount, (cell.charge * powerefficiency)*10, free)
|
||||||
|
|
||||||
R.add_reagent(reagent, actual)
|
R.add_reagent(reagent, actual)
|
||||||
cell.use((actual / 10) / powerefficiency)
|
cell.use(actual / powerefficiency)
|
||||||
work_animation()
|
work_animation()
|
||||||
. = TRUE
|
. = TRUE
|
||||||
if("remove")
|
if("remove")
|
||||||
@@ -219,16 +221,17 @@ obj/machinery/chem_dispenser/update_icon()
|
|||||||
if("dispense_recipe")
|
if("dispense_recipe")
|
||||||
var/recipe_to_use = params["recipe"]
|
var/recipe_to_use = params["recipe"]
|
||||||
var/list/chemicals_to_dispense = process_recipe_list(recipe_to_use)
|
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
|
for(var/key in chemicals_to_dispense) // i suppose you could edit the list locally before passing it
|
||||||
var/list/keysplit = splittext(key," ")
|
var/list/keysplit = splittext(key," ")
|
||||||
var/r_id = keysplit[1]
|
var/r_id = keysplit[1]
|
||||||
if(beaker && dispensable_reagents.Find(r_id)) // but since we verify we have the reagent, it'll be fine
|
if(beaker && dispensable_reagents.Find(r_id)) // but since we verify we have the reagent, it'll be fine
|
||||||
var/datum/reagents/R = beaker.reagents
|
var/datum/reagents/R = beaker.reagents
|
||||||
var/free = R.maximum_volume - R.total_volume
|
var/free = R.maximum_volume - R.total_volume
|
||||||
var/actual = min(chemicals_to_dispense[key], (cell.charge * powerefficiency)*10, free)
|
var/actual = min(round(chemicals_to_dispense[key], res), (cell.charge * powerefficiency)*10, free)
|
||||||
if(actual)
|
if(actual)
|
||||||
R.add_reagent(r_id, actual)
|
R.add_reagent(r_id, actual)
|
||||||
cell.use((actual / 10) / powerefficiency)
|
cell.use(actual / powerefficiency)
|
||||||
work_animation()
|
work_animation()
|
||||||
if("clear_recipes")
|
if("clear_recipes")
|
||||||
var/yesno = alert("Clear all recipes?",, "Yes","No")
|
var/yesno = alert("Clear all recipes?",, "Yes","No")
|
||||||
@@ -241,21 +244,35 @@ obj/machinery/chem_dispenser/update_icon()
|
|||||||
var/list/first_process = splittext(recipe, ";")
|
var/list/first_process = splittext(recipe, ";")
|
||||||
if(!LAZYLEN(first_process))
|
if(!LAZYLEN(first_process))
|
||||||
return
|
return
|
||||||
|
var/res = get_macro_resolution()
|
||||||
|
var/resmismatch = FALSE
|
||||||
for(var/reagents in first_process)
|
for(var/reagents in first_process)
|
||||||
var/list/fuck = splittext(reagents, "=")
|
var/list/reagent = splittext(reagents, "=")
|
||||||
if(dispensable_reagents.Find(fuck[1]))
|
if(dispensable_reagents.Find(reagent[1]))
|
||||||
|
if (!resmismatch && !check_macro_part(reagents, res))
|
||||||
|
resmismatch = TRUE
|
||||||
continue
|
continue
|
||||||
else
|
else
|
||||||
var/temp = fuck[1]
|
var/chemid = reagent[1]
|
||||||
visible_message("<span class='warning'>[src] buzzes.</span>", "<span class='italics'>You hear a faint buzz.</span>")
|
visible_message("<span class='warning'>[src] buzzes.</span>", "<span class='italics'>You hear a faint buzz.</span>")
|
||||||
to_chat(usr, "<span class ='danger'>[src] cannot find Chemical ID: <b>[temp]</b>!</span>")
|
to_chat(usr, "<span class ='danger'>[src] cannot find Chemical ID: <b>[chemid]</b>!</span>")
|
||||||
playsound(src, "sound/machines/buzz-two.ogg", 50, 1)
|
playsound(src, "sound/machines/buzz-two.ogg", 50, 1)
|
||||||
return
|
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 += list(list("recipe_name" = name, "contents" = recipe))
|
||||||
|
|
||||||
/obj/machinery/chem_dispenser/attackby(obj/item/I, mob/user, params)
|
/obj/machinery/chem_dispenser/attackby(obj/item/I, mob/user, params)
|
||||||
if(default_unfasten_wrench(user, I))
|
if(default_unfasten_wrench(user, I))
|
||||||
return
|
return
|
||||||
|
if(default_deconstruction_screwdriver(user, "dispenser-o", "dispenser", I))
|
||||||
|
return
|
||||||
|
|
||||||
|
if(exchange_parts(user, I))
|
||||||
|
return
|
||||||
|
|
||||||
|
if(default_deconstruction_crowbar(I))
|
||||||
|
return
|
||||||
if(istype(I, /obj/item/reagent_containers) && !(I.flags_1 & ABSTRACT_1) && I.is_open_container())
|
if(istype(I, /obj/item/reagent_containers) && !(I.flags_1 & ABSTRACT_1) && I.is_open_container())
|
||||||
var/obj/item/reagent_containers/B = I
|
var/obj/item/reagent_containers/B = I
|
||||||
. = 1 //no afterattack
|
. = 1 //no afterattack
|
||||||
@@ -294,92 +311,48 @@ obj/machinery/chem_dispenser/update_icon()
|
|||||||
visible_message("<span class='danger'>[src] malfunctions, spraying chemicals everywhere!</span>")
|
visible_message("<span class='danger'>[src] malfunctions, spraying chemicals everywhere!</span>")
|
||||||
..()
|
..()
|
||||||
|
|
||||||
/obj/machinery/chem_dispenser/constructable
|
|
||||||
name = "portable chem dispenser"
|
|
||||||
icon = 'icons/obj/chemical.dmi'
|
|
||||||
icon_state = "minidispenser"
|
|
||||||
powerefficiency = 0.001
|
|
||||||
amount = 5
|
|
||||||
recharge_delay = 20
|
|
||||||
dispensable_reagents = list()
|
|
||||||
circuit = /obj/item/circuitboard/machine/chem_dispenser
|
|
||||||
working_state = "minidispenser_working"
|
|
||||||
nopower_state = "minidispenser_nopower"
|
|
||||||
var/static/list/dispensable_reagent_tiers = list(
|
|
||||||
list(
|
|
||||||
"hydrogen",
|
|
||||||
"oxygen",
|
|
||||||
"silicon",
|
|
||||||
"phosphorus",
|
|
||||||
"sulfur",
|
|
||||||
"carbon",
|
|
||||||
"nitrogen",
|
|
||||||
"water"
|
|
||||||
),
|
|
||||||
list(
|
|
||||||
"lithium",
|
|
||||||
"sugar",
|
|
||||||
"sacid",
|
|
||||||
"copper",
|
|
||||||
"mercury",
|
|
||||||
"sodium",
|
|
||||||
"iodine",
|
|
||||||
"bromine"
|
|
||||||
),
|
|
||||||
list(
|
|
||||||
"ethanol",
|
|
||||||
"chlorine",
|
|
||||||
"potassium",
|
|
||||||
"aluminium",
|
|
||||||
"radium",
|
|
||||||
"fluorine",
|
|
||||||
"iron",
|
|
||||||
"welding_fuel",
|
|
||||||
"silver",
|
|
||||||
"stable_plasma"
|
|
||||||
),
|
|
||||||
list(
|
|
||||||
"oil",
|
|
||||||
"ash",
|
|
||||||
"acetone",
|
|
||||||
"saltpetre",
|
|
||||||
"ammonia",
|
|
||||||
"diethylamine"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
/obj/machinery/chem_dispenser/constructable/RefreshParts()
|
/obj/machinery/chem_dispenser/RefreshParts()
|
||||||
var/time = 0
|
var/time = 0
|
||||||
var/i
|
var/newpowereff = 0.0666666
|
||||||
for(var/obj/item/stock_parts/cell/P in component_parts)
|
for(var/obj/item/stock_parts/cell/P in component_parts)
|
||||||
cell = P
|
cell = P
|
||||||
for(var/obj/item/stock_parts/matter_bin/M in component_parts)
|
for(var/obj/item/stock_parts/matter_bin/M in component_parts)
|
||||||
time += M.rating
|
newpowereff += 0.0166666666*M.rating
|
||||||
for(var/obj/item/stock_parts/capacitor/C in component_parts)
|
for(var/obj/item/stock_parts/capacitor/C in component_parts)
|
||||||
time += C.rating
|
time += C.rating
|
||||||
recharge_delay = 30/(time/2) //delay between recharges, double the usual time on lowest 50% less than usual on highest
|
recharge_delay = 30/(time/2) //delay between recharges, double the usual time on lowest 50% less than usual on highest
|
||||||
for(var/obj/item/stock_parts/manipulator/M in component_parts)
|
for(var/obj/item/stock_parts/manipulator/M in component_parts)
|
||||||
for(i=1, i<=M.rating, i++)
|
if (M.rating > macrotier)
|
||||||
dispensable_reagents |= dispensable_reagent_tiers[i]
|
macrotier = M.rating
|
||||||
dispensable_reagents = sortList(dispensable_reagents)
|
powerefficiency = round(newpowereff, 0.01)
|
||||||
|
|
||||||
/obj/machinery/chem_dispenser/constructable/attackby(obj/item/I, mob/user, params)
|
|
||||||
if(default_deconstruction_screwdriver(user, "minidispenser-o", "minidispenser", I))
|
|
||||||
return
|
|
||||||
|
|
||||||
if(exchange_parts(user, I))
|
|
||||||
return
|
|
||||||
|
|
||||||
if(default_deconstruction_crowbar(I))
|
/obj/machinery/chem_dispenser/on_deconstruction()
|
||||||
return
|
|
||||||
return ..()
|
|
||||||
|
|
||||||
/obj/machinery/chem_dispenser/constructable/on_deconstruction()
|
|
||||||
if(beaker)
|
if(beaker)
|
||||||
beaker.forceMove(drop_location())
|
beaker.forceMove(drop_location())
|
||||||
beaker = null
|
beaker = null
|
||||||
return ..()
|
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(var/macro)
|
||||||
|
var/res = get_macro_resolution()
|
||||||
|
for (var/reagent in splittext(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)
|
/obj/machinery/chem_dispenser/proc/process_recipe_list(var/fucking_hell)
|
||||||
var/list/key_list = list()
|
var/list/key_list = list()
|
||||||
var/list/final_list = list()
|
var/list/final_list = list()
|
||||||
@@ -389,12 +362,6 @@ obj/machinery/chem_dispenser/update_icon()
|
|||||||
final_list += list(avoid_assoc_duplicate_keys(fuck[1],key_list) = text2num(fuck[2]))
|
final_list += list(avoid_assoc_duplicate_keys(fuck[1],key_list) = text2num(fuck[2]))
|
||||||
return final_list
|
return final_list
|
||||||
|
|
||||||
/obj/machinery/chem_dispenser/constructable/display_beaker()
|
|
||||||
var/mutable_appearance/b_o = beaker_overlay || mutable_appearance(icon, "disp_beaker")
|
|
||||||
b_o.pixel_y = -4
|
|
||||||
b_o.pixel_x = -4
|
|
||||||
return b_o
|
|
||||||
|
|
||||||
/obj/machinery/chem_dispenser/drinks/display_beaker()
|
/obj/machinery/chem_dispenser/drinks/display_beaker()
|
||||||
var/mutable_appearance/b_o = beaker_overlay || mutable_appearance(icon, "disp_beaker")
|
var/mutable_appearance/b_o = beaker_overlay || mutable_appearance(icon, "disp_beaker")
|
||||||
switch(dir)
|
switch(dir)
|
||||||
|
|||||||
Reference in New Issue
Block a user