diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 4a48dbb4ae..43ca9d2fc3 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -9,13 +9,23 @@
icon_state = "body_scanner_0"
density = 1
anchored = 1
+
circuit = /obj/item/weapon/circuitboard/body_scanner
use_power = 1
idle_power_usage = 60
active_power_usage = 10000 //10 kW. It's a big all-body scanner.
+ light_color = "#00FF00"
+
/obj/machinery/bodyscanner/New()
+ ..()
+ spawn( 5 )
+ var/obj/machinery/body_scanconsole/C = locate(/obj/machinery/body_scanconsole) in range(2,src)
+ if(C)
+ C.connected = src
+
+/obj/machinery/bodyscanner/map/New()
..()
circuit = new circuit(src)
component_parts = list()
@@ -23,81 +33,14 @@
component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
component_parts += new /obj/item/stack/material/glass/reinforced(src, 2)
-
- spawn( 5 )
- var/obj/machinery/body_scanconsole/C = locate(/obj/machinery/body_scanconsole) in range(2,src)
- if(C)
- C.connected = src
- return
-
RefreshParts()
-/obj/machinery/bodyscanner/relaymove(mob/user as mob)
- if (user.stat)
- return
- src.go_out()
- return
-
-/obj/machinery/bodyscanner/verb/eject()
- set src in oview(1)
- set category = "Object"
- set name = "Eject Body Scanner"
-
- if (usr.stat != 0)
- return
- src.go_out()
- add_fingerprint(usr)
- return
-
-/obj/machinery/bodyscanner/verb/move_inside()
- set src in oview(1)
- set category = "Object"
- set name = "Enter Body Scanner"
-
- if (usr.stat != 0)
- return
- if (src.occupant)
- usr << "The scanner is already occupied!"
- return
- if (usr.abiotic())
- usr << "The subject cannot have abiotic items on."
- return
- usr.pulling = null
- usr.client.perspective = EYE_PERSPECTIVE
- usr.client.eye = src
- usr.loc = src
- src.occupant = usr
- update_use_power(2)
- src.icon_state = "body_scanner_1"
- for(var/obj/O in src)
- //O = null
- if(O in component_parts)
- continue
- if(O == circuit)
- continue
- qdel(O)
- //Foreach goto(124)
- src.add_fingerprint(usr)
- return
-
-/obj/machinery/bodyscanner/proc/go_out()
- if ((!( src.occupant ) || src.locked))
- return
- for(var/obj/O in src)
- if(O in component_parts)
- continue
- if(O == circuit)
- continue
- O.loc = src.loc
- //Foreach goto(30)
- if (src.occupant.client)
- src.occupant.client.eye = src.occupant.client.mob
- src.occupant.client.perspective = MOB_PERSPECTIVE
- src.occupant.loc = src.loc
- src.occupant = null
- update_use_power(1)
- src.icon_state = "body_scanner_0"
- return
+/obj/machinery/bodyscanner/power_change()
+ ..()
+ if(!(stat & (BROKEN|NOPOWER)))
+ set_light(2)
+ else
+ set_light(0)
/obj/machinery/bodyscanner/attackby(var/obj/item/G, user as mob)
if(default_deconstruction_screwdriver(user, G))
@@ -107,42 +50,96 @@
if(istype(G, /obj/item/weapon/grab))
var/obj/item/weapon/grab/H = G
- if(!(ismob(H.affecting)))
+ if(panel_open)
+ user << "Close the maintenance panel first."
return
- if (src.occupant)
- user << "The scanner is already occupied!"
+ if(!ismob(H.affecting))
return
- if (H.affecting.abiotic())
- user << "Subject cannot have abiotic items on."
+ if(occupant)
+ user << "The scanner is already occupied!"
return
+ for(var/mob/living/carbon/slime/M in range(1, H.affecting))
+ if(M.Victim == H.affecting)
+ user << "[H.affecting.name] has a fucking slime attached to them, deal with that first."
+ return
var/mob/M = H.affecting
- if (M.client)
- M.client.perspective = EYE_PERSPECTIVE
- M.client.eye = src
- M.loc = src
- src.occupant = M
- update_use_power(2)
- src.icon_state = "body_scanner_1"
- for(var/obj/O in src)
- if(O in component_parts)
- continue
- if(O == circuit)
- continue
- O.loc = src.loc
- //Foreach goto(154)
- src.add_fingerprint(user)
- //G = null
+ if(M.abiotic())
+ user << "Subject cannot have abiotic items on."
+ return
+ M.forceMove(src)
+ occupant = M
+ icon_state = "body_scanner_1"
+ add_fingerprint(user)
qdel(G)
+
+/obj/machinery/bodyscanner/MouseDrop_T(mob/living/carbon/O, mob/user as mob)
+ if(!istype(O))
+ return 0 //not a mob
+ if(user.incapacitated())
+ return 0 //user shouldn't be doing things
+ if(O.anchored)
+ return 0 //mob is anchored???
+ if(get_dist(user, src) > 1 || get_dist(user, O) > 1)
+ return 0 //doesn't use adjacent() to allow for non-cardinal (fuck my life)
+ if(!ishuman(user) && !isrobot(user))
+ return 0 //not a borg or human
+ if(panel_open)
+ user << "Close the maintenance panel first."
+ return 0 //panel open
+ if(occupant)
+ user << "\The [src] is already occupied."
+ return 0 //occupied
+
+ if(O.buckled)
+ return 0
+ if(O.abiotic())
+ user << "Subject cannot have abiotic items on."
+ return 0
+ for(var/mob/living/carbon/slime/M in range(1, O))
+ if(M.Victim == O)
+ user << "[O] has a fucking slime attached to them, deal with that first."
+ return 0
+
+ if(O == user)
+ visible_message("[user] climbs into \the [src].")
+ else
+ visible_message("[user] puts [O] into the body scanner.")
+
+ O.forceMove(src)
+ occupant = O
+ icon_state = "body_scanner_1"
+ add_fingerprint(user)
+
+/obj/machinery/bodyscanner/relaymove(mob/user as mob)
+ if(user.incapacitated())
+ return 0 //maybe they should be able to get out with cuffs, but whatever
+ go_out()
+
+/obj/machinery/bodyscanner/verb/eject()
+ set src in oview(1)
+ set category = "Object"
+ set name = "Eject Body Scanner"
+
+ if(usr.incapacitated())
+ return
+ go_out()
+ add_fingerprint(usr)
+
+/obj/machinery/bodyscanner/proc/go_out()
+ if ((!( src.occupant ) || src.locked))
+ return
+ if (src.occupant.client)
+ src.occupant.client.eye = src.occupant.client.mob
+ src.occupant.client.perspective = MOB_PERSPECTIVE
+ src.occupant.loc = src.loc
+ src.occupant = null
+ src.icon_state = "body_scanner_0"
return
/obj/machinery/bodyscanner/ex_act(severity)
switch(severity)
if(1.0)
for(var/atom/movable/A as mob|obj in src)
- if(A in component_parts)
- continue
- if(A == circuit)
- continue
A.loc = src.loc
ex_act(severity)
//Foreach goto(35)
@@ -152,10 +149,6 @@
if(2.0)
if (prob(50))
for(var/atom/movable/A as mob|obj in src)
- if(A in component_parts)
- continue
- if(A == circuit)
- continue
A.loc = src.loc
ex_act(severity)
//Foreach goto(108)
@@ -165,10 +158,6 @@
if(3.0)
if (prob(25))
for(var/atom/movable/A as mob|obj in src)
- if(A in component_parts)
- continue
- if(A == circuit)
- continue
A.loc = src.loc
ex_act(severity)
//Foreach goto(181)
@@ -178,32 +167,7 @@
else
return
-/obj/machinery/body_scanconsole/ex_act(severity)
-
- switch(severity)
- if(1.0)
- //SN src = null
- qdel(src)
- return
- if(2.0)
- if (prob(50))
- //SN src = null
- qdel(src)
- return
- else
- return
-
-/obj/machinery/body_scanconsole/power_change()
- ..()
- if(stat & BROKEN)
- icon_state = "body_scannerconsole-p"
- else
- if (stat & NOPOWER)
- spawn(rand(0, 15))
- src.icon_state = "body_scannerconsole-p"
- else
- icon_state = initial(icon_state)
-
+//Body Scan Console
/obj/machinery/body_scanconsole
var/obj/machinery/bodyscanner/connected
var/known_implants = list(/obj/item/weapon/implant/chem, /obj/item/weapon/implant/death_alarm, /obj/item/weapon/implant/loyalty, /obj/item/weapon/implant/tracking)
@@ -216,67 +180,12 @@
density = 0
anchored = 1
circuit = /obj/item/weapon/circuitboard/scanner_console
+ var/printing = null
+ var/printing_text = null
/obj/machinery/body_scanconsole/New()
..()
- spawn( 5 )
- src.connected = locate(/obj/machinery/bodyscanner) in range(2,src)
- return
- return
-
-/*
-
-/obj/machinery/body_scanconsole/process() //not really used right now
- if(stat & (NOPOWER|BROKEN))
- return
- //use_power(250) // power stuff
-
-// var/mob/M //occupant
-// if (!( src.status )) //remove this
-// return
-// if ((src.connected && src.connected.occupant)) //connected & occupant ok
-// M = src.connected.occupant
-// else
-// if (istype(M, /mob))
-// //do stuff
-// else
-/// src.temphtml = "Process terminated due to lack of occupant in scanning chamber."
-// src.status = null
-// src.updateDialog()
-// return
-
-*/
-
-/obj/machinery/body_scanconsole/attack_ai(user as mob)
- return src.attack_hand(user)
-
-/obj/machinery/body_scanconsole/attack_hand(user as mob)
- if(..())
- return
- if(stat & (NOPOWER|BROKEN))
- return
- if(!connected || (connected.stat & (NOPOWER|BROKEN)))
- user << "This console is not connected to a functioning body scanner."
- return
- if(!ishuman(connected.occupant))
- user << "This device can only scan compatible lifeforms."
- return
-
- var/dat
- if (src.delete && src.temphtml) //Window in buffer but its just simple message, so nothing
- src.delete = src.delete
- else if (!src.delete && src.temphtml) //Window in buffer - its a menu, dont add clear message
- dat = text("[]
Main Menu", src.temphtml, src)
- else
- if (src.connected) //Is something connected?
- dat = format_occupant_data(src.connected.get_occupant_data())
- dat += "
[vendorname]
" //display the name, and added a horizontal rule
- if(vendmode == 0)
- dat += "Please choose your laptop customization options
"
- dat += "Your comptuer will automatically be loaded with any programs you can use after the transaction is complete."
- dat += "Some programs will require additional components to be installed!
"
- dat += "HDD (Required) : Added
"
- dat += "Card Reader : Single (50) | Dual (125)
"
- dat += "Floppy Drive: Add (50)
"
- dat += "Radio Network card Add (50)
"
- dat += "Camera Card Add (100)
"
- dat += " Network card Area (75) Adjacent (50)Powernet (25)
"
- dat += "
Power source upgrade Extended (175) Unreal (250)"
- if(vendmode == 0 || vendmode == 1)
- dat += "
Cart
"
- dat += "Total: [total()]
"
- if(cardreader == 1)
- dat += "Card Reader: (single) (50)
"
- else if (cardreader == 2)
- dat += "Card Reader: (double) (125)
"
- else
- dat += "Card Reader: None
"
- if(floppy == 0)
- dat += "Floppy Drive: None
"
- else
- dat += "Floppy Drive: Added (50)
"
- if(radionet == 1)
- dat += "Radio Card: Added (50)
"
- else
- dat += "Radio Card: None
"
- if(camera == 1)
- dat += "Camera Card: Added (100)
"
- else
- dat += "Camera Card: None
"
- if(network == 1)
- dat += "Network card: Area (75)
"
- else if(network == 2)
- dat += "Network card: Adjacent (50)
"
- else if(network == 3)
- dat += "Network card: Powernet (25)
"
- else
- dat += "Network card: None"
- if (power == 0)
- dat += "Power source: Regular"
- else if (power == 1)
- dat += "Power source: Extended (175)
"
- else
- dat += "Power source: Unreal (250)
"
-
- if(vendmode == 0)
- dat += "
Vend Laptop"
-
- if(vendmode == 1)
- dat += "Please swipe your card and enter your PIN to complete the transaction"
-
- if(vendmode == 3)
- dat += "Please swipe your card and enter your PIN to be finish returning your computer
"
- dat += "Cancel"
-
-
-
-
- popup = new(user, "lapvend", name, 450, 500)
- popup.set_content(dat)
- popup.open()
- return
+ var/list/data = list()
+ data["mode"] = vendmode
+ data["cardreader"] = cardreader
+ data["floppy"] = floppy
+ data["radionet"] = radionet
+ data["camera"] = camera
+ data["network"] = network
+ data["power"] = power
+ data["total"] = total()
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "laptop_vendor.tmpl", src.name, 480, 425)
+ ui.set_initial_data(data)
+ ui.open()
+ //ui.set_auto_update(5)
/obj/machinery/lapvend/Topic(href, href_list)
+ if(stat & (BROKEN|NOPOWER))
+ return
+ if(usr.stat || usr.restrained())
+ return
if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))))
usr.set_machine(src)
switch(href_list["choice"])
@@ -146,7 +111,7 @@
if ("super_add")
power = 2
- if ("single_rem" || "dual_rem")
+ if ("cardreader_rem")
cardreader = 0
if ("floppy_rem")
floppy = 0
@@ -154,9 +119,9 @@
radionet = 0
if ("camnet_rem")
camera = 0
- if ("area_rem" || "prox_rem" || "cable_rem")
+ if ("network_rem")
network = 0
- if ("high_rem" || "super_rem")
+ if ("power_rem")
power = 0
if("vend")
@@ -168,9 +133,8 @@
relap = null
vendmode = 0
- src.updateUsrDialog()
- return
-
+ src.add_fingerprint(usr)
+ nanomanager.update_uis(src)
/obj/machinery/lapvend/proc/vend()
if(cardreader > 0)
@@ -253,7 +217,6 @@
choose_progs(C)
vend()
- popup.close()
newlap.close_laptop()
newlap = null
cardreader = 0
diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm
index 4c0d0a755e..1bc0c721c7 100644
--- a/code/modules/holodeck/HolodeckControl.dm
+++ b/code/modules/holodeck/HolodeckControl.dm
@@ -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 += "Holodeck Control System
"
- dat += "
Current Loaded Programs:
"
- for(var/prog in supported_programs)
- dat += "([prog])
"
+ ui_interact(user)
- dat += "
"
- dat += "(Turn Off)
"
+/**
+ * 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 += "
"
- dat += "Please ensure that only holographic weapons are used in the holodeck if a combat simulation has been loaded.
"
+ 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 += "
"
- if(safety_disabled)
- if (emagged)
- dat += "ERROR: Cannot re-enable Safety Protocols.
"
- else
- dat += "(Re-Enable Safety Protocols?)
"
- else
- dat += "(Override Safety Protocols?)
"
-
- dat += "
"
-
- if(safety_disabled)
- for(var/prog in restricted_programs)
- dat += "(Begin [prog])
"
- dat += "Ensure the holodeck is empty before testing.
"
- dat += "
"
- dat += "Safety Protocols are DISABLED
"
+ data["isSilicon"] = 1
else
- dat += "Safety Protocols are ENABLED
"
-
+ data["isSilicon"] = null
+ data["safetyDisabled"] = safety_disabled
+ data["emagged"] = emagged
if(linkedholodeck.has_gravity)
- dat += "Gravity is (ON)
"
+ data["gravity"] = 1
else
- dat += "Gravity is (OFF)
"
-
- 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()
diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm
index 724ccbdd27..8c30f1d486 100644
--- a/code/modules/paperwork/faxmachine.dm
+++ b/code/modules/paperwork/faxmachine.dm
@@ -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
"
+ 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: [scan_name]
"
-
- if(authenticated)
- dat += "{Log Out}"
+ data["scanName"] = null
+ data["bossName"] = boss_name
+ data["authenticated"] = authenticated
+ data["copyItem"] = copyitem
+ if(copyitem)
+ data["copyItemName"] = copyitem.name
else
- dat += "{Log In}"
+ data["copyItemName"] = null
+ data["cooldown"] = sendcooldown
+ data["destination"] = destination
- dat += "
"
-
- if(authenticated)
- dat += "Logged in to: [boss_name] Quantum Entanglement Network
"
-
- if(copyitem)
- dat += "Remove Item
"
-
- if(sendcooldown)
- dat += "Transmitter arrays realigning. Please stand by.
"
-
- else
-
- dat += "Send
"
- dat += "Currently sending: [copyitem.name]
"
- dat += "Sending to: [destination]
"
-
- else
- if(sendcooldown)
- dat += "Please insert paper to send via secure connection.
"
- dat += "Transmitter arrays realigning. Please stand by.
"
- else
- dat += "Please insert paper to send via secure connection.
"
-
- else
- dat += "Proper authentication is required to use this device.
"
-
- if(copyitem)
- dat += "Remove Item
"
-
- 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 << "You take \the [copyitem] out of \the [src]."
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'
\ No newline at end of file
+ C << 'sound/effects/printer.ogg'
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index d122d42c2b..ec0d7acf19 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -30,24 +30,32 @@
/obj/machinery/photocopier/attack_hand(mob/user as mob)
user.set_machine(src)
- var/dat = "Photocopier
"
- if(copyitem)
- dat += "Remove Item
"
- if(toner)
- dat += "Copy
"
- dat += "Printing: [copies] copies."
- dat += "- "
- dat += "+
"
- else if(toner)
- dat += "Please insert something to copy.
"
+ 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 += "Print photo from database
"
- dat += "Current toner level: [toner]"
- if(!toner)
- dat +="
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 << "You take \the [copyitem] out of \the [src]."
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 << "You insert \the [O] into \the [src]."
flick(insert_anim, src)
- updateUsrDialog()
else
user << "There is already something in \the [src]."
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 << "This cartridge is not yet ready for replacement! Use up the rest of the toner."
else if(istype(O, /obj/item/weapon/wrench))
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index 5c4dc8c169..741ba588e4 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -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 += "Chemmaster 3000Chemical infos:
Name:
[A]
Description:
Blood Type: [B]
DNA: [C]
(Back)"
- else
- dat += "Chemmaster 3000Chemical infos:
Name:
[href_list["name"]]
Description:
[href_list["desc"]]
(Back)"
- else
- dat += "Condimaster 3000Condiment infos:
Name:
[href_list["name"]]
Description:
[href_list["desc"]]
(Back)"
- 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 = ""
- for(var/i = 1 to MAX_PILL_SPRITE)
- dat += " |
"
- dat += "
"
- usr << browse(dat, "window=chem_master")
- return
- else if(href_list["change_bottle"])
- var/dat = ""
- for(var/sprite in BOTTLE_SPRITES)
- dat += " |
"
- dat += "
"
- 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.
"
- if(src.loaded_pill_bottle)
- dat += "Eject Pill Bottle \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.storage_slots]\]
"
- else
- dat += "No pill bottle inserted.
"
- dat += "Close"
- else
- var/datum/reagents/R = beaker:reagents
- dat += "Eject beaker and Clear Buffer
"
- if(src.loaded_pill_bottle)
- dat += "Eject Pill Bottle \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.storage_slots]\]
"
- else
- dat += "No pill bottle inserted.
"
- if(!R.total_volume)
- dat += "Beaker is empty."
- else
- dat += "Add to buffer:
"
- for(var/datum/reagent/G in R.reagent_list)
- dat += "[G.name] , [G.volume] Units - "
- dat += "(Analyze) "
- dat += "(1) "
- dat += "(5) "
- dat += "(10) "
- dat += "(30) "
- dat += "(60) "
- dat += "(All) "
- dat += "(Custom)
"
-
- dat += "
Transfer to [(!mode ? "disposal" : "beaker")]:
"
- if(reagents.total_volume)
- for(var/datum/reagent/N in reagents.reagent_list)
- dat += "[N.name] , [N.volume] Units - "
- dat += "(Analyze) "
- dat += "(1) "
- dat += "(5) "
- dat += "(10) "
- dat += "(30) "
- dat += "(60) "
- dat += "(All) "
- dat += "(Custom)
"
- else
- dat += "Empty
"
- if(!condi)
- dat += "
Create pill (60 units max)
"
- dat += "Create multiple pills
"
- dat += "Create bottle (60 units max)
"
- else
- dat += "Create bottle (50 units max)"
- if(!condi)
- user << browse("Chemmaster 3000Chemmaster menu:
[dat]", "window=chem_master;size=575x400")
- else
- user << browse("Condimaster 3000Condimaster menu:
[dat]", "window=chem_master;size=575x400")
- onclose(user, "chem_master")
- return
-
/obj/machinery/chem_master/condimaster
name = "CondiMaster 3000"
condi = 1
diff --git a/html/changelogs/Sin4_UIs.yml b/html/changelogs/Sin4_UIs.yml
new file mode 100644
index 0000000000..87c1907c43
--- /dev/null
+++ b/html/changelogs/Sin4_UIs.yml
@@ -0,0 +1,37 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Sin4
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Added NanoUI for Advanced Body Scanners, Arcade, Atmospherics Control Computer, Chemmaster, Cloning Console, Fax Machines, Guestpass Console, Holodeck Computer, Laptop Vendors, Operating Computer, and Photocopiers."
+ - bugfix: "Fixes chemmaster not putting pills in pill bottles."
\ No newline at end of file
diff --git a/nano/css/icons.css b/nano/css/icons.css
index a6bec0f0d0..b2eacc0ab8 100644
--- a/nano/css/icons.css
+++ b/nano/css/icons.css
@@ -245,6 +245,32 @@
.uiIcon16.icon-note64 { background-image: url(uiIcons64.png); background-position: -64px -64px; width: 64px; height: 64px; }
.uiIcon16.icon-close64 { background-image: url(uiIcons64.png); background-position: -128px -64px; width: 64px; height: 64px; }
+.uiIcon16.icon-pill { background-image: url(pills32.png); width: 32px; height: 32px;}
+.uiIcon16.icon-pill.pill1 { background-position: 0 0; }
+.uiIcon16.icon-pill.pill2 { background-position: -32px 0; }
+.uiIcon16.icon-pill.pill3 { background-position: -64px 0; }
+.uiIcon16.icon-pill.pill4 { background-position: -96px 0; }
+.uiIcon16.icon-pill.pill5 { background-position: -128px 0; }
+.uiIcon16.icon-pill.pill6 { background-position: 0 -32px; }
+.uiIcon16.icon-pill.pill7 { background-position: -32px -32px; }
+.uiIcon16.icon-pill.pill8 { background-position: -64px -32px; }
+.uiIcon16.icon-pill.pill9 { background-position: -96px -32px; }
+.uiIcon16.icon-pill.pill10 { background-position: -128px -32px; }
+.uiIcon16.icon-pill.pill11 { background-position: 0 -64px; }
+.uiIcon16.icon-pill.pill12 { background-position: -32px -64px; }
+.uiIcon16.icon-pill.pill13 { background-position: -64px -64px; }
+.uiIcon16.icon-pill.pill14 { background-position: -96px -64px; }
+.uiIcon16.icon-pill.pill15 { background-position: -128px -64px; }
+.uiIcon16.icon-pill.pill16 { background-position: 0 -96px; }
+.uiIcon16.icon-pill.pill17 { background-position: -32px -96px; }
+.uiIcon16.icon-pill.pill18 { background-position: -64px -96px; }
+.uiIcon16.icon-pill.pill19 { background-position: -96px -96px; }
+.uiIcon16.icon-pill.pill20 { background-position: -128px -96px; }
+.uiIcon16.icon-pill.bottle1 { background-position: 0 -128px; }
+.uiIcon16.icon-pill.bottle2 { background-position: -32px -128px; }
+.uiIcon16.icon-pill.bottle3 { background-position: -64px -128px; }
+.uiIcon16.icon-pill.bottle4 { background-position: -96px -128px; }
+
.mapIcon16 {
position: absolute;
width: 16px;
diff --git a/nano/css/shared.css b/nano/css/shared.css
index a50f96a3c7..8728102b08 100644
--- a/nano/css/shared.css
+++ b/nano/css/shared.css
@@ -45,6 +45,19 @@ hr {
white-space: nowrap;
}
+.link32 {
+ float: left;
+ min-width: 15px;
+ max-width: 31px;
+ height: 31px;
+ text-align: center;
+ text-decoration: none;
+ background: #40628a;
+ border: 1px solid #161616;
+ margin: 0 2px 2px 0;
+ cursor: default;
+}
+
.hasIcon {
padding: 0px 4px 4px 0px;
}
@@ -249,7 +262,7 @@ div.notice {
overflow: auto;
}
-.itemContentNarrow, .itemContent {
+.itemContentNarrow, .itemContent, .itemContentWide, .itemContentSmall, .itemContentMedium {
float: left;
}
@@ -287,17 +300,14 @@ div.notice {
}
.itemContentWide {
- float: left;
width: 79%;
}
.itemContentSmall {
- float: left;
width: 33%;
}
.itemContentMedium {
- float: left;
width: 55%;
}
@@ -649,7 +659,7 @@ th.misc {
}
.oxyloss {
- color: blue;
+ color: #4444FF;
}
/* 75px width used in power monitoring console buttons */
diff --git a/nano/images/pills32.png b/nano/images/pills32.png
new file mode 100644
index 0000000000..61459093c1
Binary files /dev/null and b/nano/images/pills32.png differ
diff --git a/nano/templates/adv_med.tmpl b/nano/templates/adv_med.tmpl
new file mode 100644
index 0000000000..7f7e931caf
--- /dev/null
+++ b/nano/templates/adv_med.tmpl
@@ -0,0 +1,244 @@
+
+{{if !data.occupied}}
+ No occupant detected.
+{{else}}
+ Occupant Data:
+
+
+ Name:
+
+
+ {{:data.occupant.name}}
+
+
+
+
+ Health:
+
+ {{:helper.displayBar(data.occupant.health, 0, 100, (data.occupant.health >= 50) ? 'good' : (data.occupant.health >= 25) ? 'average' : 'bad')}}
+
+ {{:helper.round(data.occupant.health*10)/10}}%
+
+
+
+ Status:
+
+
+ {{if data.occupant.stat==0}}
+ Stable
+ {{else data.occupant.stat==1}}
+ Non-Responsive
+ {{else}}
+ Dead
+ {{/if}}
+
+
+ {{:helper.link('Print', 'document', {'print_p' : 1, 'name' : data.occupant.name})}}
+
Damage:
+
+
+ | Brute: |
+ {{:data.occupant.bruteLoss}} |
+ Brain: |
+ {{:data.occupant.brainLoss}} |
+
+
+ | Burn: |
+ {{:data.occupant.fireLoss}} |
+ Radiation: |
+ {{:data.occupant.radLoss}} |
+
+
+ | Oxygen: |
+ {{:data.occupant.oxyLoss}} |
+ Genetic: |
+ {{:data.occupant.cloneLoss}} |
+
+
+ | Toxins: |
+ {{:data.occupant.toxLoss}} |
+ Paralysis: |
+ {{:data.occupant.paralysis}}% ({{:data.occupant.paralysisSeconds}} seconds left!) |
+
+
+ | Body Temperature: |
+ {{:helper.round(data.occupant.bodyTempC*10)/10}}°C, {{:helper.round(data.occupant.bodyTempF*10)/10}}°F |
+
+
+
+ {{if data.occupant.hasVirus}}
+
+ Viral pathogen detected in blood stream.
+
+ {{/if}}
+ {{if data.occupant.hasBorer}}
+
+ Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended.
+
+ {{/if}}
+ {{if data.occupant.blind}}
+ Pupils unresponsive.
+ {{/if}}
+ {{if data.occupant.nearsighted}}
+ Retinal Misalignment Detected
+ {{/if}}
+ Blood
+
+
+ | Volume: |
+ {{:data.occupant.blood.volume}} |
+ Percent: |
+ {{:data.occupant.blood.percent}}% |
+
+
+ Reagents
+ {{if data.occupant.reagents}}
+
+ {{for data.occupant.reagents}}
+
+ | {{:value.name}}: |
+ {{:value.amount}} |
+
+ {{/for}}
+
+ {{else}}
+ No reagents detected.
+ {{/if}}
+ External Organs
+
+ {{for data.occupant.extOrgan}}
+
+ {{if value.status.destroyed}}
+
+ {{:value.name}} - DESTROYED
+
+ {{else}}
+
+
+ {{if value.status.broken}}
+ {{:value.status.broken}}
+ {{else value.status.splinted}}
+ Splinted
+ {{else value.status.robotic}}
+ Robotic
+ {{/if}}
+
+
+ Brute/Burn
+
+
+ {{:value.bruteLoss}}/{{:value.fireLoss}}
+
+
+ Injuries
+
+
+ {{if !value.status.bleeding}}
+ {{if !value.status.internalBleeding}}
+ No Injuries Detected
+ {{else}}
+
Internal Bleeding Detected
+ {{/if}}
+ {{else}}
+ {{if value.status.internalBleeding}}
+
Internal Bleeding Detected. External Bleeding Detected.
+ {{else}}
+
External Bleeding Detected
+ {{/if}}
+ {{/if}}
+
+ {{if value.germ_level > 100}}
+
+ Infection
+
+
+ {{if value.germ_level < 300}}
+ Mild Infection
+ {{else value.germ_level < 400}}
+ Mild Infection+
+ {{else value.germ_level < 500}}
+ Mild Infection++
+ {{else value.germ_level < 700}}
+ Acute Infection
+ {{else value.germ_level < 800}}
+ Acute Infection+
+ {{else value.germ_level < 900}}
+ Acute Infection++
+ {{else value.germ_level >= 900}}
+ Septic
+ {{/if}}
+
+ {{/if}}
+ {{if value.open}}
+
+ Operation Status
+
+
+ Open Incision
+
+ {{/if}}
+ {{if value.implants_len}}
+
+ Implants
+
+ {{for value.implants :impValue:impindex}}
+
+ {{:impValue.known ? impValue.name : "Unknown"}}
+
+ {{/for}}
+ {{/if}}
+ {{/if}}
+
+ {{/for}}
+
+ Internal Organs
+
+ {{for data.occupant.intOrgan}}
+
+
+ {{:value.name}}
+
+
+ {{:value.desc != null ? value.desc : ""}}
+
+
+
+ {{if value.germ_level > 100}}
+
+ Infection
+
+
+ {{if value.germ_level < 300}}
+ Mild Infection
+ {{else value.germ_level < 400}}
+ Mild Infection+
+ {{else value.germ_level < 500}}
+ Mild Infection++
+ {{else value.germ_level < 700}}
+ Acute Infection
+ {{else value.germ_level < 800}}
+ Acute Infection+
+ {{else value.germ_level < 900}}
+ Acute Infection++
+ {{else value.germ_level >= 900}}
+ Septic
+ {{/if}}
+
+ {{/if}}
+
+ Damage
+
+
+ {{:value.damage}}
+
+
+ {{/for}}
+
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/arcade_battle.tmpl b/nano/templates/arcade_battle.tmpl
new file mode 100644
index 0000000000..7725698634
--- /dev/null
+++ b/nano/templates/arcade_battle.tmpl
@@ -0,0 +1,30 @@
+
+
+{{:data.enemyName}}
+{{if data.gameOver}}
+ {{:data.temp}}
+{{else}}
+ {{:data.temp}}
+ {{:data.enemyAction}}
+{{/if}}
+
+
Health:
+
{{:data.playerHP}}
+
Magic:
+
{{:data.playerMP}}
+
Enemy Health:
+
{{:data.enemyHP}}
+
+
+{{if data.gameOver}}
+ {{:helper.link('New Game', null, {'newgame' : 1})}}
+{{else}}
+
+ {{:helper.link('Attack', null, {'attack' : 1})}}
+ {{:helper.link('Heal', null, {'heal' : 1})}}
+ {{:helper.link('Recharge Power', null, {'charge' : 1})}}
+
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/atmo_control.tmpl b/nano/templates/atmo_control.tmpl
new file mode 100644
index 0000000000..be2f30d482
--- /dev/null
+++ b/nano/templates/atmo_control.tmpl
@@ -0,0 +1,224 @@
+
+{{if data.sensors}}
+ {{for data.sensors}}
+ {{if value.sensor_data}}
+
+
{{:value.long_name}}
+ {{if value.sensor_data.pressure}}
+
+
Pressure:
+
{{:value.sensor_data.pressure}} kPa
+
+ {{/if}}
+ {{if value.sensor_data.temperature}}
+
+
Temperature:
+
{{:value.sensor_data.temperature}} kPa
+
+ {{/if}}
+ {{if value.sensor_data.oxygen || value.sensor_data.nitrogen || value.sensor_data.carbon_dioxide || value.sensor_data.phoron}}
+
+
Gas Composition:
+ {{if value.sensor_data.oxygen}}
+
{{:value.sensor_data.pressure}}% O2
+ {{/if}}
+ {{if value.sensor_data.nitrogen}}
+
{{:value.sensor_data.pressure}}% N
+ {{/if}}
+ {{if value.sensor_data.carbon_dioxide}}
+
{{:value.sensor_data.pressure}}% CO2
+ {{/if}}
+ {{if value.sensor_data.phoron}}
+
{{:value.sensor_data.pressure}}% TX
+ {{/if}}
+
+ {{/if}}
+
+ {{else}}
+
+
{{:value.long_name}} can not be found!
+
+ {{/if}}
+ {{/for}}
+{{else}}
+
+ No sensors connected.
+
+{{/if}}
+
+{{if data.tanks || data.core}}
+
+ {{if data.tanks}}
+ Tank Control System
+ {{else data.core}}
+ Core Cooling Control System
+ {{/if}}
+
+
+ {{if data.input_info}}
+
+
+ {{if data.tanks}}
+ Input:
+ {{else data.core}}
+ Coolant Input:
+ {{/if}}
+
+
+ {{if data.input_info.power}}
+ Injecting
+ {{else}}
+ On Hold
+ {{/if}}
+
+
+
+
Flow Rate Limit:
+
{{:data.input_info.volume_rate}} L/s
+
+
+
Command:
+ {{:helper.link('Toggle Power', 'power', {'in_toggle_injector' : 1})}}
+ {{:helper.link('Set Flow Rate', 'pencil', {'in_set_flowrate' : 1})}}
+ {{:helper.link('Refresh', 'refresh', {'in_refresh_status' : 1})}}
+
+ {{else}}
+
+
ERROR: Can not find input port
+ {{:helper.link('Search', 'search', {'in_refresh_status' : 1})}}
+
+ {{/if}}
+
+
+ Flow Rate Limit:
+
+
+ {{:helper.link('100', 'minus', {'adj_input_flow_rate' : -100})}}
+ {{:helper.link('10', 'minus', {'adj_input_flow_rate' : -10})}}
+ {{:helper.link('1', 'minus', {'adj_input_flow_rate' : -1})}}
+ {{:helper.link('0.1', 'minus', {'adj_input_flow_rate' : -0.1})}}
+
{{:data.input_flow_setting}} L/s
+ {{:helper.link('0.1', 'plus', {'adj_input_flow_rate' : 0.1})}}
+ {{:helper.link('1', 'plus', {'adj_input_flow_rate' : 1})}}
+ {{:helper.link('10', 'plus', {'adj_input_flow_rate' : 10})}}
+ {{:helper.link('100', 'plus', {'adj_input_flow_rate' : 100})}}
+
+
+
+ {{if data.output_info}}
+
+
+ {{if data.tanks}}
+ Output:
+ {{else data.core}}
+ Core Outpump:
+ {{/if}}
+
+
+ {{if data.output_info.power}}
+ Open
+ {{else}}
+ On Hold
+ {{/if}}
+
+
+
+ {{if data.tanks}}
+
Max Output Pressure:
+
{{:data.output_info.output_pressure}} kPa
+ {{else data.core}}
+
Min Core Pressure:
+
{{:data.output_info.pressure_limit}} kPa
+ {{/if}}
+
+
+
Command:
+ {{:helper.link('Toggle Power', 'power', {'out_toggle_power' : 1})}}
+ {{:helper.link('Set Pressure', 'pencil', {'out_set_pressure' : 1})}}
+ {{:helper.link('Refresh', 'refresh', {'out_refresh_status' : 1})}}
+
+ {{else}}
+
+
ERROR: Can not find output port
+ {{:helper.link('Search', 'search', {'out_refresh_status' : 1})}}
+
+ {{/if}}
+
+
+ {{if data.tanks}}
+
+ Max Output Pressure Set:
+
+
+ {{:helper.link('1000', 'minus', {'adj_pressure' : -1000})}}
+ {{:helper.link('100', 'minus', {'adj_pressure' : -100})}}
+ {{:helper.link('10', 'minus', {'adj_pressure' : -10})}}
+ {{:helper.link('1', 'minus', {'adj_pressure' : -1})}}
+
{{:data.pressure_setting}} kPa
+ {{:helper.link('1', 'plus', {'adj_pressure' : 1})}}
+ {{:helper.link('10', 'plus', {'adj_pressure' : 10})}}
+ {{:helper.link('100', 'plus', {'adj_pressure' : 100})}}
+ {{:helper.link('1000', 'plus', {'adj_pressure' : 1000})}}
+
+ {{else data.core}}
+
+ Min Core Pressure Set:
+
+
+ {{:helper.link('100', 'minus', {'adj_pressure' : -100})}}
+ {{:helper.link('50', 'minus', {'adj_pressure' : -50})}}
+ {{:helper.link('10', 'minus', {'adj_pressure' : -10})}}
+ {{:helper.link('1', 'minus', {'adj_pressure' : -1})}}
+
{{:data.pressure_setting}} kPa
+ {{:helper.link('1', 'plus', {'adj_pressure' : 1})}}
+ {{:helper.link('10', 'plus', {'adj_pressure' : 10})}}
+ {{:helper.link('50', 'plus', {'adj_pressure' : 50})}}
+ {{:helper.link('100', 'plus', {'adj_pressure' : 100})}}
+
+ {{/if}}
+
+{{/if}}
+
+{{if data.fuel}}
+ Fuel Injection System
+
+ {{if data.device_info}}
+
+
+ Status:
+
+
+ {{if data.device_info.power}}
+ Injecting
+ {{else}}
+ On Hold
+ {{/if}}
+
{{:helper.link('Refresh', 'refresh', {'refresh_status' : 1})}}
+
+
+
+
Rate:
+
{{:data.device_info.volume_rate}} L/s
+
+
+
Automated Fuel Injection:
+ {{if data.automation}}
+ {{:helper.link('Engaged', 'check', {'toggle_automation' : 1})}}
+
Injector Controls Locked Out
+ {{else}}
+ {{:helper.link('Disengaged', 'close', {'toggle_automation' : 1})}}
+
Injector:
+ {{:helper.link('Toggle Power', 'power', {'toggle_injector' : 1})}}
+ {{:helper.link('Inject (1 Cycle)', 'syringe', {'injection' : 1})}}
+ {{/if}}
+
+ {{else}}
+
+
ERROR: Can not find device
+ {{:helper.link('Search', 'search', {'refresh_status' : 1})}}
+
+ {{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/chem_master.tmpl b/nano/templates/chem_master.tmpl
new file mode 100644
index 0000000000..1b8315154a
--- /dev/null
+++ b/nano/templates/chem_master.tmpl
@@ -0,0 +1,116 @@
+
+{{if data.tab == 'home'}}
+
+
{{:helper.link(data.pillBottle ? 'Eject Pill Bottle' : 'No pill bottle inserted', 'eject', {'ejectp' : 1}, data.pillBottle ? null : 'linkOff')}}
+
+ {{if data.pillBottle}}
+
{{:data.pillBottle.total}} / {{:data.pillBottle.max}}
+ {{/if}}
+
+ {{:helper.link(data.beaker ? 'Eject Beaker and Clear Buffer' : 'Please insert beaker', 'eject', {'eject' : 1}, data.beaker ? null : 'linkOff')}}
+
+ {{if data.beaker}}
+ {{if data.beaker.total_volume}}
+ Add to buffer:
+ {{for data.beaker.reagent_list}}
+
+
{{:value.name}}
+
{{:value.volume}} Units
+
+
+ {{:helper.link('Analyze', 'signal-diag', {'tab_select' : 'analyze', 'desc' : value.description, 'name' : value.name})}}
+ {{:helper.link('1', 'plus', {'add' : value.id, 'amount' : 1})}}
+ {{:helper.link('5', 'plus', {'add' : value.id, 'amount' : 5})}}
+ {{:helper.link('10', 'plus', {'add' : value.id, 'amount' : 10})}}
+ {{:helper.link('30', 'plus', {'add' : value.id, 'amount' : 30})}}
+ {{:helper.link('60', 'plus', {'add' : value.id, 'amount' : 60})}}
+ {{:helper.link('All', 'plus', {'add' : value.id, 'amount' : value.volume})}}
+ {{:helper.link('Custom', 'plus', {'addcustom' : value.id})}}
+
+ {{/for}}
+ {{else}}
+ Beaker is empty.
+ {{/if}}
+
+
+
Transfer to
+ {{:helper.link(!data.mode ? 'disposal' : 'beaker', null, {'toggle' : 1})}}
+
+ {{if data.reagents}}
+ {{if data.reagents.total_volume}}
+ {{for data.reagents.reagent_list}}
+
+
{{:value.name}}
+
{{:value.volume}} Units
+
+
+ {{:helper.link('Analyze', 'signal-diag', {'tab_select' : 'analyze', 'desc' : value.description, 'name' : value.name})}}
+ {{:helper.link('1', 'minus', {'remove' : value.id, 'amount' : 1})}}
+ {{:helper.link('5', 'minus', {'remove' : value.id, 'amount' : 5})}}
+ {{:helper.link('10', 'minus', {'remove' : value.id, 'amount' : 10})}}
+ {{:helper.link('30', 'minus', {'remove' : value.id, 'amount' : 30})}}
+ {{:helper.link('60', 'minus', {'remove' : value.id, 'amount' : 60})}}
+ {{:helper.link('All', 'minus', {'remove' : value.id, 'amount' : value.volume})}}
+ {{:helper.link('Custom', 'minus', {'removecustom' : value.id})}}
+
+ {{/for}}
+ {{/if}}
+ {{else}}
+ Empty
+ {{/if}}
+ {{if !data.condi}}
+
+
+ {{:helper.link('Create pill (60 units max)', null, {'createpill' : 1})}}
+ {{:helper.link('Create multiple pills', null, {'createpill_multiple' : 1})}}
+ {{:helper.link('Create bottle (60 units max)', null, {'createbottle' : 1})}}
+
+
+ {{:helper.link('', 'pill pill' + data.pillSprite, {'tab_select' : 'pill'}, null, 'link32')}}
+ {{:helper.link('', 'pill bottle' + data.bottleSprite, {'tab_select' : 'bottle'}, null, 'link32')}}
+
+ {{/if}}
+ {{/if}}
+
+{{else data.tab == 'analyze'}}
+ {{if !data.condi}}
+ Chemical Info:
+ {{else}}
+ Condiment Info:
+ {{/if}}
+
+
Name:
+
{{:data.analyzeData.name}}
+
+ {{if data.analyzeData.name == 'Blood'}}
+
+
Blood Type:
+
{{:data.analyzeData.blood_type}}
+
+
+
DNA:
+
{{:data.analyzeData.blood_DNA}}
+
+ {{else}}
+
+
Description:
+
{{:data.analyzeData.desc}}
+
+ {{/if}}
+ {{:helper.link('Back', 'arrowreturn-1-w', {'tab_select' : 'home'})}}
+
+{{else data.tab == 'pill'}}
+ {{for data.pillSpritesAmount}}
+ {{:helper.link('', 'pill pill' + value, {'pill_sprite' : value}, null, data.pillSprite == value ? 'linkOn link32' : 'link32')}}
+ {{/for}}
+
{{:helper.link('Return', 'arrowreturn-1-w', {'tab_select' : 'home'})}}
+
+{{else data.tab == 'bottle'}}
+ {{for data.bottleSpritesAmount}}
+ {{:helper.link('', 'pill bottle' + value, {'bottle_sprite' : value}, null, data.bottleSprite == value ? 'linkOn link32' : 'link32')}}
+ {{/for}}
+
{{:helper.link('Return', 'arrowreturn-1-w', {'tab_select' : 'home'})}}
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/cloning.tmpl b/nano/templates/cloning.tmpl
new file mode 100644
index 0000000000..a927fcc4d9
--- /dev/null
+++ b/nano/templates/cloning.tmpl
@@ -0,0 +1,104 @@
+
+
+{{:data.temp}}
+
+{{if data.menu == 1}}
+
+ Modules
+
+ {{if data.connected}}
+ DNA scanner found.
+ {{else}}
+ DNA scanner not found.
+ {{/if}}
+
+
+ {{if data.podsLen > 0}}
+ {{:data.podsLen}} cloning vat\s found.
+ {{else}}
+ No cloning vats found.
+ {{/if}}
+
+
+
+ Scanner Functions
+
+ {{if data.loading}}
+ Scanning...
+ {{else}}
+ {{:data.scantemp}}
+ {{/if}}
+
+
+ {{if data.connected}}
+
+ {{:helper.link(data.occupant ? 'Scan - ' + data.occupant : 'Scanner unoccupied', 'play', {'scan' : 1}, data.occupant ? null : 'linkOff')}}
+
+
+ {{:helper.link(data.locked ? 'Unlock' : 'Lock', data.locked ? 'locked' : 'unlocked', {'lock' : 1}, null, data.locked ? 'redButton' : null)}}
+
+
+ {{:helper.link('Eject', 'eject', {'eject' : 1}, data.occupant ? null : 'linkOff')}}
+
+ {{else}}
+ No scanner connected!
+ {{/if}}
+
+
+ {{if data.podsLen}}
+ {{for data.pods}}
+ {{:value.pod}}, biomass: {{:value.biomass}}
+ {{/for}}
+ {{/if}}
+
+
+ Database Functions
+
+ {{:helper.link('View Records', 'list', {'menu' : 2})}}
+ {{:helper.link('Eject Disk', 'eject', {'disk' : 'eject'}, data.diskette ? null : 'linkOff')}}
+
+
+{{else data.menu == 2}}
+ Current records
+ {{:helper.link('Back', 'arrowreturn-1-w', {'menu' : 1})}}
+
+ {{for data.records}}
+ {{:helper.link(value.name, 'document', {'view_rec' : value.ckey})}}
+ {{/for}}
+
+
+{{else data.menu == 3}}
+ Selected Record
+ {{:helper.link('Back', 'arrowreturn-1-w', {'menu' : 2})}}
+
+ {{if data.activeRecord}}
+ {{:helper.link('Delete Record', 'trash', {'del_rec' : 1}, null, 'redButton')}}
+
+
Name:
+
{{:data.activeRecord.real_name}}
+
+
+ {{:helper.link('Load from disk', 'transfer-e-w', {'disk' : 'load'}, data.disk ? null : 'linkOff')}}
+
+
+
Save:
+ {{:helper.link('UI + UE', 'disk', {'save_disk' : 'ue'}, data.disk ? null : 'linkOff')}}
+ {{:helper.link('UI', 'disk', {'save_disk' : 'ui'}, data.disk ? null : 'linkOff')}}
+ {{:helper.link('SE', 'disk', {'save_disk' : 'se'}, data.disk ? null : 'linkOff')}}
+
+
+ {{:helper.link('Clone', 'play', {'clone' : data.activeRecord.ckey}, data.podsLen ? null : 'linkOff')}}
+
+ {{else}}
+ ERROR: Record not found.
+ {{/if}}
+
+{{else data.menu == 4}}
+ {{:data.temp}}
+ Confirm Record Deletion
+ Scan card to confirm.
+ {{:helper.link('Cancel', 'cancel', {'menu' : 3})}}
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/fax.tmpl b/nano/templates/fax.tmpl
new file mode 100644
index 0000000000..4745a7aeb3
--- /dev/null
+++ b/nano/templates/fax.tmpl
@@ -0,0 +1,55 @@
+
+
+
+
+ Confirm Identity:
+
+ {{:helper.link(data.scanName ? data.scanName : 'Insert Card', 'check', {'scan' : 1})}}
+ {{if data.authenticated}}
+ {{:helper.link('Log Out', 'eject', {'logout' : 1}, null, 'redButton')}}
+ {{else}}
+ {{:helper.link('Log In', 'person', {'auth' : 1}, data.scanName ? null : 'linkOff')}}
+ {{/if}}
+
+{{if data.authenticated}}
+
+
+
+
+
+ Logged in to:
+
+
+ {{:data.bossName}} Quantum Entanglement Network
+
+
+ {{if data.copyItem}}
+ {{if data.cooldown}}
+ Transmitter arrays realigning. Please stand by.
+ {{else}}
+
+
Currently sending:
+
{{:data.copyItemName}}
+
+
+
Sending to:
+ {{:helper.link(data.destination, 'tag', {'dept' : 1})}}
+
+ {{:helper.link('Send', 'signal-diag', {'send' : 1})}}
+ {{/if}}
+ {{else}}
+ Please insert paper to send via secure connection.
+ {{if data.cooldown}}
+ Transmitter arrays realigning. Please stand by.
+ {{/if}}
+ {{/if}}
+{{else}}
+ Proper authentication is required to use this device.
+{{/if}}
+{{if data.copyItem}}
+ {{:helper.link('Remove Item', 'eject', {'remove' : 1})}}
+{{/if}}
+
diff --git a/nano/templates/guest_pass.tmpl b/nano/templates/guest_pass.tmpl
new file mode 100644
index 0000000000..80525f5331
--- /dev/null
+++ b/nano/templates/guest_pass.tmpl
@@ -0,0 +1,59 @@
+
+
+{{if data.mode == 1}}
+
+
+ Activity Log
+
+ {{:helper.link('Print', 'print', {'print' : 1})}} {{:helper.link('Back', 'arrowreturn-1-w', {'mode' : 0})}}
+
+
+ {{for data.log}}
+
+ {{:value}}
+
+ {{/for}}
+{{else}}
+ Guest pass terminal #{{:data.uid}}
+
+ {{:helper.link('View activity log', 'list', {'mode' : 1})}} {{:helper.link('Issure Pass', 'eject', {'action' : 'issue'})}}
+
+
+
+
+ Issuing ID:
+
+ {{:helper.link(data.giver ? data.giver : 'Insert ID', 'person', {'action' : 'id'})}}
+
+
+
+ Issued to:
+
+ {{:helper.link(data.giveName, 'pencil', {'choice' : 'giv_name'})}}
+
+
+
+ Reason:
+
+ {{:helper.link(data.reason, 'pencil', {'choice' : 'reason'})}}
+
+
+
+ Duration (minutes):
+
+ {{:helper.link(data.duration, 'clock', {'choice' : 'duration'})}}
+
+
+ {{for data.area}}
+
+ {{:helper.link(value.area_name, value.on ? 'check' : 'close', {'choice' : 'access', 'access' : value.area}, null, value.on ? 'linkOn' : null)}}
+
+ {{/for}}
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/holodeck.tmpl b/nano/templates/holodeck.tmpl
new file mode 100644
index 0000000000..71d4ad5605
--- /dev/null
+++ b/nano/templates/holodeck.tmpl
@@ -0,0 +1,36 @@
+
+
+Current Loaded Programs:
+{{for data.supportedPrograms}}
+ {{:helper.link(value.name, data.currentProgram == value.program ? 'check' : 'close', {'program' : value.program}, null, data.currentProgram == value.program ? 'linkOn' : null)}}
+{{/for}}
+Please ensure that only holographic weapons are used in the holodeck if a combat simulation has been loaded.
+{{if data.isSilicon}}
+ {{if data.safetyDisabled}}
+ {{if data.emagged}}
+ ERROR: Cannot re-enable Safety Protocols.
+ {{else}}
+ {{:helper.link('Re-Enable Safety Protocols?', 'help', {'AIoverride' : 1}, null, 'linkOn')}}
+ {{/if}}
+ {{else}}
+ {{:helper.link('Re-Enable Safety Protocols?', 'help', {'AIoverride' : 1}, null, 'redButton')}}
+ {{/if}}
+{{/if}}
+
+{{if data.safetyDisabled}}
+ {{for data.restrictedPrograms}}
+ {{:helper.link('Begin ' + value.name, data.currentProgram == value.program ? 'check' : 'close', {'program' : value.program}, null, data.currentProgram == value.program ? 'linkOn' : null)}}
+ {{/for}}
+ Ensure the holodeck is empty before testing.
+ Safety Protocols are DISABLED
+{{else}}
+ Safety Protocols are ENABLED
+{{/if}}
+
+
+
Gravity:
+ {{:helper.link(data.gravity ? 'On ' : 'Off', data.gravity ? 'check' : 'close', {'gravity' : 1}, null, data.gravity ? 'linkOn' : 'redButton')}}
+
\ No newline at end of file
diff --git a/nano/templates/laptop_vendor.tmpl b/nano/templates/laptop_vendor.tmpl
new file mode 100644
index 0000000000..e0de4f7272
--- /dev/null
+++ b/nano/templates/laptop_vendor.tmpl
@@ -0,0 +1,173 @@
+
+
+{{if data.mode == 0}}
+
+ Please choose your laptop customization options.
+ Your comptuer will automatically be loaded with any programs you can use after the transaction is complete.
+ Some programs will require additional components to be installed!
+
+
+
+
+
+
HDD (Required):
+
Added
+
+
+
+
+ Card Reader:
+
+ {{:helper.link('Single (50)', data.cardreader == 1 ? 'check' : 'plus', {'choice' : 'single_add'}, data.cardreader == 1 ? 'selected' : null)}}
+ {{:helper.link('Dual (125)', data.cardreader == 2 ? 'check' : 'plus', {'choice' : 'dual_add'}, data.cardreader == 2 ? 'selected' : null)}}
+ {{:helper.link('None', 'close', {'choice' : 'cardreader_rem'}, data.cardreader == 0 ? 'redButton' : null)}}
+
+
+
+
+ Floppy Drive:
+
+ {{:helper.link('Add (50)', data.floppy == 1 ? 'check' : 'plus', {'choice' : 'floppy_add'}, data.floppy == 1 ? 'selected' : null)}}
+ {{:helper.link('None', 'close', {'choice' : 'floppy_rem'}, data.floppy == 0 ? 'redButton' : null)}}
+
+
+
+
+ Radio card:
+
+ {{:helper.link('Add (50)', data.radionet == 1 ? 'check' : 'plus', {'choice' : 'radio_add'}, data.radionet == 1 ? 'selected' : null)}}
+ {{:helper.link('None', 'close', {'choice' : 'radio_rem'}, data.radionet == 0 ? 'redButton' : null)}}
+
+
+
+
+ Camera Card:
+
+ {{:helper.link('Add (100)', data.camera == 1 ? 'check' : 'plus', {'choice' : 'camnet_add'}, data.camera == 1 ? 'selected' : null)}}
+ {{:helper.link('None', 'close', {'choice' : 'camnet_rem'}, data.camera == 0 ? 'redButton' : null)}}
+
+
+
+
+ Network card:
+
+
+ {{:helper.link('Area (75)', data.network == 1 ? 'check' : 'plus', {'choice' : 'area_add'}, data.network == 1 ? 'selected' : null)}}
+ {{:helper.link('Adjacent (50)', data.network == 2 ? 'check' : 'plus', {'choice' : 'prox_add'}, data.network == 2 ? 'selected' : null)}}
+ {{:helper.link('Powernet (25)', data.network == 3 ? 'check' : 'plus', {'choice' : 'cable_add'}, data.network == 3 ? 'selected' : null)}}
+ {{:helper.link('None', 'close', {'choice' : 'network_rem'}, data.network == 0 ? 'redButton' : null)}}
+
+
+
+
+
+
+
+ Power Source:
+
+ {{:helper.link('Extended (175)', data.power == 1 ? 'check' : 'plus', {'choice' : 'high_add'}, data.power == 1 ? 'selected' : null)}}
+ {{:helper.link('Unreal (250)', data.power == 2 ? 'check' : 'plus', {'choice' : 'super_add'}, data.power == 2 ? 'selected' : null)}}
+ {{:helper.link('Default', data.power == 0 ? 'check' : 'plus', {'choice' : 'power_rem'}, data.power == 0 ? 'selected' : null)}}
+
+
+
+
+
Total:
+
{{:data.total}}
+ {{:helper.link('Vend Laptop', 'cart', {'choice' : 'vend'})}}
+
+
+{{else data.mode == 1}}
+ Cart
+
+
+
+
+
Total:
+
{{:data.total}}
+
+
+
+
Card Reader:
+ {{if data.cardreader == 1}}
+ {{:helper.link('(single) (50)', 'close', {'choice' : 'cardreader_rem'})}}
+ {{else data.cardreader == 2}}
+ {{:helper.link('(double) (125)', 'close', {'choice' : 'cardreader_rem'})}}
+ {{else}}
+
None
+ {{/if}}
+
+
+
+
Floppy Drive:
+ {{if data.floppy == 1}}
+ {{:helper.link('Added (50)', 'close', {'choice' : 'floppy_rem'})}}
+ {{else}}
+
None
+ {{/if}}
+
+
+
+
Radio Card:
+ {{if data.radionet == 1}}
+ {{:helper.link('Added (50)', 'close', {'choice' : 'radio_rem'})}}
+ {{else}}
+
None
+ {{/if}}
+
+
+
+
Camera Card:
+ {{if data.camera == 1}}
+ {{:helper.link('Added (100)', 'close', {'choice' : 'camnet_rem'})}}
+ {{else}}
+
None
+ {{/if}}
+
+
+
+
Network Card:
+ {{if data.network == 1}}
+ {{:helper.link('Area (75)', 'close', {'choice' : 'network_rem'})}}
+ {{else data.network == 2}}
+ {{:helper.link('Adjacent (50)', 'close', {'choice' : 'network_rem'})}}
+ {{else data.network == 3}}
+ {{:helper.link('Powernet (25)', 'close', {'choice' : 'network_rem'})}}
+ {{else}}
+
None
+ {{/if}}
+
+
+
+
Power Source:
+ {{if data.power == 1}}
+ {{:helper.link('Unreal (250)', 'close', {'choice' : 'power_rem'})}}
+ {{else data.power == 2}}
+ {{:helper.link('Extended (175)', 'close', {'choice' : 'power_rem'})}}
+ {{else}}
+
Regular
+ {{/if}}
+
+
+
+
+
+
Please swipe your card and enter your PIN to complete the transaction
+
+
+
+
+ {{:helper.link('Cancel', 'close', {'choice' : 'cancel'}, null, 'redButton')}}
+
+{{else data.mode == 2}}
+
+ Please swipe your card and enter your PIN to finish returning your computer.
+
+
+
+ {{:helper.link('Cancel', 'close', {'choice' : 'cancel'}, null, 'redButton')}}
+
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/operating.tmpl b/nano/templates/operating.tmpl
new file mode 100644
index 0000000000..c53bd94c65
--- /dev/null
+++ b/nano/templates/operating.tmpl
@@ -0,0 +1,47 @@
+
+
+{{if data.table}}
+ Patient Information:
+ {{if data.victim}}
+
+
Name:
+
{{:data.victim.real_name}}
+
+
Age:
+
{{:data.victim.age}}
+
+
Blood Type:
+
{{:data.victim.b_type}}
+
+
+
+
Health:
+
{{:data.victim.health}}
+
+
Brute Damage:
+
{{:data.victim.brute}}
+
+
Toxins Damage:
+
{{:data.victim.tox}}
+
+
Fire Damage:
+
{{:data.victim.burn}}
+
+
Suffocation Damage:
+
{{:data.victim.oxy}}
+
+
Patient Status:
+
{{:data.victim.stat}}
+
+
Heartbeat Rate:
+
{{:data.victim.pulse}}
+
+ {{else}}
+ No Patient Detected
+ {{/if}}
+{{else}}
+ No Table Detected
+{{/if}}
diff --git a/nano/templates/photocopier.tmpl b/nano/templates/photocopier.tmpl
new file mode 100644
index 0000000000..9c9910e969
--- /dev/null
+++ b/nano/templates/photocopier.tmpl
@@ -0,0 +1,47 @@
+
+
+{{if data.copyItem}}
+
+ {{:helper.link('Remove Item', 'eject', {'remove' : 1})}}
+ {{if data.toner}}
+ {{:helper.link('Copy', 'copy', {'copy' : 1})}}
+
+
+
+ Printing:
+
+
+
+ {{:helper.link('-', null, {'min' : 1}, data.copies == 1 ? 'linkOff' : null)}}
+
{{:data.copies}}
+ {{:helper.link('+', null, {'add' : 1}, data.copies == data.maxCopies ? 'linkOff' : null)}}
+
+
+
+
+
+
Current toner level:
+
{{:data.toner}}u
+
+ {{else}}
+
+ Please insert a new toner cartridge!
+
+ {{/if}}
+{{else data.toner}}
+ Please insert something to copy.
+ {{if data.isSilicon}}
+ {{:helper.link('Print photo from database', 'image', {'aipic' : 1})}}
+ {{/if}}
+
+
Current toner level:
+
{{:data.toner}}u
+
+{{else}}
+
+ Please insert a new toner cartridge!
+
+{{/if}}
\ No newline at end of file