/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 += "- [SO.object.name] approved by [SO.orderedby] [SO.comment ? "([SO.comment])":""]
"
menu += "
"
menu += "Current requests:
"
for(var/S in supply_shuttle_requestlist)
var/datum/supply_order/SO = S
menu += "- [SO.object.name] requested by [SO.orderedby]
"
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)