* next set of spans
* some more
* next
* next
* next
* .
* text...
* next... rest soon
* .
* .
* ok last set for the night
* .
* .
* .
* .
* some more
* next
* next
* all for now
* .
* some more easy ones
* some more easy ones
* .
* .
* some more bolds
* oups auto complete moment
* add the remaining spans
* this as well
* this as well
* .
* .,
* resync them properly
Replaces all direct references held in the /datum with WEAKREF(atom). This should reduce potential lag impacts from stuff getting blown up or dying or becoming invalid.
Makes it so non-mob atoms with either \improper names, or lowercase names or names without "The" become preceeded by "The" when narrated using loud & talk, loud & emote, not-loud & talk, not-loud & emote.
Preceeding with lower case "the" causes doubling of "the", but that's a general byond issue and is solved by proper capitalization or use of \proper and it causing issues here would cause issues elsewhere anyway.
Done per request from ResidentCody
* Removed special protection for mobs with clients
* * Instead, the GM is warned not to abuse this and each use will be logged
* * Added logging everywhere we previously used return or continue to prevent client narration
* * Kept !!!Player!!! typing rather than showing their actual path
* Added prevention of duplicate entity names.
* * Recursively calls the add entity proc until cancelled or a valid name is given
* Only sanitizes the message after it's passed to mob_args() for basic interface, and only for non-mob ones as mob one calls procs that sanitize the input themselves
* Likewise for TGUI, sanitization is only done within the actual narration proc to avoid double sanitization breaking things.
* While at it, I re-introduced [mode] to classic input's instruction string. I had it originally, then removed it while pruning code duplication. I realize I can add it back now.
*Adds all the necessary procs for TGUI functionality as backend
*Creates EntityNarrate.tsx
*Extends entity_narrate datum with helper vars for TGUI
*TGUI window now allows:
* * Multi Selection
* * Single Selection
* * It shows details if single
* * It shows how many if multi
* * Allows picking between subtle/loud
* * Allows picking between talk/emote
* * Allows sending messages every 0.5 seconds
* * Uses new textbox feature to make editing and tracking narration easy!
* Makes entity_narrate() call entity_narrate_args() with input gleaned from user interface
* Sanitizes text input. Multiple times: custom IDs are sanitized on creation
* Interface text input sanitized on input
* Sanitizes arguments of argument based function as well
* Enables multi-line text input when making messages using interface.
* Multiline also works with commandline tool using \n
* Changed type checks to check for /atom for non-mobs
* Changed static typing to use /atom for non-mobs
* Rearranged code logic where relevant so we only check for /atom if mob/living came out invalid
* Added a guard clause against observers on adding a ref. Only added to this as there's hopefully no way to access ghosts with the remaining procs
* Also added "Remove All" as an option for removing refs. It requires confirmation.
*Adds verbs to client: Narrate Entity, ... (Add ref), ... (Remove ref), ... (Interface)
* Adds new Client var to hold reference to entity_narrate datum instance
*Creates entity_narrate datum to hold list of unique/custom entity names, and an assoc list of name:atomref
* All listed client verbs initialize the datum onto the client var for later use when first used
* User is expected to right click mobs within viewrange to add them to ref list
* User is prompted to create a unique identifier to generate the key:value pair
* User may either request an interface to do the narration (interface)
* User may alternatively go narrate-mob "identifier" "speak/emote" "narration" into command line
* In case of argument call, message may be ommited to bring up non-multiline tgui_input_text
* User may remove entities from their personal list at will
* Users adding entities to their personal list are logged
* Users attempting to add players to their personal list are likewise logged
* Users succeeding despite this are logged if they try to speak for them
* If type is mob/living, it uses .say and .custom_emote() procs
* .say uses the mob's languages, stutters and so forth
* if type is obj/, user must specific speech verb when composing narration.
* User may narrate from any range.
* Each proc checks for R_FUN permission and prevents using if lacking rights