mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-01-06 23:41:57 +00:00
This has a few advantages: The 16(!) sacks of flour previously in the kitchen cabinet have been condensed to an equivalent 3 sacks. Beer is now brewable with universal enzyme, and converting lots of wheat into flour should be less tedious. Also, flour grenades, etc. Because of this, flour is now obtained from the all-in-one blender rather than the processor, and spaghetti noodles are made with 5 units of flour in the microwave. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@4637 316c924e-a436-60f5-8080-3fe189b3f50e
1031 lines
33 KiB
Plaintext
1031 lines
33 KiB
Plaintext
#define SOLID 1
|
|
#define LIQUID 2
|
|
#define GAS 3
|
|
|
|
/obj/machinery/chem_dispenser
|
|
name = "chem dispenser"
|
|
density = 1
|
|
anchored = 1
|
|
icon = 'icons/obj/chemical.dmi'
|
|
icon_state = "dispenser"
|
|
use_power = 1
|
|
idle_power_usage = 40
|
|
var/energy = 100
|
|
var/max_energy = 100
|
|
var/amount = 30
|
|
var/beaker = null
|
|
var/recharged = 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")
|
|
|
|
/obj/machinery/chem_dispenser/proc/recharge()
|
|
if(stat & (BROKEN|NOPOWER)) return
|
|
var/addenergy = 2
|
|
var/oldenergy = energy
|
|
energy = min(energy + addenergy, max_energy)
|
|
if(energy != oldenergy)
|
|
use_power(2000) // This thing uses up alot of power (this is still low as shit for creating reagents from thin air)
|
|
|
|
/obj/machinery/chem_dispenser/power_change()
|
|
if(powered())
|
|
stat &= ~NOPOWER
|
|
else
|
|
spawn(rand(0, 15))
|
|
stat |= NOPOWER
|
|
|
|
/obj/machinery/chem_dispenser/process()
|
|
|
|
if(recharged < 0)
|
|
recharge()
|
|
recharged = 15
|
|
else
|
|
recharged -= 1
|
|
|
|
/obj/machinery/chem_dispenser/New()
|
|
..()
|
|
recharge()
|
|
dispensable_reagents = sortList(dispensable_reagents)
|
|
|
|
/obj/machinery/chem_dispenser/ex_act(severity)
|
|
switch(severity)
|
|
if(1.0)
|
|
del(src)
|
|
return
|
|
if(2.0)
|
|
if (prob(50))
|
|
del(src)
|
|
return
|
|
|
|
/obj/machinery/chem_dispenser/blob_act()
|
|
if (prob(50))
|
|
del(src)
|
|
|
|
/obj/machinery/chem_dispenser/meteorhit()
|
|
del(src)
|
|
return
|
|
|
|
/obj/machinery/chem_dispenser/proc/updateWindow(mob/user as mob)
|
|
winset(user, "chemdispenser.energy", "text=\"Energy: [src.energy]\"")
|
|
winset(user, "chemdispenser.amount", "text=\"Amount: [src.amount]\"")
|
|
if (beaker)
|
|
winset(user, "chemdispenser.eject", "text=\"Eject beaker\"")
|
|
else
|
|
winset(user, "chemdispenser.eject", "text=\"\[Insert beaker\]\"")
|
|
/obj/machinery/chem_dispenser/proc/initWindow(mob/user as mob)
|
|
var/i = 0
|
|
var/list/nameparams = params2list(winget(user, "chemdispenser_reagents.template_name", "pos;size;type;image;image-mode"))
|
|
var/list/buttonparams = params2list(winget(user, "chemdispenser_reagents.template_dispense", "pos;size;type;image;image-mode;text;is-flat"))
|
|
for(var/re in dispensable_reagents)
|
|
var/datum/reagent/temp = chemical_reagents_list[re]
|
|
if(temp)
|
|
var/list/newparams1 = nameparams.Copy()
|
|
var/list/newparams2 = buttonparams.Copy()
|
|
var/posy = 8 + 40 * i
|
|
newparams1["pos"] = text("8,[posy]")
|
|
newparams2["pos"] = text("248,[posy]")
|
|
newparams1["parent"] = "chemdispenser_reagents"
|
|
newparams2["parent"] = "chemdispenser_reagents"
|
|
newparams1["text"] = temp.name
|
|
newparams2["command"] = text("skincmd \"chemdispenser;[temp.id]\"")
|
|
winset(user, "chemdispenser_reagent_name[i]", list2params(newparams1))
|
|
winset(user, "chemdispenser_reagent_dispense[i]", list2params(newparams2))
|
|
i++
|
|
winset(user, "chemdispenser_reagents", "size=340x[8 + 40 * i]")
|
|
|
|
/obj/machinery/chem_dispenser/SkinCmd(mob/user as mob, var/data as text)
|
|
if(stat & (BROKEN|NOPOWER)) return
|
|
if(usr.stat || usr.restrained()) return
|
|
if(!in_range(src, usr)) return
|
|
|
|
usr.machine = src
|
|
|
|
if (data == "amountc")
|
|
var/num = input("Enter desired output amount", "Amount", "30") as num
|
|
if (num)
|
|
amount = text2num(num)
|
|
else if (data == "eject")
|
|
if (src.beaker)
|
|
var/obj/item/weapon/reagent_containers/glass/B = src.beaker
|
|
B.loc = src.loc
|
|
src.beaker = null
|
|
else if (copytext(data, 1, 7) == "amount")
|
|
if (text2num(copytext(data, 7)))
|
|
amount = text2num(copytext(data, 7))
|
|
else
|
|
if (dispensable_reagents.Find(data) && beaker != null)
|
|
var/obj/item/weapon/reagent_containers/glass/B = src.beaker
|
|
var/datum/reagents/R = B.reagents
|
|
var/space = R.maximum_volume - R.total_volume
|
|
|
|
R.add_reagent(data, min(amount, energy * 10, space))
|
|
energy = max(energy - min(amount, energy * 10, space) / 10, 0)
|
|
|
|
amount = round(amount, 10) // Chem dispenser doesnt really have that much prescion
|
|
if (amount < 0) // Since the user can actually type the commands himself, some sanity checking
|
|
amount = 0
|
|
if (amount > 100)
|
|
amount = 100
|
|
|
|
for(var/mob/player)
|
|
if (player.machine == src && player.client)
|
|
updateWindow(player)
|
|
|
|
src.add_fingerprint(usr)
|
|
return
|
|
|
|
/obj/machinery/chem_dispenser/attackby(var/obj/item/weapon/reagent_containers/glass/B as obj, var/mob/user as mob)
|
|
if(isrobot(user))
|
|
return
|
|
|
|
if(!istype(B, /obj/item/weapon/reagent_containers/glass))
|
|
return
|
|
|
|
if(src.beaker)
|
|
user << "A beaker is already loaded into the machine."
|
|
return
|
|
|
|
src.beaker = B
|
|
user.drop_item()
|
|
B.loc = src
|
|
user << "You add the beaker to the machine!"
|
|
for(var/mob/player)
|
|
if (player.machine == src && player.client)
|
|
updateWindow(player)
|
|
|
|
/obj/machinery/chem_dispenser/attack_ai(mob/user as mob)
|
|
return src.attack_hand(user)
|
|
|
|
/obj/machinery/chem_dispenser/attack_paw(mob/user as mob)
|
|
return src.attack_hand(user)
|
|
|
|
/obj/machinery/chem_dispenser/attack_hand(mob/user as mob)
|
|
if(stat & BROKEN)
|
|
return
|
|
user.machine = src
|
|
|
|
initWindow(user)
|
|
updateWindow(user)
|
|
winshow(user, "chemdispenser", 1)
|
|
user.skincmds["chemdispenser"] = src
|
|
return
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/obj/machinery/chem_master
|
|
name = "ChemMaster 3000"
|
|
density = 1
|
|
anchored = 1
|
|
icon = 'icons/obj/chemical.dmi'
|
|
icon_state = "mixer0"
|
|
use_power = 1
|
|
idle_power_usage = 20
|
|
var/beaker = null
|
|
var/obj/item/weapon/storage/pill_bottle/loaded_pill_bottle = null
|
|
var/mode = 0
|
|
var/condi = 0
|
|
var/useramount = 30 // Last used amount
|
|
|
|
/obj/machinery/chem_master/New()
|
|
var/datum/reagents/R = new/datum/reagents(100)
|
|
reagents = R
|
|
R.my_atom = src
|
|
|
|
/obj/machinery/chem_master/ex_act(severity)
|
|
switch(severity)
|
|
if(1.0)
|
|
del(src)
|
|
return
|
|
if(2.0)
|
|
if (prob(50))
|
|
del(src)
|
|
return
|
|
|
|
/obj/machinery/chem_master/blob_act()
|
|
if (prob(50))
|
|
del(src)
|
|
|
|
/obj/machinery/chem_master/meteorhit()
|
|
del(src)
|
|
return
|
|
|
|
/obj/machinery/chem_master/power_change()
|
|
if(powered())
|
|
stat &= ~NOPOWER
|
|
else
|
|
spawn(rand(0, 15))
|
|
stat |= NOPOWER
|
|
|
|
/obj/machinery/chem_master/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob)
|
|
|
|
if(istype(B, /obj/item/weapon/reagent_containers/glass))
|
|
|
|
if(src.beaker)
|
|
user << "A beaker is already loaded into the machine."
|
|
return
|
|
src.beaker = B
|
|
user.drop_item()
|
|
B.loc = src
|
|
user << "You add the beaker to the machine!"
|
|
src.updateUsrDialog()
|
|
icon_state = "mixer1"
|
|
|
|
else if(istype(B, /obj/item/weapon/storage/pill_bottle))
|
|
|
|
if(src.loaded_pill_bottle)
|
|
user << "A pill bottle is already loaded into the machine."
|
|
return
|
|
|
|
src.loaded_pill_bottle = B
|
|
user.drop_item()
|
|
B.loc = src
|
|
user << "You add the pill bottle into the dispenser slot!"
|
|
src.updateUsrDialog()
|
|
return
|
|
|
|
|
|
/obj/machinery/chem_master/Topic(href, href_list)
|
|
if(stat & (BROKEN|NOPOWER)) return
|
|
if(usr.stat || usr.restrained()) return
|
|
if(!in_range(src, usr)) return
|
|
|
|
src.add_fingerprint(usr)
|
|
usr.machine = src
|
|
|
|
|
|
if (href_list["ejectp"])
|
|
if(loaded_pill_bottle)
|
|
loaded_pill_bottle.loc = src.loc
|
|
loaded_pill_bottle = null
|
|
else if(href_list["close"])
|
|
usr << browse(null, "window=chemmaster")
|
|
usr.machine = null
|
|
return
|
|
|
|
if(beaker)
|
|
var/datum/reagents/R = beaker:reagents
|
|
if (href_list["analyze"])
|
|
var/dat = ""
|
|
if(!condi)
|
|
dat += "<TITLE>Chemmaster 3000</TITLE>Chemical infos:<BR><BR>Name:<BR>[href_list["name"]]<BR><BR>Description:<BR>[href_list["desc"]]<BR><BR><BR><A href='?src=\ref[src];main=1'>(Back)</A>"
|
|
else
|
|
dat += "<TITLE>Condimaster 3000</TITLE>Condiment infos:<BR><BR>Name:<BR>[href_list["name"]]<BR><BR>Description:<BR>[href_list["desc"]]<BR><BR><BR><A href='?src=\ref[src];main=1'>(Back)</A>"
|
|
usr << browse(dat, "window=chem_master;size=575x400")
|
|
return
|
|
else if (href_list["add1"])
|
|
|
|
/*
|
|
(this fixes a pretty serious exploit) ~~ Doohl
|
|
R.remove_reagent(href_list["add1"], 1) //Remove/add used instead of trans_to since we're moving a specific reagent.
|
|
reagents.add_reagent(href_list["add1"], 1)
|
|
*/
|
|
|
|
R.trans_id_to(src, href_list["add1"], 1)
|
|
|
|
else if (href_list["add5"])
|
|
R.trans_id_to(src, href_list["add5"], 5)
|
|
else if (href_list["add10"])
|
|
R.trans_id_to(src, href_list["add10"], 10)
|
|
else if (href_list["addall"])
|
|
var/temp_amt = R.get_reagent_amount(href_list["addall"])
|
|
R.trans_id_to(src, href_list["addall"], temp_amt)
|
|
else if (href_list["addcustom"])
|
|
|
|
var/id = href_list["addcustom"]
|
|
useramount = input("Select the amount to transfer.", 30, useramount) as num
|
|
useramount = isgoodnumber(useramount)
|
|
var/realamount = R.get_reagent_amount(id)
|
|
R.trans_id_to(src, href_list["addcustom"], realamount)
|
|
|
|
else if (href_list["remove1"])
|
|
reagents.remove_reagent(href_list["remove1"], 1)
|
|
if(mode) R.add_reagent(href_list["remove1"], 1)
|
|
else if (href_list["remove5"])
|
|
reagents.remove_reagent(href_list["remove5"], 5)
|
|
if(mode) R.add_reagent(href_list["remove5"], 5)
|
|
else if (href_list["remove10"])
|
|
reagents.remove_reagent(href_list["remove10"], 10)
|
|
if(mode) R.add_reagent(href_list["remove10"], 10)
|
|
else if (href_list["removeall"])
|
|
if(mode)
|
|
var/temp_amt = reagents.get_reagent_amount(href_list["removeall"])
|
|
R.add_reagent(href_list["removeall"], temp_amt)
|
|
reagents.del_reagent(href_list["removeall"])
|
|
else if (href_list["removecustom"])
|
|
|
|
var/id = href_list["removecustom"]
|
|
useramount = input("Select the amount to transfer.", 30, useramount) as num
|
|
useramount = isgoodnumber(useramount)
|
|
reagents.remove_reagent(id, useramount)
|
|
if(mode) R.add_reagent(id, useramount)
|
|
|
|
else if (href_list["toggle"])
|
|
if(mode)
|
|
mode = 0
|
|
else
|
|
mode = 1
|
|
else if (href_list["main"])
|
|
attack_hand(usr)
|
|
return
|
|
else if (href_list["eject"])
|
|
if(beaker)
|
|
beaker:loc = src.loc
|
|
beaker = null
|
|
reagents.clear_reagents()
|
|
icon_state = "mixer0"
|
|
else if (href_list["createpill"])
|
|
var/name = reject_bad_text(input(usr,"Name:","Name your pill!",reagents.get_master_reagent_name()))
|
|
var/obj/item/weapon/reagent_containers/pill/P
|
|
|
|
if(loaded_pill_bottle && loaded_pill_bottle.contents.len < loaded_pill_bottle.storage_slots)
|
|
P = new/obj/item/weapon/reagent_containers/pill(loaded_pill_bottle)
|
|
else
|
|
P = new/obj/item/weapon/reagent_containers/pill(src.loc)
|
|
|
|
if(!name) name = reagents.get_master_reagent_name()
|
|
P.name = "[name] pill"
|
|
P.pixel_x = rand(-7, 7) //random position
|
|
P.pixel_y = rand(-7, 7)
|
|
reagents.trans_to(P,50)
|
|
|
|
else if (href_list["createbottle"])
|
|
if(!condi)
|
|
var/name = reject_bad_text(input(usr,"Name:","Name your bottle!",reagents.get_master_reagent_name()))
|
|
var/obj/item/weapon/reagent_containers/glass/bottle/P = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc)
|
|
if(!name) name = reagents.get_master_reagent_name()
|
|
P.name = "[name] bottle"
|
|
P.pixel_x = rand(-7, 7) //random position
|
|
P.pixel_y = rand(-7, 7)
|
|
reagents.trans_to(P,30)
|
|
else
|
|
var/obj/item/weapon/reagent_containers/food/condiment/P = new/obj/item/weapon/reagent_containers/food/condiment(src.loc)
|
|
reagents.trans_to(P,50)
|
|
|
|
src.updateUsrDialog()
|
|
return
|
|
|
|
/obj/machinery/chem_master/attack_ai(mob/user as mob)
|
|
return src.attack_hand(user)
|
|
|
|
/obj/machinery/chem_master/attack_paw(mob/user as mob)
|
|
return src.attack_hand(user)
|
|
|
|
/obj/machinery/chem_master/attack_hand(mob/user as mob)
|
|
if(stat & BROKEN)
|
|
return
|
|
user.machine = src
|
|
var/dat = ""
|
|
if(!beaker)
|
|
dat = "Please insert beaker.<BR>"
|
|
if(src.loaded_pill_bottle)
|
|
dat += "<A href='?src=\ref[src];ejectp=1'>Eject Pill Bottle \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.storage_slots]\]</A><BR><BR>"
|
|
else
|
|
dat += "No pill bottle inserted.<BR><BR>"
|
|
dat += "<A href='?src=\ref[src];close=1'>Close</A>"
|
|
else
|
|
var/datum/reagents/R = beaker:reagents
|
|
dat += "<A href='?src=\ref[src];eject=1'>Eject beaker and Clear Buffer</A><BR>"
|
|
if(src.loaded_pill_bottle)
|
|
dat += "<A href='?src=\ref[src];ejectp=1'>Eject Pill Bottle \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.storage_slots]\]</A><BR><BR>"
|
|
else
|
|
dat += "No pill bottle inserted.<BR><BR>"
|
|
if(!R.total_volume)
|
|
dat += "Beaker is empty."
|
|
else
|
|
dat += "Add to buffer:<BR>"
|
|
for(var/datum/reagent/G in R.reagent_list)
|
|
dat += "[G.name] , [G.volume] Units - "
|
|
dat += "<A href='?src=\ref[src];analyze=1;desc=[G.description];name=[G.name]'>(Analyze)</A> "
|
|
dat += "<A href='?src=\ref[src];add1=[G.id]'>(1)</A> "
|
|
if(G.volume >= 5) dat += "<A href='?src=\ref[src];add5=[G.id]'>(5)</A> "
|
|
if(G.volume >= 10) dat += "<A href='?src=\ref[src];add10=[G.id]'>(10)</A> "
|
|
dat += "<A href='?src=\ref[src];addall=[G.id]'>(All)</A> "
|
|
dat += "<A href='?src=\ref[src];addcustom=[G.id]'>(Custom)</A><BR>"
|
|
if(!mode)
|
|
dat += "<HR>Transfer to <A href='?src=\ref[src];toggle=1'>disposal:</A><BR>"
|
|
else
|
|
dat += "<HR>Transfer to <A href='?src=\ref[src];toggle=1'>beaker:</A><BR>"
|
|
if(reagents.total_volume)
|
|
for(var/datum/reagent/N in reagents.reagent_list)
|
|
dat += "[N.name] , [N.volume] Units - "
|
|
dat += "<A href='?src=\ref[src];analyze=1;desc=[N.description];name=[N.name]'>(Analyze)</A> "
|
|
dat += "<A href='?src=\ref[src];remove1=[N.id]'>(1)</A> "
|
|
if(N.volume >= 5) dat += "<A href='?src=\ref[src];remove5=[N.id]'>(5)</A> "
|
|
if(N.volume >= 10) dat += "<A href='?src=\ref[src];remove10=[N.id]'>(10)</A> "
|
|
dat += "<A href='?src=\ref[src];removeall=[N.id]'>(All)</A> "
|
|
dat += "<A href='?src=\ref[src];removecustom=[N.id]'>(Custom)</A><BR>"
|
|
else
|
|
dat += "Empty<BR>"
|
|
if(!condi)
|
|
dat += "<HR><BR><A href='?src=\ref[src];createpill=1'>Create pill (50 units max)</A><BR>"
|
|
dat += "<A href='?src=\ref[src];createbottle=1'>Create bottle (30 units max)</A>"
|
|
else
|
|
dat += "<A href='?src=\ref[src];createbottle=1'>Create bottle (50 units max)</A>"
|
|
if(!condi)
|
|
user << browse("<TITLE>Chemmaster 3000</TITLE>Chemmaster menu:<BR><BR>[dat]", "window=chem_master;size=575x400")
|
|
else
|
|
user << browse("<TITLE>Condimaster 3000</TITLE>Condimaster menu:<BR><BR>[dat]", "window=chem_master;size=575x400")
|
|
onclose(user, "chem_master")
|
|
return
|
|
|
|
/obj/machinery/chem_master/proc/isgoodnumber(var/num)
|
|
if(isnum(num))
|
|
if(num > 200)
|
|
num = 200
|
|
else if(num < 0)
|
|
num = 1
|
|
else
|
|
num = round(num)
|
|
return num
|
|
else
|
|
return 0
|
|
|
|
|
|
|
|
/obj/machinery/chem_master/condimaster
|
|
name = "CondiMaster 3000"
|
|
condi = 1
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
/obj/machinery/computer/pandemic
|
|
name = "PanD.E.M.I.C 2200"
|
|
density = 1
|
|
anchored = 1
|
|
icon = 'icons/obj/chemical.dmi'
|
|
icon_state = "mixer0"
|
|
use_power = 1
|
|
idle_power_usage = 20
|
|
var/temphtml = ""
|
|
var/wait = null
|
|
var/obj/item/weapon/reagent_containers/glass/beaker = null
|
|
|
|
|
|
/obj/machinery/computer/pandemic/set_broken()
|
|
icon_state = (src.beaker?"mixer1_b":"mixer0_b")
|
|
stat |= BROKEN
|
|
|
|
|
|
/obj/machinery/computer/pandemic/power_change()
|
|
|
|
if(stat & BROKEN)
|
|
icon_state = (src.beaker?"mixer1_b":"mixer0_b")
|
|
|
|
else if(powered())
|
|
icon_state = (src.beaker?"mixer1":"mixer0")
|
|
stat &= ~NOPOWER
|
|
|
|
else
|
|
spawn(rand(0, 15))
|
|
src.icon_state = (src.beaker?"mixer1_nopower":"mixer0_nopower")
|
|
stat |= NOPOWER
|
|
|
|
|
|
/obj/machinery/computer/pandemic/Topic(href, href_list)
|
|
if(stat & (NOPOWER|BROKEN)) return
|
|
if(usr.stat || usr.restrained()) return
|
|
if(!in_range(src, usr)) return
|
|
|
|
usr.machine = src
|
|
if(!beaker) return
|
|
|
|
if (href_list["create_vaccine"])
|
|
if(!src.wait)
|
|
var/obj/item/weapon/reagent_containers/glass/bottle/B = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc)
|
|
if(B)
|
|
var/vaccine_type = text2path(href_list["create_vaccine"])//the path is received as string - converting
|
|
var/datum/disease/D = new vaccine_type
|
|
if(D)
|
|
B.name = "[D.name] vaccine bottle"
|
|
B.reagents.add_reagent("vaccine",15,vaccine_type)
|
|
del(D)
|
|
wait = 1
|
|
var/datum/reagents/R = beaker.reagents
|
|
var/datum/reagent/blood/Blood = null
|
|
for(var/datum/reagent/blood/L in R.reagent_list)
|
|
if(L)
|
|
Blood = L
|
|
break
|
|
var/list/res = Blood.data["resistances"]
|
|
spawn(res.len*500)
|
|
src.wait = null
|
|
else
|
|
src.temphtml = "The replicator is not ready yet."
|
|
src.updateUsrDialog()
|
|
return
|
|
else if (href_list["create_virus_culture"])
|
|
if(!wait)
|
|
var/obj/item/weapon/reagent_containers/glass/bottle/B = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc)
|
|
B.icon_state = "bottle3"
|
|
var/type = text2path(href_list["create_virus_culture"])//the path is received as string - converting
|
|
var/datum/disease/D = new type
|
|
var/list/data = list("viruses"=list(D))
|
|
var/name = sanitize(input(usr,"Name:","Name the culture",D.name))
|
|
if(!name || name == " ") name = D.name
|
|
B.name = "[name] culture bottle"
|
|
B.desc = "A small bottle. Contains [D.agent] culture in synthblood medium."
|
|
B.reagents.add_reagent("blood",20,data)
|
|
src.updateUsrDialog()
|
|
wait = 1
|
|
spawn(2000)
|
|
src.wait = null
|
|
else
|
|
src.temphtml = "The replicator is not ready yet."
|
|
src.updateUsrDialog()
|
|
return
|
|
else if (href_list["empty_beaker"])
|
|
beaker.reagents.clear_reagents()
|
|
src.updateUsrDialog()
|
|
return
|
|
else if (href_list["eject"])
|
|
beaker:loc = src.loc
|
|
beaker = null
|
|
icon_state = "mixer0"
|
|
src.updateUsrDialog()
|
|
return
|
|
else if(href_list["clear"])
|
|
src.temphtml = ""
|
|
src.updateUsrDialog()
|
|
return
|
|
else
|
|
usr << browse(null, "window=pandemic")
|
|
src.updateUsrDialog()
|
|
return
|
|
|
|
src.add_fingerprint(usr)
|
|
return
|
|
|
|
/obj/machinery/computer/pandemic/attack_ai(mob/user as mob)
|
|
return src.attack_hand(user)
|
|
|
|
/obj/machinery/computer/pandemic/attack_paw(mob/user as mob)
|
|
return src.attack_hand(user)
|
|
|
|
/obj/machinery/computer/pandemic/attack_hand(mob/user as mob)
|
|
if(stat & (NOPOWER|BROKEN))
|
|
return
|
|
user.machine = src
|
|
var/dat = ""
|
|
if(src.temphtml)
|
|
dat = "[src.temphtml]<BR><BR><A href='?src=\ref[src];clear=1'>Main Menu</A>"
|
|
else if(!beaker)
|
|
dat += "Please insert beaker.<BR>"
|
|
dat += "<A href='?src=\ref[user];mach_close=pandemic'>Close</A>"
|
|
else
|
|
var/datum/reagents/R = beaker.reagents
|
|
var/datum/reagent/blood/Blood = null
|
|
for(var/datum/reagent/blood/B in R.reagent_list)
|
|
if(B)
|
|
Blood = B
|
|
break
|
|
if(!R.total_volume||!R.reagent_list.len)
|
|
dat += "The beaker is empty<BR>"
|
|
else if(!Blood)
|
|
dat += "No blood sample found in beaker"
|
|
else
|
|
dat += "<h3>Blood sample data:</h3>"
|
|
dat += "<b>Blood DNA:</b> [(Blood.data["blood_DNA"]||"none")]<BR>"
|
|
dat += "<b>Blood Type:</b> [(Blood.data["blood_type"]||"none")]<BR>"
|
|
|
|
|
|
if(Blood.data["viruses"])
|
|
var/list/vir = Blood.data["viruses"]
|
|
if(vir.len)
|
|
for(var/datum/disease/D in Blood.data["viruses"])
|
|
if(!D.hidden[PANDEMIC])
|
|
|
|
dat += "<b>Disease Agent:</b> [D?"[D.agent] - <A href='?src=\ref[src];create_virus_culture=[D.type]'>Create virus culture bottle</A>":"none"]<BR>"
|
|
dat += "<b>Common name:</b> [(D.name||"none")]<BR>"
|
|
dat += "<b>Description: </b> [(D.desc||"none")]<BR>"
|
|
dat += "<b>Possible cure:</b> [(D.cure||"none")]<BR><BR>"
|
|
|
|
dat += "<b>Contains antibodies to:</b> "
|
|
if(Blood.data["resistances"])
|
|
var/list/res = Blood.data["resistances"]
|
|
if(res.len)
|
|
dat += "<ul>"
|
|
for(var/type in Blood.data["resistances"])
|
|
var/datum/disease/DR = new type
|
|
dat += "<li>[DR.name] - <A href='?src=\ref[src];create_vaccine=[type]'>Create vaccine bottle</A></li>"
|
|
del(DR)
|
|
dat += "</ul><BR>"
|
|
else
|
|
dat += "nothing<BR>"
|
|
else
|
|
dat += "nothing<BR>"
|
|
dat += "<BR><A href='?src=\ref[src];eject=1'>Eject beaker</A>[((R.total_volume&&R.reagent_list.len) ? "-- <A href='?src=\ref[src];empty_beaker=1'>Empty beaker</A>":"")]<BR>"
|
|
dat += "<A href='?src=\ref[user];mach_close=pandemic'>Close</A>"
|
|
|
|
user << browse("<TITLE>[src.name]</TITLE><BR>[dat]", "window=pandemic;size=575x400")
|
|
onclose(user, "pandemic")
|
|
return
|
|
|
|
/obj/machinery/computer/pandemic/attackby(var/obj/I as obj, var/mob/user as mob)
|
|
if(istype(I, /obj/item/weapon/screwdriver))
|
|
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
|
|
if(do_after(user, 20))
|
|
if (src.stat & BROKEN)
|
|
user << "\blue The broken glass falls out."
|
|
var/obj/structure/computerframe/A = new /obj/structure/computerframe(src.loc)
|
|
new /obj/item/weapon/shard(src.loc)
|
|
var/obj/item/weapon/circuitboard/pandemic/M = new /obj/item/weapon/circuitboard/pandemic(A)
|
|
for (var/obj/C in src)
|
|
C.loc = src.loc
|
|
A.circuit = M
|
|
A.state = 3
|
|
A.icon_state = "3"
|
|
A.anchored = 1
|
|
del(src)
|
|
else
|
|
user << "\blue You disconnect the monitor."
|
|
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
|
|
var/obj/item/weapon/circuitboard/pandemic/M = new /obj/item/weapon/circuitboard/pandemic(A)
|
|
for (var/obj/C in src)
|
|
C.loc = src.loc
|
|
A.circuit = M
|
|
A.state = 4
|
|
A.icon_state = "4"
|
|
A.anchored = 1
|
|
del(src)
|
|
else if(istype(I, /obj/item/weapon/reagent_containers/glass))
|
|
if(stat & (NOPOWER|BROKEN)) return
|
|
if(src.beaker)
|
|
user << "A beaker is already loaded into the machine."
|
|
return
|
|
|
|
src.beaker = I
|
|
user.drop_item()
|
|
I.loc = src
|
|
user << "You add the beaker to the machine!"
|
|
src.updateUsrDialog()
|
|
icon_state = "mixer1"
|
|
|
|
else
|
|
..()
|
|
return
|
|
////////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////
|
|
/obj/machinery/reagentgrinder
|
|
|
|
name = "All-In-One Grinder"
|
|
icon = 'icons/obj/kitchen.dmi'
|
|
icon_state = "juicer1"
|
|
layer = 2.9
|
|
density = 1
|
|
anchored = 1
|
|
use_power = 1
|
|
idle_power_usage = 5
|
|
active_power_usage = 100
|
|
var/inuse = 0
|
|
var/obj/item/weapon/reagent_containers/beaker = null
|
|
var/limit = 10
|
|
var/list/blend_items = list (
|
|
|
|
//Sheets
|
|
/obj/item/stack/sheet/plasma = list("plasma" = 20),
|
|
/obj/item/stack/sheet/uranium = list("uranium" = 20),
|
|
/obj/item/stack/sheet/clown = list("banana" = 20),
|
|
/obj/item/stack/sheet/silver = list("silver" = 20),
|
|
/obj/item/stack/sheet/gold = list("gold" = 20),
|
|
/obj/item/weapon/grown/nettle = list("sacid" = 0),
|
|
/obj/item/weapon/grown/deathnettle = list("pacid" = 0),
|
|
|
|
//Blender Stuff
|
|
/obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = list("soymilk" = 0),
|
|
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato = list("ketchup" = 0),
|
|
/obj/item/weapon/reagent_containers/food/snacks/grown/corn = list("cornoil" = 0),
|
|
/obj/item/weapon/reagent_containers/food/snacks/grown/wheat = list("flour" = 0),
|
|
|
|
|
|
|
|
//All types that you can put into the grinder to transfer the reagents to the beaker. !Put all recipes above this.!
|
|
/obj/item/weapon/reagent_containers/pill = list(),
|
|
/obj/item/weapon/reagent_containers/food = list()
|
|
)
|
|
|
|
var/list/juice_items = list (
|
|
|
|
//Juicer Stuff
|
|
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato = list("tomatojuice" = 0),
|
|
/obj/item/weapon/reagent_containers/food/snacks/grown/carrot = list("carrotjuice" = 0),
|
|
/obj/item/weapon/reagent_containers/food/snacks/grown/berries = list("berryjuice" = 0),
|
|
/obj/item/weapon/reagent_containers/food/snacks/grown/banana = list("banana" = 0),
|
|
/obj/item/weapon/reagent_containers/food/snacks/grown/potato = list("potato" = 0),
|
|
/obj/item/weapon/reagent_containers/food/snacks/grown/lemon = list("lemonjuice" = 0),
|
|
/obj/item/weapon/reagent_containers/food/snacks/grown/orange = list("orangejuice" = 0),
|
|
/obj/item/weapon/reagent_containers/food/snacks/grown/lime = list("limejuice" = 0),
|
|
/obj/item/weapon/reagent_containers/food/snacks/watermelonslice = list("watermelonjuice" = 0),
|
|
/obj/item/weapon/reagent_containers/food/snacks/grown/poisonberries = list("poisonberryjuice" = 0),
|
|
)
|
|
|
|
|
|
var/list/holdingitems = list()
|
|
|
|
/obj/machinery/reagentgrinder/New()
|
|
..()
|
|
beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
|
|
return
|
|
|
|
/obj/machinery/reagentgrinder/update_icon()
|
|
icon_state = "juicer"+num2text(!isnull(beaker))
|
|
return
|
|
|
|
|
|
/obj/machinery/reagentgrinder/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
|
|
|
|
|
if (istype(O,/obj/item/weapon/reagent_containers/glass) || \
|
|
istype(O,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass) || \
|
|
istype(O,/obj/item/weapon/reagent_containers/food/drinks/shaker))
|
|
|
|
if (beaker)
|
|
return 1
|
|
else
|
|
src.beaker = O
|
|
user.drop_item()
|
|
O.loc = src
|
|
update_icon()
|
|
src.updateUsrDialog()
|
|
return 0
|
|
|
|
if(holdingitems && holdingitems.len >= limit)
|
|
usr << "The machine cannot hold anymore items."
|
|
return 1
|
|
|
|
//Fill machine with the plantbag!
|
|
if(istype(O, /obj/item/weapon/plantbag))
|
|
|
|
for (var/obj/item/weapon/reagent_containers/food/snacks/grown/G in O.contents)
|
|
O.contents -= G
|
|
G.loc = src
|
|
holdingitems += G
|
|
if((holdingitems && holdingitems.len >= limit) || beaker.reagents.total_volume >= 80) //Sanity checking so the blender doesn't overfill
|
|
user << "You fill the All-In-One grinder to the brim."
|
|
break
|
|
|
|
if(!O.contents.len)
|
|
user << "You empty the plant bag into the All-In-One grinder."
|
|
|
|
src.updateUsrDialog()
|
|
return 0
|
|
|
|
if (!is_type_in_list(O, blend_items) && !is_type_in_list(O, juice_items))
|
|
user << "Cannot refine into a reagent."
|
|
return 1
|
|
|
|
user.before_take_item(O)
|
|
O.loc = src
|
|
holdingitems += O
|
|
src.updateUsrDialog()
|
|
return 0
|
|
|
|
/obj/machinery/reagentgrinder/attack_paw(mob/user as mob)
|
|
return src.attack_hand(user)
|
|
|
|
/obj/machinery/reagentgrinder/attack_ai(mob/user as mob)
|
|
return 0
|
|
|
|
/obj/machinery/reagentgrinder/attack_hand(mob/user as mob)
|
|
user.machine = src
|
|
interact(user)
|
|
|
|
/obj/machinery/reagentgrinder/proc/interact(mob/user as mob) // The microwave Menu
|
|
var/is_chamber_empty = 0
|
|
var/is_beaker_ready = 0
|
|
var/processing_chamber = ""
|
|
var/beaker_contents = ""
|
|
var/dat = ""
|
|
|
|
if(!inuse)
|
|
for (var/obj/item/O in holdingitems)
|
|
processing_chamber += "\A [O.name]<BR>"
|
|
|
|
if (!processing_chamber)
|
|
is_chamber_empty = 1
|
|
processing_chamber = "Nothing."
|
|
if (!beaker)
|
|
beaker_contents = "<B>No beaker attached.</B><br>"
|
|
else
|
|
is_beaker_ready = 1
|
|
beaker_contents = "<B>The beaker contains:</B><br>"
|
|
var/anything = 0
|
|
for(var/datum/reagent/R in beaker.reagents.reagent_list)
|
|
anything = 1
|
|
beaker_contents += "[R.volume] - [R.name]<br>"
|
|
if(!anything)
|
|
beaker_contents += "Nothing<br>"
|
|
|
|
|
|
dat = {"
|
|
<b>Processing chamber contains:</b><br>
|
|
[processing_chamber]<br>
|
|
[beaker_contents]<hr>
|
|
"}
|
|
if (is_beaker_ready && !is_chamber_empty && !(stat & (NOPOWER|BROKEN)))
|
|
dat += "<A href='?src=\ref[src];action=grind'>Grind the reagents</a><BR>"
|
|
dat += "<A href='?src=\ref[src];action=juice'>Juice the reagents</a><BR><BR>"
|
|
if(holdingitems && holdingitems.len > 0)
|
|
dat += "<A href='?src=\ref[src];action=eject'>Eject the reagents</a><BR>"
|
|
if (beaker)
|
|
dat += "<A href='?src=\ref[src];action=detach'>Detach the beaker</a><BR>"
|
|
else
|
|
dat += "Please wait..."
|
|
user << browse("<HEAD><TITLE>All-In-One Grinder</TITLE></HEAD><TT>[dat]</TT>", "window=reagentgrinder")
|
|
onclose(user, "reagentgrinder")
|
|
return
|
|
|
|
|
|
/obj/machinery/reagentgrinder/Topic(href, href_list)
|
|
if(..())
|
|
return
|
|
usr.machine = src
|
|
switch(href_list["action"])
|
|
if ("grind")
|
|
grind()
|
|
if("juice")
|
|
juice()
|
|
if("eject")
|
|
eject()
|
|
if ("detach")
|
|
detach()
|
|
src.updateUsrDialog()
|
|
return
|
|
|
|
/obj/machinery/reagentgrinder/proc/detach()
|
|
|
|
if (usr.stat != 0)
|
|
return
|
|
if (!beaker)
|
|
return
|
|
beaker.loc = src.loc
|
|
beaker = null
|
|
update_icon()
|
|
|
|
/obj/machinery/reagentgrinder/proc/eject()
|
|
|
|
if (usr.stat != 0)
|
|
return
|
|
if (holdingitems && holdingitems.len == 0)
|
|
return
|
|
|
|
for(var/obj/item/O in holdingitems)
|
|
O.loc = src.loc
|
|
holdingitems -= O
|
|
holdingitems = list()
|
|
|
|
/obj/machinery/reagentgrinder/proc/is_allowed(var/obj/item/weapon/reagent_containers/O)
|
|
for (var/i in blend_items)
|
|
if(istype(O, i))
|
|
return 1
|
|
return 0
|
|
|
|
/obj/machinery/reagentgrinder/proc/get_allowed_by_id(var/obj/item/weapon/grown/O)
|
|
for (var/i in blend_items)
|
|
if (istype(O, i))
|
|
return blend_items[i]
|
|
|
|
/obj/machinery/reagentgrinder/proc/get_allowed_snack_by_id(var/obj/item/weapon/reagent_containers/food/snacks/O)
|
|
for(var/i in blend_items)
|
|
if(istype(O, i))
|
|
return blend_items[i]
|
|
|
|
/obj/machinery/reagentgrinder/proc/get_allowed_juice_by_id(var/obj/item/weapon/reagent_containers/food/snacks/O)
|
|
for(var/i in juice_items)
|
|
if(istype(O, i))
|
|
return juice_items[i]
|
|
|
|
/obj/machinery/reagentgrinder/proc/get_grownweapon_amount(var/obj/item/weapon/grown/O)
|
|
if (!istype(O))
|
|
return 5
|
|
else if (O.potency == -1)
|
|
return 5
|
|
else
|
|
return round(O.potency)
|
|
|
|
/obj/machinery/reagentgrinder/proc/get_juice_amount(var/obj/item/weapon/reagent_containers/food/snacks/grown/O)
|
|
if (!istype(O))
|
|
return 5
|
|
else if (O.potency == -1)
|
|
return 5
|
|
else
|
|
return round(5*sqrt(O.potency))
|
|
|
|
/obj/machinery/reagentgrinder/proc/remove_object(var/obj/item/O)
|
|
holdingitems -= O
|
|
del(O)
|
|
|
|
/obj/machinery/reagentgrinder/proc/juice()
|
|
power_change()
|
|
if(stat & (NOPOWER|BROKEN))
|
|
return
|
|
if (!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume))
|
|
return
|
|
playsound(src.loc, 'sound/machines/juicer.ogg', 20, 1)
|
|
inuse = 1
|
|
spawn(50)
|
|
inuse = 0
|
|
interact(usr)
|
|
//Snacks
|
|
for (var/obj/item/weapon/reagent_containers/food/snacks/O in holdingitems)
|
|
if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
|
|
break
|
|
|
|
var/allowed = get_allowed_juice_by_id(O)
|
|
if(isnull(allowed))
|
|
break
|
|
|
|
for (var/r_id in allowed)
|
|
|
|
var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
|
|
var/amount = get_juice_amount(O)
|
|
|
|
beaker.reagents.add_reagent(r_id, min(amount, space))
|
|
|
|
if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
|
|
break
|
|
|
|
remove_object(O)
|
|
|
|
/obj/machinery/reagentgrinder/proc/grind()
|
|
|
|
power_change()
|
|
if(stat & (NOPOWER|BROKEN))
|
|
return
|
|
if (!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume))
|
|
return
|
|
playsound(src.loc, 'sound/machines/blender.ogg', 50, 1)
|
|
inuse = 1
|
|
spawn(60)
|
|
inuse = 0
|
|
interact(usr)
|
|
//Snacks
|
|
for (var/obj/item/weapon/reagent_containers/food/snacks/O in holdingitems)
|
|
if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
|
|
break
|
|
|
|
var/allowed = get_allowed_snack_by_id(O)
|
|
if(isnull(allowed))
|
|
break
|
|
|
|
for (var/r_id in allowed)
|
|
|
|
var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
|
|
var/amount = allowed[r_id]
|
|
if(amount == 0)
|
|
if (O.reagents != null && O.reagents.has_reagent("nutriment"))
|
|
beaker.reagents.add_reagent(r_id, min(O.reagents.get_reagent_amount("nutriment"), space))
|
|
O.reagents.remove_reagent("nutriment", min(O.reagents.get_reagent_amount("nutriment"), space))
|
|
|
|
else
|
|
O.reagents.trans_id_to(beaker, r_id, min(amount, space))
|
|
|
|
if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
|
|
break
|
|
|
|
if(O.reagents.reagent_list.len == 0)
|
|
remove_object(O)
|
|
|
|
//Sheets
|
|
for (var/obj/item/stack/sheet/O in holdingitems)
|
|
var/allowed = get_allowed_by_id(O)
|
|
if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
|
|
break
|
|
for(var/i = 1; i <= round(O.amount, 1); i++)
|
|
for (var/r_id in allowed)
|
|
var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
|
|
var/amount = allowed[r_id]
|
|
beaker.reagents.add_reagent(r_id,min(amount, space))
|
|
if (space < amount)
|
|
break
|
|
if (i == round(O.amount, 1))
|
|
remove_object(O)
|
|
break
|
|
//Plants
|
|
for (var/obj/item/weapon/grown/O in holdingitems)
|
|
if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
|
|
break
|
|
var/allowed = get_allowed_by_id(O)
|
|
for (var/r_id in allowed)
|
|
var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
|
|
var/amount = allowed[r_id]
|
|
if (amount == 0)
|
|
if (O.reagents != null && O.reagents.has_reagent(r_id))
|
|
beaker.reagents.add_reagent(r_id,min(O.reagents.get_reagent_amount(r_id), space))
|
|
else
|
|
beaker.reagents.add_reagent(r_id,min(amount, space))
|
|
|
|
if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
|
|
break
|
|
remove_object(O)
|
|
|
|
//Everything else - Transfers reagents from it into beaker
|
|
for (var/obj/item/weapon/reagent_containers/O in holdingitems)
|
|
if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
|
|
break
|
|
var/amount = O.reagents.total_volume
|
|
O.reagents.trans_to(beaker, amount)
|
|
if(!O.reagents.total_volume)
|
|
remove_object(O)
|