diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm
index 471bd9939e..76c45b5d0e 100644
--- a/code/modules/mob/say_vr.dm
+++ b/code/modules/mob/say_vr.dm
@@ -86,15 +86,6 @@ proc/get_top_level_mob(var/mob/S)
else if(!params)
var/subtle_emote = stripped_multiline_input_or_reflect(user, "Choose an emote to display.", "Subtler" , null, MAX_MESSAGE_LEN)
if(subtle_emote && !check_invalid(user, subtle_emote))
- var/type = input("Is this a visible or hearable emote?") as null|anything in list("Visible", "Hearable")
- switch(type)
- if("Visible")
- emote_type = EMOTE_VISIBLE
- if("Hearable")
- emote_type = EMOTE_AUDIBLE
- else
- alert("Unable to use this emote, must be either hearable or visible.")
- return
message = subtle_emote
else
return FALSE
@@ -111,6 +102,77 @@ proc/get_top_level_mob(var/mob/S)
user.visible_message(message = message, self_message = message, vision_distance = 1, ignored_mobs = GLOB.dead_mob_list, omni = TRUE)
+///////////////// SUBTLE 3: DARE DICE
+
+/datum/emote/living/subtler_table
+ key = "subtler_table"
+ key_third_person = "subtler_table"
+ message = null
+ mob_type_blacklist_typecache = list(/mob/living/brain)
+
+/datum/emote/living/subtler_table/proc/check_invalid(mob/user, input)
+ if(stop_bad_mime.Find(input, 1, 1))
+ to_chat(user, "Invalid emote.")
+ return TRUE
+ return FALSE
+
+/datum/emote/living/subtler_table/run_emote(mob/user, params, type_override = null)
+ if(!locate(/obj/structure/table) in range(user, 1))
+ to_chat(user, "There are no tables around you.")
+ return FALSE
+ if(jobban_isbanned(user, "emote"))
+ to_chat(user, "You cannot send subtle emotes (banned).")
+ return FALSE
+ else if(user.client && user.client.prefs.muted & MUTE_IC)
+ to_chat(user, "You cannot send IC messages (muted).")
+ return FALSE
+ else if(!params)
+ var/subtle_emote = stripped_multiline_input_or_reflect(user, "Choose an emote to display.", "Subtler" , null, MAX_MESSAGE_LEN)
+ if(subtle_emote && !check_invalid(user, subtle_emote))
+ message = subtle_emote
+ else
+ return FALSE
+ else
+ message = params
+ if(type_override)
+ emote_type = type_override
+ . = TRUE
+ if(!can_run_emote(user))
+ return FALSE
+
+ user.log_message("[message] (TABLE-WRAPPING)", LOG_SUBTLER)
+ message = "[user] [user.say_emphasis(message)]"
+
+ var/list/show_to = list()
+ var/list/processing = list()
+ var/safety = 25
+ for(var/obj/structure/table/T in range(user, 1))
+ if(safety-- <= 0)
+ to_chat(user, "Table scan aborted early, some people might have not received the message (max 25)")
+ break
+ if(get_dist(T, user) > 7)
+ continue // nah
+ processing |= T
+ for(var/mob/M in range(T, 1))
+ show_to |= M
+ var/obj/structure/table/other
+ other = locate() in get_step(T, NORTH)
+ if(other)
+ processing |= other
+ other = locate() in get_step(T, SOUTH)
+ if(other)
+ processing |= other
+ other = locate() in get_step(T, WEST)
+ if(other)
+ processing |= other
+ other = locate() in get_step(T, EAST)
+ if(other)
+ processing |= other
+
+ for(var/i in show_to)
+ var/mob/M = show_to
+ M.show_message(message)
+
///////////////// VERB CODE
/mob/living/verb/subtle()
set name = "Subtle"
@@ -128,3 +190,12 @@ proc/get_top_level_mob(var/mob/S)
to_chat(usr, "Speech is currently admin-disabled.")
return
usr.emote("subtler")
+
+///////////////// VERB CODE 3
+/mob/living/verb/subtler_table()
+ set name = "Subtler Around Table"
+ set category = "IC"
+ if(GLOB.say_disabled) //This is dumb but it's here because heehoo copypaste, who the FUCK uses this to identify lag?
+ to_chat(usr, "Speech is currently admin-disabled.")
+ return
+ usr.emote("subtler_table")