//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 += ""
var/count = 0
if (!src.toff)
for (var/obj/item/device/pda/P in world)
if (!P.owner)
continue
else if (P == src)
continue
else if (P.toff)
continue
dat += "- [P]"
if (istype(src.cartridge, /obj/item/weapon/cartridge/syndicate) && src.cartridge:shock_charges > 0)
dat += " (
*detonate*)"
//Honk.exe is the poor man's detomatix
if (istype(src.cartridge, /obj/item/weapon/cartridge/clown) && (src.cartridge:honk_charges > 0) && P.honkamt < 5)
dat += " (
*Send Virus*)"
dat += " "
count++
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 += "- [SO.object.name] approved by [SO.orderedby] [SO.comment ? "([SO.comment])":""]
"
dat += "
"
dat += "Current requests:
"
for(var/S in supply_shuttle_requestlist)
var/datum/supply_order/SO = S
dat += "- [SO.object.name] requested by [SO.orderedby]
"
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