Merge pull request #1963 from SinTwo/NanoUI

NanoUIfication
This commit is contained in:
EmperorJon
2016-06-23 22:33:05 +01:00
committed by GitHub
26 changed files with 2213 additions and 1107 deletions

View File

@@ -30,62 +30,60 @@
"Snow Field" = "snowfield", \
"Theatre" = "theatre", \
"Meeting Hall" = "meetinghall", \
"Courtroom" = "courtroom" \
"Courtroom" = "courtroom", \
"Turn Off" = "turnoff" \
)
var/list/restricted_programs = list("Atmospheric Burn Simulation" = "burntest", "Wildlife Simulation" = "wildlifecarp")
var/current_program = "turnoff"
/obj/machinery/computer/HolodeckControl/attack_ai(var/mob/user as mob)
return src.attack_hand(user)
/obj/machinery/computer/HolodeckControl/attack_hand(var/mob/user as mob)
if(..())
return
user.set_machine(src)
var/dat
dat += "<B>Holodeck Control System</B><BR>"
dat += "<HR>Current Loaded Programs:<BR>"
for(var/prog in supported_programs)
dat += "<A href='?src=\ref[src];program=[supported_programs[prog]]'>([prog])</A><BR>"
ui_interact(user)
dat += "<BR>"
dat += "<A href='?src=\ref[src];program=turnoff'>(Turn Off)</A><BR>"
/**
* Display the NanoUI window for the Holodeck Computer.
*
* See NanoUI documentation for details.
*/
/obj/machinery/computer/HolodeckControl/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
user.set_machine(src)
dat += "<BR>"
dat += "Please ensure that only holographic weapons are used in the holodeck if a combat simulation has been loaded.<BR>"
var/list/data = list()
var/program_list[0]
var/restricted_program_list[0]
for(var/P in supported_programs)
program_list[++program_list.len] = list("name" = P, "program" = supported_programs[P])
for(var/P in restricted_programs)
restricted_program_list[++restricted_program_list.len] = list("name" = P, "program" = restricted_programs[P])
data["supportedPrograms"] = program_list
data["restrictedPrograms"] = restricted_program_list
data["currentProgram"] = current_program
if(issilicon(user))
dat += "<BR>"
if(safety_disabled)
if (emagged)
dat += "<font color=red><b>ERROR</b>: Cannot re-enable Safety Protocols.</font><BR>"
else
dat += "<A href='?src=\ref[src];AIoverride=1'>(<font color=green>Re-Enable Safety Protocols?</font>)</A><BR>"
else
dat += "<A href='?src=\ref[src];AIoverride=1'>(<font color=red>Override Safety Protocols?</font>)</A><BR>"
dat += "<BR>"
if(safety_disabled)
for(var/prog in restricted_programs)
dat += "<A href='?src=\ref[src];program=[restricted_programs[prog]]'>(<font color=red>Begin [prog]</font>)</A><BR>"
dat += "Ensure the holodeck is empty before testing.<BR>"
dat += "<BR>"
dat += "Safety Protocols are <font color=red> DISABLED </font><BR>"
data["isSilicon"] = 1
else
dat += "Safety Protocols are <font color=green> ENABLED </font><BR>"
data["isSilicon"] = null
data["safetyDisabled"] = safety_disabled
data["emagged"] = emagged
if(linkedholodeck.has_gravity)
dat += "Gravity is <A href='?src=\ref[src];gravity=1'><font color=green>(ON)</font></A><BR>"
data["gravity"] = 1
else
dat += "Gravity is <A href='?src=\ref[src];gravity=1'><font color=blue>(OFF)</font></A><BR>"
user << browse(dat, "window=computer;size=400x500")
onclose(user, "computer")
return
data["gravity"] = null
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "holodeck.tmpl", src.name, 400, 550)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(20)
/obj/machinery/computer/HolodeckControl/Topic(href, href_list)
if(..())
@@ -97,6 +95,7 @@
var/prog = href_list["program"]
if(prog in holodeck_programs)
loadProgram(holodeck_programs[prog])
current_program = href_list["program"]
else if(href_list["AIoverride"])
if(!issilicon(usr))
@@ -118,8 +117,8 @@
toggleGravity(linkedholodeck)
src.add_fingerprint(usr)
src.updateUsrDialog()
return
nanomanager.update_uis(src)
/obj/machinery/computer/HolodeckControl/emag_act(var/remaining_charges, var/mob/user as mob)
playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
@@ -132,7 +131,6 @@
user << "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call [company_name] maintenance and do not use the simulator."
log_game("[key_name(usr)] emagged the Holodeck Control Computer")
return 1
src.updateUsrDialog()
return
/obj/machinery/computer/HolodeckControl/proc/update_projections()

View File

