add chemical regeneration to cartridge dispensers, remove energy dispensers

This commit is contained in:
GinjaNinja32
2015-12-14 23:01:45 +00:00
parent 63574f99dd
commit 53905d3669
10 changed files with 94 additions and 366 deletions

View File

@@ -1,4 +1,4 @@
/obj/machinery/chemical_dispenser/cartridge
/obj/machinery/chemical_dispenser
name = "chemical dispenser"
icon = 'icons/obj/chemical.dmi'
icon_state = "dispenser"
@@ -18,18 +18,18 @@
density = 1
anchored = 1
/obj/machinery/chemical_dispenser/cartridge/New()
/obj/machinery/chemical_dispenser/New()
..()
if(spawn_cartridges)
for(var/type in spawn_cartridges)
add_cartridge(new type(src))
/obj/machinery/chemical_dispenser/cartridge/examine(mob/user)
/obj/machinery/chemical_dispenser/examine(mob/user)
..()
user << "It has [cartridges.len] cartridges installed, and has space for [DISPENSER_MAX_CARTRIDGES - cartridges.len] more."
/obj/machinery/chemical_dispenser/cartridge/proc/add_cartridge(obj/item/weapon/reagent_containers/chem_disp_cartridge/C, mob/user)
/obj/machinery/chemical_dispenser/proc/add_cartridge(obj/item/weapon/reagent_containers/chem_disp_cartridge/C, mob/user)
if(!istype(C))
if(user)
user << "<span class='warning'>\The [C] will not fit in \the [src]!</span>"
@@ -59,12 +59,12 @@
cartridges = sortAssoc(cartridges)
nanomanager.update_uis(src)
/obj/machinery/chemical_dispenser/cartridge/proc/remove_cartridge(label)
/obj/machinery/chemical_dispenser/proc/remove_cartridge(label)
. = cartridges[label]
cartridges -= label
nanomanager.update_uis(src)
/obj/machinery/chemical_dispenser/cartridge/attackby(obj/item/weapon/W, mob/user)
/obj/machinery/chemical_dispenser/attackby(obj/item/weapon/W, mob/user)
if(istype(W, /obj/item/weapon/wrench))
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "<span class='notice'>You begin to [anchored ? "un" : ""]fasten \the [src].</span>"
@@ -112,7 +112,7 @@
else
return ..()
/obj/machinery/chemical_dispenser/cartridge/ui_interact(mob/user, ui_key = "main",var/datum/nanoui/ui = null, var/force_open = 1)
/obj/machinery/chemical_dispenser/ui_interact(mob/user, ui_key = "main",var/datum/nanoui/ui = null, var/force_open = 1)
if(stat & (BROKEN|NOPOWER)) return
if(user.stat || user.restrained()) return
@@ -147,7 +147,7 @@
ui.set_initial_data(data)
ui.open()
/obj/machinery/chemical_dispenser/cartridge/Topic(href, href_list)
/obj/machinery/chemical_dispenser/Topic(href, href_list)
if(stat & (NOPOWER|BROKEN))
return 0 // don't update UIs attached to this object
@@ -170,10 +170,10 @@
add_fingerprint(usr)
return 1 // update UIs attached to this object
/obj/machinery/chemical_dispenser/cartridge/attack_ai(mob/user as mob)
/obj/machinery/chemical_dispenser/attack_ai(mob/user as mob)
src.attack_hand(user)
/obj/machinery/chemical_dispenser/cartridge/attack_hand(mob/user as mob)
/obj/machinery/chemical_dispenser/attack_hand(mob/user as mob)
if(stat & BROKEN)
return
ui_interact(user)

View File

