diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm
index acd2be67ea..02c6b5f495 100644
--- a/code/_helpers/global_lists_vr.dm
+++ b/code/_helpers/global_lists_vr.dm
@@ -946,6 +946,26 @@ var/global/list/event_wildlife_roaming = list(
)
+var/global/list/selectable_speech_bubbles = list(
+ "default",
+ "normal",
+ "slime",
+ "comm",
+ "machine",
+ "synthetic",
+ "synthetic_evil",
+ "cyber",
+ "ghost",
+ "slime_green",
+ "dark",
+ "plant",
+ "clown",
+ "fox",
+ "maus",
+ "heart",
+ "textbox",
+ "posessed")
+
// AREA GENERATION AND BLUEPRINT STUFF BELOW HERE
diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm
index cfa6421c6f..d4c40c6179 100644
--- a/code/modules/mob/living/carbon/brain/brain.dm
+++ b/code/modules/mob/living/carbon/brain/brain.dm
@@ -48,7 +48,7 @@
/mob/living/carbon/brain/runechat_holder(datum/chatmessage/CM)
if(isturf(loc))
return ..()
-
+
return loc
/mob/living/carbon/brain/set_typing_indicator(var/state)
@@ -59,8 +59,11 @@
loc.cut_overlay(typing_indicator, TRUE)
return
- if(!typing_indicator)
- init_typing_indicator("[speech_bubble_appearance()]_typing")
+ var/cur_bubble_appearance = custom_speech_bubble
+ if(!cur_bubble_appearance || cur_bubble_appearance == "default")
+ cur_bubble_appearance = speech_bubble_appearance()
+ if(!typing_indicator || cur_typing_indicator != cur_bubble_appearance)
+ init_typing_indicator("[cur_bubble_appearance]_typing")
if(state && !typing)
loc.add_overlay(typing_indicator, TRUE)
@@ -80,7 +83,7 @@
var/datum/transcore_db/db = SStranscore.db_by_mind_name(mind.name)
if(db)
var/datum/transhuman/mind_record/record = db.backed_up[src.mind.name]
- if(!(record.dead_state == MR_DEAD))
+ if(!(record.dead_state == MR_DEAD))
if((world.time - timeofhostdeath ) > 5 MINUTES) //Allows notify transcore to be used if you have an entry but for some reason weren't marked as dead
record.dead_state = MR_DEAD //Such as if you got scanned but didn't take an implant. It's a little funky, but I mean, you got scanned
db.notify(record) //So you probably will want to let someone know if you die.
diff --git a/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm b/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm
index c8e67a39cd..1c2d5dff7d 100644
--- a/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm
@@ -191,3 +191,12 @@
if (visible)
visible_message("\The [src] shifts and contorts, taking the form of \a [new_species]!")
regenerate_icons()
+
+/mob/verb/select_speech_bubble()
+ set name = "Select Speech Bubble"
+ set category = "OOC"
+
+ var/new_speech_bubble = tgui_input_list(src, "Pick new voice!", "Character Preference", selectable_speech_bubbles)
+ if(new_speech_bubble)
+ to_chat(src, "Your voice changes.")
+ custom_speech_bubble = new_speech_bubble
\ No newline at end of file
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 4e34ec87a3..fb78f1b550 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -341,7 +341,9 @@ var/list/channel_to_radio_key = new
//The 'post-say' static speech bubble
var/speech_bubble_test = say_test(message)
//var/image/speech_bubble = image('icons/mob/talk_vr.dmi',src,"h[speech_bubble_test]") //VOREStation Edit. Commented this out in case we need to reenable.
- var/speech_type = speech_bubble_appearance()
+ var/speech_type = custom_speech_bubble
+ if(!speech_type || speech_type == "default")
+ speech_type = speech_bubble_appearance()
var/image/speech_bubble = generate_speech_bubble(src, "[speech_type][speech_bubble_test]")
var/sb_alpha = 255
var/atom/loc_before_turf = src
diff --git a/code/modules/mob/living/voice/voice.dm b/code/modules/mob/living/voice/voice.dm
index 2752292ee2..901807583a 100644
--- a/code/modules/mob/living/voice/voice.dm
+++ b/code/modules/mob/living/voice/voice.dm
@@ -109,7 +109,9 @@
if(comm)
var/speech_bubble_test = say_test(message)
//var/image/speech_bubble = image('icons/mob/talk_vr.dmi',comm,"h[speech_bubble_test]") //VOREStation Edit - Commented out in case of needed reenable.
- var/speech_type = speech_bubble_appearance()
+ var/speech_type = custom_speech_bubble
+ if(!speech_type || speech_type == "default")
+ speech_type = speech_bubble_appearance()
var/image/speech_bubble = generate_speech_bubble(comm, "[speech_type][speech_bubble_test]")
spawn(30)
qdel(speech_bubble)
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index ceb49fa47a..2529936a7a 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -218,6 +218,8 @@
var/typing
var/obj/effect/decal/typing_indicator
+ var/cur_typing_indicator
+ var/custom_speech_bubble = "default"
var/low_priority = FALSE //Skip processing life() if there's just no players on this Z-level
diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm
index bdd5865a9b..5bbce21356 100644
--- a/code/modules/mob/typing_indicator.dm
+++ b/code/modules/mob/typing_indicator.dm
@@ -12,6 +12,9 @@
return I
/mob/proc/init_typing_indicator(var/set_state = "typing")
+ if(typing_indicator)
+ qdel(typing_indicator)
+ typing_indicator = null
typing_indicator = new
typing_indicator.appearance = generate_speech_bubble(null, set_state)
typing_indicator.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) //VOREStation Edit
@@ -23,8 +26,11 @@
cut_overlay(typing_indicator, TRUE)
return
- if(!typing_indicator)
- init_typing_indicator("[speech_bubble_appearance()]_typing")
+ var/cur_bubble_appearance = custom_speech_bubble
+ if(!cur_bubble_appearance || cur_bubble_appearance == "default")
+ cur_bubble_appearance = speech_bubble_appearance()
+ if(!typing_indicator || cur_typing_indicator != cur_bubble_appearance)
+ init_typing_indicator("[cur_bubble_appearance]_typing")
if(state && !typing)
add_overlay(typing_indicator, TRUE)
diff --git a/icons/mob/talk_vr.dmi b/icons/mob/talk_vr.dmi
index 0f192acf2d..a6f366aaad 100644
Binary files a/icons/mob/talk_vr.dmi and b/icons/mob/talk_vr.dmi differ