//The advanced pea-green monochrome lcd of tomorrow. /obj/item/device/pda name = "PDA" desc = "A portable microcomputer by Thinktronic Systems, LTD. Functionality determined by a preprogrammed ROM cartridge." icon = 'pda.dmi' icon_state = "pda" item_state = "electronic" w_class = 2.0 flags = FPRINT | TABLEPASS | ONBELT var/owner = null var/default_cartridge = 0 // Access level defined by cartridge var/obj/item/weapon/cartridge/cartridge = null //current cartridge var/mode = 0 //0-10, Main menu, Crew manifest, Engine monitor, Atmos scanner, med records, notes, sec records, messenger, mop locator, signaler, status display. var/scanmode = 0 //1 is medical scanner, 2 is forensics, 3 is reagent scanner. var/mmode = 0 //medical record viewing mode var/smode = 0 //Security record viewing mode??? var/tmode = 0 //Texting mode, 1 to view recieved messages var/fon = 0 //Is the flashlight function on? var/f_lum = 3 //Luminosity for the flashlight function var/silent = 0 //To beep or not to beep, that is the question var/toff = 0 //If 1, messenger disabled var/tnote = null //Current Texts var/last_text //No text spamming var/last_honk //Also no honk spamming that's bad too var/ttone = "beep" //The ringtone! var/honkamt = 0 //How many honks left when infected with honk.exe var/note = "Congratulations, your station has chosen the Thinktronic 5100 Personal Data Assistant!" //Current note in the notepad 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 var/message1 // used for status_displays var/message2 /obj/item/device/pda/medical default_cartridge = /obj/item/weapon/cartridge/medical icon_state = "pda-m" /obj/item/device/pda/engineering default_cartridge = /obj/item/weapon/cartridge/engineering icon_state = "pda-e" /obj/item/device/pda/security default_cartridge = /obj/item/weapon/cartridge/security icon_state = "pda-s" /obj/item/device/pda/janitor default_cartridge = /obj/item/weapon/cartridge/janitor icon_state = "pda-j" /obj/item/device/pda/toxins default_cartridge = /obj/item/weapon/cartridge/signal/toxins icon_state = "pda-tox" 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/heads default_cartridge = /obj/item/weapon/cartridge/head icon_state = "pda-h" /obj/item/device/pda/captain default_cartridge = /obj/item/weapon/cartridge/captain icon_state = "pda-c" toff = 1 /obj/item/device/pda/quartermaster default_cartridge = /obj/item/weapon/cartridge/quartermaster icon_state = "pda-q" /obj/item/device/pda/syndicate default_cartridge = /obj/item/weapon/cartridge/syndicate icon_state = "pda-syn" name = "Military PDA" owner = "John Doe" toff = 1 /obj/item/device/pda/chaplain icon_state = "pda-holy" /obj/item/weapon/cartridge name = "generic cartridge" desc = "A data cartridge for portable microcomputers." icon = 'pda.dmi' icon_state = "cart" item_state = "electronic" w_class = 1 var/access_security = 0 var/access_engine = 0 var/access_medical = 0 var/access_manifest = 0 var/access_clown = 0 var/access_janitor = 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_hydroponics = 0 // common cartridge procs // send a signal on a frequency proc/post_signal(var/freq, var/key, var/value, var/key2, var/value2, var/key3, var/value3) //world << "Post: [freq]: [key]=[value], [key2]=[value2]" var/datum/radio_frequency/frequency = radio_controller.return_frequency("[freq]") if(!frequency) return var/datum/signal/signal = new() signal.source = src signal.transmission_method = 1 signal.data[key] = value if(key2) signal.data[key2] = value2 if(key3) signal.data[key3] = value3 frequency.post_signal(src, signal) /obj/item/weapon/cartridge/engineering name = "Power-ON Cartridge" icon_state = "cart-e" access_engine = 1 /obj/item/weapon/cartridge/medical name = "Med-U Cartridge" icon_state = "cart-m" access_medical = 1 /obj/item/weapon/cartridge/security name = "R.O.B.U.S.T. Cartridge" icon_state = "cart-s" access_security = 1 var/list/botlist = null // list of bots var/obj/machinery/bot/secbot/active // the active bot; if null, show bot list var/list/botstatus // the status signal sent by the bot var/control_freq = 1447 // create a new QM cartridge, and register to receive bot control & beacon message New() ..() spawn(5) if(radio_controller) radio_controller.add_object(src, "[control_freq]") // receive radio signals // can detect bot status signals // create/populate list as they are recvd 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"] == "secbot") if(!botlist) botlist = new() if(!(signal.source in botlist)) botlist += signal.source if(active == signal.source) var/list/b = signal.data botstatus = b.Copy() if(istype(P)) P.updateSelfDialog() Topic(href, href_list) ..() var/obj/item/device/pda/PDA = src.loc switch(href_list["op"]) if("control") active = locate(href_list["bot"]) post_signal(control_freq, "command", "bot_status", "active", active) if("scanbots") // find all bots botlist = null post_signal(control_freq, "command", "bot_status") if("botlist") active = null PDA.updateSelfDialog() if("stop", "go") post_signal(control_freq, "command", href_list["op"], "active", active) post_signal(control_freq, "command", "bot_status", "active", active) if("summon") post_signal(control_freq, "command", "summon", "active", active, "target", get_turf(PDA) ) post_signal(control_freq, "command", "bot_status", "active", active) /obj/item/weapon/cartridge/janitor name = "CustodiPRO Cartridge" desc = "The ultimate in clean-room design." icon_state = "cart-j" access_janitor = 1 /obj/item/weapon/cartridge/clown name = "Honkworks 5.0" icon_state = "cart-clown" access_clown = 1 var/honk_charges = 5 //Radio cart - Essentially a "one-way" signaler, does nothing with received signals. /obj/item/weapon/cartridge/signal name = "generic signaler cartridge" desc = "A data cartridge with an integrated radio signaler module." var/frequency = 1457 var/code = 30.0 var/last_transmission var/datum/radio_frequency/radio_connection New() ..() if(radio_controller) initialize() /obj/item/weapon/cartridge/signal/toxins name = "Signal Ace 2" desc = "Complete with integrated radio signaler!" icon_state = "cart-tox" access_reagent_scanner = 1 /obj/item/weapon/cartridge/head name = "Easy-Record DELUXE" icon_state = "cart-h" access_manifest = 1 access_engine = 1 access_security = 1 access_status_display = 1 /obj/item/weapon/cartridge/captain name = "Value-PAK Cartridge" desc = "Now with 200% more value!" icon_state = "cart-c" access_manifest = 1 access_engine = 1 access_security = 1 access_medical = 1 access_reagent_scanner = 1 access_status_display = 1 /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 var/list/botlist = null // list of bots var/obj/machinery/bot/mulebot/active // the active bot; if null, show bot list var/list/botstatus // the status signal sent by the bot var/list/beacons var/beacon_freq = 1445 var/control_freq = 1447 // create a new QM cartridge, and register to receive bot control & beacon message New() ..() spawn(5) if(radio_controller) radio_controller.add_object(src, "[control_freq]") radio_controller.add_object(src, "[beacon_freq]") spawn(10) post_signal(beacon_freq, "findbeacon", "delivery") // receive radio signals // can detect bot status signals // and beacon locations // create/populate lists as they are recvd 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"] == "mulebot") if(!botlist) botlist = new() if(!(signal.source in botlist)) botlist += signal.source if(active == signal.source) var/list/b = signal.data botstatus = b.Copy() else if(signal.data["beacon"]) if(!beacons) beacons = new() beacons[signal.data["beacon"] ] = signal.source if(istype(P)) P.updateSelfDialog() Topic(href, href_list) ..() var/obj/item/device/pda/PDA = src.loc var/cmd = "command" if(active) cmd = "command [active.suffix]" switch(href_list["op"]) if("control") active = locate(href_list["bot"]) post_signal(control_freq, cmd, "bot_status") if("scanbots") // find all bots botlist = null post_signal(control_freq, "command", "bot_status") if("botlist") active = null PDA.updateSelfDialog() if("unload") post_signal(control_freq, cmd, "unload") post_signal(control_freq, cmd, "bot_status") 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) post_signal(control_freq, cmd, "bot_status") if("retoff") post_signal(control_freq, cmd, "autoret", "value", 0) post_signal(control_freq, cmd, "bot_status") if("reton") post_signal(control_freq, cmd, "autoret", "value", 1) post_signal(control_freq, cmd, "bot_status") if("pickoff") post_signal(control_freq, cmd, "autopick", "value", 0) post_signal(control_freq, cmd, "bot_status") if("pickon") post_signal(control_freq, cmd, "autopick", "value", 1) post_signal(control_freq, cmd, "bot_status") if("stop", "go", "home") post_signal(control_freq, cmd, href_list["op"]) post_signal(control_freq, cmd, "bot_status") /obj/item/weapon/cartridge/syndicate name = "Detomatix Cartridge" icon_state = "cart" access_remote_door = 1 remote_door_id = "syndicate" //Make sure this matches the syndicate shuttle's shield/door id!! var/shock_charges = 4 /* * Radio Cartridge, essentially a signaler. */ /obj/item/weapon/cartridge/signal/initialize() if (src.frequency < 1441 || src.frequency > 1489) src.frequency = sanitize_frequency(src.frequency) set_frequency(frequency) /obj/item/weapon/cartridge/signal/proc/set_frequency(new_frequency) radio_controller.remove_object(src, "[frequency]") frequency = new_frequency radio_connection = radio_controller.add_object(src, "[frequency]") /obj/item/weapon/cartridge/signal/proc/send_signal(message="ACTIVATE") if(last_transmission && world.time < (last_transmission + 5)) return last_transmission = world.time var/time = time2text(world.realtime,"hh:mm:ss") var/turf/T = get_turf(src) lastsignalers.Add("[time] : [usr.key] used [src] @ location ([T.x],[T.y],[T.z]) : [format_frequency(frequency)]/[code]") var/datum/signal/signal = new signal.source = src signal.encryption = code signal.data["message"] = message radio_connection.post_signal(src, signal) return /* * The Actual PDA */ /obj/item/device/pda/pickup(mob/user) if (src.fon) src.sd_SetLuminosity(0) user.sd_SetLuminosity(user.luminosity + src.f_lum) /obj/item/device/pda/dropped(mob/user) if (src.fon) user.sd_SetLuminosity(user.luminosity - src.f_lum) src.sd_SetLuminosity(src.f_lum) /obj/item/device/pda/New() ..() spawn(3) if (src.default_cartridge) src.cartridge = new src.default_cartridge(src) /obj/item/device/pda/attack_self(mob/user as mob) /* if (user.client) //load the PDA iconset into the client user << browse_rsc('pda_back.png') user << browse_rsc('pda_bell.png') user << browse_rsc('pda_blank.png') user << browse_rsc('pda_boom.png') user << browse_rsc('pda_bucket.png') user << browse_rsc('pda_crate.png') user << browse_rsc('pda_cuffs.png') user << browse_rsc('pda_eject.png') user << browse_rsc('pda_exit.png') user << browse_rsc('pda_flashlight.png') user << browse_rsc('pda_honk.png') user << browse_rsc('pda_mail.png') user << browse_rsc('pda_medical.png') user << browse_rsc('pda_menu.png') user << browse_rsc('pda_mule.png') user << browse_rsc('pda_notes.png') user << browse_rsc('pda_power.png') user << browse_rsc('pda_rdoor.png') user << browse_rsc('pda_reagent.png') user << browse_rsc('pda_refresh.png') user << browse_rsc('pda_scanner.png') user << browse_rsc('pda_signaler.png') user << browse_rsc('pda_status.png')*/ user.machine = src var/dat = "Personal Data Assistant" dat += " Close" if ((!isnull(src.cartridge)) && (!src.mode)) dat += " | Eject [src.cartridge]" if (src.mode) dat += " | Main Menu" dat += " | Refresh" dat += "
" if (!src.owner) dat += "Warning: No owner information entered. Please swipe card.

