Deprecation of DNA Modifier UI, AME, misc NanoUI templates, and _old spritefiles. (#22320)

Lead-up to final push on NanoUI conversion; AME was removed (w approval
from Matt), DNA modifier will not be converted to Nano at this time, a
heap of templates and associated unused sprite files also removed.
This commit is contained in:
Batrachophreno
2026-04-26 19:55:31 +00:00
committed by GitHub
parent 35cb04c48e
commit fffc406aae
40 changed files with 15 additions and 4663 deletions
-3
View File
@@ -3412,9 +3412,6 @@
#include "code\modules\power\terminal.dm"
#include "code\modules\power\tracker.dm"
#include "code\modules\power\turbine.dm"
#include "code\modules\power\antimatter\containment_jar.dm"
#include "code\modules\power\antimatter\control.dm"
#include "code\modules\power\antimatter\shielding.dm"
#include "code\modules\power\fusion\fusion_circuits.dm"
#include "code\modules\power\fusion\fusion_particle_catcher.dm"
#include "code\modules\power\fusion\fusion_reactions.dm"
+7 -490
View File
@@ -325,499 +325,16 @@
if(!ai_can_interact(user))
return
src.add_hiddenprint(user)
ui_interact(user)
// DNA Modifier is currently deprecated (old NanoUI code)
to_chat(user, SPAN_WARNING("The firmware on this thing is so hopelessly out of date as to render it unusable. Dang."))
return
// ui_interact(user)
/obj/machinery/computer/scan_consolenew/attack_hand(user as mob)
if(!..())
ui_interact(user)
/**
* The ui_interact proc is used to open and update Nano UIs
* If ui_interact is not used then the UI will not update correctly
* ui_interact is currently defined for /atom/movable (which is inherited by /obj and /mob)
*
* @param user /mob The mob who is interacting with this ui
* @param ui_key string A string key to use for this ui. Allows for multiple unique uis on one obj/mob (defaut value "main")
* @param ui /datum/nanoui This parameter is passed by the nanoui process() proc when updating an open ui
*
* @return nothing
*/
/obj/machinery/computer/scan_consolenew/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
if (!connected)
// DNA Modifier is currently deprecated (old NanoUI code)
to_chat(user, SPAN_WARNING("The firmware on this thing is so hopelessly out of date as to render it unusable. Dang."))
return
if(user == connected.occupant || user.stat)
return
// this is the data which will be sent to the ui
var/data[0]
data["selectedMenuKey"] = selected_menu_key
data["locked"] = src.connected.locked
data["hasOccupant"] = connected.occupant ? 1 : 0
data["isInjectorReady"] = injector_ready
data["hasDisk"] = disk ? 1 : 0
var/diskData[0]
if (!disk || !disk.buf)
diskData["data"] = null
diskData["owner"] = null
diskData["label"] = null
diskData["type"] = null
diskData["ue"] = null
else
diskData = disk.buf.GetData()
data["disk"] = diskData
var/list/new_buffers = list()
for(var/datum/dna2/record/buf in src.buffers)
new_buffers += list(buf.GetData())
data["buffers"]=new_buffers
data["radiationIntensity"] = radiation_intensity
data["radiationDuration"] = radiation_duration
data["irradiating"] = irradiating
data["dnaBlockSize"] = DNA_BLOCK_SIZE
data["selectedUIBlock"] = selected_ui_block
data["selectedUISubBlock"] = selected_ui_subblock
data["selectedSEBlock"] = selected_se_block
data["selectedSESubBlock"] = selected_se_subblock
data["selectedUITarget"] = selected_ui_target
data["selectedUITargetHex"] = selected_ui_target_hex
var/occupantData[0]
if (!src.connected.occupant || !src.connected.occupant.dna)
occupantData["name"] = null
occupantData["stat"] = null
occupantData["isViableSubject"] = null
occupantData["health"] = null
occupantData["maxhealth"] = null
occupantData["minHealth"] = null
occupantData["uniqueEnzymes"] = null
occupantData["uniqueIdentity"] = null
occupantData["structuralEnzymes"] = null
occupantData["radiationLevel"] = null
else
occupantData["name"] = connected.occupant.real_name
occupantData["stat"] = connected.occupant.stat
occupantData["isViableSubject"] = 1
if ((connected.occupant.mutations & NOCLONE) || !src.connected.occupant.dna)
occupantData["isViableSubject"] = 0
occupantData["health"] = connected.occupant.health
occupantData["maxhealth"] = connected.occupant.maxhealth
occupantData["minHealth"] = connected.occupant.species.total_health
occupantData["uniqueEnzymes"] = connected.occupant.dna.unique_enzymes
occupantData["uniqueIdentity"] = connected.occupant.dna.uni_identity
occupantData["structuralEnzymes"] = connected.occupant.dna.struc_enzymes
occupantData["radiationLevel"] = connected.occupant.total_radiation
data["occupant"] = occupantData;
data["isBeakerLoaded"] = connected.beaker ? 1 : 0
data["beakerLabel"] = null
data["beakerVolume"] = 0
if(connected.beaker)
data["beakerLabel"] = connected.beaker.label_text ? connected.beaker.label_text : null
for(var/_R in connected.beaker.reagents.reagent_volumes)
data["beakerVolume"] += connected.beaker.reagents.reagent_volumes[_R]
// update the ui if it exists, returns null if no ui is passed/found
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "dna_modifier.tmpl", "DNA Modifier Console", 660, 700)
// when the ui is first opened this is the data it will use
ui.set_initial_data(data)
// open the new ui window
ui.open()
// auto update every Master Controller tick
ui.set_auto_update(1)
/obj/machinery/computer/scan_consolenew/Topic(href, href_list)
if(..())
return 0 // don't update uis
if(!istype(usr.loc, /turf))
return 0 // don't update uis
if(!src || !src.connected)
return 0 // don't update uis
if(irradiating) // Make sure that it isn't already irradiating someone...
return 0 // don't update uis
add_fingerprint(usr)
if (href_list["selectMenuKey"])
selected_menu_key = href_list["selectMenuKey"]
return 1 // return 1 forces an update to all Nano uis attached to src
if (href_list["toggleLock"])
if ((src.connected && src.connected.occupant))
src.connected.locked = !( src.connected.locked )
return 1 // return 1 forces an update to all Nano uis attached to src
if (href_list["pulseRadiation"])
irradiating = src.radiation_duration
var/lock_state = src.connected.locked
src.connected.locked = 1//lock it
SSnanoui.update_uis(src) // update all UIs attached to src
sleep(10*src.radiation_duration) // sleep for radiation_duration seconds
irradiating = 0
if (!src.connected.occupant)
return 1 // return 1 forces an update to all Nano uis attached to src
if (prob(95))
if(prob(75))
randmutb(src.connected.occupant)
else
randmuti(src.connected.occupant)
else
if(prob(95))
randmutg(src.connected.occupant)
else
randmuti(src.connected.occupant)
src.connected.occupant.apply_damage(((src.radiation_intensity*3)+src.radiation_duration*3), DAMAGE_RADIATION, damage_flags = DAMAGE_FLAG_DISPERSED)
src.connected.locked = lock_state
return 1 // return 1 forces an update to all Nano uis attached to src
if (href_list["radiationDuration"])
if (text2num(href_list["radiationDuration"]) > 0)
if (src.radiation_duration < 20)
src.radiation_duration += 2
else
if (src.radiation_duration > 2)
src.radiation_duration -= 2
return 1 // return 1 forces an update to all Nano uis attached to src
if (href_list["radiationIntensity"])
if (text2num(href_list["radiationIntensity"]) > 0)
if (src.radiation_intensity < 10)
src.radiation_intensity++
else
if (src.radiation_intensity > 1)
src.radiation_intensity--
return 1 // return 1 forces an update to all Nano uis attached to src
////////////////////////////////////////////////////////
if (href_list["changeUITarget"] && text2num(href_list["changeUITarget"]) > 0)
if (src.selected_ui_target < 15)
src.selected_ui_target++
src.selected_ui_target_hex = src.selected_ui_target
switch(selected_ui_target)
if(10)
src.selected_ui_target_hex = "A"
if(11)
src.selected_ui_target_hex = "B"
if(12)
src.selected_ui_target_hex = "C"
if(13)
src.selected_ui_target_hex = "D"
if(14)
src.selected_ui_target_hex = "E"
if(15)
src.selected_ui_target_hex = "F"
else
src.selected_ui_target = 0
src.selected_ui_target_hex = 0
return 1 // return 1 forces an update to all Nano uis attached to src
if (href_list["changeUITarget"] && text2num(href_list["changeUITarget"]) < 1)
if (src.selected_ui_target > 0)
src.selected_ui_target--
src.selected_ui_target_hex = src.selected_ui_target
switch(selected_ui_target)
if(10)
src.selected_ui_target_hex = "A"
if(11)
src.selected_ui_target_hex = "B"
if(12)
src.selected_ui_target_hex = "C"
if(13)
src.selected_ui_target_hex = "D"
if(14)
src.selected_ui_target_hex = "E"
else
src.selected_ui_target = 15
src.selected_ui_target_hex = "F"
return 1 // return 1 forces an update to all Nano uis attached to src
if (href_list["selectUIBlock"] && href_list["selectUISubblock"]) // This chunk of code updates selected block / sub-block based on click
var/select_block = text2num(href_list["selectUIBlock"])
var/select_subblock = text2num(href_list["selectUISubblock"])
if ((select_block <= DNA_UI_LENGTH) && (select_block >= 1))
src.selected_ui_block = select_block
if ((select_subblock <= DNA_BLOCK_SIZE) && (select_subblock >= 1))
src.selected_ui_subblock = select_subblock
return 1 // return 1 forces an update to all Nano uis attached to src
if (href_list["pulseUIRadiation"])
var/block = src.connected.occupant.dna.GetUISubBlock(src.selected_ui_block,src.selected_ui_subblock)
irradiating = src.radiation_duration
var/lock_state = src.connected.locked
src.connected.locked = 1//lock it
SSnanoui.update_uis(src) // update all UIs attached to src
sleep(10*src.radiation_duration) // sleep for radiation_duration seconds
irradiating = 0
if (!src.connected.occupant)
return 1
if (prob((80 + (src.radiation_duration / 2))))
block = miniscrambletarget(num2text(selected_ui_target), src.radiation_intensity, src.radiation_duration)
src.connected.occupant.dna.SetUISubBlock(src.selected_ui_block,src.selected_ui_subblock,block)
src.connected.occupant.UpdateAppearance()
src.connected.occupant.apply_damage((src.radiation_intensity+src.radiation_duration), DAMAGE_RADIATION, damage_flags = DAMAGE_FLAG_DISPERSED)
else
if (prob(20+src.radiation_intensity))
randmutb(src.connected.occupant)
domutcheck(src.connected.occupant,src.connected)
else
randmuti(src.connected.occupant)
src.connected.occupant.UpdateAppearance()
src.connected.occupant.apply_damage(((src.radiation_intensity*2)+src.radiation_duration), DAMAGE_RADIATION, damage_flags = DAMAGE_FLAG_DISPERSED)
src.connected.locked = lock_state
return 1 // return 1 forces an update to all Nano uis attached to src
////////////////////////////////////////////////////////
if (href_list["injectRejuvenators"])
if (!connected.occupant)
return 0
var/inject_amount = round(text2num(href_list["injectRejuvenators"]), 5) // round to nearest 5
if (inject_amount < 0) // Since the user can actually type the commands himself, some sanity checking
inject_amount = 0
if (inject_amount > 50)
inject_amount = 50
connected.beaker.reagents.trans_to_mob(connected.occupant, inject_amount, CHEM_BLOOD)
return 1 // return 1 forces an update to all Nano uis attached to src
////////////////////////////////////////////////////////
if (href_list["selectSEBlock"] && href_list["selectSESubblock"]) // This chunk of code updates selected block / sub-block based on click (se stands for strutural enzymes)
var/select_block = text2num(href_list["selectSEBlock"])
var/select_subblock = text2num(href_list["selectSESubblock"])
if ((select_block <= DNA_SE_LENGTH) && (select_block >= 1))
src.selected_se_block = select_block
if ((select_subblock <= DNA_BLOCK_SIZE) && (select_subblock >= 1))
src.selected_se_subblock = select_subblock
//testing("User selected block [selected_se_block] (sent [select_block]), subblock [selected_se_subblock] (sent [select_block]).")
return 1 // return 1 forces an update to all Nano uis attached to src
if (href_list["pulseSERadiation"])
var/block = src.connected.occupant.dna.GetSESubBlock(src.selected_se_block,src.selected_se_subblock)
//var/original_block=block
//testing("Irradiating SE block [src.selected_se_block]:[src.selected_se_subblock] ([block])...")
irradiating = src.radiation_duration
var/lock_state = src.connected.locked
src.connected.locked = 1 //lock it
SSnanoui.update_uis(src) // update all UIs attached to src
sleep(10*src.radiation_duration) // sleep for radiation_duration seconds
irradiating = 0
if(src.connected.occupant)
if (prob((80 + (src.radiation_duration / 2))))
// FIXME: Find out what these corresponded to and change them to the WHATEVERBLOCK they need to be.
//if ((src.selected_se_block != 2 || src.selected_se_block != 12 || src.selected_se_block != 8 || src.selected_se_block || 10) && prob (20))
var/real_SE_block=selected_se_block
block = miniscramble(block, src.radiation_intensity, src.radiation_duration)
if(prob(20))
if (src.selected_se_block > 1 && src.selected_se_block < DNA_SE_LENGTH/2)
real_SE_block++
else if (src.selected_se_block > DNA_SE_LENGTH/2 && src.selected_se_block < DNA_SE_LENGTH)
real_SE_block--
//testing("Irradiated SE block [real_SE_block]:[src.selected_se_subblock] ([original_block] now [block]) [(real_SE_block!=selected_se_block) ? "(SHIFTED)":""]!")
connected.occupant.dna.SetSESubBlock(real_SE_block,selected_se_subblock,block)
src.connected.occupant.apply_damage((src.radiation_intensity+src.radiation_duration), DAMAGE_RADIATION, damage_flags = DAMAGE_FLAG_DISPERSED)
domutcheck(src.connected.occupant,src.connected)
else
src.connected.occupant.apply_damage(((src.radiation_intensity*2)+src.radiation_duration), DAMAGE_RADIATION, damage_flags = DAMAGE_FLAG_DISPERSED)
if (prob(80-src.radiation_duration))
//testing("Random bad mut!")
randmutb(src.connected.occupant)
domutcheck(src.connected.occupant,src.connected)
else
randmuti(src.connected.occupant)
//testing("Random identity mut!")
src.connected.occupant.UpdateAppearance()
src.connected.locked = lock_state
return 1 // return 1 forces an update to all Nano uis attached to src
if(href_list["ejectBeaker"])
if(connected.beaker)
var/obj/item/reagent_containers/glass/B = connected.beaker
B.forceMove(connected.loc)
connected.beaker = null
return 1
if(href_list["ejectOccupant"])
connected.eject_occupant()
return 1
// Transfer Buffer Management
if(href_list["bufferOption"])
var/bufferOption = href_list["bufferOption"]
// These bufferOptions do not require a bufferId
if (bufferOption == "wipeDisk")
if ((isnull(src.disk)) || (src.disk.read_only))
//src.temphtml = "Invalid disk. Please try again."
return 0
src.disk.buf=null
//src.temphtml = "Data saved."
return 1
if (bufferOption == "ejectDisk")
if (!src.disk)
return
src.disk.forceMove(get_turf(src))
src.disk = null
return 1
// All bufferOptions from here on require a bufferId
if (!href_list["bufferId"])
return 0
var/bufferId = text2num(href_list["bufferId"])
if (bufferId < 1 || bufferId > 3)
return 0 // Not a valid buffer id
if (bufferOption == "saveUI")
if(src.connected.occupant && src.connected.occupant.dna)
var/datum/dna2/record/databuf=new
databuf.types = DNA2_BUF_UE
databuf.dna = src.connected.occupant.dna.Clone()
if(ishuman(connected.occupant))
databuf.dna.real_name=connected.occupant.dna.real_name
databuf.name = "Unique Identifier"
src.buffers[bufferId] = databuf
return 1
if (bufferOption == "saveUIAndUE")
if(src.connected.occupant && src.connected.occupant.dna)
var/datum/dna2/record/databuf=new
databuf.types = DNA2_BUF_UI|DNA2_BUF_UE
databuf.dna = src.connected.occupant.dna.Clone()
if(ishuman(connected.occupant))
databuf.dna.real_name=connected.occupant.dna.real_name
databuf.name = "Unique Identifier + Unique Enzymes"
src.buffers[bufferId] = databuf
return 1
if (bufferOption == "saveSE")
if(src.connected.occupant && src.connected.occupant.dna)
var/datum/dna2/record/databuf=new
databuf.types = DNA2_BUF_SE
databuf.dna = src.connected.occupant.dna.Clone()
if(ishuman(connected.occupant))
databuf.dna.real_name=connected.occupant.dna.real_name
databuf.name = "Structural Enzymes"
src.buffers[bufferId] = databuf
return 1
if (bufferOption == "clear")
src.buffers[bufferId]=new /datum/dna2/record()
return 1
if (bufferOption == "changeLabel")
var/datum/dna2/record/buf = src.buffers[bufferId]
var/text = sanitize(input(usr, "New Label:", "Edit Label", buf.name) as text|null, MAX_NAME_LEN)
buf.name = text
src.buffers[bufferId] = buf
return 1
if (bufferOption == "transfer")
if (!src.connected.occupant || (src.connected.occupant.mutations & NOCLONE) || !src.connected.occupant.dna)
return
irradiating = 2
var/lock_state = src.connected.locked
src.connected.locked = 1//lock it
SSnanoui.update_uis(src) // update all UIs attached to src
sleep(10*2) // sleep for 2 seconds
irradiating = 0
src.connected.locked = lock_state
var/datum/dna2/record/buf = src.buffers[bufferId]
if ((buf.types & DNA2_BUF_UI))
if ((buf.types & DNA2_BUF_UE))
src.connected.occupant.real_name = buf.dna.real_name
src.connected.occupant.name = buf.dna.real_name
src.connected.occupant.UpdateAppearance(buf.dna.UI.Copy())
else if (buf.types & DNA2_BUF_SE)
src.connected.occupant.dna.SE = buf.dna.SE
src.connected.occupant.dna.UpdateSE()
domutcheck(src.connected.occupant,src.connected)
src.connected.occupant.apply_damage(rand(20,50), damage_flags = DAMAGE_FLAG_DISPERSED)
return 1
if (bufferOption == "createInjector")
if (src.injector_ready || waiting_for_user_input)
var/success = 1
var/obj/item/dnainjector/I = new /obj/item/dnainjector
var/datum/dna2/record/buf = src.buffers[bufferId]
if(href_list["createBlockInjector"])
waiting_for_user_input=1
var/list/selectedbuf
if(buf.types & DNA2_BUF_SE)
selectedbuf=buf.dna.SE
else
selectedbuf=buf.dna.UI
var/blk = input(usr,"Select Block","Block") in all_dna_blocks(selectedbuf)
success = setInjectorBlock(I,blk,buf)
else
I.buf = buf
waiting_for_user_input=0
if(success)
I.forceMove(src.loc)
I.name += " ([buf.name])"
//src.temphtml = "Injector created."
src.injector_ready = 0
spawn(300)
src.injector_ready = 1
//else
//src.temphtml = "Error in injector creation."
//else
//src.temphtml = "Replicator not ready yet."
return 1
if (bufferOption == "loadDisk")
if ((isnull(src.disk)) || (!src.disk.buf))
//src.temphtml = "Invalid disk. Please try again."
return 0
src.buffers[bufferId]=src.disk.buf
//src.temphtml = "Data loaded."
return 1
if (bufferOption == "saveDisk")
if ((isnull(src.disk)) || (src.disk.read_only))
//src.temphtml = "Invalid disk. Please try again."
return 0
var/datum/dna2/record/buf = src.buffers[bufferId]
src.disk.buf = buf
src.disk.name = "data disk - '[buf.dna.real_name]'"
//src.temphtml = "Data saved."
return 1
// ui_interact(user)
/////////////////////////// DNA MACHINES
+1
View File
@@ -69,6 +69,7 @@
description = "A janitorial supplies company best known for their highly-effective and mostly-non-toxic 'space cleaner' formula, in wide usage throughout the Spur."
tag_line = "Just say BLAM! And it's gone!"
/// Unused with the removal of Antimatter-based energy sources from the codebase.
/singleton/cargo_supplier/eckharts
short_name = "eckharts"
name = "Eckhart's Energy Solutions Limited"
-42
View File
@@ -586,20 +586,6 @@
groupable = TRUE
spawn_amount = 1
/singleton/cargo_item/packagedantimatterreactorsection
category = "engineering"
name = "packaged antimatter reactor section"
supplier = "eckharts"
description = "A section of antimatter reactor shielding. Do not eat."
price = 220
items = list(
/obj/item/am_shielding_container
)
access = ACCESS_CE
container_type = "crate"
groupable = TRUE
spawn_amount = 1
/singleton/cargo_item/debugger
category = "engineering"
name = "debugger"
@@ -840,34 +826,6 @@
groupable = TRUE
spawn_amount = 1
/singleton/cargo_item/antimattercontainmentjar
category = "engineering"
name = "antimatter containment jar"
supplier = "eckharts"
description = "Holds antimatter. Warranty void if exposed to matter."
price = 280
items = list(
/obj/item/am_containment
)
access = ACCESS_CE
container_type = "crate"
groupable = TRUE
spawn_amount = 1
/singleton/cargo_item/antimattercontrolunit
category = "engineering"
name = "antimatter control unit"
supplier = "eckharts"
description = "The control unit for an antimatter reactor. Probably safe."
price = 1950
items = list(
/obj/machinery/power/am_control_unit
)
access = ACCESS_CE
container_type = "crate"
groupable = TRUE
spawn_amount = 1
/singleton/cargo_item/alphaparticlegenerationarray
category = "engineering"
name = "Alpha Particle Generation Array"
-2
View File
@@ -160,7 +160,6 @@ var/list/worths = list(
/obj/item/mining_scanner = 13,
/obj/item/bee_smoker = 5,
/obj/item/anomaly_core = 2000,
/obj/item/am_containment = 500,
/obj/item/coin/diamond = 50,
/obj/item/coin/platinum = 25,
/obj/item/coin/phoron = 20,
@@ -237,7 +236,6 @@ var/list/worths = list(
/obj/item/smes_coil/super_io = 450,
/obj/item/smes_coil = 200,
/obj/item/tracker_electronics = 15,
/obj/item/am_containment = 500,
/obj/item/syringe_cartridge = 2,
/obj/item/suppressor = 6,
/obj/item/fossil = 10,
@@ -1,48 +0,0 @@
/obj/item/am_containment
name = "antimatter containment jar"
desc = "Holds antimatter. Warranty void if exposed to matter."
icon = 'icons/obj/machinery/antimatter.dmi'
icon_state = "jar"
force = 18
throwforce = 10
throw_speed = 1
throw_range = 2
var/fuel = 1000
var/stability = 100 //TODO: add all the stability things to this so its not very safe if you keep hitting in on things
var/exploded = FALSE
/obj/item/am_containment/antagonist_hints(mob/user, distance, is_adjacent)
. += ..()
. += "Antimatter is extremely volatile, and containment jars are not particularly strong. Weak explosions will reduce the container's integrity, and larger ones will cause it to explode immediately."
/obj/item/am_containment/proc/boom()
var/percent = 0
if(fuel)
percent = (fuel / initial(fuel)) * 100
if(!exploded && percent >= 10)
explosion(get_turf(src), 1, 2, 3, 5)//Should likely be larger but this works fine for now I guess
exploded = TRUE
if(src)
qdel(src)
/obj/item/am_containment/ex_act(severity)
switch(severity)
if(1.0)
boom()
if(2.0)
if(prob((fuel / 10) - stability))
boom()
stability -= 40
if(3.0)
stability -= 20
check_stability()
/obj/item/am_containment/proc/check_stability()
if(stability <= 0)
boom()
/obj/item/am_containment/proc/usefuel(var/wanted)
if(fuel < wanted)
wanted = fuel
fuel -= wanted
return wanted
-365
View File
@@ -1,365 +0,0 @@
/obj/machinery/power/am_control_unit
name = "antimatter control unit"
desc = "The control unit for an antimatter reactor. Probably safe."
icon = 'icons/obj/machinery/new_ame.dmi'
icon_state = "control"
var/icon_mod = "on" // on, critical, or fuck
anchored = FALSE
density = TRUE
use_power = POWER_USE_IDLE
idle_power_usage = 100
active_power_usage = 1000
var/list/obj/machinery/am_shielding/linked_shielding
var/list/obj/machinery/am_shielding/linked_cores
var/obj/item/am_containment/fueljar
var/update_shield_icons = FALSE
var/stability = 100
var/exploding = FALSE
var/exploded = FALSE
var/active = FALSE //On or not
var/fuel_injection = 2 //How much fuel to inject
var/shield_icon_delay = FALSE //delays resetting for a short time
var/reported_core_efficiency = 0
var/power_cycle = 0
var/power_cycle_delay = 4 //How many ticks till produce_power is called
var/stored_core_stability = 0
var/stored_core_stability_delay = 0
var/stored_power = 0 //Power to deploy per tick
/obj/machinery/power/am_control_unit/assembly_hints(mob/user, distance, is_adjacent)
. += ..()
if(!anchored)
. += "First secure the control unit to the ground with some <b>bolts</b>."
else
. += "Arrange the reactor sections nearby and activate them."
. += "Reactor sections can only be activated if they are near the control unit, but otherwise are not restricted in how they must be placed."
/obj/machinery/power/am_control_unit/antagonist_hints(mob/user, distance, is_adjacent)
. += ..()
. += "The antimatter engine will quickly destabilize if the fuel injection rate is set too high, causing a large explosion."
/obj/machinery/power/am_control_unit/Destroy()//Perhaps damage and run stability checks rather than just del on the others
for(var/obj/machinery/am_shielding/AMS in linked_shielding)
AMS.control_unit = null
qdel(AMS)
for(var/obj/machinery/am_shielding/AMS in linked_cores)
AMS.control_unit = null
qdel(AMS)
QDEL_NULL(fueljar)
return ..()
/obj/machinery/power/am_control_unit/process()
if(exploding && !exploded)
message_admins("AME explosion at ([x],[y],[z] - <A href='byond://?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>) - Last touched by [fingerprintslast]",0,1)
exploded=1
explosion(get_turf(src),8,10,12,15)
if(src)
qdel(src)
if(update_shield_icons && !shield_icon_delay)
check_shield_icons()
update_shield_icons = 0
if(stat & (NOPOWER|BROKEN) || !active)//can update the icons even without power
return
if(!fueljar)//No fuel but we are on, shutdown
toggle_power()
//Angry buzz or such here
return
check_core_stability()
ADD_TO_POWERNET(src, stored_power)
power_cycle++
if(power_cycle >= power_cycle_delay)
produce_power()
power_cycle = 0
/obj/machinery/power/am_control_unit/proc/produce_power()
playsound(get_turf(src), 'sound/effects/air_seal.ogg', 25, TRUE)
for(var/thing in linked_cores)
flick("core2", thing)
if(reported_core_efficiency <= 0)
return FALSE //Something is wrong
var/core_damage = 0
var/fuel = fueljar.usefuel(fuel_injection)
stored_power = fuel * AM_POWER_FACTOR
// Now check if the cores could deal with it safely, this is done after so you can overload for more power if needed, still a bad idea
if(fuel > (2 * reported_core_efficiency)) //More fuel has been put in than the current cores can deal with
if(prob(50))
core_damage = 1 //Small chance of damage
if((fuel - reported_core_efficiency) > 5)
core_damage = 5 //Now its really starting to overload the cores
if((fuel - reported_core_efficiency) > 10)
core_damage = 20 //Welp now you did it, they wont stand much of this
if(core_damage == 0)
return
for(var/obj/machinery/am_shielding/AMS in linked_cores)
AMS.stability -= core_damage
AMS.check_stability(TRUE)
playsound(get_turf(src), 'sound/effects/bang.ogg', 50, 1)
/obj/machinery/power/am_control_unit/emp_act(severity)
. = ..()
switch(severity)
if(EMP_HEAVY)
if(active)
toggle_power()
stability -= rand(15, 30)
if(EMP_LIGHT)
if(active)
toggle_power()
stability -= rand(10, 20)
check_stability()
/obj/machinery/power/am_control_unit/ex_act(severity)
switch(severity)
if(1.0)
stability -= 60
if(2.0)
stability -= 40
if(3.0)
stability -= 20
check_stability()
/obj/machinery/power/am_control_unit/power_change()
..()
if(stat & NOPOWER && active)
toggle_power()
/obj/machinery/power/am_control_unit/update_icon()
if(active)
icon_state = "control_[icon_mod]"
else
icon_state = "control"
/obj/machinery/power/am_control_unit/attackby(obj/item/attacking_item, mob/user)
if(attacking_item.tool_behaviour == TOOL_WRENCH)
if(!anchored)
attacking_item.play_tool_sound(get_turf(src), 75)
user.visible_message("<b>[user.name]</b> secures \the [src] to the floor.", \
SPAN_NOTICE("You secure the anchor bolts to the floor."), \
SPAN_NOTICE("You hear a ratcheting noise."))
anchored = TRUE
update_shield_icons = 2
check_shield_icons()
connect_to_network()
else if(!LAZYLEN(linked_shielding))
attacking_item.play_tool_sound(get_turf(src), 75)
user.visible_message("<b>[user]</b> unsecures \the [src].", \
SPAN_NOTICE("You remove the anchor bolts."), \
SPAN_NOTICE("You hear a ratcheting noise."))
anchored = FALSE
disconnect_from_network()
else
to_chat(user, SPAN_WARNING("Once bolted and linked to a shielding unit it \the [src] is unable to be moved!"))
return
if(istype(attacking_item, /obj/item/am_containment))
if(fueljar)
to_chat(user, SPAN_WARNING("There is already \a [fueljar] loaded!"))
return
fueljar = attacking_item
user.drop_from_inventory(attacking_item, src)
message_admins("AME loaded with fuel by [user.real_name] ([user.key]) at ([x],[y],[z] - <A href='byond://?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
user.visible_message("<b>[user]</b> loads \the [attacking_item] into \the [src].",
SPAN_NOTICE("You load \the [attacking_item] into \the [src]."),
SPAN_NOTICE("You hear a thunk."))
return
if(attacking_item.force >= 20)
user.do_attack_animation(src, attacking_item)
stability -= attacking_item.force / 2
check_stability()
return ..()
/obj/machinery/power/am_control_unit/attack_hand(mob/user)
if(anchored)
interact(user)
/obj/machinery/power/am_control_unit/proc/add_shielding(var/obj/machinery/am_shielding/AMS, var/AMS_linking = 0)
if(!istype(AMS))
return FALSE
if(!anchored)
return FALSE
if(!AMS_linking && !AMS.link_control(src))
return FALSE
LAZYDISTINCTADD(linked_shielding, AMS)
update_shield_icons = 1
return TRUE
/obj/machinery/power/am_control_unit/proc/remove_shielding(var/obj/machinery/am_shielding/AMS)
if(!istype(AMS))
return FALSE
LAZYREMOVE(linked_shielding, AMS)
update_shield_icons = 2
if(active)
toggle_power()
return TRUE
/obj/machinery/power/am_control_unit/proc/check_stability()//TODO: make it break when low also might want to add a way to fix it like a part or such that can be replaced
if(stability <= 0)
qdel(src)
/obj/machinery/power/am_control_unit/toggle_power()
active = !active
if(active)
update_use_power(POWER_USE_ACTIVE)
visible_message(SPAN_NOTICE("\The [src] starts up."))
else
update_use_power(POWER_USE_IDLE)
visible_message(SPAN_NOTICE("\The [src] shuts down."))
for(var/obj/machinery/am_shielding/AMS in linked_cores)
AMS.update_icon()
update_icon()
/obj/machinery/power/am_control_unit/proc/check_shield_icons()//Forces icon_update for all shields
if(shield_icon_delay)
return
shield_icon_delay = TRUE
if(update_shield_icons == 2)//2 means to clear everything and rebuild
for(var/obj/machinery/am_shielding/neighbor in cardinalrange(loc))
if(!neighbor.control_unit)
LAZYADD(linked_shielding, neighbor)
for(var/obj/machinery/am_shielding/AMS in linked_shielding)
if(AMS.processing)
AMS.shutdown_core()
AMS.control_unit = null
addtimer(CALLBACK(src, PROC_REF(ams_do_scan), AMS), 1 SECOND)
LAZYCLEARLIST(linked_shielding)
else
for(var/obj/machinery/am_shielding/AMS in linked_shielding)
AMS.update_icon()
addtimer(CALLBACK(src, PROC_REF(clear_shield_icon_delay)), 2 SECONDS)
/obj/machinery/power/am_control_unit/proc/ams_do_scan(var/obj/machinery/am_shielding/AMS)
AMS.controllerscan()
AMS.assimilate()
/obj/machinery/power/am_control_unit/proc/clear_shield_icon_delay()
shield_icon_delay = FALSE
/obj/machinery/power/am_control_unit/proc/check_core_stability()
if(!LAZYLEN(linked_cores))
return
stored_core_stability = 0
for(var/thing in linked_cores)
var/obj/machinery/am_shielding/AMS = thing
if(QDELETED(AMS))
continue
stored_core_stability += AMS.stability
stored_core_stability /= LAZYLEN(linked_cores)
switch(stored_core_stability)
if(0 to 24)
icon_mod = "fuck"
if(25 to 49)
icon_mod = "critical"
if(50 to INFINITY)
icon_mod = "on"
update_icon()
/obj/machinery/power/am_control_unit/interact(mob/user)
if((get_dist(src, user) > 1) || (stat & (BROKEN|NOPOWER)))
if(!issilicon(user))
user.unset_machine()
user << browse(null, "window=AMcontrol")
return
return ui_interact(user)
/obj/machinery/power/am_control_unit/ui_interact(mob/user, ui_key = "main")
if(!user)
return
var/list/fueljar_data = null
if(fueljar)
fueljar_data = list(
"fuel" = fueljar.fuel,
"fuel_max" = initial(fueljar.fuel),
"injecting" = fuel_injection
)
var/list/data = list(
"active" = active,
"linked_shields" = LAZYLEN(linked_shielding),
"linked_cores" = LAZYLEN(linked_cores),
"efficiency" = reported_core_efficiency,
"stability" = stored_core_stability,
"stored_power" = stored_power,
"fueljar" = fueljar_data,
"siliconUser" = issilicon(user)
)
var/datum/nanoui/ui = SSnanoui.get_open_ui(user, src, ui_key)
if (!ui)
// the ui does not exist, so we'll create a new one
ui = new(user, src, ui_key, "ame.tmpl", "Antimatter Control Unit", 500, data["siliconUser"] ? 465 : 390)
// When the UI is first opened this is the data it will use
ui.set_initial_data(data)
ui.open()
// Auto update every Master Controller tick
ui.set_auto_update(TRUE)
else
// The UI is already open so push the new data to it
ui.push_data(data)
/obj/machinery/power/am_control_unit/Topic(href, href_list)
if(..())
return TRUE
if(href_list["close"])
if(usr.machine == src)
usr.unset_machine()
return TRUE
//Ignore input if we are broken or guy is not touching us, AI can control from a ways away
if(stat & (BROKEN|NOPOWER))
usr.unset_machine()
usr << browse(null, "window=AMcontrol")
return
if(href_list["close"])
usr << browse(null, "window=AMcontrol")
usr.unset_machine()
return
if(href_list["togglestatus"])
toggle_power()
message_admins("AME toggled [active?"on":"off"] by [usr.real_name] ([usr.key]) at ([x],[y],[z] - <A href='byond://?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
return TRUE
if(href_list["refreshicons"])
update_shield_icons = 2 // Fuck it
return TRUE
if(href_list["ejectjar"])
if(fueljar)
message_admins("AME fuel jar ejected by [usr.real_name] ([usr.key]) at ([x],[y],[z] - <A href='byond://?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
fueljar.forceMove(src.loc)
fueljar = null
//fueljar.control_unit = null currently it does not care where it is
//update_icon() when we have the icon for it
return TRUE
if(href_list["set_strength"])
var/newval = input("Enter new injection strength") as num|null
if(isnull(newval))
return
fuel_injection = newval
fuel_injection = max(1, fuel_injection)
message_admins("AME injection strength set to [fuel_injection] by [usr.real_name] ([usr.key]) at ([x],[y],[z] - <A href='byond://?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
return TRUE
if(href_list["refreshstability"])
check_core_stability()
return TRUE
updateDialog()
return TRUE
-258
View File
@@ -1,258 +0,0 @@
//like orange but only checks north/south/east/west for one step
/proc/cardinalrange(var/center)
var/list/things = list()
for(var/direction in GLOB.cardinals)
var/turf/T = get_step(center, direction)
if(!T)
continue
things += T.contents
return things
/obj/machinery/am_shielding
name = "antimatter reactor section"
desc = "A shielding component for an antimatter reactor. Looks delicate."
icon = 'icons/obj/machinery/new_ame.dmi'
icon_state = "shield"
anchored = TRUE
density = TRUE
dir = NORTH
use_power = POWER_USE_OFF
idle_power_usage = 0
active_power_usage = 0
var/obj/machinery/power/am_control_unit/control_unit = null
var/processing = FALSE //To track if we are in the update list or not, we need to be when we are damaged and if we ever
var/stability = 100 //If this gets low bad things tend to happen
var/efficiency = 1 //How many cores this core counts for when doing power processing, phoron in the air and stability could affect this
var/coredirs = 0
var/dirs = 0
var/mapped = FALSE //Set to 1 to ignore usual suicide if it doesn't immediately find a control_unit
/obj/machinery/am_shielding/mechanics_hints(mob/user, distance, is_adjacent)
. += ..()
. += "Antimatter shielding sections must be beside an anchored control unit or another shielding section. If either are destroyed, the section will disappear."
/obj/machinery/am_shielding/antagonist_hints(mob/user, distance, is_adjacent)
. += ..()
. += "Antimatter shielding sections are delicate. Attacking the shielding unit with a damaging object will reduce its stability, as will explosions. If the stability hits zero, the reactor may explode."
// Stupidly easy way to use it in maps
/obj/machinery/am_shielding/map
mapped = TRUE
/obj/machinery/am_shielding/Initialize(mapload, var/obj/machinery/power/am_control_unit/AMC)
. = ..()
if(!AMC)
if (!mapped)
WARNING("AME sector somehow created without a parent control unit!")
controllerscan()
return
link_control(AMC)
return INITIALIZE_HINT_LATELOAD
/obj/machinery/am_shielding/LateInitialize()
. = ..()
update_icon()
/obj/machinery/am_shielding/proc/link_control(var/obj/machinery/power/am_control_unit/AMC)
if(!istype(AMC))
return FALSE
if(control_unit && control_unit != AMC)
return FALSE // already have one
control_unit = AMC
return control_unit.add_shielding(src, TRUE)
/obj/machinery/am_shielding/Destroy()
if(control_unit)
control_unit.remove_shielding(src)
if(processing)
shutdown_core()
visible_message(SPAN_WARNING("\The [src] melts!"))
// Might want to have it leave a mess on the floor but no sprites for now
return ..()
/obj/machinery/am_shielding/proc/controllerscan(var/priorscan = FALSE)
//Make sure we are the only one here
if(!isturf(loc))
qdel(src)
return
for(var/obj/machinery/am_shielding/AMS in loc.contents - src)
qdel(src)
return
//Search for shielding first
for(var/obj/machinery/am_shielding/AMS in cardinalrange(src))
if(AMS && AMS.control_unit && link_control(AMS.control_unit))
break
if(!control_unit)//No other guys nearby, look for a control unit
for(var/obj/machinery/power/am_control_unit/AMC in cardinalrange(src))
if(AMC.add_shielding(src))
break
if(!mapped) // Prevent rescanning and suicide if it's part of the map
if(!priorscan)
addtimer(CALLBACK(src, PROC_REF(controllerscan), TRUE), 20)
return
qdel(src)
// Find surrounding unconnected shielding and add them to our controller
/obj/machinery/am_shielding/proc/assimilate()
if(!control_unit)
return // nothing to share :'^[
for(var/obj/machinery/am_shielding/neighbor in cardinalrange(src))
if(neighbor && !neighbor.control_unit)
neighbor.link_control(control_unit)
neighbor.assimilate() // recursion is fun, right?
/obj/machinery/am_shielding/Cross(atom/movable/mover, turf/target, height=1.5, air_group = 0)
if(air_group || (height==0))
return TRUE
return FALSE
/obj/machinery/am_shielding/process()
if(!processing)
. = PROCESS_KILL
//TODO: core functions and stability
//TODO: think about checking the airmix for phoron and increasing power output
/obj/machinery/am_shielding/emp_act()//Immune due to not really much in the way of electronics.
. = ..()
return
/obj/machinery/am_shielding/ex_act(severity)
switch(severity)
if(1.0)
stability -= 80
if(2.0)
stability -= 40
if(3.0)
stability -= 20
check_stability()
/obj/machinery/am_shielding/update_icon()
ClearOverlays()
coredirs = 0
dirs = 0
for(var/direction in GLOB.alldirs)
var/turf/T = get_step(loc, direction)
for(var/obj/machinery/machine in T)
// Detect cores
if(istype(machine, /obj/machinery/am_shielding))
var/obj/machinery/am_shielding/AMS = machine
if(AMS.control_unit == control_unit && AMS.processing)
coredirs |= direction
// Detect cores, shielding, and control boxen.
if(direction in GLOB.cardinals)
if(istype(machine, /obj/machinery/am_shielding))
var/obj/machinery/am_shielding/AMS = machine
if(AMS.control_unit == control_unit)
dirs |= direction
else if(istype(machine, /obj/machinery/power/am_control_unit))
var/obj/machinery/power/am_control_unit/AMCU = machine
if(AMCU == control_unit)
dirs |= direction
var/is_core = core_check()
// Set our overlay
if(!is_core)
icon_state = "shield_[dirs]"
if(is_core)
icon_state = "core[control_unit && control_unit.active]"
if(!processing)
setup_core()
else if(processing)
shutdown_core()
/obj/machinery/am_shielding/attackby(obj/item/attacking_item, mob/user)
if(!istype(attacking_item) || !user)
return
if(attacking_item.force > 10)
user.do_attack_animation(src, attacking_item)
stability -= attacking_item.force / 2
check_stability()
return ..()
//Scans cards for shields or the control unit and if all there it
/obj/machinery/am_shielding/proc/core_check()
for(var/direction in GLOB.alldirs)
var/found_am_device = FALSE
for(var/obj/machinery/machine in get_step(loc, direction))
if(!machine)
continue
if(istype(machine, /obj/machinery/am_shielding) || istype(machine, /obj/machinery/power/am_control_unit))
found_am_device = TRUE
break
if(!found_am_device)
return FALSE
return TRUE
/obj/machinery/am_shielding/proc/setup_core()
processing = TRUE
if(!control_unit)
return
LAZYADD(control_unit.linked_cores, src)
control_unit.reported_core_efficiency += efficiency
/obj/machinery/am_shielding/proc/shutdown_core()
processing = 0
if(!control_unit)
return
LAZYREMOVE(control_unit.linked_cores, src)
control_unit.reported_core_efficiency -= efficiency
/obj/machinery/am_shielding/proc/check_stability(var/injecting_fuel = FALSE)
if(stability > 0)
return
if(injecting_fuel && control_unit)
control_unit.exploding = TRUE
qdel(src)
/obj/machinery/am_shielding/proc/recalc_efficiency(var/new_efficiency)//tbh still not 100% sure how I want to deal with efficiency so this is likely temp
if(!control_unit || !processing)
return
if(stability < 50)
new_efficiency /= 2
control_unit.reported_core_efficiency += (new_efficiency - efficiency)
efficiency = new_efficiency
/obj/item/am_shielding_container
name = "packaged antimatter reactor section"
desc = "A section of antimatter reactor shielding. Do not eat."
icon = 'icons/obj/machinery/antimatter.dmi'
icon_state = "box"
item_state = "electronic"
throwforce = 5
throw_speed = 1
throw_range = 2
/obj/item/am_shielding_container/mechanics_hints(mob/user, distance, is_adjacent)
. += ..()
. += "To deploy, drop near an antimatter control unit or an existing deployed section and use your multitool on it."
/obj/item/am_shielding_container/attackby(obj/item/attacking_item, mob/user)
if(attacking_item.tool_behaviour == TOOL_MULTITOOL && isturf(loc))
if(locate(/obj/machinery/am_shielding) in loc)
to_chat(user, SPAN_WARNING("There is already an antimatter reactor section there."))
return
//Search for shielding first
for(var/obj/machinery/am_shielding/AMS in cardinalrange(src))
if(AMS.control_unit)
new /obj/machinery/am_shielding(loc, AMS.control_unit)
qdel(src)
return
//No other guys nearby, look for a control unit
var/obj/machinery/power/am_control_unit/AMC = locate() in cardinalrange(src)
if(AMC?.anchored)
new /obj/machinery/am_shielding(loc, AMC)
qdel(src)
else //Stranded & Alone
to_chat(user, SPAN_WARNING("\The [src] couldn't connect to an Antimatter Control Unit."))
return
..()
+7
View File
@@ -0,0 +1,7 @@
# Your name.
author: Batrachophrenoboocosmomachia
delete-after: True
changes:
- rscdel: "Removes deprecated AME code and associated power spritefiles."
- rscdel: "Removes DNA Modifier NanoUI, replacing interaction behavior with a feedback message."
- rscdel: "Removes old NanoUI templates for objects whose UIs have already been converted to TGUI, or which had already been removed from the server."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 492 B

-216
View File
@@ -1,216 +0,0 @@
<!--
Title: Air Alarm
Used In File(s): \code\game\machinery\alarm.dm
#define AALARM_MODE_SCRUBBING 1
#define AALARM_MODE_REPLACEMENT 2 //like scrubbing, but faster.
#define AALARM_MODE_PANIC 3 //constantly sucks all air
#define AALARM_MODE_CYCLE 4 //sucks off all air, then refill and switches to scrubbing
#define AALARM_MODE_FILL 5 //emergency fill
#define AALARM_MODE_OFF 6 //Shuts it all down.
#define AALARM_SCREEN_MAIN 1
#define AALARM_SCREEN_VENT 2
#define AALARM_SCREEN_SCRUB 3
#define AALARM_SCREEN_MODE 4
#define AALARM_SCREEN_SENSORS 5
-->
<H1>Air Status</H1>
{{if data.has_environment}}
{{for data.environment}}
{{:value.name}}:
{{if value.danger_level == 2}}
<span class='bad'>
{{else value.danger_level == 1}}
<span class='average'>
{{else}}
<span class='good'>
{{/if}}
{{:helper.fixed(value.value, 1)}}
</span>{{:value.unit}}<br>
{{/for}}
Local Status: {{if data.total_danger == 2}}
<span class='bad'>DANGER: Internals Required
{{else data.total_danger == 1}}
<span class='average'>Caution
{{else}}
<span class='good'>Optimal
{{/if}}
</span><br>
Area Status: {{if data.atmos_alarm}}<span class='bad'>Atmosphere alert in area</span>{{else}}No alerts{{/if}}
{{else}}
<span class='bad'>Warning: Cannot obtain air sample for analysis.</span>
{{/if}}
<HR>
<table width="100%">
<tr>
<td>
<tr>
<td>
<H3>Remote Control</H3>
</td>
<td>
<H3>Thermostat</H3>
</td>
</tr>
</td>
<td>
<tr>
<td>
<div class="item">
<div class="itemContent" style="width: 100%;">
{{:helper.link('Off', null, { 'rcon' : 1}, data.remote_connection && !data.remote_access ? (data.rcon == 1 ? 'yellowButton' : 'disabled') : null, data.rcon == 1 ? 'selected' : null)}}
{{:helper.link('Auto', null, { 'rcon' : 2}, data.remote_connection && !data.remote_access ? (data.rcon == 2 ? 'yellowButton' : 'disabled') : null, data.rcon == 2 ? 'selected' : null)}}
{{:helper.link('On', null, { 'rcon' : 3}, data.remote_connection && !data.remote_access ? (data.rcon == 3 ? 'yellowButton' : 'disabled') : null, data.rcon == 3 ? 'selected' : null)}}
</div>
</div>
</td>
<td>
{{:helper.link(data.target_temperature, null, { 'temperature' : 1})}}
</td>
</tr>
</td>
</tr>
</table>
<HR>
{{if (data.locked && !data.remote_connection) || (data.remote_connection && ! data.remote_access)}}
{{if data.remote_connection}}
<span class='noticePlaceholder'>(Current remote control settings and alarm status restricts access.)</span>
{{else}}
<span class='noticePlaceholder'>(Swipe ID card to unlock interface.)</span>
{{/if}}
{{else}}
{{if data.screen != 1}}
<div class="item">{{:helper.link('Main Menu', null, { 'screen' : 1})}}</div>
{{/if}}
{{if data.screen == 1}}
<div class="item">
{{if data.atmos_alarm}}
{{:helper.link('Reset - Area Atmospheric Alarm', null, { 'atmos_reset' : 1})}}
{{else}}
{{:helper.link('Activate - Area Atmospheric Alarm', null, { 'atmos_alarm' : 1})}}
{{/if}}
</div>
<hr>
<div class="item">
{{:helper.link('Scrubbers Control', null, { 'screen' : 3})}}
</div>
<div class="item">
{{:helper.link('Vents Control', null, { 'screen' : 2})}}
</div>
<div class="item">
{{:helper.link('Set Environmental Mode', null, { 'screen' : 4})}}
</div>
<div class="item">
{{:helper.link('Sensor Settings', null, { 'screen' : 5})}}
</div>
<hr>
{{if data.mode==3}}
{{:helper.link('PANIC SIPHON ACTIVE - Turn siphoning off', null, { 'mode' : 1}, null, 'redButton')}}
{{else}}
{{:helper.link('ACTIVATE PANIC SIPHON IN AREA', null, { 'mode' : 3}, null, 'yellowButton')}}
{{/if}}
{{else data.screen == 2}}
{{for data.vents}}
<div class="item">
{{:value.long_name}}</div>
<div class="item">
<div class="itemLabel">
Operating:
</div>
<div class="itemContent">
{{:helper.link(value.power ? 'On' : 'Off', null, { 'id_tag' : value.id_tag, 'command' : 'power', 'val' : value.power ? 0 : 1}, null, value.power ? null : 'redButton')}}
</div>
</div>
<div class="item">
<div class="itemLabel">
Operation Mode:
</div>
<div class="itemContent">
{{:value.direction == "siphon" ? 'Siphoning' : 'Pressurizing'}}
</div>
</div>
<div class="item">
<div class="itemLabel">
Pressure Checks:
</div>
<div class="itemContent">
{{:helper.link('External', null, { 'id_tag' : value.id_tag, 'command' : 'checks', 'val' : value.checks^1}, null, value.checks&1 ? 'selected' : null)}}
{{:helper.link('Internal', null, { 'id_tag' : value.id_tag, 'command' : 'checks', 'val' : value.checks^2}, null, value.checks&2 ? 'selected' : null)}}
</div>
</div>
<div class="item">
<div class="itemLabel">
External Pressure Bound:
</div>
<div class="itemContent">
{{:helper.link(helper.fixed(value.external,2), null, { 'id_tag' : value.id_tag, 'command' : 'set_external_pressure'})}}
{{:helper.link('Reset', null, { 'id_tag' : value.id_tag, 'command' : 'reset_external_pressure'})}}
</div>
</div>
<HR>
{{empty}}
No vents connected.
{{/for}}
{{else data.screen == 3}}
{{for data.scrubbers}}
<div class="item">
{{:value.long_name}}</div>
<div class="item">
<div class="itemLabel">
Operating:
</div>
<div class="itemContent">
{{:helper.link(value.power ? 'On' : 'Off', null, { 'id_tag' : value.id_tag, 'command' : 'power', 'val' : value.power ? 0 : 1}, null, value.power ? null : 'redButton')}}
</div>
</div>
<div class="item">
<div class="itemLabel">
Operation Mode:
</div>
<div class="itemContent">
{{:helper.link(value.scrubbing ? 'Scrubbing' : 'Siphoning', null, { 'id_tag' : value.id_tag, 'command' : 'scrubbing', 'val' : value.scrubbing ? 0 : 1}, null, value.scrubbing ? null : 'redButton')}}
</div>
</div>
<div class="item">
<div class="itemLabel">
Filters:
</div>
<div class="itemContent">
{{for value.filters :filterValue:filterIndex}}
{{:helper.link(filterValue.name, null, { 'id_tag' : value.id_tag, 'command' : filterValue.command, 'val' : filterValue.val ? 0 : 1}, null, filterValue.val ? 'selected' : null)}}
{{/for}}
</div>
</div>
<HR>
{{empty}}
No scrubbers connected.
{{/for}}
{{else data.screen == 4}}
<H3>Environmental Modes</H3>
{{for data.modes}}
<div class="item">
{{:helper.link(value.name, null, { 'mode' : value.mode }, null, value.selected ? (value.danger ? 'redButton' : 'selected') : null)}}
</div>
{{/for}}
{{else data.screen == 5}}
<H3>Alarm Threshold</H3>
Partial pressure for gases.
<table class='fixed'>
<tr>
<td></td><td><span class='bad'>min2</span></td><td><span class='average'>min1</span></td><td><span class='average'>max1</span></td><td><span class='bad'>max2</span></td>
</tr>
{{for data.thresholds}}
<tr>
<td>{{:value.name}}</td>
{{for value.settings :settingsValue:settingsIndex}}
<td>
{{:helper.link(settingsValue.selected >= 0 ? helper.fixed(settingsValue.selected, 2) : "Off", null, { 'command' : 'set_threshold', 'env' : settingsValue.env, 'var' : settingsValue.val })}}
</td>
{{/for}}
</tr>
{{/for}}
<table>
{{/if}}
{{/if}}
-37
View File
@@ -1,37 +0,0 @@
<!--
Title: Alarm Monitor Console (Main content)
Used In File(s): \code\modules\nano\modules\alarm_monitor.dm
"MD5 checks should be good enough"
-->
{{for data.categories}}
<H2><span class="itemLabelWidest">{{:value.category}}</span></H2>
{{for value.alarms :alarmValue:alarmIndex}}
{{if alarmValue.origin_lost}}
{{:alarmValue.name}} <span class='notice'>Alarm Origin Lost</span><br>
{{else}}
{{:alarmValue.name}}<br>
{{/if}}
{{if alarmValue.has_cameras || alarmValue.lost_sources != ""}}
<div class="item">
{{if alarmValue.has_cameras}}
<div class="itemContent" style="width: 100%;">
{{for alarmValue.cameras :cameraValue:cameraIndex}}
{{if cameraValue.deact}}
{{:helper.link(cameraValue.name + " (deactivated)", '', {}, 'inactive')}}
{{else}}
{{:helper.link(cameraValue.name, '', {'switchTo' : cameraValue.camera})}}
{{/if}}
{{/for}}
</div>
{{/if}}
{{if alarmValue.lost_sources != ""}}
<div class="itemContent" style="width: 100%;">
<H4><span class='notice'>Lost Alarm Sources: {{:alarmValue.lost_sources}}</span></H4>
</div>
{{/if}}
</div>
{{/if}}
{{empty}}
<span class="white">--All Systems Nominal</span>
{{/for}}
{{/for}}
-56
View File
@@ -1,56 +0,0 @@
<div class="line">
<div class="statusLabel">Status:</div>
{{if data.active}}
<div class="statusValue average">Injecting</div>
{{else}}
<div class="statusValue good">Standby</div>
{{/if}}
&nbsp;{{:helper.link("Toggle Status", "gear", {"togglestatus":1},null)}}
</div>
{{if !data.fueljar}}
<div class="notice">No fuel jar detected.</div>
{{else}}
<div class="statusDisplay">
<div class="line">
<div class="statusLabel">Fuel:</div>
<div class="statusValue">{{:data.fueljar.fuel}}/{{:data.fueljar.fuel_max}}</div>
{{:helper.link("Eject", "eject", {"ejectjar":1},null,'floatRight')}}
</div>
<div class="line">
<div class="statusLabel">Injecting:</div>
<div class="statusValue">
{{:helper.link(data.fueljar.injecting+" units", 'carat-2-n-s', {'set_strength': 1})}}
</div>
</div>
</div>
{{/if}}
<div class="statusDisplay">
<div class="line">
<div class="statusLabel">Stability:</div>
<div class="statusValue">
{{:helper.displayBar(data.stability,0,100,"good")}}
{{:data.stability}}%
</div>
</div>
<div class="line">
<div class="statusLabel">Shielding Count:</div>
<div class="statusValue">{{:data.linked_shields}}</div>
</div>
<div class="line">
<div class="statusLabel">Cores:</div>
<div class="statusValue">{{:data.linked_cores}}</div>
{{:helper.link("Refresh Parts",null,{"refreshicons" : 1},(data.active?"disabled":null),'floatRight')}}
</div>
<div class="line">
<div class="statusLabel">Current Efficiency:</div>
<div class="statusValue">{{:data.efficiency}}</div>
</div>
<div class="line">
<div class="statusLabel">Average Efficiency:</div>
<div class="statusValue">{{:data.stability}}</div>
</div>
<div class="line">
<div class="statusLabel">Last Produced:</div>
<div class="statusValue">{{:data.stored_power}}</div>
</div>
</div>
-18
View File
@@ -1,18 +0,0 @@
<H1>Priority Alerts</H1>
{{for data.priority_alarms}}
<div class="item">
{{:value.name}} {{:helper.link('Reset', null, {'clear_alarm' : value.ref})}}
</div>
{{empty}}
No priority alerts detected.
{{/for}}
<H3>Minor Alerts</H3>
{{for data.minor_alarms}}
<div class="item">
{{:value.name}} {{:helper.link('Reset', null, {'clear_alarm' : value.ref})}}
</div>
{{empty}}
No minor alerts detected.
{{/for}}
-56
View File
@@ -1,56 +0,0 @@
<!--
Title: Bioballistic Delivery System UI
Used In File(s): \code\modules\hydroponics\seed_machines.dm
-->
{{if data.activity}}
Scanning...
{{else}}
<h3>Buffered Genetic Data</h3>
{{if data.disk}}
<div class="item">
<div class="itemLabel">
Source:
</div>
<div class="itemContent">
{{:data.sourceName}}
</div>
<div class="itemLabel">
Gene decay:
</div>
<div class="itemContent">
{{if data.degradation <= 100}}
{{:data.degradation}}%
{{else}}
<font = '#FF0000'><b>FURTHER AMENDMENTS NONVIABLE</b></font>
{{/if}}
</div>
<div class="itemLabel">
Locus:
</div>
<div class="itemContent">
{{:data.locus}}
</div>
{{:helper.link('Eject Disk', 'circle-arrow-e', {'eject_disk' : 1}, null)}}
</div>
{{else}}
<div class="notice">No disk loaded.</div>
{{/if}}
<h3>Loaded Material</h3>
{{if data.loaded}}
<div class = "item">
<div class = "itemLabel">
Target:
</div>
<div class = "itemContent">
{{:data.loaded}}
</div>
{{if data.degradation <= 100}}
{{:helper.link('Apply Gene Mods', 'gear', {'apply_gene' : 1}, null)}}
{{/if}}
{{:helper.link('Eject Target', 'circle-arrow-e', {'eject_packet' : 1}, null)}}
</div>
{{else}}
<div class="notice">No target seed packet loaded</div>
{{/if}}
{{/if}}
-73
View File
@@ -1,73 +0,0 @@
<!--
Title: Lysis-isolation Centrifuge UI
Used In File(s): \code\modules\hydroponics\seed_machines.dm
-->
{{if data.activity}}
Scanning...
{{else}}
<h3>Buffered Genetic Data</h3>
{{if data.hasGenetics}}
<div class="item">
<div class="itemLabel">
Source:
</div>
<div class="itemContent">
{{:data.sourceName}}
</div>
<div class="itemLabel">
Gene decay:
</div>
<div class="itemContent">
{{:data.degradation}}%
</div>
</div>
{{if data.disk}}
{{for data.geneMasks}}
<div class="item">
<div class="itemLabel">
{{:value.mask}}
</div>
<div class="itemContent">
{{:helper.link('Extract', 'circle-arrow-s', {'get_gene' : value.tag}, null)}}
</div>
</div>
{{empty}}
<div class="notice">Data error. Genetic record corrupt.</div>
{{/for}}
<br>
<div class="item">
{{:helper.link('Eject Loaded Disk', 'circle-arrow-e', {'eject_disk' : 1}, null)}}
{{:helper.link('Clear Genetic Buffer', 'gear', {'clear_buffer' : 1}, null)}}
</div>
{{else}}
<div class="notice">No disk inserted.</div>
{{/if}}
{{else}}
<div class="notice">No data buffered.</div>
{{if data.disk}}
<br>
<div class="item">
{{:helper.link('Eject Loaded Disk', 'circle-arrow-e', {'eject_disk' : 1}, null)}}
</div>
{{else}}
<div class="notice">No disk inserted.</div>
{{/if}}
{{/if}}
<h3>Loaded Material</h3>
{{if data.loaded}}
<div class="item">
<div class="itemLabel">
Packet loaded:
</div>
<div class="itemContent">
{{:data.loaded}}
</div>
<div class="item">
{{:helper.link('Process Genome', 'gear', {'scan_genome' : 1}, null)}}{{:helper.link('Eject Packet', 'circle-arrow-e', {'eject_packet' : 1}, null)}}
</div>
</div>
{{else}}
<div class="notice">No seeds loaded.</div>
{{/if}}
{{/if}}
-150
View File
@@ -1,150 +0,0 @@
<!--
Title: Cryo Cell Status UI
Used In File(s): \code\game\machinery\cryo.dm
-->
<h3>Cryo Cell Status</h3>
<div class="statusDisplay">
{{if !data.hasOccupant}}
<div class="line">Cell Unoccupied</div>
{{else}}
<div class="line">
{{:data.occupant.name}}&nbsp;|&nbsp;{{:helper.round(data.occupant.bodyTemperature - 273.15)}} C&nbsp;=>&nbsp;
{{if data.occupant.stat == 0}}
<span class="good">Conscious</span>
{{else data.occupant.stat == 1}}
<span class="average">Unconscious</span>
{{else}}
<span class="bad">DEAD</span>
{{/if}}
</div>
{{if data.occupant.stat < 2}}
<div class="line">
<div class="statusLabel">Brain Activity:</div>
<div class="statusValue">{{:data.occupant.brain_activity}}</div>
</div>
<div class="line">
<div class="statusLabel">Pulse rate:</div>
<div class="statusValue">{{:data.occupant.pulse}}bpm</div>
</div>
<div class="line">
<div class="statusLabel">Blood Pressure:</div>
<div class="statusValue">{{:data.occupant.blood_pressure}}&nbsp;({{:data.occupant.blood_o2}}% blood oxy)</div>
</div>
<br>
<div class="line">
<div class="statusLabel">=&gt; Genetic Damage:</div>
{{if data.occupant.cloneLoss > 50}}
<span class="bad">Severe</span>
{{else data.occupant.cloneLoss > 25}}
<span class="bad">Significant</span>
{{else data.occupant.cloneLoss > 10}}
<span class="average">Moderate</span>
{{else data.occupant.cloneLoss > 1}}
<span class="notgood">Minor</span>
{{else}}
<span class="good">None.</span>
{{/if}}
</div>
<div class="line">
<div class="statusLabel">=&gt; Physical Trauma:</div>
{{if data.occupant.bruteLoss > 50}}
<span class="bad">Severe</span>
{{else data.occupant.bruteLoss > 25}}
<span class="bad">Significant</span>
{{else data.occupant.bruteLoss > 10}}
<span class="average">Moderate</span>
{{else data.occupant.bruteLoss > 1}}
<span class="notgood">Minor</span>
{{else}}
<span class="good">None.</span>
{{/if}}
</div>
<div class="line">
<div class="statusLabel">=&gt; Burn Severity:</div>
{{if data.occupant.fireLoss > 50}}
<span class="bad">Severe</span>
{{else data.occupant.fireLoss > 25}}
<span class="bad">Significant</span>
{{else data.occupant.fireLoss > 10}}
<span class="average">Moderate</span>
{{else data.occupant.fireLoss > 1}}
<span class="notgood">Minor</span>
{{else}}
<span class="good">None.</span>
{{/if}}
</div>
<div class ="line">
<div class ="statusLabel">=&gt; Organ Damage:</div>
{{if data.occupant.toxLoss > 50}}
<span class="bad">Major systemic organ failure detected.</span>
{{else data.occupant.toxLoss > 25}}
<span class="bad">Significant.</span>
{{else data.occupant.toxLoss > 10}}
<span class="average">Moderate.</span>
{{else data.occupant.toxLoss > 1}}
<span class="notgood">Minor.</span>
{{else}}
<span class="good"> None.</span>
{{/if}}
</div>
<div class="line">
<div class="statusLabel">=&gt; Oxygenation:</div>
{{if data.occupant.oxyLoss > 50}}
<span class="bad">Severe oxygen deprivation.</span>
{{else data.occupant.oxyLoss > 25}}
<span class="average">Moderate oxygen deprivation.</span>
{{else data.occupant.oxyLoss > 10}}
<span class="average">Low oxygen deprivation.</span>
{{else}}
<span class="good">Normal oxygenation levels.</span>
{{/if}}
</div>
{{/if}}
{{/if}}
<hr>
<div class="line">
<div class="statusLabel">Cell Temperature:</div><div class="statusValue">
<span class="{{:data.cellTemperatureStatus}}">{{:data.cellTemperature}} K</span>
</div>
</div>
</div>
<h3>Cryo Cell Operation</h3>
<div class="item">
<div class="itemLabel">
Cryo Cell Status:
</div>
<div class="itemContent" style="width: 40%;">
{{:helper.link('On', 'power', {'switchOn' : 1}, data.isOperating ? 'selected' : null)}}{{:helper.link('Off', 'close', {'switchOff' : 1}, data.isOperating ? null : 'selected')}}
</div>
<div class="itemContent" style="width: 26%;">
{{:helper.link('Eject Occupant', 'arrowreturnthick-1-s', {'ejectOccupant' : 1}, data.hasOccupant ? null : 'disabled')}}
</div>
</div>
<div class="item">&nbsp;</div>
<div class="item">
<div class="itemLabel">
Beaker:
</div>
<div class="itemContent" style="width: 40%;">
{{if data.isBeakerLoaded}}
{{:data.beakerLabel ? data.beakerLabel : '<span class="average">No label</span>'}}<br>
{{if data.beakerVolume}}
<span class="highlight">{{:data.beakerVolume}} units remaining</span><br>
{{else}}
<span class="bad">Beaker is empty</span>
{{/if}}
{{else}}
<span class="average"><i>No beaker loaded</i></span>
{{/if}}
</div>
<div class="itemContent" style="width: 26%;">
{{:helper.link('Eject Beaker', 'eject', {'ejectBeaker' : 1}, data.isBeakerLoaded ? null : 'disabled')}}
</div>
</div>
-125
View File
@@ -1,125 +0,0 @@
<div class="item">
<div class="itemContent">
{{:helper.link('Close', 'gear', {'close' : 1}, null, 'fixedLeft')}}
</div>
</div>
{{if data.busy}}
<h5 class='average'>The Splicer is currently busy.</h5>
<div class='notice'>
<center><span class='bad'>{{:data.busy}}</span></center>
</div>
<p>
Thank you for your patience!
</p>
{{else}}
<div class="item">
<h2>Virus Dish</h2>
</div>
<div class="item">
{{:helper.link('Eject Dish', 'eject', { 'eject' : 1 }, data.dish_inserted ? null : 'disabled')}}
</div>
<div class="item">
<div class="itemLabel">
<b>Growth Density:</b>
</div>
<div class="itemContent">
{{:helper.displayBar(data.growth, 0, 100, (data.growth >= 50) ? 'good' : data.growth >= 25 ? 'average' : 'bad', data.growth + '%' )}}
</div>
</div>
<div class="statusDisplay" style="height: 145px; overflow: auto;">
<div class='item'>
{{if !data.info}}
<div class='itemLabel'>
<span class='good'>Symptoms:</span>
</div>
{{/if}}
<div class='itemContent' style="width: 100%;">
{{if data.info}}
<span class='average'>{{:data.info}}</span>
{{else}}
{{for data.effects}}
<div>
<div class="highlight">
({{:value.stage}}) {{:value.name}}
{{if value.badness > 1}}
<span class='bad'><b>Dangerous</b></span>
{{/if}}
</div>
</div>
{{/for}}
{{/if}}
</div>
</div>
{{if data.affected_species && !data.info}}
<div class='item'>
<div class='itemLabelWide'>
<span class='good'>Affected Species:</span>
</div>
<div class='itemContent'>
<span class='highlight'>{{:data.affected_species}}</span>
</div>
</div>
{{/if}}
</div>
{{if data.effects}}
<div class='item'>
<span class="bad"><i>CAUTION: Reverse engineering will destroy the viral sample.</i></span>
</div>
<div class='item'>
<div class='itemLabelWide'>
Reverse Engineering:
</div>
<div class='itemContent'>
{{for data.effects}}
{{:helper.link(value.stage, 'transferthick-e-w', { 'grab' : value.reference })}}
{{/for}}
</div>
<div class='itemContent'>
{{:helper.link('Species', 'transferthick-e-w', { 'affected_species' : 1 })}}
</div>
</div>
{{/if}}
<div class="item">
<h2>Storage</h2>
</div>
<div class='item'>
<div class='itemLabel'>
<b>Memory Buffer:</b>
</div>
<div class='itemContent'>
{{if data.buffer}}
{{:data.buffer.name}} ({{:data.buffer.stage}})
{{else}}
{{if data.species_buffer}}
{{:data.species_buffer}}
{{else}}
Empty
{{/if}}
{{/if}}
</div>
</div>
{{:helper.link('Save To Disk', 'disk', { 'disk' : 1 }, (data.buffer || data.species_buffer) ? null : 'disabled')}}
{{if data.species_buffer}}
{{:helper.link('Splice Species', 'pencil', { 'splice' : 5 }, (data.species_buffer && !data.info) ? null : 'disabled')}}
{{else data.buffer}}
{{:helper.link('Splice #1', 'pencil', { 'splice' : 1 }, data.buffer.stage > 1 ? 'disabled' : null)}}
{{:helper.link('Splice #2', 'pencil', { 'splice' : 2 }, data.buffer.stage > 2 ? 'disabled' : null)}}
{{:helper.link('Splice #3', 'pencil', { 'splice' : 3 }, data.buffer.stage > 3 ? 'disabled' : null)}}
{{:helper.link('Splice #4', 'pencil', { 'splice' : 4 }, data.buffer.stage > 4 ? 'disabled' : null)}}
{{/if}}
{{/if}}
-123
View File
@@ -1,123 +0,0 @@
<div class="item">
<div class="itemContent">
{{:helper.link('Close', 'gear', {'close' : '1'}, null, 'fixedLeft')}}
</div>
</div>
<div class="item">
<h2>Environmental Conditions</h2>
</div>
<div class="item">
<div class="itemLabel">
Power:
</div>
<div class="itemContent">
{{:helper.link('On', 'power', { 'power' : 1 }, !data.dish_inserted ? 'disabled' : data.on ? 'selected' : null)}}{{:helper.link('Off', 'close', { 'power' : 1 }, data.on ? null : 'selected')}}
</div>
</div>
<div class='item'>
{{:helper.link('Add Radiation', 'radiation', {'rad' : 1})}}
{{:helper.link('Flush System', 'trash', {'flush' : 1}, data.system_in_use ? null : 'disabled')}}
</div>
<div class="statusDisplay" style="height: 100px; overflow: auto;">
<div class='item'>
<div class="itemLabel">
<span class='good'>Virus Food:</span>
</div>
<div class="itemContent">
{{:helper.displayBar(data.food_supply, 0, 100, 'good', data.food_supply)}}
</div>
</div>
<div class='item'>
<div class="itemLabel">
<span class='good'>Radiation Level:</span>
</div>
<div class="itemContent">
{{:helper.displayBar(data.radiation, 0, 100, (data.radiation >= 50) ? 'bad' : (data.growth >= 25) ? 'average' : 'good')}}
<br/>
{{:helper.formatNumber(data.radiation * 10000)}} <acronym title='In microSieverts'>&micro;Sv</acronym>
</div>
</div>
<div class='item'>
<div class="itemLabel">
<span class='good'>Toxicity:</span>
</div>
<div class="itemContent">
{{:helper.displayBar(data.toxins, 0, 100, (data.toxins >= 50) ? 'bad' : (data.toxins >= 25) ? 'average' : 'good', data.toxins + '%')}}
</div>
</div>
</div>
<div class="item">
<h2>Chemicals</h2>
</div>
<div class='item'>
{{:helper.link('Eject Chemicals', 'eject', { 'ejectchem' : 1 }, data.chemicals_inserted ? null : 'disabled')}}
{{:helper.link('Breed Virus', 'circle-arrow-s', { 'virus' : 1 }, data.can_breed_virus ? null : 'disabled')}}
</div>
{{if data.chemicals_inserted}}
<div class='item'>
<div class='itemLabel'>
Volume:
</div>
<div class='itemContent'>
{{:helper.displayBar(data.chemical_volume, 0, data.max_chemical_volume, 'good', data.chemical_volume + ' / ' + data.max_chemical_volume)}}
</div>
</div>
<div class='item'>
<div class='itemLabel'>
Breeding Environment:
</div>
<div class='itemContent'>
<span class='{{:data.can_breed_virus ? "good" : "average"}}'>
{{:!data.dish_inserted ? 'N/A' : data.can_breed_virus ? 'Suitable' : 'No hemolytic samples detected'}}
</span>
{{if data.blood_already_infected}}
<br/>
<span class='bad'><i>CAUTION: Viral infection detected in blood sample.</i></span>
{{/if}}
</div>
</div>
{{else}}
<div class='item'>
<span class='average'>No chemicals inserted.</span>
</div>
{{/if}}
<div class="item">
<h2>Virus Dish</h2>
</div>
<div class='item'>
{{:helper.link('Eject Dish', 'eject', {'ejectdish' : 1}, data.dish_inserted ? null : 'disabled')}}
</div>
{{if data.dish_inserted}}
{{if data.virus}}
<div class="item">
<div class="itemLabel">
<b>Growth Density:</b>
</div>
<div class="itemContent">
{{:helper.displayBar(data.growth, 0, 100, (data.growth >= 50) ? 'good' : (data.growth >= 25) ? 'average' : 'bad', data.growth + '%' )}}
</div>
</div>
<div class='item'>
<div class='itemLabel'>
<b>Infection Rate:</b>
</div>
<div class='itemContent'>
{{:data.analysed ? data.infection_rate : "Unknown"}}
</div>
</div>
{{else}}
<div class="item">
<span class='average'>No virus detected.</span>
</div>
{{/if}}
{{else}}
<div class="item">
<span class='average'>No dish loaded.</span>
</div>
{{/if}}
-318
View File
@@ -1,318 +0,0 @@
<!--
Title: DNA Modifier UI
Used In File(s): D:\Development\SS13-BS12\code\game\dna\dna_modifier.dm
-->
<h3>Status</h3>
<div class="statusDisplay">
{{if !data.hasOccupant}}
<div class="line">Cell Unoccupied</div>
{{else}}
<div class="line">
{{:data.occupant.name}}&nbsp;=>&nbsp;
{{if data.occupant.stat == 0}}
<span class="good">Conscious</span>
{{else data.occupant.stat == 1}}
<span class="average">Unconscious</span>
{{else}}
<span class="bad">DEAD</span>
{{/if}}
</div>
{{if !data.occupant.isViableSubject || !data.occupant.uniqueIdentity || !data.occupant.structuralEnzymes}}
<div class="notice">
The occupant's DNA structure is ruined beyond recognition, please insert a subject with an intact DNA structure.
</div>
{{else data.occupant.stat < 2}}
<div class="line">
<div class="statusLabel">Health:</div>
{{if data.occupant.health >= 0}}
{{:helper.displayBar(data.occupant.health, 0, data.occupant.maxhealth, 'good')}}
{{else}}
{{:helper.displayBar(data.occupant.health, 0, data.occupant.minHealth, 'average alignRight')}}
{{/if}}
<div class="statusValue">{{:helper.round(data.occupant.health)}}</div>
</div>
<div class="line">
<div class="statusLabel">Radiation:</div>
{{:helper.displayBar(data.occupant.radiationLevel, 0, 100, 'average')}}
<div class="statusValue">{{:helper.round(data.occupant.radiationLevel)}}</div>
</div>
<div class="line">
<div class="statusLabel">Unique Enzymes:</div>
<div class="statusValue">{{:data.occupant.uniqueEnzymes ? data.occupant.uniqueEnzymes : '<span class="bad">Unknown</span>'}}</div>
</div>
<!--<div class="line">
<div class="statusLabel"><small>Unique Identifier:</small></div>
<div class="statusValue"><small>{{:data.occupant.uniqueIdentity}}</small></div>
</div>
<div class="line">
<div class="statusLabel"><small>Structural Enzymes:</small></div>
<div class="statusValue"><small>{{:data.occupant.structuralEnzymes}}</small></div>
</div>-->
{{/if}}
{{/if}}
<div class="clearBoth"></div>
</div>
<h3>Operations</h3>
<div class="item">
{{:helper.link('Modify U.I.', 'link', {'selectMenuKey' : 'ui'}, data.selectedMenuKey == 'ui' ? 'selected' : null)}}
{{:helper.link('Modify S.E.', 'link', {'selectMenuKey' : 'se'}, data.selectedMenuKey == 'se' ? 'selected' : null)}}
{{:helper.link('Transfer Buffers', 'disk', {'selectMenuKey' : 'buffer'}, data.selectedMenuKey == 'buffer' ? 'selected' : null)}}
{{:helper.link('Rejuvenators', 'plusthick', {'selectMenuKey' : 'rejuvenators'}, data.selectedMenuKey == 'rejuvenators' ? 'selected' : null)}}
</div>
<div class="item">&nbsp;</div>
{{if !data.selectedMenuKey || data.selectedMenuKey == 'ui'}}
<h3>Modify Unique Identifier</h3>
{{:helper.displayDNABlocks(data.occupant.uniqueIdentity, data.selectedUIBlock, data.selectedUISubBlock, data.dnaBlockSize, 'UI')}}
<div class="clearBoth"></div>
<div class="item">
<div class="itemLabelNarrow">
Target:
</div>
<div class="itemContentWide">
{{:helper.link('-', null, {'changeUITarget' : 0}, (data.selectedUITarget > 0) ? null : 'disabled')}}
<div class="statusValue">&nbsp;{{:data.selectedUITargetHex}}&nbsp;</div>
{{:helper.link('+', null, {'changeUITarget' : 1}, (data.selectedUITarget < 15) ? null : 'disabled')}}
</div>
</div>
<div class="item">
<div class="itemContentWide">
{{:helper.link('Irradiate Block', 'radiation', {'pulseUIRadiation' : 1}, !data.occupant.isViableSubject ? 'disabled' : null)}}
</div>
</div>
{{else data.selectedMenuKey == 'se'}}
<h3>Modify Structural Enzymes</h3>
{{:helper.displayDNABlocks(data.occupant.structuralEnzymes, data.selectedSEBlock, data.selectedSESubBlock, data.dnaBlockSize, 'SE')}}
<div class="clearBoth"></div>
<div class="item">
<div class="itemContentWide">
{{:helper.link('Irradiate Block', 'radiation', {'pulseSERadiation' : 1}, !data.occupant.isViableSubject ? 'disabled' : null)}}
</div>
</div>
{{else data.selectedMenuKey == 'buffer'}}
<h3>Transfer Buffers</h3>
{{for data.buffers}}
<h4>Buffer {{:(index + 1)}}</h4>
<div class="itemGroup">
<div class="item">
<div class="itemLabelNarrow">
Load Data:
</div>
<div class="itemContentWide">
{{:helper.link('Subject U.I.', 'link', {'bufferOption' : 'saveUI', 'bufferId' : (index + 1)}, !data.hasOccupant ? 'disabled' : null)}}
{{:helper.link('Subject U.I. + U.E.', 'link', {'bufferOption' : 'saveUIAndUE', 'bufferId' : (index + 1)}, !data.hasOccupant ? 'disabled' : null)}}
{{:helper.link('Subject S.E.', 'link', {'bufferOption' : 'saveSE', 'bufferId' : (index + 1)}, !data.hasOccupant ? 'disabled' : null)}}
{{:helper.link('From Disk', 'disk', {'bufferOption' : 'loadDisk', 'bufferId' : (index + 1)}, (!data.hasDisk || !data.disk.data) ? 'disabled' : null)}}
</div>
</div>
{{if value.data}}
<div class="item">
<div class="itemLabelNarrow">
Label:
</div>
<div class="itemContentWide">
{{:helper.link(value.label, 'document-b', {'bufferOption' : 'changeLabel', 'bufferId' : (index + 1)})}}
</div>
</div>
<div class="item">
<div class="itemLabelNarrow">
Subject:
</div>
<div class="itemContentWide">
{{:value.owner ? value.owner : '<span class="average">Unknown</span>'}}
</div>
</div>
<div class="item">
<div class="itemLabelNarrow">
Stored Data:
</div>
<div class="itemContentWide">
{{:value.data == 'ui' ? 'Unique Identifiers' : 'Structural Enzymes'}}
{{:value.ue ? ' + Unique Enzymes' : ''}}
</div>
</div>
{{else}}
<div class="item">
<div class="itemContentWide">
<span class="highlight">This buffer is empty.</span>
</div>
</div>
{{/if}}
<div class="item">
<div class="itemLabelNarrow">
Options:
</div>
<div class="itemContentWide">
{{:helper.link('Clear', 'trash', {'bufferOption' : 'clear', 'bufferId' : (index + 1)}, !value.data ? 'disabled' : null)}}
{{:helper.link('Injector', data.isInjectorReady ? 'pencil' : 'clock', {'bufferOption' : 'createInjector', 'bufferId' : (index + 1)}, (!data.isInjectorReady || !value.data) ? 'disabled' : null)}}
{{:helper.link('Block Injector', data.isInjectorReady ? 'pencil' : 'clock', {'bufferOption' : 'createInjector', 'bufferId' : (index + 1), 'createBlockInjector' : 1}, (!data.isInjectorReady || !value.data) ? 'disabled' : null)}}
{{:helper.link('Transfer', 'radiation', {'bufferOption' : 'transfer', 'bufferId' : (index + 1)}, (!data.hasOccupant || !value.data) ? 'disabled' : null)}}
{{:helper.link('Save To Disk', 'disk', {'bufferOption' : 'saveDisk', 'bufferId' : (index + 1)}, (!value.data || !data.hasDisk) ? 'disabled' : null)}}
</div>
</div>
</div>
{{/for}}
<h4>Data Disk</h4>
<div class="itemGroup">
{{if data.hasDisk}}
{{if data.disk.data}}
<div class="item">
<div class="itemLabelNarrow">
Label:
</div>
<div class="itemContentWide">
{{:data.disk.label ? data.disk.label : 'No Label'}}
</div>
</div>
<div class="item">
<div class="itemLabelNarrow">
Subject:
</div>
<div class="itemContentWide">
{{:data.disk.owner ? data.disk.owner : '<span class="average">Unknown</span>'}}
</div>
</div>
<div class="item">
<div class="itemLabelNarrow">
Stored Data:
</div>
<div class="itemContentWide">
{{:data.disk.data == 'ui' ? 'Unique Identifiers' : 'Structural Enzymes'}}
{{:data.disk.ue ? ' + Unique Enzymes' : ''}}
</div>
</div>
{{else}}
<div class="item">
<div class="itemContentWide">
<span class="average">Disk is blank.</span>
</div>
</div>
{{/if}}
{{else}}
<div class="item">
<div class="itemContentWide">
<span class="highlight">No disk inserted.</span>
</div>
</div>
{{/if}}
<div class="item">
<div class="itemLabelNarrow">
Options:
</div>
<div class="itemContentWide">
{{:helper.link('Wipe Disk', 'trash', {'bufferOption' : 'wipeDisk'}, (!data.hasDisk || !data.disk.data) ? 'disabled' : null)}}
{{:helper.link('Eject Disk', 'eject', {'bufferOption' : 'ejectDisk'}, !data.hasDisk ? 'disabled' : null)}}
</div>
</div>
</div>
{{else data.selectedMenuKey == 'rejuvenators'}}
<h3>Rejuvenators</h3>
<div class="item">
<div class="itemLabelNarrow">
Inject:
</div>
<div class="itemContentWide">
{{:helper.link('5', 'pencil', {'injectRejuvenators' : 5}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}}
{{:helper.link('10', 'pencil', {'injectRejuvenators' : 10}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}}
{{:helper.link('20', 'pencil', {'injectRejuvenators' : 20}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}}
{{:helper.link('30', 'pencil', {'injectRejuvenators' : 30}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}}
{{:helper.link('50', 'pencil', {'injectRejuvenators' : 50}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}}
</div>
</div>
<div class="item">&nbsp;</div>
<div class="item">
<div class="itemLabelNarrow">
Beaker:
</div>
<div class="itemContentWide" style="width: 40%;">
{{if data.isBeakerLoaded}}
{{:data.beakerLabel ? data.beakerLabel : '<span class="average">No label</span>'}}<br>
{{if data.beakerVolume}}
<span class="highlight">{{:data.beakerVolume}} units remaining</span><br>
{{else}}
<span class="bad">Beaker is empty</span>
{{/if}}
{{else}}
<span class="average"><i>No beaker loaded</i></span>
{{/if}}
</div>
<div class="itemContentWide" style="width: 26%;">
{{:helper.link('Eject Beaker', 'eject', {'ejectBeaker' : 1}, data.isBeakerLoaded ? null : 'disabled')}}
</div>
</div>
{{/if}}
<div class="item">&nbsp;</div>
{{if !data.selectedMenuKey || data.selectedMenuKey == 'ui' || data.selectedMenuKey == 'se'}}
<h3>Radiation Emitter Settings</h3>
<div class="item">
<div class="itemLabelNarrow">
Intensity:
</div>
<div class="itemContentWide">
{{:helper.link('-', null, {'radiationIntensity' : 0}, (data.radiationIntensity > 1) ? null : 'disabled')}}
<div class="statusValue">&nbsp;{{:data.radiationIntensity}}&nbsp;</div>
{{:helper.link('+', null, {'radiationIntensity' : 1}, (data.radiationIntensity < 10) ? null : 'disabled')}}
</div>
</div>
<div class="item">
<div class="itemLabelNarrow">
Duration:
</div>
<div class="itemContentWide">
{{:helper.link('-', null, {'radiationDuration' : 0}, (data.radiationDuration > 2) ? null : 'disabled')}}
<div class="statusValue">&nbsp;{{:data.radiationDuration}}&nbsp;</div>
{{:helper.link('+', null, {'radiationDuration' : 1}, (data.radiationDuration < 20) ? null : 'disabled')}}
</div>
</div>
<div class="item">
<div class="itemLabelNarrow">
&nbsp;
</div>
<div class="itemContentWide">
{{:helper.link('Pulse Radiation', 'radiation', {'pulseRadiation' : 1}, !data.hasOccupant ? 'disabled' : null)}}
</div>
</div>
{{/if}}
<div class="item">&nbsp;</div>
<hr>
<div class="item">
<div class="itemLabelNarrow">
Occupant:
</div>
<div class="itemContentWide">
{{:helper.link('Eject Occupant', 'eject', {'ejectOccupant' : 1}, data.locked || !data.hasOccupant || data.irradiating ? 'disabled' : null)}}
</div>
</div>
<div class="item">
<div class="itemLabelNarrow">
Door Lock:
</div>
<div class="itemContentWide">
{{:helper.link('Engaged', 'locked', {'toggleLock' : 1}, data.locked ? 'selected' : !data.hasOccupant ? 'disabled' : null)}}
{{:helper.link('Disengaged', 'unlocked', {'toggleLock' : 1}, !data.locked ? 'selected' : data.irradiating ? 'disabled' : null)}}
</div>
</div>
{{if data.irradiating}}
<div class="mask">
<div class="maskContent">
<h1>Irradiating Subject</h1>
<h3>For {{:data.irradiating}} seconds.</h3>
</div>
</div>
{{/if}}
-24
View File
@@ -1,24 +0,0 @@
{{if data.screen == 0}}
{{for data.beacons}}
<hr>
<b>Name:</b> {{:value.name}}<br>
<b>Integrity:</b> {{:value.health}}%<br>
<b>Cell charge:</b> {{:value.charge}}<br>
<b>Airtank:</b> {{:value.air}}kPa<br>
<b>Pilot:</b> {{:value.pilot || "None"}}<br>
<b>Location:</b> {{:value.location}}<br>
<b>Active equipment:</b> {{:value.active}}<br>
{{:helper.link("Send Message", null, {'send_message' : value.ref}, (value.pilot) ? null : 'disabled')}}
{{:helper.link("Get Log", null, {'get_log' : value.ref})}}
{{if value.control == 1}}
{{:helper.link("Terminate", null, {'shock' : value.ref})}}
{{/if}}
{{empty}}
<hr>
No active beacons detected
{{/for}}
{{else}}
<h3>Log Contents</h3><br><hr>
{{:helper.link("Return", null, {'return' : 0})}}<br>
{{:data.log}}
{{/if}}
-142
View File
@@ -1,142 +0,0 @@
<div class="item">
<div class="itemLabel">
Total Output:
</div>
<div class="itemContent">
{{:helper.displayBar(data.totalOutput, 0, data.maxTotalOutput)}}
</div>
<div class="itemContent">
{{:helper.fixed(data.totalOutput, 1)}} kW
</div>
</div>
<div class="item">
<div class="itemLabel">
Thermal Output:
</div>
<div class="itemContent">
{{:helper.fixed(data.thermalOutput, 1)}} kW
</div>
</div>
<hr>
{{if data.circConnected}}
<table style="width:100%">
<tr>
<td>
<div class="statusDisplay">
<center><h2>Primary Circulator ({{:data.primaryDir}})</h2></center>
<div class="item">
<div class="itemLabel">
Turbine Output:
</div>
<div align='center' class="itemContent">
{{:helper.fixed(data.primaryOutput, 1)}} kW
</div>
</div>
<div class="item">
<div class="itemLabel">
Flow Capacity:
</div>
<div align='center' class="itemContent">
{{:helper.fixed(data.primaryFlowCapacity, 1)}} %
</div>
</div>
<br>
<div class="item">
<div class="itemLabel">
Inlet Pressure:
</div>
<div align='center' class="itemContent">
{{:helper.fixed(data.primaryInletPressure, 1)}} kPa
</div>
</div>
<div class="item">
<div class="itemLabel">
Inlet Temperature:
</div>
<div align='center' class="itemContent">
{{:helper.fixed(data.primaryInletTemperature, 1)}} K
</div>
</div>
<br>
<div class="item">
<div class="itemLabel">
Outlet Pressure:
</div>
<div align='center' class="itemContent">
{{:helper.fixed(data.primaryOutletPressure, 1)}} kPa
</div>
</div>
<div class="item">
<div class="itemLabel">
Outlet Temperature:
</div>
<div align='center' class="itemContent">
{{:helper.fixed(data.primaryOutletTemperature, 1)}} K
</div>
</div>
</div>
</td>
<td>
<div class="statusDisplay">
<center><h2>Secondary Circulator ({{:data.secondaryDir}})</h2></center>
<div class="item">
<div class="itemLabel">
Turbine Output:
</div>
<div align='center' class="itemContent">
{{:helper.fixed(data.secondaryOutput, 1)}} kW
</div>
</div>
<div class="item">
<div class="itemLabel">
Flow Capacity:
</div>
<div align='center' class="itemContent">
{{:helper.fixed(data.secondaryFlowCapacity, 1)}} %
</div>
</div>
<br>
<div class="item">
<div class="itemLabel">
Inlet Pressure:
</div>
<div align='center' class="itemContent">
{{:helper.fixed(data.secondaryInletPressure, 1)}} kPa
</div>
</div>
<div class="item">
<div class="itemLabel">
Inlet Temperature:
</div>
<div align='center' class="itemContent">
{{:helper.fixed(data.secondaryInletTemperature, 1)}} K
</div>
</div>
<br>
<div class="item">
<div class="itemLabel">
Outlet Pressure:
</div>
<div align='center' class="itemContent">
{{:helper.fixed(data.secondaryOutletPressure, 1)}} kPa
</div>
</div>
<div class="item">
<div class="itemLabel">
Outlet Temperature:
</div>
<div align='center' class="itemContent">
{{:helper.fixed(data.secondaryOutletTemperature, 1)}} K
</div>
</div>
</div>
</td>
</tr>
</table>
{{else}}
<div class="notice">
ERROR: Both circulators must be connected!
</div>
{{/if}}
-66
View File
@@ -1,66 +0,0 @@
{{if data.temp }}
<center>
<table>
<tr><td>{{:data.temp }}</td>
<tr><td>{{:helper.link('Continue', null, {'PRG_continue' : 1})}}</td>
</table>
</center>
{{else}}
<center><h3>Balance: {{:data.bank}} Credits</h3><br>
{{if data.mode}}
<div>
<div style="float: left">{{:helper.link('<=', null, {'PRG_scroll' : 'left'})}}</div>
<div>{{:helper.link('Main Menu', null, {'PRG_main_menu' : 1})}}</div>
<div style="float: right">{{:helper.link('=>', null, {'PRG_scroll' : 'right'})}}</div>
</div>
<center><h3>{{:data.traderName}}</h3><br>
Signal Origin: {{:data.origin}}<br>
{{if data.last_comms}}
<i>{{:data.last_comms}}</i>
{{/if}}
</center>
<br>
{{if data.hailed}}
{{if data.trades}}
{{:helper.link('Go Back', null, {'PRG_show_trades' : 1})}}
<br><br>
<h3>Trade Goods</h3>
<table>
{{for data.trades}}
<tr><td>{{:value}}</td>
<td>{{:helper.link('Trade', null, {'PRG_offer_item' : index})}}</td>
<td>{{:helper.link('Money', null, {'PRG_offer_money_for_item' : index})}}</td>
<td>{{:helper.link('Bulk', null, {'PRG_bulk_money_for_item' : index})}}</td>
<td>{{:helper.link('Ask Cost', null, {'PRG_how_much_do_you_want' : index})}}</td>
{{/for}}
</table>
{{else}}
{{:helper.link('List Goods', null, {'PRG_show_trades' : 1})}}<br><br>
{{:helper.link('Sell Items', null, {'PRG_sell_items' : 1})}}<br><br>
{{:helper.link('Compliment', null, {'PRG_compliment' : 1})}}<br><br>
<span class=itemLabel>Pay them to stay longer: </span><span class=itemContent>{{:helper.link('100', null, {'PRG_bribe' : 100})}} {{:helper.link('500', null, {'PRG_bribe' : 500})}} {{:helper.link('1000', null, {'PRG_bribe' : 1000})}}</span><br><br>
{{:helper.link('Ask What They Want', null, {'PRG_what_do_you_want': 1})}}<br><br>
{{:helper.link('Insult', null, {'PRG_insult' : 1})}}<br><br>
{{/if}}
{{else}}
{{:helper.link('Hail',null,{'PRG_hail': 1})}}
{{/if}}
{{else}}
<center>
<h2>Main Menu</h2>
<table style="text-align:center">
<tr><td>{{:helper.link('Open Communications', null, {'PRG_merchant_list' : 1})}}</td>
<tr><td>{{:helper.link('Test Fire Transporter', null, {'PRG_test_fire': 1 })}}</td>
<tr><td>{{:helper.link('Connect Pad', null, {'PRG_connect_pad' : 1})}}
{{if data.pad}}
<font color="green">Connected</font>
{{else}}
<font color="red">DISCONNECTED</font>
{{/if}}
</td>
<tr><td>{{:helper.link('Deposit Money', null, {'PRG_transfer_to_bank' : 1})}}</td>
<tr><td>{{:helper.link('Retrieve Money', null, {'PRG_get_money' : 1})}}</td>
</table>
</center>
{{/if}}
{{/if}}
-74
View File
@@ -1,74 +0,0 @@
{{if data.message}}
<div class='item'>
{{:data.message}}
{{:helper.link('CLEAR', null, { "PRG_clearmessage" : 1 })}}
</div>
{{/if}}
{{if data.article}}
Viewing: {{:data.title}}<br>
{{:helper.link('CLOSE', null, { "PRG_reset" : 1 })}}
{{:helper.link('SAVE', null, { "PRG_savearticle" : 1 })}}
<br><br>
{{:data.article}}
{{else data.download_running}}
Downloading file...<br><br>
<div class='item'>
<div class='itemLabel'>
Progress:
</div>
<div class='itemContent'>
{{:helper.displayBar(data.download_progress, 0, data.download_maxprogress, 'good')}}
{{:data.download_progress}} / {{:data.download_maxprogress}} GQ
</div>
<div class='itemLabel'>
Download speed:
</div>
<div class='itemContent'>
{{:data.download_rate}} GQ/s
</div>
<div class='itemLabel'>
Controls:
</div>
<div class='itemContent'>
{{:helper.link('ABORT', null, { "PRG_reset" : 1 })}}
</div>
</div>
{{else}}
<h3>Listing available files</h3>
<div class='item'>
<div class='itemLabel'>
Show archived files:
</div>
<div class='itemContent'>
{{if data.showing_archived}}
{{:helper.link('YES', null, { "PRG_toggle_archived" : 1 })}}
{{else}}
{{:helper.link('NO', null, { "PRG_toggle_archived" : 1 })}}
{{/if}}
</div>
</div>
<br><hr>
{{for data.all_articles}}
<div class='item'>
<div class='itemLabel'>
Name:
</div>
<div class='itemContent'>
{{:value.name}}
</div>
<div class='itemLabel'>
Size:
</div>
<div class='itemContent'>
{{:value.size}} GQ
</div>
<div class='itemLabel'>
Actions:
</div>
<div class='itemContent'>
{{:helper.link('OPEN', null, { "PRG_openarticle" : value.uid })}}
</div>
</div>
{{/for}}
{{/if}}
-22
View File
@@ -1,22 +0,0 @@
{{:helper.syndicateMode()}}
{{if data.error}}
##SYSTEM ERROR: {{:data.error}}{{:helper.link('RESET', null, { 'PRG_reset' : 1 })}}
{{else data.target}}
##DoS traffic generator active. Tx: {{:data.speed}}GQ/s<br>
{{for data.dos_strings}}
{{:value}}<br>
{{/for}}
{{:helper.link('ABORT', null, { 'PRG_reset' : 1 })}}
{{else}}
##DoS traffic generator ready. Select target device.<br>
{{if data.focus}}
Targeted device ID: {{:data.focus}}
{{else}}
Targeted device ID: None
{{/if}}
{{:helper.link('EXECUTE', null, { 'PRG_execute' : 1 })}}<div style="clear:both"></div>
Detected devices on network:<br>
{{for data.relays}}
{{:helper.link(value , null, { 'PRG_target_relay' : value })}}
{{/for}}
{{/if}}
-94
View File
@@ -1,94 +0,0 @@
{{if data.error}}
<div class='item'>
<h2>An error has occured during operation...</h2>
<b>Additional information: </b>{{:data.error}}<br>
{{:helper.link('Clear', null, {'PRG_reset' : 1})}}
</div>
{{else data.downloading}}
<h2>Download in progress...</h2>
<div class="itemLabel">
Downloaded file:
</div>
<div class="itemContent">
{{:data.download_name}}
</div>
<div class="itemLabel">
Download progress:
</div>
<div class="itemContent">
{{:data.download_progress}} / {{:data.download_size}} GQ
</div>
<div class="itemLabel">
Transfer speed:
</div>
<div class="itemContent">
{{:data.download_netspeed}}GQ/s
</div>
<div class="itemLabel">
Controls:
</div>
<div class="itemContent">
{{:helper.link('Abort download', null, {'PRG_reset' : 1})}}
</div>
{{else data.uploading}}
<h2>Server enabled</h2>
<div class="itemLabel">
Connected clients:
</div>
<div class="itemContent">
{{:data.upload_clients}}
</div>
<div class="itemLabel">
Provided file:
</div>
<div class="itemContent">
{{:data.upload_filename}}
</div>
<div class="itemLabel">
Server password:
</div>
<div class="itemContent">
{{if data.haspassword}}
ENABLED
{{else}}
DISABLED
{{/if}}
</div>
<div class="itemLabel">
Commands:
</div>
<div class="itemContent">
{{:helper.link('Set password', null, {'PRG_setpassword' : 1})}}
{{:helper.link('Exit server', null, {'PRG_reset' : 1})}}
</div>
{{else data.upload_filelist}}
<h2>File transfer server ready. Select file to upload: </h2>
<table>
<tr><th>File name<th>File size<th>Controls
{{for data.upload_filelist}}
<tr><td>{{:value.filename}}
<td>{{:value.size}}GQ
<td>{{:helper.link('Select', null, {'PRG_uploadfile' : value.uid})}}
{{/for}}
</table>
<hr>
{{:helper.link('Set password', null, { "PRG_setpassword" : 1 })}}
{{:helper.link('Return', null, { "PRG_reset" : 1 })}}
{{else}}
<h2>Available files:</h2>
<table border="1" style="border-collapse: collapse"><tr><th>Server UID<th>File Name<th>File Size<th>Password Protection<th>Operations
{{for data.servers}}
<tr><td>{{:value.uid}}
<td>{{:value.filename}}
<td>{{:value.size}}GQ
{{if value.haspassword}}
<td>Enabled
{{else}}
<td>Disabled
{{/if}}
<td>{{:helper.link('Download', null, { "PRG_downloadfile" : value.uid })}}
{{/for}}
</table>
<hr>
{{:helper.link('Send file', null, { "PRG_uploadmenu" : 1 })}}
{{/if}}
-125
View File
@@ -1,125 +0,0 @@
<div class="item">
<div class="itemLabel">
Power:
</div>
<div class="itemContent">
{{:helper.link(data.power ? 'On' : 'Off', null, {'command' : 'power'}, data.config ? 'disabled' : null)}}
</div>
</div>
<div class="item">
<div class="itemLabel">
Config:
</div>
<div class="itemContent">
{{:helper.link('Configure', null, {'command' : 'configure'}, null, data.config ? 'selected' : null)}}
</div>
</div>
<div class="item">
<div class="itemLabel">
Set Flow Rate Limit:
</div>
<div class="itemContent">
<div class="statusValue">
{{if data.config}}
{{:helper.link(data.set_flow_rate/10, null, {'command' : 'set_flow_rate'})}} L/s
{{else}}
{{:(data.set_flow_rate/10)}} L/s
{{/if}}
</div>
</div>
</div>
<div class="item">
<div class="itemLabel">
Current Flow Rate:
</div>
<div class="itemContent">
<div class="statusValue">
{{:(data.last_flow_rate/10)}} L/s
</div>
</div>
</div>
<div class="item">
<div class="itemLabel">
Load:
</div>
<div class="itemContent">
{{:helper.displayBar(data.last_power_draw, 0, data.max_power_draw, (data.last_power_draw < data.max_power_draw - 5) ? 'good' : 'average')}}
<div class="statusValue">
{{:data.last_power_draw}} W
</div>
</div>
</div>
{{if data.config}}
<div class="item">
<div style="width: 315px; text-align: center">
<div style="float: left">
<div class="white" style="height: 26">Port</div>
{{for data.ports}}
<div class="average" style="height: 26">{{:value.dir}} Port</div>
{{/for}}
</div>
<div style="float: left; margin-left: 10">
<div class="white" style="height: 26">Input</div>
{{for data.ports}}
<div style="height: 26">
{{:helper.link(' ', null, {'command' : 'switch_mode', 'mode' : 'in', 'dir' : value.dir}, null, value.input ? 'selected' : null)}}
</div>
{{/for}}
</div>
<div style="float: left; margin-left: 10">
<div class="white" style="height: 26">Output</div>
{{for data.ports}}
<div style="height: 26">
{{:helper.link(' ', null, {'command' : 'switch_mode', 'mode' : 'out', 'dir' : value.dir}, null, value.output ? 'selected' : null)}}
</div>
{{/for}}
</div>
<div style="float: left; margin-left: 10">
<div class="white" style="height: 26">Filter</div>
{{for data.ports}}
<div style="height: 26">
{{:helper.link(value.f_type ? value.f_type : 'None', null, {'command' : 'switch_filter', 'mode' : value.f_type, 'dir' : value.dir}, value.filter ? null : 'disabled', value.f_type ? 'selected' : null)}}
</div>
{{/for}}
</div>
</div>
</div>
{{else}}
<div class="item">
<div style="width: 315px; text-align: center">
<div style="float: left">
<div class="white" style="height: 26">Port</div>
{{for data.ports}}
<div class="average" style="height: 26">{{:value.dir}} Port</div>
{{/for}}
</div>
<div style="float: left; margin-left: 10">
<div class="white" style="height: 26">Mode</div>
{{for data.ports}}
<div style="height: 26">
{{if value.input}}
Input
{{else value.output}}
Output
{{else value.f_type}}
{{:value.f_type}}
{{else}}
Disabled
{{/if}}
</div>
{{/for}}
</div>
</div>
</div>
{{/if}}
-141
View File
@@ -1,141 +0,0 @@
<div class="item">
<div class="itemLabel">
Power:
</div>
<div class="itemContent">
{{:helper.link(data.power ? 'On' : 'Off', null, {'command' : 'power'}, data.config ? 'disabled' : null)}}
</div>
</div>
<div class="item">
<div class="itemLabel">
Config:
</div>
<div class="itemContent">
{{:helper.link('Configure', null, {'command' : 'configure'}, null, data.config ? 'selected' : null)}}
</div>
</div>
<div class="item">
<div class="itemLabel">
Set Flow Rate Limit:
</div>
<div class="itemContent">
<div class="statusValue">
{{if data.config}}
{{:helper.link(data.set_flow_rate/10, null, {'command' : 'set_flow_rate'})}} L/s
{{else}}
{{:(data.set_flow_rate/10)}} L/s
{{/if}}
</div>
</div>
</div>
<div class="item">
<div class="itemLabel">
Current Flow Rate:
</div>
<div class="itemContent">
<div class="statusValue">
{{:(data.last_flow_rate/10)}} L/s
</div>
</div>
</div>
<div class="item">
<div class="itemLabel">
Load:
</div>
<div class="itemContent">
{{:helper.displayBar(data.last_power_draw, 0, data.max_power_draw, (data.last_power_draw < data.max_power_draw - 5) ? 'good' : 'average')}}
<div class="statusValue">
{{:data.last_power_draw}} W
</div>
</div>
</div>
{{if data.config}}
<div class="item">
<div style="width: 315px; text-align: center">
<div style="float: left">
<div class="white" style="height: 26">Port</div>
{{for data.ports}}
<div class="average" style="height: 26">{{:value.dir}} Port</div>
{{/for}}
</div>
<div style="float: left; margin-left: 10">
<div class="white" style="height: 26">Input</div>
{{for data.ports}}
<div style="height: 26">
{{:helper.link(' ', null, value.input ? {'command' : 'switch_mode', 'mode' : 'none', 'dir' : value.dir} : {'command' : 'switch_mode', 'mode' : 'in', 'dir' : value.dir}, value.output ? 'disabled' : null, value.input ? 'selected' : null)}}
</div>
{{/for}}
</div>
<div style="float: left; margin-left: 10">
<div class="white" style="height: 26">Output</div>
{{for data.ports}}
<div style="height: 26">
{{:helper.link(' ', null, value.output ? null : {'command' : 'switch_mode', 'mode' : 'out', 'dir' : value.dir}, null, value.output ? 'selected' : null)}}
</div>
{{/for}}
</div>
<div style="float: left; margin-left: 10">
<div class="white" style="height: 26">Concentration</div>
{{for data.ports}}
<div style="height: 26">
{{:helper.link( value.input ? helper.round(value.concentration*100)+' %' : '-', null, {'command' : 'switch_con', 'dir' : value.dir}, value.input ? null : 'disabled')}}
</div>
{{/for}}
</div>
<div style="float: left; margin-left: 10">
<div class="white" style="height: 26">Lock</div>
{{for data.ports}}
<div style="height: 26">
{{:helper.link(' ', value.con_lock ? 'locked' : 'unlocked', {'command' : 'switch_conlock', 'dir' : value.dir}, value.input ? null : 'disabled', value.con_lock ? 'selected' : null)}}
</div>
{{/for}}
</div>
</div>
</div>
{{else}}
<div class="item">
<div style="width: 315px; text-align: center">
<div style="float: left">
<div class="white" style="height: 26">Port</div>
{{for data.ports}}
<div class="average" style="height: 26">{{:value.dir}} Port</div>
{{/for}}
</div>
<div style="float: left; margin-left: 10">
<div class="white" style="height: 26">Mode</div>
{{for data.ports}}
<div style="height: 26">
{{if value.input}}
Input
{{else value.output}}
Output
{{else}}
Disabled
{{/if}}
</div>
{{/for}}
</div>
<div style="float: left; margin-left: 10">
<div class="white" style="height: 26">Concentration</div>
{{for data.ports}}
<div style="height: 26">
{{if value.input}}
{{:helper.round(value.concentration*100)}} %
{{else}}
-
{{/if}}
</div>
{{/for}}
</div>
</div>
</div>
{{/if}}
-136
View File
@@ -1,136 +0,0 @@
<div class="item">
<div class="itemLabel">
Status:
</div>
<div class="itemContent">
{{:helper.link('On', 'power', {'power' : 1}, data.on ? 'selected' : null)}}{{:helper.link('Off', 'close', {'power' : 1}, data.on ? null : 'selected')}}
</div>
</div>
<div class="item">
<div class="itemLabel">
Power Level:
</div>
<div class="itemContent">
{{:helper.link('1', null, {'setPower' : 1}, (data.powerSetting == 1)? 'selected' : null)}}
{{:helper.link('2', null, {'setPower' : 2}, (data.powerSetting == 2)? 'selected' : null)}}
{{:helper.link('3', null, {'setPower' : 3}, (data.powerSetting == 3)? 'selected' : null)}}
{{:helper.link('4', null, {'setPower' : 4}, (data.powerSetting == 4)? 'selected' : null)}}
{{:helper.link('5', null, {'setPower' : 5}, (data.powerSetting == 5)? 'selected' : null)}}
</div>
</div>
{{if data.phase == "filling"}}
<div class="item">
<div class="itemLabel">
Processing phase:
</div>
<div class="itemContent">
filling inner tank
</div>
</div>
<div class="item">
<div class="itemLabel">
Input pressure:
</div>
<div class="itemContent">
{{:data.air1Pressure}} kPa
</div>
</div>
<div class="item">
<div class="itemLabel">
Tank pressure:
</div>
<div class="itemContent">
{{:data.tankPressure}} kPa
</div>
</div>
<div class="item">
<div class="itemLabel">
Target tank pressure:
</div>
<div class="itemContent">
{{:data.targetPressure}} kPa
</div>
</div>
{{/if}}
{{if data.phase == "processing"}}
<div class="item">
<div class="itemLabel">
Processing phase:
</div>
<div class="itemContent">
processing gas mix
</div>
</div>
<div class="item">
<div class="itemLabel">
Processing rate:
</div>
<div class="itemContent">
{{:data.gasProcessed}} moles
</div>
</div>
<div class="item">
<div class="itemLabel">
Tank pressure:
</div>
<div class="itemContent">
{{:data.tankPressure}} kPa
</div>
</div>
<div class="item">
<div class="itemLabel">
CO2 content:
</div>
<div class="itemContent">
{{:data.co2}} %
</div>
</div>
<div class="item">
<div class="itemLabel">
O2 content:
</div>
<div class="itemContent">
{{:data.o2}} %
</div>
</div>
{{/if}}
{{if data.phase == "releasing"}}
<div class="item">
<div class="itemLabel">
Processing phase:
</div>
<div class="itemContent">
releasing processed gas mix
</div>
</div>
<div class="item">
<div class="itemLabel">
Tank pressure:
</div>
<div class="itemContent">
{{:data.tankPressure}} kPa
</div>
</div>
<div class="item">
<div class="itemLabel">
Output Pressure:
</div>
<div class="itemContent">
{{:data.air2Pressure}} kPa
</div>
</div>
<div class="item">
<div class="itemLabel">
Target release pressure:
</div>
<div class="itemContent">
{{:data.targetPressure}} kPa
</div>
</div>
{{/if}}
-107
View File
@@ -1,107 +0,0 @@
<div class='item'>
<h2>Menu</h2>
</div>
<div class="item">
{{if !data.isolating}}
{{:helper.link('Home', 'home', {'home' : 1}, data.state == 'home' ? 'disabled' : null, 'fixedLeft')}}
{{:helper.link('List', 'note', {'list' : 1}, data.state == 'list' ? 'disabled' : null, 'fixedLeft')}}
{{:helper.link('Pathogen', 'folder-open', {'entry' : 1}, data.state == 'entry' ? 'disabled' : null, 'fixedLeft')}}
{{/if}}
<br>
{{:helper.link('Close', 'gear', {'close' : 1}, null, 'fixedLeft')}}
{{:helper.link('Print', 'print', { 'print' : 1 }, data.can_print ? null : 'disabled', 'fixedLeft')}}
</div>
{{if data.isolating}}
<h5 class='average'>The Isolator is currently busy.</h5>
<div class='notice'>
<center><span class='bad'>Isolating pathogens...</span></center>
</div>
<p>
Thank you for your patience!
</p>
{{else}}
{{if data.state =="home"}}
<div class="item">
<h2>Blood Sample</h2>
</div>
<div class='item'>
{{:helper.link('Eject Syringe', 'eject', { 'eject' : 1 }, data.syringe_inserted ? null : 'disabled')}}
</div>
{{if data.syringe_inserted}}
<div class='statusDisplay'>
<span class='good'><b>Pathogens:</b></span>
{{if data.pathogen_pool}}
{{for data.pathogen_pool}}
<div class='item'>
<span class='highlight'><b><u>{{:index + 1}}. #{{:value.unique_id}}</u> {{:value.is_in_database ? "(Analysed)" : ""}}</b></span><br>
<span class='average'>{{:value.name}}:</span> {{:value.dna}}
</div>
{{/for}}
{{else}}
No pathogens detected.
{{/if}}
</div>
{{else}}
<div class='item'>
<span class='average'>No syringe loaded.</span>
</div>
{{/if}}
{{if data.pathogen_pool}}
<div class='item'>
<div class='itemLabelWide'>
Isolate Pathogens:
</div>
<div class='itemContent'>
{{for data.pathogen_pool}}
{{:helper.link('#' + value.unique_id, 'pencil', { 'isolate' : value.reference }, null, 'fixedLeft')}}
{{/for}}
</div>
</div>
<div class='item'>
<div class='itemLabelWide'>
Database Lookup:
</div>
<div class='itemContent'>
{{for data.pathogen_pool}}
{{if value.is_in_database}}
{{:helper.link('#' + value.unique_id, 'info', { 'entry' : 1, 'view' : value.record }, null, 'fixedLeft')}}
{{/if}}
{{/for}}
</div>
</div>
{{/if}}
{{else}}
{{if data.state == "list"}}
<div class='item'>
<h2>View Database</h2>
</div>
<div class='item'>
{{if data.database}}
{{for data.database}}
<div class='itemContent'>
<div class='highlight fixedLeft'>{{:value.name}}</div>
{{:helper.link('Details', 'circle-arrow-s', { 'entry' : 1, 'view' : value.record }, null, 'fixedLeft')}}
</div>
{{/for}}
{{else}}
<span class='average'>The viral database is empty.</span>
{{/if}}
</div>
{{else}}
{{if data.state == "entry"}}
{{if data.entry}}
<div class='item'>
<h2>{{:data.entry.name}}</h2>
</div>
<div class='statusDisplay'>
{{:data.entry.description}}
</div>
{{else}}
<span class='average'>No virus selected.</span>
{{/if}}
{{/if}}
{{/if}}
{{/if}}
{{/if}}
File diff suppressed because it is too large Load Diff
-100
View File
@@ -1,100 +0,0 @@
<h3>Pump Status</h3>
<div class="item">
<div class="itemLabel">
Tank Pressure:
</div>
<div class="itemContent">
{{:data.tankPressure}} kPa
</div>
</div>
<div class="item">
<div class="itemLabel">
Port Status:
</div>
<div class="itemContent">
{{:data.portConnected ? '<span class="good">Connected</span>' : '<span class="average">Disconnected</span>'}}
</div>
</div>
<div class="item">
<div class="itemLabel">
Load:
</div>
<div class="itemContent">
{{:data.powerDraw}} W
</div>
</div>
<div class="item">
<div class="itemLabel">
Cell Charge:
</div>
<div class="itemContent">
{{:helper.displayBar(data.cellCharge, 0, data.cellMaxCharge)}}
</div>
</div>
<h3>Holding Tank Status</h3>
{{if data.hasHoldingTank}}
<div class="item">
<div class="itemLabel">
Tank Label:
</div>
<div class="itemContent">
<div style="float: left; width: 180px;">{{:data.holdingTank.name}}</div> {{:helper.link('Eject', 'eject', {'remove_tank' : 1})}}
</div>
</div>
<div class="item">
<div class="itemLabel">
Tank Pressure:
</div>
<div class="itemContent">
{{:data.holdingTank.tankPressure}} kPa
</div>
</div>
{{else}}
<div class="item"><span class="average"><i>No holding tank inserted.</i></span></div>
<div class="item">&nbsp;</div>
{{/if}}
<h3>Power Regulator Status</h3>
<div class="item">
<div class="itemLabel">
Target Pressure:
</div>
<div class="itemContent">
{{:helper.displayBar(data.targetpressure, data.minpressure, data.maxpressure)}}
<div style="clear: both; padding-top: 4px;">
{{:helper.link('-', null, {'pressure_adj' : -1000}, (data.targetpressure > data.minpressure) ? null : 'disabled')}}
{{:helper.link('-', null, {'pressure_adj' : -100}, (data.targetpressure > data.minpressure) ? null : 'disabled')}}
{{:helper.link('-', null, {'pressure_adj' : -10}, (data.targetpressure > data.minpressure) ? null : 'disabled')}}
{{:helper.link('-', null, {'pressure_adj' : -1}, (data.targetpressure > data.minpressure) ? null : 'disabled')}}
<div style="float: left; width: 80px; text-align: center;">&nbsp;{{:data.targetpressure}} kPa&nbsp;</div>
{{:helper.link('+', null, {'pressure_adj' : 1}, (data.targetpressure < data.maxpressure) ? null : 'disabled')}}
{{:helper.link('+', null, {'pressure_adj' : 10}, (data.targetpressure < data.maxpressure) ? null : 'disabled')}}
{{:helper.link('+', null, {'pressure_adj' : 100}, (data.targetpressure < data.maxpressure) ? null : 'disabled')}}
{{:helper.link('+', null, {'pressure_adj' : 1000}, (data.targetpressure < data.maxpressure) ? null : 'disabled')}}
</div>
</div>
</div>
<div class="item">
<div class="itemLabel">
Power Switch:
</div>
<div class="itemContent">
{{:helper.link('On', 'unlocked', {'power' : 1}, data.on ? 'selected' : null)}} {{:helper.link('Off', 'locked', {'power' : 1}, data.on ? null : 'selected')}}
</div>
</div>
<div class="item">
<div class="itemLabel">
Pump Direction:
</div>
<div class="itemContent">
{{:helper.link('Out', 'arrowreturn-1-e', {'direction' : 1}, data.pump_dir ? 'selected' : null)}} {{:helper.link('In', 'arrowreturn-1-w', {'direction' : 1}, data.pump_dir ? null : 'selected')}}
</div>
</div>
-23
View File
@@ -1,23 +0,0 @@
{{:helper.syndicateMode()}}
<div class='item'>
<div class='itemLabel'>
Payload status:
</div>
<div class='itemContent'>
{{if data.armed}}
ARMED
{{else}}
DISARMED
{{/if}}
</div>
<div class='itemLabel'>
Controls:
</div>
<div class='itemContent'>
<table>
<tr><td>{{:helper.link('OBFUSCATE PROGRAM NAME', null, { 'PRG_obfuscate' : 1 })}}
<tr><td>{{:helper.link(data.armed ? 'DISARM' : 'ARM', null, { 'PRG_arm' : 1 })}}
{{:helper.link('ACTIVATE', 'radiation', { 'PRG_activate' : 1 }, data.armed ? null : 'disabled', data.armed ? 'redButton' : null)}}
</table>
</div>
</div>
-99
View File
@@ -1,99 +0,0 @@
<style>
.lb{border-left: #222222 solid 6px;}
.rb{border-right: #222222 solid 6px;}
.tile, .lb,.rb,.nb{width: 32px; text-align: center; font-size: 24px; color: #5555DD}
.tb{border-top: #222222 solid 5px;}
.bb{border-bottom: #222222 solid 5px;}
.nanoformbutton{height: 22px; float: left; text-align: center; color: #ffffff; text-decoration: none;
background: #40628a; border: 1px solid #161616; margin: 0 2px 2px 0;cursor: default;white-space: nowrap;}
</style>
<script>
function autosubmit()
{
document.forms["grid"].submit();
}
</script>
<table id="page"><tr><td>
<form name="grid" method="get" action='?src={{:data.src}}' style="margin:0;">
<input type='hidden' name='src' value='{{:data.src}}'>
<input type='hidden' name='save' value='{{:data.src}}'>
<table id="board" class="board" cellspacing="0" cellpadding="0">
<tr class="tb">
{{for data.grid}}
<td id="{{:value.id}}" class="
{{if (value.column == 1 || value.column == 4 || value.column == 7)}}
lb
{{else (value.column == 9)}}
rb
{{else}}
nb
{{/if}}
{{if (value.row == 1 || value.row == 4 || value.row == 7)}}
tb
{{else (value.row == 9)}}
bb
{{/if}}
">
<input onkeyup="autosubmit()" type="number" min="1" max="9" class="tile" name="{{:value.index}}" id="{{:value.id}}" maxlength="1" value="{{:value.value}}"
{{if value.static}}
readonly="1" style="color: #000000"
{{/if}}
{{if value.highlight}}
style="background-color: #ff8888";
{{/if}}
>
</td>
{{if value.column == 9}}
</tr>
{{if value.row < 9}}
<tr>
{{/if}}
{{/if}}
{{/for}}
</table>
<br>
<!-- <input type='submit' class="nanoformbutton" value='Check'> -->
{{:helper.link("Check", null, {'check' : value.ref})}}
{{:helper.link("Reset Grid", null, {'clear' : value.ref})}}
{{:helper.link((data.collapse) ? "Expand" : "Collapse", null, {'collapse' : value.ref})}}
</form>
</td>
{{if data.collapse == 0}}
<td style="vertical-align: top;">
<table>
<tr><td>
<div>Sudoku is a classic human game of logic and deduction originating from Earth, in the Sol system. Invented in 19th century France and later popularised in 20th century Japan, where the name originates. It has proven a popular and diverting pastime for almost 500 years.<br>
<br>
The object of the game is simple. Complete the board by filling in digits from 1 to 9, with the constraint that each digit can only appear once per row, once per column, and once per 3x3 subgrid. The solution can usually be figured out by a process of elimination: Carefully check each tile against those around it based on the above rules, and fill in the tiles where there is only one option. Each new tile filled is a clue to the value of other tiles!</div>
</td></tr>
<tr><td style="height:40px;">
{{if data.message}}
<div style="font-size: 18px; color: #7799cc;">{{:data.message}}</div>
{{/if}}
</td></tr>
<tr><td>
{{:helper.link("Hint", null, {'hint' : value.ref})}}
</td>
</tr>
<tr><td>
<div style="font-size: 18px;">Start a New Game</div>
<hr>
{{:helper.link("Easy", null, {'difficulty' : "Easy"}, data.difficulty == "Easy" ? 'selected' : null)}}
{{:helper.link("Medium", null, {'difficulty' : "Medium"}, data.difficulty == "Medium" ? 'selected' : null)}}
{{:helper.link("Hard", null, {'difficulty' : "Hard"}, data.difficulty == "Hard" ? 'selected' : null)}}
{{:helper.link("Robust", null, {'difficulty' : "Robust"}, data.difficulty == "Robust" ? 'selected' : null)}}
<br><br>
{{:helper.link("Generate Grid", null, {'newgame' : value.ref})}}
</td>
</tr>
</td>
{{/if}}
<tr>
</table
-20
View File
@@ -1,20 +0,0 @@
<!--
Title: Telescience Control UI
Used In File(s): \code\modules\telesci\telesci_computer.dm
-->
<div class="item">
<div class="itemLabel">Coordinates:</div>
<div class="itemContent">
{{:helper.link('X: ' + data.coordx, 'gear', {'setx': 1})}}
{{:helper.link('Y: ' + data.coordy, 'gear', {'sety': 1})}}
{{:helper.link('Z: ' + data.coordz, 'gear', {'setz': 1})}}
</div>
</div>
<div class="item">
<div class="itemLabel">Controls:</div>
<div class="itemContent">
{{:helper.link('Send', 'gear', {'send': 1}, null, (data.coordx != null && data.coordy != null && data.coordz != null) ? '' : 'disabled')}}
{{:helper.link('Receive', 'gear', {'receive': 1}, null, (data.coordx != null && data.coordy != null && data.coordz != null) ? '' : 'disabled')}}
{{:helper.link('Recalibrate', 'gear', {'recal': 1})}}
</div>
</div>
-56
View File
@@ -1,56 +0,0 @@
<div class="item">
<div class="itemLabel">
Attachment One:
</div>
<div class="itemContent">
{{if data.attachmentOne}}
{{:data.attachmentOne}}
{{else}}
<i>None</i>
{{/if}}
{{:helper.link('Remove', 'eject', {'tankone' : 1}, data.attachmentOne ? null : 'disabled')}}
</div>
</div>
<div class="item">
<div class="itemLabel">
Attachment Two:
</div>
<div class="itemContent">
{{if data.attachmentTwo}}
{{:data.attachmentTwo}}
{{else}}
<i>None</i>
{{/if}}
{{:helper.link('Remove', 'eject', {'tanktwo' : 1}, data.attachmentTwo ? null : 'disabled')}}
</div>
</div>
<div class="item">
<div class="itemLabel">
Valve Attachment:
</div>
<div class="itemContent">
{{if data.valveAttachment}}
{{:data.valveAttachment}}
{{else}}
<i>None</i>
{{/if}}
{{:helper.link('Remove', 'eject', {'rem_device' : 1}, data.valveAttachment ? null : 'disabled')}}
{{if data.valveAttachment}}
{{:helper.link('View', 'wrench', {'device' : 1})}}
{{/if}}
</div>
</div>
<div class="item">&nbsp;</div>
<div class="item">
<div class="itemLabel">
Valve Status:
</div>
<div class="itemContent">
{{:helper.link('Open', 'unlocked', {'open' : 1}, (!data.attachmentOne || !data.attachmentTwo) ? 'disabled' : (data.valveOpen ? 'selected' : null))}}{{:helper.link('Close', 'locked', {'open' : 1}, (!data.attachmentOne || !data.attachmentTwo) ? 'disabled' : (data.valveOpen ? null : 'selected'))}}
</div>
</div>