From 53367ef455080df54b37c11eb7b35d5a46f0f16c Mon Sep 17 00:00:00 2001 From: RKz Date: Sun, 1 Dec 2024 18:37:26 -0500 Subject: [PATCH 1/3] at last, bubbles are fixed --- code/modules/mob/living/say.dm | 2 ++ code/modules/mob/mob_defines.dm | 8 +++--- code/modules/tgui_input/say_modal/typing.dm | 28 +++++++++----------- icons/mob/talk.dmi | Bin 5765 -> 34727 bytes 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index af0c9c8b07bbe..2e56b19125619 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -258,8 +258,10 @@ GLOBAL_LIST_INIT(department_radio_keys, list( var/eavesdrop_range = 0 if(message_mods[WHISPER_MODE]) //If we're whispering eavesdrop_range = EAVESDROP_EXTRA_RANGE + var/list/listening = get_hearers_in_view(message_range+eavesdrop_range, source, SEE_INVISIBLE_MAXIMUM) var/list/the_dead = list() + for(var/mob/M as() in GLOB.player_list) if(!M) //yogs continue //yogs | null in player_list for whatever reason :shrug: diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 6161f9d1e4901..32a5a7959b7a4 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -233,9 +233,9 @@ CREATION_TEST_IGNORE_SELF(/mob) ///Is the mob actively shifting? var/shifting - ///Currently possesses a typing indicator icon - var/typing_indicator = FALSE - /// Thinking indicator - mob has input window open - var/thinking_indicator = FALSE + ///the icon currently used for the typing indicator's bubble + var/active_typing_indicator + ///the icon currently used for the thinking indicator's bubble + var/active_thinking_indicator /// User is thinking in character. Used to revert to thinking state after stop_typing var/thinking_IC = FALSE diff --git a/code/modules/tgui_input/say_modal/typing.dm b/code/modules/tgui_input/say_modal/typing.dm index 2325440d36ff3..a2a6b6f785855 100644 --- a/code/modules/tgui_input/say_modal/typing.dm +++ b/code/modules/tgui_input/say_modal/typing.dm @@ -1,8 +1,6 @@ -/// Thinking -GLOBAL_DATUM_INIT(thinking_indicator, /mutable_appearance, mutable_appearance('icons/mob/talk.dmi', "default3", CALCULATE_MOB_OVERLAY_LAYER(TYPING_LAYER))) + /// Typing GLOBAL_DATUM_INIT(blind_typing_indicator, /mutable_appearance, mutable_appearance('icons/mob/talk.dmi', "default0", (-TYPING_LAYER), BLIND_FEATURE_PLANE, appearance_flags = KEEP_TOGETHER)) -GLOBAL_DATUM_INIT(typing_indicator, /mutable_appearance, mutable_appearance('icons/mob/talk.dmi', "default0", CALCULATE_MOB_OVERLAY_LAYER(TYPING_LAYER))) /** Creates a thinking indicator over the mob. */ /mob/proc/create_thinking_indicator() @@ -76,30 +74,30 @@ GLOBAL_DATUM_INIT(typing_indicator, /mutable_appearance, mutable_appearance('ico /// Overrides for overlay creation /mob/living/create_thinking_indicator() - if(thinking_indicator || typing_indicator || !thinking_IC || stat != CONSCIOUS ) + if(active_thinking_indicator || active_typing_indicator || !thinking_IC || stat != CONSCIOUS ) return FALSE - add_overlay(GLOB.thinking_indicator) - thinking_indicator = TRUE + active_thinking_indicator = mutable_appearance('icons/mob/talk.dmi', "[bubble_icon]3", TYPING_LAYER) + add_overlay(active_thinking_indicator) /mob/living/remove_thinking_indicator() - if(!thinking_indicator) + if(!active_thinking_indicator) return FALSE - cut_overlay(GLOB.thinking_indicator) - thinking_indicator = FALSE + cut_overlay(active_thinking_indicator) + active_thinking_indicator = null /mob/living/create_typing_indicator(override = FALSE) - if(typing_indicator || ((thinking_indicator || !thinking_IC) && !override) || stat != CONSCIOUS) + if(active_typing_indicator || ((active_thinking_indicator || !thinking_IC) && !override) || stat != CONSCIOUS) return FALSE - add_overlay(GLOB.typing_indicator) + active_typing_indicator = mutable_appearance('icons/mob/talk.dmi', "[bubble_icon]0", TYPING_LAYER) + add_overlay(active_typing_indicator) add_overlay(GLOB.blind_typing_indicator) - typing_indicator = TRUE /mob/living/remove_typing_indicator() - if(!typing_indicator) + if(!active_typing_indicator) return FALSE - cut_overlay(GLOB.typing_indicator) + cut_overlay(active_typing_indicator) cut_overlay(GLOB.blind_typing_indicator) - typing_indicator = FALSE + active_typing_indicator = null /mob/living/remove_all_indicators() thinking_IC = FALSE diff --git a/icons/mob/talk.dmi b/icons/mob/talk.dmi index 429e54980382a1b7b1a6dde34df16881b998b148..1beb0adf986368ea4c08e5c4975fe6e709edd89b 100644 GIT binary patch literal 34727 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 Date: Sun, 1 Dec 2024 18:42:09 -0500 Subject: [PATCH 2/3] traitify variable https://github.com/tgstation/tgstation/pull/80122 --- code/__DEFINES/traits/declarations.dm | 4 ++++ code/__DEFINES/traits/sources.dm | 3 +++ code/_globalvars/traits/_traits.dm | 1 + code/modules/mob/mob_defines.dm | 2 -- code/modules/tgui_input/say_modal/typing.dm | 26 +++++++++++---------- 5 files changed, 22 insertions(+), 14 deletions(-) diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 3263780f5015f..e8aab4b2cbbec 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -277,6 +277,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// this object has been frozen #define TRAIT_FROZEN "frozen" + +/// Trait given to a mob that is currently thinking (giving off the "thinking" icon), used in an IC context +#define TRAIT_THINKING_IN_CHARACTER "currently_thinking_IC" + ///Turf trait for when a turf is transparent #define TURF_Z_TRANSPARENT_TRAIT "turf_z_transparent" diff --git a/code/__DEFINES/traits/sources.dm b/code/__DEFINES/traits/sources.dm index fea059205dc72..d2ce6e78b2ab1 100644 --- a/code/__DEFINES/traits/sources.dm +++ b/code/__DEFINES/traits/sources.dm @@ -128,6 +128,9 @@ /// Trait given to an atom/movable when they orbit something. #define ORBITING_TRAIT "orbiting" +/// This trait comes from when a mob is currently typing. +#define CURRENTLY_TYPING_TRAIT "currently_typing" + #define VENTCRAWLING_TRAIT "ventcrawling" #define SPECIES_FLIGHT_TRAIT "species-flight" #define NO_GRAVITY_TRAIT "no-gravity" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index af9e7b2e6796e..5ea9b2d0bc1df 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -93,6 +93,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NOMOBSWAP" = TRAIT_NOMOBSWAP, "TRAIT_XRAY_VISION" = TRAIT_XRAY_VISION, "TRAIT_THERMAL_VISION" = TRAIT_THERMAL_VISION, + "TRAIT_THINKING_IN_CHARACTER" = TRAIT_THINKING_IN_CHARACTER, "TRAIT_ABDUCTOR_TRAINING" = TRAIT_ABDUCTOR_TRAINING, "TRAIT_ABDUCTOR_SCIENTIST_TRAINING" = TRAIT_ABDUCTOR_SCIENTIST_TRAINING, "TRAIT_SURGEON" = TRAIT_SURGEON, diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 32a5a7959b7a4..9969981ccadf7 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -237,5 +237,3 @@ CREATION_TEST_IGNORE_SELF(/mob) var/active_typing_indicator ///the icon currently used for the thinking indicator's bubble var/active_thinking_indicator - /// User is thinking in character. Used to revert to thinking state after stop_typing - var/thinking_IC = FALSE diff --git a/code/modules/tgui_input/say_modal/typing.dm b/code/modules/tgui_input/say_modal/typing.dm index a2a6b6f785855..4b3cc5c1e1589 100644 --- a/code/modules/tgui_input/say_modal/typing.dm +++ b/code/modules/tgui_input/say_modal/typing.dm @@ -31,14 +31,14 @@ GLOBAL_DATUM_INIT(blind_typing_indicator, /mutable_appearance, mutable_appearanc remove_all_indicators() return ..() -/** Sets the mob as "thinking" - with indicator and variable thinking_IC */ +/** Sets the mob as "thinking" - with indicator and the TRAIT_THINKING_IN_CHARACTER trait */ /datum/tgui_say/proc/start_thinking() if(!window_open || !istype(client.mob)) return FALSE /// Special exemptions if(isabductor(client.mob)) return FALSE - client.mob.thinking_IC = TRUE + ADD_TRAIT(client.mob, TRAIT_THINKING_IN_CHARACTER, CURRENTLY_TYPING_TRAIT) client.mob.create_thinking_indicator() /** Removes typing/thinking indicators and flags the mob as not thinking */ @@ -54,10 +54,11 @@ GLOBAL_DATUM_INIT(blind_typing_indicator, /mutable_appearance, mutable_appearanc /datum/tgui_say/proc/start_typing() if(!istype(client.mob)) return FALSE - client.mob.remove_thinking_indicator() - if(!window_open || !client.mob.thinking_IC) + var/mob/client_mob = client.mob + client_mob.remove_thinking_indicator() + if(!window_open || !HAS_TRAIT(client_mob, TRAIT_THINKING_IN_CHARACTER)) return FALSE - client.mob.create_typing_indicator() + client_mob.create_typing_indicator() addtimer(CALLBACK(src, PROC_REF(stop_typing)), 5 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE | TIMER_STOPPABLE) /** @@ -65,28 +66,30 @@ GLOBAL_DATUM_INIT(blind_typing_indicator, /mutable_appearance, mutable_appearanc * If the user was typing IC, the thinking indicator is shown. */ /datum/tgui_say/proc/stop_typing() - if(!client?.mob) + if(isnull(client?.mob)) return FALSE - client.mob.remove_typing_indicator() - if(!window_open || !client.mob.thinking_IC) + var/mob/client_mob = client.mob + client_mob.remove_typing_indicator() + if(!window_open || !HAS_TRAIT(client_mob, TRAIT_THINKING_IN_CHARACTER)) return FALSE - client.mob.create_thinking_indicator() + client_mob.create_thinking_indicator() /// Overrides for overlay creation /mob/living/create_thinking_indicator() - if(active_thinking_indicator || active_typing_indicator || !thinking_IC || stat != CONSCIOUS ) + if(active_thinking_indicator || active_typing_indicator || stat != CONSCIOUS || !HAS_TRAIT(src, TRAIT_THINKING_IN_CHARACTER)) return FALSE active_thinking_indicator = mutable_appearance('icons/mob/talk.dmi', "[bubble_icon]3", TYPING_LAYER) add_overlay(active_thinking_indicator) /mob/living/remove_thinking_indicator() + REMOVE_TRAIT(src, TRAIT_THINKING_IN_CHARACTER, CURRENTLY_TYPING_TRAIT) if(!active_thinking_indicator) return FALSE cut_overlay(active_thinking_indicator) active_thinking_indicator = null /mob/living/create_typing_indicator(override = FALSE) - if(active_typing_indicator || ((active_thinking_indicator || !thinking_IC) && !override) || stat != CONSCIOUS) + if(active_typing_indicator || ((active_thinking_indicator || !HAS_TRAIT(src, TRAIT_THINKING_IN_CHARACTER)) && !override) || stat != CONSCIOUS) return FALSE active_typing_indicator = mutable_appearance('icons/mob/talk.dmi', "[bubble_icon]0", TYPING_LAYER) add_overlay(active_typing_indicator) @@ -100,7 +103,6 @@ GLOBAL_DATUM_INIT(blind_typing_indicator, /mutable_appearance, mutable_appearanc active_typing_indicator = null /mob/living/remove_all_indicators() - thinking_IC = FALSE remove_thinking_indicator() remove_typing_indicator() From b0159a73b6efd46490e3437603b4ae7c3b8c3d8e Mon Sep 17 00:00:00 2001 From: RKz Date: Sun, 1 Dec 2024 18:53:11 -0500 Subject: [PATCH 3/3] commandbar nice https://github.com/tgstation/tgstation/pull/83081 --- beestation.dme | 1 + code/datums/mocking/client.dm | 2 + code/modules/client/client_procs.dm | 5 ++ code/modules/client/verbs/typing.dm | 70 +++++++++++++++++++++ code/modules/tgui_input/say_modal/typing.dm | 29 +++------ html/typing_indicator.html | 46 ++++++++++++++ interface/skin.dmf | 9 +++ 7 files changed, 142 insertions(+), 20 deletions(-) create mode 100644 code/modules/client/verbs/typing.dm create mode 100644 html/typing_indicator.html diff --git a/beestation.dme b/beestation.dme index 91f6f964e1b09..7a1958ecd56dc 100644 --- a/beestation.dme +++ b/beestation.dme @@ -2432,6 +2432,7 @@ #include "code\modules\client\verbs\ooc.dm" #include "code\modules\client\verbs\ping.dm" #include "code\modules\client\verbs\suicide.dm" +#include "code\modules\client\verbs\typing.dm" #include "code\modules\client\verbs\who.dm" #include "code\modules\clothing\chameleon.dm" #include "code\modules\clothing\clothing.dm" diff --git a/code/datums/mocking/client.dm b/code/datums/mocking/client.dm index 05bfd5eab0cc6..8aa24279176a3 100644 --- a/code/datums/mocking/client.dm +++ b/code/datums/mocking/client.dm @@ -6,5 +6,7 @@ /// The view of the client, similar to /client/var/view var/view = "17x15" + var/typing_indicators + /datum/client_interface/proc/should_include_for_role(banning_key = BAN_ROLE_ALL_ANTAGONISTS, role_preference_key = null, poll_ignore_key = null, req_hours = 0, feedback = FALSE) return TRUE diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 31802de2e8c0d..e936068946c1f 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -115,6 +115,9 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( cmd_mentor_pm(href_list["mentor_msg"], null) return TRUE + if(href_list["commandbar_typing"]) + handle_commandbar_typing(href_list) + switch(href_list["_src_"]) if("holder") hsrc = holder @@ -209,6 +212,8 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( tgui_say = new(src, "tgui_say") tgui_asay = new(src, "tgui_asay") + initialize_commandbar_spy() + GLOB.ahelp_tickets.ClientLogin(src) GLOB.mhelp_tickets.ClientLogin(src) GLOB.interviews.client_login(src) diff --git a/code/modules/client/verbs/typing.dm b/code/modules/client/verbs/typing.dm new file mode 100644 index 0000000000000..0fa583baa1cb6 --- /dev/null +++ b/code/modules/client/verbs/typing.dm @@ -0,0 +1,70 @@ +#define IC_VERBS list("say", "me", "whisper") + +/client/var/commandbar_thinking = FALSE +/client/var/commandbar_typing = FALSE + +/client/proc/initialize_commandbar_spy() + src << output('html/typing_indicator.html', "commandbar_spy") + +/client/proc/handle_commandbar_typing(href_list) + //if (!typing_indicators) //check pref + // return + if (length(href_list["verb"]) < 1 || !(LOWER_TEXT(href_list["verb"]) in IC_VERBS) || text2num(href_list["argument_length"]) < 1) + if (commandbar_typing) + commandbar_typing = FALSE + stop_typing() + + if (commandbar_thinking) + commandbar_thinking = FALSE + stop_thinking() + return + + if (!commandbar_thinking) + commandbar_thinking = TRUE + start_thinking() + + if (!commandbar_typing) + commandbar_typing = TRUE + start_typing() + + +/** Sets the mob as "thinking" - with indicator and the TRAIT_THINKING_IN_CHARACTER trait */ +/client/proc/start_thinking() + //if(!typing_indicators) + // return FALSE + /// Special exemptions + if(isabductor(mob)) + return FALSE + ADD_TRAIT(mob, TRAIT_THINKING_IN_CHARACTER, CURRENTLY_TYPING_TRAIT) + mob.create_thinking_indicator() + +/** Removes typing/thinking indicators and flags the mob as not thinking */ +/client/proc/stop_thinking() + mob?.remove_all_indicators() + +/** + * Handles the user typing. After a brief period of inactivity, + * signals the client mob to revert to the "thinking" icon. + */ +/client/proc/start_typing() + var/mob/client_mob = mob + client_mob.remove_thinking_indicator() + if(!HAS_TRAIT(client_mob, TRAIT_THINKING_IN_CHARACTER)) + return FALSE + client_mob.create_typing_indicator() + addtimer(CALLBACK(src, PROC_REF(stop_typing)), 5 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE | TIMER_STOPPABLE) + +/** + * Callback to remove the typing indicator after a brief period of inactivity. + * If the user was typing IC, the thinking indicator is shown. + */ +/client/proc/stop_typing() + if(isnull(mob)) + return FALSE + var/mob/client_mob = mob + client_mob.remove_typing_indicator() + if(!HAS_TRAIT(client_mob, TRAIT_THINKING_IN_CHARACTER)) + return FALSE + client_mob.create_thinking_indicator() + +#undef IC_VERBS diff --git a/code/modules/tgui_input/say_modal/typing.dm b/code/modules/tgui_input/say_modal/typing.dm index 4b3cc5c1e1589..248e419cc5fe5 100644 --- a/code/modules/tgui_input/say_modal/typing.dm +++ b/code/modules/tgui_input/say_modal/typing.dm @@ -33,19 +33,15 @@ GLOBAL_DATUM_INIT(blind_typing_indicator, /mutable_appearance, mutable_appearanc /** Sets the mob as "thinking" - with indicator and the TRAIT_THINKING_IN_CHARACTER trait */ /datum/tgui_say/proc/start_thinking() - if(!window_open || !istype(client.mob)) + if(!window_open) return FALSE - /// Special exemptions - if(isabductor(client.mob)) - return FALSE - ADD_TRAIT(client.mob, TRAIT_THINKING_IN_CHARACTER, CURRENTLY_TYPING_TRAIT) - client.mob.create_thinking_indicator() + return client.start_thinking() /** Removes typing/thinking indicators and flags the mob as not thinking */ /datum/tgui_say/proc/stop_thinking() if(!istype(client.mob)) return FALSE - client.mob.remove_all_indicators() + return client.stop_thinking() /** * Handles the user typing. After a brief period of inactivity, @@ -54,25 +50,18 @@ GLOBAL_DATUM_INIT(blind_typing_indicator, /mutable_appearance, mutable_appearanc /datum/tgui_say/proc/start_typing() if(!istype(client.mob)) return FALSE - var/mob/client_mob = client.mob - client_mob.remove_thinking_indicator() - if(!window_open || !HAS_TRAIT(client_mob, TRAIT_THINKING_IN_CHARACTER)) + if(!window_open) return FALSE - client_mob.create_typing_indicator() - addtimer(CALLBACK(src, PROC_REF(stop_typing)), 5 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE | TIMER_STOPPABLE) + return client.start_typing() /** - * Callback to remove the typing indicator after a brief period of inactivity. + * Remove the typing indicator after a brief period of inactivity or during say events. * If the user was typing IC, the thinking indicator is shown. */ /datum/tgui_say/proc/stop_typing() - if(isnull(client?.mob)) - return FALSE - var/mob/client_mob = client.mob - client_mob.remove_typing_indicator() - if(!window_open || !HAS_TRAIT(client_mob, TRAIT_THINKING_IN_CHARACTER)) + if(!window_open) return FALSE - client_mob.create_thinking_indicator() + client.stop_typing() /// Overrides for overlay creation /mob/living/create_thinking_indicator() @@ -82,7 +71,6 @@ GLOBAL_DATUM_INIT(blind_typing_indicator, /mutable_appearance, mutable_appearanc add_overlay(active_thinking_indicator) /mob/living/remove_thinking_indicator() - REMOVE_TRAIT(src, TRAIT_THINKING_IN_CHARACTER, CURRENTLY_TYPING_TRAIT) if(!active_thinking_indicator) return FALSE cut_overlay(active_thinking_indicator) @@ -103,6 +91,7 @@ GLOBAL_DATUM_INIT(blind_typing_indicator, /mutable_appearance, mutable_appearanc active_typing_indicator = null /mob/living/remove_all_indicators() + REMOVE_TRAIT(src, TRAIT_THINKING_IN_CHARACTER, CURRENTLY_TYPING_TRAIT) remove_thinking_indicator() remove_typing_indicator() diff --git a/html/typing_indicator.html b/html/typing_indicator.html new file mode 100644 index 0000000000000..2988edff55fa0 --- /dev/null +++ b/html/typing_indicator.html @@ -0,0 +1,46 @@ + + + + + + + + + diff --git a/interface/skin.dmf b/interface/skin.dmf index e8643569a7a5a..335f2d218e238 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -119,6 +119,15 @@ window "mainwindow" anchor2 = none is-visible = false saved-params = "" + elem "commandbar_spy" + type = BROWSER + is-default = false + pos = 0,0 + size = 200x200 + anchor1 = -1,-1 + anchor2 = -1,-1 + is-visible = false + saved-params = "" window "mapwindow" elem "mapwindow"