" dat += " Retry" else switch (src.mode) if (0) dat += "

PERSONAL DATA ASSISTANT

" dat += "Owner: [src.owner]

" dat += "

General Functions

" dat += "" if (!isnull(src.cartridge) && src.cartridge.access_engine) dat += "

Engineering Functions

" dat += "" if (!isnull(src.cartridge) && src.cartridge.access_medical) dat += "

Medical Functions

" dat += "" if (!isnull(src.cartridge) && src.cartridge.access_security) dat += "

Security Functions

" dat += "" if(cartridge && cartridge.access_quartermaster) dat += "

Quartermaster Functions:

" dat += "" dat += "

Utilities

" dat += "" if (1) dat += "

Crew Manifest

" dat += "Entries cannot be modified from this terminal.

" for (var/datum/data/record/t in data_core.general) dat += "[t.fields["name"]] - [t.fields["rank"]]
" dat += "
" if (2) //muskets 250810 //experimental PDA power monitoring code //mostly ripped off from the power monitor computer //powerreport, powerreportnodes, powerreportavail and powerreportviewload are new globals updated by the //power monitor computer // //only the first power computer to come online will update, if that breaks you can build another and it'll take over //an existing second power monitor should take over fine too //see changes to /game/machinery/computer/power.dm dat += "

