Just some general cleanup

Moved the spacecraft folder into the unused section, moved syndiebeacon into machinery.
Research moved into Modules.
Virus2 moved into WIP - is anyone even working on this, it looks almost done?
Computer2,optics,pda2,experimental moved unto unused.
WIP Chemistry things moved into Chemical Module
Cameras.dm moved into weapons
GameKit.dm moved into unused
BrokenInHands.dm moved into unused
Removed Grillify.dm
Moved all of the files listed as unused in the mining module to unused
Removed several empty folders in modules
Moved cloning.dm into machinery
Moved NewBan.dm into admin
Changed humanoid aliens new_life.dm into life.dm
Moved beast mob into unused
Moved hivebot into unused
Moved carpedexplosion.dm into unused
Moved ai_lockdown.dm verb into unused and removed it from the AIs verb list as it didn't actually do anything.
Removed mastercontroler2.dm
Moved savefile.dm from human to new_player

Bugfix
People spawning on the starting screen on rev/cult should be fixed.

git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1964 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
mport2004@gmail.com
2011-07-31 21:31:00 +00:00
parent ce470a81ba
commit 2224916ab9
94 changed files with 608 additions and 1126 deletions

445
code/unused/pda2/base_os.dm Normal file
View 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)]&deg;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>&rarr; 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>&larr; 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

View 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/unused/pda2/pda2.dm Normal file
View 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

View 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

View 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]&deg;C ([C.bodytemperature*1.8-459.67]&deg;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

View 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