GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code
/datum/element/flavor_text
element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
id_arg_index = 3
var/flavor_name = "Flavor Text"
var/list/texts_by_atom = list()
var/addendum = ""
var/always_show = FALSE
var/show_on_naked = FALSE //SPLURT edit
var/max_len = MAX_FLAVOR_LEN
var/can_edit = TRUE
/// For preference/DNA saving/loading. Null to prevent. Prefs are only loaded from obviously if it exists in preferences.features.
var/save_key
/// Do not attempt to render a preview on examine. If this is on, it will display as \[flavor_name\]
var/examine_no_preview = FALSE
/// Examine FULLY views. Overrides examine_no_preview
var/examine_full_view = FALSE
/datum/element/flavor_text/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE, _save_key, _examine_no_preview = FALSE, _show_on_naked)
. = ..()
if(. == ELEMENT_INCOMPATIBLE || !isatom(target)) //no reason why this shouldn't work on atoms too.
return ELEMENT_INCOMPATIBLE
if(_max_len)
max_len = _max_len
texts_by_atom[target] = copytext(text, 1, max_len)
if(_name)
flavor_name = _name
if(!isnull(addendum))
addendum = _addendum
show_on_naked = _show_on_naked
always_show = _always_show
can_edit = _edit
save_key = _save_key
examine_no_preview = _examine_no_preview
RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/show_flavor)
if(can_edit && ismob(target)) //but only mobs receive the proc/verb for the time being
var/mob/M = target
LAZYOR(GLOB.mobs_with_editable_flavor_text[M], src)
add_verb(M, /mob/proc/manage_flavor_tests)
if(!save_key)
return
if(ishuman(target))
RegisterSignal(target, COMSIG_HUMAN_PREFS_COPIED_TO, .proc/update_prefs_flavor_text)
else if(iscyborg(target))
RegisterSignal(target, COMSIG_MOB_ON_NEW_MIND, .proc/borged_update_flavor_text)
RegisterSignal(target, COMSIG_MOB_CLIENT_JOINED_FROM_LOBBY, .proc/borged_update_flavor_text)
/datum/element/flavor_text/Detach(atom/A)
. = ..()
UnregisterSignal(A, list(COMSIG_PARENT_EXAMINE, COMSIG_HUMAN_PREFS_COPIED_TO, COMSIG_MOB_ON_NEW_MIND, COMSIG_MOB_CLIENT_JOINED_FROM_LOBBY))
texts_by_atom -= A
if(can_edit && ismob(A))
var/mob/M = A
LAZYREMOVE(GLOB.mobs_with_editable_flavor_text[M], src)
if(!GLOB.mobs_with_editable_flavor_text[M])
GLOB.mobs_with_editable_flavor_text -= M
remove_verb(M, /mob/proc/manage_flavor_tests)
/datum/element/flavor_text/proc/show_flavor(atom/target, mob/user, list/examine_list)
var/mob/living/L = target
if(!always_show && isliving(target))
var/unknown = L.get_visible_name() == "Unknown"
if(!unknown && iscarbon(target))
var/mob/living/carbon/C = L
unknown = (C.wear_mask && (C.wear_mask.flags_inv & HIDEFACE) && !isobserver(user)) || (C.head && (C.head.flags_inv & HIDEFACE) && !isobserver(user)) //MASSIVE nonmodular edit. Has to be done here - Yawet330 / Making ghosts ignore gas-masks
if(show_on_naked && ishuman(C))
var/mob/living/carbon/human/H = C
unknown = (unknown || (H.w_uniform || H.wear_suit))
if(unknown)
if(!("...?" in examine_list)) //can't think of anything better in case of multiple flavor texts.
examine_list += "...?"
return
var/text = texts_by_atom[target]
if(!text && !(flavor_name == "OOC Notes" && L.client))
return
if(examine_no_preview)
examine_list += "\[[flavor_name]\]"
return
var/msg = replacetext(text, "\n", " ")
if(examine_full_view)
examine_list += "[msg]"
return
if(length_char(msg) <= MAX_FLAVOR_PREVIEW_LEN)
examine_list += "[msg]"
else
examine_list += "[copytext_char(msg, 1, (MAX_FLAVOR_PREVIEW_LEN - 3))]... More..."
/datum/element/flavor_text/Topic(href, href_list)
. = ..()
if(.)
return
if(href_list["show_flavor"])
var/atom/target = locate(href_list["show_flavor"])
var/mob/living/L = target
var/text = texts_by_atom[target]
if((text || (flavor_name == "OOC Notes")) && L.client)
var/content
if(flavor_name == "OOC Notes")
content += "[L]'s OOC Notes:
ERP: [L.client.prefs.erppref] | Non-Con: [L.client.prefs.nonconpref] | Vore: [L.client.prefs.vorepref]"
if(L.client.prefs.unholypref == "Yes")
content += " | Unholy: [L.client.prefs.unholypref]\n"
else
content += "\n"
content += " | Stomping Interactions: [L.client.prefs.stomppref ? "Yes" : "No"]\n"
if(L.client.prefs.extremepref == "Yes")
content += "
Extreme content: [L.client.prefs.extremepref] | Extreme content harm: [L.client.prefs.extremeharm]\n"
if(L.client.prefs.be_victim == BEVICTIM_ASK || L.client.prefs.be_victim == BEVICTIM_YES)
content += "
Be antag victim: [L.client.prefs.be_victim]\n"
content += "\n"
content += text
if(flavor_name == "Headshot") //SPLURT edit
content = "