Power Monitor

" if(!powerreport) dat += "\red No connection" else var/list/L = list() for(var/obj/machinery/power/terminal/term in powerreportnodes) if(istype(term.master, /obj/machinery/power/apc)) var/obj/machinery/power/apc/A = term.master L += A dat += "
Total power: [powerreportavail] W
Total load: [num2text(powerreportviewload,10)] W
" dat += "" if(L.len > 0) dat += "Area Eqp./Lgt./Env. Load Cell
" var/list/S = list(" Off","AOff"," On", " AOn") var/list/chg = list("N","C","F") for(var/obj/machinery/power/apc/A in L) dat += copytext(add_tspace(A.area.name, 30), 1, 30) dat += " [S[A.equipment+1]] [S[A.lighting+1]] [S[A.environ+1]] [add_lspace(A.lastused_total, 6)] [A.cell ? "[add_lspace(round(A.cell.percent()), 3)]% [chg[A.charging+1]]" : " N/C"]
" dat += "
" if (3) dat += "

Atmospheric Readings

" var/turf/T = get_turf_or_move(user.loc) if (isnull(T)) dat += "Unable to obtain a reading.
" 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
" 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)]%
" dat += "Oxygen: [round(o2_level*100)]%
" dat += "Carbon Dioxide: [round(co2_level*100)]%
" dat += "Plasma: [round(plasma_level*100)]%
" if(unknown_level > 0.01) dat += "OTHER: [round(unknown_level)]%
" dat += "Temperature: [round(environment.temperature-T0C)]°C
" dat += "
" if (4) if (!src.mmode) dat += "

Medical Record List

" for (var/datum/data/record/R in data_core.general) dat += "[R.fields["id"]]: [R.fields["name"]]
" dat += "
" else if (src.mmode) dat += "

Medical Record

" dat += "
Back
" if (istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)) dat += "Name: [src.active1.fields["name"]] ID: [src.active1.fields["id"]]
" dat += "Sex: [src.active1.fields["sex"]]
" dat += "Age: [src.active1.fields["age"]]
" dat += "Fingerprint: [src.active1.fields["fingerprint"]]
" dat += "Physical Status: [src.active1.fields["p_stat"]]
" dat += "Mental Status: [src.active1.fields["m_stat"]]
" else dat += "Record Lost!
" dat += "
" dat += "

Medical Data

" if (istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)) dat += "Blood Type: [src.active2.fields["b_type"]]

" dat += "Minor Disabilities: [src.active2.fields["mi_dis"]]
" dat += "Details: [src.active2.fields["mi_dis_d"]]

" dat += "Major Disabilities: [src.active2.fields["ma_dis"]]
" dat += "Details: [src.active2.fields["ma_dis_d"]]

" dat += "Allergies: [src.active2.fields["alg"]]
" dat += "Details: [src.active2.fields["alg_d"]]

" dat += "Current Diseases: [src.active2.fields["cdi"]]
" dat += "Details: [src.active2.fields["cdi_d"]]

" dat += "Important Notes: [src.active2.fields["notes"]]
" else dat += "Record Lost!
" dat += "
" if (5) dat += "

Notekeeper V2.1

" if ((!isnull(src.uplink)) && (src.uplink.active)) dat += "Lock
" else dat += "Edit
" dat += src.note if (6) if (!src.smode) dat += "

Security Record List

