mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2026-01-04 14:33:30 +00:00
git-svn-id: http://tgstation13.googlecode.com/svn/trunk@2 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
445
code/WorkInProgress/pda2/base_os.dm
Normal file
445
code/WorkInProgress/pda2/base_os.dm
Normal file
@@ -0,0 +1,445 @@
|
||||
/datum/computer/file/pda_program/os
|
||||
proc
|
||||
receive_os_command(list/command_list)
|
||||
if((!src.holder) || (!src.master) || (!command_list) || !(command_list["command"]))
|
||||
return 1
|
||||
|
||||
if((!istype(holder)) || (!istype(master)))
|
||||
return 1
|
||||
|
||||
if(!(holder in src.master.contents))
|
||||
if(master.active_program == src)
|
||||
master.active_program = null
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
//Main os program: Provides old pda interface and four programs including file browser, notes, messenger, and atmos scan
|
||||
main_os
|
||||
name = "ThinkOS 7"
|
||||
size = 8.0
|
||||
var/mode = 0
|
||||
//Note vars
|
||||
var/note = "Congratulations, your station has chosen the Thinktronic 5150 Personal Data Assistant!"
|
||||
var/note_mode = 0 //0 For note editor, 1 for note browser
|
||||
var/datum/computer/file/text/note_file = null //If set, save to this file.
|
||||
//Messenger vars
|
||||
var/list/detected_pdas = list()
|
||||
var/message_on = 1
|
||||
var/message_silent = 0 //To beep or not to beep, that is the question
|
||||
var/message_mode = 0 //0 for pda list, 1 for messages
|
||||
var/message_tone = "beep" //Custom ringtone
|
||||
var/message_note = null //Current messages in memory (Store as separate file only later??)
|
||||
//File browser vars
|
||||
var/datum/computer/folder/browse_folder = null
|
||||
var/datum/computer/file/clipboard = null //Current file to copy
|
||||
|
||||
|
||||
|
||||
receive_os_command(list/command_list)
|
||||
if(..())
|
||||
return
|
||||
|
||||
//world << "[command_list["command"]]"
|
||||
return
|
||||
|
||||
return_text()
|
||||
if(..())
|
||||
return
|
||||
|
||||
var/dat = src.return_text_header()
|
||||
|
||||
switch(src.mode)
|
||||
if(0)
|
||||
dat += "<h2>PERSONAL DATA ASSISTANT</h2>"
|
||||
dat += "Owner: [src.master.owner]<br><br>"
|
||||
|
||||
dat += "<h4>General Functions</h4>"
|
||||
dat += "<ul>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];mode=1'>Notekeeper</a></li>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];mode=2'>Messenger</a></li>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];mode=3'>File Browser</a></li>"
|
||||
dat += "</ul>"
|
||||
|
||||
dat += "<h4>Utilities</h4>"
|
||||
dat += "<ul>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];mode=4'>Atmospheric Scan</a></li>"
|
||||
dat += "<li>Scanner: [src.master.scan_program ? "<a href='byond://?src=\ref[src];scanner=1'>[src.master.scan_program.name]</a>" : "None loaded"]</li>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];flight=1'>[src.master.fon ? "Disable" : "Enable"] Flashlight</a></li>"
|
||||
|
||||
dat += "</ul>"
|
||||
|
||||
if(1)
|
||||
//Note Program. Can save/load note files.
|
||||
dat += "<h4>Notekeeper V2.5</h4>"
|
||||
|
||||
if(!src.note_mode)
|
||||
dat += "<a href='byond://?src=\ref[src];input=note'>Edit</a>"
|
||||
dat += " | <a href='byond://?src=\ref[src];note_func=new'>New File</a>"
|
||||
dat += " | <a href='byond://?src=\ref[src];note_func=save'>Save</a>"
|
||||
dat += " | <a href='byond://?src=\ref[src];note_func=switchmenu'>Load</a><br>"
|
||||
|
||||
dat += src.note
|
||||
else
|
||||
dat += " <a href='byond://?src=\ref[src];note_func=switchmenu'>Back</a>"
|
||||
dat += " | \[[src.holding_folder.holder.file_amount - src.holding_folder.holder.file_used]\] Free<br>"
|
||||
dat += "<table cellspacing=5>"
|
||||
|
||||
for(var/datum/computer/file/text/T in src.holding_folder.contents)
|
||||
dat += "<tr><td><a href='byond://?src=\ref[src];target=\ref[T];note_func=load'>[T.name]</a></td>"
|
||||
dat += "<td>[T.extension]</td>"
|
||||
dat += "<td>Length: [T.data ? (length(T.data)) : "0"]</td></tr>"
|
||||
|
||||
dat += "</table>"
|
||||
|
||||
if(2)
|
||||
//Messenger. Uses Radio. Is a messenger.
|
||||
//TO-DO: ~file sharing~
|
||||
src.master.overlays = null //Remove existing alerts
|
||||
dat += "<h4>SpaceMessenger V4.0.5</h4>"
|
||||
|
||||
if (!src.message_mode)
|
||||
|
||||
dat += "<a href='byond://?src=\ref[src];message_func=ringer'>Ringer: [src.message_silent == 1 ? "Off" : "On"]</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];message_func=on'>Send / Receive: [src.message_on == 1 ? "On" : "Off"]</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];input=tone'>Set Ringtone</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];message_mode=1'>Messages</a><br>"
|
||||
|
||||
dat += "<font size=2><a href='byond://?src=\ref[src];message_func=scan'>Scan</a></font><br>"
|
||||
dat += "<b>Detected PDAs</b><br>"
|
||||
|
||||
dat += "<ul>"
|
||||
|
||||
var/count = 0
|
||||
|
||||
if (src.message_on)
|
||||
for (var/obj/item/device/pda2/P in src.detected_pdas)
|
||||
if (!P.owner)
|
||||
src.detected_pdas -= P
|
||||
continue
|
||||
else if (P == src) //I guess this can happen if somebody copies the system file.
|
||||
src.detected_pdas -= P
|
||||
continue
|
||||
|
||||
dat += "<li><a href='byond://?src=\ref[src];input=message;target=\ref[P]'>[P]</a>"
|
||||
|
||||
dat += "</li>"
|
||||
count++
|
||||
|
||||
dat += "</ul>"
|
||||
|
||||
if (count == 0)
|
||||
dat += "None detected.<br>"
|
||||
|
||||
else
|
||||
dat += "<a href='byond://?src=\ref[src];message_func=clear'>Clear</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];message_mode=0'>Back</a><br>"
|
||||
|
||||
dat += "<h4>Messages</h4>"
|
||||
|
||||
dat += src.message_note
|
||||
dat += "<br>"
|
||||
|
||||
if(3)
|
||||
//File Browser.
|
||||
//To-do(?): Setting "favorite" programs to access straight from main menu
|
||||
//Not sure how needed it is, not like they have to go through 500 subfolders or whatever
|
||||
if((!src.browse_folder) || !(src.browse_folder.holder in src.master))
|
||||
src.browse_folder = src.holding_folder
|
||||
|
||||
dat += " | <a href='byond://?src=\ref[src];target=\ref[src.browse_folder];browse_func=paste'>Paste</a>"
|
||||
dat += " | Drive: "
|
||||
dat += "\[<a href='byond://?src=\ref[src];browse_func=drive'>[src.browse_folder.holder == src.master.hd ? "MAIN" : "CART"]</a>\]<br>"
|
||||
|
||||
dat += "<b>Contents of [browse_folder] | Drive ID:\[[src.browse_folder.holder.title]]</b><br>"
|
||||
dat += "<b>Used: \[[src.browse_folder.holder.file_used]/[src.browse_folder.holder.file_amount]\]</b><hr>"
|
||||
|
||||
dat += "<table cellspacing=5>"
|
||||
for(var/datum/computer/file/F in browse_folder.contents)
|
||||
if(F == src)
|
||||
dat += "<tr><td>System</td><td>Size: [src.size]</td><td>SYSTEM</td></tr>"
|
||||
continue
|
||||
dat += "<tr><td><a href='byond://?src=\ref[src];target=\ref[F];browse_func=open'>[F.name]</a></td>"
|
||||
dat += "<td>Size: [F.size]</td>"
|
||||
|
||||
dat += "<td>[F.extension]</td>"
|
||||
|
||||
dat += "<td><a href='byond://?src=\ref[src];target=\ref[F];browse_func=delete'>Del</a></td>"
|
||||
dat += "<td><a href='byond://?src=\ref[src];target=\ref[F];input=rename'>Rename</a></td>"
|
||||
|
||||
dat += "<td><a href='byond://?src=\ref[src];target=\ref[F];browse_func=copy'>Copy</a></td>"
|
||||
|
||||
dat += "</tr>"
|
||||
|
||||
dat += "</table>"
|
||||
|
||||
if(4)
|
||||
//Atmos Scanner
|
||||
dat += "<h4>Atmospheric Readings</h4>"
|
||||
|
||||
var/turf/T = get_turf_or_move(get_turf(src.master))
|
||||
if (isnull(T))
|
||||
dat += "Unable to obtain a reading.<br>"
|
||||
else
|
||||
var/datum/gas_mixture/environment = T.return_air()
|
||||
|
||||
var/pressure = environment.return_pressure()
|
||||
var/total_moles = environment.total_moles()
|
||||
|
||||
dat += "Air Pressure: [round(pressure,0.1)] kPa<br>"
|
||||
|
||||
if (total_moles)
|
||||
var/o2_level = environment.oxygen/total_moles
|
||||
var/n2_level = environment.nitrogen/total_moles
|
||||
var/co2_level = environment.carbon_dioxide/total_moles
|
||||
var/plasma_level = environment.toxins/total_moles
|
||||
var/unknown_level = 1-(o2_level+n2_level+co2_level+plasma_level)
|
||||
|
||||
dat += "Nitrogen: [round(n2_level*100)]%<br>"
|
||||
|
||||
dat += "Oxygen: [round(o2_level*100)]%<br>"
|
||||
|
||||
dat += "Carbon Dioxide: [round(co2_level*100)]%<br>"
|
||||
|
||||
dat += "Plasma: [round(plasma_level*100)]%<br>"
|
||||
|
||||
if(unknown_level > 0.01)
|
||||
dat += "OTHER: [round(unknown_level)]%<br>"
|
||||
|
||||
dat += "Temperature: [round(environment.temperature-T0C)]°C<br>"
|
||||
|
||||
dat += "<br>"
|
||||
|
||||
return dat
|
||||
|
||||
Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
|
||||
if(href_list["mode"])
|
||||
var/newmode = text2num(href_list["mode"])
|
||||
src.mode = max(newmode, 0)
|
||||
|
||||
else if(href_list["flight"])
|
||||
src.master.toggle_light()
|
||||
|
||||
else if(href_list["scanner"])
|
||||
if(src.master.scan_program)
|
||||
src.master.scan_program = null
|
||||
|
||||
else if(href_list["input"])
|
||||
switch(href_list["input"])
|
||||
if("tone")
|
||||
var/t = input(usr, "Please enter new ringtone", src.name, src.message_tone) as text
|
||||
if (!t)
|
||||
return
|
||||
|
||||
if (!src.master || !in_range(src.master, usr) && src.master.loc != usr)
|
||||
return
|
||||
|
||||
if(!(src.holder in src.master))
|
||||
return
|
||||
|
||||
t = copytext(sanitize(t), 1, 20)
|
||||
src.message_tone = t
|
||||
|
||||
if("note")
|
||||
var/t = input(usr, "Please enter note", src.name, src.note) as message
|
||||
if (!t)
|
||||
return
|
||||
|
||||
if (!src.master || !in_range(src.master, usr) && src.master.loc != usr)
|
||||
return
|
||||
|
||||
if(!(src.holder in src.master))
|
||||
return
|
||||
|
||||
t = copytext(adminscrub(t), 1, MAX_MESSAGE_LEN)
|
||||
src.note = t
|
||||
|
||||
|
||||
if("message")
|
||||
var/obj/item/device/pda2/P = locate(href_list["target"])
|
||||
if(!P || !istype(P))
|
||||
return
|
||||
|
||||
var/t = input(usr, "Please enter message", P.name, null) as text
|
||||
if (!t)
|
||||
return
|
||||
|
||||
if (!src.master || !in_range(src.master, usr) && src.master.loc != usr)
|
||||
return
|
||||
|
||||
if(!(src.holder in src.master))
|
||||
return
|
||||
|
||||
|
||||
var/datum/signal/signal = new
|
||||
signal.data["command"] = "text message"
|
||||
signal.data["message"] = t
|
||||
signal.data["sender"] = src.master.owner
|
||||
signal.data["tag"] = "\ref[P]"
|
||||
src.post_signal(signal)
|
||||
src.message_note += "<i><b>→ To [P.owner]:</b></i><br>[t]<br>"
|
||||
|
||||
if("rename")
|
||||
var/datum/computer/file/F = locate(href_list["target"])
|
||||
if(!F || !istype(F))
|
||||
return
|
||||
|
||||
var/t = input(usr, "Please enter new name", src.name, F.name) as text
|
||||
t = copytext(sanitize(t), 1, 16)
|
||||
if (!t)
|
||||
return
|
||||
if (!in_range(src.master, usr) || !(F.holder in src.master))
|
||||
return
|
||||
if(F.holder.read_only)
|
||||
return
|
||||
F.name = capitalize(lowertext(t))
|
||||
|
||||
|
||||
else if(href_list["message_func"]) //Messenger specific topic junk
|
||||
switch(href_list["message_func"])
|
||||
if("ringer")
|
||||
src.message_silent = !src.message_silent
|
||||
if("on")
|
||||
src.message_on = !src.message_on
|
||||
if("clear")
|
||||
src.message_note = null
|
||||
if("scan")
|
||||
if(src.message_on)
|
||||
src.detected_pdas = list()
|
||||
var/datum/signal/signal = new
|
||||
signal.data["command"] = "report pda"
|
||||
src.post_signal(signal)
|
||||
|
||||
else if(href_list["note_func"]) //Note program specific topic junk
|
||||
switch(href_list["note_func"])
|
||||
if("new")
|
||||
src.note_file = null
|
||||
src.note = null
|
||||
if("save")
|
||||
if(src.note_file && src.note_file.holder in src.master)
|
||||
src.note_file.data = src.note
|
||||
else
|
||||
var/datum/computer/file/text/F = new /datum/computer/file/text
|
||||
if(!src.holding_folder.add_file(F))
|
||||
del(F)
|
||||
else
|
||||
src.note_file = F
|
||||
F.data = src.note
|
||||
|
||||
if("load")
|
||||
var/datum/computer/file/text/T = locate(href_list["target"])
|
||||
if(!T || !istype(T))
|
||||
return
|
||||
|
||||
src.note_file = T
|
||||
src.note = note_file.data
|
||||
src.note_mode = 0
|
||||
|
||||
if("switchmenu")
|
||||
src.note_mode = !src.note_mode
|
||||
|
||||
else if(href_list["browse_func"]) //File browser specific topic junk
|
||||
var/datum/computer/target = locate(href_list["target"])
|
||||
switch(href_list["browse_func"])
|
||||
if("drive")
|
||||
if(src.browse_folder.holder == src.master.hd && src.master.cartridge && (src.master.cartridge.root))
|
||||
src.browse_folder = src.master.cartridge.root
|
||||
else
|
||||
src.browse_folder = src.holding_folder
|
||||
if("open")
|
||||
if(!target || !istype(target))
|
||||
return
|
||||
if(istype(target, /datum/computer/file/pda_program))
|
||||
if(istype(target,/datum/computer/file/pda_program/os) && (src.master.host_program))
|
||||
return
|
||||
else
|
||||
src.master.run_program(target)
|
||||
src.master.updateSelfDialog()
|
||||
return
|
||||
|
||||
if("delete")
|
||||
if(!target || !istype(target))
|
||||
return
|
||||
src.master.delete_file(target)
|
||||
|
||||
if("copy")
|
||||
if(istype(target,/datum/computer/file) && (!target.holder || (target.holder in src.master.contents)))
|
||||
src.clipboard = target
|
||||
|
||||
if("paste")
|
||||
if(istype(target,/datum/computer/folder))
|
||||
if(!src.clipboard || !src.clipboard.holder || !(src.clipboard.holder in src.master.contents))
|
||||
return
|
||||
|
||||
if(!istype(src.clipboard))
|
||||
return
|
||||
|
||||
src.clipboard.copy_file_to_folder(target)
|
||||
|
||||
|
||||
else if(href_list["message_mode"])
|
||||
var/newmode = text2num(href_list["message_mode"])
|
||||
src.message_mode = max(newmode, 0)
|
||||
|
||||
src.master.add_fingerprint(usr)
|
||||
src.master.updateSelfDialog()
|
||||
return
|
||||
|
||||
receive_signal(datum/signal/signal)
|
||||
if(..())
|
||||
return
|
||||
|
||||
switch(signal.data["command"])
|
||||
if("text message")
|
||||
if(!message_on || !signal.data["message"])
|
||||
return
|
||||
var/sender = signal.data["sender"]
|
||||
if(!sender)
|
||||
sender = "!Unknown!"
|
||||
|
||||
src.message_note += "<i><b>← From <a href='byond://?src=\ref[src];input=message;target=\ref[signal.source]'>[sender]</a>:</b></i><br>[signal.data["message"]]<br>"
|
||||
var/alert_beep = null //Don't beep if set to silent.
|
||||
if(!src.message_silent)
|
||||
alert_beep = src.message_tone
|
||||
|
||||
src.master.display_alert(alert_beep)
|
||||
src.master.updateSelfDialog()
|
||||
|
||||
if("report pda")
|
||||
if(!message_on)
|
||||
return
|
||||
|
||||
var/datum/signal/newsignal = new
|
||||
newsignal.data["command"] = "reporting pda"
|
||||
newsignal.data["tag"] = "\ref[signal.source]"
|
||||
src.post_signal(newsignal)
|
||||
|
||||
if("reporting pda")
|
||||
if(!detected_pdas)
|
||||
detected_pdas = new()
|
||||
|
||||
if(!(signal.source in detected_pdas))
|
||||
detected_pdas += signal.source
|
||||
|
||||
src.master.updateSelfDialog()
|
||||
|
||||
return
|
||||
|
||||
return_text_header()
|
||||
if(!src.master)
|
||||
return
|
||||
|
||||
var/dat
|
||||
|
||||
if(src.mode)
|
||||
dat += " | <a href='byond://?src=\ref[src];mode=0'>Main Menu</a>"
|
||||
|
||||
else if (!isnull(src.master.cartridge))
|
||||
dat += " | <a href='byond://?src=\ref[src.master];eject_cart=1'>Eject [src.master.cartridge]</a>"
|
||||
|
||||
dat += " | <a href='byond://?src=\ref[src.master];refresh=1'>Refresh</a>"
|
||||
|
||||
return dat
|
||||
185
code/WorkInProgress/pda2/base_program.dm
Normal file
185
code/WorkInProgress/pda2/base_program.dm
Normal file
@@ -0,0 +1,185 @@
|
||||
//Eventual plan: Convert all datum/data to datum/computer/file
|
||||
/datum/computer/file/text
|
||||
name = "text"
|
||||
extension = "TEXT"
|
||||
size = 2.0
|
||||
var/data = null
|
||||
|
||||
/datum/computer/file/record
|
||||
name = "record"
|
||||
extension = "REC"
|
||||
|
||||
var/list/fields = list( )
|
||||
|
||||
|
||||
//base pda program
|
||||
|
||||
/datum/computer/file/pda_program
|
||||
name = "blank program"
|
||||
extension = "PPROG"
|
||||
var/obj/item/device/pda2/master = null
|
||||
var/id_tag = null
|
||||
|
||||
os
|
||||
name = "blank system program"
|
||||
extension = "PSYS"
|
||||
|
||||
scan
|
||||
name = "blank scan program"
|
||||
extension = "PSCAN"
|
||||
|
||||
New(obj/holding as obj)
|
||||
if(holding)
|
||||
src.holder = holding
|
||||
|
||||
if(istype(src.holder.loc,/obj/item/device/pda2))
|
||||
src.master = src.holder.loc
|
||||
|
||||
proc
|
||||
return_text()
|
||||
if((!src.holder) || (!src.master))
|
||||
return 1
|
||||
|
||||
if((!istype(holder)) || (!istype(master)))
|
||||
return 1
|
||||
|
||||
if(!(holder in src.master.contents))
|
||||
//world << "Holder [holder] not in [master] of prg:[src]"
|
||||
if(master.active_program == src)
|
||||
master.active_program = null
|
||||
return 1
|
||||
|
||||
if(!src.holder.root)
|
||||
src.holder.root = new /datum/computer/folder
|
||||
src.holder.root.holder = src
|
||||
src.holder.root.name = "root"
|
||||
|
||||
return 0
|
||||
|
||||
process() //This isn't actually used at the moment
|
||||
if((!src.holder) || (!src.master))
|
||||
return 1
|
||||
|
||||
if((!istype(holder)) || (!istype(master)))
|
||||
return 1
|
||||
|
||||
if(!(holder in src.master.contents))
|
||||
if(master.active_program == src)
|
||||
master.active_program = null
|
||||
return 1
|
||||
|
||||
if(!src.holder.root)
|
||||
src.holder.root = new /datum/computer/folder
|
||||
src.holder.root.holder = src
|
||||
src.holder.root.name = "root"
|
||||
|
||||
return 0
|
||||
|
||||
//maybe remove this, I haven't found a good use for it yet
|
||||
send_os_command(list/command_list)
|
||||
if(!src.master || !src.holder || src.master.host_program || !command_list)
|
||||
return 1
|
||||
|
||||
if(!istype(src.master.host_program) || src.master.host_program == src)
|
||||
return 1
|
||||
|
||||
src.master.host_program.receive_os_command()
|
||||
|
||||
return 0
|
||||
|
||||
return_text_header()
|
||||
if(!src.master || !src.holder)
|
||||
return
|
||||
|
||||
var/dat = " | <a href='byond://?src=\ref[src];quit=1'>Main Menu</a>"
|
||||
dat += " | <a href='byond://?src=\ref[src.master];refresh=1'>Refresh</a>"
|
||||
|
||||
return dat
|
||||
|
||||
post_signal(datum/signal/signal, newfreq)
|
||||
if(master)
|
||||
master.post_signal(signal, newfreq)
|
||||
else
|
||||
del(signal)
|
||||
|
||||
transfer_holder(obj/item/weapon/disk/data/newholder,datum/computer/folder/newfolder)
|
||||
|
||||
if((newholder.file_used + src.size) > newholder.file_amount)
|
||||
return 0
|
||||
|
||||
if(!newholder.root)
|
||||
newholder.root = new /datum/computer/folder
|
||||
newholder.root.holder = newholder
|
||||
newholder.root.name = "root"
|
||||
|
||||
if(!newfolder)
|
||||
newfolder = newholder.root
|
||||
|
||||
if((src.holder && src.holder.read_only) || newholder.read_only)
|
||||
return 0
|
||||
|
||||
if((src.holder) && (src.holder.root))
|
||||
src.holder.root.remove_file(src)
|
||||
|
||||
newfolder.add_file(src)
|
||||
|
||||
if(istype(newholder.loc,/obj/item/device/pda2))
|
||||
src.master = newholder.loc
|
||||
|
||||
//world << "Setting [src.holder] to [newholder]"
|
||||
src.holder = newholder
|
||||
return 1
|
||||
|
||||
|
||||
receive_signal(datum/signal/signal)
|
||||
if((!src.holder) || (!src.master))
|
||||
return 1
|
||||
|
||||
if((!istype(holder)) || (!istype(master)))
|
||||
return 1
|
||||
|
||||
if(!(holder in src.master.contents))
|
||||
if(master.active_program == src)
|
||||
master.active_program = null
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
Topic(href, href_list)
|
||||
if((!src.holder) || (!src.master))
|
||||
return 1
|
||||
|
||||
if((!istype(holder)) || (!istype(master)))
|
||||
return 1
|
||||
|
||||
if(src.master.active_program != src)
|
||||
return 1
|
||||
|
||||
if ((!usr.contents.Find(src.master) && (!in_range(src.master, usr) || !istype(src.master.loc, /turf))) && (!istype(usr, /mob/living/silicon)))
|
||||
return 1
|
||||
|
||||
if(!(holder in src.master.contents))
|
||||
if(master.active_program == src)
|
||||
master.active_program = null
|
||||
return 1
|
||||
|
||||
usr.machine = src.master
|
||||
|
||||
if (href_list["close"])
|
||||
usr.machine = null
|
||||
usr << browse(null, "window=pda2")
|
||||
return 0
|
||||
|
||||
if (href_list["quit"])
|
||||
// src.master.processing_programs.Remove(src)
|
||||
if(src.master.host_program && src.master.host_program.holder && (src.master.host_program.holder in src.master.contents))
|
||||
src.master.run_program(src.master.host_program)
|
||||
src.master.updateSelfDialog()
|
||||
return 1
|
||||
else
|
||||
src.master.active_program = null
|
||||
src.master.updateSelfDialog()
|
||||
return 1
|
||||
|
||||
return 0
|
||||
297
code/WorkInProgress/pda2/pda2.dm
Normal file
297
code/WorkInProgress/pda2/pda2.dm
Normal file
@@ -0,0 +1,297 @@
|
||||
//The advanced pea-green monochrome lcd of tomorrow.
|
||||
|
||||
|
||||
//TO-DO: rearrange all this disk/data stuff so that fixed disks are the parent type
|
||||
//because otherwise you have carts going into floppy drives and it's ALL MAD
|
||||
/obj/item/weapon/disk/data/cartridge
|
||||
name = "Cart 2.0"
|
||||
desc = "A data cartridge for portable microcomputers."
|
||||
icon = 'pda.dmi'
|
||||
icon_state = "cart"
|
||||
item_state = "electronic"
|
||||
file_amount = 80.0
|
||||
title = "ROM Cart"
|
||||
|
||||
pda2test
|
||||
name = "Test Cart"
|
||||
New()
|
||||
..()
|
||||
src.root.add_file( new /datum/computer/file/computer_program/arcade(src))
|
||||
src.root.add_file( new /datum/computer/file/pda_program/manifest(src))
|
||||
src.root.add_file( new /datum/computer/file/pda_program/status_display(src))
|
||||
src.root.add_file( new /datum/computer/file/pda_program/signaler(src))
|
||||
src.root.add_file( new /datum/computer/file/pda_program/qm_records(src))
|
||||
src.root.add_file( new /datum/computer/file/pda_program/scan/health_scan(src))
|
||||
src.root.add_file( new /datum/computer/file/pda_program/records/security(src))
|
||||
src.root.add_file( new /datum/computer/file/pda_program/records/medical(src))
|
||||
src.read_only = 1
|
||||
|
||||
|
||||
/obj/item/device/pda2
|
||||
name = "PDA"
|
||||
desc = "A portable microcomputer by Thinktronic Systems, LTD. Functionality determined by an EEPROM cartridge."
|
||||
icon = 'pda.dmi'
|
||||
icon_state = "pda"
|
||||
item_state = "electronic"
|
||||
w_class = 2.0
|
||||
flags = FPRINT | TABLEPASS | ONBELT
|
||||
|
||||
var/owner = null
|
||||
var/default_cartridge = null // Access level defined by cartridge
|
||||
var/obj/item/weapon/disk/data/cartridge/cartridge = null //current cartridge
|
||||
var/datum/computer/file/pda_program/active_program = null
|
||||
var/datum/computer/file/pda_program/os/host_program = null
|
||||
var/datum/computer/file/pda_program/scan/scan_program = null
|
||||
var/obj/item/weapon/disk/data/fixed_disk/hd = null
|
||||
var/fon = 0 //Is the flashlight function on?
|
||||
var/f_lum = 3 //Luminosity for the flashlight function
|
||||
// var/datum/data/record/active1 = null //General
|
||||
// var/datum/data/record/active2 = null //Medical
|
||||
// var/datum/data/record/active3 = null //Security
|
||||
// var/obj/item/weapon/integrated_uplink/uplink = null //Maybe replace uplink with some remote ~syndicate~ server
|
||||
var/frequency = 1149
|
||||
var/datum/radio_frequency/radio_connection
|
||||
|
||||
var/setup_default_cartridge = null //Cartridge contains job-specific programs
|
||||
var/setup_drive_size = 24.0 //PDAs don't have much work room at all, really.
|
||||
var/setup_system_os_path = /datum/computer/file/pda_program/os/main_os //Needs an operating system to...operate!!
|
||||
|
||||
|
||||
/obj/item/device/pda2/pickup(mob/user)
|
||||
if (src.fon)
|
||||
src.sd_SetLuminosity(0)
|
||||
user.sd_SetLuminosity(user.luminosity + src.f_lum)
|
||||
|
||||
/obj/item/device/pda2/dropped(mob/user)
|
||||
if (src.fon)
|
||||
user.sd_SetLuminosity(user.luminosity - src.f_lum)
|
||||
src.sd_SetLuminosity(src.f_lum)
|
||||
|
||||
/obj/item/device/pda2/New()
|
||||
..()
|
||||
spawn(5)
|
||||
src.hd = new /obj/item/weapon/disk/data/fixed_disk(src)
|
||||
src.hd.file_amount = src.setup_drive_size
|
||||
src.hd.name = "Minidrive"
|
||||
src.hd.title = "Minidrive"
|
||||
|
||||
if(src.setup_system_os_path)
|
||||
src.host_program = new src.setup_system_os_path
|
||||
|
||||
src.hd.file_amount = max(src.hd.file_amount, src.host_program.size)
|
||||
|
||||
src.host_program.transfer_holder(src.hd)
|
||||
|
||||
if(radio_controller)
|
||||
radio_controller.add_object(src, "[frequency]")
|
||||
|
||||
|
||||
if (src.default_cartridge)
|
||||
src.cartridge = new src.setup_default_cartridge(src)
|
||||
// if(src.owner)
|
||||
// processing_items.Add(src)
|
||||
|
||||
/obj/item/device/pda2/attack_self(mob/user as mob)
|
||||
user.machine = src
|
||||
|
||||
var/dat = "<html><head><title>Personal Data Assistant</title></head><body>"
|
||||
|
||||
dat += "<a href='byond://?src=\ref[src];close=1'>Close</a>"
|
||||
|
||||
if (!src.owner)
|
||||
if(src.cartridge)
|
||||
dat += " | <a href='byond://?src=\ref[src];eject_cart=1'>Eject [src.cartridge]</a>"
|
||||
dat += "<br>Warning: No owner information entered. Please swipe card.<br><br>"
|
||||
dat += "<a href='byond://?src=\ref[src];refresh=1'>Retry</a>"
|
||||
else
|
||||
if(src.active_program)
|
||||
dat += src.active_program.return_text()
|
||||
else
|
||||
if(src.host_program)
|
||||
src.run_program(src.host_program)
|
||||
dat += src.active_program.return_text()
|
||||
else
|
||||
if(src.cartridge)
|
||||
dat += " | <a href='byond://?src=\ref[src];eject_cart=1'>Eject [src.cartridge]</a><br>"
|
||||
dat += "<center><font color=red>Fatal Error 0x17<br>"
|
||||
dat += "No System Software Loaded</font></center>"
|
||||
//To-do: System recovery shit (maybe have a dedicated computer for this kind of thing)
|
||||
|
||||
|
||||
user << browse(dat,"window=pda2")
|
||||
onclose(user,"pda2")
|
||||
return
|
||||
|
||||
/obj/item/device/pda2/Topic(href, href_list)
|
||||
..()
|
||||
|
||||
if (usr.contents.Find(src) || usr.contents.Find(src.master) || (istype(src.loc, /turf) && get_dist(src, usr) <= 1))
|
||||
if (usr.stat || usr.restrained())
|
||||
return
|
||||
|
||||
src.add_fingerprint(usr)
|
||||
usr.machine = src
|
||||
|
||||
|
||||
if(href_list["return_to_host"])
|
||||
if(src.host_program)
|
||||
src.active_program = src.host_program
|
||||
src.host_program = null
|
||||
|
||||
else if (href_list["eject_cart"])
|
||||
src.eject_cartridge()
|
||||
|
||||
else if (href_list["refresh"])
|
||||
src.updateSelfDialog()
|
||||
|
||||
else if (href_list["close"])
|
||||
usr << browse(null, "window=pda2")
|
||||
usr.machine = null
|
||||
|
||||
src.updateSelfDialog()
|
||||
return
|
||||
|
||||
/obj/item/device/pda2/attackby(obj/item/weapon/C as obj, mob/user as mob)
|
||||
if (istype(C, /obj/item/weapon/disk/data/cartridge) && isnull(src.cartridge))
|
||||
user.drop_item()
|
||||
C.loc = src
|
||||
user << "\blue You insert [C] into [src]."
|
||||
src.cartridge = C
|
||||
src.updateSelfDialog()
|
||||
|
||||
else if (istype(C, /obj/item/weapon/card/id) && !src.owner && C:registered)
|
||||
src.owner = C:registered
|
||||
src.name = "PDA-[src.owner]"
|
||||
user << "\blue Card scanned."
|
||||
src.updateSelfDialog()
|
||||
|
||||
/obj/item/device/pda2/receive_signal(datum/signal/signal)
|
||||
if(!signal || signal.encryption || !src.owner) return
|
||||
|
||||
if(signal.data["tag"] && signal.data["tag"] != "\ref[src]") return
|
||||
|
||||
if(src.host_program)
|
||||
src.host_program.receive_signal(signal)
|
||||
|
||||
if(src.active_program && (src.active_program != src.host_program))
|
||||
src.host_program.receive_signal(signal)
|
||||
|
||||
return
|
||||
|
||||
/obj/item/device/pda2/attack(mob/M as mob, mob/user as mob)
|
||||
if(src.scan_program)
|
||||
return
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/device/pda2/afterattack(atom/A as mob|obj|turf|area, mob/user as mob)
|
||||
var/scan_dat = null
|
||||
if(src.scan_program && istype(src.scan_program))
|
||||
scan_dat = src.scan_program.scan_atom(A)
|
||||
|
||||
if(scan_dat)
|
||||
A.visible_message("\red [user] has scanned [A]!")
|
||||
user.show_message(scan_dat, 1)
|
||||
|
||||
return
|
||||
|
||||
|
||||
/obj/item/device/pda2/proc
|
||||
|
||||
post_signal(datum/signal/signal,var/newfreq)
|
||||
if(!signal)
|
||||
return
|
||||
var/freq = newfreq
|
||||
if(!freq)
|
||||
freq = src.frequency
|
||||
|
||||
signal.source = src
|
||||
|
||||
var/datum/radio_frequency/frequency = radio_controller.return_frequency("[freq]")
|
||||
|
||||
signal.transmission_method = TRANSMISSION_RADIO
|
||||
if(frequency)
|
||||
return frequency.post_signal(src, signal)
|
||||
else
|
||||
del(signal)
|
||||
|
||||
eject_cartridge()
|
||||
if(src.cartridge)
|
||||
var/turf/T = get_turf(src)
|
||||
|
||||
if(src.active_program && (src.active_program.holder == src.cartridge))
|
||||
src.active_program = null
|
||||
|
||||
if(src.host_program && (src.host_program.holder == src.cartridge))
|
||||
src.host_program = null
|
||||
|
||||
if(src.scan_program && (src.scan_program.holder == src.cartridge))
|
||||
src.scan_program = null
|
||||
|
||||
src.cartridge.loc = T
|
||||
src.cartridge = null
|
||||
|
||||
return
|
||||
|
||||
//Toggle the built-in flashlight
|
||||
toggle_light()
|
||||
src.fon = (!src.fon)
|
||||
|
||||
if (ismob(src.loc))
|
||||
if (src.fon)
|
||||
src.loc.sd_SetLuminosity(src.loc.luminosity + src.f_lum)
|
||||
else
|
||||
src.loc.sd_SetLuminosity(src.loc.luminosity - src.f_lum)
|
||||
else
|
||||
src.sd_SetLuminosity(src.fon * src.f_lum)
|
||||
|
||||
src.updateSelfDialog()
|
||||
|
||||
display_alert(var/alert_message) //Add alert overlay and beep
|
||||
if (alert_message)
|
||||
playsound(src.loc, 'twobeep.ogg', 50, 1)
|
||||
for (var/mob/O in hearers(3, src.loc))
|
||||
O.show_message(text("\icon[src] *[alert_message]*"))
|
||||
|
||||
src.overlays = null
|
||||
src.overlays += image('pda.dmi', "pda-r")
|
||||
return
|
||||
|
||||
run_program(datum/computer/file/pda_program/program)
|
||||
if((!program) || (!program.holder))
|
||||
return 0
|
||||
|
||||
if(!(program.holder in src))
|
||||
// world << "Not in src"
|
||||
program = new program.type
|
||||
program.transfer_holder(src.hd)
|
||||
|
||||
if(program.master != src)
|
||||
program.master = src
|
||||
|
||||
if(!src.host_program && istype(program, /datum/computer/file/pda_program/os))
|
||||
src.host_program = program
|
||||
|
||||
if(istype(program, /datum/computer/file/pda_program/scan))
|
||||
if(program == src.scan_program)
|
||||
src.scan_program = null
|
||||
else
|
||||
src.scan_program = program
|
||||
return 1
|
||||
|
||||
src.active_program = program
|
||||
return 1
|
||||
|
||||
delete_file(datum/computer/file/file)
|
||||
//world << "Deleting [file]..."
|
||||
if((!file) || (!file.holder) || (file.holder.read_only))
|
||||
//world << "Cannot delete :("
|
||||
return 0
|
||||
|
||||
//Don't delete the running program you jerk
|
||||
if(src.active_program == file || src.host_program == file)
|
||||
src.active_program = null
|
||||
|
||||
//world << "Now calling del on [file]..."
|
||||
del(file)
|
||||
return 1
|
||||
181
code/WorkInProgress/pda2/record_progs.dm
Normal file
181
code/WorkInProgress/pda2/record_progs.dm
Normal file
@@ -0,0 +1,181 @@
|
||||
//CONTENTS:
|
||||
//Generic records
|
||||
//Security records
|
||||
//Medical records
|
||||
|
||||
|
||||
/datum/computer/file/pda_program/records
|
||||
var/mode = 0
|
||||
var/datum/data/record/active1 = null //General
|
||||
var/datum/data/record/active2 = null //Security/Medical/Whatever
|
||||
|
||||
//To-do: editing arrest status/etc from pda.
|
||||
/datum/computer/file/pda_program/records/security
|
||||
name = "Security Records"
|
||||
size = 12.0
|
||||
|
||||
return_text()
|
||||
if(..())
|
||||
return
|
||||
|
||||
var/dat = src.return_text_header()
|
||||
|
||||
switch(src.mode)
|
||||
if(0)
|
||||
dat += "<h4>Security Record List</h4>"
|
||||
|
||||
for (var/datum/data/record/R in data_core.general)
|
||||
dat += "<a href='byond://?src=\ref[src];select_rec=\ref[R]'>[R.fields["id"]]: [R.fields["name"]]<br>"
|
||||
|
||||
dat += "<br>"
|
||||
|
||||
if(1)
|
||||
|
||||
dat += "<h4>Security Record</h4>"
|
||||
|
||||
dat += "<a href='byond://?src=\ref[src];mode=0'>Back</a><br>"
|
||||
|
||||
if (istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1))
|
||||
dat += "Name: [src.active1.fields["name"]] ID: [src.active1.fields["id"]]<br>"
|
||||
dat += "Sex: [src.active1.fields["sex"]]<br>"
|
||||
dat += "Age: [src.active1.fields["age"]]<br>"
|
||||
dat += "Fingerprint: [src.active1.fields["fingerprint"]]<br>"
|
||||
dat += "Physical Status: [src.active1.fields["p_stat"]]<br>"
|
||||
dat += "Mental Status: [src.active1.fields["m_stat"]]<br>"
|
||||
else
|
||||
dat += "<b>Record Lost!</b><br>"
|
||||
|
||||
dat += "<br>"
|
||||
|
||||
dat += "<h4>Security Data</h4>"
|
||||
if (istype(src.active2, /datum/data/record) && data_core.security.Find(src.active2))
|
||||
dat += "Criminal Status: [src.active2.fields["criminal"]]<br>"
|
||||
|
||||
dat += "Minor Crimes: [src.active2.fields["mi_crim"]]<br>"
|
||||
dat += "Details: [src.active2.fields["mi_crim"]]<br><br>"
|
||||
|
||||
dat += "Major Crimes: [src.active2.fields["ma_crim"]]<br>"
|
||||
dat += "Details: [src.active2.fields["ma_crim_d"]]<br><br>"
|
||||
|
||||
dat += "Important Notes:<br>"
|
||||
dat += "[src.active2.fields["notes"]]"
|
||||
else
|
||||
dat += "<b>Record Lost!</b><br>"
|
||||
|
||||
dat += "<br>"
|
||||
|
||||
return dat
|
||||
|
||||
Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
|
||||
if(href_list["mode"])
|
||||
var/newmode = text2num(href_list["mode"])
|
||||
src.mode = max(newmode, 0)
|
||||
|
||||
else if(href_list["select_rec"])
|
||||
var/datum/data/record/R = locate(href_list["select_rec"])
|
||||
var/datum/data/record/S = locate(href_list["select_rec"])
|
||||
|
||||
if (data_core.general.Find(R))
|
||||
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
|
||||
|
||||
src.active1 = R
|
||||
src.active2 = S
|
||||
|
||||
src.mode = 1
|
||||
|
||||
src.master.add_fingerprint(usr)
|
||||
src.master.updateSelfDialog()
|
||||
return
|
||||
|
||||
/datum/computer/file/pda_program/records/medical
|
||||
name = "Medical Records"
|
||||
size = 8.0
|
||||
|
||||
return_text()
|
||||
if(..())
|
||||
return
|
||||
|
||||
var/dat = src.return_text_header()
|
||||
|
||||
switch(src.mode)
|
||||
if(0)
|
||||
|
||||
dat += "<h4>Medical Record List</h4>"
|
||||
for (var/datum/data/record/R in data_core.general)
|
||||
dat += "<a href='byond://?src=\ref[src];select_rec=\ref[R]'>[R.fields["id"]]: [R.fields["name"]]<br>"
|
||||
dat += "<br>"
|
||||
|
||||
if(1)
|
||||
|
||||
dat += "<h4>Medical Record</h4>"
|
||||
|
||||
dat += "<a href='byond://?src=\ref[src];mode=0'>Back</a><br>"
|
||||
|
||||
if (istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1))
|
||||
dat += "Name: [src.active1.fields["name"]] ID: [src.active1.fields["id"]]<br>"
|
||||
dat += "Sex: [src.active1.fields["sex"]]<br>"
|
||||
dat += "Age: [src.active1.fields["age"]]<br>"
|
||||
dat += "Fingerprint: [src.active1.fields["fingerprint"]]<br>"
|
||||
dat += "Physical Status: [src.active1.fields["p_stat"]]<br>"
|
||||
dat += "Mental Status: [src.active1.fields["m_stat"]]<br>"
|
||||
else
|
||||
dat += "<b>Record Lost!</b><br>"
|
||||
|
||||
dat += "<br>"
|
||||
|
||||
dat += "<h4>Medical Data</h4>"
|
||||
if (istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2))
|
||||
dat += "Blood Type: [src.active2.fields["b_type"]]<br><br>"
|
||||
|
||||
dat += "Minor Disabilities: [src.active2.fields["mi_dis"]]<br>"
|
||||
dat += "Details: [src.active2.fields["mi_dis_d"]]<br><br>"
|
||||
|
||||
dat += "Major Disabilities: [src.active2.fields["ma_dis"]]<br>"
|
||||
dat += "Details: [src.active2.fields["ma_dis_d"]]<br><br>"
|
||||
|
||||
dat += "Allergies: [src.active2.fields["alg"]]<br>"
|
||||
dat += "Details: [src.active2.fields["alg_d"]]<br><br>"
|
||||
|
||||
dat += "Current Diseases: [src.active2.fields["cdi"]]<br>"
|
||||
dat += "Details: [src.active2.fields["cdi_d"]]<br><br>"
|
||||
|
||||
dat += "Important Notes: [src.active2.fields["notes"]]<br>"
|
||||
else
|
||||
dat += "<b>Record Lost!</b><br>"
|
||||
|
||||
dat += "<br>"
|
||||
|
||||
return dat
|
||||
|
||||
Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
|
||||
if(href_list["mode"])
|
||||
var/newmode = text2num(href_list["mode"])
|
||||
src.mode = max(newmode, 0)
|
||||
|
||||
else if(href_list["select_rec"])
|
||||
var/datum/data/record/R = locate(href_list["select_rec"])
|
||||
var/datum/data/record/M = locate(href_list["select_rec"])
|
||||
|
||||
if (data_core.general.Find(R))
|
||||
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
|
||||
|
||||
src.active1 = R
|
||||
src.active2 = M
|
||||
|
||||
src.mode = 1
|
||||
|
||||
src.master.add_fingerprint(usr)
|
||||
src.master.updateSelfDialog()
|
||||
return
|
||||
101
code/WorkInProgress/pda2/scanners.dm
Normal file
101
code/WorkInProgress/pda2/scanners.dm
Normal file
@@ -0,0 +1,101 @@
|
||||
//CONTENTS:
|
||||
//Base scanner stuff
|
||||
//Health scanner
|
||||
//Forensic scanner
|
||||
//Reagent scanner
|
||||
|
||||
/datum/computer/file/pda_program/scan
|
||||
return_text()
|
||||
return src.return_text_header()
|
||||
|
||||
proc/scan_atom(atom/A as mob|obj|turf|area)
|
||||
|
||||
if( !A || (!src.holder) || (!src.master))
|
||||
return 1
|
||||
|
||||
if((!istype(holder)) || (!istype(master)))
|
||||
return 1
|
||||
|
||||
if(!(holder in src.master.contents))
|
||||
if(master.scan_program == src)
|
||||
master.scan_program = null
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
//Health analyzer program
|
||||
health_scan
|
||||
name = "Health Scan"
|
||||
size = 8.0
|
||||
|
||||
scan_atom(atom/A as mob|obj|turf|area)
|
||||
if(..())
|
||||
return
|
||||
|
||||
var/mob/living/carbon/C = A
|
||||
if(!istype(C))
|
||||
return
|
||||
|
||||
var/dat = "\blue Analyzing Results for [C]:\n"
|
||||
dat += "\blue \t Overall Status: [C.stat > 1 ? "dead" : "[C.health]% healthy"]\n"
|
||||
dat += "\blue \t Damage Specifics: [C.oxyloss > 50 ? "\red" : "\blue"][C.oxyloss]-[C.toxloss > 50 ? "\red" : "\blue"][C.toxloss]-[C.fireloss > 50 ? "\red" : "\blue"][C.fireloss]-[C.bruteloss > 50 ? "\red" : "\blue"][C.bruteloss]\n"
|
||||
dat += "\blue \t Key: Suffocation/Toxin/Burns/Brute\n"
|
||||
dat += "\blue \t Body Temperature: [C.bodytemperature-T0C]°C ([C.bodytemperature*1.8-459.67]°F)"
|
||||
if(C.virus)
|
||||
dat += "\red \n<b>Warning Virus Detected.</b>\nName: [C.virus.name].\nType: [C.virus.spread].\nStage: [C.virus.stage]/[C.virus.max_stages].\nPossible Cure: [C.virus.cure]"
|
||||
|
||||
return dat
|
||||
|
||||
//Forensic scanner
|
||||
forensic_scan
|
||||
name = "Forensic Scan"
|
||||
size = 8.0
|
||||
|
||||
scan_atom(atom/A as mob|obj|turf|area)
|
||||
if(..())
|
||||
return
|
||||
var/dat = null
|
||||
|
||||
if(istype(A,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = A
|
||||
if (!istype(H.dna, /datum/dna) || !isnull(H.gloves))
|
||||
dat += "\blue Unable to scan [A]'s fingerprints.\n"
|
||||
else
|
||||
dat += "\blue [H]'s Fingerprints: [md5(H.dna.uni_identity)]\n"
|
||||
if ( !(H.blood_DNA) )
|
||||
dat += "\blue No blood found on [H]\n"
|
||||
else
|
||||
dat += "\blue Blood type: [H.blood_type]\nDNA: [H.blood_DNA]\n"
|
||||
|
||||
if (!A.fingerprints)
|
||||
dat += "\blue Unable to locate any fingerprints on [A]!\n"
|
||||
else
|
||||
var/list/L = params2list(A:fingerprints)
|
||||
dat += "\blue Isolated [L.len] fingerprints.\n"
|
||||
for(var/i in L)
|
||||
dat += "\blue \t [i]\n"
|
||||
|
||||
return dat
|
||||
|
||||
|
||||
//Reagent scanning program
|
||||
reagent_scan
|
||||
name = "Reagent Scan"
|
||||
size = 6.0
|
||||
|
||||
scan_atom(atom/A as mob|obj|turf|area)
|
||||
if(..())
|
||||
return
|
||||
var/dat = null
|
||||
if(!isnull(A.reagents))
|
||||
if(A.reagents.reagent_list.len > 0)
|
||||
var/reagents_length = A.reagents.reagent_list.len
|
||||
dat += "\blue [reagents_length] chemical agent[reagents_length > 1 ? "s" : ""] found.\n"
|
||||
for (var/datum/reagent/re in A.reagents.reagent_list)
|
||||
dat += "\blue \t [re] - [re.volume]\n"
|
||||
else
|
||||
dat = "\blue No active chemical agents found in [A]."
|
||||
else
|
||||
dat = "\blue No significant chemical agents found in [A]."
|
||||
|
||||
return dat
|
||||
204
code/WorkInProgress/pda2/smallprogs.dm
Normal file
204
code/WorkInProgress/pda2/smallprogs.dm
Normal file
@@ -0,0 +1,204 @@
|
||||
//Assorted small programs not worthy of their own file
|
||||
//CONTENTS:
|
||||
//Crew Manifest viewer
|
||||
//Status display controller
|
||||
//Remote signaling program
|
||||
//Cargo orders monitor
|
||||
|
||||
//Manifest
|
||||
/datum/computer/file/pda_program/manifest
|
||||
name = "Manifest"
|
||||
|
||||
return_text()
|
||||
if(..())
|
||||
return
|
||||
|
||||
var/dat = src.return_text_header()
|
||||
|
||||
dat += "<h4>Crew Manifest</h4>"
|
||||
dat += "Entries cannot be modified from this terminal.<br><br>"
|
||||
|
||||
for (var/datum/data/record/t in data_core.general)
|
||||
dat += "[t.fields["name"]] - [t.fields["rank"]]<br>"
|
||||
dat += "<br>"
|
||||
|
||||
return dat
|
||||
|
||||
//Status Display
|
||||
/datum/computer/file/pda_program/status_display
|
||||
name = "Status Controller"
|
||||
size = 8.0
|
||||
var/message1 // For custom messages on the displays.
|
||||
var/message2
|
||||
|
||||
return_text()
|
||||
if(..())
|
||||
return
|
||||
|
||||
var/dat = src.return_text_header()
|
||||
|
||||
dat += "<h4>Station Status Display Interlink</h4>"
|
||||
|
||||
dat += "\[ <A HREF='?src=\ref[src];statdisp=blank'>Clear</A> \]<BR>"
|
||||
dat += "\[ <A HREF='?src=\ref[src];statdisp=shuttle'>Shuttle ETA</A> \]<BR>"
|
||||
dat += "\[ <A HREF='?src=\ref[src];statdisp=message'>Message</A> \]"
|
||||
|
||||
dat += "<ul><li> Line 1: <A HREF='?src=\ref[src];statdisp=setmsg1'>[ message1 ? message1 : "(none)"]</A>"
|
||||
dat += "<li> Line 2: <A HREF='?src=\ref[src];statdisp=setmsg2'>[ message2 ? message2 : "(none)"]</A></ul><br>"
|
||||
dat += "\[ Alert: <A HREF='?src=\ref[src];statdisp=alert;alert=default'>None</A> |"
|
||||
|
||||
dat += " <A HREF='?src=\ref[src];statdisp=alert;alert=redalert'>Red Alert</A> |"
|
||||
dat += " <A HREF='?src=\ref[src];statdisp=alert;alert=lockdown'>Lockdown</A> |"
|
||||
dat += " <A HREF='?src=\ref[src];statdisp=alert;alert=biohazard'>Biohazard</A> \]<BR>"
|
||||
|
||||
return dat
|
||||
|
||||
|
||||
Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
|
||||
if(href_list["statdisp"])
|
||||
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 (!src.master || !in_range(src.master, usr) && src.master.loc != usr)
|
||||
return
|
||||
|
||||
if(!(src.holder in src.master))
|
||||
return
|
||||
src.master.updateSelfDialog()
|
||||
|
||||
if("setmsg2")
|
||||
message2 = input("Line 2", "Enter Message Text", message2) as text|null
|
||||
if (!src.master || !in_range(src.master, usr) && src.master.loc != usr)
|
||||
return
|
||||
|
||||
if(!(src.holder in src.master))
|
||||
return
|
||||
|
||||
src.master.updateSelfDialog()
|
||||
else
|
||||
post_status(href_list["statdisp"])
|
||||
|
||||
src.master.add_fingerprint(usr)
|
||||
src.master.updateSelfDialog()
|
||||
return
|
||||
|
||||
proc/post_status(var/command, var/data1, var/data2)
|
||||
if(!src.master)
|
||||
return
|
||||
|
||||
var/datum/signal/status_signal = new
|
||||
status_signal.source = src.master
|
||||
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("alert")
|
||||
status_signal.data["picture_state"] = data1
|
||||
|
||||
src.post_signal(status_signal,"1435")
|
||||
|
||||
//Signaler
|
||||
/datum/computer/file/pda_program/signaler
|
||||
name = "Signalix 5"
|
||||
size = 8.0
|
||||
var/send_freq = 1457 //Frequency signal is sent at, should be kept within normal radio ranges.
|
||||
var/send_code = 30
|
||||
var/last_transmission = 0 //No signal spamming etc
|
||||
|
||||
return_text()
|
||||
if(..())
|
||||
return
|
||||
|
||||
var/dat = src.return_text_header()
|
||||
|
||||
dat += "<h4>Remote Signaling System</h4>"
|
||||
dat += {"
|
||||
<a href='byond://?src=\ref[src];send=1'>Send Signal</A><BR>
|
||||
|
||||
Frequency:
|
||||
<a href='byond://?src=\ref[src];adj_freq=-10'>-</a>
|
||||
<a href='byond://?src=\ref[src];adj_freq=-2'>-</a>
|
||||
[format_frequency(send_freq)]
|
||||
<a href='byond://?src=\ref[src];adj_freq=2'>+</a>
|
||||
<a href='byond://?src=\ref[src];adj_freq=10'>+</a><br>
|
||||
<br>
|
||||
Code:
|
||||
<a href='byond://?src=\ref[src];adj_code=-5'>-</a>
|
||||
<a href='byond://?src=\ref[src];adj_code=-1'>-</a>
|
||||
[send_code]
|
||||
<a href='byond://?src=\ref[src];adj_code=1'>+</a>
|
||||
<a href='byond://?src=\ref[src];adj_code=5'>+</a><br>"}
|
||||
|
||||
return dat
|
||||
|
||||
Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
|
||||
if (href_list["send"])
|
||||
if(last_transmission && world.time < (last_transmission + 5))
|
||||
return
|
||||
last_transmission = world.time
|
||||
spawn( 0 )
|
||||
var/time = time2text(world.realtime,"hh:mm:ss")
|
||||
lastsignalers.Add("[time] <B>:</B> [usr.key] used [src.master] @ location ([src.master.loc.x],[src.master.loc.y],[src.master.loc.z]) <B>:</B> [format_frequency(send_freq)]/[send_code]")
|
||||
|
||||
var/datum/signal/signal = new
|
||||
signal.source = src
|
||||
signal.encryption = send_code
|
||||
signal.data["message"] = "ACTIVATE"
|
||||
|
||||
src.post_signal(signal,"[send_freq]")
|
||||
return
|
||||
|
||||
else if (href_list["adj_freq"])
|
||||
src.send_freq = sanitize_frequency(src.send_freq + text2num(href_list["adj_freq"]))
|
||||
|
||||
else if (href_list["adj_code"])
|
||||
src.send_code += text2num(href_list["adj_code"])
|
||||
src.send_code = round(src.send_code)
|
||||
src.send_code = min(100, src.send_code)
|
||||
src.send_code = max(1, src.send_code)
|
||||
|
||||
src.master.add_fingerprint(usr)
|
||||
src.master.updateSelfDialog()
|
||||
return
|
||||
|
||||
//Supply record monitor
|
||||
/datum/computer/file/pda_program/qm_records
|
||||
name = "Supply Records"
|
||||
size = 8.0
|
||||
|
||||
return_text()
|
||||
if(..())
|
||||
return
|
||||
|
||||
var/dat = src.return_text_header()
|
||||
dat += "<h4>Supply Record Interlink</h4>"
|
||||
|
||||
dat += "<BR><B>Supply shuttle</B><BR>"
|
||||
dat += "Location: [supply_shuttle_moving ? "Moving to station ([supply_shuttle_timeleft] Mins.)":supply_shuttle_at_station ? "Station":"Dock"]<BR>"
|
||||
dat += "Current approved orders: <BR><ol>"
|
||||
for(var/S in supply_shuttle_shoppinglist)
|
||||
var/datum/supply_order/SO = S
|
||||
dat += "<li>[SO.object.name] approved by [SO.orderedby] [SO.comment ? "([SO.comment])":""]</li>"
|
||||
dat += "</ol>"
|
||||
|
||||
dat += "Current requests: <BR><ol>"
|
||||
for(var/S in supply_shuttle_requestlist)
|
||||
var/datum/supply_order/SO = S
|
||||
dat += "<li>[SO.object.name] requested by [SO.orderedby]</li>"
|
||||
dat += "</ol><font size=\"-3\">Upgrade NOW to Space Parts & Space Vendors PLUS for full remote order control and inventory management."
|
||||
|
||||
return dat
|
||||
Reference in New Issue
Block a user