/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/obj/item/radio/integrated/radio = null var/access_security = 0 var/access_engine = 0 var/access_medical = 0 var/access_manifest = 1 var/access_clown = 0 var/access_mime = 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 var/mode = null var/menu var/datum/data/record/active1 = null //General var/datum/data/record/active2 = null //Medical var/datum/data/record/active3 = null //Security var/obj/machinery/power/monitor/powmonitor = null // Power Monitor var/list/powermonitors = list() var/message1 // used for status_displays var/message2 engineering name = "Power-ON Cartridge" icon_state = "cart-e" access_engine = 1 medical name = "Med-U Cartridge" icon_state = "cart-m" access_medical = 1 security name = "R.O.B.U.S.T. Cartridge" icon_state = "cart-s" access_security = 1 New() ..() spawn(5) radio = new /obj/item/radio/integrated/beepsky(src) detective name = "D.E.T.E.C.T. Cartridge" icon_state = "cart-s" access_security = 1 access_medical = 1 janitor name = "CustodiPRO Cartridge" desc = "The ultimate in clean-room design." icon_state = "cart-j" access_janitor = 1 clown name = "Honkworks 5.0" icon_state = "cart-clown" access_clown = 1 var/honk_charges = 5 mime name = "Gestur-O 1000" icon_state = "cart-mi" access_mime = 1 var/mime_charges = 5 signal name = "generic signaler cartridge" desc = "A data cartridge with an integrated radio signaler module." toxins name = "Signal Ace 2" desc = "Complete with integrated radio signaler!" icon_state = "cart-tox" access_reagent_scanner = 1 New() ..() spawn(5) radio = new /obj/item/radio/integrated/signal(src) quartermaster name = "Space Parts & Space Vendors Cartridge" desc = "Perfect for the Quartermaster on the go!" icon_state = "cart-q" access_quartermaster = 1 New() ..() spawn(5) radio = new /obj/item/radio/integrated/mule(src) head name = "Easy-Record DELUXE" icon_state = "cart-h" access_status_display = 1 hop name = "HumanResources9001" icon_state = "cart-h" access_status_display = 1 access_quartermaster = 1 New() ..() spawn(5) radio = new /obj/item/radio/integrated/mule(src) hos name = "R.O.B.U.S.T. DELUXE" icon_state = "cart-hos" access_status_display = 1 access_security = 1 New() ..() spawn(5) radio = new /obj/item/radio/integrated/beepsky(src) ce name = "Power-On DELUXE" icon_state = "cart-ce" access_status_display = 1 access_engine = 1 cmo name = "Med-U DELUXE" icon_state = "cart-cmo" access_status_display = 1 access_medical = 1 rd name = "Signal Ace DELUXE" icon_state = "cart-rd" access_status_display = 1 access_reagent_scanner = 1 New() ..() spawn(5) radio = new /obj/item/radio/integrated/signal(src) captain name = "Value-PAK Cartridge" desc = "Now with 200% more value!" icon_state = "cart-c" access_engine = 1 access_security = 1 access_medical = 1 access_reagent_scanner = 1 access_status_display = 1 syndicate name = "Detomatix Cartridge" icon_state = "cart" access_remote_door = 1 access_manifest = 0 remote_door_id = "syndicate" //Make sure this matches the syndicate shuttle's shield/door id!! var/shock_charges = 4 proc/unlock() if (!istype(loc, /obj/item/device/pda)) return generate_menu() print_to_host(menu) return proc/print_to_host(var/text) if (!istype(loc, /obj/item/device/pda)) return loc:cart = text for (var/mob/M in viewers(1, loc.loc)) if (M.client && M.machine == loc) loc:attack_self(M) return 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) proc/generate_menu() switch(mode) if(40) //signaller menu = "

Remote Signaling System

" menu += {" Send Signal
Frequency: - - [format_frequency(radio:frequency)] + +

Code: - - [radio:code] + +
"} if (41) //crew manifest menu = "

Crew Manifest

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

" for (var/datum/data/record/t in data_core.general) menu += "[t.fields["name"]] - [t.fields["rank"]]
" menu += "
" if (42) //status displays menu = "

Station Status Display Interlink

" menu += "\[ Clear \]
" menu += "\[ Shuttle ETA \]
" menu += "\[ Message \]" menu += "
" menu += "\[ Alert: None |" menu += " Red Alert |" menu += " Lockdown |" menu += " Biohazard \]
" if (43) //Muskets' and Rockdtben's power monitor :D menu = "

Power Monitors - Please select one


" powmonitor = null powermonitors = null powermonitors = list() var/powercount = 0 for(var/obj/machinery/power/monitor/pMon in world) if(!(pMon.stat & (NOPOWER|BROKEN)) ) powercount++ powermonitors += pMon if(!powercount) menu += "\red No connection
" else menu += "" var/count = 0 for(var/obj/machinery/power/monitor/pMon in powermonitors) count++ menu += " [pMon]
" menu += "
" if (433) //Muskets' and Rockdtben's power monitor :D menu = "