@@ -32,54 +32,37 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
/obj/machinery/photocopier/faxmachine/attack_hand(mob/user as mob)
user.set_machine(src)
var/dat = "Fax Machine<BR>"
ui_interact(user)
var/scan_name
/**
* Display the NanoUI window for the fax machine.
*
* See NanoUI documentation for details.
*/
/obj/machinery/photocopier/faxmachine/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
user.set_machine(src)
var/list/data = list()
if(scan)
scan_name = scan.name
data["scanName"] = scan.name
else
scan_name = "--------"
dat += "Confirm Identity: <a href='byond://?src=\ref[src];scan=1'>[scan_name]</a><br>"
if(authenticated)
dat += "<a href='byond://?src=\ref[src];logout=1'>{Log Out}</a>"
data["scanName"] = null
data["bossName"] = boss_name
data["authenticated"] = authenticated
data["copyItem"] = copyitem
if(copyitem)
data["copyItemName"] = copyitem.name
else
dat += "<a href='byond://?src=\ref[src];auth=1'>{Log In}</a>"
data["copyItemName"] = null
data["cooldown"] = sendcooldown
data["destination"] = destination
dat += "<hr>"
if(authenticated)
dat += "<b>Logged in to:</b> [boss_name] Quantum Entanglement Network<br><br>"
if(copyitem)
dat += "<a href='byond://?src=\ref[src];remove=1'>Remove Item</a><br><br>"
if(sendcooldown)
dat += "<b>Transmitter arrays realigning. Please stand by.</b><br>"
else
dat += "<a href='byond://?src=\ref[src];send=1'>Send</a><br>"
dat += "<b>Currently sending:</b> [copyitem.name]<br>"
dat += "<b>Sending to:</b> <a href='byond://?src=\ref[src];dept=1'>[destination]</a><br>"
else
if(sendcooldown)
dat += "Please insert paper to send via secure connection.<br><br>"
dat += "<b>Transmitter arrays realigning. Please stand by.</b><br>"
else
dat += "Please insert paper to send via secure connection.<br><br>"
else
dat += "Proper authentication is required to use this device.<br><br>"
if(copyitem)
dat += "<a href ='byond://?src=\ref[src];remove=1'>Remove Item</a><br>"
user << browse(dat, "window=copier")
onclose(user, "copier")
return
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "fax.tmpl", src.name, 500, 500)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(10) //this machine is so unimportant let's not have it update that often.
/obj/machinery/photocopier/faxmachine/Topic(href, href_list)
if(href_list["send"])
@@ -99,7 +82,6 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
usr.put_in_hands(copyitem)
usr << "<span class='notice'>You take \the [copyitem] out of \the [src].</span>"
copyitem = null
updateUsrDialog()
if(href_list["scan"])
if (scan)
@@ -131,7 +113,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
if(href_list["logout"])
authenticated = 0
updateUsrDialog()
nanomanager.update_uis(src)
/obj/machinery/photocopier/faxmachine/proc/sendfax(var/destination)
if(stat & (BROKEN|NOPOWER))
@@ -216,4 +198,4 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
for(var/client/C in admins)
if(R_ADMIN & C.holder.rights)
C << msg
C << 'sound/effects/printer.ogg'
C << 'sound/effects/printer.ogg'

View File

