mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-24 00:21:52 +00:00
## 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:  After:  ## Changelog 🆑 fix: fixing speech modifiers being applied to a tongue's native languages. /🆑 --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
135 lines
4.1 KiB
Plaintext
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 ..()
|