mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-01-09 00:42:34 +00:00
Standardization of the object tree and some modified functionality. Moved a lot of storage/*_kit and similar boxes to storage/box/* ; most of these can now be found in boxes.dm. First aid kits remain a separate item type. Replacement Light boxes pick up lights (for example broken ones) when used on them Moved weapon/secstorage to storage/secure Moved plant bags, ore satchel, trash bag, and sheet snatcher to storage/bag, in bags.dm Fixed reagent_containers and snacks to pass through attackby() so the use_to_pickup code works. This affects plant bags, trash bags, and pill bottles. Dice packs are now pill bottles, and all pill bottles can pick up dice. Added error handling to uplink/generate_menu() so that one mistyped string doesn't bork the whole syndie uplink menu, since strings cannot be type-checked at compile time. Cigarette packs and crayon boxes are now storage/fancy, however they retain existing update_icon() code. Added a comment to storage.dm so that future people know where to look for use_to_pickup and allow_quick_gather code. Updated all maps. I've tried to test this thoroughly but I wouldn't be surprised if there were a few lingering issues. Try not to panic if you encounter any. Full (i think) list of changed paths: /obj/item/weapon/storage/flashbang_kit > /obj/item/weapon/storage/box/flashbangs /obj/item/weapon/storage/body_bag_box > /obj/item/weapon/storage/box/bodybags /obj/item/weapon/storage/chemimp_kit > /obj/item/weapon/storage/box/chemimp /obj/item/weapon/storage/trackimp_kit > /obj/item/weapon/storage/box/trackimp /obj/item/weapon/storage/seccart_kit > /obj/item/weapon/storage/box/seccarts /obj/item/weapon/storage/handcuff_kit > /obj/item/weapon/storage/box/handcuffs /obj/item/weapon/cigpacket > /obj/item/weapon/storage/fancy/cigarettes /obj/item/weapon/storage/mousetraps > /obj/item/weapon/storage/box/mousetraps /obj/item/weapon/storage/PDAbox > /obj/item/weapon/storage/box/PDAs /obj/item/weapon/storage/id_kit > /obj/item/weapon/storage/box/ids /obj/item/weapon/storage/lightbox/mixed > /obj/item/weapon/storage/box/lights/mixed /obj/item/weapon/storage/donkpocket_kit > /obj/item/weapon/storage/box/donkpockets /obj/item/weapon/storage/beakerbox > /obj/item/weapon/storage/box/beakers /obj/item/weapon/storage/syringes > /obj/item/weapon/storage/box/syringes /obj/item/weapon/storage/gl_kit > /obj/item/weapon/storage/box/rxglasses /obj/item/weapon/storage/diskbox > /obj/item/weapon/storage/box/disks /obj/item/weapon/storage/stma_kit > /obj/item/weapon/storage/box/masks /obj/item/weapon/storage/lglo_kit > /obj/item/weapon/storage/box/gloves /obj/item/weapon/storage/lightbox/bulbs > /obj/item/weapon/storage/box/lights/bulbs /obj/item/weapon/plantbag > /obj/item/weapon/storage/bag/plants /obj/item/weapon/storage/satchel > /obj/item/weapon/storage/bag/ore /obj/item/weapon/trashbag > /obj/item/weapon/storage/bag/trash git-svn-id: http://tgstation13.googlecode.com/svn/trunk@5494 316c924e-a436-60f5-8080-3fe189b3f50e
1081 lines
34 KiB
Plaintext
1081 lines
34 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 = 0
|
|
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(3000) // 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.set_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 in player_list)
|
|
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 in player_list)
|
|
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.set_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.set_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.unset_machine()
|
|
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["add"])
|
|
|
|
if(href_list["amount"])
|
|
var/id = href_list["add"]
|
|
var/amount = text2num(href_list["amount"])
|
|
R.trans_id_to(src, id, amount)
|
|
|
|
else if (href_list["addcustom"])
|
|
|
|
var/id = href_list["addcustom"]
|
|
useramount = input("Select the amount to transfer.", 30, useramount) as num
|
|
useramount = isgoodnumber(useramount)
|
|
src.Topic(null, list("amount" = "[useramount]", "add" = "[id]"))
|
|
|
|
else if (href_list["remove"])
|
|
|
|
if(href_list["amount"])
|
|
var/id = href_list["remove"]
|
|
var/amount = text2num(href_list["amount"])
|
|
if(mode)
|
|
reagents.trans_id_to(beaker, id, amount)
|
|
else
|
|
reagents.remove_reagent(id, amount)
|
|
|
|
|
|
else if (href_list["removecustom"])
|
|
|
|
var/id = href_list["removecustom"]
|
|
useramount = input("Select the amount to transfer.", 30, useramount) as num
|
|
useramount = isgoodnumber(useramount)
|
|
src.Topic(null, list("amount" = "[useramount]", "remove" = "[id]"))
|
|
|
|
else if (href_list["toggle"])
|
|
mode = !mode
|
|
|
|
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.set_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];add=[G.id];amount=1'>(1)</A> "
|
|
dat += "<A href='?src=\ref[src];add=[G.id];amount=5'>(5)</A> "
|
|
dat += "<A href='?src=\ref[src];add=[G.id];amount=10'>(10)</A> "
|
|
dat += "<A href='?src=\ref[src];add=[G.id];amount=[G.volume]'>(All)</A> "
|
|
dat += "<A href='?src=\ref[src];addcustom=[G.id]'>(Custom)</A><BR>"
|
|
|
|
dat += "<HR>Transfer to <A href='?src=\ref[src];toggle=1'>[(!mode ? "disposal" : "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];remove=[N.id];amount=1'>(1)</A> "
|
|
dat += "<A href='?src=\ref[src];remove=[N.id];amount=5'>(5)</A> "
|
|
dat += "<A href='?src=\ref[src];remove=[N.id];amount=10'>(10)</A> "
|
|
dat += "<A href='?src=\ref[src];remove=[N.id];amount=[N.volume]'>(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.set_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/path = href_list["create_vaccine"]
|
|
var/vaccine_type = text2path(path)
|
|
var/datum/disease/D = null
|
|
|
|
if(!vaccine_type)
|
|
D = archive_diseases[path]
|
|
vaccine_type = path
|
|
else
|
|
if(vaccine_type in diseases)
|
|
D = new vaccine_type(0, null)
|
|
|
|
if(D)
|
|
B.name = "[D.name] vaccine bottle"
|
|
B.reagents.add_reagent("vaccine",15,vaccine_type)
|
|
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*200)
|
|
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 = null
|
|
if(!type)
|
|
var/datum/disease/advance/A = archive_diseases[href_list["create_virus_culture"]]
|
|
if(A)
|
|
D = new A.type(0, A)
|
|
else
|
|
if(type in diseases) // Make sure this is a disease
|
|
D = new type(0, null)
|
|
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(1000)
|
|
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 if(href_list["name_disease"])
|
|
var/new_name = stripped_input(usr, "Name the Disease", "New Name", "", MAX_NAME_LEN)
|
|
if(stat & (NOPOWER|BROKEN)) return
|
|
if(usr.stat || usr.restrained()) return
|
|
if(!in_range(src, usr)) return
|
|
var/id = href_list["name_disease"]
|
|
if(archive_diseases[id])
|
|
var/datum/disease/advance/A = archive_diseases[id]
|
|
A.AssignName(new_name)
|
|
for(var/datum/disease/advance/AD in active_diseases)
|
|
AD.Refresh()
|
|
src.updateUsrDialog()
|
|
|
|
|
|
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.set_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 if(!Blood.data)
|
|
dat += "No blood data 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])
|
|
|
|
|
|
var/disease_creation = D.type
|
|
if(istype(D, /datum/disease/advance))
|
|
|
|
var/datum/disease/advance/A = D
|
|
D = archive_diseases[A.GetDiseaseID()]
|
|
disease_creation = A.GetDiseaseID()
|
|
if(D.name == "Unknown")
|
|
dat += "<b><a href='?src=\ref[src];name_disease=[A.GetDiseaseID()]'>Name Disease</a></b><BR>"
|
|
|
|
if(!D)
|
|
CRASH("We weren't able to get the advance disease from the archive.")
|
|
|
|
dat += "<b>Disease Agent:</b> [D?"[D.agent] - <A href='?src=\ref[src];create_virus_culture=[disease_creation]'>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>Spread:</b> [(D.spread||"none")]<BR>"
|
|
dat += "<b>Possible cure:</b> [(D.cure||"none")]<BR><BR>"
|
|
|
|
if(istype(D, /datum/disease/advance))
|
|
var/datum/disease/advance/A = D
|
|
dat += "<b>Symptoms:</b> "
|
|
var/english_symptoms = list()
|
|
for(var/datum/symptom/S in A.symptoms)
|
|
english_symptoms += S.name
|
|
dat += english_list(english_symptoms)
|
|
|
|
|
|
dat += "<BR><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/disease_name = "Unknown"
|
|
|
|
if(!ispath(type))
|
|
var/datum/disease/advance/A = archive_diseases[type]
|
|
if(A)
|
|
disease_name = A.name
|
|
else
|
|
var/datum/disease/D = new type(0, null)
|
|
disease_name = D.name
|
|
|
|
dat += "<li>[disease_name] - <A href='?src=\ref[src];create_vaccine=[type]'>Create vaccine bottle</A></li>"
|
|
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/mineral/plasma = list("plasma" = 20),
|
|
/obj/item/stack/sheet/mineral/uranium = list("uranium" = 20),
|
|
/obj/item/stack/sheet/mineral/clown = list("banana" = 20),
|
|
/obj/item/stack/sheet/mineral/silver = list("silver" = 20),
|
|
/obj/item/stack/sheet/mineral/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" = -5),
|
|
/obj/item/weapon/reagent_containers/food/snacks/grown/cherries = list("cherryjelly" = 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/storage/bag/plants))
|
|
|
|
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) //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.set_machine(src)
|
|
interact(user)
|
|
|
|
/obj/machinery/reagentgrinder/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.set_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 and Plants
|
|
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(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
|
|
if (O.reagents != null && O.reagents.has_reagent("nutriment"))
|
|
beaker.reagents.add_reagent(r_id, min(round(O.reagents.get_reagent_amount("nutriment")*abs(amount)), 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)
|