@@ -30,24 +30,32 @@
/obj/machinery/photocopier/attack_hand(mob/user as mob)
user.set_machine(src)
var/dat = "Photocopier<BR><BR>"
if(copyitem)
dat += "<a href='byond://?src=\ref[src];remove=1'>Remove Item</a><BR>"
if(toner)
dat += "<a href='byond://?src=\ref[src];copy=1'>Copy</a><BR>"
dat += "Printing: [copies] copies."
dat += "<a href='byond://?src=\ref[src];min=1'>-</a> "
dat += "<a href='byond://?src=\ref[src];add=1'>+</a><BR><BR>"
else if(toner)
dat += "Please insert something to copy.<BR><BR>"
ui_interact(user)
/**
* Display the NanoUI window for the photocopier.
*
* See NanoUI documentation for details.
*/
/obj/machinery/photocopier/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
user.set_machine(src)
var/list/data = list()
data["copyItem"] = copyitem
data["toner"] = toner
data["copies"] = copies
data["maxCopies"] = maxcopies
if(istype(user,/mob/living/silicon))
dat += "<a href='byond://?src=\ref[src];aipic=1'>Print photo from database</a><BR><BR>"
dat += "Current toner level: [toner]"
if(!toner)
dat +="<BR>Please insert a new toner cartridge!"
user << browse(dat, "window=copier")
onclose(user, "copier")
return
data["isSilicon"] = 1
else
data["isSilicon"] = null
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "photocopier.tmpl", src.name, 300, 250)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(10)
/obj/machinery/photocopier/Topic(href, href_list)
if(href_list["copy"])
@@ -72,22 +80,18 @@
break
use_power(active_power_usage)
updateUsrDialog()
else if(href_list["remove"])
if(copyitem)
copyitem.loc = usr.loc
usr.put_in_hands(copyitem)
usr << "<span class='notice'>You take \the [copyitem] out of \the [src].</span>"
copyitem = null
updateUsrDialog()
else if(href_list["min"])
if(copies > 1)
copies--
updateUsrDialog()
else if(href_list["add"])
if(copies < maxcopies)
copies++
updateUsrDialog()
else if(href_list["aipic"])
if(!istype(usr,/mob/living/silicon)) return
if(stat & (BROKEN|NOPOWER)) return
@@ -109,7 +113,8 @@
p.desc += " - Copied by [tempAI.name]"
toner -= 5
sleep(15)
updateUsrDialog()
nanomanager.update_uis(src)
/obj/machinery/photocopier/attackby(obj/item/O as obj, mob/user as mob)
if(istype(O, /obj/item/weapon/paper) || istype(O, /obj/item/weapon/photo) || istype(O, /obj/item/weapon/paper_bundle))
@@ -119,7 +124,6 @@
O.loc = src
user << "<span class='notice'>You insert \the [O] into \the [src].</span>"
flick(insert_anim, src)
updateUsrDialog()
else
user << "<span class='notice'>There is already something in \the [src].</span>"
else if(istype(O, /obj/item/device/toner))
@@ -129,7 +133,6 @@
var/obj/item/device/toner/T = O
toner += T.toner_amount
qdel(O)
updateUsrDialog()
else
user << "<span class='notice'>This cartridge is not yet ready for replacement! Use up the rest of the toner.</span>"
else if(istype(O, /obj/item/weapon/wrench))

View File