Power Monitor


" if(!powmonitor) menu += "\red No connection
" else var/list/L = list() for(var/obj/machinery/power/terminal/term in powmonitor.powernet.nodes) if(istype(term.master, /obj/machinery/power/apc)) var/obj/machinery/power/apc/A = term.master L += A menu += "
Total power: [powmonitor.powernet.avail] W
Total load: [num2text(powmonitor.powernet.viewload,10)] W
" menu += "" if(L.len > 0) menu += "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) menu += copytext(add_tspace(A.area.name, 30), 1, 30) menu += " [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"]
" menu += "
" if (44) //medical records //This thing only displays a single screen so it's hard to really get the sub-menu stuff working. menu = "

Medical Record List

" for (var/datum/data/record/R in data_core.general) menu += "[R.fields["id"]]: [R.fields["name"]]
" menu += "
" if(441) menu = "

Medical Record

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

Medical Data

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

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

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

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

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

" menu += "Important Notes: [active2.fields["notes"]]
" else menu += "Record Lost!
" menu += "
" if (45) //security records menu = "

Security Record List

" for (var/datum/data/record/R in data_core.general) menu += "
[R.fields["id"]]: [R.fields["name"]]
" menu += "
" if(451) menu = "

Security Record

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

Security Data

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

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

" menu += "Important Notes:
" menu += "[active3.fields["notes"]]" else menu += "Record Lost!
" menu += "
" if (46) //beepsky control var/obj/item/radio/integrated/beepsky/SC = radio if(!SC) menu = "Interlink Error - Please reinsert cartridge." return menu = "

Securitron Interlink

" if(!SC.active) // list of bots if(!SC.botlist || (SC.botlist && SC.botlist.len==0)) menu += "No bots found.
" else for(var/obj/machinery/bot/secbot/B in SC.botlist) menu += "
[B] at [B.loc.loc]
" menu += "
Scan for active bots
" else // bot selected, control it menu += "[SC.active]
Status: (refresh)
" if(!SC.botstatus) menu += "Waiting for response...
" else menu += "Location: [SC.botstatus["loca"] ]
" menu += "Mode: " switch(SC.botstatus["mode"]) if(0) menu += "Ready" if(1) menu += "Apprehending target" if(2,3) menu += "Arresting target" if(4) menu += "Starting patrol" if(5) menu += "On patrol" if(6) menu += "Responding to summons" menu += "
\[Stop Patrol\] " menu += "\[Start Patrol\] " menu += "\[Summon Bot\]
" menu += "
Return to bot list" if (47) //quartermaster order records menu = "

Supply Record Interlink

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

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

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

" menu += "\[Stop\] " menu += "\[Proceed\] " menu += "\[Return Home\]
" menu += "
Return to bot list" if (49) //janitorial locator menu = "

Persistent Custodial Object Locator

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

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) menu += "None" else menu += "[ldat]" menu += "

Located Mop Buckets:

" ldat = null for (var/obj/structure/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]/100
" if (!ldat) menu += "None" else menu += "[ldat]" menu += "

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) menu += "None" else menu += "[ldat]" else menu += "ERROR: Unable to determine current location." /obj/item/weapon/cartridge/Topic(href, href_list) ..() if (usr.stat || usr.restrained() || !in_range(loc, usr)) usr.machine = null usr << browse(null, "window=pda") return switch(href_list["choice"]) if("Medical Records") var/datum/data/record/R = locate(href_list["target"]) var/datum/data/record/M = locate(href_list["target"]) loc:mode = 441 mode = 441 if (R in data_core.general) for (var/datum/data/record/E in data_core.medical) if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) M = E break active1 = R active2 = M if("Security Records") var/datum/data/record/R = locate(href_list["target"]) var/datum/data/record/S = locate(href_list["target"]) loc:mode = 451 mode = 451 if (R in data_core.general) for (var/datum/data/record/E in data_core.security) if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) S = E break active1 = R active3 = S if("Send Signal") spawn( 0 ) radio:send_signal("ACTIVATE") return if("Signal Frequency") var/new_frequency = sanitize_frequency(radio:frequency + text2num(href_list["sfreq"])) radio:set_frequency(new_frequency) if("Signal Code") radio:code += text2num(href_list["scode"]) radio:code = round(radio:code) radio:code = min(100, radio:code) radio:code = max(1, radio:code) if("Status") switch(href_list["statdisp"]) if("message") post_status("message", message1, message2) if("alert") post_status("alert", href_list["alert"]) if("setmsg1") message1 = input("Line 1", "Enter Message Text", message1) as text|null updateSelfDialog() if("setmsg2") message2 = input("Line 2", "Enter Message Text", message2) as text|null updateSelfDialog() else post_status(href_list["statdisp"]) if("Power Select") var/pnum = text2num(href_list["target"]) powmonitor = powermonitors[pnum] loc:mode = 433 mode = 433 generate_menu() print_to_host(menu)