diff --git a/code/modules/chemical/Chemistry-Holder.dm b/code/modules/chemical/Chemistry-Holder.dm
index 1f927036c0f..9dccadb9393 100644
--- a/code/modules/chemical/Chemistry-Holder.dm
+++ b/code/modules/chemical/Chemistry-Holder.dm
@@ -336,6 +336,7 @@ datum
D.cure(0)
*/
+ handle_reactions()
return 0
for(var/A in typesof(/datum/reagent) - /datum/reagent)
@@ -352,8 +353,11 @@ datum
//debug
update_total()
my_atom.on_reagent_change()
+ handle_reactions()
return 0
+ handle_reactions()
+
return 1
remove_reagent(var/reagent, var/amount, var/safety)//Added a safety check for the trans_id_to
diff --git a/code/modules/chemical/Chemistry-Machinery.dm b/code/modules/chemical/Chemistry-Machinery.dm
index c34ce589154..09d6ce86357 100644
--- a/code/modules/chemical/Chemistry-Machinery.dm
+++ b/code/modules/chemical/Chemistry-Machinery.dm
@@ -9,15 +9,17 @@
icon = 'chemical.dmi'
icon_state = "dispenser"
var/energy = 25
- var/max_energy = 25
+ var/max_energy = 75
+ var/amount = 30
+ var/beaker = null
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","acid",)
proc
recharge()
if(stat & BROKEN) return
if(energy != max_energy)
energy++
- use_power(50)
- spawn(600) recharge()
+ use_power(2000) // This thing uses up alot of power (this is still low as shit for creating reagents from thin air)
+ spawn(200) recharge()
New()
recharge()
@@ -40,41 +42,91 @@
del(src)
return
- Topic(href, href_list)
+ 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\]\"")
+ 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)
+ for(var/da in typesof(/datum/reagent) - /datum/reagent)
+ var/datum/reagent/temp = new da()
+ if(temp.id == re)
+ 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]")
+
+ SkinCmd(mob/user as mob, var/data as text)
if(stat & BROKEN) return
if(usr.stat || usr.restrained()) return
if(!in_range(src, usr)) return
usr.machine = src
- if (href_list["dispense"])
- if(!energy)
- var/dat = "Not enough energy.
OK"
- usr << browse("
Chemical DispenserChemical dispenser:
Energy = [energy]/[max_energy]
[dat]", "window=chem_dispenser")
- return
- var/id = href_list["dispense"]
- var/obj/item/weapon/reagent_containers/glass/dispenser/G = new/obj/item/weapon/reagent_containers/glass/dispenser(src.loc)
- switch(text2num(href_list["state"]))
- if(LIQUID)
- G.icon_state = "liquid"
- if(GAS)
- G.icon_state = "vapour"
- if(SOLID)
- G.icon_state = "solid"
- G.pixel_x = rand(-7, 7)
- G.pixel_y = rand(-7, 7)
- G.name += " ([lowertext(href_list["name"])])"
- G.reagents.add_reagent(id,30)
- energy--
- src.updateUsrDialog()
- return
+ if (data == "amountc")
+ var/num = text2num(input("Enter desired output amount", "Amount", "30"))
+ 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
- usr << browse(null, "window=chem_dispenser")
- return
+ 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, 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
+ attackby(var/obj/item/weapon/reagent_containers/glass/B as obj, var/mob/user as mob)
+ 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)
+
attack_ai(mob/user as mob)
return src.attack_hand(user)
@@ -85,16 +137,11 @@
if(stat & BROKEN)
return
user.machine = src
- var/dat = ""
- for(var/re in dispensable_reagents)
- for(var/da in typesof(/datum/reagent) - /datum/reagent)
- var/datum/reagent/temp = new da()
- if(temp.id == re)
- dat += "[temp.name]
"
- dat += "[temp.description]
"
- user << browse("Chemical DispenserChemical dispenser:
Energy = [energy]/[max_energy]
[dat]", "window=chem_dispenser")
- onclose(user, "chem_dispenser")
+ initWindow(user)
+ updateWindow(user)
+ winshow(user, "chemdispenser", 1)
+ user.skincmds["chemdispenser"] = src
return
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm
index 4d533642e51..0cdb22bb219 100644
--- a/code/modules/chemical/Chemistry-Tools.dm
+++ b/code/modules/chemical/Chemistry-Tools.dm
@@ -601,6 +601,7 @@
var/list/can_be_placed_into = list(
/obj/machinery/chem_master/,
+ /obj/machinery/chem_dispenser/,
/obj/machinery/reagentgrinder,
/obj/structure/table,
/obj/structure/secure_closet,
@@ -3163,4 +3164,4 @@
icon_state = "jar"
name = "empty jar"
desc = "A jar. You're not sure what it's supposed to hold."
- return
\ No newline at end of file
+ return
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index 2ffc1da29d6..22d810a801d 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -28,7 +28,7 @@
return 0
var/area/A = src.loc.loc // make sure it's in an area
- if(!A || !isarea(A))
+ if(!A || !isarea(A) || !A.master)
return 0 // if not, then not powered
return A.master.powered(chan) // return power status of the area
@@ -37,7 +37,7 @@
/obj/machinery/proc/use_power(var/amount, var/chan=EQUIP) // defaults to Equipment channel
var/area/A = src.loc.loc // make sure it's in an area
- if(!A || !isarea(A))
+ if(!A || !isarea(A) || !A.master)
return
A.master.use_power(amount, chan)
diff --git a/html/changelog.html b/html/changelog.html
index a89b100a9fa..f538c4f74a4 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -61,6 +61,11 @@ should be listed in the changelog upon commit tho. Thanks. -->
Toggling admin midis will now DISABLE THE CURRENT MIDI OH MY GOSH!
+ Tobba updated:
+
+ - We're looking for feedback on the updated chem dispenser! It no longer dispenses beakers of the reagent, and instead places a variable amount of the reagent into the beaker of your choosing.
+
+
16 November 2011
@@ -76,7 +81,7 @@ should be listed in the changelog upon commit tho. Thanks. -->
- Petethegoat updated:
- - Security, Engineer, Medical, and Janitor borgs no longer get a choice of module. This is for purposes of quick recognition, and is the first part of a series of upcoming cyborg updates.
+ - Security, Engineer, Medical, and Janitor borgs no longer get a choice of skin. This is for purposes of quick recognition, and is the first part of a series of upcoming cyborg updates.
diff --git a/icons/dispensebutton_bg.png b/icons/dispensebutton_bg.png
new file mode 100644
index 00000000000..195c02114ea
Binary files /dev/null and b/icons/dispensebutton_bg.png differ
diff --git a/icons/reagentname_bg.png b/icons/reagentname_bg.png
new file mode 100644
index 00000000000..879179edd81
Binary files /dev/null and b/icons/reagentname_bg.png differ
diff --git a/interface/skin.dmf b/interface/skin.dmf
index 434d8b171ac..5569c299b1d 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -291,6 +291,360 @@ menu "menu"
saved-params = "is-checked"
+window "chemdispenser"
+ elem "chemdispenser"
+ type = MAIN
+ pos = 281,0
+ size = 340x480
+ anchor1 = none
+ anchor2 = none
+ font-family = ""
+ font-size = 0
+ font-style = ""
+ text-color = #000000
+ background-color = none
+ is-visible = false
+ is-disabled = false
+ is-transparent = false
+ is-default = false
+ border = none
+ drop-zone = false
+ right-click = false
+ saved-params = "pos;size;is-minimized;is-maximized"
+ on-size = ""
+ title = "Chem Dispenser"
+ titlebar = true
+ statusbar = false
+ can-close = true
+ can-minimize = true
+ can-resize = true
+ is-pane = false
+ is-minimized = false
+ is-maximized = false
+ can-scroll = none
+ icon = ""
+ image = ""
+ image-mode = stretch
+ keep-aspect = false
+ transparent-color = none
+ alpha = 255
+ macro = ""
+ menu = ""
+ on-close = ""
+ elem "energy"
+ type = LABEL
+ pos = 8,24
+ size = 56x16
+ anchor1 = none
+ anchor2 = none
+ font-family = ""
+ font-size = 0
+ font-style = ""
+ text-color = #000000
+ background-color = none
+ is-visible = true
+ is-disabled = false
+ is-transparent = false
+ is-default = false
+ border = none
+ drop-zone = false
+ right-click = false
+ saved-params = ""
+ on-size = ""
+ text = "Energy: 25"
+ image = ""
+ image-mode = center
+ keep-aspect = false
+ align = center
+ text-wrap = false
+ elem "eject"
+ type = BUTTON
+ pos = 264,4
+ size = 72x20
+ anchor1 = none
+ anchor2 = none
+ font-family = ""
+ font-size = 0
+ font-style = ""
+ text-color = #000000
+ background-color = none
+ is-visible = true
+ is-disabled = false
+ is-transparent = false
+ is-default = false
+ border = none
+ drop-zone = false
+ right-click = false
+ saved-params = "is-checked"
+ on-size = ""
+ text = "[Insert beaker]"
+ image = ""
+ command = "skincmd \"chemdispenser;eject\""
+ is-flat = false
+ stretch = false
+ is-checked = false
+ group = ""
+ button-type = pushbutton
+ elem "amountc"
+ type = BUTTON
+ pos = 208,4
+ size = 48x20
+ anchor1 = none
+ anchor2 = none
+ font-family = ""
+ font-size = 0
+ font-style = ""
+ text-color = #000000
+ background-color = none
+ is-visible = true
+ is-disabled = false
+ is-transparent = false
+ is-default = false
+ border = none
+ drop-zone = false
+ right-click = false
+ saved-params = "is-checked"
+ on-size = ""
+ text = "[Other]"
+ image = ""
+ command = "skincmd \"chemdispenser;amountc\""
+ is-flat = false
+ stretch = false
+ is-checked = false
+ group = ""
+ button-type = pushbutton
+ elem "amount3"
+ type = BUTTON
+ pos = 176,4
+ size = 24x20
+ anchor1 = none
+ anchor2 = none
+ font-family = ""
+ font-size = 0
+ font-style = ""
+ text-color = #000000
+ background-color = none
+ is-visible = true
+ is-disabled = false
+ is-transparent = false
+ is-default = false
+ border = none
+ drop-zone = false
+ right-click = false
+ saved-params = "is-checked"
+ on-size = ""
+ text = "[30]"
+ image = ""
+ command = "skincmd \"chemdispenser;amount30\""
+ is-flat = false
+ stretch = false
+ is-checked = false
+ group = ""
+ button-type = pushbutton
+ elem "amount2"
+ type = BUTTON
+ pos = 144,4
+ size = 24x20
+ anchor1 = none
+ anchor2 = none
+ font-family = ""
+ font-size = 0
+ font-style = ""
+ text-color = #000000
+ background-color = none
+ is-visible = true
+ is-disabled = false
+ is-transparent = false
+ is-default = false
+ border = none
+ drop-zone = false
+ right-click = false
+ saved-params = "is-checked"
+ on-size = ""
+ text = "[20]"
+ image = ""
+ command = "skincmd \"chemdispenser;amount20\""
+ is-flat = false
+ stretch = false
+ is-checked = false
+ group = ""
+ button-type = pushbutton
+ elem "amount1"
+ type = BUTTON
+ pos = 112,4
+ size = 24x20
+ anchor1 = none
+ anchor2 = none
+ font-family = ""
+ font-size = 0
+ font-style = ""
+ text-color = #000000
+ background-color = none
+ is-visible = true
+ is-disabled = false
+ is-transparent = false
+ is-default = false
+ border = none
+ drop-zone = false
+ right-click = false
+ saved-params = "is-checked"
+ on-size = ""
+ text = "[10]"
+ image = ""
+ command = "skincmd \"chemdispenser;amount10\""
+ is-flat = false
+ stretch = false
+ is-checked = false
+ group = ""
+ button-type = pushbutton
+ elem "amount"
+ type = LABEL
+ pos = 4,4
+ size = 100x20
+ anchor1 = none
+ anchor2 = none
+ font-family = ""
+ font-size = 12
+ font-style = ""
+ text-color = #000000
+ background-color = none
+ is-visible = true
+ is-disabled = false
+ is-transparent = false
+ is-default = false
+ border = none
+ drop-zone = false
+ right-click = false
+ saved-params = ""
+ on-size = ""
+ text = "Amount: 30"
+ image = ""
+ image-mode = center
+ keep-aspect = false
+ align = center
+ text-wrap = false
+ elem "child1"
+ type = CHILD
+ pos = 0,40
+ size = 340x440
+ anchor1 = none
+ anchor2 = none
+ font-family = ""
+ font-size = 0
+ font-style = ""
+ text-color = #000000
+ background-color = none
+ is-visible = true
+ is-disabled = false
+ is-transparent = false
+ is-default = false
+ border = none
+ drop-zone = false
+ right-click = false
+ saved-params = "splitter"
+ on-size = ""
+ left = "chemdispenser_reagents"
+ right = ""
+ is-vert = false
+ splitter = 50
+ show-splitter = true
+ lock = none
+
+window "chemdispenser_reagents"
+ elem "chemdispenser_reagents"
+ type = MAIN
+ pos = 281,0
+ size = 340x448
+ anchor1 = none
+ anchor2 = none
+ font-family = ""
+ font-size = 0
+ font-style = ""
+ text-color = #000000
+ background-color = none
+ is-visible = true
+ is-disabled = false
+ is-transparent = false
+ is-default = false
+ border = none
+ drop-zone = false
+ right-click = false
+ saved-params = "pos;size;is-minimized;is-maximized"
+ on-size = ""
+ title = ""
+ titlebar = false
+ statusbar = false
+ can-close = false
+ can-minimize = false
+ can-resize = false
+ is-pane = true
+ is-minimized = false
+ is-maximized = false
+ can-scroll = vertical
+ icon = ""
+ image = ""
+ image-mode = stretch
+ keep-aspect = false
+ transparent-color = none
+ alpha = 255
+ macro = ""
+ menu = ""
+ on-close = ""
+ elem "template_dispense"
+ type = BUTTON
+ pos = 256,8
+ size = 64x32
+ anchor1 = none
+ anchor2 = none
+ font-family = ""
+ font-size = 0
+ font-style = ""
+ text-color = #000000
+ background-color = none
+ is-visible = false
+ is-disabled = false
+ is-transparent = false
+ is-default = false
+ border = none
+ drop-zone = false
+ right-click = false
+ saved-params = "is-checked"
+ on-size = ""
+ text = "Dispense"
+ image = 'icons\\dispensebutton_bg.png'
+ command = ""
+ is-flat = true
+ stretch = false
+ is-checked = false
+ group = ""
+ button-type = pushbutton
+ elem "template_name"
+ type = LABEL
+ pos = 18,8
+ size = 230x32
+ anchor1 = none
+ anchor2 = none
+ font-family = ""
+ font-size = 15
+ font-style = ""
+ text-color = #000000
+ background-color = none
+ is-visible = false
+ is-disabled = false
+ is-transparent = false
+ is-default = false
+ border = none
+ drop-zone = false
+ right-click = false
+ saved-params = ""
+ on-size = ""
+ text = "Chloral Hydrate"
+ image = 'icons\\reagentname_bg.png'
+ image-mode = stretch
+ keep-aspect = false
+ align = center
+ text-wrap = false
+
window "mainwindow"
elem "mainwindow"
type = MAIN
@@ -920,7 +1274,7 @@ window "vendingslot"
is-maximized = false
can-scroll = none
icon = ""
- image = 'icons\\vending_icons\\vendingslot_bg.png'
+ image = 'icons\\vendingslot_bg.png'
image-mode = stretch
keep-aspect = false
transparent-color = none
@@ -1012,7 +1366,7 @@ window "vendingslot"
window "vendingwindow"
elem "vendingwindow"
type = MAIN
- pos = 758,177
+ pos = 281,0
size = 300x470
anchor1 = none
anchor2 = none