@@ -0,0 +1,56 @@
/obj/machinery/chemical_dispenser
var/_recharge_reagents = 1
var/list/dispense_reagents = list()
var/process_tick = 0
/obj/machinery/chemical_dispenser/process()
if(!_recharge_reagents)
return
if(stat & (BROKEN|NOPOWER))
return
if(--process_tick <= 0)
process_tick = 15
. = 0
for(var/id in dispense_reagents)
var/datum/reagent/R = chemical_reagents_list[id]
if(!R)
crash_with("[src] at [x],[y],[z] failed to find reagent '[id]'!")
dispense_reagents -= id
continue
var/obj/item/weapon/reagent_containers/chem_disp_cartridge/C = cartridges[R.name]
if(C && C.reagents.total_volume < C.reagents.maximum_volume)
var/to_restore = min(C.reagents.maximum_volume - C.reagents.total_volume, 5)
use_power(to_restore * 10)
C.reagents.add_reagent(id, to_restore)
. = 1
if(.)
nanomanager.update_uis(src)
/obj/machinery/chemical_dispenser
dispense_reagents = list(
"hydrogen", "lithium", "carbon", "nitrogen", "oxygen", "fluorine", "sodium",
"aluminum", "silicon", "phosphorus", "sulfur", "chlorine", "potassium", "iron",
"copper", "mercury", "radium", "water", "ethanol", "sugar", "sacid", "tungsten"
)
/obj/machinery/chemical_dispenser/ert
dispense_reagents = list(
"inaprovaline", "ryetalyn", "paracetamol", "tramadol", "oxycodone", "sterilizine", "leporazine",
"kelotane", "dermaline", "dexalin", "dexalinp", "tricordrazine", "anti_toxin", "synaptizine",
"hyronalin", "arithrazine", "alkysine", "imidazoline", "peridaxon", "bicaridine", "hyperzine",
"rezadone", "spaceacillin", "ethylredoxrazine", "stoxin", "chloralhydrate", "cryoxadone",
"clonexadone"
)
/obj/machinery/chemical_dispenser/bar_soft
dispense_reagents = list(
"water", "ice", "coffee", "cream", "tea", "icetea", "cola", "spacemountainwind", "dr_gibb", "space_up", "tonic",
"sodawater", "lemon_lime", "sugar", "orangejuice", "limejuice", "watermelonjuice", "thirteenloko", "grapesoda"
)
/obj/machinery/chemical_dispenser/bar_alc
dispense_reagents = list(
"lemon_lime", "sugar", "orangejuice", "limejuice", "sodawater", "tonic", "beer", "kahlua",
"whiskey", "wine", "vodka", "gin", "rum", "tequilla", "vermouth", "cognac", "ale", "mead"
)

View File

