diff --git a/code/datums/wires/radio.dm b/code/datums/wires/radio.dm
index 9da8890ac32..6c2fb9713da 100644
--- a/code/datums/wires/radio.dm
+++ b/code/datums/wires/radio.dm
@@ -12,11 +12,6 @@ var/const/WIRE_TRANSMIT = 4
return 1
return 0
-/datum/wires/radio/Interact(var/mob/living/user)
- if(CanUse(user))
- var/obj/item/device/radio/R = holder
- R.interact(user)
-
/datum/wires/radio/UpdatePulsed(var/index)
var/obj/item/device/radio/R = holder
switch(index)
diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm
index 56d6fbbdafd..aea107885f7 100644
--- a/code/game/objects/items/devices/radio/electropack.dm
+++ b/code/game/objects/items/devices/radio/electropack.dm
@@ -10,11 +10,13 @@
materials = list(MAT_METAL=10000, MAT_GLASS=2500)
var/code = 2
+ is_special = 1
+
/obj/item/device/radio/electropack/attack_hand(mob/user as mob)
if(src == user.back)
user << "You need help taking this off!"
- return
- ..()
+ return 0
+ . = ..()
/obj/item/device/radio/electropack/Destroy()
if(istype(src.loc, /obj/item/assembly/shock_kit))
@@ -53,42 +55,22 @@
A.flags |= NODROP
/obj/item/device/radio/electropack/Topic(href, href_list)
- //..()
- if(usr.stat || usr.restrained())
- return
- if(((istype(usr, /mob/living/carbon/human) && ((!( ticker ) || (ticker && ticker.mode != "monkey")) && usr.contents.Find(src))) || (usr.contents.Find(master) || (in_range(src, usr) && istype(loc, /turf)))))
- usr.set_machine(src)
- if(href_list["freq"])
- var/new_frequency = sanitize_frequency(frequency + text2num(href_list["freq"]))
- set_frequency(new_frequency)
- else
- if(href_list["code"])
- code += text2num(href_list["code"])
- code = round(code)
- code = min(100, code)
- code = max(1, code)
- else
- if(href_list["power"])
- on = !( on )
- icon_state = "electropack[on]"
- if(!( master ))
- if(istype(loc, /mob))
- attack_self(loc)
- else
- for(var/mob/M in viewers(1, src))
- if(M.client)
- attack_self(M)
- else
- if(istype(master.loc, /mob))
- attack_self(master.loc)
- else
- for(var/mob/M in viewers(1, master))
- if(M.client)
- attack_self(M)
- else
- usr << browse(null, "window=radio")
- return
- return
+ if(..())
+ return 1
+
+ if(href_list["freq"])
+ var/new_frequency = sanitize_frequency(frequency + text2num(href_list["freq"]))
+ set_frequency(new_frequency)
+
+ else if(href_list["code"])
+ code += text2num(href_list["code"])
+ code = round(code)
+ code = Clamp(code, 1, 100)
+
+ else if(href_list["power"])
+ on = !on
+
+ add_fingerprint(usr)
/obj/item/device/radio/electropack/receive_signal(datum/signal/signal)
if(!signal || signal.encryption != code)
@@ -115,26 +97,17 @@
master.receive_signal()
return
-/obj/item/device/radio/electropack/attack_self(mob/user as mob, flag1)
- if(!istype(user, /mob/living/carbon/human))
- return
- user.set_machine(src)
- var/dat = {"
-Turn [on ? "Off" : "On"]
-Frequency/Code for electropack:
-Frequency:
--
-- [format_frequency(frequency)]
-+
-+
+/obj/item/device/radio/electropack/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ var/data[0]
-Code:
--
-- [code]
-+
-+
-"}
- user << browse(dat, "window=radio")
- onclose(user, "radio")
- return
+ data["power"] = on
+ data["freq"] = format_frequency(frequency)
+ data["code"] = code
+
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "radio_electro.tmpl", "[name]", 400, 500)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
\ No newline at end of file
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 4aa8f8b73f0..1ef94fde8d2 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -38,6 +38,9 @@ var/global/list/default_medbay_channels = list(
var/list/channels = list() //see communications.dm for full list. First channes is a "default" for :h
var/subspace_transmission = 0
var/syndie = 0//Holder to see if it's a syndicate encrpyed radio
+
+ var/is_special = 0 //For electropacks mostly, skips Topic() checks
+
flags = CONDUCT
slot_flags = SLOT_BELT
throw_speed = 2
@@ -89,59 +92,68 @@ var/global/list/default_medbay_channels = list(
secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT)
/obj/item/device/radio/attack_ghost(mob/user)
- interact(user)
+ return ui_interact(user)
/obj/item/device/radio/attack_self(mob/user as mob)
user.set_machine(src)
interact(user)
-/obj/item/device/radio/interact(mob/user as mob)
- if(!on)
- return
+/obj/item/device/radio/interact(mob/user)
+ if(!user)
+ return 0
- if(active_uplink_check(user))
- return
+ if(b_stat)
+ wires.Interact(user)
- var/dat = "
[src]"
+ return ui_interact(user)
- if(!istype(src, /obj/item/device/radio/headset)) //Headsets dont get a mic button
- dat += "Microphone: [broadcasting ? "Engaged" : "Disengaged"]
"
+/obj/item/device/radio/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ var/data[0]
- dat += {"
- Speaker: [listening ? "Engaged" : "Disengaged"]
- Frequency:
- -
- -
- [format_frequency(frequency)]
- +
- +
- "}
+ data["mic_status"] = broadcasting
+ data["speaker"] = listening
+ data["freq"] = format_frequency(frequency)
+ data["rawfreq"] = num2text(frequency)
- dat+=list_channels(user)
+ data["mic_cut"] = (wires.IsIndexCut(WIRE_TRANSMIT) || wires.IsIndexCut(WIRE_SIGNAL))
+ data["spk_cut"] = (wires.IsIndexCut(WIRE_RECEIVE) || wires.IsIndexCut(WIRE_SIGNAL))
- dat+={"[text_wires()]"}
- user << browse(dat, "window=radio")
- onclose(user, "radio")
- return
+ var/list/chanlist = list_channels(user)
+ if(islist(chanlist) && chanlist.len)
+ data["chan_list"] = chanlist
+ data["chan_list_len"] = chanlist.len
+
+ if(syndie)
+ data["useSyndMode"] = 1
+
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "radio_basic.tmpl", "[name]", 400, 550)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
/obj/item/device/radio/proc/list_channels(var/mob/user)
return list_internal_channels(user)
/obj/item/device/radio/proc/list_secure_channels(var/mob/user)
- var/dat = ""
- for (var/ch_name in channels)
- dat+=text_sec_channel(ch_name, channels[ch_name])
+ var/dat[0]
+
+ for(var/ch_name in channels)
+ var/chan_stat = channels[ch_name]
+ var/listening = !!(chan_stat & FREQ_LISTENING) != 0
+
+ dat.Add(list(list("chan" = ch_name, "display_name" = ch_name, "secure_channel" = 1, "sec_channel_listen" = !listening)))
+
return dat
/obj/item/device/radio/proc/list_internal_channels(var/mob/user)
- var/dat = ""
- for (var/internal_chan in internal_channels)
+ var/dat[0]
+ for(var/internal_chan in internal_channels)
if(has_channel_access(user, internal_chan))
- dat+="[get_frequency_name(text2num(internal_chan))]
"
+ dat.Add(list(list("chan" = internal_chan, "display_name" = get_frequency_name(text2num(internal_chan)))))
- if(dat)
- dat = "
Internal Channels
" + dat
return dat
/obj/item/device/radio/proc/has_channel_access(var/mob/user, var/freq)
@@ -169,13 +181,6 @@ var/global/list/default_medbay_channels = list(
return wires.GetInteractWindow()
return
-/obj/item/device/radio/proc/text_sec_channel(var/chan_name, var/chan_stat)
- var/list = !!(chan_stat&FREQ_LISTENING)!=0
- return {"
- [chan_name]
- Speaker: [list ? "Engaged" : "Disengaged"]
- "}
-
/obj/item/device/radio/proc/ToggleBroadcast()
broadcasting = !broadcasting && !(wires.IsIndexCut(WIRE_TRANSMIT) || wires.IsIndexCut(WIRE_SIGNAL))
@@ -186,6 +191,9 @@ var/global/list/default_medbay_channels = list(
if(..())
return 1
+ if(is_special)
+ return 0
+
if (href_list["track"])
var/mob/target = locate(href_list["track"])
var/mob/living/silicon/ai/A = locate(href_list["track2"])
@@ -205,7 +213,7 @@ var/global/list/default_medbay_channels = list(
else if (href_list["talk"])
ToggleBroadcast()
. = 1
- else if (href_list["listen"])
+ else if(href_list["listen"])
var/chan_name = href_list["ch_name"]
if (!chan_name)
ToggleReception()
@@ -220,11 +228,10 @@ var/global/list/default_medbay_channels = list(
if(has_channel_access(usr, freq))
set_frequency(text2num(freq))
. = 1
+
if(href_list["nowindow"]) // here for pAIs, maybe others will want it, idk
return 1
- if(.)
- interact(usr)
add_fingerprint(usr)
/obj/item/device/radio/proc/autosay(var/message, var/from, var/channel, var/zlevel = config.contact_levels) //BS12 EDIT
@@ -576,6 +583,11 @@ var/global/list/default_medbay_channels = list(
syndie = 1
keyslot = new /obj/item/device/encryptionkey/syndicate
+/obj/item/device/radio/borg/syndicate/CanUseTopic(mob/user, datum/topic_state/state)
+ . = ..()
+ if(. == STATUS_UPDATE && istype(user, /mob/living/silicon/robot/syndicate))
+ . = STATUS_INTERACTIVE
+
/obj/item/device/radio/borg/Destroy()
myborg = null
return ..()
@@ -703,32 +715,40 @@ var/global/list/default_medbay_channels = list(
usr << "Loudspeaker enabled."
. = 1
- if(.)
- interact(usr)
/obj/item/device/radio/borg/interact(mob/user as mob)
if(!on)
return
- var/dat = "[src]"
- dat += {"
- Speaker: [listening ? "Engaged" : "Disengaged"]
- Frequency:
- -
- -
- [format_frequency(frequency)]
- +
- +
- Broadcasting: [subspace_transmission ? "Disable" : "Enable"]
- Loudspeaker: [shut_up ? "Enable" : "Disable"]
- "}
+ . = ..()
- if(subspace_transmission)//Don't even bother if subspace isn't turned on
- dat+=list_channels(user)
- dat+={"[text_wires()]"}
- user << browse(dat, "window=radio")
- onclose(user, "radio")
- return
+/obj/item/device/radio/borg/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ var/data[0]
+
+ data["mic_status"] = broadcasting
+ data["speaker"] = listening
+ data["freq"] = format_frequency(frequency)
+ data["rawfreq"] = num2text(frequency)
+
+ var/list/chanlist = list_channels(user)
+ if(islist(chanlist) && chanlist.len)
+ data["chan_list"] = chanlist
+ data["chan_list_len"] = chanlist.len
+
+ if(syndie)
+ data["useSyndMode"] = 1
+
+ data["has_loudspeaker"] = 1
+ data["loudspeaker"] = !shut_up
+ data["has_subspace"] = 1
+ data["subspace"] = subspace_transmission
+
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "radio_basic.tmpl", "[name]", 430, 500)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
/obj/item/device/radio/proc/config(op)
if(radio_controller)
diff --git a/nano/templates/radio_basic.tmpl b/nano/templates/radio_basic.tmpl
new file mode 100644
index 00000000000..9aaad8cb489
--- /dev/null
+++ b/nano/templates/radio_basic.tmpl
@@ -0,0 +1,89 @@
+
+{{if data.useSyndMode}}
+ {{:helper.syndicateMode()}}
+{{/if}}
+
+
+
+ Microphone
+
+
+ {{if data.mic_cut}}
+ {{:helper.link('On', null, null, 'disabled')}}
+ {{:helper.link('Off', null, null, 'disabled')}}
+ {{else}}
+ {{:helper.link('On', null, {'talk' : 0}, data.mic_status ? 'selected' : null)}}
+ {{:helper.link('Off', null, {'talk' : 1}, data.mic_status ? null : 'selected')}}
+ {{/if}}
+
+
+
+
+
+ Speaker
+
+
+ {{if data.spk_cut}}
+ {{:helper.link('On', null, null, 'disabled')}}
+ {{:helper.link('Off', null, null, 'disabled')}}
+ {{else}}
+ {{:helper.link('On', null, {'listen' : 0}, data.speaker ? 'selected' : null)}}
+ {{:helper.link('Off', null, {'listen' : 1}, data.speaker ? null : 'selected')}}
+ {{/if}}
+
+
+
+{{if data.has_subspace}}
+
+ Subspace Transmission:
+
+
+ {{:helper.link('On', null, {'mode' : 1}, data.subspace ? 'selected' : null)}}
+ {{:helper.link('Off', null, {'mode' : 0}, data.subspace ? null : 'selected')}}
+
+{{/if}}
+
+{{if data.has_loudspeaker}}
+
+ Loudspeaker:
+
+
+ {{:helper.link('On', null, {'shutup' : 0}, data.loudspeaker ? 'selected' : null)}}
+ {{:helper.link('Off', null, {'shutup' : 1}, data.loudspeaker ? null : 'selected')}}
+
+{{/if}}
+
+
+
+ Frequency: {{:data.freq}}
+
+
+ {{:helper.link('--', null, {'freq' : -10})}}
+ {{:helper.link('-', null, {'freq' : -2})}}
+ {{:helper.link('+', null, {'freq' : 2})}}
+ {{:helper.link('++', null, {'freq' : 10})}}
+
+
+
+{{if data.chan_list_len >= 1}}
+ Channels
+
+ {{for data.chan_list}}
+
+ {{:value.display_name}}
+
+
+ {{if value.secure_channel}}
+ Speaker:
+ {{:helper.link('On', null, {'ch_name' : value.chan, 'listen' : value.sec_channel_listen}, value.sec_channel_listen ? null : 'selected')}}
+ {{:helper.link('Off', null, {'ch_name' : value.chan, 'listen' : value.sec_channel_listen}, value.sec_channel_listen ? 'selected' : null)}}
+ {{else}}
+ {{:helper.link('Switch', null, {'spec_freq' : value.chan}, data.rawfreq == value.chan ? 'selected' : null)}}
+ {{/if}}
+
+ {{/for}}
+
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/radio_electro.tmpl b/nano/templates/radio_electro.tmpl
new file mode 100644
index 00000000000..9fb8183ad01
--- /dev/null
+++ b/nano/templates/radio_electro.tmpl
@@ -0,0 +1,37 @@
+
+
+
+ Power
+
+
+ {{:helper.link('On', null, {'power' : 1}, data.power ? 'selected' : null)}}
+ {{:helper.link('Off', null, {'power' : 1}, data.power ? null : 'selected')}}
+
+
+
+
+
+ Frequency: {{:data.freq}}
+
+
+ {{:helper.link('--', null, {'freq' : -10})}}
+ {{:helper.link('-', null, {'freq' : -2})}}
+ {{:helper.link('+', null, {'freq' : 2})}}
+ {{:helper.link('++', null, {'freq' : 10})}}
+
+
+
+
+
+ Code: {{:data.code}}
+
+
+ {{:helper.link('--', null, {'code' : -5})}}
+ {{:helper.link('-', null, {'code' : -1})}}
+ {{:helper.link('+', null, {'code' : 1})}}
+ {{:helper.link('++', null, {'code' : 5})}}
+
+
\ No newline at end of file