From 7f9fdbd9a22768e929e9c99862a1b39163317466 Mon Sep 17 00:00:00 2001 From: Geeves Date: Wed, 21 Jul 2021 14:39:06 +0200 Subject: [PATCH] Primary Radio Selection (#12026) 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. --- SQL/migrate/V068__primary_radio_slot.sql | 6 +++ code/_helpers/global_lists.dm | 3 ++ .../preference_setup/general/04_equipment.dm | 16 +++++++- code/modules/client/preferences.dm | 1 + code/modules/mob/living/carbon/human/say.dm | 40 ++++++++++--------- code/modules/mob/living/silicon/silicon.dm | 3 ++ .../simple_animal/friendly/spiderbot.dm | 3 ++ code/modules/mob/mob_helpers.dm | 3 ++ html/changelogs/geeves-default_radio.yml | 6 +++ 9 files changed, 62 insertions(+), 19 deletions(-) create mode 100644 SQL/migrate/V068__primary_radio_slot.sql create mode 100644 html/changelogs/geeves-default_radio.yml 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