From 406b72d48b12cb211390cb0c3c556c63fdd75e4b Mon Sep 17 00:00:00 2001 From: "n3ophyt3@gmail.com" Date: Wed, 5 Jan 2011 21:59:18 +0000 Subject: [PATCH] Phase 1 of PDA overhaul Moved radio-based PDA functions to a separate object embedded into the PDA carts, like how traitor PDAs have an embedded uplink Phase 2 will consist of chopping out the related menu function bits from the mass of PDA code and having them be separate, again as with the PDA uplinks One bugfix related to Phase 1 is that PDAs with a QM/Sec cart in them will no longer constantly pull focus away from the main window if you leave your PDA window open. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@784 316c924e-a436-60f5-8080-3fe189b3f50e --- code/game/objects/devices/{ => PDA}/PDA.dm | 525 +-------------------- code/game/objects/devices/PDA/cart.dm | 112 +++++ code/game/objects/devices/PDA/radio.dm | 266 +++++++++++ code/game/objects/devices/PDA/uplink.dm | 155 ++++++ tgstation.dme | 4 + 5 files changed, 560 insertions(+), 502 deletions(-) rename code/game/objects/devices/{ => PDA}/PDA.dm (71%) create mode 100644 code/game/objects/devices/PDA/cart.dm create mode 100644 code/game/objects/devices/PDA/radio.dm create mode 100644 code/game/objects/devices/PDA/uplink.dm diff --git a/code/game/objects/devices/PDA.dm b/code/game/objects/devices/PDA/PDA.dm similarity index 71% rename from code/game/objects/devices/PDA.dm rename to code/game/objects/devices/PDA/PDA.dm index 8463f0241ee..92cf9f7da4d 100644 --- a/code/game/objects/devices/PDA.dm +++ b/code/game/objects/devices/PDA/PDA.dm @@ -28,6 +28,7 @@ var/honkamt = 0 //How many honks left when infected with honk.exe var/mimeamt = 0 //How many silence left when infected with mime.exe var/note = "Congratulations, your station has chosen the Thinktronic 5100 Personal Data Assistant!" //Current note in the notepad function. + var/rad = "" //A place to stick the radio menu var/datum/data/record/active1 = null //General var/datum/data/record/active2 = null //Medical var/datum/data/record/active3 = null //Security @@ -52,6 +53,7 @@ /obj/item/device/pda/janitor default_cartridge = /obj/item/weapon/cartridge/janitor icon_state = "pda-j" + ttone = "slip" /obj/item/device/pda/toxins default_cartridge = /obj/item/weapon/cartridge/signal/toxins @@ -92,339 +94,8 @@ /obj/item/device/pda/chaplain icon_state = "pda-holy" + ttone = "God" -/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_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 - - // 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 - -/obj/item/weapon/cartridge/mime - name = "Gestur-O 1000" - icon_state = "cart-mi" - access_mime = 1 - var/mime_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 /* @@ -882,14 +553,14 @@ Frequency: - - -[format_frequency(src.cartridge:frequency)] +[format_frequency(src.cartridge.radio:frequency)] + +

