mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-23 12:07:27 +01:00
pda refactor
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
#define PDA_APP_UPDATE 0
|
||||
#define PDA_APP_NOUPDATE 1
|
||||
#define PDA_APP_UPDATE_SLOW 2
|
||||
@@ -100,7 +100,7 @@
|
||||
/obj/screen/ai/pda_msg_send/Click()
|
||||
if(isAI(usr))
|
||||
var/mob/living/silicon/ai/AI = usr
|
||||
AI.cmd_send_pdamesg(usr)
|
||||
AI.aiPDA.cmd_send_pdamesg()
|
||||
|
||||
/obj/screen/ai/pda_msg_show
|
||||
name = "PDA - Show Message Log"
|
||||
@@ -109,7 +109,7 @@
|
||||
/obj/screen/ai/pda_msg_show/Click()
|
||||
if(isAI(usr))
|
||||
var/mob/living/silicon/ai/AI = usr
|
||||
AI.cmd_show_message_log(usr)
|
||||
AI.aiPDA.cmd_show_message_log()
|
||||
|
||||
/obj/screen/ai/image_take
|
||||
name = "Take Image"
|
||||
|
||||
@@ -133,11 +133,11 @@
|
||||
else
|
||||
msg += "However, we were unable to send you the $[pay] you're entitled."
|
||||
if(useMS && P)
|
||||
// THIS SHOULD HAVE DONE EVERYTHING FOR ME
|
||||
useMS.send_pda_message("[P.owner]", "[command_name()] Payroll", msg)
|
||||
|
||||
// BUT NOPE, NEED TO DO THIS BULLSHIT.
|
||||
P.play_ringtone()
|
||||
var/datum/data/pda/app/messenger/PM = P.find_program(/datum/data/pda/app/messenger)
|
||||
if(PM)
|
||||
PM.play_ringtone()
|
||||
//Search for holder of the PDA.
|
||||
var/mob/living/L = null
|
||||
if(P.loc && isliving(P.loc))
|
||||
|
||||
@@ -105,7 +105,9 @@ datum/game_mode/mutiny
|
||||
if (!pda)
|
||||
return 0
|
||||
|
||||
pda.play_ringtone()
|
||||
var/datum/data/pda/app/messenger/pdam = pda.find_program(/datum/data/pda/app/messenger)
|
||||
if(pdam)
|
||||
pdam.play_ringtone()
|
||||
|
||||
head_mutineer.current << fluff.get_pda_body()
|
||||
return 1
|
||||
|
||||
@@ -80,8 +80,9 @@
|
||||
F.update_brightness()
|
||||
else if(istype(I, /obj/item/device/pda))
|
||||
var/obj/item/device/pda/P = I
|
||||
P.fon = 0
|
||||
P.set_light(0)
|
||||
var/datum/data/pda/utility/flashlight/FL = P.find_program(/datum/data/pda/utility/flashlight)
|
||||
if(FL && FL.fon)
|
||||
FL.start()
|
||||
else if(istype(I, /obj/item/clothing/head/helmet/space/rig))
|
||||
var/obj/item/clothing/head/helmet/space/rig/R = I
|
||||
if(R.on)
|
||||
|
||||
@@ -205,8 +205,10 @@
|
||||
info = X.info
|
||||
else
|
||||
P = W
|
||||
itemname = P.name
|
||||
info = P.notehtml
|
||||
var/datum/data/pda/app/notekeeper/N = P.find_program(/datum/data/pda/app/notekeeper)
|
||||
if(N)
|
||||
itemname = P.name
|
||||
info = N.notehtml
|
||||
U << "You hold \the [itemname] up to the camera ..."
|
||||
U.changeNext_move(CLICK_CD_MELEE)
|
||||
for(var/mob/O in player_list)
|
||||
|
||||
@@ -408,7 +408,10 @@
|
||||
//Get out list of viable PDAs
|
||||
var/list/obj/item/device/pda/sendPDAs = list()
|
||||
for(var/obj/item/device/pda/P in PDAs)
|
||||
if(!P.owner || P.toff || P.hidden) continue
|
||||
var/datum/data/pda/app/messenger/PM = P.find_program(/datum/data/pda/app/messenger)
|
||||
|
||||
if(!PM || !PM.can_receive())
|
||||
continue
|
||||
sendPDAs += P
|
||||
if(PDAs && PDAs.len > 0)
|
||||
customrecepient = input(usr, "Select a PDA from the list.") as null|anything in sortAtom(sendPDAs)
|
||||
@@ -426,7 +429,6 @@
|
||||
|
||||
//Send message
|
||||
if("Send")
|
||||
|
||||
if(isnull(customsender) || customsender == "")
|
||||
customsender = "UNKNOWN"
|
||||
|
||||
@@ -438,36 +440,44 @@
|
||||
message = "<span class='notice'>NOTICE: No message entered!</span>"
|
||||
return src.attack_hand(usr)
|
||||
|
||||
var/datum/data/pda/app/messenger/recipient_messenger = customrecepient.find_program(/datum/data/pda/app/messenger)
|
||||
|
||||
if(!recipient_messenger)
|
||||
message = "<span class='warning'>ERROR: Message could not be transmitted!</span>"
|
||||
return src.attack_hand(usr)
|
||||
|
||||
var/obj/item/device/pda/PDARec = null
|
||||
for (var/obj/item/device/pda/P in PDAs)
|
||||
if (!P.owner || P.toff || P.hidden) continue
|
||||
var/datum/data/pda/app/messenger/PM = P.find_program(/datum/data/pda/app/messenger)
|
||||
|
||||
if (!PM || !PM.can_receive())
|
||||
continue
|
||||
if(P.owner == customsender)
|
||||
PDARec = P
|
||||
break
|
||||
//Sender isn't faking as someone who exists
|
||||
if(isnull(PDARec))
|
||||
src.linkedServer.send_pda_message("[customrecepient.owner]", "[customsender]","[custommessage]")
|
||||
customrecepient.play_ringtone()
|
||||
recipient_messenger.play_ringtone()
|
||||
if( customrecepient.loc && ishuman(customrecepient.loc) )
|
||||
var/mob/living/carbon/human/H = customrecepient.loc
|
||||
H << "\icon[customrecepient] <b>Message from [customsender] ([customjob]), </b>\"[custommessage]\" (<a href='byond://?src=\ref[src];choice=Message;skiprefresh=1;target=\ref[src]'>Reply</a>)"
|
||||
log_pda("[usr] (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]")
|
||||
customrecepient.overlays.Cut()
|
||||
customrecepient.overlays += image('icons/obj/pda.dmi', "pda-r")
|
||||
recipient_messenger.set_new(1)
|
||||
//Sender is faking as someone who exists
|
||||
else
|
||||
src.linkedServer.send_pda_message("[customrecepient.owner]", "[PDARec.owner]","[custommessage]")
|
||||
customrecepient.tnote.Add(list(list("sent" = 0, "owner" = "[PDARec.owner]", "job" = "[customjob]", "message" = "[custommessage]", "target" ="\ref[PDARec]")))
|
||||
recipient_messenger.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(!recipient_messenger.conversations.Find("\ref[PDARec]"))
|
||||
recipient_messenger.conversations.Add("\ref[PDARec]")
|
||||
|
||||
customrecepient.play_ringtone()
|
||||
recipient_messenger.play_ringtone()
|
||||
if( customrecepient.loc && ishuman(customrecepient.loc) )
|
||||
var/mob/living/carbon/human/H = customrecepient.loc
|
||||
H << "\icon[customrecepient] <b>Message from [PDARec.owner] ([customjob]), </b>\"[custommessage]\" (<a href='byond://?src=\ref[customrecepient];choice=Message;skiprefresh=1;target=\ref[PDARec]'>Reply</a>)"
|
||||
log_pda("[usr] (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]")
|
||||
customrecepient.overlays.Cut()
|
||||
customrecepient.overlays += image('icons/obj/pda.dmi', "pda-r")
|
||||
recipient_messenger.set_new(1)
|
||||
//Finally..
|
||||
ResetMessage()
|
||||
|
||||
|
||||
@@ -836,11 +836,11 @@
|
||||
icon_deny = "cart-deny"
|
||||
products = list(/obj/item/device/pda =10,/obj/item/weapon/cartridge/medical = 10,/obj/item/weapon/cartridge/chemistry = 10,
|
||||
/obj/item/weapon/cartridge/engineering = 10,/obj/item/weapon/cartridge/atmos = 10,/obj/item/weapon/cartridge/janitor = 10,
|
||||
/obj/item/weapon/cartridge/signal/toxins = 10,/obj/item/weapon/cartridge/signal = 10,/obj/item/weapon/cartridge = 10)
|
||||
/obj/item/weapon/cartridge/signal/toxins = 10,/obj/item/weapon/cartridge/signal = 10)
|
||||
contraband = list(/obj/item/weapon/cartridge/clown = 1,/obj/item/weapon/cartridge/mime = 1)
|
||||
prices = list(/obj/item/device/pda =300,/obj/item/weapon/cartridge/medical = 200,/obj/item/weapon/cartridge/chemistry = 150,/obj/item/weapon/cartridge/engineering = 100,
|
||||
/obj/item/weapon/cartridge/atmos = 75,/obj/item/weapon/cartridge/janitor = 100,/obj/item/weapon/cartridge/signal/toxins = 150,
|
||||
/obj/item/weapon/cartridge/signal = 75,/obj/item/weapon/cartridge = 50)
|
||||
/obj/item/weapon/cartridge/signal = 75)
|
||||
|
||||
|
||||
/obj/machinery/vending/liberationstation
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,91 @@
|
||||
// Special AI/pAI PDAs that cannot explode.
|
||||
/obj/item/device/pda/ai
|
||||
icon_state = "NONE"
|
||||
detonate = 0
|
||||
ttone = "data"
|
||||
|
||||
/obj/item/device/pda/ai/proc/set_name_and_job(newname as text, newjob as text, newrank as null|text)
|
||||
owner = newname
|
||||
ownjob = newjob
|
||||
if(newrank)
|
||||
ownrank = newrank
|
||||
else
|
||||
ownrank = ownjob
|
||||
name = newname + " (" + ownjob + ")"
|
||||
|
||||
/obj/item/device/pda/ai/verb/cmd_send_pdamesg()
|
||||
set category = "AI IM"
|
||||
set name = "Send PDA Message"
|
||||
set src in usr
|
||||
|
||||
if(usr.stat == 2)
|
||||
usr << "You can't send PDA messages because you are dead!"
|
||||
return
|
||||
var/datum/data/pda/app/messenger/M = find_program(/datum/data/pda/app/messenger)
|
||||
if(!M)
|
||||
usr << "<span class='warning'>Cannot use messenger!</span>"
|
||||
var/list/plist = M.available_pdas()
|
||||
if (plist)
|
||||
var/c = input(usr, "Please select a PDA") as null|anything in sortList(plist)
|
||||
if (!c) // if the user hasn't selected a PDA file we can't send a message
|
||||
return
|
||||
var/selected = plist[c]
|
||||
M.create_message(usr, selected)
|
||||
|
||||
/obj/item/device/pda/ai/verb/cmd_show_message_log()
|
||||
set category = "AI IM"
|
||||
set name = "Show Message Log"
|
||||
set src in usr
|
||||
|
||||
if(usr.stat == 2)
|
||||
usr << "You can't do that because you are dead!"
|
||||
return
|
||||
var/datum/data/pda/app/messenger/M = find_program(/datum/data/pda/app/messenger)
|
||||
if(!M)
|
||||
usr << "<span class='warning'>Cannot use messenger!</span>"
|
||||
var/HTML = "<html><head><title>AI PDA Message Log</title></head><body>"
|
||||
for(var/index in M.tnote)
|
||||
if(index["sent"])
|
||||
HTML += addtext("<i><b>→ 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>← 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")
|
||||
|
||||
/obj/item/device/pda/ai/verb/cmd_toggle_pda_receiver()
|
||||
set category = "AI IM"
|
||||
set name = "Toggle Sender/Receiver"
|
||||
set src in usr
|
||||
|
||||
if(usr.stat == 2)
|
||||
usr << "You can't do that because you are dead!"
|
||||
return
|
||||
var/datum/data/pda/app/messenger/M = find_program(/datum/data/pda/app/messenger)
|
||||
M.toff = !M.toff
|
||||
usr << "<span class='notice'>PDA sender/receiver toggled [(M.toff ? "Off" : "On")]!</span>"
|
||||
|
||||
|
||||
/obj/item/device/pda/ai/verb/cmd_toggle_pda_silent()
|
||||
set category = "AI IM"
|
||||
set name = "Toggle Ringer"
|
||||
set src in usr
|
||||
|
||||
if(usr.stat == 2)
|
||||
usr << "You can't do that because you are dead!"
|
||||
return
|
||||
var/datum/data/pda/app/messenger/M = find_program(/datum/data/pda/app/messenger)
|
||||
M.silent = !M.silent
|
||||
usr << "<span class='notice'>PDA ringer toggled [(M.silent ? "Off" : "On")]!</span>"
|
||||
|
||||
/obj/item/device/pda/ai/can_use()
|
||||
return 1
|
||||
|
||||
|
||||
/obj/item/device/pda/ai/attack_self(mob/user as mob)
|
||||
if ((honkamt > 0) && (prob(60)))//For clown virus.
|
||||
honkamt--
|
||||
playsound(loc, 'sound/items/bikehorn.ogg', 30, 1)
|
||||
return
|
||||
|
||||
/obj/item/device/pda/ai/pai
|
||||
ttone = "assist"
|
||||
@@ -0,0 +1,62 @@
|
||||
// Base class for anything that can show up on home screen
|
||||
/datum/data/pda
|
||||
var/icon = "tasks"
|
||||
var/hidden = 0 // program not displayed in main menu
|
||||
var/category = "General" // the category to list it in on the main menu
|
||||
var/obj/item/device/pda/pda // if this is null, and the app is running code, something's gone wrong
|
||||
|
||||
/datum/data/pda/proc/start()
|
||||
|
||||
|
||||
// An app has a button on the home screen and its own UI
|
||||
/datum/data/pda/app
|
||||
name = "App"
|
||||
size = 3
|
||||
var/title = null // what is displayed in the title bar when this is the current app
|
||||
var/template = ""
|
||||
var/update = PDA_APP_UPDATE
|
||||
var/has_back = 0
|
||||
|
||||
/datum/data/pda/app/New()
|
||||
if(!title)
|
||||
title = name
|
||||
|
||||
/datum/data/pda/app/start()
|
||||
pda.current_app = src
|
||||
return 1
|
||||
|
||||
/datum/data/pda/app/proc/update_ui(mob/user as mob, list/data)
|
||||
|
||||
|
||||
// Utilities just have a button on the home screen, but custom code when clicked
|
||||
/datum/data/pda/utility
|
||||
name = "Utility"
|
||||
icon = "gear"
|
||||
size = 1
|
||||
category = "Utilities"
|
||||
|
||||
|
||||
/datum/data/pda/utility/scanmode
|
||||
var/base_name
|
||||
category = "Scanners"
|
||||
|
||||
/datum/data/pda/utility/scanmode/New(obj/item/weapon/cartridge/C)
|
||||
..(C)
|
||||
name = "Enable [base_name]"
|
||||
|
||||
/datum/data/pda/utility/scanmode/start()
|
||||
if(pda.scanmode)
|
||||
pda.scanmode.name = "Enable [pda.scanmode.base_name]"
|
||||
|
||||
if(pda.scanmode == src)
|
||||
pda.scanmode = null
|
||||
else
|
||||
pda.scanmode = src
|
||||
name = "Disable [base_name]"
|
||||
|
||||
pda.update_shortcuts()
|
||||
return 1
|
||||
|
||||
/datum/data/pda/utility/scanmode/proc/scan_mob(mob/living/C as mob, mob/living/user as mob)
|
||||
|
||||
/datum/data/pda/utility/scanmode/proc/scan_atom(atom/A as mob|obj|turf|area, mob/user as mob)
|
||||
@@ -7,57 +7,55 @@
|
||||
w_class = 1
|
||||
|
||||
var/obj/item/radio/integrated/radio = null
|
||||
var/access_security = 0
|
||||
var/access_engine = 0
|
||||
var/access_atmos = 0
|
||||
var/access_medical = 0
|
||||
var/access_clown = 0
|
||||
var/access_mime = 0
|
||||
var/access_janitor = 0
|
||||
// var/access_flora = 0
|
||||
var/access_reagent_scanner = 0
|
||||
var/access_remote_door = 0 // Control some blast doors remotely!!
|
||||
var/remote_door_id = ""
|
||||
var/access_status_display = 0
|
||||
var/access_quartermaster = 0
|
||||
var/access_detonate_pda = 0
|
||||
var/access_hydroponics = 0
|
||||
|
||||
var/charges = 0
|
||||
var/mode = null
|
||||
var/menu
|
||||
var/datum/data/record/active1 = null //General
|
||||
var/datum/data/record/active2 = null //Medical
|
||||
var/datum/data/record/active3 = null //Security
|
||||
var/obj/machinery/computer/monitor/powmonitor = null // Power Monitor
|
||||
var/list/powermonitors = list()
|
||||
var/message1 // used for status_displays
|
||||
var/message2
|
||||
|
||||
var/list/stored_data = list()
|
||||
var/list/programs = list()
|
||||
var/list/messenger_plugins = list()
|
||||
|
||||
/obj/item/weapon/cartridge/New()
|
||||
if(ticker && ticker.current_state >= GAME_STATE_SETTING_UP)
|
||||
initialize()
|
||||
|
||||
/obj/item/weapon/cartridge/proc/update_programs(obj/item/device/pda/pda)
|
||||
for(var/datum/data/pda/P in programs)
|
||||
P.pda = pda
|
||||
for(var/datum/data/pda/messenger_plugin/P in messenger_plugins)
|
||||
P.pda = pda
|
||||
|
||||
/obj/item/weapon/cartridge/engineering
|
||||
name = "Power-ON Cartridge"
|
||||
icon_state = "cart-e"
|
||||
access_engine = 1
|
||||
programs = list(
|
||||
new/datum/data/pda/app/power,
|
||||
new/datum/data/pda/utility/scanmode/halogen)
|
||||
|
||||
/obj/item/weapon/cartridge/atmos
|
||||
name = "BreatheDeep Cartridge"
|
||||
icon_state = "cart-a"
|
||||
access_atmos = 1
|
||||
programs = list(
|
||||
new/datum/data/pda/utility/scanmode/gas)
|
||||
|
||||
/obj/item/weapon/cartridge/medical
|
||||
name = "Med-U Cartridge"
|
||||
icon_state = "cart-m"
|
||||
access_medical = 1
|
||||
programs = list(
|
||||
new/datum/data/pda/app/crew_records/medical,
|
||||
new/datum/data/pda/utility/scanmode/medical)
|
||||
|
||||
/obj/item/weapon/cartridge/chemistry
|
||||
name = "ChemWhiz Cartridge"
|
||||
icon_state = "cart-chem"
|
||||
access_reagent_scanner = 1
|
||||
programs = list(
|
||||
new/datum/data/pda/utility/scanmode/reagent)
|
||||
|
||||
/obj/item/weapon/cartridge/security
|
||||
name = "R.O.B.U.S.T. Cartridge"
|
||||
icon_state = "cart-s"
|
||||
access_security = 1
|
||||
programs = list(
|
||||
new/datum/data/pda/app/crew_records/security,
|
||||
new/datum/data/pda/app/secbot_control)
|
||||
|
||||
/obj/item/weapon/cartridge/security/initialize()
|
||||
radio = new /obj/item/radio/integrated/beepsky(src)
|
||||
@@ -66,32 +64,42 @@
|
||||
/obj/item/weapon/cartridge/detective
|
||||
name = "D.E.T.E.C.T. Cartridge"
|
||||
icon_state = "cart-s"
|
||||
access_security = 1
|
||||
access_medical = 1
|
||||
programs = list(
|
||||
new/datum/data/pda/app/crew_records/medical,
|
||||
new/datum/data/pda/utility/scanmode/medical,
|
||||
|
||||
new/datum/data/pda/app/crew_records/security)
|
||||
|
||||
|
||||
/obj/item/weapon/cartridge/janitor
|
||||
name = "CustodiPRO Cartridge"
|
||||
desc = "The ultimate in clean-room design."
|
||||
icon_state = "cart-j"
|
||||
access_janitor = 1
|
||||
programs = list(
|
||||
new/datum/data/pda/app/janitor)
|
||||
|
||||
/obj/item/weapon/cartridge/lawyer
|
||||
name = "P.R.O.V.E. Cartridge"
|
||||
icon_state = "cart-s"
|
||||
access_security = 1
|
||||
programs = list(
|
||||
new/datum/data/pda/app/crew_records/security)
|
||||
|
||||
/obj/item/weapon/cartridge/clown
|
||||
name = "Honkworks 5.0"
|
||||
icon_state = "cart-clown"
|
||||
access_clown = 1
|
||||
charges = 5
|
||||
programs = list(
|
||||
new/datum/data/pda/utility/honk)
|
||||
messenger_plugins = list(
|
||||
new/datum/data/pda/messenger_plugin/virus/clown)
|
||||
|
||||
/obj/item/weapon/cartridge/mime
|
||||
name = "Gestur-O 1000"
|
||||
icon_state = "cart-mi"
|
||||
access_mime = 1
|
||||
charges = 5
|
||||
messenger_plugins = list(
|
||||
new/datum/data/pda/messenger_plugin/virus/mime)
|
||||
|
||||
/*
|
||||
/obj/item/weapon/cartridge/botanist
|
||||
name = "Green Thumb v4.20"
|
||||
@@ -102,13 +110,8 @@
|
||||
/obj/item/weapon/cartridge/signal
|
||||
name = "generic signaler cartridge"
|
||||
desc = "A data cartridge with an integrated radio signaler module."
|
||||
|
||||
/obj/item/weapon/cartridge/signal/toxins
|
||||
name = "Signal Ace 2"
|
||||
desc = "Complete with integrated radio signaler!"
|
||||
icon_state = "cart-tox"
|
||||
access_reagent_scanner = 1
|
||||
access_atmos = 1
|
||||
programs = list(
|
||||
new/datum/data/pda/app/signaller)
|
||||
|
||||
/obj/item/weapon/cartridge/signal/initialize()
|
||||
radio = new /obj/item/radio/integrated/signal(src)
|
||||
@@ -118,11 +121,24 @@
|
||||
qdel(radio)
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/cartridge/signal/toxins
|
||||
name = "Signal Ace 2"
|
||||
desc = "Complete with integrated radio signaler!"
|
||||
icon_state = "cart-tox"
|
||||
programs = list(
|
||||
new/datum/data/pda/utility/scanmode/gas,
|
||||
|
||||
new/datum/data/pda/utility/scanmode/reagent,
|
||||
|
||||
new/datum/data/pda/app/signaller)
|
||||
|
||||
/obj/item/weapon/cartridge/quartermaster
|
||||
name = "Space Parts & Space Vendors Cartridge"
|
||||
desc = "Perfect for the Quartermaster on the go!"
|
||||
icon_state = "cart-q"
|
||||
access_quartermaster = 1
|
||||
programs = list(
|
||||
new/datum/data/pda/app/supply,
|
||||
new/datum/data/pda/app/mule_control)
|
||||
|
||||
/obj/item/weapon/cartridge/quartermaster/initialize()
|
||||
radio = new /obj/item/radio/integrated/mule(src)
|
||||
@@ -131,15 +147,21 @@
|
||||
/obj/item/weapon/cartridge/head
|
||||
name = "Easy-Record DELUXE"
|
||||
icon_state = "cart-h"
|
||||
access_status_display = 1
|
||||
programs = list(
|
||||
new/datum/data/pda/app/status_display)
|
||||
|
||||
/obj/item/weapon/cartridge/hop
|
||||
name = "HumanResources9001"
|
||||
icon_state = "cart-h"
|
||||
access_status_display = 1
|
||||
access_quartermaster = 1
|
||||
access_janitor = 1
|
||||
access_security = 1
|
||||
programs = list(
|
||||
new/datum/data/pda/app/crew_records/security,
|
||||
|
||||
new/datum/data/pda/app/janitor,
|
||||
|
||||
new/datum/data/pda/app/supply,
|
||||
new/datum/data/pda/app/mule_control,
|
||||
|
||||
new/datum/data/pda/app/status_display)
|
||||
|
||||
/obj/item/weapon/cartridge/hop/initialize()
|
||||
radio = new /obj/item/radio/integrated/mule(src)
|
||||
@@ -148,8 +170,11 @@
|
||||
/obj/item/weapon/cartridge/hos
|
||||
name = "R.O.B.U.S.T. DELUXE"
|
||||
icon_state = "cart-hos"
|
||||
access_status_display = 1
|
||||
access_security = 1
|
||||
programs = list(
|
||||
new/datum/data/pda/app/crew_records/security,
|
||||
new/datum/data/pda/app/secbot_control,
|
||||
|
||||
new/datum/data/pda/app/status_display)
|
||||
|
||||
/obj/item/weapon/cartridge/hos/initialize()
|
||||
radio = new /obj/item/radio/integrated/beepsky(src)
|
||||
@@ -158,23 +183,36 @@
|
||||
/obj/item/weapon/cartridge/ce
|
||||
name = "Power-On DELUXE"
|
||||
icon_state = "cart-ce"
|
||||
access_status_display = 1
|
||||
access_engine = 1
|
||||
access_atmos = 1
|
||||
programs = list(
|
||||
new/datum/data/pda/app/power,
|
||||
new/datum/data/pda/utility/scanmode/halogen,
|
||||
|
||||
new/datum/data/pda/utility/scanmode/gas,
|
||||
|
||||
new/datum/data/pda/app/status_display)
|
||||
|
||||
/obj/item/weapon/cartridge/cmo
|
||||
name = "Med-U DELUXE"
|
||||
icon_state = "cart-cmo"
|
||||
access_status_display = 1
|
||||
access_reagent_scanner = 1
|
||||
access_medical = 1
|
||||
programs = list(
|
||||
new/datum/data/pda/app/crew_records/medical,
|
||||
new/datum/data/pda/utility/scanmode/medical,
|
||||
|
||||
new/datum/data/pda/utility/scanmode/reagent,
|
||||
|
||||
new/datum/data/pda/app/status_display)
|
||||
|
||||
/obj/item/weapon/cartridge/rd
|
||||
name = "Signal Ace DELUXE"
|
||||
icon_state = "cart-rd"
|
||||
access_status_display = 1
|
||||
access_reagent_scanner = 1
|
||||
access_atmos = 1
|
||||
programs = list(
|
||||
new/datum/data/pda/utility/scanmode/gas,
|
||||
|
||||
new/datum/data/pda/utility/scanmode/reagent,
|
||||
|
||||
new/datum/data/pda/app/signaller,
|
||||
|
||||
new/datum/data/pda/app/status_display)
|
||||
|
||||
/obj/item/weapon/cartridge/rd/initialize()
|
||||
radio = new /obj/item/radio/integrated/signal(src)
|
||||
@@ -184,14 +222,25 @@
|
||||
name = "Value-PAK Cartridge"
|
||||
desc = "Now with 200% more value!"
|
||||
icon_state = "cart-c"
|
||||
access_quartermaster = 1
|
||||
access_janitor = 1
|
||||
access_engine = 1
|
||||
access_security = 1
|
||||
access_medical = 1
|
||||
access_reagent_scanner = 1
|
||||
access_status_display = 1
|
||||
access_atmos = 1
|
||||
programs = list(
|
||||
new/datum/data/pda/app/power,
|
||||
new/datum/data/pda/utility/scanmode/halogen,
|
||||
|
||||
new/datum/data/pda/utility/scanmode/gas,
|
||||
|
||||
new/datum/data/pda/app/crew_records/medical,
|
||||
new/datum/data/pda/utility/scanmode/medical,
|
||||
|
||||
new/datum/data/pda/utility/scanmode/reagent,
|
||||
|
||||
new/datum/data/pda/app/crew_records/security,
|
||||
new/datum/data/pda/app/secbot_control,
|
||||
|
||||
new/datum/data/pda/app/janitor,
|
||||
|
||||
new/datum/data/pda/app/supply,
|
||||
|
||||
new/datum/data/pda/app/status_display)
|
||||
|
||||
/obj/item/weapon/cartridge/captain/initialize()
|
||||
radio = new /obj/item/radio/integrated/beepsky(src)
|
||||
@@ -200,21 +249,35 @@
|
||||
/obj/item/weapon/cartridge/supervisor
|
||||
name = "Easy-Record DELUXE"
|
||||
icon_state = "cart-h"
|
||||
access_status_display = 1
|
||||
access_security = 1
|
||||
programs = list(
|
||||
new/datum/data/pda/app/crew_records/security,
|
||||
|
||||
new/datum/data/pda/app/status_display)
|
||||
|
||||
/obj/item/weapon/cartridge/centcom
|
||||
name = "Value-PAK Cartridge"
|
||||
desc = "Now with 200% more value!"
|
||||
icon_state = "cart-c"
|
||||
access_quartermaster = 1
|
||||
access_janitor = 1
|
||||
access_engine = 1
|
||||
access_security = 1
|
||||
access_medical = 1
|
||||
access_reagent_scanner = 1
|
||||
access_status_display = 1
|
||||
access_atmos = 1
|
||||
programs = list(
|
||||
new/datum/data/pda/app/power,
|
||||
new/datum/data/pda/utility/scanmode/halogen,
|
||||
|
||||
new/datum/data/pda/utility/scanmode/gas,
|
||||
|
||||
new/datum/data/pda/app/crew_records/medical,
|
||||
new/datum/data/pda/utility/scanmode/medical,
|
||||
|
||||
new/datum/data/pda/utility/scanmode/reagent,
|
||||
|
||||
new/datum/data/pda/app/crew_records/security,
|
||||
new/datum/data/pda/app/secbot_control,
|
||||
|
||||
new/datum/data/pda/app/janitor,
|
||||
|
||||
new/datum/data/pda/app/supply,
|
||||
new/datum/data/pda/app/mule_control,
|
||||
|
||||
new/datum/data/pda/app/status_display)
|
||||
|
||||
/obj/item/weapon/cartridge/centcom/initialize()
|
||||
radio = new /obj/item/radio/integrated/beepsky(src)
|
||||
@@ -223,390 +286,14 @@
|
||||
/obj/item/weapon/cartridge/syndicate
|
||||
name = "Detomatix Cartridge"
|
||||
icon_state = "cart"
|
||||
access_remote_door = 1
|
||||
access_detonate_pda = 1
|
||||
remote_door_id = "smindicate" //Make sure this matches the syndicate shuttle's shield/door id!! //don't ask about the name, testing.
|
||||
var/initial_remote_door_id = "smindicate" //Make sure this matches the syndicate shuttle's shield/door id!! //don't ask about the name, testing.
|
||||
charges = 4
|
||||
|
||||
/obj/item/weapon/cartridge/proc/post_status(var/command, var/data1, var/data2)
|
||||
|
||||
var/datum/radio_frequency/frequency = radio_controller.return_frequency(1435)
|
||||
if(!frequency) return
|
||||
|
||||
var/datum/signal/status_signal = new
|
||||
status_signal.source = src
|
||||
status_signal.transmission_method = 1
|
||||
status_signal.data["command"] = command
|
||||
|
||||
switch(command)
|
||||
if("message")
|
||||
status_signal.data["msg1"] = data1
|
||||
status_signal.data["msg2"] = data2
|
||||
if(loc)
|
||||
var/obj/item/PDA = loc
|
||||
var/mob/user = PDA.fingerprintslast
|
||||
if(istype(PDA.loc,/mob/living))
|
||||
name = PDA.loc
|
||||
log_admin("STATUS: [user] set status screen with [PDA]. Message: [data1] [data2]")
|
||||
message_admins("STATUS: [user] set status screen with [PDA]. Message: [data1] [data2]")
|
||||
|
||||
if("alert")
|
||||
status_signal.data["picture_state"] = data1
|
||||
|
||||
frequency.post_signal(src, status_signal)
|
||||
|
||||
|
||||
/*
|
||||
This generates the nano values of the cart menus.
|
||||
Because we close the UI when we insert a new cart
|
||||
we don't have to worry about null values on items
|
||||
the user can't access. Well, unless they are href hacking.
|
||||
But in that case their UI will just lock up.
|
||||
*/
|
||||
|
||||
|
||||
/obj/item/weapon/cartridge/proc/create_NanoUI_values(mob/user as mob)
|
||||
var/values[0]
|
||||
|
||||
/* Signaler (Mode: 40) */
|
||||
|
||||
|
||||
if(istype(radio,/obj/item/radio/integrated/signal) && (mode==40))
|
||||
var/obj/item/radio/integrated/signal/R = radio
|
||||
values["signal_freq"] = format_frequency(R.frequency)
|
||||
values["signal_code"] = R.code
|
||||
|
||||
|
||||
/* Station Display (Mode: 42) */
|
||||
|
||||
if(mode==42)
|
||||
values["message1"] = message1 ? message1 : "(none)"
|
||||
values["message2"] = message2 ? message2 : "(none)"
|
||||
|
||||
|
||||
|
||||
/* Power Monitor (Mode: 43 / 433) */
|
||||
if(mode==43 || mode==433)
|
||||
values["powermonitors"] = powermonitor_repository.powermonitor_data()
|
||||
|
||||
if (powmonitor && !isnull(powmonitor.powernet))
|
||||
values["powerconnected"] = 1
|
||||
values["poweravail"] = powmonitor.powernet.avail
|
||||
values["powerload"] = num2text(powmonitor.powernet.viewload,10)
|
||||
values["powerdemand"] = powmonitor.powernet.load
|
||||
values["apcs"] = apc_repository.apc_data(powmonitor)
|
||||
else
|
||||
values["powerconnected"] = 0
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* General Records (Mode: 44 / 441 / 45 / 451) */
|
||||
if(mode == 44 || mode == 441 || mode == 45 || mode ==451)
|
||||
if(istype(active1, /datum/data/record) && (active1 in data_core.general))
|
||||
values["general"] = active1.fields
|
||||
values["general_exists"] = 1
|
||||
|
||||
else
|
||||
|
||||
values["general_exists"] = 0
|
||||
|
||||
|
||||
|
||||
/* Medical Records (Mode: 44 / 441) */
|
||||
|
||||
if(mode == 44 || mode == 441)
|
||||
var/medData[0]
|
||||
for(var/datum/data/record/R in sortRecord(data_core.general))
|
||||
medData[++medData.len] = list(Name = R.fields["name"],"ref" = "\ref[R]")
|
||||
values["medical_records"] = medData
|
||||
|
||||
if(istype(active2, /datum/data/record) && (active2 in data_core.medical))
|
||||
values["medical"] = active2.fields
|
||||
values["medical_exists"] = 1
|
||||
else
|
||||
values["medical_exists"] = 0
|
||||
|
||||
/* Security Records (Mode:45 / 451) */
|
||||
|
||||
if(mode == 45 || mode == 451)
|
||||
var/secData[0]
|
||||
for (var/datum/data/record/R in sortRecord(data_core.general))
|
||||
secData[++secData.len] = list(Name = R.fields["name"], "ref" = "\ref[R]")
|
||||
values["security_records"] = secData
|
||||
|
||||
if(istype(active3, /datum/data/record) && (active3 in data_core.security))
|
||||
values["security"] = active3.fields
|
||||
values["security_exists"] = 1
|
||||
else
|
||||
values["security_exists"] = 0
|
||||
|
||||
/* Security Bot Control (Mode: 46) */
|
||||
|
||||
if(mode==46)
|
||||
var/botsData[0]
|
||||
var/beepskyData[0]
|
||||
if(istype(radio,/obj/item/radio/integrated/beepsky))
|
||||
var/obj/item/radio/integrated/beepsky/SC = radio
|
||||
beepskyData["active"] = SC.active
|
||||
if(SC.active && !isnull(SC.botstatus))
|
||||
var/area/loca = SC.botstatus["loca"]
|
||||
var/loca_name = sanitize(loca.name)
|
||||
beepskyData["botstatus"] = list("loca" = loca_name, "mode" = SC.botstatus["mode"])
|
||||
else
|
||||
beepskyData["botstatus"] = list("loca" = null, "mode" = -1)
|
||||
var/botsCount=0
|
||||
if(SC.botlist && SC.botlist.len)
|
||||
for(var/obj/machinery/bot/B in SC.botlist)
|
||||
botsCount++
|
||||
if(B.loc)
|
||||
botsData[++botsData.len] = list("Name" = sanitize(B.name), "Location" = sanitize(B.loc.loc.name), "ref" = "\ref[B]")
|
||||
|
||||
if(!botsData.len)
|
||||
botsData[++botsData.len] = list("Name" = "No bots found", "Location" = "Invalid", "ref"= null)
|
||||
|
||||
beepskyData["bots"] = botsData
|
||||
beepskyData["count"] = botsCount
|
||||
|
||||
else
|
||||
beepskyData["active"] = 0
|
||||
botsData[++botsData.len] = list("Name" = "No bots found", "Location" = "Invalid", "ref"= null)
|
||||
beepskyData["botstatus"] = list("loca" = null, "mode" = null)
|
||||
beepskyData["bots"] = botsData
|
||||
beepskyData["count"] = 0
|
||||
|
||||
values["beepsky"] = beepskyData
|
||||
|
||||
|
||||
/* MULEBOT Control (Mode: 48) */
|
||||
|
||||
if(mode==48)
|
||||
var/muleData[0]
|
||||
var/mulebotsData[0]
|
||||
if(istype(radio,/obj/item/radio/integrated/mule))
|
||||
var/obj/item/radio/integrated/mule/QC = radio
|
||||
muleData["active"] = QC.active
|
||||
if(QC.active && !isnull(QC.botstatus))
|
||||
var/area/loca = QC.botstatus["loca"]
|
||||
var/loca_name = sanitize(loca.name)
|
||||
muleData["botstatus"] = list("loca" = loca_name, "mode" = QC.botstatus["mode"],"home"=QC.botstatus["home"],"powr" = QC.botstatus["powr"],"retn" =QC.botstatus["retn"], "pick"=QC.botstatus["pick"], "load" = QC.botstatus["load"], "dest" = sanitize(QC.botstatus["dest"]))
|
||||
|
||||
else
|
||||
muleData["botstatus"] = list("loca" = null, "mode" = -1,"home"=null,"powr" = null,"retn" =null, "pick"=null, "load" = null, "dest" = null)
|
||||
|
||||
|
||||
var/mulebotsCount=0
|
||||
for(var/obj/machinery/bot/B in QC.botlist)
|
||||
mulebotsCount++
|
||||
if(B.loc)
|
||||
mulebotsData[++mulebotsData.len] = list("Name" = sanitize(B.name), "Location" = sanitize(B.loc.loc.name), "ref" = "\ref[B]")
|
||||
|
||||
if(!mulebotsData.len)
|
||||
mulebotsData[++mulebotsData.len] = list("Name" = "No bots found", "Location" = "Invalid", "ref"= null)
|
||||
|
||||
muleData["bots"] = mulebotsData
|
||||
muleData["count"] = mulebotsCount
|
||||
|
||||
else
|
||||
muleData["botstatus"] = list("loca" = null, "mode" = -1,"home"=null,"powr" = null,"retn" =null, "pick"=null, "load" = null, "dest" = null)
|
||||
muleData["active"] = 0
|
||||
mulebotsData[++mulebotsData.len] = list("Name" = "No bots found", "Location" = "Invalid", "ref"= null)
|
||||
muleData["bots"] = mulebotsData
|
||||
muleData["count"] = 0
|
||||
|
||||
values["mulebot"] = muleData
|
||||
|
||||
|
||||
|
||||
/* Supply Shuttle Requests Menu (Mode: 47) */
|
||||
|
||||
if(mode==47)
|
||||
var/supplyData[0]
|
||||
|
||||
if(shuttle_master.supply.mode == SHUTTLE_CALL)
|
||||
supplyData["shuttle_moving"] = 1
|
||||
|
||||
if(shuttle_master.supply.z != ZLEVEL_STATION)
|
||||
supplyData["shuttle_loc"] = "station"
|
||||
else
|
||||
supplyData["shuttle_loc"] = "centcom"
|
||||
|
||||
supplyData["shuttle_time"] = "([shuttle_master.supply.timeLeft(600)] Mins)"
|
||||
|
||||
var/supplyOrderCount = 0
|
||||
var/supplyOrderData[0]
|
||||
for(var/S in shuttle_master.shoppinglist)
|
||||
var/datum/supply_order/SO = S
|
||||
supplyOrderData[++supplyOrderData.len] = list("Number" = SO.ordernum, "Name" = html_encode(SO.object.name), "ApprovedBy" = SO.orderedby, "Comment" = html_encode(SO.comment))
|
||||
|
||||
if(!supplyOrderData.len)
|
||||
supplyOrderData[++supplyOrderData.len] = list("Number" = null, "Name" = null, "OrderedBy"=null)
|
||||
|
||||
supplyData["approved"] = supplyOrderData
|
||||
supplyData["approved_count"] = supplyOrderCount
|
||||
|
||||
var/requestCount = 0
|
||||
var/requestData[0]
|
||||
for(var/S in shuttle_master.requestlist)
|
||||
var/datum/supply_order/SO = S
|
||||
requestCount++
|
||||
requestData[++requestData.len] = list("Number" = SO.ordernum, "Name" = html_encode(SO.object.name), "OrderedBy" = SO.orderedby, "Comment" = html_encode(SO.comment))
|
||||
|
||||
if(!requestData.len)
|
||||
requestData[++requestData.len] = list("Number" = null, "Name" = null, "orderedBy" = null, "Comment" = null)
|
||||
|
||||
supplyData["requests"] = requestData
|
||||
supplyData["requests_count"] = requestCount
|
||||
|
||||
|
||||
values["supply"] = supplyData
|
||||
|
||||
|
||||
|
||||
/* Janitor Supplies Locator (Mode: 49) */
|
||||
if(mode==49)
|
||||
var/JaniData[0]
|
||||
var/turf/cl = get_turf(src)
|
||||
|
||||
if(cl)
|
||||
JaniData["user_loc"] = list("x" = cl.x, "y" = cl.y)
|
||||
else
|
||||
JaniData["user_loc"] = list("x" = 0, "y" = 0)
|
||||
var/MopData[0]
|
||||
for(var/obj/item/weapon/mop/M in janitorial_equipment)
|
||||
var/turf/ml = get_turf(M)
|
||||
if(ml)
|
||||
if(ml.z != cl.z)
|
||||
continue
|
||||
var/direction = get_dir(src, M)
|
||||
MopData[++MopData.len] = list ("x" = ml.x, "y" = ml.y, "dir" = uppertext(dir2text(direction)), "status" = M.reagents.total_volume ? "Wet" : "Dry")
|
||||
|
||||
if(!MopData.len)
|
||||
MopData[++MopData.len] = list("x" = 0, "y" = 0, dir=null, status = null)
|
||||
|
||||
|
||||
var/BucketData[0]
|
||||
for(var/obj/structure/mopbucket/B in janitorial_equipment)
|
||||
var/turf/bl = get_turf(B)
|
||||
if(bl)
|
||||
if(bl.z != cl.z)
|
||||
continue
|
||||
var/direction = get_dir(src,B)
|
||||
BucketData[++BucketData.len] = list ("x" = bl.x, "y" = bl.y, "dir" = uppertext(dir2text(direction)), "status" = B.reagents.total_volume/100)
|
||||
|
||||
if(!BucketData.len)
|
||||
BucketData[++BucketData.len] = list("x" = 0, "y" = 0, dir=null, status = null)
|
||||
|
||||
var/CbotData[0]
|
||||
for(var/obj/machinery/bot/cleanbot/B in aibots)
|
||||
var/turf/bl = get_turf(B)
|
||||
if(bl)
|
||||
if(bl.z != cl.z)
|
||||
continue
|
||||
var/direction = get_dir(src,B)
|
||||
CbotData[++CbotData.len] = list("x" = bl.x, "y" = bl.y, "dir" = uppertext(dir2text(direction)), "status" = B.on ? "Online" : "Offline")
|
||||
|
||||
|
||||
if(!CbotData.len)
|
||||
CbotData[++CbotData.len] = list("x" = 0, "y" = 0, dir=null, status = null)
|
||||
var/CartData[0]
|
||||
for(var/obj/structure/janitorialcart/B in janitorial_equipment)
|
||||
var/turf/bl = get_turf(B)
|
||||
if(bl)
|
||||
if(bl.z != cl.z)
|
||||
continue
|
||||
var/direction = get_dir(src,B)
|
||||
CartData[++CartData.len] = list("x" = bl.x, "y" = bl.y, "dir" = uppertext(dir2text(direction)), "status" = B.reagents.total_volume/100)
|
||||
if(!CartData.len)
|
||||
CartData[++CartData.len] = list("x" = 0, "y" = 0, dir=null, status = null)
|
||||
|
||||
|
||||
|
||||
|
||||
JaniData["mops"] = MopData
|
||||
JaniData["buckets"] = BucketData
|
||||
JaniData["cleanbots"] = CbotData
|
||||
JaniData["carts"] = CartData
|
||||
values["janitor"] = JaniData
|
||||
|
||||
return values
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/item/weapon/cartridge/Topic(href, href_list)
|
||||
..()
|
||||
|
||||
if (!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
|
||||
usr.unset_machine()
|
||||
usr << browse(null, "window=pda")
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
switch(href_list["choice"])
|
||||
if("Medical Records")
|
||||
var/datum/data/record/R = locate(href_list["target"])
|
||||
var/datum/data/record/M = locate(href_list["target"])
|
||||
loc:mode = 441
|
||||
mode = 441
|
||||
if (R in data_core.general)
|
||||
for (var/datum/data/record/E in data_core.medical)
|
||||
if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
|
||||
M = E
|
||||
break
|
||||
active1 = R
|
||||
active2 = M
|
||||
|
||||
if("Security Records")
|
||||
var/datum/data/record/R = locate(href_list["target"])
|
||||
var/datum/data/record/S = locate(href_list["target"])
|
||||
loc:mode = 451
|
||||
mode = 451
|
||||
if (R in data_core.general)
|
||||
for (var/datum/data/record/E in data_core.security)
|
||||
if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
|
||||
S = E
|
||||
break
|
||||
active1 = R
|
||||
active3 = S
|
||||
|
||||
if("Send Signal")
|
||||
spawn( 0 )
|
||||
radio:send_signal("ACTIVATE")
|
||||
return
|
||||
|
||||
if("Signal Frequency")
|
||||
var/new_frequency = sanitize_frequency(radio:frequency + text2num(href_list["sfreq"]))
|
||||
radio:set_frequency(new_frequency)
|
||||
|
||||
if("Signal Code")
|
||||
radio:code += text2num(href_list["scode"])
|
||||
radio:code = round(radio:code)
|
||||
radio:code = min(100, radio:code)
|
||||
radio:code = max(1, radio:code)
|
||||
|
||||
if("Status")
|
||||
switch(href_list["statdisp"])
|
||||
if("message")
|
||||
post_status("message", message1, message2)
|
||||
if("alert")
|
||||
post_status("alert", href_list["alert"])
|
||||
if("setmsg1")
|
||||
message1 = input("Line 1", "Enter Message Text", message1) as text|null
|
||||
updateSelfDialog()
|
||||
if("setmsg2")
|
||||
message2 = input("Line 2", "Enter Message Text", message2) as text|null
|
||||
updateSelfDialog()
|
||||
else
|
||||
post_status(href_list["statdisp"])
|
||||
if("Power Select")
|
||||
var/pref = href_list["target"]
|
||||
powmonitor = locate(pref)
|
||||
loc:mode = 433
|
||||
mode = 433
|
||||
|
||||
return 1
|
||||
programs = list(
|
||||
new/datum/data/pda/utility/toggle_door)
|
||||
messenger_plugins = list(
|
||||
new/datum/data/pda/messenger_plugin/virus/detonate)
|
||||
|
||||
/obj/item/weapon/cartridge/syndicate/New()
|
||||
var/datum/data/pda/utility/toggle_door/D = programs[1]
|
||||
if(istype(D))
|
||||
D.remote_door_id = initial_remote_door_id
|
||||
@@ -0,0 +1,415 @@
|
||||
/datum/data/pda/app/status_display
|
||||
name = "Status Display"
|
||||
icon = "list-alt"
|
||||
template = "pda_status_display"
|
||||
category = "Utilities"
|
||||
|
||||
var/message1 // used for status_displays
|
||||
var/message2
|
||||
|
||||
/datum/data/pda/app/status_display/update_ui(mob/user as mob, list/data)
|
||||
data["records"] = list(
|
||||
"message1" = message1 ? message1 : "(none)",
|
||||
"message2" = message2 ? message2 : "(none)")
|
||||
|
||||
/datum/data/pda/app/status_display/Topic(href, list/href_list)
|
||||
switch(href_list["choice"])
|
||||
if("Status")
|
||||
switch(href_list["statdisp"])
|
||||
if("message")
|
||||
post_status("message", message1, message2)
|
||||
if("alert")
|
||||
post_status("alert", href_list["alert"])
|
||||
if("setmsg1")
|
||||
message1 = input("Line 1", "Enter Message Text", message1) as text|null
|
||||
if("setmsg2")
|
||||
message2 = input("Line 2", "Enter Message Text", message2) as text|null
|
||||
else
|
||||
post_status(href_list["statdisp"])
|
||||
|
||||
/datum/data/pda/app/status_display/proc/post_status(var/command, var/data1, var/data2)
|
||||
var/datum/radio_frequency/frequency = radio_controller.return_frequency(1435)
|
||||
if(!frequency)
|
||||
return
|
||||
|
||||
var/datum/signal/status_signal = new
|
||||
status_signal.source = src
|
||||
status_signal.transmission_method = 1
|
||||
status_signal.data["command"] = command
|
||||
|
||||
switch(command)
|
||||
if("message")
|
||||
status_signal.data["msg1"] = data1
|
||||
status_signal.data["msg2"] = data2
|
||||
var/mob/user = pda.fingerprintslast
|
||||
if(istype(pda.loc, /mob/living))
|
||||
name = pda.loc
|
||||
log_admin("STATUS: [user] set status screen with [pda]. Message: [data1] [data2]")
|
||||
message_admins("STATUS: [user] set status screen with [pda]. Message: [data1] [data2]")
|
||||
|
||||
if("alert")
|
||||
status_signal.data["picture_state"] = data1
|
||||
|
||||
spawn(0)
|
||||
frequency.post_signal(src, status_signal)
|
||||
|
||||
|
||||
/datum/data/pda/app/signaller
|
||||
name = "Signaler System"
|
||||
icon = "rss"
|
||||
template = "pda_signaller"
|
||||
category = "Utilities"
|
||||
|
||||
/datum/data/pda/app/signaller/update_ui(mob/user as mob, list/data)
|
||||
if(pda.cartridge && istype(pda.cartridge.radio, /obj/item/radio/integrated/signal))
|
||||
var/obj/item/radio/integrated/signal/R = pda.cartridge.radio
|
||||
data["signal_freq"] = format_frequency(R.frequency)
|
||||
data["signal_code"] = R.code
|
||||
|
||||
/datum/data/pda/app/signaller/Topic(href, list/href_list)
|
||||
if(pda.cartridge && istype(pda.cartridge.radio, /obj/item/radio/integrated/signal))
|
||||
var/obj/item/radio/integrated/signal/R = pda.cartridge.radio
|
||||
|
||||
switch(href_list["choice"])
|
||||
if("Send Signal")
|
||||
spawn(0)
|
||||
R.send_signal("ACTIVATE")
|
||||
|
||||
if("Signal Frequency")
|
||||
var/new_frequency = sanitize_frequency(R.frequency + text2num(href_list["sfreq"]))
|
||||
R.set_frequency(new_frequency)
|
||||
|
||||
if("Signal Code")
|
||||
R.code += text2num(href_list["scode"])
|
||||
R.code = round(R.code)
|
||||
R.code = min(100, R.code)
|
||||
R.code = max(1, R.code)
|
||||
|
||||
/datum/data/pda/app/power
|
||||
name = "Power Monitor"
|
||||
icon = "exclamation-triangle"
|
||||
template = "pda_power"
|
||||
category = "Engineering"
|
||||
update = PDA_APP_UPDATE_SLOW
|
||||
|
||||
var/obj/machinery/computer/monitor/powmonitor = null
|
||||
|
||||
/datum/data/pda/app/power/update_ui(mob/user as mob, list/data)
|
||||
if (powmonitor && !isnull(powmonitor.powernet))
|
||||
data["records"] = list(
|
||||
"powerconnected" = 1,
|
||||
"poweravail" = powmonitor.powernet.avail,
|
||||
"powerload" = num2text(powmonitor.powernet.viewload, 10),
|
||||
"powerdemand" = powmonitor.powernet.load,
|
||||
"apcs" = apc_repository.apc_data(powmonitor))
|
||||
has_back = 1
|
||||
else
|
||||
data["records"] = list(
|
||||
"powerconnected" = 0,
|
||||
"powermonitors" = powermonitor_repository.powermonitor_data())
|
||||
has_back = 0
|
||||
|
||||
/datum/data/pda/app/power/Topic(href, list/href_list)
|
||||
switch(href_list["choice"])
|
||||
if("Power Select")
|
||||
var/pref = href_list["target"]
|
||||
powmonitor = locate(pref)
|
||||
if("Back")
|
||||
powmonitor = null
|
||||
|
||||
/datum/data/pda/app/crew_records
|
||||
var/datum/data/record/general_records = null
|
||||
|
||||
/datum/data/pda/app/crew_records/update_ui(mob/user as mob, list/data)
|
||||
var/list/records[0]
|
||||
|
||||
if(general_records && general_records in data_core.general)
|
||||
data["records"] = records
|
||||
records["general"] = general_records.fields
|
||||
return records
|
||||
else
|
||||
for(var/datum/data/record/R in sortRecord(data_core.general))
|
||||
records += list(list(Name = R.fields["name"], "ref" = "\ref[R]"))
|
||||
data["recordsList"] = records
|
||||
return null
|
||||
|
||||
/datum/data/pda/app/crew_records/Topic(href, list/href_list)
|
||||
switch(href_list["choice"])
|
||||
if("Records")
|
||||
var/datum/data/record/R = locate(href_list["target"])
|
||||
if (R in data_core.general)
|
||||
load_records(R)
|
||||
if("Back")
|
||||
general_records = null
|
||||
has_back = 0
|
||||
|
||||
/datum/data/pda/app/crew_records/proc/load_records(datum/data/record/R)
|
||||
general_records = R
|
||||
has_back = 1
|
||||
|
||||
/datum/data/pda/app/crew_records/medical
|
||||
name = "Medical Records"
|
||||
icon = "heartbeat"
|
||||
template = "pda_medical"
|
||||
category = "Medical"
|
||||
|
||||
var/datum/data/record/medical_records = null
|
||||
|
||||
/datum/data/pda/app/crew_records/medical/update_ui(mob/user as mob, list/data)
|
||||
var/list/records = ..()
|
||||
if(!records)
|
||||
return
|
||||
|
||||
if(medical_records && medical_records in data_core.medical)
|
||||
records["medical"] = medical_records.fields
|
||||
|
||||
return records
|
||||
|
||||
/datum/data/pda/app/crew_records/medical/load_records(datum/data/record/R)
|
||||
..(R)
|
||||
for (var/datum/data/record/E in data_core.medical)
|
||||
if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
|
||||
medical_records = E
|
||||
break
|
||||
|
||||
/datum/data/pda/app/crew_records/security
|
||||
name = "Security Records"
|
||||
icon = "tags"
|
||||
template = "pda_security"
|
||||
category = "Security"
|
||||
|
||||
var/datum/data/record/security_records = null
|
||||
|
||||
/datum/data/pda/app/crew_records/security/update_ui(mob/user as mob, list/data)
|
||||
var/list/records = ..()
|
||||
if(!records)
|
||||
return
|
||||
|
||||
if(security_records && security_records in data_core.security)
|
||||
records["security"] = security_records.fields
|
||||
|
||||
return records
|
||||
|
||||
/datum/data/pda/app/crew_records/security/load_records(datum/data/record/R)
|
||||
..(R)
|
||||
for (var/datum/data/record/E in data_core.security)
|
||||
if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
|
||||
security_records = E
|
||||
break
|
||||
|
||||
/datum/data/pda/app/secbot_control
|
||||
name = "Security Bot Access"
|
||||
icon = "rss"
|
||||
template = "pda_secbot"
|
||||
category = "Security"
|
||||
update = PDA_APP_UPDATE_SLOW
|
||||
|
||||
/datum/data/pda/app/secbot_control/update_ui(mob/user as mob, list/data)
|
||||
var/botsData[0]
|
||||
var/beepskyData[0]
|
||||
if(pda.cartridge && istype(pda.cartridge.radio, /obj/item/radio/integrated/beepsky))
|
||||
var/obj/item/radio/integrated/beepsky/SC = pda.cartridge.radio
|
||||
beepskyData["active"] = SC.active ? SC.active.name : null
|
||||
has_back = SC.active ? 1 : 0
|
||||
if(SC.active && !isnull(SC.botstatus))
|
||||
var/area/loca = SC.botstatus["loca"]
|
||||
var/loca_name = sanitize(loca.name)
|
||||
beepskyData["botstatus"] = list("loca" = loca_name, "mode" = SC.botstatus["mode"])
|
||||
else
|
||||
beepskyData["botstatus"] = list("loca" = null, "mode" = -1)
|
||||
var/botsCount=0
|
||||
if(SC.botlist && SC.botlist.len)
|
||||
for(var/obj/machinery/bot/B in SC.botlist)
|
||||
botsCount++
|
||||
if(B.loc)
|
||||
botsData[++botsData.len] = list("Name" = sanitize(B.name), "Location" = sanitize(B.loc.loc.name), "ref" = "\ref[B]")
|
||||
|
||||
if(!botsData.len)
|
||||
botsData[++botsData.len] = list("Name" = "No bots found", "Location" = "Invalid", "ref"= null)
|
||||
|
||||
beepskyData["bots"] = botsData
|
||||
beepskyData["count"] = botsCount
|
||||
|
||||
else
|
||||
beepskyData["active"] = 0
|
||||
botsData[++botsData.len] = list("Name" = "No bots found", "Location" = "Invalid", "ref"= null)
|
||||
beepskyData["botstatus"] = list("loca" = null, "mode" = null)
|
||||
beepskyData["bots"] = botsData
|
||||
beepskyData["count"] = 0
|
||||
has_back = 0
|
||||
|
||||
data["beepsky"] = beepskyData
|
||||
|
||||
/datum/data/pda/app/secbot_control/Topic(href, list/href_list)
|
||||
switch(href_list["choice"])
|
||||
if("Back")
|
||||
if(pda.cartridge && istype(pda.cartridge.radio, /obj/item/radio/integrated/beepsky))
|
||||
pda.cartridge.radio.Topic(null, list(radiomenu = "1", op = "botlist"))
|
||||
|
||||
/datum/data/pda/app/mule_control
|
||||
name = "Delivery Bot Control"
|
||||
icon = "truck"
|
||||
template = "pda_mule"
|
||||
category = "Quartermaster"
|
||||
update = PDA_APP_UPDATE_SLOW
|
||||
|
||||
/datum/data/pda/app/mule_control/update_ui(mob/user as mob, list/data)
|
||||
var/muleData[0]
|
||||
var/mulebotsData[0]
|
||||
if(pda.cartridge && istype(pda.cartridge.radio, /obj/item/radio/integrated/mule))
|
||||
var/obj/item/radio/integrated/mule/QC = pda.cartridge.radio
|
||||
muleData["active"] = QC.active ? sanitize(QC.active.name) : null
|
||||
has_back = QC.active ? 1 : 0
|
||||
if(QC.active && !isnull(QC.botstatus))
|
||||
var/area/loca = QC.botstatus["loca"]
|
||||
var/loca_name = sanitize(loca.name)
|
||||
muleData["botstatus"] = list("loca" = loca_name, "mode" = QC.botstatus["mode"],"home"=QC.botstatus["home"],"powr" = QC.botstatus["powr"],"retn" =QC.botstatus["retn"], "pick"=QC.botstatus["pick"], "load" = QC.botstatus["load"], "dest" = sanitize(QC.botstatus["dest"]))
|
||||
|
||||
else
|
||||
muleData["botstatus"] = list("loca" = null, "mode" = -1,"home"=null,"powr" = null,"retn" =null, "pick"=null, "load" = null, "dest" = null)
|
||||
|
||||
|
||||
var/mulebotsCount=0
|
||||
for(var/obj/machinery/bot/B in QC.botlist)
|
||||
mulebotsCount++
|
||||
if(B.loc)
|
||||
mulebotsData[++mulebotsData.len] = list("Name" = sanitize(B.name), "Location" = sanitize(B.loc.loc.name), "ref" = "\ref[B]")
|
||||
|
||||
if(!mulebotsData.len)
|
||||
mulebotsData[++mulebotsData.len] = list("Name" = "No bots found", "Location" = "Invalid", "ref"= null)
|
||||
|
||||
muleData["bots"] = mulebotsData
|
||||
muleData["count"] = mulebotsCount
|
||||
|
||||
else
|
||||
muleData["botstatus"] = list("loca" = null, "mode" = -1,"home"=null,"powr" = null,"retn" =null, "pick"=null, "load" = null, "dest" = null)
|
||||
muleData["active"] = 0
|
||||
mulebotsData[++mulebotsData.len] = list("Name" = "No bots found", "Location" = "Invalid", "ref"= null)
|
||||
muleData["bots"] = mulebotsData
|
||||
muleData["count"] = 0
|
||||
has_back = 0
|
||||
|
||||
data["mulebot"] = muleData
|
||||
|
||||
/datum/data/pda/app/mule_control/Topic(href, list/href_list)
|
||||
switch(href_list["choice"])
|
||||
if("Back")
|
||||
if(pda.cartridge && istype(pda.cartridge.radio, /obj/item/radio/integrated/mule))
|
||||
pda.cartridge.radio.Topic(null, list(radiomenu = "1", op = "botlist"))
|
||||
|
||||
/datum/data/pda/app/supply
|
||||
name = "Supply Records"
|
||||
icon = "file-text-o"
|
||||
template = "pda_supply"
|
||||
category = "Quartermaster"
|
||||
update = PDA_APP_UPDATE_SLOW
|
||||
|
||||
/datum/data/pda/app/supply/update_ui(mob/user as mob, list/data)
|
||||
var/supplyData[0]
|
||||
|
||||
if(shuttle_master.supply.mode == SHUTTLE_CALL)
|
||||
supplyData["shuttle_moving"] = 1
|
||||
|
||||
if(shuttle_master.supply.z != ZLEVEL_STATION)
|
||||
supplyData["shuttle_loc"] = "station"
|
||||
else
|
||||
supplyData["shuttle_loc"] = "centcom"
|
||||
|
||||
supplyData["shuttle_time"] = "([shuttle_master.supply.timeLeft(600)] Mins)"
|
||||
|
||||
var/supplyOrderCount = 0
|
||||
var/supplyOrderData[0]
|
||||
for(var/S in shuttle_master.shoppinglist)
|
||||
var/datum/supply_order/SO = S
|
||||
supplyOrderCount++
|
||||
supplyOrderData[++supplyOrderData.len] = list("Number" = SO.ordernum, "Name" = html_encode(SO.object.name), "ApprovedBy" = SO.orderedby, "Comment" = html_encode(SO.comment))
|
||||
|
||||
if(!supplyOrderData.len)
|
||||
supplyOrderData[++supplyOrderData.len] = list("Number" = null, "Name" = null, "OrderedBy"=null)
|
||||
|
||||
supplyData["approved"] = supplyOrderData
|
||||
supplyData["approved_count"] = supplyOrderCount
|
||||
|
||||
var/requestCount = 0
|
||||
var/requestData[0]
|
||||
for(var/S in shuttle_master.requestlist)
|
||||
var/datum/supply_order/SO = S
|
||||
requestCount++
|
||||
requestData[++requestData.len] = list("Number" = SO.ordernum, "Name" = html_encode(SO.object.name), "OrderedBy" = SO.orderedby, "Comment" = html_encode(SO.comment))
|
||||
|
||||
if(!requestData.len)
|
||||
requestData[++requestData.len] = list("Number" = null, "Name" = null, "orderedBy" = null, "Comment" = null)
|
||||
|
||||
supplyData["requests"] = requestData
|
||||
supplyData["requests_count"] = requestCount
|
||||
|
||||
data["supply"] = supplyData
|
||||
|
||||
/datum/data/pda/app/janitor
|
||||
name = "Custodial Locator"
|
||||
icon = "trash-o"
|
||||
template = "pda_janitor"
|
||||
category = "Utilities"
|
||||
update = PDA_APP_UPDATE_SLOW
|
||||
|
||||
/datum/data/pda/app/janitor/update_ui(mob/user as mob, list/data)
|
||||
var/JaniData[0]
|
||||
var/turf/cl = get_turf(pda)
|
||||
|
||||
if(cl)
|
||||
JaniData["user_loc"] = list("x" = cl.x, "y" = cl.y)
|
||||
else
|
||||
JaniData["user_loc"] = list("x" = 0, "y" = 0)
|
||||
var/MopData[0]
|
||||
for(var/obj/item/weapon/mop/M in janitorial_equipment)
|
||||
var/turf/ml = get_turf(M)
|
||||
if(ml)
|
||||
if(ml.z != cl.z)
|
||||
continue
|
||||
var/direction = get_dir(pda, M)
|
||||
MopData[++MopData.len] = list ("x" = ml.x, "y" = ml.y, "dir" = uppertext(dir2text(direction)), "status" = M.reagents.total_volume ? "Wet" : "Dry")
|
||||
|
||||
if(!MopData.len)
|
||||
MopData[++MopData.len] = list("x" = 0, "y" = 0, dir=null, status = null)
|
||||
|
||||
|
||||
var/BucketData[0]
|
||||
for(var/obj/structure/mopbucket/B in janitorial_equipment)
|
||||
var/turf/bl = get_turf(B)
|
||||
if(bl)
|
||||
if(bl.z != cl.z)
|
||||
continue
|
||||
var/direction = get_dir(pda,B)
|
||||
BucketData[++BucketData.len] = list ("x" = bl.x, "y" = bl.y, "dir" = uppertext(dir2text(direction)), "status" = B.reagents.total_volume/100)
|
||||
|
||||
if(!BucketData.len)
|
||||
BucketData[++BucketData.len] = list("x" = 0, "y" = 0, dir=null, status = null)
|
||||
|
||||
var/CbotData[0]
|
||||
for(var/obj/machinery/bot/cleanbot/B in aibots)
|
||||
var/turf/bl = get_turf(B)
|
||||
if(bl)
|
||||
if(bl.z != cl.z)
|
||||
continue
|
||||
var/direction = get_dir(pda,B)
|
||||
CbotData[++CbotData.len] = list("x" = bl.x, "y" = bl.y, "dir" = uppertext(dir2text(direction)), "status" = B.on ? "Online" : "Offline")
|
||||
|
||||
|
||||
if(!CbotData.len)
|
||||
CbotData[++CbotData.len] = list("x" = 0, "y" = 0, dir=null, status = null)
|
||||
var/CartData[0]
|
||||
for(var/obj/structure/janitorialcart/B in janitorial_equipment)
|
||||
var/turf/bl = get_turf(B)
|
||||
if(bl)
|
||||
if(bl.z != cl.z)
|
||||
continue
|
||||
var/direction = get_dir(pda,B)
|
||||
CartData[++CartData.len] = list("x" = bl.x, "y" = bl.y, "dir" = uppertext(dir2text(direction)), "status" = B.reagents.total_volume/100)
|
||||
if(!CartData.len)
|
||||
CartData[++CartData.len] = list("x" = 0, "y" = 0, dir=null, status = null)
|
||||
|
||||
JaniData["mops"] = MopData
|
||||
JaniData["buckets"] = BucketData
|
||||
JaniData["cleanbots"] = CbotData
|
||||
JaniData["carts"] = CartData
|
||||
data["janitor"] = JaniData
|
||||
@@ -0,0 +1,106 @@
|
||||
/datum/data/pda/app/main_menu
|
||||
icon = "home"
|
||||
template = "pda_main_menu"
|
||||
hidden = 1
|
||||
|
||||
/datum/data/pda/app/main_menu/update_ui(mob/user as mob, list/data)
|
||||
title = pda.name
|
||||
|
||||
data["app"]["is_home"] = 1
|
||||
|
||||
data["apps"] = pda.shortcut_cache
|
||||
data["categories"] = pda.shortcut_cat_order
|
||||
data["pai"] = !isnull(pda.pai) // pAI inserted?
|
||||
|
||||
/datum/data/pda/app/main_menu/Topic(href, list/href_list)
|
||||
switch(href_list["choice"])
|
||||
if("UpdateInfo")
|
||||
pda.ownjob = pda.id.assignment
|
||||
pda.ownrank = pda.id.rank
|
||||
pda.name = "PDA-[pda.owner] ([pda.ownjob])"
|
||||
if("pai")
|
||||
if(pda.pai)
|
||||
if(pda.pai.loc != pda)
|
||||
pda.pai = null
|
||||
else
|
||||
switch(href_list["option"])
|
||||
if("1") // Configure pAI device
|
||||
pda.pai.attack_self(usr)
|
||||
if("2") // Eject pAI device
|
||||
var/turf/T = get_turf_or_move(pda.loc)
|
||||
if(T)
|
||||
pda.pai.loc = T
|
||||
pda.pai = null
|
||||
|
||||
/datum/data/pda/app/notekeeper
|
||||
name = "Notekeeper"
|
||||
icon = "sticky-note-o"
|
||||
template = "pda_notekeeper"
|
||||
|
||||
var/note = null
|
||||
var/notehtml = ""
|
||||
|
||||
/datum/data/pda/app/notekeeper/start()
|
||||
. = ..()
|
||||
if(!note)
|
||||
note = "Congratulations, your station has chosen the [pda.model_name]!"
|
||||
|
||||
/datum/data/pda/app/notekeeper/update_ui(mob/user as mob, list/data)
|
||||
data["note"] = note // current pda notes
|
||||
|
||||
/datum/data/pda/app/notekeeper/Topic(href, list/href_list)
|
||||
switch(href_list["choice"])
|
||||
if("Edit")
|
||||
var/n = input("Please enter message", name, notehtml) as message
|
||||
if(pda.loc == usr)
|
||||
note = adminscrub(n)
|
||||
notehtml = html_decode(note)
|
||||
note = replacetext(note, "\n", "<br>")
|
||||
else
|
||||
pda.close(usr)
|
||||
|
||||
/datum/data/pda/app/manifest
|
||||
name = "Crew Manifest"
|
||||
icon = "user"
|
||||
template = "pda_manifest"
|
||||
update = PDA_APP_UPDATE_SLOW
|
||||
|
||||
/datum/data/pda/app/manifest/update_ui(mob/user as mob, list/data)
|
||||
data_core.get_manifest_json()
|
||||
data["manifest"] = list("__json_cache" = ManifestJSON)
|
||||
|
||||
/datum/data/pda/app/manifest/Topic(href, list/href_list)
|
||||
|
||||
/datum/data/pda/app/atmos_scanner
|
||||
name = "Atmospheric Scan"
|
||||
icon = "fire"
|
||||
template = "pda_atmos_scan"
|
||||
category = "Utilities"
|
||||
update = PDA_APP_UPDATE_SLOW
|
||||
|
||||
/datum/data/pda/app/atmos_scanner/update_ui(mob/user as mob, list/data)
|
||||
var/turf/T = get_turf(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("reading" = 0)
|
||||
@@ -0,0 +1,283 @@
|
||||
/datum/data/pda/app/messenger
|
||||
name = "Messenger"
|
||||
icon = "comments-o"
|
||||
title = "SpaceMessenger V4.0.1"
|
||||
template = "pda_messenger"
|
||||
|
||||
var/silent = 0 //To beep or not to beep, that is the question
|
||||
var/toff = 0 //If 1, messenger disabled
|
||||
var/list/tnote[0] //Current Texts
|
||||
var/last_text //No text spamming
|
||||
var/list/ttone_sound = list("beep" = 'sound/machines/twobeep.ogg',
|
||||
"boom" = 'sound/effects/explosionfar.ogg',
|
||||
"slip" = 'sound/misc/slip.ogg',
|
||||
"honk" = 'sound/items/bikehorn.ogg',
|
||||
"SKREE" = 'sound/voice/shriek1.ogg',
|
||||
"holy" = 'sound/items/PDA/ambicha4-short.ogg',
|
||||
"xeno" = 'sound/voice/hiss1.ogg')
|
||||
|
||||
var/m_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.
|
||||
|
||||
/datum/data/pda/app/messenger/start()
|
||||
. = ..()
|
||||
set_new(0)
|
||||
|
||||
/datum/data/pda/app/messenger/update_ui(mob/user as mob, list/data)
|
||||
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?
|
||||
|
||||
var/convopdas[0]
|
||||
var/pdas[0]
|
||||
var/count = 0
|
||||
for (var/obj/item/device/pda/P in PDAs)
|
||||
var/datum/data/pda/app/messenger/PM = P.find_program(/datum/data/pda/app/messenger)
|
||||
|
||||
if (!P.owner || PM.toff || P == pda || PM.m_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
|
||||
|
||||
has_back = active_conversation
|
||||
if(active_conversation)
|
||||
for(var/c in tnote)
|
||||
if(c["target"] == active_conversation)
|
||||
data["convo_name"] = sanitize(c["owner"])
|
||||
data["convo_job"] = sanitize(c["job"])
|
||||
break
|
||||
|
||||
var/list/plugins = list()
|
||||
if(pda.cartridge)
|
||||
for(var/datum/data/pda/messenger_plugin/P in pda.cartridge.messenger_plugins)
|
||||
plugins += list(list(name = P.name, icon = P.icon, ref = "\ref[P]"))
|
||||
data["plugins"] = plugins
|
||||
|
||||
if(pda.cartridge)
|
||||
data["charges"] = pda.cartridge.charges ? pda.cartridge.charges : 0
|
||||
|
||||
/datum/data/pda/app/messenger/Topic(href, list/href_list)
|
||||
set_new(0)
|
||||
|
||||
switch(href_list["choice"])
|
||||
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
|
||||
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("Ringtone")
|
||||
var/t = input("Please enter new ringtone", name, pda.ttone) as text
|
||||
if (in_range(pda, usr) && pda.loc == usr)
|
||||
if (t)
|
||||
if(pda.hidden_uplink && pda.hidden_uplink.check_trigger(usr, lowertext(t), lowertext(pda.lock_code)))
|
||||
usr << "The PDA softly beeps."
|
||||
pda.close(usr)
|
||||
else
|
||||
t = sanitize(copytext(t, 1, 20))
|
||||
pda.ttone = t
|
||||
else
|
||||
pda.close(usr)
|
||||
return 0
|
||||
if("Message")
|
||||
var/obj/item/device/pda/P = locate(href_list["target"])
|
||||
create_message(usr, P)
|
||||
if(href_list["target"] in conversations) // Need to make sure the message went through, if not welp.
|
||||
active_conversation = href_list["target"]
|
||||
if("Select Conversation")
|
||||
var/P = href_list["convo"]
|
||||
for(var/n in conversations)
|
||||
if(P == n)
|
||||
active_conversation = P
|
||||
if("Messenger Plugin")
|
||||
if(!href_list["target"] || !href_list["plugin"])
|
||||
return
|
||||
|
||||
var/obj/item/device/pda/P = locate(href_list["target"])
|
||||
if(!P)
|
||||
usr << "PDA not found."
|
||||
|
||||
var/datum/data/pda/messenger_plugin/plugin = locate(href_list["plugin"])
|
||||
if(plugin && plugin in pda.cartridge.messenger_plugins)
|
||||
plugin.messenger = src
|
||||
plugin.user_act(usr, P)
|
||||
if("Back")
|
||||
active_conversation = null
|
||||
|
||||
/datum/data/pda/app/messenger/proc/set_new(isnew)
|
||||
if(pda.newmessage == isnew)
|
||||
return
|
||||
|
||||
if(pda.newmessage)
|
||||
//To clear message overlays.
|
||||
pda.overlays.Cut()
|
||||
pda.newmessage = 0
|
||||
|
||||
icon = "comments"
|
||||
pda.update_shortcuts()
|
||||
else
|
||||
pda.overlays.Cut()
|
||||
pda.overlays += image('icons/obj/pda.dmi', "pda-r")
|
||||
pda.newmessage = 1
|
||||
|
||||
icon = "comments-o"
|
||||
pda.update_shortcuts()
|
||||
|
||||
/datum/data/pda/app/messenger/proc/create_message(var/mob/living/U, var/obj/item/device/pda/P)
|
||||
var/t = input(U, "Please enter message", name, null) as text|null
|
||||
if(!t)
|
||||
return
|
||||
t = sanitize(copytext(t, 1, MAX_MESSAGE_LEN))
|
||||
t = readd_quotes(t)
|
||||
if (!t || !istype(P))
|
||||
return
|
||||
if (!in_range(pda, U) && pda.loc != U)
|
||||
return
|
||||
|
||||
var/datum/data/pda/app/messenger/PM = P.find_program(/datum/data/pda/app/messenger)
|
||||
|
||||
if (!PM || PM.toff || toff)
|
||||
return
|
||||
|
||||
if (last_text && world.time < last_text + 5)
|
||||
return
|
||||
|
||||
if(!pda.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)
|
||||
var/obj/machinery/message_server/useMS = null
|
||||
if(message_servers)
|
||||
for (var/obj/machinery/message_server/MS in message_servers)
|
||||
//PDAs are now dependent on the Message Server.
|
||||
if(MS.active)
|
||||
useMS = MS
|
||||
break
|
||||
|
||||
var/datum/signal/signal = pda.telecomms_process()
|
||||
|
||||
var/useTC = 0
|
||||
if(signal)
|
||||
if(signal.data["done"])
|
||||
useTC = 1
|
||||
var/turf/pos = get_turf(P)
|
||||
if(pos.z in signal.data["level"])
|
||||
useTC = 2
|
||||
//Let's make this barely readable
|
||||
if(signal.data["compression"] > 0)
|
||||
t = Gibberish(t, signal.data["compression"] + 50)
|
||||
|
||||
if(useMS && useTC) // only send the message if it's stable
|
||||
if(useTC != 2) // Does our recipient have a broadcaster on their level?
|
||||
U << "ERROR: Cannot reach recipient."
|
||||
return
|
||||
useMS.send_pda_message("[P.owner]","[pda.owner]","[t]")
|
||||
tnote.Add(list(list("sent" = 1, "owner" = "[P.owner]", "job" = "[P.ownjob]", "message" = "[t]", "target" = "\ref[P]")))
|
||||
PM.tnote.Add(list(list("sent" = 0, "owner" = "[pda.owner]", "job" = "[pda.ownjob]", "message" = "[t]", "target" = "\ref[pda]")))
|
||||
/* 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
|
||||
if(istype(M, /mob/new_player))
|
||||
continue
|
||||
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>") */
|
||||
pda.investigate_log("<span class='game say'>PDA Message - <span class='name'>[U.key] - [pda.owner]</span> -> <span class='name'>[P.owner]</span>: <span class='message'>[t]</span></span>", "pda")
|
||||
if(!conversations.Find("\ref[P]"))
|
||||
conversations.Add("\ref[P]")
|
||||
if(!PM.conversations.Find("\ref[pda]"))
|
||||
PM.conversations.Add("\ref[pda]")
|
||||
|
||||
/*
|
||||
if (prob(15)) //Give the AI a chance of intercepting the message
|
||||
var/who = src.owner
|
||||
if(prob(50))
|
||||
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>")
|
||||
*/
|
||||
|
||||
PM.play_ringtone()
|
||||
//Search for holder of the PDA.
|
||||
var/mob/living/L = null
|
||||
if(P.loc && isliving(P.loc))
|
||||
L = P.loc
|
||||
//Maybe they are a pAI!
|
||||
else
|
||||
L = get(P, /mob/living/silicon)
|
||||
|
||||
|
||||
if(L)
|
||||
L << "\icon[P] <b>Message from [pda.owner] ([pda.ownjob]), </b>\"[t]\" (<a href='byond://?src=\ref[P];choice=Message;skiprefresh=1;target=\ref[pda]'>Reply</a>)"
|
||||
nanomanager.update_user_uis(L, P) // Update the receiving user's PDA UI so that they can see the new message
|
||||
|
||||
nanomanager.update_user_uis(U, P) // Update the sending user's PDA UI so that they can see the new message
|
||||
set_new(1)
|
||||
log_pda("[usr] (PDA: [src.name]) sent \"[t]\" to [P.name]")
|
||||
else
|
||||
U << "<span class='notice'>ERROR: Messaging server is not responding.</span>"
|
||||
|
||||
/datum/data/pda/app/messenger/proc/play_ringtone()
|
||||
if (!silent)
|
||||
var/S
|
||||
|
||||
if(pda.ttone in ttone_sound)
|
||||
S = ttone_sound[pda.ttone]
|
||||
else
|
||||
S = 'sound/machines/twobeep.ogg'
|
||||
playsound(pda.loc, S, 50, 1)
|
||||
for (var/mob/O in hearers(3, pda.loc))
|
||||
if(!silent)
|
||||
O.show_message(text("\icon[pda] *[pda.ttone]*"))
|
||||
|
||||
/datum/data/pda/app/messenger/proc/available_pdas()
|
||||
var/list/names = list()
|
||||
var/list/plist = list()
|
||||
var/list/namecounts = list()
|
||||
|
||||
if (toff)
|
||||
usr << "Turn on your receiver in order to send messages."
|
||||
return
|
||||
|
||||
for (var/obj/item/device/pda/P in PDAs)
|
||||
var/datum/data/pda/app/messenger/PM = P.find_program(/datum/data/pda/app/messenger)
|
||||
|
||||
if(!P.owner || !PM || PM.hidden || P == pda || PM.toff)
|
||||
continue
|
||||
|
||||
var/name = P.owner
|
||||
if (name in names)
|
||||
namecounts[name]++
|
||||
name = text("[name] ([namecounts[name]])")
|
||||
else
|
||||
names.Add(name)
|
||||
namecounts[name] = 1
|
||||
|
||||
plist[text("[name]")] = P
|
||||
return plist
|
||||
|
||||
/datum/data/pda/app/messenger/proc/can_receive()
|
||||
return pda.owner && !toff && !hidden
|
||||
@@ -0,0 +1,69 @@
|
||||
/datum/data/pda/messenger_plugin
|
||||
var/datum/data/pda/app/messenger/messenger
|
||||
|
||||
/datum/data/pda/messenger_plugin/proc/user_act(mob/user as mob, obj/item/device/pda/P)
|
||||
|
||||
|
||||
/datum/data/pda/messenger_plugin/virus
|
||||
name = "*Send Virus*"
|
||||
|
||||
/datum/data/pda/messenger_plugin/virus/user_act(mob/user as mob, obj/item/device/pda/P)
|
||||
var/datum/data/pda/app/messenger/M = P.find_program(/datum/data/pda/app/messenger)
|
||||
|
||||
if(M && !M.toff && pda.cartridge.charges > 0)
|
||||
pda.cartridge.charges--
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
/datum/data/pda/messenger_plugin/virus/clown
|
||||
icon = "star"
|
||||
|
||||
/datum/data/pda/messenger_plugin/virus/clown/user_act(mob/user as mob, obj/item/device/pda/P)
|
||||
. = ..(user, P)
|
||||
if(.)
|
||||
user.show_message("<span class=notice>Virus sent!</span>", 1)
|
||||
P.honkamt = (rand(15,20))
|
||||
P.ttone = "honk"
|
||||
|
||||
|
||||
/datum/data/pda/messenger_plugin/virus/mime
|
||||
icon = "arrow-circle-down"
|
||||
|
||||
/datum/data/pda/messenger_plugin/virus/mime/user_act(mob/user as mob, obj/item/device/pda/P)
|
||||
. = ..(user, P)
|
||||
if(.)
|
||||
user.show_message("<span class=notice>Virus sent!</span>", 1)
|
||||
var/datum/data/pda/app/messenger/M = P.find_program(/datum/data/pda/app/messenger)
|
||||
if(M)
|
||||
M.silent = 1
|
||||
P.ttone = "silence"
|
||||
|
||||
|
||||
/datum/data/pda/messenger_plugin/virus/detonate
|
||||
name = "*Detonate*"
|
||||
icon = "exclamation-circle"
|
||||
|
||||
/datum/data/pda/messenger_plugin/virus/detonate/user_act(mob/user as mob, obj/item/device/pda/P)
|
||||
. = ..(user, P)
|
||||
if(.)
|
||||
var/difficulty = 0
|
||||
|
||||
if(pda.cartridge)
|
||||
difficulty += pda.cartridge.programs.len / 2
|
||||
else
|
||||
difficulty += 2
|
||||
|
||||
if(prob(difficulty * 12) || (pda.hidden_uplink))
|
||||
user.show_message("<span class=warning>An error flashes on your [pda].</span>", 1)
|
||||
else if (prob(difficulty * 3))
|
||||
user.show_message("<span class=danger>Energy feeds back into your [pda]!</span>", 1)
|
||||
pda.close(user)
|
||||
pda.explode()
|
||||
log_admin("[key_name(user)] just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up")
|
||||
message_admins("[key_name_admin(user)] just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up", 1)
|
||||
else
|
||||
user.show_message("<span class=notice>Success!</span>", 1)
|
||||
log_admin("[key_name(user)] just attempted to blow up [P] with the Detomatix cartridge and succeded")
|
||||
message_admins("[key_name_admin(user)] just attempted to blow up [P] with the Detomatix cartridge and succeded", 1)
|
||||
P.explode()
|
||||
@@ -0,0 +1,193 @@
|
||||
/obj/item/device/pda/medical
|
||||
default_cartridge = /obj/item/weapon/cartridge/medical
|
||||
icon_state = "pda-medical"
|
||||
|
||||
/obj/item/device/pda/viro
|
||||
default_cartridge = /obj/item/weapon/cartridge/medical
|
||||
icon_state = "pda-virology"
|
||||
|
||||
/obj/item/device/pda/engineering
|
||||
default_cartridge = /obj/item/weapon/cartridge/engineering
|
||||
icon_state = "pda-engineer"
|
||||
|
||||
/obj/item/device/pda/security
|
||||
default_cartridge = /obj/item/weapon/cartridge/security
|
||||
icon_state = "pda-security"
|
||||
|
||||
/obj/item/device/pda/detective
|
||||
default_cartridge = /obj/item/weapon/cartridge/detective
|
||||
icon_state = "pda-security"
|
||||
|
||||
/obj/item/device/pda/warden
|
||||
default_cartridge = /obj/item/weapon/cartridge/security
|
||||
icon_state = "pda-warden"
|
||||
|
||||
/obj/item/device/pda/janitor
|
||||
default_cartridge = /obj/item/weapon/cartridge/janitor
|
||||
icon_state = "pda-janitor"
|
||||
ttone = "slip"
|
||||
|
||||
/obj/item/device/pda/toxins
|
||||
default_cartridge = /obj/item/weapon/cartridge/signal/toxins
|
||||
icon_state = "pda-science"
|
||||
ttone = "boom"
|
||||
|
||||
/obj/item/device/pda/clown
|
||||
default_cartridge = /obj/item/weapon/cartridge/clown
|
||||
icon_state = "pda-clown"
|
||||
desc = "A portable microcomputer by Thinktronic Systems, LTD. The surface is coated with polytetrafluoroethylene and banana drippings."
|
||||
ttone = "honk"
|
||||
|
||||
/obj/item/device/pda/clown/Crossed(AM as mob|obj) //Clown PDA is slippery.
|
||||
if (istype(AM, /mob/living/carbon))
|
||||
var/mob/living/carbon/M = AM
|
||||
M.slip("pda", 8, 5, 0, 1)
|
||||
|
||||
/obj/item/device/pda/mime
|
||||
default_cartridge = /obj/item/weapon/cartridge/mime
|
||||
icon_state = "pda-mime"
|
||||
ttone = "silence"
|
||||
|
||||
/obj/item/device/pda/mime/New()
|
||||
var/datum/data/pda/app/messenger/M = find_program(/datum/data/pda/app/messenger)
|
||||
if(M)
|
||||
M.silent = 1
|
||||
|
||||
/obj/item/device/pda/heads
|
||||
default_cartridge = /obj/item/weapon/cartridge/head
|
||||
icon_state = "pda-h"
|
||||
|
||||
/obj/item/device/pda/heads/hop
|
||||
default_cartridge = /obj/item/weapon/cartridge/hop
|
||||
icon_state = "pda-hop"
|
||||
|
||||
/obj/item/device/pda/heads/hos
|
||||
default_cartridge = /obj/item/weapon/cartridge/hos
|
||||
icon_state = "pda-hos"
|
||||
|
||||
/obj/item/device/pda/heads/ce
|
||||
default_cartridge = /obj/item/weapon/cartridge/ce
|
||||
icon_state = "pda-ce"
|
||||
|
||||
/obj/item/device/pda/heads/cmo
|
||||
default_cartridge = /obj/item/weapon/cartridge/cmo
|
||||
icon_state = "pda-cmo"
|
||||
|
||||
/obj/item/device/pda/heads/rd
|
||||
default_cartridge = /obj/item/weapon/cartridge/rd
|
||||
icon_state = "pda-rd"
|
||||
|
||||
/obj/item/device/pda/captain
|
||||
default_cartridge = /obj/item/weapon/cartridge/captain
|
||||
icon_state = "pda-captain"
|
||||
detonate = 0
|
||||
//toff = 1
|
||||
|
||||
/obj/item/device/pda/heads/ntrep
|
||||
default_cartridge = /obj/item/weapon/cartridge/supervisor
|
||||
icon_state = "pda-h"
|
||||
|
||||
/obj/item/device/pda/heads/magistrate
|
||||
default_cartridge = /obj/item/weapon/cartridge/supervisor
|
||||
icon_state = "pda-h"
|
||||
|
||||
/obj/item/device/pda/heads/blueshield
|
||||
default_cartridge = /obj/item/weapon/cartridge/hos
|
||||
icon_state = "pda-h"
|
||||
|
||||
/obj/item/device/pda/cargo
|
||||
default_cartridge = /obj/item/weapon/cartridge/quartermaster
|
||||
icon_state = "pda-cargo"
|
||||
|
||||
/obj/item/device/pda/quartermaster
|
||||
default_cartridge = /obj/item/weapon/cartridge/quartermaster
|
||||
icon_state = "pda-qm"
|
||||
|
||||
/obj/item/device/pda/shaftminer
|
||||
icon_state = "pda-miner"
|
||||
|
||||
/obj/item/device/pda/syndicate
|
||||
default_cartridge = /obj/item/weapon/cartridge/syndicate
|
||||
icon_state = "pda-syndi"
|
||||
name = "Military PDA"
|
||||
owner = "John Doe"
|
||||
|
||||
/obj/item/device/pda/syndicate/New()
|
||||
var/datum/data/pda/app/messenger/M = find_program(/datum/data/pda/app/messenger)
|
||||
if(M)
|
||||
M.m_hidden = 1
|
||||
|
||||
/obj/item/device/pda/chaplain
|
||||
icon_state = "pda-chaplain"
|
||||
ttone = "holy"
|
||||
|
||||
/obj/item/device/pda/lawyer
|
||||
default_cartridge = /obj/item/weapon/cartridge/lawyer
|
||||
icon_state = "pda-lawyer"
|
||||
ttone = "..."
|
||||
|
||||
/obj/item/device/pda/botanist
|
||||
//default_cartridge = /obj/item/weapon/cartridge/botanist
|
||||
icon_state = "pda-hydro"
|
||||
|
||||
/obj/item/device/pda/roboticist
|
||||
icon_state = "pda-roboticist"
|
||||
|
||||
/obj/item/device/pda/librarian
|
||||
icon_state = "pda-library"
|
||||
desc = "A portable microcomputer by Thinktronic Systems, LTD. This is model is a WGW-11 series e-reader."
|
||||
model_name = "Thinktronic 5290 WGW-11 Series E-reader and Personal Data Assistant"
|
||||
|
||||
/obj/item/device/pda/librarian/New()
|
||||
var/datum/data/pda/app/messenger/M = find_program(/datum/data/pda/app/messenger)
|
||||
if(M)
|
||||
M.silent = 1 //Quiet in the library!
|
||||
|
||||
/obj/item/device/pda/clear
|
||||
icon_state = "pda-transp"
|
||||
desc = "A portable microcomputer by Thinktronic Systems, LTD. This is model is a special edition with a transparent case."
|
||||
model_name = "Thinktronic 5230 Personal Data Assistant Deluxe Special Max Turbo Limited Edition"
|
||||
|
||||
/obj/item/device/pda/chef
|
||||
icon_state = "pda-chef"
|
||||
|
||||
/obj/item/device/pda/bar
|
||||
icon_state = "pda-bartender"
|
||||
|
||||
/obj/item/device/pda/atmos
|
||||
default_cartridge = /obj/item/weapon/cartridge/atmos
|
||||
icon_state = "pda-atmos"
|
||||
|
||||
/obj/item/device/pda/chemist
|
||||
default_cartridge = /obj/item/weapon/cartridge/chemistry
|
||||
icon_state = "pda-chemistry"
|
||||
|
||||
/obj/item/device/pda/geneticist
|
||||
default_cartridge = /obj/item/weapon/cartridge/medical
|
||||
icon_state = "pda-genetics"
|
||||
|
||||
/obj/item/device/pda/centcom
|
||||
default_cartridge = /obj/item/weapon/cartridge/centcom
|
||||
icon_state = "pda-h"
|
||||
|
||||
//Some spare PDAs in a box
|
||||
/obj/item/weapon/storage/box/PDAs
|
||||
name = "spare PDAs"
|
||||
desc = "A box of spare PDA microcomputers."
|
||||
icon = 'icons/obj/pda.dmi'
|
||||
icon_state = "pdabox"
|
||||
|
||||
New()
|
||||
..()
|
||||
new /obj/item/device/pda(src)
|
||||
new /obj/item/device/pda(src)
|
||||
new /obj/item/device/pda(src)
|
||||
new /obj/item/device/pda(src)
|
||||
new /obj/item/weapon/cartridge/head(src)
|
||||
|
||||
var/newcart = pick( /obj/item/weapon/cartridge/engineering,
|
||||
/obj/item/weapon/cartridge/security,
|
||||
/obj/item/weapon/cartridge/medical,
|
||||
/obj/item/weapon/cartridge/signal/toxins,
|
||||
/obj/item/weapon/cartridge/quartermaster)
|
||||
new newcart(src)
|
||||
@@ -49,8 +49,6 @@
|
||||
|
||||
frequency.post_signal(src, signal, filter = s_filter)
|
||||
|
||||
return
|
||||
|
||||
/obj/item/radio/integrated/receive_signal(datum/signal/signal)
|
||||
/*var/obj/item/device/pda/P = src.loc
|
||||
|
||||
@@ -79,22 +77,27 @@
|
||||
|
||||
if("control")
|
||||
active = locate(href_list["bot"])
|
||||
post_signal(control_freq, "command", "bot_status", "active", active, s_filter = bot_filter)
|
||||
botstatus = list(mode = -1)
|
||||
spawn(0)
|
||||
post_signal(control_freq, "command", "bot_status", "active", active, s_filter = bot_filter)
|
||||
|
||||
if("scanbots") // find all bots
|
||||
botlist = null
|
||||
post_signal(control_freq, "command", "bot_status", s_filter = bot_filter)
|
||||
spawn(0)
|
||||
post_signal(control_freq, "command", "bot_status", s_filter = bot_filter)
|
||||
|
||||
if("botlist")
|
||||
active = null
|
||||
|
||||
if("stop", "go")
|
||||
post_signal(control_freq, "command", href_list["op"], "active", active, s_filter = bot_filter)
|
||||
post_signal(control_freq, "command", "bot_status", "active", active, s_filter = bot_filter)
|
||||
spawn(0)
|
||||
post_signal(control_freq, "command", href_list["op"], "active", active, s_filter = bot_filter)
|
||||
post_signal(control_freq, "command", "bot_status", "active", active, s_filter = bot_filter)
|
||||
|
||||
if("summon")
|
||||
post_signal(control_freq, "command", "summon", "active", active, "target", get_turf(PDA) , "useraccess", PDA.GetAccess(), s_filter = bot_filter)
|
||||
post_signal(control_freq, "command", "bot_status", "active", active, s_filter = bot_filter)
|
||||
spawn(0)
|
||||
post_signal(control_freq, "command", "summon", "active", active, "target", get_turf(PDA) , "useraccess", PDA.GetAccess(), s_filter = bot_filter)
|
||||
post_signal(control_freq, "command", "bot_status", "active", active, s_filter = bot_filter)
|
||||
|
||||
/obj/item/radio/integrated/proc/add_to_radio(bot_filter) //Master filter control for bots. Must be placed in the bot's local New() to support map spawned bots.
|
||||
if(radio_controller)
|
||||
@@ -147,13 +150,6 @@
|
||||
// create/populate lists as they are recvd
|
||||
|
||||
/obj/item/radio/integrated/mule/receive_signal(datum/signal/signal)
|
||||
// var/obj/item/device/pda/P = src.loc
|
||||
|
||||
/*
|
||||
world << "recvd:[P] : [signal.source]"
|
||||
for(var/d in signal.data)
|
||||
world << "- [d] = [signal.data[d]]"
|
||||
*/
|
||||
if(signal.data["type"] == MULE_BOT)
|
||||
if(!botlist)
|
||||
botlist = new()
|
||||
@@ -171,9 +167,6 @@
|
||||
|
||||
beacons[signal.data["beacon"] ] = signal.source
|
||||
|
||||
|
||||
// if(istype(P)) P.updateSelfDialog()
|
||||
|
||||
/obj/item/radio/integrated/mule/Topic(href, href_list)
|
||||
//..()
|
||||
//var/obj/item/device/pda/PDA = src.hostpda
|
||||
@@ -182,8 +175,8 @@
|
||||
cmd = "command [active.suffix]"
|
||||
|
||||
switch(href_list["op"])
|
||||
|
||||
if("control")
|
||||
botstatus = list(mode = -1)
|
||||
active = locate(href_list["bot"])
|
||||
|
||||
if("scanbots") // find all bots
|
||||
@@ -193,28 +186,37 @@
|
||||
active = null
|
||||
|
||||
if("unload")
|
||||
post_signal(control_freq, cmd, "unload", s_filter = RADIO_MULEBOT)
|
||||
spawn(0)
|
||||
post_signal(control_freq, cmd, "unload", s_filter = RADIO_MULEBOT)
|
||||
if("setdest")
|
||||
if(beacons)
|
||||
var/dest = input("Select Bot Destination", "Mulebot [active.suffix] Interlink", active.destination) as null|anything in beacons
|
||||
if(dest)
|
||||
post_signal(control_freq, cmd, "target", "destination", dest, s_filter = RADIO_MULEBOT)
|
||||
spawn(0)
|
||||
post_signal(control_freq, cmd, "target", "destination", dest, s_filter = RADIO_MULEBOT)
|
||||
|
||||
if("retoff")
|
||||
post_signal(control_freq, cmd, "autoret", "value", 0, s_filter = RADIO_MULEBOT)
|
||||
spawn(0)
|
||||
post_signal(control_freq, cmd, "autoret", "value", 0, s_filter = RADIO_MULEBOT)
|
||||
|
||||
if("reton")
|
||||
post_signal(control_freq, cmd, "autoret", "value", 1, s_filter = RADIO_MULEBOT)
|
||||
spawn(0)
|
||||
post_signal(control_freq, cmd, "autoret", "value", 1, s_filter = RADIO_MULEBOT)
|
||||
|
||||
if("pickoff")
|
||||
post_signal(control_freq, cmd, "autopick", "value", 0, s_filter = RADIO_MULEBOT)
|
||||
spawn(0)
|
||||
post_signal(control_freq, cmd, "autopick", "value", 0, s_filter = RADIO_MULEBOT)
|
||||
|
||||
if("pickon")
|
||||
post_signal(control_freq, cmd, "autopick", "value", 1, s_filter = RADIO_MULEBOT)
|
||||
spawn(0)
|
||||
post_signal(control_freq, cmd, "autopick", "value", 1, s_filter = RADIO_MULEBOT)
|
||||
|
||||
if("stop", "go", "home")
|
||||
post_signal(control_freq, cmd, href_list["op"], s_filter = RADIO_MULEBOT)
|
||||
spawn(0)
|
||||
post_signal(control_freq, cmd, href_list["op"], s_filter = RADIO_MULEBOT)
|
||||
|
||||
post_signal(control_freq, cmd, "bot_status", s_filter = RADIO_MULEBOT)
|
||||
spawn(10)
|
||||
post_signal(control_freq, cmd, "bot_status", s_filter = RADIO_MULEBOT)
|
||||
|
||||
|
||||
|
||||
@@ -262,6 +264,5 @@
|
||||
signal.encryption = code
|
||||
signal.data["message"] = message
|
||||
|
||||
radio_connection.post_signal(src, signal)
|
||||
|
||||
return
|
||||
spawn(0)
|
||||
radio_connection.post_signal(src, signal)
|
||||
@@ -0,0 +1,192 @@
|
||||
/datum/data/pda/utility/flashlight
|
||||
name = "Enable Flashlight"
|
||||
icon = "lightbulb-o"
|
||||
|
||||
var/fon = 0 //Is the flashlight function on?
|
||||
var/f_lum = 2 //Luminosity for the flashlight function
|
||||
|
||||
/datum/data/pda/utility/flashlight/start()
|
||||
fon = !fon
|
||||
name = fon ? "Disable Flashlight" : "Enable Flashlight"
|
||||
pda.update_shortcuts()
|
||||
pda.set_light(fon ? f_lum : 0)
|
||||
|
||||
/datum/data/pda/utility/honk
|
||||
name = "Honk Synthesizer"
|
||||
icon = "smile-o"
|
||||
category = "Clown"
|
||||
|
||||
var/last_honk //Also no honk spamming that's bad too
|
||||
|
||||
/datum/data/pda/utility/honk/start()
|
||||
if(!(last_honk && world.time < last_honk + 20))
|
||||
playsound(pda.loc, 'sound/items/bikehorn.ogg', 50, 1)
|
||||
last_honk = world.time
|
||||
|
||||
/datum/data/pda/utility/toggle_door
|
||||
name = "Toggle Door"
|
||||
icon = "external-link"
|
||||
var/remote_door_id = ""
|
||||
|
||||
/datum/data/pda/utility/toggle_door/start()
|
||||
for(var/obj/machinery/door/poddoor/M in world)
|
||||
if(M.id_tag == remote_door_id)
|
||||
if(M.density)
|
||||
M.open()
|
||||
else
|
||||
M.close()
|
||||
|
||||
/datum/data/pda/utility/scanmode/medical
|
||||
base_name = "Med Scanner"
|
||||
icon = "heart-o"
|
||||
|
||||
/datum/data/pda/utility/scanmode/medical/scan_mob(mob/living/C as mob, mob/living/user as mob)
|
||||
for (var/mob/O in viewers(C, null))
|
||||
O.show_message("<span class=warning>[user] has analyzed [C]'s vitals!</span>", 1)
|
||||
|
||||
user.show_message("<span class=notice>Analyzing Results for [C]:</span>")
|
||||
user.show_message("<span class=notice>\t Overall Status: [C.stat > 1 ? "dead" : "[C.health - C.halloss]% healthy"]</span>", 1)
|
||||
user.show_message("<span class=notice>\t Damage Specifics: [C.getOxyLoss() > 50 ? "</span><span class=warning>" : ""][C.getOxyLoss()]-[C.getToxLoss() > 50 ? "</span><span class=warning>" : "</span><span class=notice>"][C.getToxLoss()]-[C.getFireLoss() > 50 ? "</span><span class=warning>" : "</span><span class=notice>"][C.getFireLoss()]-[C.getBruteLoss() > 50 ? "</span><span class=warning>" : "</span><span class=notice>"][C.getBruteLoss()]</span>", 1)
|
||||
user.show_message("<span class=notice>\t Key: Suffocation/Toxin/Burns/Brute</span>", 1)
|
||||
user.show_message("<span class=notice>\t Body Temperature: [C.bodytemperature-T0C]°C ([C.bodytemperature*1.8-459.67]°F)</span>", 1)
|
||||
if(C.timeofdeath && (C.stat == DEAD || (C.status_flags & FAKEDEATH)))
|
||||
user.show_message("<span class=notice>\t Time of Death: [C.timeofdeath]</span>")
|
||||
if(istype(C, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = C
|
||||
var/list/damaged = H.get_damaged_organs(1,1)
|
||||
user.show_message("<span class=notice>Localized Damage, Brute/Burn:</span>",1)
|
||||
if(length(damaged)>0)
|
||||
for(var/obj/item/organ/external/org in damaged)
|
||||
user.show_message("<span class=notice>\t [capitalize(org.name)]: [org.brute_dam > 0 ? "<span class=warning>[org.brute_dam]</span>" : "0"]-[org.burn_dam > 0 ? "<span class=warning>[org.burn_dam]</span>" : "0"]", 1)
|
||||
else
|
||||
user.show_message("<span class=notice>\t Limbs are OK.",1)
|
||||
|
||||
/datum/data/pda/utility/scanmode/dna
|
||||
base_name = "DNA Scanner"
|
||||
icon = "link"
|
||||
|
||||
/datum/data/pda/utility/scanmode/dna/scan_mob(mob/living/C as mob, mob/living/user as mob)
|
||||
if (!istype(C:dna, /datum/dna))
|
||||
user << "<span class=notice>No fingerprints found on [C]</span>"
|
||||
else
|
||||
user << "<span class=notice>[C]'s Fingerprints: [md5(C:dna.uni_identity)]</span>"
|
||||
if (!C:blood_DNA)
|
||||
user << "<span class=notice>No blood found on [C]</span>"
|
||||
if(C:blood_DNA)
|
||||
qdel(C:blood_DNA)
|
||||
else
|
||||
user << "<span class=notice>Blood found on [C]. Analysing...</span>"
|
||||
spawn(15)
|
||||
for(var/blood in C:blood_DNA)
|
||||
user << "<span class=notice>Blood type: [C:blood_DNA[blood]]\nDNA: [blood]</span>"
|
||||
|
||||
/datum/data/pda/utility/scanmode/halogen
|
||||
base_name = "Halogen Counter"
|
||||
icon = "exclamation-circle"
|
||||
|
||||
/datum/data/pda/utility/scanmode/halogen/scan_mob(mob/living/C as mob, mob/living/user as mob)
|
||||
for (var/mob/O in viewers(C, null))
|
||||
O.show_message("<span class=warning>[user] has analyzed [C]'s radiation levels!</span>", 1)
|
||||
|
||||
user.show_message("<span class=notice>Analyzing Results for [C]:</span>")
|
||||
if(C.radiation)
|
||||
user.show_message("<span class=notice>Radiation Level: [C.radiation > 0 ? "</span><span class=danger>[C.radiation]" : "0"]</span>")
|
||||
else
|
||||
user.show_message("<span class=notice>No radiation detected.</span>")
|
||||
|
||||
/datum/data/pda/utility/scanmode/reagent
|
||||
base_name = "Reagent Scanner"
|
||||
icon = "flask"
|
||||
|
||||
/datum/data/pda/utility/scanmode/reagent/scan_atom(atom/A as mob|obj|turf|area, mob/user as mob)
|
||||
if(!isnull(A.reagents))
|
||||
if(A.reagents.reagent_list.len > 0)
|
||||
var/reagents_length = A.reagents.reagent_list.len
|
||||
user << "<span class='notice'>[reagents_length] chemical agent[reagents_length > 1 ? "s" : ""] found.</span>"
|
||||
for (var/re in A.reagents.reagent_list)
|
||||
user << "<span class='notice'>\t [re]</span>"
|
||||
else
|
||||
user << "<span class='notice'>No active chemical agents found in [A].</span>"
|
||||
else
|
||||
user << "<span class='notice'>No significant chemical agents found in [A].</span>"
|
||||
|
||||
/datum/data/pda/utility/scanmode/gas
|
||||
base_name = "Gas Scanner"
|
||||
icon = "tachometer"
|
||||
|
||||
/datum/data/pda/utility/scanmode/gas/scan_atom(atom/A as mob|obj|turf|area, mob/user as mob)
|
||||
if (istype(A, /obj/item/weapon/tank))
|
||||
var/obj/item/weapon/tank/T = A
|
||||
pda.atmosanalyzer_scan(T.air_contents, user, T)
|
||||
else if (istype(A, /obj/machinery/portable_atmospherics))
|
||||
var/obj/machinery/portable_atmospherics/T = A
|
||||
pda.atmosanalyzer_scan(T.air_contents, user, T)
|
||||
else if (istype(A, /obj/machinery/atmospherics/pipe))
|
||||
var/obj/machinery/atmospherics/pipe/T = A
|
||||
pda.atmosanalyzer_scan(T.parent.air, user, T)
|
||||
else if (istype(A, /obj/machinery/power/rad_collector))
|
||||
var/obj/machinery/power/rad_collector/T = A
|
||||
if(T.P)
|
||||
pda.atmosanalyzer_scan(T.P.air_contents, user, T)
|
||||
else if (istype(A, /obj/item/weapon/flamethrower))
|
||||
var/obj/item/weapon/flamethrower/T = A
|
||||
if(T.ptank)
|
||||
pda.atmosanalyzer_scan(T.ptank.air_contents, user, T)
|
||||
else if (istype(A, /obj/machinery/portable_atmospherics/scrubber/huge))
|
||||
var/obj/machinery/portable_atmospherics/scrubber/huge/T = A
|
||||
pda.atmosanalyzer_scan(T.air_contents, user, T)
|
||||
else if (istype(A, /obj/machinery/atmospherics/unary/tank))
|
||||
var/obj/machinery/atmospherics/unary/tank/T = A
|
||||
pda.atmosanalyzer_scan(T.air_contents, user, T)
|
||||
|
||||
/datum/data/pda/utility/scanmode/notes
|
||||
base_name = "Note Scanner"
|
||||
icon = "clipboard"
|
||||
var/datum/data/pda/app/notekeeper/notes
|
||||
|
||||
/datum/data/pda/utility/scanmode/notes/start()
|
||||
. = ..()
|
||||
notes = pda.find_program(/datum/data/pda/app/notekeeper)
|
||||
|
||||
/datum/data/pda/utility/scanmode/notes/scan_atom(atom/A as mob|obj|turf|area, mob/user as mob)
|
||||
if(notes && istype(A, /obj/item/weapon/paper))
|
||||
var/obj/item/weapon/paper/P = A
|
||||
|
||||
// JMO 20140705: Makes scanned document show up properly in the notes. Not pretty for formatted documents,
|
||||
// as this will clobber the HTML, but at least it lets you scan a document. You can restore the original
|
||||
// notes by editing the note again. (Was going to allow you to edit, but scanned documents are too long.)
|
||||
var/raw_scan = P.info
|
||||
var/formatted_scan = ""
|
||||
// Scrub out the tags (replacing a few formatting ones along the way)
|
||||
// Find the beginning and end of the first tag.
|
||||
var/tag_start = findtext(raw_scan, "<")
|
||||
var/tag_stop = findtext(raw_scan, ">")
|
||||
// Until we run out of complete tags...
|
||||
while(tag_start && tag_stop)
|
||||
var/pre = copytext(raw_scan, 1, tag_start) // Get the stuff that comes before the tag
|
||||
var/tag = lowertext(copytext(raw_scan, tag_start + 1, tag_stop)) // Get the tag so we can do intellegent replacement
|
||||
var/tagend = findtext(tag, " ") // Find the first space in the tag if there is one.
|
||||
// Anything that's before the tag can just be added as is.
|
||||
formatted_scan = formatted_scan + pre
|
||||
// If we have a space after the tag (and presumably attributes) just crop that off.
|
||||
if(tagend)
|
||||
tag = copytext(tag, 1, tagend)
|
||||
if(tag == "p" || tag == "/p" || tag == "br") // Check if it's I vertical space tag.
|
||||
formatted_scan = formatted_scan + "<br>" // If so, add some padding in.
|
||||
raw_scan = copytext(raw_scan, tag_stop + 1) // continue on with the stuff after the tag
|
||||
// Look for the next tag in what's left
|
||||
tag_start = findtext(raw_scan, "<")
|
||||
tag_stop = findtext(raw_scan, ">")
|
||||
// Anything that is left in the page. just tack it on to the end as is
|
||||
formatted_scan = formatted_scan + raw_scan
|
||||
// If there is something in there already, pad it out.
|
||||
if(length(notes.note) > 0)
|
||||
notes.note = notes.note + "<br><br>"
|
||||
// Store the scanned document to the notes
|
||||
notes.note = "Scanned Document. Edit to restore previous notes/delete scan.<br>----------<br>" + formatted_scan + "<br>"
|
||||
// notehtml ISN'T set to allow user to get their old notes back. A better implementation would add a "scanned documents"
|
||||
// feature to the PDA, which would better convey the availability of the feature, but this will work for now.
|
||||
// Inform the user
|
||||
user << "<span class=notice>Paper scanned and OCRed to notekeeper.</span>" //concept of scanning paper copyright brainoblivion 2009
|
||||
else
|
||||
user << "<span class=warning>Error scanning [A].</span>"
|
||||
@@ -27,16 +27,18 @@
|
||||
if(useMS)
|
||||
if(prob(5))
|
||||
// /obj/machinery/message_server/proc/send_pda_message(var/recipient = "",var/sender = "",var/message = "")
|
||||
var/obj/item/device/pda/P
|
||||
var/list/viables = list()
|
||||
for(var/obj/item/device/pda/check_pda in PDAs)
|
||||
if (!check_pda.owner||check_pda.toff||check_pda == src||check_pda.hidden)
|
||||
var/datum/data/pda/app/messenger/check_m = check_pda.find_program(/datum/data/pda/app/messenger)
|
||||
|
||||
if (!check_m || !check_m.can_receive())
|
||||
continue
|
||||
viables.Add(check_pda)
|
||||
|
||||
if(!viables.len)
|
||||
return
|
||||
P = pick(viables)
|
||||
var/obj/item/device/pda/P = pick(viables)
|
||||
var/datum/data/pda/app/messenger/PM = P.find_program(/datum/data/pda/app/messenger)
|
||||
|
||||
var/sender
|
||||
var/message
|
||||
@@ -104,7 +106,7 @@
|
||||
//Commented out because we don't send messages like this anymore. Instead it will just popup in their chat window.
|
||||
//P.tnote += "<i><b>← From [sender] (Unknown / spam?):</b></i><br>[message]<br>"
|
||||
|
||||
P.play_ringtone()
|
||||
PM.play_ringtone()
|
||||
//Search for holder of the PDA.
|
||||
var/mob/living/L = null
|
||||
if(P.loc && isliving(P.loc))
|
||||
|
||||
@@ -108,7 +108,8 @@
|
||||
pda.ownjob = "Personal Assistant"
|
||||
pda.owner = text("[]", src)
|
||||
pda.name = pda.owner + " (" + pda.ownjob + ")"
|
||||
pda.toff = 1
|
||||
var/datum/data/pda/app/messenger/M = pda.find_program(/datum/data/pda/app/messenger)
|
||||
M.toff = 1
|
||||
..()
|
||||
|
||||
/mob/living/silicon/pai/Login()
|
||||
|
||||
@@ -142,15 +142,24 @@
|
||||
on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
|
||||
var/data[0]
|
||||
|
||||
data["receiver_off"] = user.pda.toff
|
||||
data["ringer_off"] = user.pda.silent
|
||||
if(!user.pda)
|
||||
return
|
||||
var/datum/data/pda/app/messenger/M = user.pda.find_program(/datum/data/pda/app/messenger)
|
||||
if(!M)
|
||||
return
|
||||
|
||||
data["receiver_off"] = M.toff
|
||||
data["ringer_off"] = M.silent
|
||||
data["current_ref"] = null
|
||||
data["current_name"] = user.current_pda_messaging
|
||||
|
||||
var/pdas[0]
|
||||
if(!user.pda.toff)
|
||||
if(!M.toff)
|
||||
for(var/obj/item/device/pda/P in PDAs)
|
||||
if(!P.owner || P.toff || P == user.pda || P.hidden) continue
|
||||
var/datum/data/pda/app/messenger/PM = P.find_program(/datum/data/pda/app/messenger)
|
||||
|
||||
if(P == user.pda || !PM || !PM.can_receive())
|
||||
continue
|
||||
var/pda[0]
|
||||
pda["name"] = "[P]"
|
||||
pda["owner"] = "[P.owner]"
|
||||
@@ -163,7 +172,7 @@
|
||||
|
||||
var/messages[0]
|
||||
if(user.current_pda_messaging)
|
||||
for(var/index in user.pda.tnote)
|
||||
for(var/index in M.tnote)
|
||||
if(index["owner"] != user.current_pda_messaging)
|
||||
continue
|
||||
var/msg[0]
|
||||
@@ -188,11 +197,15 @@
|
||||
if(!istype(P)) return
|
||||
|
||||
if(!isnull(P.pda))
|
||||
var/datum/data/pda/app/messenger/M = P.pda.find_program(/datum/data/pda/app/messenger)
|
||||
if(!M)
|
||||
return
|
||||
|
||||
if(href_list["toggler"])
|
||||
P.pda.toff = href_list["toggler"] != "1"
|
||||
M.toff = href_list["toggler"] != "1"
|
||||
return 1
|
||||
else if(href_list["ringer"])
|
||||
P.pda.silent = href_list["ringer"] != "1"
|
||||
M.silent = href_list["ringer"] != "1"
|
||||
return 1
|
||||
else if(href_list["select"])
|
||||
var/s = href_list["select"]
|
||||
@@ -206,7 +219,7 @@
|
||||
return alert("Communications circuits remain uninitialized.")
|
||||
|
||||
var/target = locate(href_list["target"])
|
||||
P.pda.create_message(P, target, 1)
|
||||
M.create_message(P, target, 1)
|
||||
return 1
|
||||
|
||||
/datum/pai_software/med_records
|
||||
|
||||
@@ -174,7 +174,9 @@ var/list/robot_verbs_default = list(
|
||||
rbPDA = new/obj/item/device/pda/ai(src)
|
||||
rbPDA.set_name_and_job(custom_name,braintype)
|
||||
if(scrambledcodes)
|
||||
rbPDA.hidden = 1
|
||||
var/datum/data/pda/app/messenger/M = rbPDA.find_program(/datum/data/pda/app/messenger)
|
||||
if(M)
|
||||
M.hidden = 1
|
||||
|
||||
/mob/living/silicon/robot/binarycheck()
|
||||
if(is_component_functioning("comms"))
|
||||
|
||||
@@ -231,8 +231,8 @@
|
||||
if(L)
|
||||
L << "\icon[P] <b>Message from unknown source: </b>\"[t]\" (Unable to Reply)"
|
||||
P.play_ringtone()
|
||||
P.overlays.Cut()
|
||||
P.overlays += image('icons/obj/pda.dmi', "pda-r")
|
||||
var/datum/data/pda/app/messenger/M = P.find_program(/datum/data/pda/app/messenger)
|
||||
M.set_new(1)
|
||||
|
||||
if("Inject")
|
||||
if( (href_list["tag"]=="radium"? (reagents.get_reagent_amount("radium"))<=(a_boost*a_transfer) : !reagents.get_reagent_amount(href_list["tag"])) )//Special case for radium. If there are only a_boost*a_transfer radium units left.
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,57 @@
|
||||
NanoStatePDAClass.inheritsFrom(NanoStateClass);
|
||||
var NanoStatePDA = new NanoStatePDAClass();
|
||||
var pda_app_template = null;
|
||||
|
||||
function NanoStatePDAClass() {
|
||||
this.key = 'pda';
|
||||
this.key = this.key.toLowerCase();
|
||||
|
||||
NanoStateManager.addState(this);
|
||||
}
|
||||
|
||||
NanoStatePDAClass.prototype.onUpdate = function(data) {
|
||||
NanoStateClass.prototype.onUpdate.call(this, data);
|
||||
|
||||
try {
|
||||
if(data['data']['app'] != null) {
|
||||
var template = data['data']['app']['template'];
|
||||
if(template != null && template != pda_app_template) {
|
||||
$.when($.ajax({
|
||||
url: template + '.tmpl',
|
||||
cache: false,
|
||||
dataType: 'text'
|
||||
}))
|
||||
.done(function(templateMarkup) {
|
||||
templateMarkup += '<div class="clearBoth"></div>';
|
||||
|
||||
try {
|
||||
NanoTemplate.addTemplate('app', templateMarkup);
|
||||
NanoTemplate.resetTemplate('app');
|
||||
$("#uiApp").html(NanoTemplate.parse('app', data));
|
||||
pda_app_template = template;
|
||||
|
||||
if(data['config']['status'] == 2) {
|
||||
$('#uiApp .linkActive').addClass('linkPending');
|
||||
$('#uiApp .linkActive').oneTime(300, 'linkPending', function () {
|
||||
$('#uiApp .linkActive').removeClass('linkPending inactive');
|
||||
});
|
||||
}
|
||||
} catch(error) {
|
||||
reportError('ERROR: An error occurred while loading the UI: ' + error.message);
|
||||
return;
|
||||
}
|
||||
})
|
||||
.fail( function () {
|
||||
reportError('ERROR: Loading template app(' + template + ') failed!');
|
||||
});
|
||||
} else {
|
||||
if (NanoTemplate.templateExists('app')) {
|
||||
$("#uiApp").html(NanoTemplate.parse('app', data));
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch(error) {
|
||||
reportError('ERROR: An error occurred while rendering the UI: ' + error.message);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -87,6 +87,9 @@ var NanoTemplate = function () {
|
||||
templateExists: function (key) {
|
||||
return _templates.hasOwnProperty(key);
|
||||
},
|
||||
resetTemplate: function (key) {
|
||||
_compiledTemplates[key] = null;
|
||||
},
|
||||
parse: function (templateKey, data) {
|
||||
if (!_compiledTemplates.hasOwnProperty(templateKey) || !_compiledTemplates[templateKey]) {
|
||||
if (!_templates.hasOwnProperty(templateKey)) {
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
@good-color: #4f7529;
|
||||
@average-color: #cd6500;
|
||||
@bad-color: #ee0000;
|
||||
|
||||
@highlight-color: #8BA5C4;
|
||||
@dark-color: #272727;
|
||||
@import "_config";
|
||||
|
||||
.white {
|
||||
color: white;
|
||||
|
||||
@@ -4,4 +4,12 @@
|
||||
|
||||
// Body Colors
|
||||
@background-start: #2a2a2a;
|
||||
@background-end: #202020;
|
||||
@background-end: #202020;
|
||||
|
||||
// Element Colors
|
||||
@good-color: #4f7529;
|
||||
@average-color: #cd6500;
|
||||
@bad-color: #ee0000;
|
||||
|
||||
@highlight-color: #8BA5C4;
|
||||
@dark-color: #272727;
|
||||
@@ -74,6 +74,14 @@ div.notice {
|
||||
.pdalink {
|
||||
float: left;
|
||||
white-space: nowrap;
|
||||
cursor: default !important;
|
||||
|
||||
&.disabled {
|
||||
background: none;
|
||||
border: none;
|
||||
color: #999;
|
||||
text-align: left;
|
||||
}
|
||||
}
|
||||
|
||||
.pdanote {
|
||||
@@ -81,6 +89,50 @@ div.notice {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.item.mainmenu {
|
||||
padding-bottom: 0.5em;
|
||||
}
|
||||
|
||||
div.clock {
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
float: right;
|
||||
padding-right: 2em;
|
||||
}
|
||||
|
||||
#pdaFooter {
|
||||
position: fixed;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
background: @dark-color;
|
||||
}
|
||||
|
||||
.pdaFooterButton {
|
||||
width: 33%;
|
||||
padding: 0.5em 0;
|
||||
font-size: 200%;
|
||||
border: none;
|
||||
background: none;
|
||||
color: #fff;
|
||||
|
||||
&:hover {
|
||||
background: #507aac;
|
||||
}
|
||||
|
||||
&.disabled {
|
||||
background: none !important;
|
||||
color: #555 !important;
|
||||
}
|
||||
|
||||
.uiLinkPendingIcon {
|
||||
position: absolute;
|
||||
width: 33%;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
}
|
||||
}
|
||||
|
||||
/* DNA Modifier styling */
|
||||
.dnaBlock {
|
||||
float: left;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
@import "_config";
|
||||
|
||||
body {
|
||||
background: #272727;
|
||||
background: @dark-color;
|
||||
color: #ffffff;
|
||||
font-family: @font;
|
||||
font-size: @fontsize;
|
||||
|
||||
+61
-979
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,60 @@
|
||||
<!--
|
||||
Title: PDA Atmospheric Scanner UI
|
||||
Used In File(s): \code\game\objects\items\devices\PDA\cart_apps.dm
|
||||
-->
|
||||
<div class="statusDisplay" style="height: 250px; overflow: auto;">
|
||||
<div class="item">
|
||||
{{if data.aircontents.reading == 1}}
|
||||
<div class="itemLabel">
|
||||
<span class="pdanote">Pressure:</span>
|
||||
</div>
|
||||
<div class = "itemContent">
|
||||
{{:helper.string('<span class="{0}">{1} kPa</span>', data.aircontents.pressure < 80 || data.aircontents.pressure > 120 ? 'bad' : data.aircontents.pressure < 95 || data.aircontents.pressure > 110 ? 'average' : 'good' , data.aircontents.pressure)}}
|
||||
</div>
|
||||
<div class="itemLabel">
|
||||
<span class="pdanote">Temperature:</span>
|
||||
</div>
|
||||
<div class = "itemContent">
|
||||
{{:helper.string('<span class="{0}">{1} °C</span>', data.aircontents.temp < 5 || data.aircontents.temp > 35 ? 'bad' : data.aircontents.temp < 15 || data.aircontents.temp > 25 ? 'average' : 'good' , data.aircontents.temp)}}
|
||||
</div>
|
||||
<br>
|
||||
<div class="itemLabel">
|
||||
<span class="pdanote">Oxygen:</span>
|
||||
</div>
|
||||
<div class = "itemContent">
|
||||
{{:helper.string('<span class="{0}">{1}%</span>', data.aircontents.oxygen < 17 ? 'bad' : data.aircontents.oxygen < 19 ? 'average' : 'good' , data.aircontents.oxygen)}}
|
||||
</div>
|
||||
<div class="itemLabel">
|
||||
<span class="pdanote">Nitrogen:</span>
|
||||
</div>
|
||||
<div class = "itemContent">
|
||||
{{:helper.string('<span class="{0}">{1}%</span>', data.aircontents.nitrogen > 82 ? 'bad' : data.aircontents.nitrogen > 80 ? 'average' : 'good' , data.aircontents.nitrogen)}}
|
||||
</div>
|
||||
<div class="itemLabel">
|
||||
<span class="pdanote">Carbon Dioxide:</span>
|
||||
</div>
|
||||
<div class = "itemContent">
|
||||
{{:helper.string('<span class="{0}">{1}%</span>', data.aircontents.carbon_dioxide > 5 ? 'bad' : 'good' , data.aircontents.carbon_dioxide)}}
|
||||
</div>
|
||||
<div class="itemLabel">
|
||||
<span class="pdanote">Plasma:</span>
|
||||
</div>
|
||||
<div class = "itemContent">
|
||||
{{:helper.string('<span class="{0}">{1}%</span>', data.aircontents.plasma > 0 ? 'bad' : 'good' , data.aircontents.plasma)}}
|
||||
|
||||
</div>
|
||||
{{if data.aircontents.other > 0}}
|
||||
<div class="itemLabel">
|
||||
<span class="pdanote">Unknown:</span>
|
||||
</div>
|
||||
<div class = "itemContent">
|
||||
<span class="bad">{{:data.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>
|
||||
@@ -0,0 +1,50 @@
|
||||
<div class="statusDisplay">
|
||||
<div class="item">
|
||||
<span class="good">Current Location:</span>
|
||||
{{if data.janitor.user_loc.x == 0}}
|
||||
<span class="bad">Unknown</span>
|
||||
{{else}}
|
||||
<span class="average"> {{:data.janitor.user_loc.x}} / {{:data.janitor.user_loc.y}}</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="item">
|
||||
{{for data.janitor.mops}}
|
||||
{{if value.x==0}}
|
||||
<span class="bad">Unable to locate Mop</span>
|
||||
{{else}}
|
||||
<span class="good">Mop Location:</span>
|
||||
<span class="average">({{:value.x}} / {{:value.y}}) - {{:value.dir}} - Status: {{:value.status}}</span><br>
|
||||
{{/if}}
|
||||
{{/for}}
|
||||
</div>
|
||||
<div class="item">
|
||||
{{for data.janitor.buckets}}
|
||||
{{if value.x==0}}
|
||||
<span class="bad">Unable to locate Water Buckets</span>
|
||||
{{else}}
|
||||
<span class="good">Water Buckets Location:</span>
|
||||
<span class="average">({{:value.x}} / {{:value.y}}) - {{:value.dir}} - Water Level: {{:value.status}}</span><br>
|
||||
{{/if}}
|
||||
{{/for}}
|
||||
</div>
|
||||
<div class="item">
|
||||
{{for data.janitor.cleanbots}}
|
||||
{{if value.x==0}}
|
||||
<span class="bad">Unable to locate Clean Bots</span>
|
||||
{{else}}
|
||||
<span class="good">Clean Bots Location:</span>
|
||||
<span class="average">({{:value.x}} / {{:value.y}}) - {{:value.dir}} - Status: {{:value.status}}</span><br>
|
||||
{{/if}}
|
||||
{{/for}}
|
||||
</div>
|
||||
<div class="item">
|
||||
{{for data.janitor.carts}}
|
||||
{{if value.x==0}}
|
||||
<span class="bad">Unable to locate Janitorial Cart</span>
|
||||
{{else}}
|
||||
<span class="good">Janitorial cart Location:</span>
|
||||
<span class="average">({{:value.x}} / {{:value.y}}) - {{:value.dir}} - Status: {{:value.status}}</span><br>
|
||||
{{/if}}
|
||||
{{/for}}
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,48 @@
|
||||
<!--
|
||||
Title: PDA Home UI
|
||||
Used In File(s): \code\game\objects\items\devices\PDA\core_apps.dm
|
||||
-->
|
||||
<div class="item">
|
||||
<div class="itemLabelNarrow">
|
||||
Owner:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
<span class="average">{{:data.owner}}, {{:data.ownjob}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="itemLabelNarrow">
|
||||
ID:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{:helper.link('Update PDA Info', 'refresh', {'choice' : "UpdateInfo"}, data.idInserted ? null : 'disabled', 'pdalink fixedLeftWide')}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<H2>Functions</H2>
|
||||
</div>
|
||||
{{for data.categories : cat : i}}
|
||||
<div class="item mainmenu">
|
||||
<div class="itemLabelNarrow">
|
||||
<b>{{:cat}}</b>:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{for data.apps[cat]}}
|
||||
{{:helper.link(value.name, value.icon, {'choice' : "StartProgram", 'program' : value.ref}, null, 'pdalink fixedLeftWide')}}
|
||||
{{/for}}
|
||||
</div>
|
||||
</div>
|
||||
{{/for}}
|
||||
|
||||
{{if data.pai}}
|
||||
<div class="item">
|
||||
<div class = "itemLabelNarrow">
|
||||
<b>PAI Utilities</b>:
|
||||
</div>
|
||||
<div class = "itemContent">
|
||||
{{:helper.link('Configuration', 'gear', {'choice' : "pai", 'option' : "1"}, null, 'pdalink fixedLeft')}}
|
||||
{{:helper.link('Eject pAI', 'eject', {'choice' : "pai", 'option' : "2"}, null, 'pdalink fixedLeft')}}
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
@@ -0,0 +1,96 @@
|
||||
<!--
|
||||
Title: PDA Crew Manifest UI
|
||||
Used In File(s): \code\game\objects\items\devices\PDA\core_apps.dm
|
||||
-->
|
||||
<div class="item">
|
||||
<center><table class="pmon"><tbody>
|
||||
{{if data.manifest.heads}}
|
||||
<tr><th colspan="3" class="command">Command</th></tr>
|
||||
{{for data.manifest["heads"]}}
|
||||
{{if value.rank == "Captain"}}
|
||||
<tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr>
|
||||
{{else}}
|
||||
<tr><td><span class="average">{{:value.name}}</span></td><td><span class="average">{{:value.rank}}</span></td><td><span class="average">{{:value.active}}</span></td></tr>
|
||||
{{/if}}
|
||||
{{/for}}
|
||||
{{/if}}
|
||||
{{if data.manifest.sec}}
|
||||
<tr><th colspan="3" class="sec">Security</th></tr>
|
||||
{{for data.manifest["sec"]}}
|
||||
{{if value.rank == "Head of Security"}}
|
||||
<tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr>
|
||||
{{else}}
|
||||
<tr><td><span class="average">{{:value.name}}</span></td><td><span class="average">{{:value.rank}}</span></td><td><span class="average">{{:value.active}}</span></td></tr>
|
||||
{{/if}}
|
||||
{{/for}}
|
||||
{{/if}}
|
||||
{{if data.manifest.eng}}
|
||||
<tr><th colspan="3" class="eng">Engineering</th></tr>
|
||||
{{for data.manifest["eng"]}}
|
||||
{{if value.rank == "Chief Engineer"}}
|
||||
<tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr>
|
||||
{{else}}
|
||||
<tr><td><span class="average">{{:value.name}}</span></td><td><span class="average">{{:value.rank}}</span></td><td><span class="average">{{:value.active}}</span></td></tr>
|
||||
{{/if}}
|
||||
{{/for}}
|
||||
{{/if}}
|
||||
{{if data.manifest.med}}
|
||||
<tr><th colspan="3" class="med">Medical</th></tr>
|
||||
{{for data.manifest["med"]}}
|
||||
{{if value.rank == "Chief Medical Officer"}}
|
||||
<tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr>
|
||||
{{else}}
|
||||
<tr><td><span class="average">{{:value.name}}</span></td><td><span class="average">{{:value.rank}}</span></td><td><span class="average">{{:value.active}}</span></td></tr>
|
||||
{{/if}}
|
||||
{{/for}}
|
||||
{{/if}}
|
||||
{{if data.manifest.sci}}
|
||||
<tr><th colspan="3" class="sci">Science</th></tr>
|
||||
{{for data.manifest["sci"]}}
|
||||
{{if value.rank == "Research Director"}}
|
||||
<tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr>
|
||||
{{else}}
|
||||
<tr><td><span class="average">{{:value.name}}</span></td><td><span class="average">{{:value.rank}}</span></td><td><span class="average">{{:value.active}}</span></td></tr>
|
||||
{{/if}}
|
||||
{{/for}}
|
||||
{{/if}}
|
||||
{{if data.manifest.ser}}
|
||||
<tr><th colspan="3" class="ser">Service</th></tr>
|
||||
{{for data.manifest["ser"]}}
|
||||
{{if value.rank == "Head of Personnel"}}
|
||||
<tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr>
|
||||
{{else}}
|
||||
<tr><td><span class="average">{{:value.name}}</span></td><td><span class="average">{{:value.rank}}</span></td><td><span class="average">{{:value.active}}</span></td></tr>
|
||||
{{/if}}
|
||||
{{/for}}
|
||||
{{/if}}
|
||||
{{if data.manifest.sup}}
|
||||
<tr><th colspan="3" class="sup">Supply</th></tr>
|
||||
{{for data.manifest["sup"]}}
|
||||
{{if value.rank == "Head of Personnel"}}
|
||||
<tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr>
|
||||
{{else value.rank == "Quartermaster"}}
|
||||
<tr><td><span class="qm-job">{{:value.name}}</span></td><td><span class="qm-job">{{:value.rank}}</span></td><td><span class="qm-job">{{:value.active}}</span></td></tr>
|
||||
{{else}}
|
||||
<tr><td><span class="average">{{:value.name}}</span></td><td><span class="average">{{:value.rank}}</span></td><td><span class="average">{{:value.active}}</span></td></tr>
|
||||
{{/if}}
|
||||
{{/for}}
|
||||
{{/if}}
|
||||
{{if data.manifest.civ}}
|
||||
<tr><th colspan="3" class="civ">Civilian</th></tr>
|
||||
{{for data.manifest["civ"]}}
|
||||
{{if value.rank == "Head of Personnel"}}
|
||||
<tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr>
|
||||
{{else}}
|
||||
<tr><td><span class="average">{{:value.name}}</span></td><td><span class="average">{{:value.rank}}</span></td><td><span class="average">{{:value.active}}</span></td></tr>
|
||||
{{/if}}
|
||||
{{/for}}
|
||||
{{/if}}
|
||||
{{if data.manifest.misc}}
|
||||
<tr><th colspan="3" class="misc">Misc</th></tr>
|
||||
{{for data.manifest["misc"]}}
|
||||
<tr><td><span class="average">{{:value.name}}</span></td><td><span class="average">{{:value.rank}}</span></td><td><span class="average">{{:value.active}}</span></td></tr>
|
||||
{{/for}}
|
||||
{{/if}}
|
||||
</tbody></table></center>
|
||||
</div>
|
||||
@@ -0,0 +1,54 @@
|
||||
{{if !data.records}}
|
||||
<div class="item">
|
||||
<div class="itemLabel">Select a record:</div>
|
||||
</div>
|
||||
{{for data.recordsList}}
|
||||
<div class="item">
|
||||
{{:helper.link(value.Name, 'user', {'choice' : "Records", 'target' : value.ref}, null, 'pdalink fixedLeftWidest')}}
|
||||
</div>
|
||||
{{empty}}
|
||||
<div class="item">
|
||||
<span class="average">No records found.</span>
|
||||
</div>
|
||||
{{/for}}
|
||||
{{else}}
|
||||
<div class="statusDisplayRecords">
|
||||
<div class="item">
|
||||
<div class="itemContent" style="width: 100%;">
|
||||
{{if data.records.general}}
|
||||
<span class="good">Name: </span> <span class="average">{{:data.records.general.name}} </span><br>
|
||||
<span class="good">Sex: </span> <span class="average">{{:data.records.general.sex}} </span><br>
|
||||
<span class="good">Species: </span> <span class="average">{{:data.records.general.species}} </span><br>
|
||||
<span class="good">Age: </span> <span class="average">{{:data.records.general.age}} </span><br>
|
||||
<span class="good">Rank: </span> <span class="average">{{:data.records.general.rank}} </span><br>
|
||||
<span class="good">Fingerprint: </span> <span class="average">{{:data.records.general.fingerprint}} </span><br>
|
||||
<span class="good">Physical Status: </span> <span class="average">{{:data.records.general.p_stat}} </span><br>
|
||||
<span class="good">Mental Status: </span> <span class="average">{{:data.records.general.m_stat}} </span><br><br>
|
||||
{{else}}
|
||||
<span class="bad">
|
||||
General Record Lost!<br><br>
|
||||
</span>
|
||||
{{/if}}
|
||||
{{if data.records.medical}}
|
||||
<div class="item">
|
||||
<div class="itemLabel">Medical Data:</div>
|
||||
</div>
|
||||
<span class="good">Blood Type: </span> <span class="average">{{:data.records.medical.b_type}} </span><br><br>
|
||||
<span class="good">Minor Disabilities: </span> <span class="average">{{:data.records.medical.mi_dis}} </span><br>
|
||||
<span class="good">Details: </span> <span class="average">{{:data.records.medical.mi_dis_d}} </span><br><br>
|
||||
<span class="good">Major Disabilities: </span> <span class="average">{{:data.records.medical.ma_dis}} </span><br>
|
||||
<span class="good">Details: </span> <span class="average">{{:data.records.medical.ma_dis_d}} </span><br><br>
|
||||
<span class="good">Allergies: </span> <span class="average">{{:data.records.medical.alg}} </span><br>
|
||||
<span class="good">Details: </span> <span class="average">{{:data.records.medical.alg_d}} </span><br><br>
|
||||
<span class="good">Current Disease: </span> <span class="average">{{:data.records.medical.cdi}} </span><br>
|
||||
<span class="good">Details: </span> <span class="average">{{:data.records.medical.alg_d}} </span><br><br>
|
||||
<span class="good">Important Notes: </span> <span class="average">{{:data.records.medical.notes}} </span>
|
||||
{{else}}
|
||||
<span class="bad">
|
||||
Medical Record Lost!
|
||||
</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
@@ -0,0 +1,81 @@
|
||||
<!--
|
||||
Title: PDA Messenger UI
|
||||
Used In File(s): \code\game\objects\items\devices\PDA\core_apps.dm
|
||||
-->
|
||||
{{if data.active_conversation}}
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
<b>Messenger Functions</b>:
|
||||
</div>
|
||||
<div class ="itemContent">
|
||||
{{:helper.link('Delete Conversation', 'trash', {'choice' : "Clear", 'option' : "Convo"}, null, 'pdalink fixedLeftWide')}}
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
<br>
|
||||
<H3>Conversation with: <span class="average">{{:data.convo_name}} ({{:data.convo_job}})</span></H3>
|
||||
<div class="statusDisplay" style="overflow: auto;">
|
||||
<div class="item">
|
||||
<div class="itemContent" style="width: 100%;">
|
||||
{{for data.messages}}
|
||||
{{if data.active_conversation == value.target}}
|
||||
{{if value.sent==0}}
|
||||
<span class="average"><B>Them</B>: {{:value.message}}</span><br>
|
||||
{{else}}
|
||||
<span class="good"><B>You</B>: {{:value.message}}</span><br>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
{{/for}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{:helper.link('Reply', 'comment', {'choice' : "Message", 'target': data.active_conversation}, null, 'pdalink fixedLeft')}}
|
||||
{{else}}
|
||||
<div class="item">
|
||||
<div class="itemLabelNarrow">
|
||||
<b>Messenger Functions</b>:
|
||||
</div>
|
||||
<div class ="itemContent">
|
||||
{{:helper.link(data.silent==1 ? 'Ringer: Off' : 'Ringer: On', data.silent==1 ? 'volume-off' : 'volume-up', {'choice' : "Toggle Ringer"}, null, 'pdalink fixedLeftWide')}}
|
||||
{{:helper.link(data.toff==1 ? 'Messenger: Off' : 'Messenger: On',data.toff==1 ? 'close':'check', {'choice' : "Toggle Messenger"}, null, 'pdalink fixedLeftWide')}}
|
||||
{{:helper.link('Set Ringtone', 'comment', {'choice' : "Ringtone"}, null, 'pdalink fixedLeftWide')}}
|
||||
{{:helper.link('Delete all Conversations', 'trash', {'choice' : "Clear", 'option' : "All"}, null, 'pdalink fixedLeftWider')}}
|
||||
</div>
|
||||
</div>
|
||||
{{if data.toff == 0}}
|
||||
<br>
|
||||
{{if data.charges}}
|
||||
<div class="item">
|
||||
<b>{{:data.charges}} charges left.</b>
|
||||
<br><br>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{if data.pda_count == 0}}
|
||||
<b>No other PDAS located</b>
|
||||
{{else}}
|
||||
<H3>Current Conversations</H3>
|
||||
{{for data.convopdas}}
|
||||
<div class="item">
|
||||
{{:helper.link(value.Name, 'arrow-circle-down', {'choice' : "Select Conversation", 'convo' : value.Reference } , null, 'pdalink')}}
|
||||
{{if data.charges}}
|
||||
{{for data.plugins : plugin : i}}
|
||||
{{:helper.link(plugin.name, plugin.icon, {'choice' : "Messenger Plugin", 'plugin' : plugin.ref, 'target' : value.Reference}, null, 'pdalink fixedLeft')}}
|
||||
{{/for}}
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/for}}
|
||||
<H3>Other PDAs</H3>
|
||||
{{for data.pdas}}
|
||||
<div class="item">
|
||||
{{:helper.link(value.Name, 'arrow-circle-down', {'choice' : "Message", 'target' : value.Reference}, null, 'pdalink')}}
|
||||
{{if data.charges}}
|
||||
{{for data.plugins : plugin : i}}
|
||||
{{:helper.link(plugin.name, plugin.icon, {'choice' : "Messenger Plugin", 'plugin' : plugin.ref, 'target' : value.Reference}, null, 'pdalink fixedLeft')}}
|
||||
{{/for}}
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/for}}
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
@@ -0,0 +1,118 @@
|
||||
{{if !data.mulebot.active}}
|
||||
{{if data.mulebot.count == 0}}
|
||||
<H1><span class="bad">No bots found.</span></H1>
|
||||
{{else}}
|
||||
<div class="item">
|
||||
Select a MULE:
|
||||
</div>
|
||||
<br>
|
||||
{{for data.mulebot.bots}}
|
||||
<div class="item">
|
||||
{{:helper.link(value.Name, 'gear', {'radiomenu' : "1", 'op' : "control",'bot' : value.ref}, null, 'pdalink fixedLeftWidest')}} (Location: {{:value.Location}})
|
||||
</div>
|
||||
{{/for}}
|
||||
{{/if}}
|
||||
<br>
|
||||
{{:helper.link('Scan for Bots','rss', {'radiomenu' : "1", 'op' : "scanbots"}, null, 'pdalink fixedLeftWidest')}}
|
||||
{{else}}
|
||||
<H1><span class="average">{{:data.mulebot.active}}</span></H1>
|
||||
{{if data.mulebot.botstatus.mode == -1}}
|
||||
<H1><span class="bad">Waiting for response...</span></H1>
|
||||
{{else}}
|
||||
<H1><span class="good">Status:</span></H1>
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
<span class="good">Location:</span>
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
<span class="average">{{:data.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 data.mulebot.botstatus.mode == 0}}
|
||||
Ready
|
||||
{{else data.mulebot.botstatus.mode == 1}}
|
||||
Loading/Unloading
|
||||
{{else data.mulebot.botstatus.mode == 2}}
|
||||
Navigating to Delivery Location
|
||||
{{else data.mulebot.botstatus.mode == 3}}
|
||||
Navigating to Home
|
||||
{{else data.mulebot.botstatus.mode == 4}}
|
||||
Waiting for Clear Path
|
||||
{{else data.mulebot.botstatus.mode == 5 || data.mulebot.botstatus.mode == 6}}
|
||||
Calculating navigation Path
|
||||
{{else data.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">
|
||||
{{:helper.link(data.mulebot.botstatus.load == null ? 'None (Unload)' : data.mulebot.botstatus.load + ' (Unload)', 'archive', {'radiomenu' : "1", 'op' : "unload"},data.mulebot.botstatus.load == null ? 'disabled' : null, 'pdalink fixedLeftWidest')}}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
<span class="good">Power:</span>
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
<span class="average">
|
||||
{{:data.mulebot.botstatus.powr}}%
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
<span class="good">Destination:</span>
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{:helper.link(data.mulebot.botstatus.dest == null || data.mulebot.botstatus.dest == "" ? 'None (Set)' : data.mulebot.botstatus.dest + ' (Set)', 'gear', {'radiomenu' : "1", 'op' : "setdest"}, null, 'pdalink fixedLeftWidest')}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
<span class="good">Home:</span>
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{if data.mulebot.botstatus.home == null}} None {{else}} {{:data.mulebot.botstatus.home}} {{/if}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
<span class="good">Auto Return:</span>
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{:helper.link(data.mulebot.botstatus.retn == 1 ? 'ON' : 'OFF', 'gear', {'radiomenu' : "1", 'op' : (data.mulebot.botstatus.retn==1 ? "retoff" : "reton")}, null, 'pdalink fixedLeftWidest')}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
<span class="good">Auto Pickup:</span>
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{:helper.link(data.mulebot.botstatus.pick==1? 'ON' : 'OFF', 'gear', {'radiomenu' : "1", 'op' : (data.mulebot.botstatus.pick==1 ? "pickoff" : "pickon")}, null, 'pdalink fixedLeftWidest')}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
<span class="good">Functions:</span>
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{:helper.link('Stop', 'gear', {'radiomenu' : "1", 'op' : "stop"}, null, 'pdalink fixedLeft')}}
|
||||
{{:helper.link('Proceed', 'gear', {'radiomenu' : "1", 'op' : "go"}, null, 'pdalink fixedLeft')}}
|
||||
{{:helper.link('Return Home', 'gear', {'radiomenu' : "1", 'op' : "home"}, null, 'pdalink fixedLeft')}}
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
@@ -0,0 +1,21 @@
|
||||
<!--
|
||||
Title: PDA Notekeeper UI
|
||||
Used In File(s): \code\game\objects\items\devices\PDA\apps.dm
|
||||
-->
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
<b>Notes</b>:
|
||||
</div>
|
||||
</div>
|
||||
<div class="statusDisplayRecords">
|
||||
<div class="item">
|
||||
<div class="itemContent" style="width: 100%;">
|
||||
<span class="pdanote">{{:data.note}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
{{:helper.link('Edit Notes', 'pencil-square-o', {'choice': "Edit"}, null, 'pdalink')}}
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,49 @@
|
||||
{{if !data.records.powerconnected}}
|
||||
<div class="item">
|
||||
<div class="itemLabel">Select a power monitor:</div>
|
||||
</div>
|
||||
{{for data.records.powermonitors}}
|
||||
<div class="item">
|
||||
{{:helper.link(value.Name, 'exclamation-circle', {'choice' : "Power Select", 'target' : value.ref}, null, 'pdalink fixedLeftWidest')}}
|
||||
</div>
|
||||
{{/for}}
|
||||
{{else}}
|
||||
<div class="item">
|
||||
<div class="itemLabelNarrow">
|
||||
<b>Total Power:</b>
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
<span class="average">{{:data.records.poweravail}} W</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="itemLabelNarrow">
|
||||
<b>Total Load:</b>
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
<span class="average">{{:data.records.powerload}} W</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="itemLabelNarrow">
|
||||
<b>Total Demand:</b>
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
<span class="average">{{:data.records.powerdemand}} W</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<table class="curvedEdges" style="text-align: center;"><tbody>
|
||||
<tr><th>Area</th><th>Equip.</th><th>Lighting</th><th>Environ.</th><th>Cell</th><th>Load</th></tr>
|
||||
{{for data.records.apcs}}
|
||||
<tr><td style="text-align: left; font-weight: bold;">{{:value.Name}}</td>
|
||||
{{:helper.string('<td width="55px" bgcolor="{0}">{1}</td>', value.Equipment == "On" || value.Equipment == "AOn" ? '#4f7529' : '#8f1414', value.Equipment)}}
|
||||
{{:helper.string('<td width="55px" bgcolor="{0}">{1}</td>', value.Lights == "On" || value.Lights == "AOn" ? '#4f7529' : '#8f1414', value.Lights)}}
|
||||
{{:helper.string('<td width="55px" bgcolor="{0}">{1}</td>', value.Environment == "On" || value.Environment == "AOn" ? '#4f7529' : '#8f1414', value.Environment)}}
|
||||
{{:helper.string('<td style="text-align: center;" width="65px" bgcolor="{0}">{1}{2}</td>', value.CellStatus == "F" ? '#4f7529' : value.CellStatus == "C" ? '#cd6500' : '#8f1414', value.CellStatus == "M" ? 'No Cell' : value.CellPct + '%', value.CellStatus == "M" ? '' : ' (' + value.CellStatus + ')')}}
|
||||
<td width="55px">{{:value.Load}}W</td>
|
||||
</tr>
|
||||
{{/for}}
|
||||
</tbody></table>
|
||||
</div>
|
||||
{{/if}}
|
||||
@@ -0,0 +1,59 @@
|
||||
{{if !data.beepsky.active}}
|
||||
{{if data.beepsky.count == 0}}
|
||||
<H1><span class="bad">No bots found.</span></H1>
|
||||
{{else}}
|
||||
<div class="item">
|
||||
Select a bot:
|
||||
</div>
|
||||
<br>
|
||||
{{for data.beepsky.bots}}
|
||||
<div class="item">
|
||||
{{:helper.link(value.Name, 'gear', {'radiomenu' : "1", 'op' : "control",'bot' : value.ref}, null, 'pdalink fixedLeftWidest')}} (Location: {{:value.Location}})
|
||||
</div>
|
||||
{{/for}}
|
||||
{{/if}}
|
||||
<br>
|
||||
{{:helper.link('Scan for Bots','rss', {'radiomenu' : "1", 'op' : "scanbots"}, null, 'pdalink fixedLeftWidest')}}
|
||||
{{else}}
|
||||
<H1><span class="average">{{:data.beepsky.active}}</span></H1>
|
||||
{{if data.beepsky.botstatus.mode == -1}}
|
||||
<H1><span class="bad">Waiting for response...</span></H1>
|
||||
{{else}}
|
||||
<H1><span class="good">Status:</span></H1>
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
<span class="good">Location:</span>
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
<span class="average">{{:data.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 data.beepsky.botstatus.mode ==0}}
|
||||
Ready
|
||||
{{else data.beepsky.botstatus.mode == 1}}
|
||||
Apprehending target
|
||||
{{else data.beepsky.botstatus.mode ==2 || data.beepsky.botstatus.mode == 3}}
|
||||
Arresting target
|
||||
{{else data.beepsky.botstatus.mode ==4}}
|
||||
Starting patrol
|
||||
{{else data.beepsky.botstatus.mode ==5}}
|
||||
On Patrol
|
||||
{{else data.beepsky.botstatus.mode ==6}}
|
||||
Responding to summons
|
||||
{{/if}}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
{{:helper.link('Stop Patrol', 'gear', {'radiomenu' : "1", 'op' : "stop"}, null, 'pdalink fixedLeftWide')}}
|
||||
{{:helper.link('Start Patrol', 'gear', {'radiomenu' : "1", 'op' : "go"}, null, 'pdalink fixedLeftWide')}}
|
||||
{{:helper.link('Summon Bot', 'gear', {'radiomenu' : "1", 'op' : "summon"}, null, 'pdalink fixedLeftWide')}}
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
@@ -0,0 +1,50 @@
|
||||
{{if !data.records}}
|
||||
<div class="item">
|
||||
<div class="itemLabel">Select a record:</div>
|
||||
</div>
|
||||
{{for data.recordsList}}
|
||||
<div class="item">
|
||||
{{:helper.link(value.Name, 'user', {'choice' : "Records", 'target' : value.ref}, null, 'pdalink fixedLeftWidest')}}
|
||||
</div>
|
||||
{{empty}}
|
||||
<div class="item">
|
||||
<span class="average">No records found.</span>
|
||||
</div>
|
||||
{{/for}}
|
||||
{{else}}
|
||||
<div class="statusDisplayRecords">
|
||||
<div class="item">
|
||||
<div class="itemContent" style="width: 100%;">
|
||||
{{if data.records.general}}
|
||||
<span class="good">Name: </span> <span class="average"> {{:data.records.general.name}}</span><br>
|
||||
<span class="good">Sex: </span> <span class="average">{{:data.records.general.sex}} </span><br>
|
||||
<span class="good">Species: </span> <span class="average">{{:data.records.general.species}} </span><br>
|
||||
<span class="good">Age: </span> <span class="average">{{:data.records.general.age}} </span><br>
|
||||
<span class="good">Rank: </span> <span class="average">{{:data.records.general.rank}} </span><br>
|
||||
<span class="good">Fingerprint: </span> <span class="average">{{:data.records.general.fingerprint}} </span><br>
|
||||
<span class="good">Physical Status: </span> <span class="average">{{:data.records.general.p_stat}} </span><br>
|
||||
<span class="good">Mental Status: </span> <span class="average">{{:data.records.general.m_stat}} </span><br><br>
|
||||
{{else}}
|
||||
<span class="bad">
|
||||
General Record Lost!<br><br>
|
||||
</span>
|
||||
{{/if}}
|
||||
{{if data.records.security}}
|
||||
<div class="item">
|
||||
<div class="itemLabel">Security Data:</div>
|
||||
</div>
|
||||
<span class="good">Criminal Status: </span><span class="average">{{:data.records.security.criminal}} </span><br><br>
|
||||
<span class="good">Minor Crimes: </span><span class="average">{{:data.records.security.mi_crim}} </span><br>
|
||||
<span class="good">Details: </span><span class="average">{{:data.records.security.mi_crim_d}} </span><br><br>
|
||||
<span class="good">Major Crimes: </span><span class="average">{{:data.records.security.ma_crim}} </span><br>
|
||||
<span class="good">Details: </span><span class="average">{{:data.records.security.ma_crim_d}} </span><br><br>
|
||||
<span class="good">Important Notes: </span><span class="average">{{:data.records.security.notes}} </span>
|
||||
{{else}}
|
||||
<span class="bad">
|
||||
Security Record Lost!<br><br>
|
||||
</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
@@ -0,0 +1,38 @@
|
||||
<!--
|
||||
Title: PDA Remote Signaller UI
|
||||
Used In File(s): \code\game\objects\items\devices\PDA\cart_apps.dm
|
||||
-->
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
<b>Frequency</b>:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{:data.signal_freq}}
|
||||
<br>
|
||||
|
||||
{{:helper.link('-1', null, {'choice' : "Signal Frequency", 'sfreq' : "-10"}, null, null)}}
|
||||
{{:helper.link('-.2', null, {'choice' : "Signal Frequency", 'sfreq' : "-2"}, null, null)}}
|
||||
|
||||
{{:helper.link('+.2', null, {'choice' : "Signal Frequency", 'sfreq' : "2"}, null, null)}}
|
||||
{{:helper.link('+1', null, {'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">
|
||||
{{:data.signal_code}}<br>
|
||||
</span>
|
||||
{{:helper.link('-5', null, {'choice' : "Signal Code", 'scode' : "-5"}, null, null)}}
|
||||
{{:helper.link('-1', null, {'choice' : "Signal Code", 'scode' : "-1"}, null, null)}}
|
||||
{{:helper.link('+1', null, {'choice' : "Signal Code", 'scode' : "1"}, null, null)}}
|
||||
{{:helper.link('+5', null, {'choice' : "Signal Code", 'scode' : "5"}, null, null)}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
{{:helper.link('Send Signal', 'exclamation-circle', {'choice' : "Send Signal"}, null, null)}}
|
||||
</div>
|
||||
@@ -0,0 +1,44 @@
|
||||
<!--
|
||||
Title: PDA Status Display UI
|
||||
Used In File(s): \code\game\objects\items\devices\PDA\cart_apps.dm
|
||||
-->
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
<b>Code</b>:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{:helper.link('Clear', 'trash', {'choice' : "Status", 'statdisp' : "blank"}, null, 'pdalink fixedLeftWide')}}
|
||||
{{:helper.link('Shuttle ETA', 'gear', {'cartmenu' : "1", 'choice' : "Status", 'statdisp' : "shuttle"}, null, 'pdalink fixedLeftWide')}}
|
||||
{{:helper.link('Message', 'gear', {'choice' : "Status", 'statdisp' : "message"}, null, 'pdalink fixedLeftWide')}}
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
<b>Message line 1</b>
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{:helper.link(data.records.message1 + ' (set)', 'pencil', {'choice' : "Status", 'statdisp' : "setmsg1"}, null, 'pdalink fixedLeftWide')}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
<b>Message line 2</b>
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{:helper.link(data.records.message2 + ' (set)', 'pencil', {'choice' : "Status", 'statdisp' : "setmsg2"}, null, 'pdalink fixedLeftWide')}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<br>
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
<b> ALERT!</b>:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{:helper.link('None', 'bell', {'choice' : "Status", 'statdisp' : "alert", 'alert' : "default"}, null, 'pdalink fixedLeftWide')}}
|
||||
{{:helper.link('Red Alert', 'bell', {'choice' : "Status", 'statdisp' : "alert", 'alert' : "redalert"}, null, 'pdalink fixedLeftWide')}}
|
||||
{{:helper.link('Lockdown', 'exclamation-circle', {'choice' : "Status", 'statdisp' : "alert", 'alert' : "lockdown"}, null, 'pdalink fixedLeftWide')}}
|
||||
{{:helper.link('Biohazard', 'exclamation-circle', {'choice' : "Status", 'statdisp' : "alert", 'alert' : "biohazard"}, null, 'pdalink fixedLeftWide')}}
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,39 @@
|
||||
<div class="item">
|
||||
<div class="itemLabelNarrow">
|
||||
Location:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
<span class="average">
|
||||
{{if data.supply.shuttle_moving}}
|
||||
Moving to {{:data.supply.shuttle_loc}}
|
||||
{{else}}
|
||||
Shuttle at {{:data.supply.shuttle_loc}}
|
||||
{{/if}}
|
||||
<br>
|
||||
{{:data.supply.shuttle_time}}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="statusDisplayRecords">
|
||||
<div class="item">
|
||||
<div class="itemContent" style="width: 100%;">
|
||||
<span class="good"><B>Current Approved Orders</B></span><br>
|
||||
{{if data.supply.approved_count == 0}}
|
||||
<span class="average pdanote">No current approved orders </span><br><br>
|
||||
{{else}}
|
||||
{{for data.supply.approved}}
|
||||
<span class="average">#{{:value.Number}} - {{:value.Name}} approved by {{:value.OrderedBy}}<br>{{if value.Comment != ""}} {{:value.Comment}} <br>{{/if}}<br></span>
|
||||
{{/for}}
|
||||
{{/if}}
|
||||
<br><br>
|
||||
<span class="good"><B>Current Requested Orders</B></span><br>
|
||||
{{if data.supply.requests_count == 0}}
|
||||
<span class="average pdanote">No current requested orders</span><br><br>
|
||||
{{else}}
|
||||
{{for data.supply.requests}}
|
||||
<span class="average">#{{:value.Number}} - {{:value.Name}} requested by {{:value.OrderedBy}}<br>{{if value.Comment != ""}} {{:value.Comment}} <br>{{/if}}<br></span>
|
||||
{{/for}}
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -31,6 +31,7 @@
|
||||
#include "code\__DEFINES\math.dm"
|
||||
#include "code\__DEFINES\misc.dm"
|
||||
#include "code\__DEFINES\mob.dm"
|
||||
#include "code\__DEFINES\pda.dm"
|
||||
#include "code\__DEFINES\preferences.dm"
|
||||
#include "code\__DEFINES\process_scheduler.dm"
|
||||
#include "code\__DEFINES\qdel.dm"
|
||||
@@ -672,10 +673,18 @@
|
||||
#include "code\game\objects\items\devices\uplinks.dm"
|
||||
#include "code\game\objects\items\devices\violin.dm"
|
||||
#include "code\game\objects\items\devices\whistle.dm"
|
||||
#include "code\game\objects\items\devices\PDA\ai.dm"
|
||||
#include "code\game\objects\items\devices\PDA\app.dm"
|
||||
#include "code\game\objects\items\devices\PDA\cart.dm"
|
||||
#include "code\game\objects\items\devices\PDA\cart_apps.dm"
|
||||
#include "code\game\objects\items\devices\PDA\chatroom.dm"
|
||||
#include "code\game\objects\items\devices\PDA\core_apps.dm"
|
||||
#include "code\game\objects\items\devices\PDA\messenger.dm"
|
||||
#include "code\game\objects\items\devices\PDA\messenger_plugins.dm"
|
||||
#include "code\game\objects\items\devices\PDA\PDA.dm"
|
||||
#include "code\game\objects\items\devices\PDA\pdas.dm"
|
||||
#include "code\game\objects\items\devices\PDA\radio.dm"
|
||||
#include "code\game\objects\items\devices\PDA\utilities.dm"
|
||||
#include "code\game\objects\items\devices\radio\beacon.dm"
|
||||
#include "code\game\objects\items\devices\radio\electropack.dm"
|
||||
#include "code\game\objects\items\devices\radio\encryptionkey.dm"
|
||||
|
||||
Reference in New Issue
Block a user