diff --git a/SQL/migrate/V068__primary_radio_slot.sql b/SQL/migrate/V068__primary_radio_slot.sql
new file mode 100644
index 00000000000..829573f12ad
--- /dev/null
+++ b/SQL/migrate/V068__primary_radio_slot.sql
@@ -0,0 +1,6 @@
+--
+-- Add a new primary radio slot field
+--
+
+ALTER TABLE `ss13_characters`
+ ADD COLUMN `primary_radio_slot` char(9) DEFAULT 'Left Ear' AFTER `floating_chat_color`
\ No newline at end of file
diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm
index fa1282b580e..402b553bc7e 100644
--- a/code/_helpers/global_lists.dm
+++ b/code/_helpers/global_lists.dm
@@ -69,6 +69,9 @@ var/global/list/pdalist = list("Nothing", "Standard PDA", "Classic PDA", "Rugged
//Headset choice
var/global/list/headsetlist = list("Nothing", "Headset", "Bowman Headset")
+// Primary Radio Slot choice
+var/global/list/primary_radio_slot_choice = list("Left Ear", "Right Ear")
+
// Visual nets
var/list/datum/visualnet/visual_nets = list()
var/datum/visualnet/camera/cameranet = new()
diff --git a/code/modules/client/preference_setup/general/04_equipment.dm b/code/modules/client/preference_setup/general/04_equipment.dm
index 55d6fd0396d..3accf3e2caa 100644
--- a/code/modules/client/preference_setup/general/04_equipment.dm
+++ b/code/modules/client/preference_setup/general/04_equipment.dm
@@ -13,6 +13,7 @@
S["backbag_style"] >> pref.backbag_style
S["pda_choice"] >> pref.pda_choice
S["headset_choice"] >> pref.headset_choice
+ S["primary_radio_slot"] >> pref.primary_radio_slot
/datum/category_item/player_setup_item/general/equipment/save_character(var/savefile/S)
S["all_underwear"] << pref.all_underwear
@@ -21,6 +22,7 @@
S["backbag_style"] << pref.backbag_style
S["pda_choice"] << pref.pda_choice
S["headset_choice"] << pref.headset_choice
+ S["primary_radio_slot"] << pref.primary_radio_slot
/datum/category_item/player_setup_item/general/equipment/gather_load_query()
return list(
@@ -31,7 +33,8 @@
"backbag",
"backbag_style",
"pda_choice",
- "headset_choice"
+ "headset_choice",
+ "primary_radio_slot"
),
"args" = list("id")
)
@@ -49,6 +52,7 @@
"backbag_style",
"pda_choice",
"headset_choice",
+ "primary_radio_slot",
"id" = 1,
"ckey" = 1
)
@@ -62,6 +66,7 @@
"backbag_style" = pref.backbag_style,
"pda_choice" = pref.pda_choice,
"headset_choice" = pref.headset_choice,
+ "primary_radio_slot" = pref.primary_radio_slot,
"id" = pref.current_character,
"ckey" = PREF_CLIENT_CKEY
)
@@ -116,6 +121,8 @@
pref.backbag_style = sanitize_integer(pref.backbag_style, 1, backbagstyles.len, initial(pref.backbag_style))
pref.pda_choice = sanitize_integer(pref.pda_choice, 1, pdalist.len, initial(pref.pda_choice))
pref.headset_choice = sanitize_integer(pref.headset_choice, 1, headsetlist.len, initial(pref.headset_choice))
+ if(!(pref.primary_radio_slot in primary_radio_slot_choice))
+ pref.primary_radio_slot = primary_radio_slot_choice[1]
/datum/category_item/player_setup_item/general/equipment/content(var/mob/user)
. = list()
@@ -135,6 +142,7 @@
. += "Backpack Style: [backbagstyles[pref.backbag_style]]
"
. += "PDA Type: [pdalist[pref.pda_choice]]
"
. += "Headset Type: [headsetlist[pref.headset_choice]]
"
+ . += "Primary Radio Slot: [pref.primary_radio_slot]
"
return jointext(., null)
@@ -179,6 +187,12 @@
pref.headset_choice = headsetlist.Find(new_headset)
return TOPIC_REFRESH_UPDATE_PREVIEW
+ else if(href_list["change_radio_slot"])
+ var/new_slot = input(user, "Choose which radio will be spoken into first if multiple slots are occupied.", "Charcter Preference", pref.primary_radio_slot) as null|anything in primary_radio_slot_choice
+ if(!isnull(new_slot) && CanUseTopic(user))
+ pref.primary_radio_slot = new_slot
+ return TOPIC_REFRESH_UPDATE_PREVIEW
+
else if(href_list["change_underwear"])
var/datum/category_group/underwear/UWC = global_underwear.categories_by_name[href_list["change_underwear"]]
if(!UWC)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 243ccc93746..0ea8c755f9b 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -45,6 +45,7 @@ datum/preferences
var/backbag_style = 1
var/pda_choice = OUTFIT_TAB_PDA
var/headset_choice = OUTFIT_HEADSET
+ var/primary_radio_slot = "Left Ear"
var/h_style = "Bald" //Hair type
var/hair_colour = "#000000" //Hair colour hex value, for SQL loading
var/r_hair = 0 //Hair color
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 3cdd9b3c40d..5bddb2d3c9b 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -146,6 +146,19 @@
returns = species.handle_speech_problems(src, returns, message, verb, message_mode)
return returns
+/mob/living/carbon/human/get_radio()
+ var/list/headsets = list()
+ if(istype(l_ear, /obj/item/device/radio))
+ headsets["Left Ear"] = l_ear
+ if(istype(r_ear, /obj/item/device/radio))
+ headsets["Right Ear"] = r_ear
+
+ if(length(headsets))
+ if(client && (client.prefs.primary_radio_slot in headsets))
+ return headsets[client.prefs.primary_radio_slot]
+ return headsets[headsets[1]]
+ return null
+
/mob/living/carbon/human/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name, successful_radio)
if(paralysis || InStasis())
whisper_say(message, speaking, alt_name)
@@ -158,15 +171,10 @@
if(I.talk_into(src, message, null, verb, speaking))
successful_radio += I
if("headset")
- if(istype(l_ear,/obj/item/device/radio))
- var/obj/item/device/radio/R = l_ear
+ var/obj/item/device/radio/R = get_radio()
+ if(R)
used_radios += l_ear
- if(R.talk_into(src,message,null,verb,speaking))
- successful_radio += R
- else if(istype(r_ear,/obj/item/device/radio))
- var/obj/item/device/radio/R = r_ear
- used_radios += r_ear
- if(R.talk_into(src,message,null,verb,speaking))
+ if(R.talk_into(src, message, null, verb, speaking))
successful_radio += R
if("right ear")
var/obj/item/device/radio/R
@@ -197,16 +205,12 @@
if("whisper")
whisper_say(message, speaking, alt_name)
return 1
- else
- if(message_mode)
- if(istype(l_ear, /obj/item/device/radio))
- used_radios += l_ear
- if(l_ear.talk_into(src,message, message_mode, verb, speaking))
- successful_radio += l_ear
- else if(istype(r_ear, /obj/item/device/radio))
- used_radios += r_ear
- if(r_ear.talk_into(src,message, message_mode, verb, speaking))
- successful_radio += r_ear
+ else if(message_mode)
+ var/obj/item/device/radio/R = get_radio()
+ if(R)
+ used_radios += l_ear
+ if(R.talk_into(src, message, message_mode, verb, speaking))
+ successful_radio += R
/mob/living/carbon/human/handle_speech_sound()
var/list/returns = ..()
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 42a6271063d..e6218654002 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -392,3 +392,6 @@
/mob/living/silicon/get_bullet_impact_effect_type(var/def_zone)
return BULLET_IMPACT_METAL
+
+/mob/living/silicon/get_radio()
+ return common_radio
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
index 6eb0fcc8883..77985304bf5 100644
--- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
+++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
@@ -188,6 +188,9 @@
remove_language("Robot Talk")
positronic = null
+/mob/living/simple_animal/spiderbot/get_radio()
+ return radio
+
/mob/living/simple_animal/spiderbot/Destroy()
eject_brain()
return ..()
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index ad09d11c0c2..6d02cd6e20f 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -1222,6 +1222,9 @@ proc/is_blind(A)
/mob/get_cell()
return FALSE
+/mob/proc/get_radio()
+ return null
+
/mob/proc/can_hear_radio(var/list/speaker_coverage = list())
var/turf/ear = get_turf(src)
if(ear && speaker_coverage[ear])
diff --git a/html/changelogs/geeves-default_radio.yml b/html/changelogs/geeves-default_radio.yml
new file mode 100644
index 00000000000..d9fc3d13291
--- /dev/null
+++ b/html/changelogs/geeves-default_radio.yml
@@ -0,0 +1,6 @@
+author: Geeves
+
+delete-after: True
+
+changes:
+ - rscadd: "You can now choose which slot is your primary radio slot between your left and right ears. If both ears have a headset on them, the primary radio will be used."
\ No newline at end of file