/datum/beakerSpec var/list/chems = list() var/list/amounts = list() var/temp = T0C proc/addChem(var/chem as text, var/amount=0) if(chems.Find(chem)) removeChem(chem) if(istext(amount)) amount = text2num(amount) chems.Add(chem) amounts[chem] = amount proc/removeChem(var/chem as text) chems.Remove(chem) amounts[chem] = 0 proc/setTemp(var/ttemp as text) temp = text2num(ttemp) proc/createBeaker(var/holder) var/obj/item/reagent_containers/glass/B = new(holder) var/total = 0 for(var/chem in chems) total += amounts[chem] B.reagents.maximum_volume = total B.reagents.add_reagent(chem, amounts[chem], null, 0, 1) B.reagents.set_reagent_temp(temp) return B proc/createReagents() var/datum/reagents/R = new(1000) var/total = 0 for(var/chem in chems) total += amounts[chem] R.maximum_volume = total R.add_reagent(chem, amounts[chem], null, 0, 1) return R proc/toJson() var/first = 1 var/json = "{\"chems\": \[" for(var/chem in chems) var amount = amounts[chem] if(!first) json += "," else first = 0 json += "{\"chem\":\"[chem]\",\"amount\":[amount]}" json += "],\"temp\":[temp]}" return json /obj/machinery/chem_dispenser_admin/ name = "chem dispenser" density = 1 anchored = 1 icon = 'icons/obj/chemical.dmi' icon_state = "dispenser" flags = NOSPLASH var/beaker = null var/glass_path = /obj/item/reagent_containers/glass var/glass_name = "beaker" var/dispenser_name = "Chemical" var/obj/item/card/id/user_id = null var/datum/reagent_group_account/current_account = null var/list/accounts = list() var/list/chems1 = list() var/list/amounts1 = list() var/list/chems2 = list() var/list/amounts2 = list() var/list/chems3 = list() var/list/amounts3 = list() var/list/beakerSpecs = list() var/list/temps = list() New() UnsubscribeProcess() ex_act(severity) switch(severity) if(1.0) qdel(src) return if(2.0) if (prob(50)) qdel(src) return blob_act(var/power) if (prob(power * 1.25)) qdel(src) meteorhit() qdel(src) return proc/beakerSpecsToJson() var/first = 1 var/json = "\[" for(var/datum/beakerSpec/S in beakerSpecs) if(!first) json += "," else first = 0 json += S.toJson() json += "]" return json Topic(href, href_list) switch(href_list["action"]) if("add") addChem(href_list["chem"], text2num(href_list["amount"]), text2num(href_list["beaker"])) usr << output(href_list["chem"] + ";" + href_list["amount"], "cheminterface.browser:addCallback") if("remove") removeChem(href_list["chem"], text2num(href_list["beaker"])) if("temp") setTemp(href_list["temp"], text2num(href_list["beaker"])) if("grenade") grenade(href_list["name"]) if("syringe") syringe(href_list["name"]) if("lbeaker") lbeaker(href_list["name"]) if("patch") patch(href_list["name"]) if("getBeakerSpecs") usr << output(beakerSpecsToJson(), "cheminterface.browser:loadBeakerSpecsCallback") if("newBeaker") beakerSpecs.len++ beakerSpecs[beakerSpecs.len] = new /datum/beakerSpec() else usr << output("bar", "cheminterface.browser:out") proc/removeChem(var/chem as text, var/beaker=1) if(istext(beaker)) beaker = text2num(beaker) if(beaker > beakerSpecs.len || isnull(beakerSpecs[beaker])) return var/datum/beakerSpec/beakerSpec = beakerSpecs[beaker] beakerSpec.removeChem(chem) proc/addChem(var/chem as text, var/amount=0, var/beaker=1) if(isnull(beakerSpecs[beaker])) beakerSpecs[beaker] = new /datum/beakerSpec() var/datum/beakerSpec/beakerSpec = beakerSpecs[beaker] beakerSpec.addChem(chem, amount) proc/setTemp(var/temp as text, var/beaker=1) if(isnull(beakerSpecs[beaker])) return var/datum/beakerSpec/beakerSpec = beakerSpecs[beaker] beakerSpec.setTemp(temp) proc/grenade(var/name as text) var/obj/item/chem_grenade/adminGrenade = new /obj/item/chem_grenade(src.loc) if(name == "" || isnull(name)) adminGrenade.name = "grief grenade" else adminGrenade.name = name adminGrenade.desc = "This shit is dangerous." adminGrenade.stage = 2 adminGrenade.icon_state = "chemg3" var/total = 0 for(var/datum/beakerSpec/S in beakerSpecs) var/obj/item/reagent_containers/glass/B = S.createBeaker(adminGrenade) total += B.reagents.maximum_volume adminGrenade.beakers += B adminGrenade.reagents.maximum_volume = total return proc/syringe(var/name as text) var/obj/item/reagent_containers/syringe/adminSyringe = new(src.loc) if(name == "" || isnull(name)) adminSyringe.name = "An unlabeled syringe" else adminSyringe.name = name var/datum/beakerSpec/S = beakerSpecs[1] var/datum/reagents/R = S.createReagents() adminSyringe.reagents.my_atom = null adminSyringe.reagents.dispose() adminSyringe.reagents = R R.my_atom = adminSyringe return proc/lbeaker(var/name as text) var/obj/item/reagent_containers/glass/beaker/large/adminBeaker = new(src.loc) if(name == "" || isnull(name)) adminBeaker.name = "mysterious large beaker" else adminBeaker.name = name var/datum/beakerSpec/S = beakerSpecs[1] var/datum/reagents/R = S.createReagents() adminBeaker.reagents.my_atom = null adminBeaker.reagents.dispose() adminBeaker.reagents = R R.my_atom = adminBeaker return proc/patch(var/name as text) var/obj/item/reagent_containers/patch/adminPatch = new(src.loc) if(name == "" || isnull(name)) adminPatch.name = "An unmarked patch" else adminPatch.name = name var/datum/beakerSpec/S = beakerSpecs[1] var/datum/reagents/R = S.createReagents() adminPatch.reagents.my_atom = null adminPatch.reagents.dispose() adminPatch.reagents = R R.my_atom = adminPatch return attack_hand(mob/user as mob) panel() proc/panel() set background = 1 if(beakerSpecs.len == 0) beakerSpecs.len++ beakerSpecs[beakerSpecs.len] = new /datum/beakerSpec() //setup var/datum/tag/page/html = new var/datum/tag/heading/h = new (1) var/datum/tag/title/title = new html.addToBody(h) html.addToHead(title) //heading h.setText("Chemofabricator") //container var/datum/tag/div/container = new container.addClass("container-fluid") html.addToBody(container) //Top row with chem select and amount var/datum/tag/div/row = new row.addClass("row-fluid") container.addChildElement(row) var/datum/tag/div/span = new span.addClass("span8") row.addChildElement(span) var/datum/tag/select/chemSelect = new span.addChildElement(chemSelect) chemSelect.setId("chemselect") chemSelect.setName("chemselect") for(var/rtype in global.reagents_cache) chemSelect.addOption(rtype,rtype) span = new var/datum/tag/input/chemAmount = new ("text") span.addChildElement(chemAmount) span.addClass("span4") row.addChildElement(span) chemAmount.setName("chemamount") chemAmount.setId("chemamount") chemAmount.setValue("10") var/datum/tag/div/beakerContainer = new beakerContainer.addClass("container-fluid") html.addToBody(beakerContainer) beakerContainer.setId("beaker-container") //Grenade button row = new row.addClass("row-fluid") container.addChildElement(row) span = new span.addClass("span3") row.addChildElement(span) span.innerHtml = "Name: " span = new span.addClass("span6") row.addChildElement(span) var/datum/tag/input/name = new ("text") span.addChildElement(name) name.setId("grenadeName") name.setName("grenadeName") row = new row.addClass("row-fluid") container.addChildElement(row) span = new span.addClass("span3") row.addChildElement(span) var/datum/tag/button/grenade = new grenade.setText("Grenade") grenade.setId("grenadeButton") span.addChildElement(grenade) span = new span.addClass("span3") row.addChildElement(span) var/datum/tag/button/syringe = new syringe.setText("Syringe") syringe.setId("syringeButton") span.addChildElement(syringe) span = new span.addClass("span3") row.addChildElement(span) var/datum/tag/button/lbeaker = new lbeaker.setText("Large Beaker") lbeaker.setId("lbeakerButton") span.addChildElement(lbeaker) span = new span.addClass("span3") row.addChildElement(span) var/datum/tag/button/patch = new patch.setText("Patch") patch.setId("patchButton") span.addChildElement(patch) row = new row.addClass("row-fluid") container.addChildElement(row) span = new span.addClass("span3") row.addChildElement(span) var/datum/tag/button/newBeaker = new newBeaker.setText("Add Beaker") newBeaker.setId("newBeaker") newBeaker.addClass("btn btn-default") span.addChildElement(newBeaker) span = new span.addClass("span3") row.addChildElement(span) var/datum/tag/button/refresh = new refresh.setText("Refresh") refresh.setId("refresh") refresh.addClass("btn btn-default") span.addChildElement(refresh) var/datum/tag/script/controlscr = new controlscr.setContent( {" var specs = {beakerSpecs: \[]}; function loadBeakerSpecsCallback(spec) { var bspecs = $.parseJSON(spec); $.observable(specs).setProperty("beakerSpecs", bspecs); } function loadBeakerSpecs() { window.location = '?src=\ref[src];action=getBeakerSpecs'; } function addReagentClick(event) { var chem = $('#chemselect').val(); var amount = $('#chemamount').val(); var beaker = $(event.target).data("beaker"); window.location='?src=\ref[src];action=add;chem=' + chem + ';amount=' + amount + ';beaker=' + beaker; setTimeout(loadBeakerSpecs, 300); } function removeReagentClick(event) { var beaker = $(event.target).data("beaker"); var chem = $('#addedRegs' + beaker).val(); window.location='?src=\ref[src];action=remove;chem=' + chem + ';beaker=' + beaker; setTimeout(loadBeakerSpecs, 300); } function tempButtonClick(event) { var beaker = $(event.target).data("beaker"); var temp = $('#temp' + beaker).val(); window.location='?src=\ref[src];action=temp;temp=' + temp + ';beaker=' + beaker; setTimeout(loadBeakerSpecs, 300); } $(function() { var beakerTemplate = $.templates("#beakerTemplate"); beakerTemplate.link("#beaker-container", specs); $(specs).on("propertyChange", function() { $('.addButton').on("click", addReagentClick); $('.removeButton').on("click", removeReagentClick); $('.tempButton').on("click", tempButtonClick); }); loadBeakerSpecs(); $('#newBeaker').click(function() { window.location='?src=\ref[src];action=newBeaker'; setTimeout(loadBeakerSpecs, 300); }); $('#refresh').click(function() { setTimeout(loadBeakerSpecs, 300); }); function removeReg(beaker, chem, send) { $('#addedRegs' + beaker).find('#reg' + beaker + '-' + chem).remove(); if(typeof send !== 'undefined' && send) window.location='?src=\ref[src];action=remove;chem=' + chem + ';beaker=' + beaker; } $('#grenadeButton').click(function() { var name = $('#grenadeName').val(); window.location='?src=\ref[src];action=grenade;name=' + name; }); $('#syringeButton').click(function() { var name = $('#grenadeName').val(); window.location='?src=\ref[src];action=syringe;name=' + name; }); $('#lbeakerButton').click(function() { var name = $('#grenadeName').val(); window.location='?src=\ref[src];action=lbeaker;name=' + name; }); $('#patchButton').click(function() { var name = $('#grenadeName').val(); window.location='?src=\ref[src];action=patch;name=' + name; }); }); "}) html.addToBody(controlscr) var/datum/tag/script/scr = new scr.setContent({" function out(txt) { //alert(txt); } function addCallback(chem, amount) { //alert("chem: " + chem + " amount: " + amount); } "}) html.addToBody(scr) var/datum/tag/cssinclude/bootstrap = new bootstrap.setHref(resource("css/bootstrap.min.css")) html.addToHead(bootstrap) var/datum/tag/cssinclude/bootstrapResponsive = new bootstrapResponsive.setHref(resource("css/bootstrap-responsive.min.css")) html.addToHead(bootstrapResponsive) var/datum/tag/scriptinclude/jquery = new jquery.setSrc(resource("js/jquery.min.js")) html.addToHead(jquery) var/datum/tag/scriptinclude/jqueryMigrate = new jqueryMigrate.setSrc(resource("js/jquery.migrate.js")) html.addToHead(jqueryMigrate) var/datum/tag/scriptinclude/bootstrapJs = new bootstrapJs.setSrc(resource("js/bootstrap.min.js")) html.addToBody(bootstrapJs) var/datum/tag/scriptinclude/jsviews = new jsviews.setSrc(resource("js/jsviews.min.js")) html.addToBody(jsviews) var/datum/tag/script/beakerTemplate = new beakerTemplate.setId("beakerTemplate") beakerTemplate.setAttribute("type", "text/x-jsrender") html.addToBody(beakerTemplate) beakerTemplate.setContent({" {^{for beakerSpecs}}

Beaker {{:#index + 1}}

{{:temp}}
{{/for}} "}) /* row = new row.addClass("row-fluid") beakerTemplate.addChildElement(row) span = new span.addClass("span12") row.addChildElement(span) h = new(4) h.setText("Beaker 3") span.addChildElement(h) row = new row.addClass("row-fluid") beakerTemplate.addChildElement(row) span = new span.addClass("span3") row.addChildElement(span) var/datum/tag/button/add3 = new add3.setText("Add #3") add3.setId("addButton3") span.addChildElement(add3) var/datum/tag/button/remove3 = new remove3.setText("Remove #3") remove3.setId("removeButton3") span.addChildElement(remove3) span = new span.addClass("span9") row.addChildElement(span) var/datum/tag/select/multi/added3 = new added3.setId("addedRegs3") for(var/chem in chems3) var/amt = amounts3[chem] added3.addOption(chem, "[chem]: [amt]") span.addChildElement(added3)*/ /*var/datum/tag/firebug/fb = new html.addToHead(fb)*/ usr << browse(html.toHtml(), "window=cheminterface;size=600x600")