@@ -1,241 +0,0 @@
//This has the 'old' chem dispenser. The new one is in dispenser2.dm
#define CHEM_DISPENSER_ENERGY_COST 0.1 //How many energy points do we use per unit of chemical?
#define BOTTLE_SPRITES list("bottle-1", "bottle-2", "bottle-3", "bottle-4") //list of available bottle sprites
/obj/machinery/chemical_dispenser/energy
name = "chemical dispenser"
density = 1
anchored = 1
icon = 'icons/obj/chemical.dmi'
icon_state = "dispenser"
use_power = 0
idle_power_usage = 40
var/ui_title = "Chem Dispenser 5000"
var/energy = 100
var/max_energy = 100
var/amount = 30
var/accept_glass = 0 //At 0 ONLY accepts glass containers. Kinda misleading varname.
var/atom/beaker = null
var/recharged = 0
var/hackedcheck = 0
var/list/dispensable_reagents = list("hydrogen","lithium","carbon","nitrogen","oxygen","fluorine","sodium","aluminum","silicon","phosphorus","sulfur","chlorine","potassium","iron","copper","mercury","radium","water","ethanol","sugar","sacid","tungsten")
/obj/machinery/chemical_dispenser/energy/proc/recharge()
if(stat & (BROKEN|NOPOWER))
return
var/addenergy = 1
var/oldenergy = energy
energy = min(energy + addenergy, max_energy)
if(energy != oldenergy)
use_power(CHEM_SYNTH_ENERGY / CHEM_DISPENSER_ENERGY_COST) // This thing uses up "alot" of power (this is still low as shit for creating reagents from thin air)
nanomanager.update_uis(src) // update all UIs attached to src
/obj/machinery/chemical_dispenser/energy/power_change()
..()
nanomanager.update_uis(src) // update all UIs attached to src
/obj/machinery/chemical_dispenser/energy/process()
if(recharged <= 0)
recharge()
recharged = 15
else
recharged -= 1
/obj/machinery/chemical_dispenser/energy/New()
..()
recharge()
dispensable_reagents = sortList(dispensable_reagents)
/obj/machinery/chemical_dispenser/energy/ex_act(severity)
switch(severity)
if(1.0)
qdel(src)
return
if(2.0)
if (prob(50))
qdel(src)
return
/**
* The ui_interact proc is used to open and update Nano UIs
* If ui_interact is not used then the UI will not update correctly
* ui_interact is currently defined for /atom/movable
*
* @param user /mob The mob who is interacting with this ui
* @param ui_key string A string key to use for this ui. Allows for multiple unique uis on one obj/mob (defaut value "main")
*
* @return nothing
*/
/obj/machinery/chemical_dispenser/energy/ui_interact(mob/user, ui_key = "main",var/datum/nanoui/ui = null, var/force_open = 1)
if(stat & (BROKEN|NOPOWER)) return
if(user.stat || user.restrained()) return
// this is the data which will be sent to the ui
var/data[0]
data["amount"] = amount
data["energy"] = round(energy)
data["maxEnergy"] = round(max_energy)
data["isBeakerLoaded"] = beaker ? 1 : 0
data["glass"] = accept_glass
var beakerContents[0]
var beakerCurrentVolume = 0
if(beaker && beaker:reagents && beaker:reagents.reagent_list.len)
for(var/datum/reagent/R in beaker:reagents.reagent_list)
beakerContents.Add(list(list("name" = R.name, "volume" = R.volume))) // list in a list because Byond merges the first list...
beakerCurrentVolume += R.volume
data["beakerContents"] = beakerContents
if (beaker)
data["beakerCurrentVolume"] = beakerCurrentVolume
data["beakerMaxVolume"] = beaker:volume
else
data["beakerCurrentVolume"] = null
data["beakerMaxVolume"] = null
var chemicals[0]
for (var/re in dispensable_reagents)
var/datum/reagent/temp = chemical_reagents_list[re]
if(temp)
chemicals.Add(list(list("title" = temp.name, "id" = temp.id, "commands" = list("dispense" = temp.id)))) // list in a list because Byond merges the first list...
data["chemicals"] = chemicals
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "chem_dispenser_energy.tmpl", ui_title, 390, 655)
// when the ui is first opened this is the data it will use
ui.set_initial_data(data)
// open the new ui window
ui.open()
/obj/machinery/chemical_dispenser/energy/Topic(href, href_list)
if(stat & (NOPOWER|BROKEN))
return 0 // don't update UIs attached to this object
if(href_list["amount"])
amount = round(text2num(href_list["amount"]), 5) // round to nearest 5
if (amount < 0) // Since the user can actually type the commands himself, some sanity checking
amount = 0
if (amount > 120)
amount = 120
if(href_list["dispense"])
if (dispensable_reagents.Find(href_list["dispense"]) && beaker != null && beaker.is_open_container())
var/obj/item/weapon/reagent_containers/B = src.beaker
var/datum/reagents/R = B.reagents
var/space = R.maximum_volume - R.total_volume
//uses 1 energy per 10 units.
var/added_amount = min(amount, energy / CHEM_DISPENSER_ENERGY_COST, space)
R.add_reagent(href_list["dispense"], added_amount)
energy = max(energy - added_amount * CHEM_DISPENSER_ENERGY_COST, 0)
if(href_list["ejectBeaker"])
if(beaker)
var/obj/item/weapon/reagent_containers/B = beaker
B.loc = loc
beaker = null
add_fingerprint(usr)
return 1 // update UIs attached to this object
/obj/machinery/chemical_dispenser/energy/attackby(var/obj/item/weapon/reagent_containers/B as obj, var/mob/user as mob)
if(isrobot(user))
return
if(src.beaker)
user << "Something is already loaded into the machine."
return
if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food))
if(!accept_glass && istype(B,/obj/item/weapon/reagent_containers/food))
user << "<span class='notice'>This machine only accepts beakers</span>"
src.beaker = B
user.drop_item()
B.loc = src
user << "You set [B] on the machine."
nanomanager.update_uis(src) // update all UIs attached to src
return
/obj/machinery/chemical_dispenser/energy/attack_ai(mob/user as mob)
return src.attack_hand(user)
/obj/machinery/chemical_dispenser/energy/attack_hand(mob/user as mob)
if(stat & BROKEN)
return
ui_interact(user)
/obj/machinery/chemical_dispenser/energy/soda
icon_state = "soda_dispenser"
name = "soda fountain"
desc = "A drink fabricating machine, capable of producing many sugary drinks with just one touch."
ui_title = "Soda Dispens-o-matic"
energy = 100
accept_glass = 1
max_energy = 100
dispensable_reagents = list("water","ice","coffee","cream","tea","icetea","cola","spacemountainwind","dr_gibb","space_up","tonic","sodawater","lemon_lime","sugar","orangejuice","limejuice","watermelonjuice")
/obj/machinery/chemical_dispenser/energy/soda/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob)
..()
if(istype(B, /obj/item/device/multitool))
if(hackedcheck == 0)
user << "You change the mode from 'McNano' to 'Pizza King'."
dispensable_reagents += list("thirteenloko","grapesoda")
hackedcheck = 1
return
else
user << "You change the mode from 'Pizza King' to 'McNano'."
dispensable_reagents -= list("thirteenloko","grapesoda")
hackedcheck = 0
return
/obj/machinery/chemical_dispenser/energy/beer
icon_state = "booze_dispenser"
name = "booze dispenser"
ui_title = "Booze Portal 9001"
energy = 100
accept_glass = 1
max_energy = 100
desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one."
dispensable_reagents = list("lemon_lime","sugar","orangejuice","limejuice","sodawater","tonic","beer","kahlua",
"whiskey","wine","vodka","gin","rum","tequilla","vermouth","cognac","ale","mead")
/obj/machinery/chemical_dispenser/energy/beer/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob)
..()
if(istype(B, /obj/item/device/multitool))
if(hackedcheck == 0)
user << "You disable the 'nanotrasen-are-cheap-bastards' lock, enabling hidden and very expensive boozes."
dispensable_reagents += list("goldschlager","patron","watermelonjuice","berryjuice")
hackedcheck = 1
return
else
user << "You re-enable the 'nanotrasen-are-cheap-bastards' lock, disabling hidden and very expensive boozes."
dispensable_reagents -= list("goldschlager","patron","watermelonjuice","berryjuice")
hackedcheck = 0
return
/obj/machinery/chemical_dispenser/energy/meds
name = "ultra chem dispenser"
density = 1
anchored = 1
icon = 'icons/obj/chemical.dmi'
icon_state = "dispenser"
use_power = 0
idle_power_usage = 40
ui_title = "Chem Dispenser 9000"
energy = 100
max_energy = 100
amount = 30
accept_glass = 0 //At 0 ONLY accepts glass containers. Kinda misleading varname.
beaker = null
recharged = 0
hackedcheck = 0
dispensable_reagents = list("inaprovaline","ryetalyn","paracetamol","tramadol","oxycodone","sterilizine","leporazine","kelotane",
"dermaline","dexalin","dexalinp","tricordrazine","anti_toxin","synaptizine","hyronalin","arithrazine",
"alkysine","imidazoline","peridaxon","bicaridine","hyperzine","rezadone","spaceacillin","ethylredoxrazine",
"stoxin","chloralhydrate","cryoxadone","clonexadone")