" for (var/datum/data/record/R in data_core.general) dat += "[R.fields["id"]]: [R.fields["name"]]
" dat += "
" else if (src.smode) dat += "

Security Record

" dat += "
Back
" if (istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)) dat += "Name: [src.active1.fields["name"]] ID: [src.active1.fields["id"]]
" dat += "Sex: [src.active1.fields["sex"]]
" dat += "Age: [src.active1.fields["age"]]
" dat += "Fingerprint: [src.active1.fields["fingerprint"]]
" dat += "Physical Status: [src.active1.fields["p_stat"]]
" dat += "Mental Status: [src.active1.fields["m_stat"]]
" else dat += "Record Lost!
" dat += "
" dat += "

Security Data

" if (istype(src.active3, /datum/data/record) && data_core.security.Find(src.active3)) dat += "Criminal Status: [src.active3.fields["criminal"]]
" dat += "Minor Crimes: [src.active3.fields["mi_crim"]]
" dat += "Details: [src.active3.fields["mi_crim"]]

" dat += "Major Crimes: [src.active3.fields["ma_crim"]]
" dat += "Details: [src.active3.fields["ma_crim_d"]]

" dat += "Important Notes:
" dat += "[src.active3.fields["notes"]]" else dat += "Record Lost!
" dat += "
" if (7) dat += "

SpaceMessenger V3.9.4

" if (!src.tmode) dat += " Ringer: [src.silent == 1 ? "Off" : "On"] | " dat += " Send / Receive: [src.toff == 1 ? "Off" : "On"] | " dat += " Set Ringtone | " dat += " Messages
" if (istype(src.cartridge, /obj/item/weapon/cartridge/syndicate)) dat+= "[src.cartridge:shock_charges] detonation charges left.
" if (istype(src.cartridge, /obj/item/weapon/cartridge/clown)) dat+= "[src.cartridge:honk_charges] viral files left.
" dat += "

Detected PDAs

" dat += "" if (count == 0) dat += "None detected.
" else dat += " Clear | " dat += " Back
" dat += "

Messages

" dat += src.tnote dat += "
" if (8) dat += "

Persistent Custodial Object Locator

" var/turf/cl = get_turf(src) if (cl) dat += "Current Orbital Location: \[[cl.x],[cl.y]\]" dat += "

Located Mops:

" var/ldat for (var/obj/item/weapon/mop/M in world) var/turf/ml = get_turf(M) if (ml.z != cl.z) continue ldat += "Mop - \[[ml.x],[ml.y]\] - [M.reagents.total_volume ? "Wet" : "Dry"]
" if (!ldat) dat += "None" else dat += "[ldat]" dat += "

Located Mop Buckets:

" ldat = null for (var/obj/mopbucket/B in world) var/turf/bl = get_turf(B) if (bl.z != cl.z) continue ldat += "Bucket - \[[bl.x],[bl.y]\] - Water level: [B.reagents.total_volume]/50
" if (!ldat) dat += "None" else dat += "[ldat]" dat += "

Located Cleanbots:

" ldat = null for (var/obj/machinery/bot/cleanbot/B in world) var/turf/bl = get_turf(B) if (bl.z != cl.z) continue ldat += "Cleanbot - \[[bl.x],[bl.y]\] - [B.on ? "Online" : "Offline"]
" if (!ldat) dat += "None" else dat += "[ldat]" else dat += "ERROR: Unable to determine current location." if (9) if (!isnull(src.cartridge) && (istype(src.cartridge, /obj/item/weapon/cartridge/signal))) dat += "

Remote Signaling System

" dat += {" Send Signal
Frequency: - - [format_frequency(src.cartridge:frequency)] + +

Code: - - [src.cartridge:code] + +
"} else dat += "ERROR: Unable to access cartridge signaler system.
Please check cartridge." if (10) // status display dat += "

Station Status Display Interlink

" dat += "\[ Clear \]
" dat += "\[ Shuttle ETA \]
" dat += "\[ Message \]" dat += "
" dat += "\[ Alert: None |" dat += " Red Alert |" dat += " Lockdown |" dat += " Biohazard \]
" if(11) // Quartermaster Supply Shuttle dat += "

Supply Record Interlink

" dat += "
Supply shuttle
" dat += "Location: [supply_shuttle_moving ? "Moving to station ([supply_shuttle_timeleft] Mins.)":supply_shuttle_at_station ? "Station":"Dock"]
" dat += "Current approved orders:
    " for(var/S in supply_shuttle_shoppinglist) var/datum/supply_order/SO = S dat += "
  1. [SO.object.name] approved by [SO.orderedby] [SO.comment ? "([SO.comment])":""]
  2. " dat += "
" dat += "Current requests:
    " for(var/S in supply_shuttle_requestlist) var/datum/supply_order/SO = S dat += "
  1. [SO.object.name] requested by [SO.orderedby]
  2. " dat += "
Upgrade NOW to Space Parts & Space Vendors PLUS for full remote order control and inventory management." if(12) // Quartermaster mulebot control var/obj/item/weapon/cartridge/quartermaster/QC = cartridge if(!QC) dat += "Interlink Error - Please reinsert cartridge." return dat += "

M.U.L.E. bot Interlink V0.8

