diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index d9623d06e8e..0316f824c80 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -18,7 +18,7 @@
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)//VOREStation Edit
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
- access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
+ access_research, access_engine, access_mining, access_construction, access_mailsorting,
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)//VOREStation Edit
minimum_character_age = 25
minimal_player_age = 14
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 231693305fe..9e03e7ff63e 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -1,4 +1,5 @@
// Access check is of the type requires one. These have been carefully selected to avoid allowing the janitor to see channels he shouldn't
+//VOREStation Edit Start - Updating this for Virgo
var/global/list/default_internal_channels = list(
num2text(PUB_FREQ) = list(),
num2text(AI_FREQ) = list(access_synth),
@@ -10,16 +11,18 @@ var/global/list/default_internal_channels = list(
num2text(MED_I_FREQ)=list(access_medical_equip),
num2text(SEC_FREQ) = list(access_security),
num2text(SEC_I_FREQ)=list(access_security),
- num2text(SCI_FREQ) = list(access_tox,access_robotics,access_xenobiology),
- num2text(SUP_FREQ) = list(access_cargo),
- num2text(SRV_FREQ) = list(access_janitor, access_hydroponics)
+ num2text(SCI_FREQ) = list(access_tox, access_robotics, access_xenobiology, access_explorer),
+ num2text(SUP_FREQ) = list(access_cargo, access_mining_station),
+ num2text(SRV_FREQ) = list(access_janitor, access_library, access_hydroponics, access_bar, access_kitchen),
+ num2text(EXP_FREQ) = list(access_explorer, access_pilot, access_rd)
)
var/global/list/default_medbay_channels = list(
num2text(PUB_FREQ) = list(),
- num2text(MED_FREQ) = list(access_medical_equip),
- num2text(MED_I_FREQ) = list(access_medical_equip)
+ num2text(MED_FREQ) = list(),
+ num2text(MED_I_FREQ) = list()
)
+//VOREStation Edit End
/obj/item/device/radio
icon = 'icons/obj/radio_vr.dmi' //VOREStation Edit
@@ -480,6 +483,13 @@ var/global/list/default_medbay_channels = list(
//THIS IS TEMPORARY. YEAH RIGHT
if(!connection) return 0 //~Carn
+//VOREStation Add Start
+ if(bluespace_radio)
+ return Broadcast_Message(connection, M, voicemask, pick(M.speak_emote),
+ src, message, displayname, jobname, real_name, M.voice_name,
+ 0, signal.data["compression"], list(0), connection.frequency,verb,speaking)
+//VOREStation Add End
+
return Broadcast_Message(connection, M, voicemask, pick(M.speak_emote),
src, message, displayname, jobname, real_name, M.voice_name,
filter_type, signal.data["compression"], list(position.z), connection.frequency,verb,speaking)
@@ -518,7 +528,8 @@ var/global/list/default_medbay_channels = list(
if(!(0 in level))
var/turf/position = get_turf(src)
if(!position || !(position.z in level))
- return -1
+ if(!bluespace_radio) //VOREStation Edit
+ return -1
if(freq in ANTAG_FREQS)
if(!(src.syndie))//Checks to see if it's allowed on that frequency, based on the encryption keys
return -1
diff --git a/code/game/objects/items/devices/radio/radio_vr.dm b/code/game/objects/items/devices/radio/radio_vr.dm
new file mode 100644
index 00000000000..d3681423f3b
--- /dev/null
+++ b/code/game/objects/items/devices/radio/radio_vr.dm
@@ -0,0 +1,146 @@
+/obj/item/device/radio
+ var/bluespace_radio = FALSE
+
+/obj/item/device/radio/phone
+ subspace_transmission = 1
+ canhear_range = 0
+ adhoc_fallback = TRUE
+
+/obj/item/device/radio/emergency
+ name = "Medbay Emergency Radio Link"
+ icon_state = "med_walkietalkie"
+ frequency = MED_I_FREQ
+ subspace_transmission = 1
+ adhoc_fallback = TRUE
+
+/obj/item/device/radio/emergency/New()
+ ..()
+ internal_channels = default_medbay_channels.Copy()
+
+//Pathfinder's Subspace Radio
+/obj/item/device/subspaceradio
+ name = "subspace radio"
+ desc = "A powerful new radio recently gifted to Nanotrasen from KHI, this communications device has the ability to send and recieve transmissions from anywhere."
+ icon = 'icons/vore/custom_items_vr.dmi'
+ icon_state = "radiopack"
+ item_state = "parachute"
+ slot_flags = SLOT_BACK
+ force = 5
+ throwforce = 6
+ preserve_item = 1
+ w_class = ITEMSIZE_LARGE
+ action_button_name = "Remove/Replace Handset"
+
+ var/obj/item/device/radio/subspacehandset/linked/handset
+
+/obj/item/device/subspaceradio/New() //starts without a cell for rnd
+ ..()
+ if(ispath(handset))
+ handset = new handset(src, src)
+ else
+ handset = new(src, src)
+
+/obj/item/device/subspaceradio/Destroy()
+ . = ..()
+ QDEL_NULL(handset)
+
+/obj/item/device/subspaceradio/ui_action_click()
+ toggle_handset()
+
+/obj/item/device/subspaceradio/attack_hand(mob/user)
+ if(loc == user)
+ toggle_handset()
+ else
+ ..()
+
+/obj/item/device/subspaceradio/MouseDrop()
+ if(ismob(loc))
+ if(!CanMouseDrop(src))
+ return
+ var/mob/M = loc
+ if(!M.unEquip(src))
+ return
+ add_fingerprint(usr)
+ M.put_in_any_hand_if_possible(src)
+
+/obj/item/device/subspaceradio/attackby(obj/item/weapon/W, mob/user, params)
+ if(W == handset)
+ reattach_handset(user)
+ else
+ return ..()
+
+/obj/item/device/subspaceradio/verb/toggle_handset()
+ set name = "Toggle Handset"
+ set category = "Object"
+
+ var/mob/living/carbon/human/user = usr
+ if(!handset)
+ to_chat(user, "The handset is missing!")
+ return
+
+ if(handset.loc != src)
+ reattach_handset(user) //Remove from their hands and back onto the defib unit
+ return
+
+ if(!slot_check())
+ to_chat(user, "You need to equip [src] before taking out [handset].")
+ else
+ if(!usr.put_in_hands(handset)) //Detach the handset into the user's hands
+ to_chat(user, "You need a free hand to hold the handset!")
+ update_icon() //success
+
+//checks that the base unit is in the correct slot to be used
+/obj/item/device/subspaceradio/proc/slot_check()
+ var/mob/M = loc
+ if(!istype(M))
+ return 0 //not equipped
+
+ if((slot_flags & SLOT_BACK) && M.get_equipped_item(slot_back) == src)
+ return 1
+ if((slot_flags & SLOT_BELT) && M.get_equipped_item(slot_belt) == src)
+ return 1
+
+ return 0
+
+/obj/item/device/subspaceradio/dropped(mob/user)
+ ..()
+ reattach_handset(user) //handset attached to a base unit should never exist outside of their base unit or the mob equipping the base unit
+
+/obj/item/device/subspaceradio/proc/reattach_handset(mob/user)
+ if(!handset) return
+
+ if(ismob(handset.loc))
+ var/mob/M = handset.loc
+ if(M.drop_from_inventory(handset, src))
+ to_chat(user, "\The [handset] snap back into the main unit.")
+ else
+ handset.forceMove(src)
+
+//Subspace Radio Handset
+/obj/item/device/radio/subspacehandset
+ name = "subspace radio handset"
+ desc = "A large walkie talkie attached to the subspace radio by a retractable cord. It sits comfortably on a slot in the radio when not in use."
+ bluespace_radio = TRUE
+ icon_state = "signaller"
+ slot_flags = null
+ w_class = ITEMSIZE_LARGE
+
+/obj/item/device/radio/subspacehandset/linked
+ var/obj/item/device/subspaceradio/base_unit
+
+/obj/item/device/radio/subspacehandset/linked/New(newloc, obj/item/device/subspaceradio/radio)
+ base_unit = radio
+ ..(newloc)
+
+/obj/item/device/radio/subspacehandset/linked/Destroy()
+ if(base_unit)
+ //ensure the base unit's icon updates
+ if(base_unit.handset == src)
+ base_unit.handset = null
+ base_unit = null
+ return ..()
+
+/obj/item/device/radio/subspacehandset/linked/dropped(mob/user)
+ ..() //update twohanding
+ if(base_unit)
+ base_unit.reattach_handset(user) //handset attached to a base unit should never exist outside of their base unit or the mob equipping the base unit
diff --git a/maps/southern_cross/structures/closets/misc_vr.dm b/maps/southern_cross/structures/closets/misc_vr.dm
index 48b2f88d5b1..19738c2f626 100644
--- a/maps/southern_cross/structures/closets/misc_vr.dm
+++ b/maps/southern_cross/structures/closets/misc_vr.dm
@@ -23,6 +23,7 @@
/obj/item/device/geiger,
/obj/item/weapon/cell/device,
/obj/item/device/radio,
+ /obj/item/device/subspaceradio,
/obj/item/stack/marker_beacon/thirty,
/obj/item/weapon/material/knife/tacknife/survival,
/obj/item/weapon/material/knife/machete/deluxe,
diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm
index 2f3d16e25a4..b7c6a777495 100644
--- a/maps/tether/tether-01-surface1.dmm
+++ b/maps/tether/tether-01-surface1.dmm
@@ -13773,11 +13773,7 @@
"aGx" = (
/obj/structure/table/glass,
/obj/item/weapon/storage/toolbox/emergency,
-/obj/item/device/radio{
- frequency = 1487;
- icon_state = "med_walkietalkie";
- name = "Medbay Emergency Radio Link"
- },
+/obj/item/device/radio/emergency,
/obj/machinery/recharger,
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/first_aid_west)
@@ -14750,14 +14746,7 @@
/area/engineering/atmos/processing)
"aJj" = (
/obj/structure/table/glass,
-/obj/item/device/radio{
- anchored = 1;
- broadcasting = 0;
- canhear_range = 1;
- frequency = 1487;
- icon = 'icons/obj/items.dmi';
- icon_state = "red_phone";
- listening = 1;
+/obj/item/device/radio/phone/medbay{
name = "Medical Emergency Phone"
},
/obj/machinery/atmospherics/unary/vent_pump/on{
diff --git a/vorestation.dme b/vorestation.dme
index ebbe11cd2dd..0d7d0129db4 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -1001,6 +1001,7 @@
#include "code\game\objects\items\devices\radio\intercom.dm"
#include "code\game\objects\items\devices\radio\jammer.dm"
#include "code\game\objects\items\devices\radio\radio.dm"
+#include "code\game\objects\items\devices\radio\radio_vr.dm"
#include "code\game\objects\items\robot\robot_items.dm"
#include "code\game\objects\items\robot\robot_parts.dm"
#include "code\game\objects\items\robot\robot_upgrades.dm"