View File

@@ -1,4 +1,4 @@
/obj/machinery/chemical_dispenser/cartridge/full
/obj/machinery/chemical_dispenser/full
spawn_cartridges = list(
/obj/item/weapon/reagent_containers/chem_disp_cartridge/hydrogen,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/lithium,
@@ -24,7 +24,7 @@
/obj/item/weapon/reagent_containers/chem_disp_cartridge/tungsten
)
/obj/machinery/chemical_dispenser/cartridge/ert
/obj/machinery/chemical_dispenser/ert
name = "medicine dispenser"
spawn_cartridges = list(
/obj/item/weapon/reagent_containers/chem_disp_cartridge/inaprov,
@@ -57,14 +57,14 @@
/obj/item/weapon/reagent_containers/chem_disp_cartridge/clonexadone
)
/obj/machinery/chemical_dispenser/cartridge/bar_soft
/obj/machinery/chemical_dispenser/bar_soft
name = "soft drink dispenser"
desc = "A soda machine."
icon_state = "soda_dispenser"
ui_title = "Soda Dispenser"
accept_drinking = 1
/obj/machinery/chemical_dispenser/cartridge/bar_soft/full
/obj/machinery/chemical_dispenser/bar_soft/full
spawn_cartridges = list(
/obj/item/weapon/reagent_containers/chem_disp_cartridge/water,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/ice,
@@ -85,14 +85,14 @@
/obj/item/weapon/reagent_containers/chem_disp_cartridge/watermelon
)
/obj/machinery/chemical_dispenser/cartridge/bar_alc
/obj/machinery/chemical_dispenser/bar_alc
name = "booze dispenser"
desc = "A beer machine. Like a soda machine, but more fun!"
icon_state = "booze_dispenser"
ui_title = "Booze Dispenser"
accept_drinking = 1
/obj/machinery/chemical_dispenser/cartridge/bar_alc/full
/obj/machinery/chemical_dispenser/bar_alc/full
spawn_cartridges = list(
/obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon_lime,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/sugar,

View File

@@ -11,7 +11,7 @@
/datum/supply_packs/beer_dispenser
name = "Booze dispenser"
contains = list(
/obj/machinery/chemical_dispenser/cartridge/bar_alc{anchored = 0}
/obj/machinery/chemical_dispenser/bar_alc{anchored = 0}
)
cost = 25
containertype = /obj/structure/largecrate
@@ -21,7 +21,7 @@
/datum/supply_packs/soda_dispenser
name = "Soda dispenser"
contains = list(
/obj/machinery/chemical_dispenser/cartridge/bar_soft{anchored = 0}
/obj/machinery/chemical_dispenser/bar_soft{anchored = 0}
)
cost = 25
containertype = /obj/structure/largecrate