" if(!QC.active) // list of bots if(!QC.botlist || (QC.botlist && QC.botlist.len==0)) dat += "No bots found.
" else for(var/obj/machinery/bot/mulebot/B in QC.botlist) dat += "[B] at [B.loc.loc]
" dat += "
Scan for active bots
" else // bot selected, control it dat += "[QC.active]
Status: (refresh)
" if(!QC.botstatus) dat += "Waiting for response...
" else dat += "Location: [QC.botstatus["loca"] ]
" dat += "Mode: " switch(QC.botstatus["mode"]) if(0) dat += "Ready" if(1) dat += "Loading/Unloading" if(2) dat += "Navigating to Delivery Location" if(3) dat += "Navigating to Home" if(4) dat += "Waiting for clear path" if(5,6) dat += "Calculating navigation path" if(7) dat += "Unable to locate destination" var/obj/crate/C = QC.botstatus["load"] dat += "
Current Load: [ !C ? "none" : "[C.name] (unload)" ]
" dat += "Destination: [!QC.botstatus["dest"] ? "none" : QC.botstatus["dest"] ] (set)
" dat += "Power: [QC.botstatus["powr"]]%
" dat += "Home: [!QC.botstatus["home"] ? "none" : QC.botstatus["home"] ]
" dat += "Auto Return Home: [QC.botstatus["retn"] ? "On Off" : "(On) Off"]
" dat += "Auto Pickup Crate: [QC.botstatus["pick"] ? "On Off" : "(On) Off"]

" dat += "\[Stop\] " dat += "\[Proceed\] " dat += "\[Return Home\]
" dat += "
Return to bot list" if(13) // Security Bot control var/obj/item/weapon/cartridge/security/SC = cartridge if(!SC) dat += "Interlink Error - Please reinsert cartridge." return dat += "

Securitron Interlink

