NANOUI PDA

Creates NanoUI for the PDA and Syndicate Uplink.

New features:
	Crew manifest now sorted with department heads at the top.
	Can select individual conversations and delete individual conversations among PDA's
	Powernet Monitor much more simple now and easier to read.
	Janitorial supplies locator now includes Janicart.
	Items will actually refresh if you click "Refresh"

Some other changes:
	Captain's PDA cartridge now has all access (added janitor access and quartermaster access)
	With the conversation change I had to change how tnote (the variable that holds PDA messages works.
		Setup the message server to use the new methods.
	Removed procs that will no longer be used (UI generation procs from old UI methods)
	Commented everything the best I can.
	Created HORRIBLE, TERRIBLE lists.  But it's pretty much required because that's how nanoUI rolls.
	Created a variable on the uplink called NanoUI items, this list is created upon creation of the
		uplink.

	I included the functionality for Mimes and Clowns for our downstream servers that have those.
This commit is contained in:
Ccomp5950
2013-12-22 06:18:39 -06:00
parent 0aeeff0dd4
commit ec7921909f
15 changed files with 2142 additions and 938 deletions
+183 -111
View File
@@ -51,122 +51,194 @@
//This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character().
var/locked[] = list()
proc/get_manifest(monochrome, OOC)
var/list/heads = new()
var/list/sec = new()
var/list/eng = new()
var/list/med = new()
var/list/sci = new()
var/list/civ = new()
var/list/bot = new()
var/list/misc = new()
var/list/isactive = new()
var/dat = {"
<head><style>
.manifest {border-collapse:collapse;}
.manifest td, th {border:1px solid [monochrome?"black":"#DEF; background-color:white; color:black"]; padding:.25em}
.manifest th {height: 2em; [monochrome?"border-top-width: 3px":"background-color: #48C; color:white"]}
.manifest tr.head th { [monochrome?"border-top-width: 1px":"background-color: #488;"] }
.manifest td:first-child {text-align:right}
.manifest tr.alt td {[monochrome?"border-top-width: 2px":"background-color: #DEF"]}
</style></head>
<table class="manifest" width='350px'>
<tr class='head'><th>Name</th><th>Rank</th><th>Activity</th></tr>
"}
var/even = 0
// sort mobs
for(var/datum/data/record/t in data_core.general)
var/name = t.fields["name"]
var/rank = t.fields["rank"]
var/real_rank = t.fields["real_rank"]
if(OOC)
var/active = 0
for(var/mob/M in player_list)
if(M.real_name == name && M.client && M.client.inactivity <= 10 * 60 * 10)
active = 1
break
isactive[name] = active ? "Active" : "Inactive"
else
isactive[name] = t.fields["p_stat"]
/obj/effect/datacore/proc/get_manifest(monochrome, OOC)
var/list/heads = new()
var/list/sec = new()
var/list/eng = new()
var/list/med = new()
var/list/sci = new()
var/list/civ = new()
var/list/bot = new()
var/list/misc = new()
var/list/isactive = new()
var/dat = {"
<head><style>
.manifest {border-collapse:collapse;}
.manifest td, th {border:1px solid [monochrome?"black":"#DEF; background-color:white; color:black"]; padding:.25em}
.manifest th {height: 2em; [monochrome?"border-top-width: 3px":"background-color: #48C; color:white"]}
.manifest tr.head th { [monochrome?"border-top-width: 1px":"background-color: #488;"] }
.manifest td:first-child {text-align:right}
.manifest tr.alt td {[monochrome?"border-top-width: 2px":"background-color: #DEF"]}
</style></head>
<table class="manifest" width='350px'>
<tr class='head'><th>Name</th><th>Rank</th><th>Activity</th></tr>
"}
var/even = 0
// sort mobs
for(var/datum/data/record/t in data_core.general)
var/name = t.fields["name"]
var/rank = t.fields["rank"]
var/real_rank = t.fields["real_rank"]
if(OOC)
var/active = 0
for(var/mob/M in player_list)
if(M.real_name == name && M.client && M.client.inactivity <= 10 * 60 * 10)
active = 1
break
isactive[name] = active ? "Active" : "Inactive"
else
isactive[name] = t.fields["p_stat"]
//world << "[name]: [rank]"
//cael - to prevent multiple appearances of a player/job combination, add a continue after each line
var/department = 0
if(real_rank in command_positions)
heads[name] = rank
department = 1
if(real_rank in security_positions)
sec[name] = rank
department = 1
if(real_rank in engineering_positions)
eng[name] = rank
department = 1
if(real_rank in medical_positions)
med[name] = rank
department = 1
if(real_rank in science_positions)
sci[name] = rank
department = 1
if(real_rank in civilian_positions)
civ[name] = rank
department = 1
if(real_rank in nonhuman_positions)
bot[name] = rank
department = 1
var/department = 0
if(real_rank in command_positions)
heads[name] = rank
department = 1
if(real_rank in security_positions)
sec[name] = rank
department = 1
if(real_rank in engineering_positions)
eng[name] = rank
department = 1
if(real_rank in medical_positions)
med[name] = rank
department = 1
if(real_rank in science_positions)
sci[name] = rank
department = 1
if(real_rank in civilian_positions)
civ[name] = rank
department = 1
if(real_rank in nonhuman_positions)
bot[name] = rank
department = 1
if(!department && !(name in heads))
misc[name] = rank
if(heads.len > 0)
dat += "<tr><th colspan=3>Heads</th></tr>"
for(name in heads)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[heads[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(sec.len > 0)
dat += "<tr><th colspan=3>Security</th></tr>"
for(name in sec)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[sec[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(eng.len > 0)
dat += "<tr><th colspan=3>Engineering</th></tr>"
for(name in eng)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[eng[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(med.len > 0)
dat += "<tr><th colspan=3>Medical</th></tr>"
for(name in med)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[med[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(sci.len > 0)
dat += "<tr><th colspan=3>Science</th></tr>"
for(name in sci)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[sci[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(civ.len > 0)
dat += "<tr><th colspan=3>Civilian</th></tr>"
for(name in civ)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[civ[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
// in case somebody is insane and added them to the manifest, why not
if(bot.len > 0)
dat += "<tr><th colspan=3>Silicon</th></tr>"
for(name in bot)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[bot[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
// misc guys
if(misc.len > 0)
dat += "<tr><th colspan=3>Miscellaneous</th></tr>"
for(name in misc)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[misc[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(!department && !(name in heads))
misc[name] = rank
if(heads.len > 0)
dat += "<tr><th colspan=3>Heads</th></tr>"
for(name in heads)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[heads[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(sec.len > 0)
dat += "<tr><th colspan=3>Security</th></tr>"
for(name in sec)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[sec[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(eng.len > 0)
dat += "<tr><th colspan=3>Engineering</th></tr>"
for(name in eng)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[eng[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(med.len > 0)
dat += "<tr><th colspan=3>Medical</th></tr>"
for(name in med)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[med[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(sci.len > 0)
dat += "<tr><th colspan=3>Science</th></tr>"
for(name in sci)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[sci[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(civ.len > 0)
dat += "<tr><th colspan=3>Civilian</th></tr>"
for(name in civ)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[civ[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
// in case somebody is insane and added them to the manifest, why not
if(bot.len > 0)
dat += "<tr><th colspan=3>Silicon</th></tr>"
for(name in bot)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[bot[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
// misc guys
if(misc.len > 0)
dat += "<tr><th colspan=3>Miscellaneous</th></tr>"
for(name in misc)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[misc[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
dat += "</table>"
dat = replacetext(dat, "\n", "") // so it can be placed on paper correctly
dat = replacetext(dat, "\t", "")
return dat
/*
We can't just insert in HTML into the nanoUI so we need the raw data to play with.
*/
/obj/effect/datacore/proc/get_manifest_json()
var/heads[0]
var/sec[0]
var/eng[0]
var/med[0]
var/sci[0]
var/civ[0]
var/bot[0]
var/misc[0]
for(var/datum/data/record/t in data_core.general)
var/name = t.fields["name"]
var/rank = t.fields["rank"]
var/real_rank = t.fields["real_rank"]
var/isactive = t.fields["p_stat"]
var/department = 0
var/depthead = 0 // Department Heads will be placed at the top of their lists.
if(real_rank in command_positions)
heads[++heads.len] = list("name" = name, "rank" = rank, "active" = isactive)
department = 1
depthead = 1
if(rank=="Captain" && heads.len != 1)
heads.Swap(1,heads.len)
if(real_rank in security_positions)
sec[++sec.len] = list("name" = name, "rank" = rank, "active" = isactive)
department = 1
if(depthead && sec.len != 1)
sec.Swap(1,sec.len)
if(real_rank in engineering_positions)
eng[++eng.len] = list("name" = name, "rank" = rank, "active" = isactive)
department = 1
if(depthead && eng.len != 1)
eng.Swap(1,eng.len)
if(real_rank in medical_positions)
med[++med.len] = list("name" = name, "rank" = rank, "active" = isactive)
department = 1
if(depthead && med.len != 1)
med.Swap(1,med.len)
if(real_rank in science_positions)
sci[++sci.len] = list("name" = name, "rank" = rank, "active" = isactive)
department = 1
if(depthead && sci.len != 1)
sci.Swap(1,sci.len)
if(real_rank in civilian_positions)
civ[++civ.len] = list("name" = name, "rank" = rank, "active" = isactive)
department = 1
if(depthead && civ.len != 1)
civ.Swap(1,civ.len)
if(real_rank in nonhuman_positions)
bot[++bot.len] = list("name" = name, "rank" = rank, "active" = isactive)
department = 1
if(!department && !(name in heads))
misc[++misc.len] = list("name" = name, "rank" = rank, "active" = isactive)
return list(\
"heads" = heads,\
"sec" = sec,\
"eng" = eng,\
"med" = med,\
"sci" = sci,\
"civ" = civ,\
"bot" = bot,\
"misc" = misc\
)
dat += "</table>"
dat = replacetext(dat, "\n", "") // so it can be placed on paper correctly
dat = replacetext(dat, "\t", "")
return dat
/obj/effect/laser
name = "laser"
+6 -2
View File
@@ -443,7 +443,6 @@
//Sender isn't faking as someone who exists
if(isnull(PDARec))
src.linkedServer.send_pda_message("[customrecepient.owner]", "[customsender]","[custommessage]")
customrecepient.tnote += "<i><b>&larr; From <a href='byond://?src=\ref[customrecepient];choice=Message;target=\ref[src]'>[customsender]</a> ([customjob]):</b></i><br>[custommessage]<br>"
if (!customrecepient.silent)
playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1)
for (var/mob/O in hearers(3, customrecepient.loc))
@@ -456,8 +455,13 @@
customrecepient.overlays += image('icons/obj/pda.dmi', "pda-r")
//Sender is faking as someone who exists
else
src.linkedServer.send_pda_message("[customrecepient.owner]", "[PDARec.owner]","[custommessage]")
customrecepient.tnote += "<i><b>&larr; From <a href='byond://?src=\ref[customrecepient];choice=Message;target=\ref[PDARec]'>[PDARec.owner]</a> ([customjob]):</b></i><br>[custommessage]<br>"
customrecepient.tnote.Add(list(list("sent" = 0, "owner" = "[PDARec.owner]", "job" = "[customjob]", "message" = "[custommessage]", "target" ="\ref[PDARec]")))
if(!customrecepient.conversations.Find("\ref[PDARec]"))
customrecepient.conversations.Add("\ref[PDARec]")
if (!customrecepient.silent)
playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1)
for (var/mob/O in hearers(3, customrecepient.loc))
+260 -239
View File
@@ -1,3 +1,4 @@
//The advanced pea-green monochrome lcd of tomorrow.
var/global/list/obj/item/device/pda/PDAs = list()
@@ -25,7 +26,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
var/f_lum = 2 //Luminosity for the flashlight function
var/silent = 0 //To beep or not to beep, that is the question
var/toff = 0 //If 1, messenger disabled
var/tnote = null //Current Texts
var/tnote[0] //Current Texts
var/last_text //No text spamming
var/last_honk //Also no honk spamming that's bad too
var/ttone = "beep" //The ringtone!
@@ -37,7 +38,10 @@ var/global/list/obj/item/device/pda/PDAs = list()
var/cart = "" //A place to stick cartridge menu information
var/detonate = 1 // Can the PDA be blown up?
var/hidden = 0 // Is the PDA hidden from the PDA list?
var/active_conversation = null // New variable that allows us to only view a single conversation.
var/list/conversations = list() // For keeping up with who we have PDA messsages from.
var/newmessage = 0 //To remove hackish overlay check
var/obj/item/weapon/card/id/id = null //Making it possible to slot an ID card into the PDA so it can function as both.
var/ownjob = null //related to above
@@ -242,7 +246,13 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(usr.stat == 2)
usr << "You can't do that because you are dead!"
return
var/HTML = "<html><head><title>AI PDA Message Log</title></head><body>[tnote]</body></html>"
var/HTML = "<html><head><title>AI PDA Message Log</title></head><body>"
for(var/index in tnote)
if(index["sent"])
HTML += addtext("<i><b>&rarr; To <a href='byond://?src=\ref[src];choice=Message;target=",index["src"],"'>", index["owner"],"</a>:</b></i><br>", index["message"], "<br>")
else
HTML += addtext("<i><b>&larr; From <a href='byond://?src=\ref[src];choice=Message;target=",index["target"],"'>", index["owner"],"</a>:</b></i><br>", index["message"], "<br>")
HTML +="</body></html>"
usr << browse(HTML, "window=log;size=400x444;border=1;can_resize=1;can_close=1;can_minimize=0")
@@ -309,6 +319,172 @@ var/global/list/obj/item/device/pda/PDAs = list()
return attack_self(M)
return
/* Notes for those wanting to modify this code or even understand it.
There are two modes: New UI and a UI already existing.
If the UI is new, you define your variables, if the ui already exists if it didn't have variables in data for what you want to add
then it won't add it even if you make a data["blahblah"] for it. That's the reason for the = null all over the place, so that.
ui.push_data(data) proc has to have the var structure already setup otherwise it can't push the update.
The exception to the "YOU HAVE TO DEFINE IT" rule is cartridges, we later force
the ui to close if a cartridge is inserted so that never will be a problem.
So there will never be a time a UI creation causes that to be a problem.
*/
/obj/item/device/pda/ui_interact(mob/user, ui_key = "main")
var/title = "Personal Data Assistant"
var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, ui_key)
var/data[0] // This is the data that will be sent to the PDA
data["owner"] = owner // Who is your daddy...
data["ownjob"] = ownjob // ...and what does he do?
data["mode"] = mode // The current view
data["scanmode"] = scanmode // Scanners
data["fon"] = fon // Flashlight on?
data["pai"] = (isnull(pai) ? 0 : 1) // pAI inserted?
data["note"] = note // current pda notes
data["silent"] = silent // does the pda make noise when it receives a message?
data["toff"] = toff // is the messenger function turned off?
data["active_conversation"] = active_conversation // Which conversation are we following right now?
data["idInserted"] = (id ? 1 : 0)
data["idLink"] = (id ? text("[id.registered_name], [id.assignment]") : "--------")
if(cartridge)
var/cartdata[0]
data["records"] = cartridge.create_NanoUI_values()
cartdata["name"] = cartridge.name
cartdata["access"] = list(\
"access_security" = cartridge.access_security,\
"access_engine" = cartridge.access_engine,\
"access_atmos" = cartridge.access_atmos,\
"access_medical" = cartridge.access_medical,\
"access_clown" = cartridge.access_clown,\
"access_mime" = cartridge.access_mime,\
"access_janitor" = cartridge.access_janitor,\
"access_quartermaster" = cartridge.access_quartermaster,\
"access_hydroponics" = cartridge.access_hydroponics,\
"access_reagent_scanner" = cartridge.access_reagent_scanner,\
"access_remote_door" = cartridge.access_remote_door,\
"access_status_display" = cartridge.access_status_display\
)
if(isnull(cartridge.radio))
cartdata["radio"] = 0
else
if(istype(cartridge.radio, /obj/item/radio/integrated/beepsky))
cartdata["radio"] = 1
if(istype(cartridge.radio, /obj/item/radio/integrated/signal))
cartdata["radio"] = 2
if(istype(cartridge.radio, /obj/item/radio/integrated/mule))
cartdata["radio"] = 3
cartdata["type"] = cartridge.type
cartdata["charges"] = cartridge.charges ? cartridge.charges : 0
data["cartridge"] = cartdata
data["stationTime"] = worldtime2text()
data["newMessage"] = newmessage
var/convopdas[0]
var/pdas[0]
var/count = 0
for (var/obj/item/device/pda/P in sortAtom(PDAs))
if (!P.owner||P.toff||P == src||P.hidden) continue
if(conversations.Find("\ref[P]"))
convopdas.Add(list(list("Name" = "[P]", "Reference" = "\ref[P]", "Detonate" = "[P.detonate]", "inconvo" = "1")))
else
pdas.Add(list(list("Name" = "[P]", "Reference" = "\ref[P]", "Detonate" = "[P.detonate]", "inconvo" = "0")))
count++
data["convopdas"] = convopdas
data["pdas"] = pdas
data["pda_count"] = count
data["messagescount"] = tnote.len
data["messages"] = tnote
var/found = 0
if(active_conversation)
for(var/c in tnote)
if(c["target"] == active_conversation)
data["convo_name"] = c["owner"]
data["convo_job"] = c["job"]
found = 1
break
if(!found)
data["convo_name"] = null
data["convo_job"] = null
if(!ui || mode==41)
data["manifest"] = data_core.get_manifest_json()
if(!ui || mode==3)
var/turf/T = get_turf_or_move(user.loc)
if(!isnull(T))
var/datum/gas_mixture/environment = T.return_air()
var/pressure = environment.return_pressure()
var/total_moles = environment.total_moles()
if (total_moles)
var/o2_level = environment.oxygen/total_moles
var/n2_level = environment.nitrogen/total_moles
var/co2_level = environment.carbon_dioxide/total_moles
var/plasma_level = environment.toxins/total_moles
var/unknown_level = 1-(o2_level+n2_level+co2_level+plasma_level)
data["aircontents"] = list(\
"pressure" = "[round(pressure,0.1)]",\
"nitrogen" = "[round(n2_level*100,0.1)]",\
"oxygen" = "[round(o2_level*100,0.1)]",\
"carbon_dioxide" = "[round(co2_level*100,0.1)]",\
"plasma" = "[round(plasma_level*100,0.01)]",\
"other" = "[round(unknown_level, 0.01)]",\
"temp" = "[round(environment.temperature-T0C,0.1)]",\
"reading" = 1\
)
if(isnull(data["aircontents"]))
data["aircontents"] = list(\
"pressure" = null,\
"nitrogen" = null,\
"oxygen" = null,\
"carbon_dioxide" = null,\
"plasma" = null,\
"other" = null,\
"temp" = null,\
"reading" = 0\
)
if (!ui)
// the ui does not exist, so we'll create a new one
ui = new(user, src, ui_key, "pda.tmpl", title, 630, 600)
// When the UI is first opened this is the data it will use
ui.set_initial_data(data)
ui.open()
else
// The UI is already open so push the new data to it
ui.push_data(data)
return
//NOTE: graphic resources are loaded on client login
/obj/item/device/pda/attack_self(mob/user as mob)
@@ -317,203 +493,21 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(active_uplink_check(user))
return
var/dat = "<html><head><title>Personal Data Assistant</title></head><body bgcolor=\"#808000\"><style>a, a:link, a:visited, a:active, a:hover { color: #000000; }img {border-style:none;}</style>"
dat += "<a href='byond://?src=\ref[src];choice=Close'><img src=pda_exit.png> Close</a>"
if ((!isnull(cartridge)) && (mode == 0))
dat += " | <a href='byond://?src=\ref[src];choice=Eject'><img src=pda_eject.png> Eject [cartridge]</a>"
if (mode)
dat += " | <a href='byond://?src=\ref[src];choice=Return'><img src=pda_menu.png> Return</a>"
dat += " | <a href='byond://?src=\ref[src];choice=Refresh'><img src=pda_refresh.png> Refresh</a>"
dat += "<br>"
if (!owner)
dat += "Warning: No owner information entered. Please swipe card.<br><br>"
dat += "<a href='byond://?src=\ref[src];choice=Refresh'><img src=pda_refresh.png> Retry</a>"
else
switch (mode)
if (0)
dat += "<h2>PERSONAL DATA ASSISTANT v.1.2</h2>"
dat += "Owner: [owner], [ownjob]<br>"
dat += text("ID: <A href='?src=\ref[src];choice=Authenticate'>[id ? "[id.registered_name], [id.assignment]" : "----------"]")
dat += text("<br><A href='?src=\ref[src];choice=UpdateInfo'>[id ? "Update PDA Info" : ""]</A><br>")
dat += "Station Time: [worldtime2text()]"//:[world.time / 100 % 6][world.time / 100 % 10]"
dat += "<br><br>"
dat += "<h4>General Functions</h4>"
dat += "<ul>"
dat += "<li><a href='byond://?src=\ref[src];choice=1'><img src=pda_notes.png> Notekeeper</a></li>"
dat += "<li><a href='byond://?src=\ref[src];choice=2'><img src=pda_mail.png> Messenger</a></li>"
dat += "<li><a href='byond://?src=\ref[src];choice=41'><img src=pda_notes.png> View Crew Manifest</a></li>"
//dat += "<li><a href='byond://?src=\red[src];choice=chatroom'><img src=pda_chatroom.png> Nanotrasen Relay Chat</a></li>"
if (cartridge)
if (cartridge.access_clown)
dat += "<li><a href='byond://?src=\ref[src];choice=Honk'><img src=pda_honk.png> Honk Synthesizer</a></li>"
if(cartridge.access_status_display)
dat += "<li><a href='byond://?src=\ref[src];choice=42'><img src=pda_status.png> Set Status Display</a></li>"
dat += "</ul>"
if (cartridge.access_engine)
dat += "<h4>Engineering Functions</h4>"
dat += "<ul>"
dat += "<li><a href='byond://?src=\ref[src];choice=43'><img src=pda_power.png> Power Monitor</a></li>"
dat += "</ul>"
if (cartridge.access_medical)
dat += "<h4>Medical Functions</h4>"
dat += "<ul>"
dat += "<li><a href='byond://?src=\ref[src];choice=44'><img src=pda_medical.png> Medical Records</a></li>"
dat += "<li><a href='byond://?src=\ref[src];choice=Medical Scan'><img src=pda_scanner.png> [scanmode == 1 ? "Disable" : "Enable"] Medical Scanner</a></li>"
dat += "</ul>"
if (cartridge.access_security)
dat += "<h4>Security Functions</h4>"
dat += "<ul>"
dat += "<li><a href='byond://?src=\ref[src];choice=45'><img src=pda_cuffs.png> Security Records</A></li>"
if(istype(cartridge.radio, /obj/item/radio/integrated/beepsky))
dat += "<li><a href='byond://?src=\ref[src];choice=46'><img src=pda_cuffs.png> Security Bot Access</a></li>"
dat += "</ul>"
else dat += "</ul>"
if(cartridge.access_quartermaster)
dat += "<h4>Quartermaster Functions:</h4>"
dat += "<ul>"
dat += "<li><a href='byond://?src=\ref[src];choice=47'><img src=pda_crate.png> Supply Records</A></li>"
dat += "<li><a href='byond://?src=\ref[src];choice=48'><img src=pda_mule.png> Delivery Bot Control</A></li>"
dat += "</ul>"
dat += "</ul>"
dat += "<h4>Utilities</h4>"
dat += "<ul>"
if (cartridge)
if (cartridge.access_janitor)
dat += "<li><a href='byond://?src=\ref[src];choice=49'><img src=pda_bucket.png> Custodial Locator</a></li>"
if (istype(cartridge.radio, /obj/item/radio/integrated/signal))
dat += "<li><a href='byond://?src=\ref[src];choice=40'><img src=pda_signaler.png> Signaler System</a></li>"
if (cartridge.access_reagent_scanner)
dat += "<li><a href='byond://?src=\ref[src];choice=Reagent Scan'><img src=pda_reagent.png> [scanmode == 3 ? "Disable" : "Enable"] Reagent Scanner</a></li>"
if (cartridge.access_engine)
dat += "<li><a href='byond://?src=\ref[src];choice=Halogen Counter'><img src=pda_reagent.png> [scanmode == 4 ? "Disable" : "Enable"] Halogen Counter</a></li>"
if (cartridge.access_atmos)
dat += "<li><a href='byond://?src=\ref[src];choice=Gas Scan'><img src=pda_reagent.png> [scanmode == 5 ? "Disable" : "Enable"] Gas Scanner</a></li>"
if (cartridge.access_remote_door)
dat += "<li><a href='byond://?src=\ref[src];choice=Toggle Door'><img src=pda_rdoor.png> Toggle Remote Door</a></li>"
dat += "<li><a href='byond://?src=\ref[src];choice=3'><img src=pda_atmos.png> Atmospheric Scan</a></li>"
dat += "<li><a href='byond://?src=\ref[src];choice=Light'><img src=pda_flashlight.png> [fon ? "Disable" : "Enable"] Flashlight</a></li>"
if (pai)
if(pai.loc != src)
pai = null
else
dat += "<li><a href='byond://?src=\ref[src];choice=pai;option=1'>pAI Device Configuration</a></li>"
dat += "<li><a href='byond://?src=\ref[src];choice=pai;option=2'>Eject pAI Device</a></li>"
dat += "</ul>"
if (1)
dat += "<h4><img src=pda_notes.png> Notekeeper V2.1</h4>"
dat += "<a href='byond://?src=\ref[src];choice=Edit'> Edit</a><br>"
dat += note
if (2)
dat += "<h4><img src=pda_mail.png> SpaceMessenger V3.9.4</h4>"
dat += "<a href='byond://?src=\ref[src];choice=Toggle Ringer'><img src=pda_bell.png> Ringer: [silent == 1 ? "Off" : "On"]</a> | "
dat += "<a href='byond://?src=\ref[src];choice=Toggle Messenger'><img src=pda_mail.png> Send / Receive: [toff == 1 ? "Off" : "On"]</a> | "
dat += "<a href='byond://?src=\ref[src];choice=Ringtone'><img src=pda_bell.png> Set Ringtone</a> | "
dat += "<a href='byond://?src=\ref[src];choice=21'><img src=pda_mail.png> Messages</a><br>"
if (istype(cartridge, /obj/item/weapon/cartridge/syndicate))
dat += "<b>[cartridge:shock_charges] detonation charges left.</b><HR>"
if (istype(cartridge, /obj/item/weapon/cartridge/clown))
dat += "<b>[cartridge:honk_charges] viral files left.</b><HR>"
if (istype(cartridge, /obj/item/weapon/cartridge/mime))
dat += "<b>[cartridge:mime_charges] viral files left.</b><HR>"
dat += "<h4><img src=pda_menu.png> Detected PDAs</h4>"
dat += "<ul>"
var/count = 0
if (!toff)
for (var/obj/item/device/pda/P in sortAtom(PDAs))
if (!P.owner||P.toff||P == src||P.hidden) continue
dat += "<li><a href='byond://?src=\ref[src];choice=Message;target=\ref[P]'>[P]</a>"
if (istype(cartridge, /obj/item/weapon/cartridge/syndicate) && P.detonate)
dat += " (<a href='byond://?src=\ref[src];choice=Detonate;target=\ref[P]'><img src=pda_boom.png>*Detonate*</a>)"
if (istype(cartridge, /obj/item/weapon/cartridge/clown))
dat += " (<a href='byond://?src=\ref[src];choice=Send Honk;target=\ref[P]'><img src=pda_honk.png>*Send Virus*</a>)"
if (istype(cartridge, /obj/item/weapon/cartridge/mime))
dat += " (<a href='byond://?src=\ref[src];choice=Send Silence;target=\ref[P]'>*Send Virus*</a>)"
dat += "</li>"
count++
dat += "</ul>"
if (count == 0)
dat += "None detected.<br>"
if(21)
dat += "<h4><img src=pda_mail.png> SpaceMessenger V3.9.4</h4>"
dat += "<a href='byond://?src=\ref[src];choice=Clear'><img src=pda_blank.png> Clear Messages</a>"
dat += "<h4><img src=pda_mail.png> Messages</h4>"
dat += tnote
dat += "<br>"
if (3)
dat += "<h4><img src=pda_atmos.png> Atmospheric Readings</h4>"
var/turf/T = get_turf_or_move(user.loc)
if (isnull(T))
dat += "Unable to obtain a reading.<br>"
else
var/datum/gas_mixture/environment = T.return_air()
var/pressure = environment.return_pressure()
var/total_moles = environment.total_moles()
dat += "Air Pressure: [round(pressure,0.1)] kPa<br>"
if (total_moles)
var/o2_level = environment.oxygen/total_moles
var/n2_level = environment.nitrogen/total_moles
var/co2_level = environment.carbon_dioxide/total_moles
var/plasma_level = environment.toxins/total_moles
var/unknown_level = 1-(o2_level+n2_level+co2_level+plasma_level)
dat += "Nitrogen: [round(n2_level*100)]%<br>"
dat += "Oxygen: [round(o2_level*100)]%<br>"
dat += "Carbon Dioxide: [round(co2_level*100)]%<br>"
dat += "Plasma: [round(plasma_level*100)]%<br>"
if(unknown_level > 0.01)
dat += "OTHER: [round(unknown_level)]%<br>"
dat += "Temperature: [round(environment.temperature-T0C)]&deg;C<br>"
dat += "<br>"
if (5)
dat += "<h4><img src=pda_chatroom.png> Nanotrasen Relay Chat</h4>"
dat += "<h4><img src=pda_menu.png> Detected Channels</h4>: <li>"
for(var/datum/chatroom/C in chatrooms)
dat += "<a href='byond://?src=\ref[src];pdachannel=[C.name]'>#[html_encode(lowertext(C.name))]"
if(C.password != "")
dat += " <img src=pda_locked.png>"
dat += "</li>"
if (41) //crew manifest
dat += "<h4><img src=pda_notes.png> Crew Manifest</h4>"
dat += "Entries cannot be modified from this terminal.<br><br>"
if(data_core)
dat += data_core.get_manifest(1) // make it monochrome
dat += "<br>"
else//Else it links to the cart menu proc. Although, it really uses menu hub 4--menu 4 doesn't really exist as it simply redirects to hub.
dat += cart
dat += "</body></html>"
user << browse(dat, "window=pda;size=400x444;border=1;can_resize=1;can_close=0;can_minimize=0")
onclose(user, "pda", src)
ui_interact(user) //NanoUI requires this proc
return
/obj/item/device/pda/Topic(href, href_list)
if(href_list["cartmenu"] && !isnull(cartridge))
cartridge.Topic(href, href_list)
return 1
if(href_list["radiomenu"] && !isnull(cartridge) && !isnull(cartridge.radio))
cartridge.radio.Topic(href, href_list)
return 1
..()
var/mob/user = usr
var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main")
var/mob/living/U = usr
//Looking for master was kind of pointless since PDAs don't appear to have one.
//if ((src in U.contents) || ( istype(loc, /turf) && in_range(src, U) ) )
@@ -530,7 +524,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if("Close")//Self explanatory
U.unset_machine()
U << browse(null, "window=pda")
ui.close()
return
if("Refresh")//Refresh, goes to the end of the proc.
if("Return")//Return
@@ -538,11 +532,12 @@ var/global/list/obj/item/device/pda/PDAs = list()
mode = 0
else
mode = round(mode/10)
if(mode==2)
active_conversation = null
if(mode==4)//Fix for cartridges. Redirects to hub.
mode = 0
else if(mode >= 40 && mode <= 49)//Fix for cartridges. Redirects to refresh the menu.
cartridge.mode = mode
cartridge.unlock()
if ("Authenticate")//Checks for ID
id_check(U, 1)
if("UpdateInfo")
@@ -554,6 +549,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(ismob(T))
T = T.loc
cartridge.loc = T
ui.close()
mode = 0
scanmode = 0
if (cartridge.radio)
cartridge.radio.hostpda = null
@@ -625,57 +622,80 @@ var/global/list/obj/item/device/pda/PDAs = list()
note = replacetext(n, "\n", "<BR>")
notehtml = n
else
U << browse(null, "window=pda")
return
ui.close()
if("Toggle Messenger")
toff = !toff
if("Toggle Ringer")//If viewing texts then erase them, if not then toggle silent status
silent = !silent
if("Clear")//Clears messages
tnote = null
if(href_list["option"] == "All")
tnote.Cut()
conversations.Cut()
if(href_list["option"] == "Convo")
var/new_tnote[0]
for(var/i in tnote)
if(i["target"] != active_conversation)
new_tnote[++new_tnote.len] = i
tnote = new_tnote
conversations.Remove(active_conversation)
active_conversation = null
if(mode==21)
mode=2
if("Ringtone")
var/t = input(U, "Please enter new ringtone", name, ttone) as text
if (in_range(src, U) && loc == U)
if (t)
if(src.hidden_uplink && hidden_uplink.check_trigger(U, lowertext(t), lowertext(lock_code)))
U << "The PDA softly beeps."
U << browse(null, "window=pda")
ui.close()
else
t = copytext(sanitize(t), 1, 20)
ttone = t
else
U << browse(null, "window=pda")
ui.close()
return
if("Message")
var/obj/item/device/pda/P = locate(href_list["target"])
src.create_message(U, P)
if(mode == 2)
active_conversation = href_list["target"]
mode = 21
if("Select Conversation")
var/P = href_list["convo"]
for(var/n in conversations)
if(P == n)
active_conversation=P
mode=21
if("Send Honk")//Honk virus
if(istype(cartridge, /obj/item/weapon/cartridge/clown))//Cartridge checks are kind of unnecessary since everything is done through switch.
var/obj/item/device/pda/P = locate(href_list["target"])//Leaving it alone in case it may do something useful, I guess.
if(!isnull(P))
if (!P.toff && cartridge:honk_charges > 0)
cartridge:honk_charges--
if (!P.toff && cartridge.charges > 0)
cartridge.charges--
U.show_message("\blue Virus sent!", 1)
P.honkamt = (rand(15,20))
else
U << "PDA not found."
else
U << browse(null, "window=pda")
ui.close()
return
if("Send Silence")//Silent virus
if(istype(cartridge, /obj/item/weapon/cartridge/mime))
var/obj/item/device/pda/P = locate(href_list["target"])
if(!isnull(P))
if (!P.toff && cartridge:mime_charges > 0)
cartridge:mime_charges--
if (!P.toff && cartridge.charges > 0)
cartridge.charges--
U.show_message("\blue Virus sent!", 1)
P.silent = 1
P.ttone = "silence"
else
U << "PDA not found."
else
U << browse(null, "window=pda")
ui.close()
return
@@ -694,8 +714,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(istype(cartridge, /obj/item/weapon/cartridge/syndicate))
var/obj/item/device/pda/P = locate(href_list["target"])
if(!isnull(P))
if (!P.toff && cartridge:shock_charges > 0)
cartridge:shock_charges--
if (!P.toff && cartridge.charges > 0)
cartridge.charges--
var/difficulty = 0
@@ -712,7 +732,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
U.show_message("\red An error flashes on your [src].", 1)
else if (prob(difficulty * 3))
U.show_message("\red Energy feeds back into your [src]!", 1)
U << browse(null, "window=pda")
ui.close()
explode()
log_admin("[key_name(U)] just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up")
message_admins("[key_name_admin(U)] just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up", 1)
@@ -725,7 +745,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
U << "PDA not found."
else
U.unset_machine()
U << browse(null, "window=pda")
ui.close()
return
//pAI FUNCTIONS===================================
@@ -737,33 +757,31 @@ var/global/list/obj/item/device/pda/PDAs = list()
var/turf/T = get_turf_or_move(src.loc)
if(T)
pai.loc = T
pai = null
//LINK FUNCTIONS===================================
else//Cartridge menu linking
else
mode = text2num(href_list["choice"])
cartridge.mode = mode
cartridge.unlock()
if(cartridge)
cartridge.mode = mode
else//If not in range or not using the pda.
U.unset_machine()
U << browse(null, "window=pda")
ui.close()
return
//EXTRA FUNCTIONS===================================
if (mode == 2||mode == 21)//To clear message overlays.
overlays.Cut()
newmessage = 0
if ((honkamt > 0) && (prob(60)))//For clown virus.
honkamt--
playsound(loc, 'sound/items/bikehorn.ogg', 30, 1)
if(U.machine == src && href_list["skiprefresh"]!="1")//Final safety.
attack_self(U)//It auto-closes the menu prior if the user is not in range and so on.
else
U.unset_machine()
U << browse(null, "window=pda")
return
src.updateUsrDialog()
return 1 // return 1 tells it to refresh the UI in NanoUI
/obj/item/device/pda/proc/remove_id()
if (id)
@@ -792,7 +810,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(!can_use())
return
last_text = world.time
// check if telecomms I/O route 1459 is stable
//var/telecomms_intact = telecomms_process(P.owner, owner, t)
@@ -822,23 +840,24 @@ var/global/list/obj/item/device/pda/PDAs = list()
U << "ERROR: Cannot reach recepient."
return
useMS.send_pda_message("[P.owner]","[owner]","[t]")
tnote += "<i><b>&rarr; To [P.owner]:</b></i><br>[t]<br>"
P.tnote += "<i><b>&larr; From <a href='byond://?src=\ref[P];choice=Message;target=\ref[src]'>[owner]</a> ([ownjob]):</b></i><br>[t]<br>"
for(var/mob/M in player_list)
if(M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTEARS)) // src.client is so that ghosts don't have to listen to mice
M.show_message("<span class='game say'>PDA Message - <span class='name'>[owner]</span> -> <span class='name'>[P.owner]</span>: <span class='message'>[t]</span></span>")
tnote.Add(list(list("sent" = 1, "owner" = "[P.owner]", "job" = "[P.ownjob]", "message" = "[t]", "target" = "\ref[P]")))
P.tnote.Add(list(list("sent" = 0, "owner" = "[owner]", "job" = "[ownjob]", "message" = "[t]", "target" = "\ref[src]")))
if(!conversations.Find("\ref[P]"))
conversations.Add("\ref[P]")
if(!P.conversations.Find("\ref[src]"))
P.conversations.Add("\ref[src]")
if (prob(15)) //Give the AI a chance of intercepting the message
var/who = src.owner
if(prob(50))
who = P:owner
who = P.owner
for(var/mob/living/silicon/ai/ai in mob_list)
// Allows other AIs to intercept the message but the AI won't intercept their own message.
if(ai.aiPDA != P && ai.aiPDA != src)
ai.show_message("<i>Intercepted message from <b>[who]</b>: [t]</i>")
if (!P.silent)
playsound(P.loc, 'sound/machines/twobeep.ogg', 50, 1)
for (var/mob/O in hearers(3, P.loc))
@@ -851,12 +870,14 @@ var/global/list/obj/item/device/pda/PDAs = list()
else
L = get(P, /mob/living/silicon)
if(L)
L << "\icon[P] <b>Message from [src.owner] ([ownjob]), </b>\"[t]\" (<a href='byond://?src=\ref[P];choice=Message;skiprefresh=1;target=\ref[src]'>Reply</a>)"
log_pda("[usr] (PDA: [src.name]) sent \"[t]\" to [P.name]")
P.overlays.Cut()
P.overlays += image('icons/obj/pda.dmi', "pda-r")
P.newmessage = 1
else
U << "<span class='notice'>ERROR: Messaging server is not responding.</span>"
@@ -926,12 +947,15 @@ var/global/list/obj/item/device/pda/PDAs = list()
/obj/item/device/pda/attackby(obj/item/C as obj, mob/user as mob)
..()
if(istype(C, /obj/item/weapon/cartridge) && !cartridge)
var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main")
cartridge = C
user.drop_item()
cartridge.loc = src
user << "<span class='notice'>You insert [cartridge] into [src].</span>"
if(cartridge.radio)
cartridge.radio.hostpda = src
if(ui)
ui.close()
else if(istype(C, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/idcard = C
@@ -1045,9 +1069,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(5)
if((istype(A, /obj/item/weapon/tank)) || (istype(A, /obj/machinery/portable_atmospherics)))
if(istype(A, /obj/item/weapon/tank))
var/obj/item/weapon/tank/t = A
t.manipulated_by = user.real_name
var/obj/icon = A
for (var/mob/O in viewers(user, null))
O << "\red [user] has used [src] on \icon[icon] [A]"
@@ -1138,8 +1159,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
return
if ((istype(M, /mob/living/carbon/human) && (M.real_name != src.owner) && (istype(src.cartridge, /obj/item/weapon/cartridge/clown))))
if (src.cartridge:honk_charges < 5)
src.cartridge:honk_charges++
if (src.cartridge.charges < 5)
src.cartridge.charges++
M.stop_pulling()
M << "\blue You slipped on the PDA!"
File diff suppressed because it is too large Load Diff
@@ -31,15 +31,6 @@
frequency.post_signal(src, signal, filter = s_filter)
proc/print_to_host(var/text)
if (isnull(src.hostpda))
return
src.hostpda.cart = text
for (var/mob/M in viewers(1, src.hostpda.loc))
if (M.client && M.machine == src.hostpda)
src.hostpda.cartridge.unlock()
return
proc/generate_menu()
@@ -107,7 +98,6 @@
if("summon")
post_signal(control_freq, "command", "summon", "active", active, "target", get_turf(PDA) , s_filter = RADIO_SECBOT)
post_signal(control_freq, "command", "bot_status", "active", active, s_filter = RADIO_SECBOT)
PDA.cartridge.unlock()
/obj/item/radio/integrated/mule
var/list/botlist = null // list of bots
@@ -163,7 +153,6 @@
Topic(href, href_list)
..()
var/obj/item/device/pda/PDA = src.hostpda
var/cmd = "command"
if(active) cmd = "command [active.suffix]"
@@ -208,7 +197,6 @@
if("stop", "go", "home")
post_signal(control_freq, cmd, href_list["op"], s_filter = RADIO_MULEBOT)
post_signal(control_freq, cmd, "bot_status", s_filter = RADIO_MULEBOT)
PDA.cartridge.unlock()
+65 -14
View File
@@ -12,6 +12,7 @@ A list of items and costs is stored under the datum of every game mode, alongsid
var/item_data // raw item text
var/list/ItemList // Parsed list of items
var/uses // Numbers of crystals
var/nanoui_items[0]
// List of items not to shove in their hands.
var/list/NotInHand = list(/obj/machinery/singularity_beacon/syndicate)
@@ -23,6 +24,39 @@ A list of items and costs is stored under the datum of every game mode, alongsid
items = replacetext(item_data)
ItemList = text2list(src.items, ";") // Parsing the items text string
uses = ticker.mode.uplink_uses
nanoui_items = generate_nanoui_items()
/*
Built the Items List for use with NanoUI
*/
/obj/item/device/uplink/proc/generate_nanoui_items()
var/items_nano[0]
for(var/D in ItemList)
var/list/O = stringsplit(D, ":")
if(O.len != 3) //If it is not an actual item, make a break in the menu.
if(O.len == 1) //If there is one item, it's probably a title
items_nano[++items_nano.len] = list("Category" = "[O[1]]", "items" = list())
continue
var/path_text = O[1]
var/cost = text2num(O[2])
var/path_obj = text2path(path_text)
// Because we're using strings, this comes up if item paths change.
// Failure to handle this error borks uplinks entirely. -Sayu
if(!path_obj)
error("Syndicate item is not a valid path: [path_text]")
else
var/itemname = O[3]
items_nano[items_nano.len]["items"] += list(list("Name" = itemname, "Cost" = cost, "obj_path" = path_text))
return items_nano
//Let's build a menu!
/obj/item/device/uplink/proc/generate_menu()
@@ -230,8 +264,8 @@ A list of items and costs is stored under the datum of every game mode, alongsid
feedback_add_details("traitor_uplink_items_bought","ST")
/obj/item/device/uplink/Topic(href, href_list)
if (href_list["buy_item"])
if(href_list["buy_item"] == "random")
var/boughtItem = chooseRandomItem()
if(boughtItem)
@@ -299,31 +333,48 @@ A list of items and costs is stored under the datum of every game mode, alongsid
return 1
return 0
// Interaction code. Gathers a list of items purchasable from the paren't uplink and displays it. It also adds a lock button.
/obj/item/device/uplink/hidden/interact(mob/user as mob)
/*
NANO UI FOR UPLINK WOOP WOOP
*/
/obj/item/device/uplink/hidden/ui_interact(mob/user, ui_key = "main")
var/title = "Syndicate Uplink"
var/data[0]
data["crystals"] = uses
data["nano_items"] = nanoui_items
data["welcome"] = welcome
var/dat = "<body link='yellow' alink='white' bgcolor='#601414'><font color='white'>"
dat += src.generate_menu()
dat += "<A href='byond://?src=\ref[src];lock=1'>Lock</a>"
dat += "</font></body>"
user << browse(dat, "window=hidden")
onclose(user, "hidden")
return
var/datum/nanoui/ui = nanomanager.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, "uplink.tmpl", title, 450, 600)
// When the UI is first opened this is the data it will use
ui.set_initial_data(data)
ui.open()
else
// The UI is already open so push the new data to it
ui.push_data(data)
return
// Interaction code. Gathers a list of items purchasable from the paren't uplink and displays it. It also adds a lock button.
/obj/item/device/uplink/hidden/interact(mob/user)
ui_interact(user)
// The purchasing code.
/obj/item/device/uplink/hidden/Topic(href, href_list)
if (usr.stat || usr.restrained())
return
if (!( istype(usr, /mob/living/carbon/human)))
return 0
var/mob/user = usr
var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main")
if ((usr.contents.Find(src.loc) || (in_range(src.loc, usr) && istype(src.loc.loc, /turf))))
usr.set_machine(src)
if(href_list["lock"])
toggle()
usr << browse(null, "window=hidden")
ui.close()
return 1
if(..(href, href_list) == 1)
@@ -334,7 +385,7 @@ A list of items and costs is stored under the datum of every game mode, alongsid
A.put_in_any_hand_if_possible(I)
purchase_log += "[usr] ([usr.ckey]) bought [I]."
interact(usr)
return
return 1
// I placed this here because of how relevant it is.
// You place this in your uplinkable item to check if an uplink is active or not.
+4
View File
@@ -254,13 +254,17 @@
'nano/templates/geoscanner.tmpl',
'nano/templates/dna_modifier.tmpl',
'nano/templates/telescience_console.tmpl',
'nano/templates/pda.tmpl',
'nano/templates/uplink.tmpl',
'nano/images/uiBackground.png',
'nano/images/uiIcons16.png',
'nano/images/uiIcons24.png',
'nano/images/uiBackground-Syndicate.png',
'nano/images/uiLinkPendingIcon.gif',
'nano/images/uiMaskBackground.png',
'nano/images/uiNoticeBackground.jpg',
'nano/images/uiTitleFluff.png',
'nano/images/uiTitleFluff-Syndicate.png',
'html/search.js',
'html/panels.css',
'icons/pda_icons/pda_atmos.png',
+3
View File
@@ -136,10 +136,13 @@ nanoui is used to open and update nano browser uis
close()
return
if ((allowed_user_stat > -1) && (user.stat > allowed_user_stat))
set_status(STATUS_DISABLED, push_update) // no updates, completely disabled (red visibility)
else if (user.restrained() || user.lying)
set_status(STATUS_UPDATE, push_update) // update only (orange visibility)
else if (istype(src_object, /obj/item/device/uplink/hidden)) // You know what if they have the uplink open let them use the UI
set_status(STATUS_INTERACTIVE, push_update) // Will build in distance checks on the topics for sanity.
else if (!(src_object in view(4, user))) // If the src object is not in visable, set status to 0
set_status(STATUS_DISABLED, push_update) // interactive (green visibility)
else if (dist <= 1)
+126 -1
View File
@@ -23,7 +23,9 @@ hr {
padding: 0px 4px 4px 4px;
margin: 0 2px 2px 0;
cursor:default;
white-space: nowrap;
}
.hasIcon {
padding: 0px 4px 4px 0px;
}
@@ -138,6 +140,12 @@ h4 {
clear: both;
padding: 8px;
}
.white {
color: white;
font-weight: bold;
}
.good {
color: #4f7529;
font-weight: bold;
@@ -192,6 +200,8 @@ div.notice {
margin: 4px 0 0 0;
clear: both;
}
.itemLabel {
float: left;
width: 30%;
@@ -206,6 +216,13 @@ div.notice {
width: 20%;
color: #e9c183;
}
.itemLabelWide {
float: left;
width: 45%;
color: #e9c183;
}
.itemContentWide {
float: left;
width: 79%;
@@ -214,6 +231,11 @@ div.notice {
float: left;
width: 33%;
}
.itemContentMedium {
float: left;
width: 55%;
}
.statusDisplay {
background: #000000;
color: #ffffff;
@@ -221,6 +243,17 @@ div.notice {
padding: 4px;
margin: 3px 0;
}
.statusDisplayRecords {
background: #000000;
color: #ffffff;
border: 1px solid #40628a;
padding: 4px;
margin: 3px 0;
overflow-x: hidden;
overflow-y: auto;
}
.statusLabel {
width: 138px;
float: left;
@@ -307,7 +340,17 @@ div.notice {
float: left;
}
.fixedLeftWide {
width: 150px;
width: 165px;
float: left;
}
.fixedLeftWider{
width: 220px;
float: left;
}
.fixedLeftWidest{
width: 250px;
float: left;
}
@@ -315,6 +358,24 @@ div.notice {
float: right;
}
/* Used in PDA */
.wholeScreen
{
position: absolute
color: #517087;
font-size: 16px;
font-weight: bold;
text-align:center;
}
.pdalink
{
float: left;
white-space:nowrap;
}
/* DNA Modifier UI (dna_modifier.tmpl) */
.dnaBlock
@@ -363,3 +424,67 @@ div.notice {
margin: 200px 0;
text-align: center;
}
/* Table stuffs for power monitor */
table.pmon
{
border:2px solid RoyalBlue;
}
table.pmon td, table.pmon th
{
border-bottom:1px dotted black;
padding:0px 5px 0px 5px;
}
/* Table Stuffs for manifest*/
th.command
{
background: #3333FF;
font-weight: bold;
color: #ffffff;
}
th.sec
{
background: #8e0000;
font-weight: bold;
color: #ffffff;
}
th.med
{
background: #006600;
font-weight: bold;
color: #ffffff;
}
th.eng
{
background: #b27300;
font-weight: bold;
color: #ffffff;
}
th.sci
{
background: #a65ba6;
font-weight: bold;
color: #ffffff;
}
th.civ
{
background: #a32800;
font-weight: bold;
color: #ffffff;
}
th.misc
{
background: #666666;
font-weight: bold;
color: #ffffff;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

+14
View File
@@ -15,6 +15,20 @@ NanoBaseHelpers = function ()
var initHelpers = function ()
{
$.views.helpers({
syndicateMode: function() {
$('body').css("background-color","#8f1414");
$('body').css("background-image","url('uiBackground-Syndicate.png')");
$('body').css("background-position","50% 0");
$('body').css("background-repeat","repeat-x");
$('#uiTitleFluff').css("background-image","url('uiTitleFluff-Syndicate.png')");
$('#uiTitleFluff').css("background-position","50% 50%");
$('#uiTitleFluff').css("background-repeat", "no-repeat");
return '';
},
// Generate a Byond link
link: function( text, icon, parameters, status, elementClass, elementId) {
+930
View File
@@ -0,0 +1,930 @@
<!--
Title: PDA UI
Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm
-->
{^{if owner}}
<div class="item">
<div class="itemLabelNarrow">
<b>Functions</b>:
</div>
<div class="itemContent">
{^{:~link('Refresh', 'refresh', {'choice' : "Refresh"}, null, 'fixedLeft')}}
{^{:~link('Close', 'gear', {'choice' : "Close"}, null, 'fixedLeft')}}
{^{if idInserted}} {^{:~link('Update PDA Info', 'eject', {'choice' : "UpdateInfo"}, null, 'fixedLeftWide')}} {{/if}}
{^{if mode != 0}} {^{:~link('Return', 'arrowreturn-1-w', {'choice' : "Return"}, null, 'fixedLeft')}} {{/if}}
</div>
</div>
<br>
<div class="item">
<div class="itemLabelNarrow">
<b>Station Time</b>:
</div>
<div class="itemContent">
<span class="average">{^{:stationTime}}</span>
</div>
</div>
<br>
{^{if mode == 0}} <!-- Main Menu -->
<div class="item">
<div class="itemLabelNarrow">
Owner:
</div>
<div class="itemContent">
<span class="average">{^{:owner}}, {^{:ownjob}}</span>
</div>
</div>
<br>
<div class="item">
<div class="itemLabelNarrow">
ID:
</div>
<div class="itemContent">
{^{:~link(idLink, 'eject', {'choice' : "Authenticate"}, idInserted ? null : 'disabled', idInserted ? 'fixedLeftWidest' : 'fixedLeft')}}
</div>
</div>
<br>
<div class="item">
<div class="itemLabelNarrow">
<b>Cartridge</b>:
</div>
<div class="itemContent">
{^{:~link(cartridge ? cartridge.name : 'no cartridge', 'eject', {'choice' : "Eject"}, cartridge ? null : 'disabled', cartridge ? 'fixedLeftWider' : 'fixedLeft')}}
</div>
</div>
<div class="item">
<H2>Functions</H2>
</div>
<div class="item">
<div class="itemLabelNarrow">
<b>General</b>:
</div>
<div class="itemContent">
{^{:~link('Notekeeper', 'note', {'choice' : "1"},null, 'fixedLeftWide')}}
{^{:~link('Messenger', newMessage ? 'mail-closed' : 'mail-open', {'choice' : "2"},null, 'fixedLeftWide')}}
{^{:~link('Crew Manifest', 'contact', {'choice' : "41"},null, 'fixedLeftWide')}}
</div>
</div>
<br>
{^{if cartridge}}
{^{if cartridge.access.access_clown == 1}}
<div class="item">
<div class="itemLabelNarrow">
<b>Clown</b>:
</div>
<div class="itemContent">
{^{:~link('Honk Synthesizer', 'gear', {'choice' : "Honk"},null, 'fixedLeftWide')}}
</div>
</div>
<br>
{{/if}}
{^{if cartridge.access.access_engine == 1}}
<div class="item">
<div class="itemLabelNarrow">
<b>Engineering</b>:
</div>
<div class="itemContent">
{^{:~link('Power Monitor', 'alert', {'choice' : "43"},null, 'fixedLeftWide')}}
</div>
</div>
<br>
{{/if}}
{^{if cartridge.access.access_medical == 1}}
<div class="item">
<div class="itemLabelNarrow">
<b>Medical</b>:
</div>
<div class="itemContent">
{^{:~link('Medical Records', 'gear', {'choice' : "44"},null, 'fixedLeftWide')}}
{^{:~link(scanmode == 1 ? 'Disable Med Scanner' : 'Enable Med Scanner', 'gear', {'choice' : "Medical Scan"},null , 'fixedLeftWide')}}
</div>
</div>
<br>
{{/if}}
{^{if cartridge.access.access_security == 1}}
<div class="item">
<div class="itemLabelNarrow">
<b>Security</b>:
</div>
<div class="itemContent">
{^{:~link('Security Records', 'gear', {'choice' : "45"},null, 'fixedLeftWide')}}
{^{if cartridge.radio ==1}} {^{:~link('Security Bot Access', 'gear', {'choice' : "46"},null, 'fixedLeftWide')}} {{/if}}
<br>
</div>
</div>
<br>
{{/if}}
{^{if cartridge.access.access_quartermaster == 1}}
<div class="item">
<div class="itemLabelNarrow">
<b>Quartermaster</b>:
</div>
<div class="itemContent">
{^{:~link('Supply Records', 'gear', {'choice' : "47"},null, 'fixedLeftWide')}}
{^{if cartridge.radio == 3}} {^{:~link('Delivery Bot Control', 'gear', {'choice' : "48"},null, 'fixedLeftWide')}} {{/if}}
<br>
</div>
</div>
<br>
{{/if}}
{{/if}}
<br>
<div class="item">
<div class = "itemLabelNarrow">
<b>Utilities</b>:
</div>
<div class = "itemContent">
{^{if cartridge}}
{^{if cartridge.access.access_status_display == 1}} {^{:~link('Status Display', 'gear', {'choice' : "42"},null, 'fixedLeftWide')}}{{/if}}
{^{if cartridge.access.access_janitor==1}} {^{:~link('Custodial Locator', 'gear', {'choice' : "49"},null, 'fixedLeftWide')}} {{/if}}
{^{if cartridge.radio == 2}} {^{:~link('Signaler System', 'gear', {'choice' : "40"},null, 'fixedLeftWide')}} {{/if}}
{^{if cartridge.access.access_reagent_scanner==1}} {^{:~link(scanmode == 3 ? 'Disable Reagent Scanner' : 'Enable Reagent Scanner', 'gear', {'choice' : "Reagent Scan"},null, 'fixedLeftWider')}} {{/if}}
{^{if cartridge.access.access_engine==1}} {^{:~link(scanmode == 4 ? 'Disable Halogen Counter' : 'Enable Halogen Counter', 'gear', {'choice' : "Halogen Counter"}, null, 'fixedLeftWider')}} {{/if}}
{^{if cartridge.access.access_atmos==1}} {^{:~link(scanmode == 5 ? 'Disable Gas Scanner' : 'Enable Gas Scanner', 'gear', {'choice' : "Gas Scan"}, null, 'fixedLeftWide')}} {{/if}}
{^{if cartridge.access.access_remote_door==1}}{^{:~link('Toggle Door', 'gear', {'choice' : "Toggle Door"},null, 'fixedLeftWide')}} {{/if}}
{{/if}}
{^{:~link('Atmospheric Scan', 'gear', {'choice' : "3"},null, 'fixedLeftWide')}}
{^{:~link(fon==1 ? 'Disable Flashlight' : 'Enable Flashlight', 'lightbulb', {'choice' : "Light"}, null,'fixedLeftWide')}}
</div>
</div>
{^{if pai}}
<div class="item">
<div class = "itemLabelNarrow">
<b>PAI Utilities</b>:
</div>
<div class = "itemContent">
{^{:~link('Configuration', 'gear', {'choice' : "pai", 'option' : "1"},null, 'fixedLeft')}}
{^{:~link('Eject pAI', 'eject', {'choice' : "pai", 'option' : "2"},null, 'fixedLeft')}}
</div>
</div>
{{/if}}
{{/if}}
{^{if mode == 1}} <!-- Notekeeper -->
<div class="item">
<div class="itemLabel">
<b>Notes</b>:
</div>
</div>
<div class="statusDisplay" style="height: 225px; overflow: auto;">
<div class="item">
<div class="itemContent" style="width: 100%;">
<span class="average">{^{:note}}</span>
</div>
</div>
</div>
<div class="item">
<div class="itemLabel">
{^{:~link('Edit Notes', 'gear', {'choice' : "Edit"},null, 'fixedLeft')}}
</div>
</div>
{{else mode == 2}} <!-- Messenger -->
<H2>SpaceMessenger V4.0.1</H2>
<div class="item">
<div class="itemLabelNarrow">
<b>Messenger Functions</b>:
</div>
<div class ="itemContent">
{^{:~link(silent==1 ? 'Ringer: Off' : 'Ringer: On', silent==1 ? 'volume-off' : 'volume-on', {'choice' : "Toggle Ringer"},null, 'fixedLeftWide')}}
{^{:~link(toff==1 ? 'Messenger: Off' : 'Messenger: On',toff==1 ? 'close':'check', {'choice' : "Toggle Messenger"},null, 'fixedLeftWide')}}
{^{:~link('Set Ringtone', 'comment', {'choice' : "Ringtone"}, null, 'fixedLeftWide')}}
{^{:~link('Delete all Conversations', 'trash', {'choice' : "Clear", 'option' : "All"},null, 'fixedLeftWider')}}
</div>
</div>
{^{if toff == 0}}
<br><br>
{^{if cartridge}}
{^{if cartridge.charges}}
<div class="item">
<b>{^{:cartridge.charges}}
{^{if cartridge.type == "/obj/item/weapon/cartridge/syndicate"}} detonation charges left. {{/if}}
{^{if cartridge.type == "/obj/item/weapon/cartridge/clown" || cartridge.type == "/obj/item/weapon/cartridge/mime"}} viral files left. {{/if}}
</b><br><br>
</div>
{{/if}}
{{/if}}
{^{if pda_count == 0}}<B>No other PDAS located</B>
{{else}}
<H3>Current Conversations</H3>
{^{for convopdas}}
<div class="item">
{^{:~link(Name, 'circle-arrow-s', {'choice' : "Select Conversation", 'convo' : Reference } , null, fixedLeftWider)}}
{^{if ~root.cartridge}}
{^{if ~root.cartridge.type == "/obj/item/weapon/cartridge/syndicate" && Detonate == 1}} {^{:~link('*Detonate*', 'radiation', {'choice' : "Detonate", 'target' : Reference}, null, 'fixedLeft')}} {{/if}}
{^{if ~root.cartridge.type == "/obj/item/weapon/cartridge/clown"}} {^{:~link('*Send Virus*', 'star', {'choice' : "Send Honk", 'target' : Reference}, null, 'fixedLeft')}} {{/if}}
{^{if ~root.cartridge.type == "/obj/item/weapon/cartridge/mime"}} {^{:~link('*Send Virus*', 'circle-arrow-s', {'choice' : "Send Silence", 'target' : Reference}, null, 'fixedLeft')}} {{/if}}
{{/if}}
</div>
{{/for}}
<H3>Other PDAs</H3>
{^{for pdas}}
<div class="item">
{^{:~link(Name, 'circle-arrow-s', {'choice' : "Message", 'target' : Reference}, null, fixedLeftWider)}}
{^{if ~root.cartridge}}
{^{if ~root.cartridge.type == "/obj/item/weapon/cartridge/syndicate" && Detonate == 1}} {^{:~link('*Detonate*', 'radiation', {'choice' : "Detonate", 'target' : Reference}, null, 'fixedLeft')}} {{/if}}
{^{if ~root.cartridge.type == "/obj/item/weapon/cartridge/clown"}} {^{:~link('*Send Virus*', 'star', {'choice' : "Send Honk", 'target' : Reference}, null, 'fixedLeft')}} {{/if}}
{^{if ~root.cartridge.type == "/obj/item/weapon/cartridge/mime"}} {^{:~link('*Send Virus*', 'circle-arrow-s', {'choice' : "Send Silence", 'target' : Reference}, null, 'fixedLeft')}} {{/if}}
{{/if}}
</div>
{{/for}}
{{/if}}
{{/if}}
{{else mode == 21}} <!-- Messenger -->
<H2>SpaceMessenger V4.0.1</H2>
<div class="item">
<div class="itemLabel">
<b>Messenger Functions</b>:
</div>
<div class ="itemContent">
{^{:~link('Delete Conversation', 'trash', {'choice' : "Clear", 'option' : "Convo"},null, 'fixedLeftWide')}}
</div>
</div>
<br><br>
<H3>Conversation with:&nbsp;<span class="average">{^{:convo_name}}&nbsp;({^{:convo_job}})</span></H3>
<div class="statusDisplay" style="height: 250px; overflow: auto;">
<div class="item">
<div class="itemContent" style="width: 100%;">
{^{for messages}}
{^{if ~root.active_conversation == target}}
{^{if sent==0}}
<span class="average"><B>Them</B>: {^{:message}}</span><br>
{{else}}
<span class="good"><B>You</B>: {^{:message}}</span><br>
{{/if}}
{{/if}}
{{/for}}
</div>
</div>
</div>
{^{:~link('Reply', 'comment', {'choice' : "Message", 'target': active_conversation},null, 'fixedLeft')}}
{{else mode== 41}} <!-- Manifest -->
<div class="item">
<center><table class="pmon"><tbody>
{^{if manifest.heads.length}}
<tr><th colspan="3" class="command">Command</th></tr>
{^{for manifest["heads"]}}
{^{if rank == "Captain"}}
<tr><td><span class="good">{^{:name}}</span></td><td><span class="good">{^{:rank}}</span></td><td><span class="good">{^{:active}}</span></td></tr>
{{else}}
<tr><td><span class="average">{^{:name}}</td><td><span class="average">{^{:rank}}</span></td><td><span class="average">{^{:active}}</span></td></tr>
{{/if}}
{{/for}}
{{/if}}
{^{if manifest.sec.length}}
<tr><th colspan="3" class="sec">Security</th></tr>
{^{for manifest["sec"]}}
{^{if rank == "Head of Security"}}
<tr><td><span class="good">{^{:name}}</span></td><td><span class="good">{^{:rank}}</span></td><td><span class="good">{^{:active}}</span></td></tr>
{{else}}
<tr><td><span class="average">{^{:name}}</td><td><span class="average">{^{:rank}}</span></td><td><span class="average">{^{:active}}</span></td></tr>
{{/if}}
{{/for}}
{{/if}}
{^{if manifest.eng.length}}
<tr><th colspan="3" class="eng">Engineering</th></tr>
{^{for manifest["eng"]}}
{^{if rank == "Chief Engineer"}}
<tr><td><span class="good">{^{:name}}</span></td><td><span class="good">{^{:rank}}</span></td><td><span class="good">{^{:active}}</span></td></tr>
{{else}}
<tr><td><span class="average">{^{:name}}</td><td><span class="average">{^{:rank}}</span></td><td><span class="average">{^{:active}}</span></td></tr>
{{/if}}
{{/for}}
{{/if}}
{^{if manifest.med.length}}
<tr><th colspan="3" class="med">Medical</th></tr>
{^{for manifest["med"]}}
{^{if rank == "Chief Medical Officer"}}
<tr><td><span class="good">{^{:name}}</span></td><td><span class="good">{^{:rank}}</span></td><td><span class="good">{^{:active}}</span></td></tr>
{{else}}
<tr><td><span class="average">{^{:name}}</td><td><span class="average">{^{:rank}}</span></td><td><span class="average">{^{:active}}</span></td></tr>
{{/if}}
{{/for}}
{{/if}}
{^{if manifest.sci.length}}
<tr><th colspan="3" class="sci">Science</th></tr>
{^{for manifest["sci"]}}
{^{if rank == "Research Director"}}
<tr><td><span class="good">{^{:name}}</span></td><td><span class="good">{^{:rank}}</span></td><td><span class="good">{^{:active}}</span></td></tr>
{{else}}
<tr><td><span class="average">{^{:name}}</td><td><span class="average">{^{:rank}}</span></td><td><span class="average">{^{:active}}</span></td></tr>
{{/if}}
{{/for}}
{{/if}}
{^{if manifest.civ.length}}
<tr><th colspan="3" class="civ">Civilian</th></tr>
{^{for manifest["civ"]}}
{^{if rank == "Head of Personnel"}}
<tr><td><span class="good">{^{:name}}</span></td><td><span class="good">{^{:rank}}</span></td><td><span class="good">{^{:active}}</span></td></tr>
{{else}}
<tr><td><span class="average">{^{:name}}</td><td><span class="average">{^{:rank}}</span></td><td><span class="average">{^{:active}}</span></td></tr>
{{/if}}
{{/for}}
{{/if}}
{^{if manifest.misc.length}}
<tr><th colspan="3" class="misc">Misc</th></tr>
{^{for manifest["misc"]}}
<tr><td><span class="average">{^{:name}}</td><td><span class="average">{^{:rank}}</span></td><td><span class="average">{^{:active}}</span></td></tr>
{{/for}}
{{/if}}
</tbody></table></center>
</div>
{{else mode == 3}}
<H2>Atmospheric Scan</H2>
<div class="statusDisplay" style="height: 250px; overflow: auto;">
<div class="item">
{^{if aircontents.reading == 1}}
<div class="itemLabel">
Pressure:
</div>
<div class = "itemContent">
{^{:~string('<span class="{0}">{1} kPa</span>', aircontents.pressure < 80 || aircontents.pressure > 120 ? 'bad' : aircontents.pressure < 95 || aircontents.pressure > 110 ? 'average' : 'good' , aircontents.pressure)}}
</div>
<div class="itemLabel">
Temperature:
</div>
<div class = "itemContent">
{^{:~string('<span class="{0}">{1} &deg;C</span>', aircontents.temp < 5 || aircontents.temp > 35 ? 'bad' : aircontents.temp < 15 || aircontents.temp > 25 ? 'average' : 'good' , aircontents.temp)}}
</div>
<br>
<div class="itemLabel">
Oxygen:
</div>
<div class = "itemContent">
{^{:~string('<span class="{0}">{1}%</span>', aircontents.oxygen < 17 ? 'bad' : aircontents.oxygen < 19 ? 'average' : 'good' , aircontents.oxygen)}}
</div>
<div class="itemLabel">
Nitrogen:
</div>
<div class = "itemContent">
{^{:~string('<span class="{0}">{1}%</span>', aircontents.nitrogen > 82 ? 'bad' : aircontents.nitrogen > 80 ? 'average' : 'good' , aircontents.nitrogen)}}
</div>
<div class="itemLabel">
Carbon Dioxide:
</div>
<div class = "itemContent">
{^{:~string('<span class="{0}">{1}%</span>', aircontents.carbon_dioxide > 5 ? 'bad' : 'good' , aircontents.carbon_dioxide)}}
</div>
<div class="itemLabel">
Plasma:
</div>
<div class = "itemContent">
{^{:~string('<span class="{0}">{1}%</span>', aircontents.plasma > 0 ? 'bad' : 'good' , aircontents.plasma)}}
</div>
{^{if aircontents.other > 0}}
<div class="itemLabel">
Unknown:
</div>
<div class = "itemContent">
<span class="bad">{^{:aircontents.other}}%</span>
</div>
{{/if}}
{{else}}
<div class="itemContent" style="width: 100%;">
<span class="average"><b>Unable to get air reading</b></span>
</div>
{{/if}}
</div>
</div>
{{else mode == 40}} <!-- Cartridge: Signaler -->
<H2>Remote Signaling System</H2>
<div class="item">
<div class="itemLabel">
<b>Frequency</b>:
</div>
<div class="itemContent">
{^{:records.signal_freq}}
<br>
&nbsp;{^{:~link('-1', null, {'cartmenu' : "1", 'choice' : "Signal Frequency", 'sfreq' : "-10"},null, null)}}&nbsp;
{^{:~link('-.2', null, {'cartmenu' : "1", 'choice' : "Signal Frequency", 'sfreq' : "-2"},null, null)}}&nbsp;
{^{:~link('+.2', null, {'cartmenu' : "1", 'choice' : "Signal Frequency", 'sfreq' : "2"},null, null)}}&nbsp;
{^{:~link('+1', null, {'cartmenu' : "1", 'choice' : "Signal Frequency", 'sfreq' : "10"},null, null)}}
</div>
</div>
<br><br>
<div class="item">
<div class="itemLabel">
<b>Code</b>:
</div>
<div class="itemContent">
<span class="average">
{^{:records.signal_code}}<br>
</span>
{^{:~link('-5', null, {'cartmenu' : "1", 'choice' : "Signal Code", 'scode' : "-5"},null, null)}}
{^{:~link('-1', null, {'cartmenu' : "1", 'choice' : "Signal Code", 'scode' : "-1"},null, null)}}
{^{:~link('+1', null, {'cartmenu' : "1", 'choice' : "Signal Code", 'scode' : "1"},null, null)}}
{^{:~link('+5', null, {'cartmenu' : "1", 'choice' : "Signal Code", 'scode' : "5"},null, null)}}
</div>
</div>
<div class="item">
{^{:~link('Send Signal', 'radiation', {'cartmenu' : "1", 'choice' : "Send Signal"},null, null)}}
</div>
{{else mode == 42}}
<H2>Station Status Displays Interlink</H2>
<div class="item">
<div class="itemLabel">
<b>Code</b>:
</div>
<div class="itemContent">
{^{:~link('Clear', 'trash', {'cartmenu' : "1", 'choice' : "Status", 'statdisp' : "blank"},null, null)}}
{^{:~link('Shuttle ETA', 'gear', {'cartmenu' : "1", 'choice' : "Status",'statdisp' : "shuttle"},null, null)}}
{^{:~link('Message', 'gear', {'cartmenu' : "1", 'choice' : "Status",'statdisp' : "message"},null, null)}}
</div>
</div>
<br>
<div class="item">
<div class="itemLabel">
<b>Message line 1</b>
</div>
<div class="itemContent">
{^{:~link(records.message1 + ' (set)', 'pencil', {'cartmenu' : "1", 'choice' : "Status",'statdisp' : "setmsg1"},null, null)}}
</div>
</div>
<div class="item">
<div class="itemLabel">
<b>Message line 2</b>
</div>
<div class="itemContent">
{^{:~link(records.message2 + ' (set)', 'pencil', {'cartmenu' : "1", 'choice' : "Status",'statdisp' : "setmsg2"},null, null)}}
</div>
</div>
<br>
<div class="item">
<div class="itemLabel">
<b> ALERT!</b>:
</div>
<div class="itemContent">
{^{:~link('None', 'alert', {'cartmenu' : "1", 'choice' : "Status",'statdisp' : "alert", 'default' : "alert"},null, null)}}
{^{:~link('Alert', 'alert', {'cartmenu' : "1", 'choice' : "Status",'statdisp' : "alert", 'alert' : "alert"},null, null)}}
{^{:~link('Lockdown', 'caution', {'cartmenu' : "1", 'choice' : "Status",'statdisp' : "alert", 'alert' : "alert"},null, null)}}
{^{:~link('Biohazard', 'radiation', {'cartmenu' : "1", 'choice' : "Status",'statdisp' : "alert", 'alert' : "alert"},null, null)}}
</div>
</div>
{{else mode == 43}}
<H2>Station Powermonitors</H2>
<div class="item">
Select A power monitor:
</div>
{^{for records.powermonitors}}
<div class="item">
{^{:~link(Name, 'radiation', {'cartmenu' : "1", 'choice' : "Power Select",'target' : ref},null, null)}}
</div>
{{/for}}
{{else mode == 433}}
<H2>Powernet Status</H2>
<div class="item">
<div class="itemLabelNarrow">
<b>Current Load</b>:
</div>
<div class="itemContent">
<span class="average">{^{:records.powerload}} W</span>
</div>
</div>
<div class="item">
<div class="itemLabelNarrow">
<b>Total Power</b>:
</div>
<div class="itemContent">
<span class="average">{^{:records.poweravail}} W</span>
</div>
</div>
<br>
<div class="item">
<table class="curvedEdges"><tbody>
{^{for records.apcs}}
{^{if #index % 20 === 0}}
<tr class=><th>&nbsp;Area&nbsp;</th><th>&nbsp;Eqp.&nbsp;</th><th>&nbsp;Lgt.&nbsp;</th><th>&nbsp;Env&nbsp;</th><th>&nbsp;Cell&nbsp;</th></tr>
{{/if}}
<tr class=><td><span class="average">{^{:Name}}</span></td>
{^{:~string('<td bgcolor="{0}">&nbsp;</td>', Equipment==1 ? '#4f7529' : '#8f1414' )}}
{^{:~string('<td bgcolor="{0}">&nbsp;</td>', Lights==1 ? '#4f7529' : '#8f1414' )}}
{^{:~string('<td bgcolor="{0}">&nbsp;</td>', Environment==1 ? '#4f7529' : '#8f1414' )}}
{^{:~string('<td bgcolor="{0}">{1}</td>', CellStatus==1 ? '#4f7529' : '#8f1414', CellStatus==-1 ? 'No Cell' : CellPct + '%' )}}
</tr>
{{/for}}
</tbody></table>
</div>
{{else mode == 44}}
<H2>Medical Record List</H2>
<div class="item">
Select A record
</div>
<br>
{^{for records.medical_records}}
<div class="item">
{^{:~link(Name, 'gear', {'cartmenu' : "1", 'choice' : "Medical Records",'target' : ref},null, null)}}
</div>
{{/for}}
{{else mode == 441}}
<H2>Medical Record</H2>
<div class="statusDisplayRecords" style="height: 400px;">
<div class="item">
<div class="itemContent" style="width: 100%;">
{^{if records.general_exists == 1}}
<span class="good">Name: </span> <span class="average">{^{:records.general.name}} </span><br>
<span class="good">Sex: </span> <span class="average">{^{:records.general.sex}} </span><br>
<span class="good">Species: </span> <span class="average">{^{:records.general.species}} </span><br>
<span class="good">Age: </span> <span class="average">{^{:records.general.age}} </span><br>
<span class="good">Rank: </span> <span class="average">{^{:records.general.rank}} </span><br>
<span class="good">Fingerprint: </span> <span class="average">{^{:records.general.fingerprint}} </span><br>
<span class="good">Physical Status: </span> <span class="average">{^{:records.general.p_stat}} </span><br>
<span class="good">Mental Status: </span> <span class="average">{^{:records.general.m_stat}} </span><br><br>
{{else}}
<span class="bad">
General Record Lost!<br><br>
</span>
{{/if}}
{^{if records.medical_exists == 1}}
Medical Data:<br>
<span class="good">Blood Type: </span> <span class="average">{^{:records.medical.b_type}} </span><br><br>
<span class="good">Minor Disabilities: </span> <span class="average">{^{:records.medical.mi_dis}} </span><br>
<span class="good">Details: </span> <span class="average">{^{:records.medical.mi_dis_d}} </span><br><br>
<span class="good">Major Disabilities: </span> <span class="average">{^{:records.medical.ma_dis}} </span><br>
<span class="good">Details: </span> <span class="average">{^{:records.medical.ma_dis_d}} </span><br><br>
<span class="good">Allergies: </span> <span class="average">{^{:records.medical.alg}} </span><br>
<span class="good">Details: </span> <span class="average">{^{:records.medical.alg_d}} </span><br><br>
<span class="good">Current Disease: </span> <span class="average">{^{:records.medical.cdi}} </span><br>
<span class="good">Details: </span> <span class="average">{^{:records.medical.alg_d}} </span><br><br>
<span class="good">Important Notes: </span> <span class="average">{^{:records.medical.notes}} </span>
{{else}}
<span class="bad">
Medical Record Lost!<br><br>
</span>
{{/if}}
</div>
</div>
</div>
{{else mode == 45}}
<H2>Security Record List</H2>
<div class="item">
Select A record
</div>
<br>
{^{for records.security_records}}
<div class="item">
{^{:~link(Name, 'gear', {'cartmenu' : "1", 'choice' : "Security Records",'target' : ref},null, null)}}
</div>
{{/for}}
{{else mode == 451}}
<H2>Security Record</H2>
<div class="statusDisplayRecords" style="height: 400px;">
<div class="item">
<div class="itemContent" style="width: 100%;">
{^{if records.general_exists == 1}}
<span class="good">Name: </span> <span class="average"> {^{:records.general.name}}</span><br>
<span class="good">Sex: </span> <span class="average">{^{:records.general.sex}} </span><br>
<span class="good">Species: </span> <span class="average">{^{:records.general.species}} </span><br>
<span class="good">Age: </span> <span class="average">{^{:records.general.age}} </span><br>
<span class="good">Rank: </span> <span class="average">{^{:records.general.rank}} </span><br>
<span class="good">Fingerprint: </span> <span class="average">{^{:records.general.fingerprint}} </span><br>
<span class="good">Physical Status: </span> <span class="average">{^{:records.general.p_stat}} </span><br>
<span class="good">Mental Status: </span> <span class="average">{^{:records.general.m_stat}} </span><br><br>
{{else}}
<span class="bad">
General Record Lost!<br><br>
</span>
{{/if}}
{^{if records.security_exists == 1}}
Security Data:<br>
<span class="good">Criminal Status: </span><span class="average">{^{:records.security.criminal}} </span><br><br>
<span class="good">Minor Crimes: </span><span class="average">{^{:records.security.mi_crim}} </span><br>
<span class="good">Details: </span><span class="average">{^{:records.security.mi_crim_d}} </span><br><br>
<span class="good">Major Crimes: </span><span class="average">{^{:records.security.ma_crim}} </span><br>
<span class="good">Details: </span><span class="average">{^{:records.security.ma_crim_d}} </span><br><br>
<span class="good">Important Notes: </span><span class="average">{^{:records.security.notes}} </span>
{{else}}
<span class="bad">
Security Record Lost!<br><br>
</span>
{{/if}}
</div>
</div>
</div>
{{else mode == 46}}
<H2>Security Bot Control </H2>
{^{if records.beepsky.active == null || records.beepsky.active == 0}}
{^{if records.beepsky.count == 0}}
<H1><span class="bad">No bots found.</span></H1>
{{else}}
<div class="item">
Select A Bot.
</div>
<br>
{^{for records.beepsky.bots}}
<div class="item">
{^{:~link(Name, 'gear', {'radiomenu' : "1", 'op' : "control",'bot' : ref},null, null)}} (Location: {^{:Location}})
</div>
{{/for}}
{{/if}}
<br>
{^{:~link('Scan for Bots','gear', {'radiomenu' : "1", 'op' : "scanbots"},null, null)}}
{{else}}
<H1><span class="average">{^{:records.beepsky.active}}</span></H1>
<br><br>
{^{if records.beepsky.botstatus.mode == -1}}
<H1><span class="bad">Waiting for response...</span></H1>
{{else}}
<H1><span class="good">Status:</span></H1>
<br>
<div class = "item">
<div class="itemLabel">
<span class="good">Location:</span>
</div>
<div class="itemContent">
<span class="average">{^{:records.beepsky.botstatus.loca}}</span>
</div>
</div>
<div class = "item">
<div class="itemLabel">
<span class="good">Mode:</span>
</div>
<div class="itemContent">
<span class="average">
{^{if records.beepsky.botstatus.mode ==0}} Ready
{{else records.beepsky.botstatus.mode == 1}}
Apprehending target
{{else records.beepsky.botstatus.mode ==2 || records.beepsky.botstatus.mode == 3}}
Arresting target
{{else records.beepsky.botstatus.mode ==4}}
Starting patrol
{{else records.beepsky.botstatus.mode ==5}}
On Patrol
{{else records.beepsky.botstatus.mode ==6}}
Responding to summons
{{/if}}
</span>
</div>
</div>
<div class="item">
{^{:~link('Stop Patrol', 'gear', {'radiomenu' : "1", 'op' : "stop"},null, null)}}
{^{:~link('Start Patrol', 'gear', {'radiomenu' : "1", 'op' : "go"},null, null)}}
{^{:~link('Summon Bot', 'gear', {'radiomenu' : "1", 'op' : "summon"},null, null)}}
</div>
{{/if}}
{^{:~link('Return to Bot list', 'gear', {'radiomenu' : "1", 'op' : "botlist"},null, null)}}
{{/if}}
{{else mode == 47}}
<H1><span class="average">Supply Record Interlink</span></H1>
<div class = "item">
<div class="itemLabelNarrow">
<span class="good">Location:</span>
</div>
<div class="itemContent">
<span class="average">
{^{if records.supply.shuttle_moving}}
Moving to station ({^{:records.supply.shuttle_eta}})
{{else}}
Shuttle at {^{:records.supply.shuttle_loc}}
{{/if}}
</span>
</div>
</div>
<div class="statusDisplay" style="height: 325px; overflow-y:scroll; word-wrap:normal;">
<div class="item">
<div class="itemContent" style="width: 100%;">
<span class="good"><B>Current Approved Orders</B></span><br>
{^{if records.supply.approved_count == 0}}
<span class="average"> No current approved orders </span><br><br>
{{else}}
{^{for records.supply.approved}}
<span class="average">#{^{:Number}} - {^{:Name}} approved by {^{:OrderedBy}}<br>{^{if Comment != ""}} {^{:Comment}} <br>{{/if}}<br></span>
{{/for}}
{{/if}}
<br><br>
<span class="good"><B>Current Requested Orders</B></span><br>
{^{if records.supply.requests_count == 0}}
<span class="average"> No current requested orders </span
><br><br>
{{else}}
{^{for records.supply.requests}}
<span class="average">#{^{:Number}} - {^{:Name}} requested by {^{:OrderedBy}}<br>{^{if Comment != ""}} {^{:Comment}} <br>{{/if}}<br></span>
{{/for}}
{{/if}}
</div>
</div>
</div>
{{else mode == 48}}
<H2>Mule Control </H2>
{^{if records.mulebot.active == null || records.mulebot.active == 0}}
{^{if records.mulebot.count == 0}}
<H1><span class="bad">No bots found.</span></H1>
{{else}}
<H2>Mule List</H2>
<div class="item">
Select A Mulebot
</div>
<br>
{^{for records.mulebot.bots}}
<div class="item">
{^{:~link(Name, 'gear', {'radiomenu' : "1", 'op' : "control",'bot' : ref},null, null)}} (Location: {^{:Location}})
</div>
{{/for}}
{{/if}}
<br>
{^{:~link('Scan for Bots','gear', {'radiomenu' : "1", 'op' : "scanbots"},null, null)}}
{{else}}
{^{if records.mulebot.botstatus.mode == -1}}
<H1><span class="bad">Waiting for response...</span></H1>
{{else}}
<H1><span class="average">Status:</span></H1>
<br>
<div class="item">
<div class="itemLabel">
<span class="good">Location:</span>
</div>
<div class="itemContent">
<span class="average">{^{:records.mulebot.botstatus.loca}}</span>
</div>
</div>
<div class="item">
<div class="itemLabel">
<span class="good">Mode:</span>
</div>
<div class="itemContent">
<span class="average">
{^{if records.mulebot.botstatus.mode ==0}} Ready
{{else records.mulebot.botstatus.mode == 1}}
Loading/Unloading
{{else records.mulebot.botstatus.mode ==2}}
Navigating to Delivery Location
{{else records.mulebot.botstatus.mode == 3}}
Navigating to Home
{{else records.mulebot.botstatus.mode ==4}}
Waiting for Clear Path
{{else records.mulebot.botstatus.mode ==5 || records.mulebot.botstatus.mode == 6}}
Calculating navigation Path
{{else records.mulebot.botstatus.mode ==7}}
Unable to locate destination
{{/if}}
</span>
</div>
</div>
<div class="item">
<div class="itemLabel">
<span class="good">Current Load:</span>
</div>
<div class="itemContent">
<span class="average">
{^{:~link(records.mulebot.botstatus.load == null ? 'None (Unload)' : records.mulebot.botstatus.load + ' (Unload)', 'gear', {'radiomenu' : "1", 'op' : "unload"},records.mulebot.botstatus.load == null ? 'disabled' : null, null)}}
</span>
</div>
</div>
<div class="item">
<div class="itemLabel">
<span class="good">Power:</span>
</div>
<div class="itemContent">
<span class="average">
{^{:records.mulebot.botstatus.powr}}%
</span>
</div>
</div>
<div class="item">
<div class="itemLabel">
<span class="good">Destination:</span>
</div>
<div class="itemContent">
{^{:~link(records.mulebot.botstatus.dest == null || records.mulebot.botstatus.dest == "" ? 'None (Set)': records.mulebot.botstatus.dest+ ' (Set)', 'gear', {'radiomenu' : "1", 'op' : "setdest"},null, null)}}
</div>
</div>
<div class="item">
<div class="itemLabel">
<span class="good">Home:</span>
</div>
<div class="itemContent">
{^{if records.mulebot.botstatus.home == null}} None {{else}} {^{:records.mulebot.botstatus.home}} {{/if}}
</div>
</div>
<div class="item">
<div class="itemLabel">
<span class="good">Auto Return:</span>
</div>
<div class="itemContent">
{^{:~link(records.mulebot.botstatus.retn == 1 ? 'ON' : 'OFF', 'gear', {'radiomenu' : "1", 'op' : records.mulebot.botstatus.retn==1 ? "retoff" : "reton"},null, null)}}
</div>
</div>
<div class="item">
<div class="itemLabel">
<span class="good">Auto Pickup:</span>
</div>
<div class="itemContent">
{^{:~link(records.mulebot.botstatus.pick==1? 'ON' : 'OFF', 'gear', {'radiomenu' : "1", 'op' : records.mulebot.botstatus.pick==1 ? "pickoff" : "pickon"},null, null)}}
</div>
</div>
<div class="item">
<div class="itemLabel">
<span class="good">Functions:</span>
</div>
<div class="itemContent">
{^{:~link('Stop', 'gear', {'radiomenu' : "1", 'op' : "stop"},null, null)}}
{^{:~link('Proceed', 'gear', {'radiomenu' : "1", 'op' : "go"},null, null)}}
{^{:~link('Return Home', 'gear', {'radiomenu' : "1", 'op' : "home"},null, null)}}
</div>
</div>
<br><br>
{^{:~link('Return to Bot list', 'gear', {'radiomenu' : "1", 'op' : "botlist"},null, null)}}
{{/if}}
{{/if}}
{{else mode == 49}}
<H2>Janatorial Supplies Locator</H2>
<div class="item">
<span class="good">Current Location:</span>
{^{if records.janitor.user_loc.x == 0}}
<span class="bad">Unknown</span>
{{else}}
<span class="average"> {^{:records.janitor.user_loc.x}} / {^{:records.janitor.user_loc.y}}</span>
{{/if}}
</div>
<div class="item">
{^{for records.janitor.mops}}
{^{if x==0}}
<span class="bad">Unable to locate Mop</span>
{{else}}
<span class="good">Mop Location:</span>
<span class="average">({^{:x}} / {^{:y}}) - {^{:dir}} - Status: {^{:status}}</span><br>
{{/if}}
{{/for}}
</div>
<div class="item">
{^{for records.janitor.buckets}}
{^{if x==0}}
<span class="bad">Unable to locate Water Buckets</span>
{{else}}
<span class="good">Water Buckets Location:</span>
<span class="average">({^{:x}} / {^{:y}}) - {^{:dir}} - Water Level: {^{:status}}</span><br>
{{/if}}
{{/for}}
</div>
<div class="item">
{^{for records.janitor.cleanbots}}
{^{if x==0}}
<span class="bad">Unable to locate Clean Bots</span>
{{else}}
<span class="good">Clean Bots Location:</span>
<span class="average">({^{:x}} / {^{:y}}) - {^{:dir}} - Status: {^{:status}}</span><br>
{{/if}}
{{/for}}
</div>
<div class="item">
{^{for records.janitor.carts}}
{^{if x==0}}
<span class="bad">Unable to locate Janitorial Cart</span>
{{else}}
<span class="good">Janitorial cart Location:</span>
<span class="average">({^{:x}} / {^{:y}}) - {^{:dir}} - Status: {^{:status}}</span><br>
{{/if}}
{{/for}}
</div>
{{/if}}
{{else}}
<div class="wholeScreen"><br><br><br><br><br><br><br>No Owner information found, please swipe ID
</div>
{{/if}}
+46
View File
@@ -0,0 +1,46 @@
<!--
Title: Syndicate Uplink, uses some javascript to change nanoUI up a bit.
Used In File(s): \code\game\objects\items\devices\uplinks.dm
-->
{^{:~syndicateMode()}}
<H2><span class="white">{^{:welcome}}</span></H2>
<br>
<div class="item">
<div class="itemLabelNarrow">
<b>Functions</b>:
</div>
<div class="itemContent">
{^{:~link('Close', 'gear', {'lock' : "1"}, null, 'fixedLeft')}}
</div>
</div>
<br>
<div class="item">
<div class="itemLabel">
<b>Tele-Crystals</b>:
</div>
<div class="itemContent">
{^{:crystals}}
</div>
</div>
<H2><span class="white">Request items:</span></H2><br>
<span class="white"><i>Each item costs a number of tele-crystals as indicated by the number following their name.</i></span>
<br><br>
{^{for nano_items}}
<div class="item">
<H3><span class="white">{^{:Category}}</span></H3>
</div>
{^{for items}}
<div class="item">
{^{:~link( Name, 'gear', {'buy_item' : obj_path, 'cost' : Cost}, Cost > ~root.crystals ? 'disabled' : null, null)}} -<span class="white"> {^{:Cost}}</span>
</div>
{{/for}}
<br>
{{/for}}
<div class="item">
{^{:~link('Buy Random (??)' , 'gear', {'buy_item' : 'random'}, null, 'fixedLeftWidest')}}
</div>