Files
Bubberstation/code/datums/components/speechmod.dm
FearfulFurnishing e78ab9e59a Fix Tongue Based Speech Modifiers Being Applied To Users Native Languages (#84952)
## About The Pull Request
This change allows tongue based speech modifications to be ignored if
the user is speaking in a native language or using hand signs, putting
it back to where it was functionally before moving to speechmod
components.
## Why It's Good For The Game
This is correcting some of the speaking code to how it was working prior
to speechmods, meaning lizard people won't be elongating there s's in
draconic. Fly people are the other species with a tongue based speech
modifier and receive the same fix. This also corrects tongue based
speech mods getting applied to sign language. Speech modifiers are still
applied if the user is talking in a non-native language, same as it was
pre speechmod.

Before:

![speechmod_demo_before](https://github.com/user-attachments/assets/86d9bca0-2d1d-44fe-8448-b8aebde8957e)
After:

![speechmod_demo_after](https://github.com/user-attachments/assets/9f071df5-0a60-4898-9aae-e8b8edd0db9e)

## Changelog

🆑
fix: fixing speech modifiers being applied to a tongue's native
languages.
/🆑

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2024-07-15 02:33:56 +00:00

135 lines
4.1 KiB
Plaintext

/// Used to apply certain speech patterns
/// Can be used on organs, wearables, mutations and mobs
/datum/component/speechmod
/// Assoc list for strings/regexes and their replacements. Should be lowercase, as case will be automatically changed
var/list/replacements = list()
/// String added to the end of the message
var/end_string = ""
/// Chance for the end string to be applied
var/end_string_chance = 100
/// Current target for modification
var/mob/targeted
/// Slot tags in which this item works when equipped
var/slots
/// If set to true, turns all text to uppercase
var/uppercase = FALSE
/// Any additional checks that we should do before applying the speech modification
var/datum/callback/should_modify_speech = null
/datum/component/speechmod/Initialize(replacements = list(), end_string = "", end_string_chance = 100, slots, uppercase = FALSE, should_modify_speech)
if (!ismob(parent) && !isitem(parent) && !istype(parent, /datum/mutation/human))
return COMPONENT_INCOMPATIBLE
src.replacements = replacements
src.end_string = end_string
src.end_string_chance = end_string_chance
src.slots = slots
src.uppercase = uppercase
src.should_modify_speech = should_modify_speech
if (istype(parent, /datum/mutation/human))
RegisterSignal(parent, COMSIG_MUTATION_GAINED, PROC_REF(on_mutation_gained))
RegisterSignal(parent, COMSIG_MUTATION_LOST, PROC_REF(on_mutation_lost))
return
var/atom/owner = parent
if (ismob(parent))
targeted = parent
RegisterSignal(targeted, COMSIG_MOB_SAY, PROC_REF(handle_speech))
return
if (ismob(owner.loc))
targeted = owner.loc
RegisterSignal(targeted, COMSIG_MOB_SAY, PROC_REF(handle_speech))
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equipped))
RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_unequipped))
RegisterSignal(parent, COMSIG_ORGAN_IMPLANTED, PROC_REF(on_implanted))
RegisterSignal(parent, COMSIG_ORGAN_REMOVED, PROC_REF(on_removed))
/datum/component/speechmod/proc/handle_speech(datum/source, list/speech_args)
SIGNAL_HANDLER
var/message = speech_args[SPEECH_MESSAGE]
if(message[1] == "*")
return
if(!isnull(should_modify_speech) && !should_modify_speech.Invoke(source, speech_args))
return
for (var/to_replace in replacements)
var/replacement = replacements[to_replace]
// Values can be lists to be picked randomly from
if (islist(replacement))
replacement = pick(replacement)
message = replacetextEx(message, to_replace, replacement)
message = trim(message)
if (prob(end_string_chance))
message += islist(end_string) ? pick(end_string) : end_string
speech_args[SPEECH_MESSAGE] = trim(message)
if (uppercase)
return COMPONENT_UPPERCASE_SPEECH
/datum/component/speechmod/proc/on_equipped(datum/source, mob/living/user, slot)
SIGNAL_HANDLER
if (!isnull(slots) && !(slot & slots))
if (!isnull(targeted))
UnregisterSignal(targeted, COMSIG_MOB_SAY)
targeted = null
return
if (targeted == user)
return
targeted = user
RegisterSignal(targeted, COMSIG_MOB_SAY, PROC_REF(handle_speech))
/datum/component/speechmod/proc/on_unequipped(datum/source, mob/living/user)
SIGNAL_HANDLER
if (isnull(targeted))
return
UnregisterSignal(targeted, COMSIG_MOB_SAY)
targeted = null
/datum/component/speechmod/proc/on_implanted(datum/source, mob/living/carbon/receiver)
SIGNAL_HANDLER
if (targeted == receiver)
return
targeted = receiver
RegisterSignal(targeted, COMSIG_MOB_SAY, PROC_REF(handle_speech))
/datum/component/speechmod/proc/on_removed(datum/source, mob/living/carbon/former_owner)
SIGNAL_HANDLER
if (isnull(targeted))
return
UnregisterSignal(targeted, COMSIG_MOB_SAY)
targeted = null
/datum/component/speechmod/proc/on_mutation_gained(datum/source, mob/living/carbon/human/owner)
SIGNAL_HANDLER
if (targeted == owner)
return
targeted = owner
RegisterSignal(targeted, COMSIG_MOB_SAY, PROC_REF(handle_speech))
/datum/component/speechmod/proc/on_mutation_lost(datum/source, mob/living/carbon/human/owner)
SIGNAL_HANDLER
if (isnull(targeted))
return
UnregisterSignal(targeted, COMSIG_MOB_SAY)
targeted = null
/datum/component/speechmod/Destroy()
should_modify_speech = null
return ..()