" if(!SC.active) // list of bots if(!SC.botlist || (SC.botlist && SC.botlist.len==0)) dat += "No bots found.
" else for(var/obj/machinery/bot/secbot/B in SC.botlist) dat += "[B] at [B.loc.loc]
" dat += "
Scan for active bots
" else // bot selected, control it dat += "[SC.active]
Status: (refresh)
" if(!SC.botstatus) dat += "Waiting for response...
" else dat += "Location: [SC.botstatus["loca"] ]
" dat += "Mode: " switch(SC.botstatus["mode"]) if(0) dat += "Ready" if(1) dat += "Apprehending target" if(2,3) dat += "Arresting target" if(4) dat += "Starting patrol" if(5) dat += "On patrol" if(6) dat += "Responding to summons" dat += "
\[Stop Patrol\] " dat += "\[Start Patrol\] " dat += "\[Summon Bot\]
" dat += "
Return to bot list" dat += "" user << browse(dat, "window=pda") onclose(user, "pda", src) /obj/item/device/pda/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["mm"]) src.mode = 0 else if (href_list["cm"]) src.mode = 1 else if (href_list["am"]) src.mode = 3 else if (href_list["note"]) src.mode = 5 else if (href_list["mess"]) src.mode = 7 else if (href_list["sd"]) src.mode = 10 else if (href_list["suppshut"]) src.mode = 11 else if (href_list["mulectrl"]) src.mode = 12 else if (href_list["secbot"]) mode = 13 else if (href_list["flight"]) src.fon = (!src.fon) if (usr.contents.Find(src)) if (src.fon) usr.sd_SetLuminosity(usr.luminosity + src.f_lum) else usr.sd_SetLuminosity(usr.luminosity - src.f_lum) else src.sd_SetLuminosity(src.fon * src.f_lum) src.updateUsrDialog() else if (href_list["editnote"]) if (src.mode == 5) var/n = input(usr, "Please enter message", src.name, src.note) as message if (!in_range(src, usr) && src.loc != usr) return n = copytext(adminscrub(n), 1, MAX_MESSAGE_LEN) if (src.mode == 5) src.note = n else if (src.mode == 7) var/t = input(usr, "Please enter message", src.name, null) as text t = copytext(sanitize(t), 1, MAX_MESSAGE_LEN) if (!t) return if (!in_range(src, usr) && src.loc != usr) return var/obj/item/device/pda/P = locate(href_list["editnote"]) if (isnull(P)) return if (last_text && world.time < last_text + 5) return if (P.toff || src.toff) return last_text = world.time src.tnote += "→ To [P.owner]:
[t]
" P.tnote += "← From [src.owner]:
[t]
" if (prob(15)) //Give the AI a chance of intercepting the message for (var/mob/living/silicon/ai/A in world) A.show_message("Intercepted message from [P:owner]: [t]") if (!P.silent) playsound(P.loc, 'twobeep.ogg', 50, 1) for (var/mob/O in hearers(3, P.loc)) O.show_message(text("\icon[P] *[P.ttone]*")) P.overlays = null P.overlays += image('pda.dmi', "pda-r") else if (href_list["settone"]) var/t = input(usr, "Please enter new ringtone", src.name, src.ttone) as text if (!in_range(src, usr) && src.loc != usr) return if (!t) return if ((src.uplink) && (cmptext(t,src.uplink.lock_code)) && (!src.uplink.active)) usr << "The PDA softly beeps." src.uplink.unlock() else t = copytext(sanitize(t), 1, 20) src.ttone = t else if (href_list["refresh"]) src.updateUsrDialog() else if (href_list["close"]) usr << browse(null, "window=pda") usr.machine = null else if (href_list["d_rec"]) var/datum/data/record/R = locate(href_list["d_rec"]) var/datum/data/record/M = locate(href_list["d_rec"]) var/datum/data/record/S = locate(href_list["d_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 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 = M src.active3 = S if (src.mode == 4) src.mmode = 1 else src.smode = 1 else if (href_list["pback"]) if (src.mode == 4) src.mmode = 0 if (src.mode == 7) src.tmode = !src.tmode else src.smode = 0 else if (href_list["em"] && !isnull(src.cartridge) && src.cartridge.access_engine) src.mode = 2 else if (href_list["mr"] && !isnull(src.cartridge) && src.cartridge.access_medical) src.mode = 4 else if (href_list["sr"] && !isnull(src.cartridge) && src.cartridge.access_security) src.mode = 6 else if (href_list["jl"] && !isnull(src.cartridge) && src.cartridge.access_janitor) src.mode = 8 else if ((href_list["sigmode"]) && (!isnull(src.cartridge)) && (istype(src.cartridge, /obj/item/weapon/cartridge/signal))) src.mode = 9 else if (href_list["set_scanmode"]) var/smode = (text2num(href_list["set_scanmode"])) if (src.scanmode == smode) src.scanmode = 0 else if ((smode == 1) && (!isnull(src.cartridge)) && (src.cartridge.access_medical)) src.scanmode = 1 else if ((smode == 2) && (!isnull(src.cartridge)) && (src.cartridge.access_security)) src.scanmode = 2 else if ((smode == 3) && (!isnull(src.cartridge)) && (src.cartridge.access_reagent_scanner)) src.scanmode = 3 src.updateUsrDialog() else if (href_list["detonate"] && istype(src.cartridge, /obj/item/weapon/cartridge/syndicate)) var/obj/item/device/pda/P = locate(href_list["detonate"]) if(P) if (!P.toff && src.cartridge:shock_charges > 0) src.cartridge:shock_charges-- var/difficulty = 0 if (!isnull(P.cartridge)) difficulty += P.cartridge.access_medical difficulty += P.cartridge.access_security difficulty += P.cartridge.access_engine difficulty += P.cartridge.access_clown difficulty += P.cartridge.access_janitor difficulty += P.cartridge.access_manifest * 2 else difficulty += 2 if ((prob(difficulty * 12)) || (P.uplink)) usr.show_message("\red An error flashes on your [src].", 1) else if (prob(difficulty * 3)) usr.show_message("\red Energy feeds back into your [src]!", 1) src.explode() else usr.show_message("\blue Success!", 1) P.explode() src.updateUsrDialog() else if (href_list["sendhonk"] && istype(src.cartridge, /obj/item/weapon/cartridge/clown)) var/obj/item/device/pda/P = locate(href_list["sendhonk"]) if (!P.toff && src.cartridge:honk_charges > 0) src.cartridge:honk_charges-- usr.show_message("\blue Virus sent!", 1) P.honkamt = (rand(15,20)) src.updateUsrDialog() else if (href_list["remotedoor"] && !isnull(src.cartridge) && src.cartridge.access_remote_door) for (var/obj/machinery/door/poddoor/M in machines) if (M.id != src.cartridge.remote_door_id) continue if (M.density) spawn(0) M.open() else spawn(0) M.close() else if (href_list["rc"] && !isnull(src.cartridge)) var/turf/T = src.loc if (ismob(T)) T = T.loc src.cartridge.loc = T src.scanmode = 0 src.mmode = 0 src.smode = 0 src.cartridge = null else if (href_list["tfunc"]) //If viewing texts then erase them, if not then toggle silent status if (src.tmode) src.tnote = null src.updateUsrDialog() else if (!src.tmode) src.silent = !src.silent src.updateUsrDialog() else if (href_list["tonoff"]) //toggle toff src.toff = !src.toff else if (href_list["lock_uplink"]) //Lock that uplink!! if(src.uplink) src.uplink.active = 0 src.note = src.uplink.orignote src.updateUsrDialog() else if (href_list["honk"]) if (last_honk && world.time < last_honk + 20) return playsound(src.loc, 'bikehorn.ogg', 50, 1) src.last_honk = world.time //Toxins PDA signaler stuff else if ((href_list["ssend"]) && (istype(src.cartridge,/obj/item/weapon/cartridge/signal))) for(var/obj/item/assembly/r_i_ptank/R in world) //Bomblist stuff if((R.part1.code == src.cartridge:code) && (R.part1.frequency == src.cartridge:frequency)) bombers += "[key_name(usr)] has activated a radio bomb (Freq: [format_frequency(src.cartridge:frequency)], Code: [src.cartridge:code]). Temp = [R.part3.air_contents.temperature-T0C]." spawn( 0 ) src.cartridge:send_signal("ACTIVATE") return else if ((href_list["sfreq"]) && (istype(src.cartridge,/obj/item/weapon/cartridge/signal))) var/new_frequency = sanitize_frequency(src.cartridge:frequency + text2num(href_list["sfreq"])) src.cartridge:set_frequency(new_frequency) else if ((href_list["scode"]) && (istype(src.cartridge,/obj/item/weapon/cartridge/signal))) src.cartridge:code += text2num(href_list["scode"]) src.cartridge:code = round(src.cartridge:code) src.cartridge:code = min(100, src.cartridge:code) src.cartridge:code = max(1, src.cartridge:code) else if (href_list["statdisp"] && cartridge && cartridge.access_status_display) 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 src.updateSelfDialog() if("setmsg2") message2 = input("Line 2", "Enter Message Text", message2) as text|null src.updateSelfDialog() else post_status(href_list["statdisp"]) if (src.mode == 7 || src.tmode == 1) src.overlays = null if ((src.honkamt > 0) && (prob(60))) src.honkamt-- playsound(src.loc, 'bikehorn.ogg', 30, 1) for (var/mob/M in viewers(1, src.loc)) if (M.client && M.machine == src) src.attack_self(M) // access to status display signals /obj/item/device/pda/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("alert") status_signal.data["picture_state"] = data1 frequency.post_signal(src, status_signal) /obj/item/device/pda/attackby(obj/item/weapon/C as obj, mob/user as mob) if (istype(C, /obj/item/weapon/cartridge) && isnull(src.cartridge)) user.drop_item() C.loc = src user << "\blue You insert [C] into [src]." src.cartridge = C src.updateUsrDialog() 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.updateUsrDialog() /obj/item/device/pda/attack(mob/C as mob, mob/user as mob) if (istype(C, /mob/living/carbon)) switch(src.scanmode) if(1) for (var/mob/O in viewers(C, null)) O.show_message("\red [user] has analyzed [C]'s vitals!", 1) user.show_message("\blue Analyzing Results for [C]:") user.show_message("\blue \t Overall Status: [C.stat > 1 ? "dead" : "[C.health]% healthy"]", 1) user.show_message("\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]", 1) user.show_message("\blue \t Key: Suffocation/Toxin/Burns/Brute", 1) user.show_message("\blue \t Body Temperature: [C.bodytemperature-T0C]°C ([C.bodytemperature*1.8-459.67]°F)", 1) if(C.virus) user.show_message(text("\red Warning Virus Detected.\nName: [C.virus.name].\nType: [C.virus.spread].\nStage: [C.virus.stage]/[C.virus.max_stages].\nPossible Cure: [C.virus.cure]")) if(2) if (!istype(C:dna, /datum/dna) || !isnull(C:gloves)) user << "\blue No fingerprints found on [C]" else user << text("\blue [C]'s Fingerprints: [md5(C:dna.uni_identity)]") if ( !(C:blood_DNA) ) user << "\blue No blood found on [C]" else user << "\blue Blood found on [C]. Analysing..." spawn(15) user << "\blue Blood type: [C:blood_type]\nDNA: [C:blood_DNA]" /obj/item/device/pda/afterattack(atom/A as mob|obj|turf|area, mob/user as mob) if (src.scanmode == 2) if (!A.fingerprints) user << "\blue Unable to locate any fingerprints on [A]!" else var/list/L = params2list(A:fingerprints) user << "\blue Isolated [L.len] fingerprints." for(var/i in L) user << "\blue \t [i]" else if (src.scanmode == 3) if(!isnull(A.reagents)) if(A.reagents.reagent_list.len > 0) var/reagents_length = A.reagents.reagent_list.len user << "\blue [reagents_length] chemical agent[reagents_length > 1 ? "s" : ""] found." for (var/re in A.reagents.reagent_list) user << "\blue \t [re]" else user << "\blue No active chemical agents found in [A]." else user << "\blue No significant chemical agents found in [A]." else if (!src.scanmode && istype(A, /obj/item/weapon/paper) && src.owner) if ((!isnull(src.uplink)) && (src.uplink.active)) src.uplink.orignote = A:info else src.note = A:info user << "\blue Paper scanned." //concept of scanning paper copyright brainoblivion 2009 /obj/item/device/pda/proc/explode() //This needs tuning. var/turf/T = get_turf(src.loc) if (ismob(src.loc)) var/mob/M = src.loc M.show_message("\red Your [src] explodes!", 1) if(T) T.hotspot_expose(700,125) explosion(T, -1, -1, 2, 3) del(src) return /obj/item/device/pda/clown/HasEntered(AM as mob|obj) //Clown PDA is slippery. if (istype(AM, /mob/living/carbon)) var/mob/M = AM if ((istype(M, /mob/living/carbon/human) && istype(M:shoes, /obj/item/clothing/shoes/galoshes)) || M.m_intent == "walk") return if ((istype(M, /mob/living/carbon/human) && (M.real_name != src.owner) && (istype(src.cartridge, /obj/item/weapon/cartridge/clown)))) if (src.cartridge:honk_charges < 5) src.cartridge:honk_charges++ M.pulling = null M << "\blue You slipped on the PDA!" playsound(src.loc, 'slip.ogg', 50, 1, -3) M.stunned = 8 M.weakened = 5 //AI verb and proc for sending PDA messages. /mob/living/silicon/ai/verb/cmd_send_pdamesg() set category = "AI Commands" set name = "Send PDA Message" var/list/names = list() var/list/plist = list() var/list/namecounts = list() if(usr.stat == 2) usr << "You can't send PDA messages because you are dead!" return for (var/obj/item/device/pda/P in world) if (!P.owner) continue else if (P == src) continue else if (P.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 var/c = input(usr, "Please select a PDA") as null|anything in plist if (!c) return var/selected = plist[c] ai_send_pdamesg(selected) /mob/living/silicon/ai/proc/ai_send_pdamesg(obj/selected as obj) var/t = input(usr, "Please enter message", src.name, null) as text t = copytext(sanitize(t), 1, MAX_MESSAGE_LEN) if (!t) return if (selected:toff) return usr.show_message("PDA message to [selected:owner]: [t]") selected:tnote += "← From (AI) [usr.name]:
[t]
" if (!selected:silent) playsound(selected.loc, 'twobeep.ogg', 50, 1) for (var/mob/O in hearers(3, selected.loc)) O.show_message(text("\icon[selected] *[selected:ttone]*")) selected.overlays = null selected.overlays += image('pda.dmi', "pda-r") //Some spare PDAs in a box /obj/item/weapon/storage/PDAbox name = "spare PDAs" desc = "A box of spare PDA microcomputers." icon = 'pda.dmi' icon_state = "pdabox" item_state = "syringe_kit" /obj/item/weapon/storage/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) var/newcart = pick(1,2,3,4) switch(newcart) if(1) new /obj/item/weapon/cartridge/janitor(src) if(2) new /obj/item/weapon/cartridge/security(src) if(3) new /obj/item/weapon/cartridge/medical(src) if(4) new /obj/item/weapon/cartridge/head(src) new /obj/item/weapon/cartridge/signal/toxins(src) /* *Experimental PDA traitor-uplink stuff */ //Syndicate uplink hidden inside a traitor PDA /obj/item/weapon/integrated_uplink name = "uplink module" desc = "An electronic uplink system of unknown origin." icon = 'module.dmi' icon_state = "power_mod" var/uses = 10 var/obj/item/device/pda/hostpda = null var/orignote = null //Restore original notes when locked. var/active = 0 //Are we currently active?? var/menu_message = "" var/lock_code = "password" //What's the password? //Communicate with traitor through the PDA's note function. /obj/item/weapon/integrated_uplink/proc/print_to_host(var/text) if (isnull(src.hostpda)) return src.hostpda.note = text for (var/mob/M in viewers(1, src.hostpda.loc)) if (M.client && M.machine == src.hostpda) src.hostpda.attack_self(M) return //Let's build a menu! /obj/item/weapon/integrated_uplink/proc/generate_menu() src.menu_message = "Syndicate Uplink Console:
" src.menu_message += "Tele-Crystals left: [src.uses]
" src.menu_message += "
" src.menu_message += "Request item:
" src.menu_message += "Each item costs a number of tele-crystals as indicated by the number following their name.
" src.menu_message += "Chameleon-projector (4)
" src.menu_message += "Revolver (7)
" src.menu_message += "Ammo-357 for use with Revolver (2)
" src.menu_message += "Energy Crossbow (5)
" src.menu_message += "5 EMP Grenades (4)
" src.menu_message += "Voice-Changer (4)
" src.menu_message += "Chameleon Jumpsuit (3)
" src.menu_message += "Syndicate Card (3)
" src.menu_message += "Electromagnet Card (3)
" src.menu_message += "Freedom Implant (with injector) (3)
" src.menu_message += "Sleepy Pen (4)
" src.menu_message += "Cloaking Device (4)
" src.menu_message += "Energy Sword (4)
" src.menu_message += "Low-Yield Bomb (4)
" src.menu_message += "Power Sink (5)
" src.menu_message += "Detomatix Cartridge (3)
" src.menu_message += "Syndicate-made Space Suit (inludes a helmet) (3)
" src.menu_message += "
" return /obj/item/weapon/integrated_uplink/proc/unlock() if ((isnull(src.hostpda)) || (src.active)) return src.orignote = src.hostpda.note src.active = 1 src.hostpda.mode = 5 //Switch right to the notes program src.generate_menu() src.print_to_host(src.menu_message) return /obj/item/weapon/integrated_uplink/Topic(href, href_list) if ((isnull(src.hostpda)) || (!src.active)) return if (usr.stat || usr.restrained() || !in_range(src.hostpda, usr)) return if (href_list["buy_item"]) switch(href_list["buy_item"]) if("revolver") if (src.uses >= 7) src.uses -= 7 var/obj/item/weapon/gun/revolver/O = new /obj/item/weapon/gun/revolver(get_turf(src.hostpda)) O.bullets = 7 if("revolver_ammo") if (src.uses >= 2) src.uses -= 2 new /obj/item/weapon/ammo/a357(get_turf(src.hostpda)) if("xbow") if (src.uses >= 5) src.uses -= 5 new /obj/item/weapon/gun/energy/crossbow(get_turf(src.hostpda)) if("empbox") if (src.uses >= 4) src.uses -= 4 new /obj/item/weapon/storage/emp_kit(get_turf(src.hostpda)) if("voice") if (src.uses >= 4) src.uses -= 4 new /obj/item/clothing/mask/gas/voice(get_turf(src.hostpda)) if("jump") if (src.uses >= 3) src.uses -= 3 new /obj/item/clothing/under/chameleon(get_turf(src.hostpda)) if("card") if (src.uses >= 3) src.uses -= 3 new /obj/item/weapon/card/id/syndicate(get_turf(src.hostpda)) if("emag") if (src.uses >= 3) src.uses -= 3 new /obj/item/weapon/card/emag(get_turf(src.hostpda)) if("imp_freedom") if (src.uses >= 3) src.uses -= 3 var/obj/item/weapon/implanter/O = new /obj/item/weapon/implanter(get_turf(src.hostpda)) O.imp = new /obj/item/weapon/implant/freedom(O) if("sleepypen") if (src.uses >= 4) src.uses -= 4 new /obj/item/weapon/pen/sleepypen(get_turf(src.hostpda)) if("projector") if (src.uses >= 4) src.uses -= 4 new /obj/item/device/chameleon(get_turf(src.hostpda)) if("cloak") if (src.uses >= 4) src.uses -= 4 new /obj/item/weapon/cloaking_device(get_turf(src.hostpda)) if("sword") if (src.uses >= 4) src.uses -= 4 new /obj/item/weapon/sword(get_turf(src.hostpda)) if("bomb") if (src.uses >= 4) src.uses -= 4 new /obj/spawner/newbomb/timer/syndicate(get_turf(src.hostpda)) if("powersink") if (src.uses >= 5) src.uses -= 5 new /obj/item/device/powersink(get_turf(src.hostpda)) if("detomatix") if (src.uses >= 3) src.uses -= 3 new /obj/item/weapon/cartridge/syndicate(get_turf(src.hostpda)) if("space") if (src.uses >= 3) src.uses -= 3 new /obj/item/clothing/suit/space/syndicate(get_turf(src.hostpda)) new /obj/item/clothing/head/helmet/space/syndicate(get_turf(src.hostpda)) src.generate_menu() src.print_to_host(src.menu_message) return return