diff --git a/code/game/objects/items/devices/communicator/UI.dm b/code/game/objects/items/devices/communicator/UI.dm
index a4686e39de..867d7956ef 100644
--- a/code/game/objects/items/devices/communicator/UI.dm
+++ b/code/game/objects/items/devices/communicator/UI.dm
@@ -124,14 +124,6 @@
data["latest_news"] = get_recent_news()
if(newsfeed_channel)
data["target_feed"] = data["feeds"][newsfeed_channel]
- if(cartridge) // If there's a cartridge, we need to grab the information from it
- data["cart_devices"] = cartridge.get_device_status()
- data["cart_templates"] = cartridge.ui_templates
- for(var/list/L in cartridge.get_data())
- data[L["field"]] = L["value"]
- // cartridge.get_data() returns a list of tuples:
- // The field element is the tag used to access the information by the template
- // The value element is the actual data, and can take any form necessary for the template
// update the ui if it exists, returns null if no ui is passed/found
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
@@ -278,15 +270,8 @@
fon = !fon
set_light(fon * flum)
- if(href_list["toggle_device"])
- var/obj/O = cartridge.internal_devices[text2num(href_list["toggle_device"])]
- cartridge.active_devices ^= list(O) // Exclusive or, will toggle its presence
-
if(href_list["newsfeed"])
newsfeed_channel = text2num(href_list["newsfeed"])
- if(href_list["cartridge_topic"] && cartridge) // Has to have a cartridge to perform these functions
- cartridge.Topic(href, href_list)
-
SSnanoui.update_uis(src)
add_fingerprint(usr)
diff --git a/code/game/objects/items/devices/communicator/cartridge.dm b/code/game/objects/items/devices/communicator/cartridge.dm
deleted file mode 100644
index 120df593e9..0000000000
--- a/code/game/objects/items/devices/communicator/cartridge.dm
+++ /dev/null
@@ -1,952 +0,0 @@
-// Communicator peripheral devices
-// Internal devices that attack() can be relayed to
-// Additional UI menus for added functionality
-/obj/item/weapon/commcard
- name = "generic commcard"
- desc = "A peripheral plug-in for personal communicators."
- icon = 'icons/obj/pda.dmi'
- icon_state = "cart"
- item_state = "electronic"
- w_class = ITEMSIZE_TINY
-
- var/list/internal_devices = list() // Devices that can be toggled on to trigger on attack()
- var/list/active_devices = list() // Devices that will be triggered on attack()
- var/list/ui_templates = list() // List of ui templates the commcard can access
- var/list/internal_data = list() // Data that shouldn't be updated every time nanoUI updates, or needs to persist between updates
-
-
-/obj/item/weapon/commcard/proc/get_device_status()
- var/list/L = list()
- var/i = 1
- for(var/obj/I in internal_devices)
- if(I in active_devices)
- L[++L.len] = list("name" = "\proper[I.name]", "active" = 1, "index" = i++)
- else
- L[++L.len] = list("name" = I.name, "active" = 0, "index" = i++)
- return L
-
-
-// cartridge.get_data() returns a list of tuples:
-// The field element is the tag used to access the information by the template
-// The value element is the actual data, and can take any form necessary for the template
-/obj/item/weapon/commcard/proc/get_data()
- return list()
-
-// Handles cartridge-specific functions
-// The helper.link() MUST HAVE 'cartridge_topic' passed into the href in order for cartridge functions to be processed.
-// Doesn't matter what the value of it is for now, it's just a flag to say, "Hey, there's cartridge data to change!"
-/obj/item/weapon/commcard/Topic(href, href_list)
-
- // Signalers
- if(href_list["signaler_target"])
-
- var/obj/item/device/assembly/signaler/S = locate(href_list["signaler_target"]) // Should locate the correct signaler
-
- if(!istype(S)) // Ref is no longer valid
- return
-
- if(S.loc != src) // No longer within the cartridge
- return
-
- switch(href_list["signaler_action"])
- if("Pulse")
- S.activate()
-
- if("Edit")
- var/mob/user = locate(href_list["user"])
- if(!istype(user)) // Ref no longer valid
- return
-
- var/newVal = input(user, "Input a new [href_list["signaler_value"]].", href_list["signaler_value"], (href_list["signaler_value"] == "Code" ? S.code : S.frequency)) as num|null
- if(newVal)
- switch(href_list["signaler_value"])
- if("Code")
- S.code = newVal
-
- if("Frequency")
- S.frequency = newVal
-
- // Refresh list of powernet sensors
- if(href_list["powernet_refresh"])
- internal_data["grid_sensors"] = find_powernet_sensors()
-
- // Load apc's on targeted powernet
- if(href_list["powernet_target"])
- internal_data["powernet_target"] = href_list["powernet_target"]
-
- // GPS units
- if(href_list["gps_target"])
- var/obj/item/device/gps/G = locate(href_list["gps_target"])
-
- if(!istype(G)) // Ref is no longer valid
- return
-
- if(G.loc != src) // No longer within the cartridge
- return
-
- switch(href_list["gps_action"])
- if("Power")
- G.tracking = text2num(href_list["value"])
-
- if("Long_Range")
- G.local_mode = text2num(href_list["value"])
-
- if("Hide_Signal")
- G.hide_signal = text2num(href_list["value"])
-
- if("Tag")
- var/mob/user = locate(href_list["user"])
- if(!istype(user)) // Ref no longer valid
- return
-
- var/newTag = input(user, "Please enter desired tag.", G.tag) as text|null
-
- if(newTag)
- G.tag = newTag
-
- if(href_list["active_category"])
- internal_data["supply_category"] = href_list["active_category"]
-
- // Supply topic
- // Copied from /obj/machinery/computer/supplycomp/Topic()
- // code\game\machinery\computer\supply.dm, line 188
- // Unfortunately, in order to support complete functionality, the whole thing is necessary
- if(href_list["pack_ref"])
- var/datum/supply_pack/S = locate(href_list["pack_ref"])
-
- // Invalid ref
- if(!istype(S))
- return
-
- // Expand the supply pack's contents
- if(href_list["expand"])
- internal_data["supply_pack_expanded"] ^= S
-
- // Make a request for the pack
- if(href_list["request"])
- var/mob/user = locate(href_list["user"])
- if(!istype(user)) // Invalid ref
- return
-
- if(world.time < internal_data["supply_reqtime"])
- visible_message("[src] flashes, \"[internal_data["supply_reqtime"] - world.time] seconds remaining until another requisition form may be printed.\"")
- return
-
- var/timeout = world.time + 600
- var/reason = sanitize(input(user, "Reason:","Why do you require this item?","") as null|text)
- if(world.time > timeout)
- to_chat(user, "Error. Request timed out.")
- return
- if(!reason)
- return
-
- SSsupply.create_order(S, user, reason)
- internal_data["supply_reqtime"] = (world.time + 5) % 1e5
-
- if(href_list["order_ref"])
- var/datum/supply_order/O = locate(href_list["order_ref"])
-
- // Invalid ref
- if(!istype(O))
- return
-
- var/mob/user = locate(href_list["user"])
- if(!istype(user)) // Invalid ref
- return
-
- if(href_list["edit"])
- var/new_val = sanitize(input(user, href_list["edit"], "Enter the new value for this field:", href_list["default"]) as null|text)
- if(!new_val)
- return
-
- switch(href_list["edit"])
- if("Supply Pack")
- O.name = new_val
-
- if("Cost")
- var/num = text2num(new_val)
- if(num)
- O.cost = num
-
- if("Index")
- var/num = text2num(new_val)
- if(num)
- O.index = num
-
- if("Reason")
- O.comment = new_val
-
- if("Ordered by")
- O.ordered_by = new_val
-
- if("Ordered at")
- O.ordered_at = new_val
-
- if("Approved by")
- O.approved_by = new_val
-
- if("Approved at")
- O.approved_at = new_val
-
- if(href_list["approve"])
- SSsupply.approve_order(O, user)
-
- if(href_list["deny"])
- SSsupply.deny_order(O, user)
-
- if(href_list["delete"])
- SSsupply.delete_order(O, user)
-
- if(href_list["clear_all_requests"])
- var/mob/user = locate(href_list["user"])
- if(!istype(user)) // Invalid ref
- return
-
- SSsupply.deny_all_pending(user)
-
- if(href_list["export_ref"])
- var/datum/exported_crate/E = locate(href_list["export_ref"])
-
- // Invalid ref
- if(!istype(E))
- return
-
- var/mob/user = locate(href_list["user"])
- if(!istype(user)) // Invalid ref
- return
-
- if(href_list["index"])
- var/list/L = E.contents[href_list["index"]]
-
- if(href_list["edit"])
- var/field = alert(user, "Select which field to edit", , "Name", "Quantity", "Value")
-
- var/new_val = sanitize(input(user, href_list["edit"], "Enter the new value for this field:", href_list["default"]) as null|text)
- if(!new_val)
- return
-
- switch(field)
- if("Name")
- L["object"] = new_val
-
- if("Quantity")
- var/num = text2num(new_val)
- if(num)
- L["quantity"] = num
-
- if("Value")
- var/num = text2num(new_val)
- if(num)
- L["value"] = num
-
- if(href_list["delete"])
- E.contents.Cut(href_list["index"], href_list["index"] + 1)
-
- // Else clause means they're editing/deleting the whole export report, rather than a specific item in it
- else if(href_list["edit"])
- var/new_val = sanitize(input(user, href_list["edit"], "Enter the new value for this field:", href_list["default"]) as null|text)
- if(!new_val)
- return
-
- switch(href_list["edit"])
- if("Name")
- E.name = new_val
-
- if("Value")
- var/num = text2num(new_val)
- if(num)
- E.value = num
-
- else if(href_list["delete"])
- SSsupply.delete_export(E, user)
-
- else if(href_list["add_item"])
- SSsupply.add_export_item(E, user)
-
- if(SSsupply && SSsupply.shuttle)
- switch(href_list["send_shuttle"])
- if("send_away")
- if(SSsupply.shuttle.forbidden_atoms_check())
- to_chat(usr, "For safety reasons the automated supply shuttle cannot transport live organisms, classified nuclear weaponry or homing beacons.")
- else
- SSsupply.shuttle.launch(src)
- to_chat(usr, "Initiating launch sequence.")
-
- if("send_to_station")
- SSsupply.shuttle.launch(src)
- to_chat(usr, "The supply shuttle has been called and will arrive in approximately [round(SSsupply.movetime/600,1)] minutes.")
-
- if("cancel_shuttle")
- SSsupply.shuttle.cancel_launch(src)
-
- if("force_shuttle")
- SSsupply.shuttle.force_launch(src)
-
- // Status display
- switch(href_list["stat_display"])
- if("message")
- post_status("message", internal_data["stat_display_line1"], internal_data["stat_display_line2"])
- internal_data["stat_display_special"] = "message"
- if("alert")
- post_status("alert", href_list["alert"])
- internal_data["stat_display_special"] = href_list["alert"]
- if("setmsg")
- internal_data["stat_display_line[href_list["line"]]"] = reject_bad_text(sanitize(input("Line 1", "Enter Message Text", internal_data["stat_display_line[href_list["line"]]"]) as text|null, 40), 40)
- else
- post_status(href_list["stat_display"])
- internal_data["stat_display_special"] = href_list["stat_display"]
-
- // Merc shuttle blast door controls
- switch(href_list["all_blast_doors"])
- if("open")
- for(var/obj/machinery/door/blast/B in internal_data["shuttle_doors"])
- B.open()
- if("close")
- for(var/obj/machinery/door/blast/B in internal_data["shuttle_doors"])
- B.close()
-
- if(href_list["scan_blast_doors"])
- internal_data["shuttle_doors"] = find_blast_doors()
-
- if(href_list["toggle_blast_door"])
- var/obj/machinery/door/blast/B = locate(href_list["toggle_blast_door"])
- if(!B)
- return
- spawn(0)
- if(B.density)
- B.open()
- else
- B.close()
-
-
-// Updates status displays with a new message
-// Copied from /obj/item/weapon/cartridge/proc/post_status(),
-// code/game/objects/items/devices/PDA/cart.dm, line 251
-/obj/item/weapon/commcard/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 = TRANSMISSION_RADIO
- status_signal.data["command"] = command
-
- switch(command)
- if("message")
- status_signal.data["msg1"] = data1
- status_signal.data["msg2"] = data2
- internal_data["stat_display_active1"] = data1 // Update the internally stored message, we won't get receive_signal if we're the sender
- internal_data["stat_display_active2"] = data2
- if(loc)
- var/obj/item/PDA = loc
- var/mob/user = PDA.fingerprintslast
- log_admin("STATUS: [user] set status screen with [src]. Message: [data1] [data2]")
- message_admins("STATUS: [user] set status screen with [src]. Message: [data1] [data2]")
-
- if("alert")
- status_signal.data["picture_state"] = data1
-
- frequency.post_signal(src, status_signal)
-
-// Receives updates by external devices to the status displays
-/obj/item/weapon/commcard/receive_signal(var/datum/signal/signal, var/receive_method, var/receive_param)
- internal_data["stat_display_special"] = signal.data["command"]
- switch(signal.data["command"])
- if("message")
- internal_data["stat_display_active1"] = signal.data["msg1"]
- internal_data["stat_display_active2"] = signal.data["msg2"]
- if("alert")
- internal_data["stat_display_special"] = signal.data["picture_state"]
-
-
-///////////////////////////
-// SUBTYPES
-///////////////////////////
-
-
-// Engineering Cartridge:
-// Devices
-// *- Halogen Counter
-// Templates
-// *- Power Monitor
-/obj/item/weapon/commcard/engineering
- name = "\improper Power-ON cartridge"
- icon_state = "cart-e"
- ui_templates = list(list("name" = "Power Monitor", "template" = "comm_power_monitor.tmpl"))
-
-/obj/item/weapon/commcard/engineering/New()
- ..()
- internal_devices |= new /obj/item/device/halogen_counter(src)
-
-/obj/item/weapon/commcard/engineering/Initialize()
- internal_data["grid_sensors"] = find_powernet_sensors()
- internal_data["powernet_target"] = ""
-
-/obj/item/weapon/commcard/engineering/get_data()
- return list(
- list("field" = "powernet_monitoring", "value" = get_powernet_monitoring_list()),
- list("field" = "powernet_target", "value" = get_powernet_target(internal_data["powernet_target"]))
- )
-
-// Atmospherics Cartridge:
-// Devices
-// *- Gas scanner
-/obj/item/weapon/commcard/atmos
- name = "\improper BreatheDeep cartridge"
- icon_state = "cart-a"
-
-/obj/item/weapon/commcard/atmos/New()
- ..()
- internal_devices |= new /obj/item/device/analyzer(src)
-
-
-// Medical Cartridge:
-// Devices
-// *- Halogen Counter
-// *- Health Analyzer
-// Templates
-// *- Medical Records
-/obj/item/weapon/commcard/medical
- name = "\improper Med-U cartridge"
- icon_state = "cart-m"
- ui_templates = list(list("name" = "Medical Records", "template" = "med_records.tmpl"))
-
-/obj/item/weapon/commcard/medical/New()
- ..()
- internal_devices |= new /obj/item/device/healthanalyzer(src)
- internal_devices |= new /obj/item/device/halogen_counter(src)
-
-/obj/item/weapon/commcard/medical/get_data()
- return list(list("field" = "med_records", "value" = get_med_records()))
-
-
-// Chemistry Cartridge:
-// Devices
-// *- Halogen Counter
-// *- Health Analyzer
-// *- Reagent Scanner
-// Templates
-// *- Medical Records
-/obj/item/weapon/commcard/medical/chemistry
- name = "\improper ChemWhiz cartridge"
- icon_state = "cart-chem"
-
-/obj/item/weapon/commcard/medical/chemistry/New()
- ..()
- internal_devices |= new /obj/item/device/reagent_scanner(src)
-
-
-// Detective Cartridge:
-// Devices
-// *- Halogen Counter
-// *- Health Analyzer
-// Templates
-// *- Medical Records
-// *- Security Records
-/obj/item/weapon/commcard/medical/detective
- name = "\improper D.E.T.E.C.T. cartridge"
- icon_state = "cart-s"
- ui_templates = list(
- list("name" = "Medical Records", "template" = "med_records.tmpl"),
- list("name" = "Security Records", "template" = "sec_records.tmpl")
- )
-
-/obj/item/weapon/commcard/medical/detective/get_data()
- var/list/data = ..()
- data[++data.len] = list("field" = "sec_records", "value" = get_sec_records())
- return data
-
-
-// Internal Affairs Cartridge:
-// Templates
-// *- Security Records
-// *- Employment Records
-/obj/item/weapon/commcard/int_aff
- name = "\improper P.R.O.V.E. cartridge"
- icon_state = "cart-s"
- ui_templates = list(
- list("name" = "Employment Records", "template" = "emp_records.tmpl"),
- list("name" = "Security Records", "template" = "sec_records.tmpl")
- )
-
-/obj/item/weapon/commcard/int_aff/get_data()
- return list(
- list("field" = "emp_records", "value" = get_emp_records()),
- list("field" = "sec_records", "value" = get_sec_records())
- )
-
-
-// Security Cartridge:
-// Templates
-// *- Security Records
-// *- Security Bot Access
-/obj/item/weapon/commcard/security
- name = "\improper R.O.B.U.S.T. cartridge"
- icon_state = "cart-s"
- ui_templates = list(
- list("name" = "Security Records", "template" = "sec_records.tmpl"),
- list("name" = "Security Bot Control", "template" = "sec_bot_access.tmpl")
- )
-
-/obj/item/weapon/commcard/security/get_data()
- return list(
- list("field" = "sec_records", "value" = get_sec_records()),
- list("field" = "sec_bot_access", "value" = get_sec_bot_access())
- )
-
-
-// Janitor Cartridge:
-// Templates
-// *- Janitorial Locator Magicbox
-/obj/item/weapon/commcard/janitor
- name = "\improper CustodiPRO cartridge"
- desc = "The ultimate in clean-room design."
- ui_templates = list(
- list("name" = "Janitorial Supply Locator", "template" = "janitorialLocator.tmpl")
- )
-
-/obj/item/weapon/commcard/janitor/get_data()
- return list(
- list("field" = "janidata", "value" = get_janitorial_locations())
- )
-
-
-// Signal Cartridge:
-// Devices
-// *- Signaler
-// Templates
-// *- Signaler Access
-/obj/item/weapon/commcard/signal
- name = "generic signaler cartridge"
- desc = "A data cartridge with an integrated radio signaler module."
- ui_templates = list(
- list("name" = "Integrated Signaler Control", "template" = "signaler_access.tmpl")
- )
-
-/obj/item/weapon/commcard/signal/New()
- ..()
- internal_devices |= new /obj/item/device/assembly/signaler(src)
-
-/obj/item/weapon/commcard/signal/get_data()
- return list(
- list("field" = "signaler_access", "value" = get_int_signalers())
- )
-
-
-// Science Cartridge:
-// Devices
-// *- Signaler
-// *- Reagent Scanner
-// *- Gas Scanner
-// Templates
-// *- Signaler Access
-/obj/item/weapon/commcard/signal/science
- name = "\improper Signal Ace 2 cartridge"
- desc = "Complete with integrated radio signaler!"
- icon_state = "cart-tox"
- // UI templates inherited
-
-/obj/item/weapon/commcard/signal/science/New()
- ..()
- internal_devices |= new /obj/item/device/reagent_scanner(src)
- internal_devices |= new /obj/item/device/analyzer(src)
-
-
-// Supply Cartridge:
-// Templates
-// *- Supply Records
-/obj/item/weapon/commcard/supply
- name = "\improper Space Parts & Space Vendors cartridge"
- desc = "Perfect for the Quartermaster on the go!"
- icon_state = "cart-q"
- ui_templates = list(
- list("name" = "Supply Records", "template" = "supply_records.tmpl")
- )
-
-/obj/item/weapon/commcard/supply/New()
- ..()
- internal_data["supply_category"] = null
- internal_data["supply_controls"] = FALSE // Cannot control the supply shuttle, cannot accept orders
- internal_data["supply_pack_expanded"] = list()
- internal_data["supply_reqtime"] = -1
-
-/obj/item/weapon/commcard/supply/get_data()
- // Supply records data
- var/list/shuttle_status = get_supply_shuttle_status()
- var/list/orders = get_supply_orders()
- var/list/receipts = get_supply_receipts()
- var/list/misc_supply_data = get_misc_supply_data() // Packaging this stuff externally so it's less hardcoded into the specific cartridge
- var/list/pack_list = list() // List of supply packs within the currently selected category
-
- if(internal_data["supply_category"])
- pack_list = get_supply_pack_list()
-
- return list(
- list("field" = "shuttle_auth", "value" = misc_supply_data["shuttle_auth"]),
- list("field" = "order_auth", "value" = misc_supply_data["order_auth"]),
- list("field" = "supply_points", "value" = misc_supply_data["supply_points"]),
- list("field" = "categories", "value" = misc_supply_data["supply_categories"]),
- list("field" = "contraband", "value" = misc_supply_data["contraband"]),
- list("field" = "active_category", "value" = internal_data["supply_category"]),
- list("field" = "shuttle", "value" = shuttle_status),
- list("field" = "orders", "value" = orders),
- list("field" = "receipts", "value" = receipts),
- list("field" = "supply_packs", "value" = pack_list)
- )
-
-
-// Command Cartridge:
-// Templates
-// *- Status Display Access
-// *- Employment Records
-/obj/item/weapon/commcard/head
- name = "\improper Easy-Record DELUXE"
- icon_state = "cart-h"
- ui_templates = list(
- list("name" = "Status Display Access", "template" = "stat_display_access.tmpl"),
- list("name" = "Employment Records", "template" = "emp_records.tmpl")
- )
-
-/obj/item/weapon/commcard/head/New()
- ..()
- internal_data["stat_display_line1"] = null
- internal_data["stat_display_line2"] = null
- internal_data["stat_display_active1"] = null
- internal_data["stat_display_active2"] = null
- internal_data["stat_display_special"] = null
-
-/obj/item/weapon/commcard/head/Initialize()
- // Have to register the commcard with the Radio controller to receive updates to the status displays
- radio_controller.add_object(src, 1435)
- ..()
-
-/obj/item/weapon/commcard/head/Destroy()
- // Have to unregister the commcard for proper bookkeeping
- radio_controller.remove_object(src, 1435)
- ..()
-
-/obj/item/weapon/commcard/head/get_data()
- return list(
- list("field" = "emp_records", "value" = get_emp_records()),
- list("field" = "stat_display", "value" = get_status_display())
- )
-
-// Head of Personnel Cartridge:
-// Templates
-// *- Status Display Access
-// *- Employment Records
-// *- Security Records
-// *- Supply Records
-// ?- Supply Bot Access
-// *- Janitorial Locator Magicbox
-/obj/item/weapon/commcard/head/hop
- name = "\improper HumanResources9001 cartridge"
- icon_state = "cart-h"
- ui_templates = list(
- list("name" = "Status Display Access", "template" = "stat_display_access.tmpl"),
- list("name" = "Employment Records", "template" = "emp_records.tmpl"),
- list("name" = "Security Records", "template" = "sec_records.tmpl"),
- list("name" = "Supply Records", "template" = "supply_records.tmpl"),
- list("name" = "Janitorial Supply Locator", "template" = "janitorialLocator.tmpl")
- )
-
-
-/obj/item/weapon/commcard/head/hop/get_data()
- var/list/data = ..()
-
- // Sec records
- data[++data.len] = list("field" = "sec_records", "value" = get_sec_records())
-
- // Supply records data
- var/list/shuttle_status = get_supply_shuttle_status()
- var/list/orders = get_supply_orders()
- var/list/receipts = get_supply_receipts()
- var/list/misc_supply_data = get_misc_supply_data() // Packaging this stuff externally so it's less hardcoded into the specific cartridge
- var/list/pack_list = list() // List of supply packs within the currently selected category
-
- if(internal_data["supply_category"])
- pack_list = get_supply_pack_list()
-
- data[++data.len] = list("field" = "shuttle_auth", "value" = misc_supply_data["shuttle_auth"])
- data[++data.len] = list("field" = "order_auth", "value" = misc_supply_data["order_auth"])
- data[++data.len] = list("field" = "supply_points", "value" = misc_supply_data["supply_points"])
- data[++data.len] = list("field" = "categories", "value" = misc_supply_data["supply_categories"])
- data[++data.len] = list("field" = "contraband", "value" = misc_supply_data["contraband"])
- data[++data.len] = list("field" = "active_category", "value" = internal_data["supply_category"])
- data[++data.len] = list("field" = "shuttle", "value" = shuttle_status)
- data[++data.len] = list("field" = "orders", "value" = orders)
- data[++data.len] = list("field" = "receipts", "value" = receipts)
- data[++data.len] = list("field" = "supply_packs", "value" = pack_list)
-
- // Janitorial locator magicbox
- data[++data.len] = list("field" = "janidata", "value" = get_janitorial_locations())
-
- return data
-
-
-// Head of Security Cartridge:
-// Templates
-// *- Status Display Access
-// *- Employment Records
-// *- Security Records
-// *- Security Bot Access
-/obj/item/weapon/commcard/head/hos
- name = "\improper R.O.B.U.S.T. DELUXE"
- icon_state = "cart-hos"
- ui_templates = list(
- list("name" = "Status Display Access", "template" = "stat_display_access.tmpl"),
- list("name" = "Employment Records", "template" = "emp_records.tmpl"),
- list("name" = "Security Records", "template" = "sec_records.tmpl"),
- list("name" = "Security Bot Control", "template" = "sec_bot_access.tmpl")
- )
-
-/obj/item/weapon/commcard/head/hos/get_data()
- var/list/data = ..()
- // Sec records
- data[++data.len] = list("field" = "sec_records", "value" = get_sec_records())
- // Sec bot access
- data[++data.len] = list("field" = "sec_bot_access", "value" = get_sec_bot_access())
- return data
-
-
-// Research Director Cartridge:
-// Devices
-// *- Signaler
-// *- Gas Scanner
-// *- Reagent Scanner
-// Templates
-// *- Status Display Access
-// *- Employment Records
-// *- Signaler Access
-/obj/item/weapon/commcard/head/rd
- name = "\improper Signal Ace DELUXE"
- icon_state = "cart-rd"
- ui_templates = list(
- list("name" = "Status Display Access", "template" = "stat_display_access.tmpl"),
- list("name" = "Employment Records", "template" = "emp_records.tmpl"),
- list("name" = "Integrated Signaler Control", "template" = "signaler_access.tmpl")
- )
-
-/obj/item/weapon/commcard/head/rd/New()
- ..()
- internal_devices |= new /obj/item/device/analyzer(src)
- internal_devices |= new /obj/item/device/reagent_scanner(src)
- internal_devices |= new /obj/item/device/assembly/signaler(src)
-
-/obj/item/weapon/commcard/head/rd/get_data()
- var/list/data = ..()
- // Signaler access
- data[++data.len] = list("field" = "signaler_access", "value" = get_int_signalers())
- return data
-
-
-// Chief Medical Officer Cartridge:
-// Devices
-// *- Health Analyzer
-// *- Reagent Scanner
-// *- Halogen Counter
-// Templates
-// *- Status Display Access
-// *- Employment Records
-// *- Medical Records
-/obj/item/weapon/commcard/head/cmo
- name = "\improper Med-U DELUXE"
- icon_state = "cart-cmo"
- ui_templates = list(
- list("name" = "Status Display Access", "template" = "stat_display_access.tmpl"),
- list("name" = "Employment Records", "template" = "emp_records.tmpl"),
- list("name" = "Medical Records", "template" = "med_records.tmpl")
- )
-
-/obj/item/weapon/commcard/head/cmo/New()
- ..()
- internal_devices |= new /obj/item/device/healthanalyzer(src)
- internal_devices |= new /obj/item/device/reagent_scanner(src)
- internal_devices |= new /obj/item/device/halogen_counter(src)
-
-/obj/item/weapon/commcard/head/cmo/get_data()
- var/list/data = ..()
- // Med records
- data[++data.len] = list("field" = "med_records", "value" = get_med_records())
- return data
-
-// Chief Engineer Cartridge:
-// Devices
-// *- Gas Scanner
-// *- Halogen Counter
-// Templates
-// *- Status Display Access
-// *- Employment Records
-// *- Power Monitoring
-/obj/item/weapon/commcard/head/ce
- name = "\improper Power-On DELUXE"
- icon_state = "cart-ce"
- ui_templates = list(
- list("name" = "Status Display Access", "template" = "stat_display_access.tmpl"),
- list("name" = "Employment Records", "template" = "emp_records.tmpl"),
- list("name" = "Power Monitor", "template" = "comm_power_monitor.tmpl")
- )
-
-/obj/item/weapon/commcard/head/ce/New()
- ..()
- internal_devices |= new /obj.item/device/analyzer(src)
- internal_devices |= new /obj/item/device/halogen_counter(src)
-
-/obj/item/weapon/commcard/head/ce/Initialize()
- internal_data["grid_sensors"] = find_powernet_sensors()
- internal_data["powernet_target"] = ""
-
-/obj/item/weapon/commcard/head/ce/get_data()
- var/list/data = ..()
- // Add power monitoring data
- data[++data.len] = list("field" = "powernet_monitoring", "value" = get_powernet_monitoring_list())
- data[++data.len] = list("field" = "powernet_target", "value" = get_powernet_target(internal_data["powernet_target"]))
- return data
-
-
-// Captain Cartridge:
-// Devices
-// *- Health analyzer
-// *- Gas Scanner
-// *- Reagent Scanner
-// *- Halogen Counter
-// X- GPS - Balance
-// *- Signaler
-// Templates
-// *- Status Display Access
-// *- Employment Records
-// *- Medical Records
-// *- Security Records
-// *- Power Monitoring
-// *- Supply Records
-// X- Supply Bot Access - Mulebots usually break when used
-// *- Security Bot Access
-// *- Janitorial Locator Magicbox
-// X- GPS Access - Balance
-// *- Signaler Access
-/obj/item/weapon/commcard/head/captain
- name = "\improper Value-PAK cartridge"
- desc = "Now with 200% more value!"
- icon_state = "cart-c"
- ui_templates = list(
- list("name" = "Status Display Access", "template" = "stat_display_access.tmpl"),
- list("name" = "Employment Records", "template" = "emp_records.tmpl"),
- list("name" = "Medical Records", "template" = "med_records.tmpl"),
- list("name" = "Security Records", "template" = "sec_records.tmpl"),
- list("name" = "Security Bot Control", "template" = "sec_bot_access.tmpl"),
- list("name" = "Power Monitor", "template" = "comm_power_monitor.tmpl"),
- list("name" = "Supply Records", "template" = "supply_records.tmpl"),
- list("name" = "Janitorial Supply Locator", "template" = "janitorialLocator.tmpl"),
- list("name" = "Integrated Signaler Control", "template" = "signaler_access.tmpl")
- )
-
-/obj/item/weapon/commcard/head/captain/New()
- ..()
- internal_devices |= new /obj.item/device/analyzer(src)
- internal_devices |= new /obj/item/device/healthanalyzer(src)
- internal_devices |= new /obj/item/device/reagent_scanner(src)
- internal_devices |= new /obj/item/device/halogen_counter(src)
- internal_devices |= new /obj/item/device/assembly/signaler(src)
-
-/obj/item/weapon/commcard/head/captain/get_data()
- var/list/data = ..()
- //Med records
- data[++data.len] = list("field" = "med_records", "value" = get_med_records())
-
- // Sec records
- data[++data.len] = list("field" = "sec_records", "value" = get_sec_records())
-
- // Sec bot access
- data[++data.len] = list("field" = "sec_bot_access", "value" = get_sec_bot_access())
-
- // Power Monitoring
- data[++data.len] = list("field" = "powernet_monitoring", "value" = get_powernet_monitoring_list())
- data[++data.len] = list("field" = "powernet_target", "value" = get_powernet_target(internal_data["powernet_target"]))
-
- // Supply records data
- var/list/shuttle_status = get_supply_shuttle_status()
- var/list/orders = get_supply_orders()
- var/list/receipts = get_supply_receipts()
- var/list/misc_supply_data = get_misc_supply_data() // Packaging this stuff externally so it's less hardcoded into the specific cartridge
- var/list/pack_list = list() // List of supply packs within the currently selected category
-
- if(internal_data["supply_category"])
- pack_list = get_supply_pack_list()
-
- data[++data.len] = list("field" = "shuttle_auth", "value" = misc_supply_data["shuttle_auth"])
- data[++data.len] = list("field" = "order_auth", "value" = misc_supply_data["order_auth"])
- data[++data.len] = list("field" = "supply_points", "value" = misc_supply_data["supply_points"])
- data[++data.len] = list("field" = "categories", "value" = misc_supply_data["supply_categories"])
- data[++data.len] = list("field" = "contraband", "value" = misc_supply_data["contraband"])
- data[++data.len] = list("field" = "active_category", "value" = internal_data["supply_category"])
- data[++data.len] = list("field" = "shuttle", "value" = shuttle_status)
- data[++data.len] = list("field" = "orders", "value" = orders)
- data[++data.len] = list("field" = "receipts", "value" = receipts)
- data[++data.len] = list("field" = "supply_packs", "value" = pack_list)
-
- // Janitorial locator magicbox
- data[++data.len] = list("field" = "janidata", "value" = get_janitorial_locations())
-
- // Signaler access
- data[++data.len] = list("field" = "signaler_access", "value" = get_int_signalers())
-
- return data
-
-
-// Mercenary Cartridge
-// Templates
-// *- Merc Shuttle Door Controller
-/obj/item/weapon/commcard/mercenary
- name = "\improper Detomatix cartridge"
- icon_state = "cart"
- ui_templates = list(
- list("name" = "Shuttle Blast Door Control", "template" = "merc_blast_door_control.tmpl")
- )
-
-/obj/item/weapon/commcard/mercenary/Initialize()
- internal_data["shuttle_door_code"] = "smindicate" // Copied from PDA code
- internal_data["shuttle_doors"] = find_blast_doors()
-
-/obj/item/weapon/commcard/mercenary/get_data()
- var/door_status[0]
- for(var/obj/machinery/door/blast/B in internal_data["shuttle_doors"])
- door_status[++door_status.len] += list(
- "open" = B.density,
- "name" = B.name,
- "ref" = "\ref[B]"
- )
-
- return list(
- list("field" = "blast_door", "value" = door_status)
- )
-
-
-// Explorer Cartridge
-// Devices
-// *- GPS
-// Templates
-// *- GPS Access
-
-// IMPORTANT: NOT MAPPED IN DUE TO BALANCE CONCERNS RE: FINDING THE VICTIMS OF ANTAGS.
-// See suit sensors, specifically ease of turning them off, and variable level of settings which may or may not give location
-// A GPS in your phone that is either broadcasting position or totally off, and can be hidden in pockets, coats, bags, boxes, etc, is much harder to disable
-/obj/item/weapon/commcard/explorer
- name = "\improper Explorator cartridge"
- icon_state = "cart-tox"
- ui_templates = list(
- list("name" = "Integrated GPS", "template" = "gps_access.tmpl")
- )
-
-/obj/item/weapon/commcard/explorer/New()
- ..()
- internal_devices |= new /obj/item/device/gps/explorer(src)
-
-/obj/item/weapon/commcard/explorer/get_data()
- var/list/GPS = get_GPS_lists()
-
- return list(
- list("field" = "gps_access", "value" = GPS[1]),
- list("field" = "gps_signal", "value" = GPS[2]),
- list("field" = "gps_status", "value" = GPS[3])
- )
\ No newline at end of file
diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm
index 392af1b870..c3c8e87d3b 100644
--- a/code/game/objects/items/devices/communicator/communicator.dm
+++ b/code/game/objects/items/devices/communicator/communicator.dm
@@ -43,7 +43,6 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
var/note = "Thank you for choosing the T-14.2 Communicator, this is your notepad!" //Current note in the notepad function
var/notehtml = ""
- var/obj/item/weapon/commcard/cartridge = null //current cartridge
var/fon = 0 // Internal light
var/flum = 2 // Brightness
@@ -203,17 +202,6 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
if(!get_connection_to_tcomms())
close_connection(reason = "Connection timed out")
-// Proc: attack()
-// Parameters: 2 (M - what is being attacked. user - the mob that has the communicator)
-// Description: When the communicator has an attached commcard with internal devices, relay the attack() through to those devices.
-// Contents of the for loop are copied from gripper code, because that does approximately what we want to do.
-/obj/item/device/communicator/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- if(cartridge && cartridge.active_devices)
- for(var/obj/item/wrapped in cartridge.active_devices)
- if(wrapped) //The force of the wrapped obj gets set to zero during the attack() and afterattack().
- wrapped.attack(M,user)
- return 0
-
// Proc: attackby()
// Parameters: 2 (C - what is used on the communicator. user - the mob that has the communicator)
// Description: When an ID is swiped on the communicator, the communicator reads the job and checks it against the Owner name, if success, the occupation is added.
@@ -229,13 +217,6 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
occupation = idcard.assignment
to_chat(user, "Occupation updated.")
- if(istype(C, /obj/item/weapon/commcard) && !cartridge)
- cartridge = C
- user.drop_item()
- cartridge.forceMove(src)
- to_chat(usr, "You slot \the [cartridge] into \the [src].")
- modules[++modules.len] = list("module" = "External Device", "icon" = "external64", "number" = EXTRTAB)
- SSnanoui.update_uis(src) // update all UIs attached to src
return
// Proc: attack_self()
@@ -358,38 +339,6 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
client_huds |= global_hud.whitense
client_huds |= global_hud.darkMask
-/obj/item/device/communicator/verb/verb_remove_cartridge()
- set category = "Object"
- set name = "Remove commcard"
- set src in usr
-
- // Can't remove what isn't there
- if(!cartridge)
- to_chat(usr, "There isn't a commcard to remove!")
- return
-
- // Can't remove if you're physically unable to
- if(usr.stat || usr.restrained() || usr.paralysis || usr.stunned || usr.weakened)
- to_chat(usr, "You cannot do this while restrained.")
- return
-
- var/turf/T = get_turf(src)
- cartridge.loc = T
- // If it's in someone, put the cartridge in their hands
- if (ismob(loc))
- var/mob/M = loc
- M.put_in_hands(cartridge)
- // Else just set it on the ground
- else
- cartridge.loc = get_turf(src)
- cartridge = null
- // We have to iterate through the modules to find EXTRTAB, because list procs don't play nice with a list of lists
- for(var/i = 1, i <= modules.len, i++)
- if(modules[i]["number"] == EXTRTAB)
- modules.Cut(i, i+1)
- break
- to_chat(usr, "You remove \the [cartridge] from the [name].")
-
//It's the 26th century. We should have smart watches by now.
/obj/item/device/communicator/watch
name = "communicator watch"
diff --git a/code/game/objects/items/devices/communicator/helper.dm b/code/game/objects/items/devices/communicator/helper.dm
index ec67686668..eed52620c6 100644
--- a/code/game/objects/items/devices/communicator/helper.dm
+++ b/code/game/objects/items/devices/communicator/helper.dm
@@ -96,448 +96,3 @@
news.Swap(1, 3) // List is sorted in ascending order of timestamp, we want descending
return news
-
-
-
-// Putting the commcard data harvesting helpers here
-// Not ideal to put all the procs on the base type
-// but it may open options for adminbus,
-// And it saves duplicated code
-
-
-// Medical records
-/obj/item/weapon/commcard/proc/get_med_records()
- var/med_records[0]
- for(var/datum/data/record/M in sortRecord(data_core.medical))
- var/record[0]
- record[++record.len] = list("tab" = "Name", "val" = M.fields["name"])
- record[++record.len] = list("tab" = "ID", "val" = M.fields["id"])
- record[++record.len] = list("tab" = "Blood Type", "val" = M.fields["b_type"])
- record[++record.len] = list("tab" = "DNA #", "val" = M.fields["b_dna"])
- record[++record.len] = list("tab" = "Gender", "val" = M.fields["id_gender"])
- record[++record.len] = list("tab" = "Entity Classification", "val" = M.fields["brain_type"])
- record[++record.len] = list("tab" = "Minor Disorders", "val" = M.fields["mi_dis"])
- record[++record.len] = list("tab" = "Major Disorders", "val" = M.fields["ma_dis"])
- record[++record.len] = list("tab" = "Allergies", "val" = M.fields["alg"])
- record[++record.len] = list("tab" = "Condition", "val" = M.fields["cdi"])
- record[++record.len] = list("tab" = "Notes", "val" = M.fields["notes"])
-
- med_records[++med_records.len] = list("name" = M.fields["name"], "record" = record)
- return med_records
-
-
-// Employment records
-/obj/item/weapon/commcard/proc/get_emp_records()
- var/emp_records[0]
- for(var/datum/data/record/G in sortRecord(data_core.general))
- var/record[0]
- record[++record.len] = list("tab" = "Name", "val" = G.fields["name"])
- record[++record.len] = list("tab" = "ID", "val" = G.fields["id"])
- record[++record.len] = list("tab" = "Rank", "val" = G.fields["rank"])
- record[++record.len] = list("tab" = "Fingerprint", "val" = G.fields["fingerprint"])
- record[++record.len] = list("tab" = "Entity Classification", "val" = G.fields["brain_type"])
- record[++record.len] = list("tab" = "Sex", "val" = G.fields["sex"])
- record[++record.len] = list("tab" = "Species", "val" = G.fields["species"])
- record[++record.len] = list("tab" = "Age", "val" = G.fields["age"])
- record[++record.len] = list("tab" = "Notes", "val" = G.fields["notes"])
-
- emp_records[++emp_records.len] = list("name" = G.fields["name"], "record" = record)
- return emp_records
-
-
-// Security records
-/obj/item/weapon/commcard/proc/get_sec_records()
- var/sec_records[0]
- for(var/datum/data/record/G in sortRecord(data_core.general))
- var/record[0]
- record[++record.len] = list("tab" = "Name", "val" = G.fields[""])
- record[++record.len] = list("tab" = "Sex", "val" = G.fields[""])
- record[++record.len] = list("tab" = "Species", "val" = G.fields[""])
- record[++record.len] = list("tab" = "Age", "val" = G.fields[""])
- record[++record.len] = list("tab" = "Rank", "val" = G.fields[""])
- record[++record.len] = list("tab" = "Fingerprint", "val" = G.fields[""])
- record[++record.len] = list("tab" = "Physical Status", "val" = G.fields[""])
- record[++record.len] = list("tab" = "Mental Status", "val" = G.fields[""])
- record[++record.len] = list("tab" = "Criminal Status", "val" = G.fields[""])
- record[++record.len] = list("tab" = "Major Crimes", "val" = G.fields[""])
- record[++record.len] = list("tab" = "Minor Crimes", "val" = G.fields[""])
- record[++record.len] = list("tab" = "Notes", "val" = G.fields["notes"])
-
- sec_records[++sec_records.len] = list("name" = G.fields["name"], "record" = record)
- return sec_records
-
-
-// Status of all secbots
-// Weaker than what PDAs appear to do, but as of 7/1/2018 PDA secbot access is nonfunctional
-/obj/item/weapon/commcard/proc/get_sec_bot_access()
- var/sec_bots[0]
- for(var/mob/living/bot/secbot/S in mob_list)
- // Get new bot
- var/status[0]
- status[++status.len] = list("tab" = "Name", "val" = sanitize(S.name))
-
- // If it's turned off, then it shouldn't be broadcasting any further info
- if(!S.on)
- status[++status.len] = list("tab" = "Power", "val" = "Off") // Encoding the span classes here so I don't have to do complicated switches in the ui template
- continue
- status[++status.len] = list("tab" = "Power", "val" = "On")
-
- // -- What it's doing
- // If it's engaged, then say who it thinks it's engaging
- if(S.target)
- status[++status.len] = list("tab" = "Status", "val" = "Apprehending Target")
- status[++status.len] = list("tab" = "Target", "val" = S.target_name(S.target))
- // Else if it's patrolling
- else if(S.will_patrol)
- status[++status.len] = list("tab" = "Status", "val" = "Patrolling")
- // Otherwise we don't know what it's doing
- else
- status[++status.len] = list("tab" = "Status", "val" = "Idle")
-
- // Where it is
- status[++status.len] = list("tab" = "Location", "val" = sanitize("[get_area(S.loc)]"))
-
- // Append bot to the list
- sec_bots[++sec_bots.len] = list("bot" = S.name, "status" = status)
- return sec_bots
-
-
-// Code and frequency of stored signalers
-// Supports multiple signalers within the device
-/obj/item/weapon/commcard/proc/get_int_signalers()
- var/signalers[0]
- for(var/obj/item/device/assembly/signaler/S in internal_devices)
- var/unit[0]
- unit[++unit.len] = list("tab" = "Code", "val" = S.code)
- unit[++unit.len] = list("tab" = "Frequency", "val" = S.frequency)
-
- signalers[++signalers.len] = list("ref" = "\ref[S]", "status" = unit)
-
- return signalers
-
-// Returns list of all powernet sensors currently visible to the commcard
-/obj/item/weapon/commcard/proc/find_powernet_sensors()
- var/grid_sensors[0]
-
- // Find all the powernet sensors we need to pull data from
- // Copied from /datum/nano_module/power_monitor/proc/refresh_sensors(),
- // located in '/code/modules/nano/modules/power_monitor.dm'
- // Minor tweaks for efficiency and cleanliness
- var/turf/T = get_turf(src)
- if(T)
- var/list/levels = using_map.get_map_levels(T.z, FALSE)
- for(var/obj/machinery/power/sensor/S in machines)
- if((S.long_range) || (S.loc.z in levels) || (S.loc.z == T.z)) // Consoles have range on their Z-Level. Sensors with long_range var will work between Z levels.
- if(S.name_tag == "#UNKN#") // Default name. Shouldn't happen!
- warning("Powernet sensor with unset ID Tag! [S.x]X [S.y]Y [S.z]Z")
- else
- grid_sensors += S
- return grid_sensors
-
-// List of powernets
-/obj/item/weapon/commcard/proc/get_powernet_monitoring_list()
- // Fetch power monitor data
- var/sensors[0]
-
- for(var/obj/machinery/power/sensor/S in internal_data["grid_sensors"])
- var/list/focus = S.return_reading_data()
-
- sensors[++sensors.len] = list(
- "name" = S.name_tag,
- "alarm" = focus["alarm"]
- )
-
- return sensors
-
-// Information about the targeted powernet
-/obj/item/weapon/commcard/proc/get_powernet_target(var/target_sensor)
- if(!target_sensor)
- return
-
- var/powernet_target[0]
-
- for(var/obj/machinery/power/sensor/S in internal_data["grid_sensors"])
- var/list/focus = S.return_reading_data()
-
- // Packages the span class here so it doesn't need to be interpreted w/in the for loop in the ui template
- var/load_stat = "Optimal"
- if(focus["load_percentage"] >= 95)
- load_stat = "DANGER: Overload"
- else if(focus["load_percentage"] >= 85)
- load_stat = "WARNING: High Load"
-
- var/alarm_stat = focus["alarm"] ? "WARNING: Abnormal activity detected!" : "Secure"
-
- if(target_sensor == S.name_tag)
- powernet_target = list(
- "name" = S.name_tag,
- "alarm" = focus["alarm"],
- "error" = focus["error"],
- "apc_data" = focus["apc_data"],
- "status" = list(
- list("field" = "Network Load Status", "statval" = load_stat),
- list("field" = "Network Security Status", "statval" = alarm_stat),
- list("field" = "Load Percentage", "statval" = focus["load_percentage"]),
- list("field" = "Available Power", "statval" = focus["total_avail"]),
- list("field" = "APC Power Usage", "statval" = focus["total_used_apc"]),
- list("field" = "Other Power Usage", "statval" = focus["total_used_other"]),
- list("field" = "Total Usage", "statval" = focus["total_used_all"])
- )
- )
-
- return powernet_target
-
-// Compiles the locations of all janitorial paraphernalia, as used by janitorialLocator.tmpl
-/obj/item/weapon/commcard/proc/get_janitorial_locations()
- // Fetch janitorial locator
- var/janidata[0]
- var/list/cleaningList = list()
- cleaningList += all_mops + all_mopbuckets + all_janitorial_carts
-
- // User's location
- var/turf/userloc = get_turf(src)
- if(isturf(userloc))
- janidata[++janidata.len] = list("field" = "Current Location", "val" = "[userloc.x], [userloc.y], [using_map.get_zlevel_name(userloc.z)]")
- else
- janidata[++janidata.len] = list("field" = "Current Location", "val" = "Unknown")
- return janidata // If the user isn't on a valid turf, then it shouldn't be able to find anything anyways
-
- // Mops, mop buckets, janitorial carts.
- for(var/obj/C in cleaningList)
- var/turf/T = get_turf(C)
- if(isturf(T) )//&& T.z in using_map.get_map_levels(userloc, FALSE))
- if(T.z == userloc.z)
- janidata[++janidata.len] = list("field" = apply_text_macros("\proper [C.name]"), "val" = "[T.x], [T.y], [using_map.get_zlevel_name(T.z)]")
- else
- janidata[++janidata.len] = list("field" = apply_text_macros("\proper [C.name]"), "val" = "[T.x], [T.y], [using_map.get_zlevel_name(T.z)]")
-
- // Cleanbots
- for(var/mob/living/bot/cleanbot/B in living_mob_list)
- var/turf/T = get_turf(B)
- if(isturf(T) )//&& T.z in using_map.get_map_levels(userloc, FALSE))
- var/textout = ""
- if(B.on)
- textout += "Status: Online
"
- if(T.z == userloc.z)
- textout += "[T.x], [T.y], [using_map.get_zlevel_name(T.z)]"
- else
- textout += "[T.x], [T.y], [using_map.get_zlevel_name(T.z)]"
- else
- textout += "Status: Offline"
-
- janidata[++janidata.len] = list("field" = "[B.name]", "val" = textout)
-
- return janidata
-
-// Compiles the three lists used by GPS_access.tmpl
-// The contents of the three lists are inherently related, so separating them into different procs would be largely redundant
-/obj/item/weapon/commcard/proc/get_GPS_lists()
- // GPS Access
- var/intgps[0] // Gps devices within the commcard -- Allow tag edits, turning on/off, etc
- var/extgps[0] // Gps devices not inside the commcard -- Print locations if a gps is on
- var/stagps[0] // Gps net status, location, whether it's on, if it's got long range
- var/obj/item/device/gps/cumulative = new(src)
- cumulative.tracking = FALSE
- cumulative.local_mode = TRUE // Won't detect long-range signals automatically
- cumulative.long_range = FALSE
- var/list/toggled_gps = list() // List of GPS units that are turned off before display_list() is called
-
- for(var/obj/item/device/gps/G in internal_devices)
- var/gpsdata[0]
- if(G.tracking && !G.emped)
- cumulative.tracking = TRUE // Turn it on
- if(G.long_range)
- cumulative.long_range = TRUE // It can detect long-range
- if(!G.local_mode)
- cumulative.local_mode = FALSE // It is detecting long-range
-
- gpsdata["ref"] = "\ref[G]"
- gpsdata["tag"] = G.gps_tag
- gpsdata["power"] = G.tracking
- gpsdata["local_mode"] = G.local_mode
- gpsdata["long_range"] = G.long_range
- gpsdata["hide_signal"] = G.hide_signal
- gpsdata["can_hide"] = G.can_hide_signal
-
- intgps[++intgps.len] = gpsdata // Add it to the list
-
- if(G.tracking)
- G.tracking = FALSE // Disable the internal gps units so they don't show up in the report
- toggled_gps += G
-
- var/list/remote_gps = cumulative.display_list() // Fetch information for all units except the ones inside of this device
-
- for(var/obj/item/device/gps/G in toggled_gps) // Reenable any internal GPS units
- G.tracking = TRUE
-
- stagps["enabled"] = cumulative.tracking
- stagps["long_range_en"] = (cumulative.long_range && !cumulative.local_mode)
-
- stagps["my_area_name"] = remote_gps["my_area_name"]
- stagps["curr_x"] = remote_gps["curr_x"]
- stagps["curr_y"] = remote_gps["curr_y"]
- stagps["curr_z"] = remote_gps["curr_z"]
- stagps["curr_z_name"] = remote_gps["curr_z_name"]
-
- extgps = remote_gps["gps_list"] // Compiled by the GPS
-
- qdel(cumulative) // Don't want spare GPS units building up in the contents
-
- return list(
- intgps,
- extgps,
- stagps
- )
-
-// Collects the current status of the supply shuttle
-// Copied from /obj/machinery/computer/supplycomp/ui_interact(),
-// code\game\machinery\computer\supply.dm, starting at line 55
-/obj/item/weapon/commcard/proc/get_supply_shuttle_status()
- var/shuttle_status[0]
- var/datum/shuttle/autodock/ferry/supply/shuttle = SSsupply.shuttle
- if(shuttle)
- if(shuttle.has_arrive_time())
- shuttle_status["location"] = "In transit"
- shuttle_status["mode"] = SUP_SHUTTLE_TRANSIT
- shuttle_status["time"] = shuttle.eta_minutes()
-
- else
- shuttle_status["time"] = 0
- if(shuttle.at_station())
- if(shuttle.shuttle_docking_controller)
- switch(shuttle.shuttle_docking_controller.get_docking_status())
- if("docked")
- shuttle_status["location"] = "Docked"
- shuttle_status["mode"] = SUP_SHUTTLE_DOCKED
- if("undocked")
- shuttle_status["location"] = "Undocked"
- shuttle_status["mode"] = SUP_SHUTTLE_UNDOCKED
- if("docking")
- shuttle_status["location"] = "Docking"
- shuttle_status["mode"] = SUP_SHUTTLE_DOCKING
- shuttle_status["force"] = shuttle.can_force()
- if("undocking")
- shuttle_status["location"] = "Undocking"
- shuttle_status["mode"] = SUP_SHUTTLE_UNDOCKING
- shuttle_status["force"] = shuttle.can_force()
-
- else
- shuttle_status["location"] = "Station"
- shuttle_status["mode"] = SUP_SHUTTLE_DOCKED
-
- else
- shuttle_status["location"] = "Away"
- shuttle_status["mode"] = SUP_SHUTTLE_AWAY
-
- if(shuttle.can_launch())
- shuttle_status["launch"] = 1
- else if(shuttle.can_cancel())
- shuttle_status["launch"] = 2
- else
- shuttle_status["launch"] = 0
-
- switch(shuttle.moving_status)
- if(SHUTTLE_IDLE)
- shuttle_status["engine"] = "Idle"
- if(SHUTTLE_WARMUP)
- shuttle_status["engine"] = "Warming up"
- if(SHUTTLE_INTRANSIT)
- shuttle_status["engine"] = "Engaged"
-
- else
- shuttle["mode"] = SUP_SHUTTLE_ERROR
-
- return shuttle_status
-
-// Compiles the list of supply orders
-// Copied from /obj/machinery/computer/supplycomp/ui_interact(),
-// code\game\machinery\computer\supply.dm, starting at line 130
-/obj/item/weapon/commcard/proc/get_supply_orders()
- var/orders[0]
- for(var/datum/supply_order/S in SSsupply.order_history)
- orders[++orders.len] = list(
- "ref" = "\ref[S]",
- "status" = S.status,
- "entries" = list(
- list("field" = "Supply Pack", "entry" = S.name),
- list("field" = "Cost", "entry" = S.cost),
- list("field" = "Index", "entry" = S.index),
- list("field" = "Reason", "entry" = S.comment),
- list("field" = "Ordered by", "entry" = S.ordered_by),
- list("field" = "Ordered at", "entry" = S.ordered_at),
- list("field" = "Approved by", "entry" = S.approved_by),
- list("field" = "Approved at", "entry" = S.approved_at)
- )
- )
-
- return orders
-
-// Compiles the list of supply export receipts
-// Copied from /obj/machinery/computer/supplycomp/ui_interact(),
-// code\game\machinery\computer\supply.dm, starting at line 147
-/obj/item/weapon/commcard/proc/get_supply_receipts()
- var/receipts[0]
- for(var/datum/exported_crate/E in SSsupply.exported_crates)
- receipts[++receipts.len] = list(
- "ref" = "\ref[E]",
- "contents" = E.contents,
- "error" = E.contents["error"],
- "title" = list(
- list("field" = "Name", "entry" = E.name),
- list("field" = "Value", "entry" = E.value)
- )
- )
- return receipts
-
-
-// Compiles the list of supply packs for the category currently stored in internal_data["supply_category"]
-// Copied from /obj/machinery/computer/supplycomp/ui_interact(),
-// code\game\machinery\computer\supply.dm, starting at line 147
-/obj/item/weapon/commcard/proc/get_supply_pack_list()
- var/supply_packs[0]
- for(var/pack_name in SSsupply.supply_pack)
- var/datum/supply_pack/P = SSsupply.supply_pack[pack_name]
- if(P.group == internal_data["supply_category"])
- var/list/pack = list(
- "name" = P.name,
- "cost" = P.cost,
- "contraband" = P.contraband,
- "manifest" = uniquelist(P.manifest),
- "random" = P.num_contained,
- "expand" = 0,
- "ref" = "\ref[P]"
- )
-
- if(P in internal_data["supply_pack_expanded"])
- pack["expand"] = 1
-
- supply_packs[++supply_packs.len] = pack
-
- return supply_packs
-
-
-// Compiles miscellaneous data and permissions used by the supply template
-/obj/item/weapon/commcard/proc/get_misc_supply_data()
- return list(
- "shuttle_auth" = (internal_data["supply_controls"] & SUP_SEND_SHUTTLE),
- "order_auth" = (internal_data["supply_controls"] & SUP_ACCEPT_ORDERS),
- "supply_points" = SSsupply.points,
- "supply_categories" = all_supply_groups
- )
-
-/obj/item/weapon/commcard/proc/get_status_display()
- return list(
- "line1" = internal_data["stat_display_line1"],
- "line2" = internal_data["stat_display_line2"],
- "active_line1" = internal_data["stat_display_active1"],
- "active_line2" = internal_data["stat_display_active2"],
- "active" = internal_data["stat_display_special"]
- )
-
-/obj/item/weapon/commcard/proc/find_blast_doors()
- var/target_doors[0]
- for(var/obj/machinery/door/blast/B in machines)
- if(B.id == internal_data["shuttle_door_code"])
- target_doors += B
-
- return target_doors
\ No newline at end of file
diff --git a/nano/templates/comm_power_monitor.tmpl b/nano/templates/comm_power_monitor.tmpl
deleted file mode 100644
index ffcd70ff2a..0000000000
--- a/nano/templates/comm_power_monitor.tmpl
+++ /dev/null
@@ -1,76 +0,0 @@
-
Powernet Monitoring
-
-{{if data.currentTab == 0}}
-
-
-
-
- {{:helper.link('Scan For Sensors', 'refresh', {'cartridge_topic' : 1, 'powernet_refresh' : 1})}} No active sensor. Printing sensor list.
-
-
-
- {{for data.powernet_monitoring}}
- |
- {{if value.alarm}}
- {{:helper.link(value.name, 'alert', {'switch_tab' : value.name, 'powernet_target' : value.name})}}
- {{else}}
- {{:helper.link(value.name, '' , {'switch_tab' : value.name, 'cartridge_topic' : 1, 'powernet_target' : value.name})}}
- {{/if}}
- |
- {{empty}}
- WARNING: No Sensors Detected!
- {{/for}}
-
-{{else}}
-
-
-
-
- {{:helper.link('Show List', 'cancel', { 'switch_tab' : 0})}} Sensor selected: {{:data.currentTab}}
-
- {{if data.powernet_target.error}}
- {{:data.powernet_target.error}}
- {{else}}
-
- Network Information
- {{for data.powernet_target.status :nodeValue:nodeIndex}}
-
-
{{:nodeValue.field}}
-
{{:nodeValue.statval}}
-
- {{/for}}
-
-
- Sensor Readings
-
-
- | APC Name |
- Equipment |
- Lighting |
- Environment |
- Cell Status |
- APC Load |
-
- {{for data.powernet_target.apc_data :apcValue:apcIndex}}
-
- | {{:apcValue.name}} |
- {{:apcValue.s_equipment}} |
- {{:apcValue.s_lighting}} |
- {{:apcValue.s_environment}} |
-
- {{if apcValue.cell_status == "N"}}
- {{:helper.link(apcValue.cell_charge + '%', 'batt_disc', null,'disabled', 'width75btn')}}
- {{else apcValue.cell_status == "C"}}
- {{:helper.link(apcValue.cell_charge + '%', 'batt_chrg', null,'disabled', 'width75btn')}}
- {{else}}
- {{:helper.link(apcValue.cell_charge + '%', 'batt_full', null,'disabled', 'width75btn')}}
- {{/if}}
- |
- {{:apcValue.total_load}} |
-
- {{empty}}
- | No APCs detected in connected powernet. |
- {{/for}}
-
- {{/if}}
-{{/if}}
diff --git a/nano/templates/emp_records.tmpl b/nano/templates/emp_records.tmpl
deleted file mode 100644
index 16b5159039..0000000000
--- a/nano/templates/emp_records.tmpl
+++ /dev/null
@@ -1,23 +0,0 @@
-Employment Records
-{{if data.currentTab == "0"}}
-
- {{for data.emp_records}}
-
- {{:helper.link(value.name, '', {"switch_tab" : value.name})}}
-
- {{/for}}
-
-{{/if}}
-{{for data.emp_records}}
- {{if value.name == data.currentTab}}
- {{:helper.link('Back', 'icon-triangle-1-w', {'switch_tab' : 0})}}
-
- {{for value.record :itemValue:itemIndex}}
-
-
{{:itemValue.tab}}
-
{{:itemValue.val}}
-
- {{/for}}
-
- {{/if}}
-{{/for}}
\ No newline at end of file
diff --git a/nano/templates/gps_access.tmpl b/nano/templates/gps_access.tmpl
deleted file mode 100644
index 21b61b767a..0000000000
--- a/nano/templates/gps_access.tmpl
+++ /dev/null
@@ -1,66 +0,0 @@
-Integrated GPS
-
-
-{{if data.gps_status.enabled}}
-
- Area: {{:data.gps_status.my_area_name}}, {{:data.gps_status.curr_z_name}}
- GPS Coordinates: ({{:data.gps_status.curr_x}}, {{:data.gps_status.curr_y}})
-
-{{else}}
-
- Error: Location data unavailable. No sensors online!
-
-{{/if}}
-
-
-
- {{for data.gps_access}}
-
-
- {{:index}}: {{:value.tag}}
-
-
- {{:helper.link('On', 'power', {'cartridge_topic' : "1", 'gps_target' : value.ref, 'gps_action' : "Power", 'value' : "1"}, value.power ? 'selected' : null)}}
- {{:helper.link('Off', 'stop', {'cartridge_topic' : "1", 'gps_target' : value.ref, 'gps_action' : "Power", 'value' : "0"}, value.power ? null : 'selected')}}
- {{:helper.link('Edit Tag', 'power', {'cartridge_topic' : "1", 'gps_target' : value.ref, 'gps_action' : "Tag", 'user' : data.user})}}
- {{if value.power}}
- {{if value.long_range}}
-
-
- {{:helper.string("Long range scanning is {0}.", value.local_mode ? "disabled" : "active")}}
- {{:helper.link('Enable', 'power', {'cartridge_topic' : "1", 'gps_target' : value.ref, 'gps_action' : "Long_Range", 'value' : "0"}, value.long_range_en ? 'selected' : null)}}
- {{:helper.link('Disable', 'stop', {'cartridge_topic' : "1", 'gps_target' : value.ref, 'gps_action' : "Long_Range", 'value' : "1"}, value.long_range_en ? null : 'selected')}}
- {{/if}}
- {{if value.can_hide}}
-
- {{:helper.string("{0}", value.hide_signal ? "Broadcasting location" : "Receiving only ")}}
- {{:helper.link('Broadcast', 'power', {'cartridge_topic' : "1", 'gps_target' : value.ref, 'gps_action' : "Hide_Signal", 'value' : "1"}, value.hide_signal ? 'selected' : null)}}
- {{:helper.link('Receive', 'stop', {'cartridge_topic' : "1", 'gps_target' : value.ref, 'gps_action' : "Hide_Signal", 'value' : "0"}, value.hide_signal ? null : 'selected')}}
- {{/if}}
- {{/if}}
-
-
- {{empty}}
- {{/for}}
-
-
-
-{{if data.gps_status.enabled}}
-
- {{for data.gps_signal}}
-
-
- {{:value.gps_tag}}
-
-
- Coordinates: ({{:value.x}}, {{:value.y}})
-
- Area: {{:value.area_name}}, {{:value.z_name}}
- {{if value.local}}
- {{:helper.string("Distance: {0}m {1} - {2}m {3}, {4}m {5}", value.distance < 0 ? 0 : value.distance, value.direction, helper.abs(value.distY), ((value.distY > 0) ? "N" : "S"), helper.abs(value.distX), ((value.distX > 0) ? "E" : "W"))}}
- {{/if}}
-
-
- {{/for}}
-
-{{/if}}
\ No newline at end of file
diff --git a/nano/templates/janitorialLocator.tmpl b/nano/templates/janitorialLocator.tmpl
deleted file mode 100644
index d476b7def4..0000000000
--- a/nano/templates/janitorialLocator.tmpl
+++ /dev/null
@@ -1,11 +0,0 @@
-Janitorial Supply Locator
-{{for data.janidata}}
-
-
- {{:value.field}}
-
-
- {{:value.val}}
-
-
-{{/for}}
\ No newline at end of file
diff --git a/nano/templates/med_records.tmpl b/nano/templates/med_records.tmpl
deleted file mode 100644
index f24339a779..0000000000
--- a/nano/templates/med_records.tmpl
+++ /dev/null
@@ -1,23 +0,0 @@
-Medical Records
-{{if data.currentTab == "0"}}
-
- {{for data.med_records}}
-
- {{:helper.link(value.name, '', {"switch_tab" : value.name})}}
-
- {{/for}}
-
-{{/if}}
-{{for data.med_records}}
- {{if value.name == data.currentTab}}
- {{:helper.link('Back', 'icon-triangle-1-w', {'switch_tab' : 0})}}
-
- {{for value.record :itemValue:itemIndex}}
-
-
{{:itemValue.tab}}
-
{{:itemValue.val}}
-
- {{/for}}
-
- {{/if}}
-{{/for}}
\ No newline at end of file
diff --git a/nano/templates/merc_blast_door_control.tmpl b/nano/templates/merc_blast_door_control.tmpl
deleted file mode 100644
index ec323ce081..0000000000
--- a/nano/templates/merc_blast_door_control.tmpl
+++ /dev/null
@@ -1,23 +0,0 @@
-Shuttle Blast Door Control
-
-
- {{:helper.link('Open all doors', 'radio-on', {'cartridge_topic' : 1, 'all_blast_doors' : "open"})}}
- {{:helper.link('Close all doors', 'radio-off', {'cartridge_topic' : 1, 'all_blast_doors' : "close"})}}
-
-
- {{:helper.link('Scan for doors', 'refresh', {'cartridge_topic' : 1, 'scan_blast_doors' : 1})}}
-
-
-{{for data.blast_door}}
-
-
- {{:value.name}} #{{:index}}
-
-
- {{:helper.link('On', 'radio-on', {'cartridge_topic' : 1, 'toggle_blast_door' : value.ref}, value.open ? 'selected' : null)}}
- {{:helper.link('Off', 'radio-off', {'cartridge_topic' : 1, 'toggle_blast_door' : value.ref}, value.open ? null : 'selected')}}
-
-
-{{empty}}
- No doors detected!
-{{/for}}
\ No newline at end of file
diff --git a/nano/templates/sec_bot_access.tmpl b/nano/templates/sec_bot_access.tmpl
deleted file mode 100644
index 49214cb97f..0000000000
--- a/nano/templates/sec_bot_access.tmpl
+++ /dev/null
@@ -1,36 +0,0 @@
-Security Bot Control
-
-{{if data.currentTab == 0}}
-
-
-
- Select A Bot.
-
-
- {{for data.sec_bot_access}}
-
- {{:helper.link(value.bot, 'gear', {'switch_tab' : value.bot})}}
-
- {{empty}}
- No bots found.
- {{/for}}
-
-
-{{else}}
-
-
- {{for data.sec_bot_access}}
- {{if value.bot == data.currentTab}}
- {{for value.status :statVal:statIndex}}
-
-
- {{:statVal.tab}}
-
-
- {{:statVal.val}}
-
-
- {{/for}}
- {{/if}}
- {{/for}}
-{{/if}}
\ No newline at end of file
diff --git a/nano/templates/sec_records.tmpl b/nano/templates/sec_records.tmpl
deleted file mode 100644
index f644289061..0000000000
--- a/nano/templates/sec_records.tmpl
+++ /dev/null
@@ -1,23 +0,0 @@
-Security Records
-{{if data.currentTab == "0"}}
-
- {{for data.sec_records}}
-
- {{:helper.link(value.name, '', {"switch_tab" : value.name})}}
-
- {{/for}}
-
-{{/if}}
-{{for data.sec_records}}
- {{if value.name == data.currentTab}}
- {{:helper.link('Back', 'icon-triangle-1-w', {'switch_tab' : 0})}}
-
- {{for value.record :itemValue:itemIndex}}
-
-
{{:itemValue.tab}}
-
{{:itemValue.val}}
-
- {{/for}}
-
- {{/if}}
-{{/for}}
\ No newline at end of file
diff --git a/nano/templates/signaler_access.tmpl b/nano/templates/signaler_access.tmpl
deleted file mode 100644
index 86220f07cb..0000000000
--- a/nano/templates/signaler_access.tmpl
+++ /dev/null
@@ -1,24 +0,0 @@
-Signaler Control
-
-
-{{for data.signaler_access}}
-
-
- {{:index}}
-
-
- {{:helper.link('Pulse', 'arrowstop-1-n', {'cartridge_topic' : "1", 'signaler_target' : value.ref, 'signaler_action' : "Pulse"})}}
-
-
- {{for value.status :statVal:statIndex}}
-
-
- {{:statVal.tab}}
-
-
-
{{:statVal.val}}
-
{{:helper.link('Edit', 'gear', {'cartridge_topic' : "1", 'signaler_target' : value.ref, 'signaler_action' : "Edit", 'signaler_value' : statVal.tab, 'user' : data.user})}}
-
-
- {{/for}}
-{{/for}}
\ No newline at end of file
diff --git a/nano/templates/stat_display_access.tmpl b/nano/templates/stat_display_access.tmpl
deleted file mode 100644
index 20655bb709..0000000000
--- a/nano/templates/stat_display_access.tmpl
+++ /dev/null
@@ -1,57 +0,0 @@
-Station Status Display Interlink
-
-
-
- Code
-
-
- {{:helper.link('Clear Message', 'trash', {'cartridge_topic' : "1", 'stat_display' : "blank"}, (data.stat_display.active == "blank") ? 'selected' : null)}}
- {{:helper.link('Clear Alert', 'alert', {'cartridge_topic' : "1", 'choice' : "Status", 'stat_display' : "alert", 'alert' : "default"}, (data.stat_display.active == "default") ? 'selected' : null)}}
-
-
-
-
- Message
-
-
- {{:helper.link('Shuttle ETA', 'gear', {'cartridge_topic' : "1", 'stat_display' : "shuttle"}, (data.stat_display.active == "shuttle") ? 'selected' : null)}}
- {{:helper.link('Set Message', 'gear', {'cartridge_topic' : "1", 'stat_display' : "message"}, (data.stat_display.active == "message") ? 'selected' : null)}}
-
-
-
-
- Alert
-
-
- {{:helper.link('Red Alert', 'alert', {'cartridge_topic' : "1", 'choice' : "Status", 'stat_display' : "alert", 'alert' : "redalert"}, (data.stat_display.active == "redalert") ? 'selected' : null)}}
- {{:helper.link('Lockdown', 'caution', {'cartridge_topic' : "1", 'choice' : "Status", 'stat_display' : "alert", 'alert' : "lockdown"}, (data.stat_display.active == "lockdown") ? 'selected' : null)}}
- {{:helper.link('Biohazard', 'radiation', {'cartridge_topic' : "1", 'choice' : "Status", 'stat_display' : "alert", 'alert' : "biohazard"}, (data.stat_display.active == "biohazard") ? 'selected' : null)}}
-
-
-{{if data.stat_display.line1 != data.stat_display.active_line1 || data.stat_display.line2 != data.stat_display.active_line2}}
-
-
- Active Message:
-
-
- {{:data.stat_display.active_line1}}
- {{:data.stat_display.active_line2}}
-
-
-{{/if}}
-
-
- Stored line 1
-
-
- {{:helper.link(data.stat_display.line1 + ' (set)', 'pencil', {'cartridge_topic' : "1", 'stat_display' : "setmsg", 'line' : "1"}, null, null)}}
-
-
-
-
- Stored line 2
-
-
- {{:helper.link(data.stat_display.line2 + ' (set)', 'pencil', {'cartridge_topic' : "1", 'stat_display' : "setmsg", 'line' : "2"}, null, null)}}
-
-
diff --git a/polaris.dme b/polaris.dme
index 99442d4de8..ca7c6e04b5 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -1002,7 +1002,6 @@
#include "code\game\objects\items\devices\uplink_random_lists.dm"
#include "code\game\objects\items\devices\violin.dm"
#include "code\game\objects\items\devices\whistle.dm"
-#include "code\game\objects\items\devices\communicator\cartridge.dm"
#include "code\game\objects\items\devices\communicator\communicator.dm"
#include "code\game\objects\items\devices\communicator\helper.dm"
#include "code\game\objects\items\devices\communicator\integrated.dm"