Code: - - -[src.cartridge:code] +[src.cartridge.radio:code] + +
"} @@ -931,7 +602,7 @@ Code: if(12) // Quartermaster mulebot control - var/obj/item/weapon/cartridge/quartermaster/QC = cartridge + var/obj/item/radio/integrated/mule/QC = cartridge.radio if(!QC) dat += "Interlink Error - Please reinsert cartridge." return @@ -992,7 +663,7 @@ Code: dat += "
Return to bot list" if(13) // Security Bot control - var/obj/item/weapon/cartridge/security/SC = cartridge + var/obj/item/radio/integrated/beepsky/SC = cartridge.radio if(!SC) dat += "Interlink Error - Please reinsert cartridge." return @@ -1320,8 +991,11 @@ Code: src.scanmode = 0 src.mmode = 0 src.smode = 0 + if (src.cartridge.radio) + src.cartridge.radio.hostpda = null 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 @@ -1349,21 +1023,21 @@ Code: //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]." + if((R.part1.code == src.cartridge.radio:code) && (R.part1.frequency == src.cartridge.radio:frequency)) + bombers += "[key_name(usr)] has activated a radio bomb (Freq: [format_frequency(src.cartridge.radio:frequency)], Code: [src.cartridge.radio:code]). Temp = [R.part3.air_contents.temperature-T0C]." spawn( 0 ) - src.cartridge:send_signal("ACTIVATE") + src.cartridge.radio: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) + var/new_frequency = sanitize_frequency(src.cartridge.radio:frequency + text2num(href_list["sfreq"])) + src.cartridge.radio: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) + src.cartridge.radio:code += text2num(href_list["scode"]) + src.cartridge.radio:code = round(src.cartridge.radio:code) + src.cartridge.radio:code = min(100, src.cartridge.radio:code) + src.cartridge.radio:code = max(1, src.cartridge.radio:code) else if (href_list["statdisp"] && cartridge && cartridge.access_status_display) @@ -1422,13 +1096,15 @@ Code: C.loc = src user << "\blue You insert [C] into [src]." src.cartridge = C + if (C:radio) + C:radio.hostpda = src src.updateUsrDialog() else if (istype(C, /obj/item/weapon/card/id) && C:registered) if(!src.owner) src.owner = C:registered src.ownjob = C:assignment - src.name = "PDA-[src.owner]([src.ownjob])" + src.name = "PDA-[src.owner] ([src.ownjob])" user << "\blue Card scanned." src.updateSelfDialog() return @@ -1442,7 +1118,7 @@ Code: return if((src.owner == C:registered) && (src.ownjob != C:assignment)) src.ownjob = C:assignment - src.name = "PDA-[src.owner]([src.ownjob])" + src.name = "PDA-[src.owner] ([src.ownjob])" user << "\blue Rank updated." src.updateSelfDialog() return @@ -1639,158 +1315,3 @@ Code: */ //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 (5)
" - src.menu_message += "Cloaking Device (4)
" - src.menu_message += "Energy Sword (4)
" - src.menu_message += "Plastic Explosives (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 += "Binary Translator (4)
" - 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 >= 5) - src.uses -= 5 - 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/item/weapon/plastique(get_turf(src.hostpda)) - new /obj/item/weapon/plastique(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)) - if("botchat") - if (src.uses >= 4) - src.uses -= 4 - new /obj/item/device/radio/headset/traitor(get_turf(src.hostpda)) - - src.generate_menu() - src.print_to_host(src.menu_message) - return - - return \ No newline at end of file diff --git a/code/game/objects/devices/PDA/cart.dm b/code/game/objects/devices/PDA/cart.dm new file mode 100644 index 00000000000..b4979ca7120 --- /dev/null +++ b/code/game/objects/devices/PDA/cart.dm @@ -0,0 +1,112 @@ +/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 = 0 + 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 + +/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 + + New() + ..() + spawn(5) + radio = new /obj/item/radio/integrated/beepsky(src) + +/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 + +/obj/item/weapon/cartridge/mime + name = "Gestur-O 1000" + icon_state = "cart-mi" + access_mime = 1 + var/mime_charges = 5 + +/obj/item/weapon/cartridge/signal + name = "generic signaler cartridge" + desc = "A data cartridge with an integrated radio signaler module." + + New() + ..() + spawn(5) + radio = new /obj/item/radio/integrated/signal(src) + +/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/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) + +/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/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 \ No newline at end of file diff --git a/code/game/objects/devices/PDA/radio.dm b/code/game/objects/devices/PDA/radio.dm new file mode 100644 index 00000000000..286c66cb006 --- /dev/null +++ b/code/game/objects/devices/PDA/radio.dm @@ -0,0 +1,266 @@ +/obj/item/radio/integrated + name = "PDA radio module" + desc = "An electronic radio system of nanotrasen origin." + icon = 'module.dmi' + icon_state = "power_mod" + var/obj/item/device/pda/hostpda = null + +// var/active = 0 //Are we currently active?? + var/menu_message = "" + + New() + ..() + if (istype(loc.loc, /obj/item/device/pda)) + hostpda = loc.loc + + 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) + + proc/print_to_host(var/text) + if (isnull(src.hostpda)) + return + src.hostpda.rad = text + + for (var/mob/M in viewers(1, src.hostpda.loc)) + if (M.client && M.machine == src.hostpda) + src.hostpda.attack_self(M) + + return + + proc/generate_menu() + +/obj/item/radio/integrated/beepsky + 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.hostpda + + 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 + + + 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) + PDA.updateSelfDialog() + +/obj/item/radio/integrated/mule + 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.hostpda + 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 + + + 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") + PDA.updateSelfDialog() + + + +/* + * Radio Cartridge, essentially a signaler. + */ + + +/obj/item/radio/integrated/signal + var/frequency = 1457 + var/code = 30.0 + var/last_transmission + var/datum/radio_frequency/radio_connection + + New() + ..() + if(radio_controller) + initialize() + + initialize() + if (src.frequency < 1441 || src.frequency > 1489) + src.frequency = sanitize_frequency(src.frequency) + + set_frequency(frequency) + + proc/set_frequency(new_frequency) + radio_controller.remove_object(src, "[frequency]") + frequency = new_frequency + radio_connection = radio_controller.add_object(src, "[frequency]") + + 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 diff --git a/code/game/objects/devices/PDA/uplink.dm b/code/game/objects/devices/PDA/uplink.dm new file mode 100644 index 00000000000..795c193d477 --- /dev/null +++ b/code/game/objects/devices/PDA/uplink.dm @@ -0,0 +1,155 @@ +/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 (5)
" + src.menu_message += "Cloaking Device (4)
" + src.menu_message += "Energy Sword (4)
" + src.menu_message += "Plastic Explosives (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 += "Binary Translator (4)
" + 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 >= 5) + src.uses -= 5 + 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/item/weapon/plastique(get_turf(src.hostpda)) + new /obj/item/weapon/plastique(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)) + if("botchat") + if (src.uses >= 4) + src.uses -= 4 + new /obj/item/device/radio/headset/traitor(get_turf(src.hostpda)) + + src.generate_menu() + src.print_to_host(src.menu_message) + return + + return \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index 27aab71a667..7dc190d5e15 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -65,6 +65,7 @@ #define FILE_DIR "code/game/objects/closets" #define FILE_DIR "code/game/objects/closets/secure" #define FILE_DIR "code/game/objects/devices" +#define FILE_DIR "code/game/objects/devices/PDA" #define FILE_DIR "code/game/objects/items" #define FILE_DIR "code/game/objects/items/weapons" #define FILE_DIR "code/game/objects/radio" @@ -505,6 +506,9 @@ #include "code\game\objects\devices\shields.dm" #include "code\game\objects\devices\taperecorder.dm" #include "code\game\objects\devices\timer.dm" +#include "code\game\objects\devices\PDA\cart.dm" +#include "code\game\objects\devices\PDA\radio.dm" +#include "code\game\objects\devices\PDA\uplink.dm" #include "code\game\objects\items\apc_frame.dm" #include "code\game\objects\items\assemblies.dm" #include "code\game\objects\items\blueprints.dm"