@@ -2,7 +2,6 @@
#define LIQUID 2
#define GAS 3
#define BOTTLE_SPRITES list("bottle-1", "bottle-2", "bottle-3", "bottle-4") //list of available bottle sprites
#define REAGENTS_PER_SHEET 20
@@ -23,10 +22,11 @@
var/condi = 0
var/useramount = 15 // Last used amount
var/pillamount = 10
var/bottlesprite = "bottle-1" //yes, strings
var/pillsprite = "1"
var/client/has_sprites = list()
var/bottlesprite = 1
var/pillsprite = 1
var/max_pill_count = 20
var/tab = "home"
var/analyze_data[0]
flags = OPENCONTAINER
/obj/machinery/chem_master/New()
@@ -56,7 +56,6 @@
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))
@@ -69,9 +68,74 @@
user.drop_item()
B.loc = src
user << "You add the pill bottle into the dispenser slot!"
src.updateUsrDialog()
return
/obj/machinery/chem_master/attack_hand(mob/user as mob)
if(stat & BROKEN)
return
user.set_machine(src)
ui_interact(user)
/**
* Display the NanoUI window for the chem master.
*
* See NanoUI documentation for details.
*/
/obj/machinery/chem_master/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
user.set_machine(src)
var/list/data = list()
data["tab"] = tab
data["condi"] = condi
if(loaded_pill_bottle)
data["pillBottle"] = list("total" = loaded_pill_bottle.contents.len, "max" = loaded_pill_bottle.max_storage_space)
else
data["pillBottle"] = null
if(beaker)
var/datum/reagents/R = beaker:reagents
var/ui_reagent_beaker_list[0]
for(var/datum/reagent/G in R.reagent_list)
ui_reagent_beaker_list[++ui_reagent_beaker_list.len] = list("name" = G.name, "volume" = G.volume, "description" = G.description, "id" = G.id)
data["beaker"] = list("total_volume" = R.total_volume, "reagent_list" = ui_reagent_beaker_list)
else
data["beaker"] = null
if(reagents.total_volume)
var/ui_reagent_list[0]
for(var/datum/reagent/N in reagents.reagent_list)
ui_reagent_list[++ui_reagent_list.len] = list("name" = N.name, "volume" = N.volume, "description" = N.description, "id" = N.id)
data["reagents"] = list("total_volume" = reagents.total_volume, "reagent_list" = ui_reagent_list)
else
data["reagents"] = null
data["mode"] = mode
if(analyze_data)
data["analyzeData"] = list("name" = analyze_data["name"], "desc" = analyze_data["desc"], "blood_type" = analyze_data["blood_type"], "blood_DNA" = analyze_data["blood_DNA"])
else
data["analyzeData"] = null
data["pillSprite"] = pillsprite
data["bottleSprite"] = bottlesprite
var/P[20] //how many pill sprites there are. Sprites are taken from chemical.dmi and can be found in nano/images/pill.png
for(var/i = 1 to P.len)
P[i] = i
data["pillSpritesAmount"] = P
data["bottleSpritesAmount"] = list(1, 2, 3, 4) //how many bottle sprites there are. Sprites are taken from chemical.dmi and can be found in nano/images/pill.png
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "chem_master.tmpl", src.name, 575, 400)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(5)
/obj/machinery/chem_master/Topic(href, href_list)
if(stat & (BROKEN|NOPOWER)) return
if(usr.stat || usr.restrained()) return
@@ -80,20 +144,19 @@
src.add_fingerprint(usr)
usr.set_machine(src)
if(href_list["tab_select"])
tab = href_list["tab_select"]
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 (tab == "analyze")
analyze_data["name"] = href_list["name"]
analyze_data["desc"] = href_list["desc"]
if(!condi)
if(href_list["name"] == "Blood")
var/datum/reagent/blood/G
@@ -101,16 +164,9 @@
if(F.name == href_list["name"])
G = F
break
var/A = G.name
var/B = G.data["blood_type"]
var/C = G.data["blood_DNA"]
dat += "<TITLE>Chemmaster 3000</TITLE>Chemical infos:<BR><BR>Name:<BR>[A]<BR><BR>Description:<BR>Blood Type: [B]<br>DNA: [C]<BR><BR><BR><A href='?src=\ref[src];main=1'>(Back)</A>"
else
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
analyze_data["name"] = G.name
analyze_data["blood_type"] = G.data["blood_type"]
analyze_data["blood_DNA"] = G.data["blood_DNA"]
else if (href_list["add"])
@@ -147,9 +203,6 @@
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
@@ -185,9 +238,8 @@
P.icon_state = "pill"+pillsprite
reagents.trans_to_obj(P,amount_per_pill)
if(src.loaded_pill_bottle)
if(loaded_pill_bottle.contents.len < loaded_pill_bottle.storage_slots)
if(loaded_pill_bottle.contents.len < loaded_pill_bottle.max_storage_space)
P.loc = loaded_pill_bottle
src.updateUsrDialog()
else if (href_list["createbottle"])
if(!condi)
@@ -197,106 +249,23 @@
P.name = "[name] bottle"
P.pixel_x = rand(-7, 7) //random position
P.pixel_y = rand(-7, 7)
P.icon_state = bottlesprite
P.icon_state = "bottle"+bottlesprite
reagents.trans_to_obj(P,60)
P.update_icon()
else
var/obj/item/weapon/reagent_containers/food/condiment/P = new/obj/item/weapon/reagent_containers/food/condiment(src.loc)
reagents.trans_to_obj(P,50)
else if(href_list["change_pill"])
#define MAX_PILL_SPRITE 20 //max icon state of the pill sprites
var/dat = "<table>"
for(var/i = 1 to MAX_PILL_SPRITE)
dat += "<tr><td><a href=\"?src=\ref[src]&pill_sprite=[i]\"><img src=\"pill[i].png\" /></a></td></tr>"
dat += "</table>"
usr << browse(dat, "window=chem_master")
return
else if(href_list["change_bottle"])
var/dat = "<table>"
for(var/sprite in BOTTLE_SPRITES)
dat += "<tr><td><a href=\"?src=\ref[src]&bottle_sprite=[sprite]\"><img src=\"[sprite].png\" /></a></td></tr>"
dat += "</table>"
usr << browse(dat, "window=chem_master")
return
else if(href_list["pill_sprite"])
pillsprite = href_list["pill_sprite"]
else if(href_list["bottle_sprite"])
bottlesprite = href_list["bottle_sprite"]
src.updateUsrDialog()
return
nanomanager.update_uis(src)
/obj/machinery/chem_master/attack_ai(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)
if(!(user.client in has_sprites))
spawn()
has_sprites += user.client
for(var/i = 1 to MAX_PILL_SPRITE)
usr << browse_rsc(icon('icons/obj/chemical.dmi', "pill" + num2text(i)), "pill[i].png")
for(var/sprite in BOTTLE_SPRITES)
usr << browse_rsc(icon('icons/obj/chemical.dmi', sprite), "[sprite].png")
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=30'>(30)</A> "
dat += "<A href='?src=\ref[src];add=[G.id];amount=60'>(60)</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=30'>(30)</A> "
dat += "<A href='?src=\ref[src];remove=[N.id];amount=60'>(60)</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 (60 units max)</A><a href=\"?src=\ref[src]&change_pill=1\"><img src=\"pill[pillsprite].png\" /></a><BR>"
dat += "<A href='?src=\ref[src];createpill_multiple=1'>Create multiple pills</A><BR>"
dat += "<A href='?src=\ref[src];createbottle=1'>Create bottle (60 units max)<a href=\"?src=\ref[src]&change_bottle=1\"><img src=\"[bottlesprite].png\" /></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/condimaster
name = "CondiMaster 3000"
condi = 1