[notes]
+diff --git a/code/__defines/talksounds.dm b/code/__defines/talksounds.dm
index fdd08d759e..6c7a312afa 100644
--- a/code/__defines/talksounds.dm
+++ b/code/__defines/talksounds.dm
@@ -33,7 +33,7 @@ var/list/talk_sound_map = rlist(
GLOB.goon_speak_pugg_sound,
GLOB.goon_speak_roach_sound,
GLOB.goon_speak_skelly_sound,
- // xeno_speak_sound // Does not exist on virgo
+ GLOB.xeno_speak_sound // Does not exist on virgo
)
)
diff --git a/code/_global_vars/lists/misc.dm b/code/_global_vars/lists/misc.dm
index 7fbe4c74f1..0e5e8b4ee3 100644
--- a/code/_global_vars/lists/misc.dm
+++ b/code/_global_vars/lists/misc.dm
@@ -10,6 +10,8 @@ GLOBAL_LIST_EMPTY(tagger_locations)
GLOBAL_LIST_INIT(char_directory_tags, list("Pred", "Pred-Pref", "Prey", "Prey-Pref", "Switch", "Non-Vore", "Unset"))
GLOBAL_LIST_INIT(char_directory_erptags, list("Dominant", "Dom-Pref", "Submissive", "Sub-Pref", "Switch", "No ERP", "Unset"))
+GLOBAL_LIST_INIT(char_directory_sexualitytags, list("Straight", "Bisexual", "Pansexual", "Gay", "Lesbian", "Asexual", "Demisexual", "Flexible", "Other", "Unset"))
+GLOBAL_LIST_INIT(char_directory_gendertags, list("Male", "Female", "Feminine", "Masculine", "Nonbinary", "Trans Man", "Trans Woman", "Other", "Flexible", "Ungendered", "Unset"))
GLOBAL_LIST_EMPTY(crafting_recipes) //list of all table craft recipes
GLOBAL_LIST_INIT(uplink_locations, list("PDA", "Headset", "None"))
diff --git a/code/datums/mind_vr.dm b/code/datums/mind_vr.dm
index a6758ca229..21f0fda7b5 100644
--- a/code/datums/mind_vr.dm
+++ b/code/datums/mind_vr.dm
@@ -5,6 +5,9 @@
var/directory_erptag
var/directory_ad
var/vore_prey_eaten = 0
+ var/vantag_preference = VANTAG_NONE
+ var/directory_gendertag
+ var/directory_sexualitytag
/mob/living/mind_initialize()
. = ..()
@@ -13,3 +16,6 @@
mind.directory_tag = client.prefs.directory_tag
mind.directory_erptag = client.prefs.directory_erptag
mind.directory_ad = client.prefs.directory_ad
+ mind.vantag_preference = client.prefs.vantag_preference
+ mind.directory_gendertag = client.prefs.directory_gendertag
+ mind.directory_sexualitytag = client.prefs.directory_sexualitytag
diff --git a/code/game/objects/items/devices/body_snatcher_vr.dm b/code/game/objects/items/devices/body_snatcher_vr.dm
index eeb3a651ed..fec5fe3a38 100644
--- a/code/game/objects/items/devices/body_snatcher_vr.dm
+++ b/code/game/objects/items/devices/body_snatcher_vr.dm
@@ -28,19 +28,16 @@
to_chat(user,span_danger("The target's mind is too complex to be affected!"))
return
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(H.resleeve_lock && user.ckey != H.resleeve_lock)
- to_chat(src, span_danger("[H] cannot be impersonated!"))
- return
-
if(M.stat == DEAD) //Are they dead?
to_chat(user,span_warning("A warning pops up on the device, informing you that [M] is dead, and, as such, the mind transfer can not be done."))
return
var/choice = tgui_alert(user,"This will swap your mind with the target's mind. This will result in them controlling your body, and you controlling their body. Continue?","Confirmation",list("Continue","Cancel"))
if(choice == "Continue" && user.get_active_hand() == src && user.Adjacent(M))
-
+ if(M.ckey && !M.client)
+ log_and_message_admins("attempted to body swap with [key_name(M)] while they were SSD!")
+ else
+ log_and_message_admins("attempted to body swap with [key_name(M)].")
user.visible_message(span_warning("[user] pushes the device up their forehead and [M]'s head, the device beginning to let out a series of light beeps!"),span_notice("You begin swap minds with [M]!"))
if(do_after(user,35 SECONDS,M))
if(user.mind && M.mind && M.stat != DEAD && user.stat != DEAD)
@@ -51,6 +48,12 @@
var/target_ooc_notes = M.ooc_notes
var/target_likes = M.ooc_notes_likes
var/target_dislikes = M.ooc_notes_dislikes
+ var/target_favs = M.ooc_notes_favs
+ var/target_maybes = M.ooc_notes_maybes
+ var/target_style = M.ooc_notes_style
+ var/user_favs = user.ooc_notes_favs
+ var/user_maybes = user.ooc_notes_maybes
+ var/user_style = user.ooc_notes_style
var/user_ooc_notes = user.ooc_notes
var/user_likes = user.ooc_notes_likes
var/user_dislikes = user.ooc_notes_dislikes
@@ -67,6 +70,20 @@
M.ooc_notes = user_ooc_notes //Let's keep their OOC notes over to their new body.
M.ooc_notes_likes = user_likes
M.ooc_notes_dislikes = user_dislikes
+ M.ooc_notes_favs = user_favs
+ M.ooc_notes_maybes = user_maybes
+ M.ooc_notes_style = user_style
+ user.ooc_notes_favs = target_favs
+ user.ooc_notes_maybes = target_maybes
+ user.ooc_notes_style = target_style
+ if(M.tf_mob_holder == user)
+ M.tf_mob_holder = null
+ else
+ M.tf_mob_holder = user
+ if(user.tf_mob_holder == M)
+ user.tf_mob_holder = null
+ else
+ user.tf_mob_holder = M
user.ooc_notes = target_ooc_notes
user.ooc_notes_likes = target_likes
user.ooc_notes_dislikes = target_dislikes
diff --git a/code/game/objects/items/devices/scanners/sleevemate.dm b/code/game/objects/items/devices/scanners/sleevemate.dm
index 2a7962f24f..5d13bb9923 100644
--- a/code/game/objects/items/devices/scanners/sleevemate.dm
+++ b/code/game/objects/items/devices/scanners/sleevemate.dm
@@ -18,8 +18,11 @@ var/global/mob/living/carbon/human/dummy/mannequin/sleevemate_mob
var/datum/mind/stored_mind
var/ooc_notes = null //For holding prefs
+ var/ooc_notes_favs = null
var/ooc_notes_likes = null
+ var/ooc_notes_maybes = null
var/ooc_notes_dislikes = null
+ var/ooc_notes_style = FALSE
// Resleeving database this machine interacts with. Blank for default database
// Needs a matching /datum/transcore_db with key defined in code
@@ -45,6 +48,9 @@ var/global/mob/living/carbon/human/dummy/mannequin/sleevemate_mob
ooc_notes = M.ooc_notes
ooc_notes_likes = M.ooc_notes_likes
ooc_notes_dislikes = M.ooc_notes_dislikes
+ ooc_notes_favs = M.ooc_notes_favs
+ ooc_notes_maybes = M.ooc_notes_maybes
+ ooc_notes_style = M.ooc_notes_style
stored_mind = M.mind
M.ghostize()
stored_mind.current = null
@@ -56,6 +62,9 @@ var/global/mob/living/carbon/human/dummy/mannequin/sleevemate_mob
M.ooc_notes = ooc_notes
M.ooc_notes_likes = ooc_notes_likes
M.ooc_notes_dislikes = ooc_notes_dislikes
+ M.ooc_notes_favs = ooc_notes_favs
+ M.ooc_notes_maybes = ooc_notes_maybes
+ M.ooc_notes_style = ooc_notes_style
clear_mind()
diff --git a/code/game/sound.dm b/code/game/sound.dm
index 63266b2939..17bb6aac20 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -308,6 +308,7 @@
'sound/effects/mech/powerloader_step2.ogg')
return soundin
+
//Are these even used? //Yes
GLOBAL_LIST_INIT(keyboard_sound, list('sound/effects/keyboard/keyboard1.ogg','sound/effects/keyboard/keyboard2.ogg','sound/effects/keyboard/keyboard3.ogg', 'sound/effects/keyboard/keyboard4.ogg'))
GLOBAL_LIST_INIT(bodyfall_sound, list('sound/effects/bodyfall1.ogg','sound/effects/bodyfall2.ogg','sound/effects/bodyfall3.ogg','sound/effects/bodyfall4.ogg'))
@@ -328,6 +329,11 @@ GLOBAL_LIST_INIT(goon_speak_pugg_sound, list('sound/talksounds/goon/pugg.ogg', '
GLOBAL_LIST_INIT(goon_speak_roach_sound, list('sound/talksounds/goon/roach.ogg', 'sound/talksounds/goon/roach_ask.ogg', 'sound/talksounds/goon/roach_exclaim.ogg'))
GLOBAL_LIST_INIT(goon_speak_skelly_sound, list('sound/talksounds/goon/skelly.ogg', 'sound/talksounds/goon/skelly_ask.ogg', 'sound/talksounds/goon/skelly_exclaim.ogg'))
+GLOBAL_LIST_INIT(wf_speak_lure_sound, list ('sound/talksounds/wf/lure_1.ogg', 'sound/talksounds/wf/lure_2.ogg', 'sound/talksounds/wf/lure_3.ogg', 'sound/talksounds/wf/lure_4.ogg', 'sound/talksounds/wf/lure_5.ogg'))
+GLOBAL_LIST_INIT(wf_speak_lyst_sound, list ('sound/talksounds/wf/lyst_1.ogg', 'sound/talksounds/wf/lyst_2.ogg', 'sound/talksounds/wf/lyst_3.ogg', 'sound/talksounds/wf/lyst_4.ogg', 'sound/talksounds/wf/lyst_5.ogg', 'sound/talksounds/wf/lyst_6.ogg'))
+GLOBAL_LIST_INIT(wf_speak_void_sound, list ('sound/talksounds/wf/void_1.ogg', 'sound/talksounds/wf/void_2.ogg', 'sound/talksounds/wf/void_3.ogg'))
+GLOBAL_LIST_INIT(wf_speak_vomva_sound, list ('sound/talksounds/wf/vomva_1.ogg', 'sound/talksounds/wf/vomva_2.ogg', 'sound/talksounds/wf/vomva_3.ogg', 'sound/talksounds/wf/vomva_4.ogg'))
+GLOBAL_LIST_INIT(xeno_speak_sound, list('sound/talksounds/xeno/xenotalk.ogg', 'sound/talksounds/xeno/xenotalk2.ogg', 'sound/talksounds/xeno/xenotalk3.ogg'))
#define canine_sounds list("cough" = null, "sneeze" = null, "scream" = list('sound/voice/scream/canine/wolf_scream.ogg', 'sound/voice/scream/canine/wolf_scream2.ogg', 'sound/voice/scream/canine/wolf_scream3.ogg', 'sound/voice/scream/canine/wolf_scream4.ogg', 'sound/voice/scream/canine/wolf_scream5.ogg', 'sound/voice/scream/canine/wolf_scream6.ogg'), "pain" = list('sound/voice/pain/canine/wolf_pain.ogg', 'sound/voice/pain/canine/wolf_pain2.ogg', 'sound/voice/pain/canine/wolf_pain3.ogg', 'sound/voice/pain/canine/wolf_pain4.ogg'), "gasp" = list('sound/voice/gasp/canine/wolf_gasp.ogg'), "death" = list('sound/voice/death/canine/wolf_death1.ogg', 'sound/voice/death/canine/wolf_death2.ogg', 'sound/voice/death/canine/wolf_death3.ogg', 'sound/voice/death/canine/wolf_death4.ogg', 'sound/voice/death/canine/wolf_death5.ogg'))
#define feline_sounds list("cough" = null, "sneeze" = null, "scream" = list('sound/voice/scream/feline/feline_scream.ogg'), "pain" = list('sound/voice/pain/feline/feline_pain.ogg'), "gasp" = list('sound/voice/gasp/feline/feline_gasp.ogg'), "death" = list('sound/voice/death/feline/feline_death.ogg'))
diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm
index 3027a2f041..2cc80ea3d2 100644
--- a/code/modules/client/preference_setup/general/01_basic.dm
+++ b/code/modules/client/preference_setup/general/01_basic.dm
@@ -62,10 +62,11 @@
. += "
"
. += span_bold("Biological Sex:") + " [gender2text(pref.biological_gender)]
"
. += span_bold("Pronouns:") + " [genders_to_pronoun_set[pref.identifying_gender]]
"
- . += span_bold("Age:") + " [pref.read_preference(/datum/preference/numeric/human/age)] Birthday: [pref.read_preference(/datum/preference/numeric/human/bday_month)]/[pref.read_preference(/datum/preference/numeric/human/bday_day)] - Announce?: [pref.read_preference(/datum/preference/toggle/human/bday_announce) ? "Yes" : "No"]
"
+ . += span_bold("Age:") + " [pref.read_preference(/datum/preference/numeric/human/age)] Birthday: [pref.read_preference(/datum/preference/numeric/human/bday_month)]/[pref.read_preference(/datum/preference/numeric/human/bday_day)] - Announce?: [pref.read_preference(/datum/preference/toggle/human/bday_announce) ? "Yes" : "Disabled"]
"
. += span_bold("Spawn Point:") + " [pref.read_preference(/datum/preference/choiced/living/spawnpoint)]
"
if(CONFIG_GET(flag/allow_metadata))
- . += span_bold("OOC Notes: EditLikesDislikes") + "
"
+ . += span_bold("OOC Notes: EditFavsLikesMaybesDislikes") + "
"
+ . += "Detailed field or short list system? [pref.read_preference(/datum/preference/toggle/living/ooc_notes_style) ? "Lists" : "Fields"]
"
. = jointext(.,null)
/datum/category_item/player_setup_item/general/basic/OnTopic(var/href,var/list/href_list, var/mob/user)
@@ -202,6 +203,21 @@
if(new_metadata == "!clear")
new_metadata = ""
pref.update_preference_by_type(/datum/preference/text/living/ooc_notes_dislikes, new_metadata)
+ else if(href_list["edit_ooc_note_favs"])
+ var/new_metadata = strip_html_simple(tgui_input_text(user, "Enter any information you'd like others to see relating to your FAVOURITE roleplay preferences. This will not be saved permanently unless you click save in the Character Setup panel! Type \"!clear\" to empty.", "Game Preference" , html_decode(pref.read_preference(/datum/preference/text/living/ooc_notes_favs)), multiline = TRUE, prevent_enter = TRUE))
+ if(new_metadata && CanUseTopic(user))
+ if(new_metadata == "!clear")
+ new_metadata = ""
+ pref.update_preference_by_type(/datum/preference/text/living/ooc_notes_favs, new_metadata)
+ else if(href_list["edit_ooc_note_maybes"])
+ var/new_metadata = strip_html_simple(tgui_input_text(user, "Enter any information you'd like others to see relating to your MAYBE roleplay preferences. This will not be saved permanently unless you click save in the Character Setup panel! Type \"!clear\" to empty.", "Game Preference" , html_decode(pref.read_preference(/datum/preference/text/living/ooc_notes_maybes)), multiline = TRUE, prevent_enter = TRUE))
+ if(new_metadata && CanUseTopic(user))
+ if(new_metadata == "!clear")
+ new_metadata = ""
+ pref.update_preference_by_type(/datum/preference/text/living/ooc_notes_maybes, new_metadata)
+ else if(href_list["edit_ooc_note_style"])
+ pref.update_preference_by_type(/datum/preference/toggle/living/ooc_notes_style, !pref.read_preference(/datum/preference/toggle/living/ooc_notes_style))
+ return TOPIC_REFRESH
return ..()
/datum/category_item/player_setup_item/general/basic/proc/get_genders()
diff --git a/code/modules/client/preference_setup/vore/02_size.dm b/code/modules/client/preference_setup/vore/02_size.dm
index acc41101cd..46f3fc0420 100644
--- a/code/modules/client/preference_setup/vore/02_size.dm
+++ b/code/modules/client/preference_setup/vore/02_size.dm
@@ -33,6 +33,7 @@
pref.voice_sound = save_data["voice_sound"]
pref.custom_speech_bubble = save_data["custom_speech_bubble"]
pref.custom_footstep = save_data["custom_footstep"]
+ pref.species_sound = save_data["species_sound"]
/datum/category_item/player_setup_item/vore/size/save_character(list/save_data)
save_data["size_multiplier"] = pref.size_multiplier
@@ -45,6 +46,7 @@
save_data["voice_sound"] = pref.voice_sound
save_data["custom_speech_bubble"] = pref.custom_speech_bubble
save_data["custom_footstep"] = pref.custom_footstep
+ save_data["species_sound"] = pref.species_sound
/datum/category_item/player_setup_item/vore/size/sanitize_character()
pref.weight_vr = sanitize_integer(pref.weight_vr, WEIGHT_MIN, WEIGHT_MAX, initial(pref.weight_vr))
@@ -53,13 +55,16 @@
pref.fuzzy = sanitize_integer(pref.fuzzy, 0, 1, initial(pref.fuzzy))
pref.offset_override = sanitize_integer(pref.offset_override, 0, 1, initial(pref.offset_override))
if(pref.voice_freq != 0)
- pref.voice_freq = sanitize_integer(pref.voice_freq, MIN_VOICE_FREQ, MAX_VOICE_FREQ, initial(pref.fuzzy))
+ pref.voice_freq = sanitize_integer(pref.voice_freq, MIN_VOICE_FREQ, MAX_VOICE_FREQ, initial(pref.voice_freq))
if(pref.size_multiplier == null || pref.size_multiplier < RESIZE_TINY || pref.size_multiplier > RESIZE_HUGE)
pref.size_multiplier = initial(pref.size_multiplier)
if(!(pref.custom_speech_bubble in GLOB.selectable_speech_bubbles))
pref.custom_speech_bubble = "default"
if(!(pref.custom_footstep))
pref.custom_footstep = "Default"
+ // var/datum/species/selected_species = GLOB.all_species[pref.species]
+ if(!(pref.species_sound))
+ pref.species_sound = "Unset"
/datum/category_item/player_setup_item/vore/size/copy_to_mob(var/mob/living/carbon/human/character)
character.weight = pref.weight_vr
@@ -69,6 +74,7 @@
character.offset_override = pref.offset_override
character.voice_freq = pref.voice_freq
character.resize(pref.size_multiplier, animate = FALSE, ignore_prefs = TRUE)
+
if(!pref.voice_sound)
character.voice_sounds_list = GLOB.talk_sound
else
@@ -81,12 +87,23 @@
. += span_bold("Scale:") + " [round(pref.size_multiplier*100)]%
"
. += span_bold("Scaled Appearance:") + " [pref.fuzzy ? "Fuzzy" : "Sharp"]
"
. += span_bold("Scaling Center:") + " [pref.offset_override ? "Odd" : "Even"]
"
+ . += "
"
+ . += span_bold("Mob Speech/Noise Customization") + ""
+ . += "
"
. += span_bold("Voice Frequency:") + " [pref.voice_freq]
"
. += span_bold("Voice Sounds:") + " [pref.voice_sound]
"
. += "Test Selected Voice
"
. += span_bold("Custom Speech Bubble:") + " [pref.custom_speech_bubble]
"
. += span_bold("Custom Footstep Sounds:") + "[pref.custom_footstep]
"
. += "
"
+ . += span_bold("Species Sounds:") + " [pref.species_sound]
"
+ . += "Test Cough Sounds
"
+ . += "Test Sneeze Sounds
"
+ . += "Test Scream Sounds
"
+ . += "Test Pain Sounds
"
+ . += "Test Gasp Sounds
"
+ . += "Test Death Sounds
"
+ . += "
"
. += span_bold("Relative Weight:") + " [pref.weight_vr]
"
. += span_bold("Weight Gain Rate:") + " [pref.weight_gain]
"
. += span_bold("Weight Loss Rate:") + " [pref.weight_loss]
"
@@ -152,7 +169,7 @@
return
choice = preset_voice_freqs[choice]
if(choice == 0)
- pref.voice_freq = choice
+ pref.voice_freq = 42500
return TOPIC_REFRESH
else if(choice == 1)
choice = tgui_input_number(user, "Choose your character's voice frequency, ranging from [MIN_VOICE_FREQ] to [MAX_VOICE_FREQ]", "Custom Voice Frequency", null, MAX_VOICE_FREQ, MIN_VOICE_FREQ)
@@ -178,10 +195,13 @@
"goon speak pug",
"goon speak pugg",
"goon speak roach",
- "goon speak skelly")
+ "goon speak skelly",
+ "xeno speak")
var/choice = tgui_input_list(user, "Which set of sounds would you like to use for your character's speech sounds?", "Voice Sounds", possible_voice_types)
- if(!choice)
- pref.voice_sound = "beep-boop"
+ if(!pref.voice_sound)
+ pref.voice_sound = "goon speak 1"
+ else if(!choice)
+ return TOPIC_REFRESH
else
pref.voice_sound = choice
return TOPIC_REFRESH
@@ -231,11 +251,110 @@
S = sound(pick(GLOB.goon_speak_roach_sound))
if("goon speak skelly")
S = sound(pick(GLOB.goon_speak_skelly_sound))
+ if("xeno speak")
+ S = sound(pick(GLOB.xeno_speak_sound))
if(S)
S.frequency = pick(pref.voice_freq)
S.volume = 50
SEND_SOUND(user, S)
-
+ else if(href_list["species_sound_options"]) // You shouldn't be able to see this option if you don't have the option to select a custom icon base, so we don't need to re-check for safety here.
+ var/list/possible_species_sound_types = species_sound_map
+ var/choice = tgui_input_list(user, "Which set of sounds would you like to use for your character's species sounds? (Cough, Sneeze, Scream, Pain, Gasp, Death)", "Species Sounds", possible_species_sound_types)
+ if(!choice)
+ return TOPIC_REFRESH // No choice? Don't reset our selection
+ else
+ pref.species_sound = choice
+ return TOPIC_REFRESH
+ else if(href_list["cough_test"])
+ var/sound/S
+ var/ourpref = pref.species_sound
+ var/oursound = get_species_sound(ourpref)["cough"]
+ S = sound(pick(oursound))
+ if(pref.species_sound == "Unset")
+ oursound = get_species_sound(select_default_species_sound(pref))["cough"]
+ S = sound(pick(oursound))
+ if(pref.species_sound == "None" || oursound == null)
+ to_chat(user, span_warning("This set does not have cough sounds!"))
+ return TOPIC_REFRESH
+ S.frequency = pick(pref.voice_freq)
+ S.volume = 20
+ SEND_SOUND(user, S)
+ return TOPIC_REFRESH
+ else if(href_list["sneeze_test"])
+ var/sound/S
+ var/ourpref = pref.species_sound
+ var/oursound = get_species_sound(ourpref)["sneeze"]
+ S = sound(pick(oursound))
+ if(pref.species_sound == "Unset")
+ oursound = get_species_sound(select_default_species_sound(pref))["sneeze"]
+ S = sound(pick(oursound))
+ if(pref.species_sound == "None" || oursound == null)
+ to_chat(user, span_warning("This set does not have sneeze sounds!"))
+ return TOPIC_REFRESH
+ S.frequency = pick(pref.voice_freq)
+ S.volume = 20
+ SEND_SOUND(user, S)
+ return TOPIC_REFRESH
+ else if(href_list["scream_test"])
+ var/sound/S
+ var/ourpref = pref.species_sound
+ var/oursound = get_species_sound(ourpref)["scream"]
+ S = sound(pick(oursound))
+ if(pref.species_sound == "Unset")
+ oursound = get_species_sound(select_default_species_sound(pref))["scream"]
+ S = sound(pick(oursound))
+ if(pref.species_sound == "None" || oursound == null)
+ to_chat(user, span_warning("This set does not have scream sounds!"))
+ return TOPIC_REFRESH
+ S.frequency = pick(pref.voice_freq)
+ S.volume = 20
+ SEND_SOUND(user, S)
+ return TOPIC_REFRESH
+ else if(href_list["pain_test"])
+ var/sound/S
+ var/ourpref = pref.species_sound
+ var/oursound = get_species_sound(ourpref)["pain"]
+ S = sound(pick(oursound))
+ if(pref.species_sound == "Unset")
+ oursound = get_species_sound(select_default_species_sound(pref))["pain"]
+ S = sound(pick(oursound))
+ if(pref.species_sound == "None" || oursound == null)
+ to_chat(user, span_warning("This set does not have pain sounds!"))
+ return TOPIC_REFRESH
+ S.frequency = pick(pref.voice_freq)
+ S.volume = 20
+ SEND_SOUND(user, S)
+ return TOPIC_REFRESH
+ else if(href_list["gasp_test"])
+ var/sound/S
+ var/ourpref = pref.species_sound
+ var/oursound = get_species_sound(ourpref)["gasp"]
+ S = sound(pick(oursound))
+ if(pref.species_sound == "Unset")
+ oursound = get_species_sound(select_default_species_sound(pref))["gasp"]
+ S = sound(pick(oursound))
+ if(pref.species_sound == "None" || oursound == null)
+ to_chat(user, span_warning("This set does not have gasp sounds!"))
+ return TOPIC_REFRESH
+ S.frequency = pick(pref.voice_freq)
+ S.volume = 20
+ SEND_SOUND(user, S)
+ return TOPIC_REFRESH
+ else if(href_list["death_test"])
+ var/sound/S
+ var/ourpref = pref.species_sound
+ var/oursound = get_species_sound(ourpref)["death"]
+ S = sound(pick(oursound))
+ if(pref.species_sound == "Unset")
+ oursound = get_species_sound(select_default_species_sound(pref))["death"]
+ S = sound(pick(oursound))
+ if(pref.species_sound == "None" || oursound == null)
+ to_chat(user, span_warning("This set does not have death sounds!"))
+ return TOPIC_REFRESH
+ S.frequency = pick(pref.voice_freq)
+ S.volume = 20
+ SEND_SOUND(user, S)
+ return TOPIC_REFRESH
return ..();
#undef WEIGHT_CHANGE_MIN
diff --git a/code/modules/client/preference_setup/vore/07_traits.dm b/code/modules/client/preference_setup/vore/07_traits.dm
index c15eb7c519..1efa93c186 100644
--- a/code/modules/client/preference_setup/vore/07_traits.dm
+++ b/code/modules/client/preference_setup/vore/07_traits.dm
@@ -564,7 +564,7 @@ var/global/list/valid_bloodreagents = list("default",REAGENT_ID_IRON,REAGENT_ID_
for(var/T in pref.pos_traits + pref.neu_traits + pref.neg_traits)
points_left -= GLOB.traits_costs[T]
- var/traits_left = pref.max_traits - (pref.pos_traits.len + pref.neg_traits.len)
+ var/traits_left = pref.max_traits - pref.pos_traits.len // CHOMPEdit: Only positive traits have a slot limit, to prevent broken builds
var/message = "Select a trait to learn more."
if(mode != NEUTRAL_MODE)
diff --git a/code/modules/client/preference_setup/vore/09_misc.dm b/code/modules/client/preference_setup/vore/09_misc.dm
index 90b3546eee..d68b659602 100644
--- a/code/modules/client/preference_setup/vore/09_misc.dm
+++ b/code/modules/client/preference_setup/vore/09_misc.dm
@@ -5,6 +5,8 @@
/datum/category_item/player_setup_item/vore/misc/load_character(list/save_data)
pref.show_in_directory = save_data["show_in_directory"]
pref.directory_tag = save_data["directory_tag"]
+ pref.directory_gendertag = save_data["directory_gendertag"]
+ pref.directory_sexualitytag = save_data["directory_sexualitytag"]
pref.directory_erptag = save_data["directory_erptag"]
pref.directory_ad = save_data["directory_ad"]
pref.sensorpref = save_data["sensorpref"]
@@ -15,6 +17,8 @@
/datum/category_item/player_setup_item/vore/misc/save_character(list/save_data)
save_data["show_in_directory"] = pref.show_in_directory
save_data["directory_tag"] = pref.directory_tag
+ save_data["directory_gendertag"] = pref.directory_gendertag
+ save_data["directory_sexualitytag"] = pref.directory_sexualitytag
save_data["directory_erptag"] = pref.directory_erptag
save_data["directory_ad"] = pref.directory_ad
save_data["sensorpref"] = pref.sensorpref
@@ -33,6 +37,8 @@
/datum/category_item/player_setup_item/vore/misc/sanitize_character()
pref.show_in_directory = sanitize_integer(pref.show_in_directory, 0, 1, initial(pref.show_in_directory))
pref.directory_tag = sanitize_inlist(pref.directory_tag, GLOB.char_directory_tags, initial(pref.directory_tag))
+ pref.directory_gendertag = sanitize_inlist(pref.directory_gendertag, GLOB.char_directory_gendertags, initial(pref.directory_gendertag))
+ pref.directory_sexualitytag = sanitize_inlist(pref.directory_sexualitytag, GLOB.char_directory_sexualitytags, initial(pref.directory_sexualitytag))
pref.directory_erptag = sanitize_inlist(pref.directory_erptag, GLOB.char_directory_erptags, initial(pref.directory_erptag))
pref.sensorpref = sanitize_integer(pref.sensorpref, 1, GLOB.sensorpreflist.len, initial(pref.sensorpref))
pref.capture_crystal = sanitize_integer(pref.capture_crystal, 0, 1, initial(pref.capture_crystal))
@@ -43,6 +49,8 @@
. += "
"
. += span_bold("Appear in Character Directory:") + " [pref.show_in_directory ? "Yes" : "No"]
"
. += span_bold("Character Directory Vore Tag:") + " [pref.directory_tag]
"
+ . += span_bold("Character Directory Gender:") + " [pref.directory_gendertag]
"
+ . += span_bold("Character Directory Sexuality:") + " [pref.directory_sexualitytag]
"
. += span_bold("Character Directory ERP Tag:") + " [pref.directory_erptag]
"
. += span_bold("Character Directory Advertisement:") + " Set Directory Ad
"
. += span_bold("Suit Sensors Preference:") + " [GLOB.sensorpreflist[pref.sensorpref]]
"
@@ -62,6 +70,18 @@
return
pref.directory_tag = new_tag
return TOPIC_REFRESH
+ else if(href_list["directory_gendertag"])
+ var/new_gendertag = tgui_input_list(user, "Pick a new Gender tag for the character directory. This is YOUR gender, not what you prefer.", "Character Gender Tag", GLOB.char_directory_gendertags, pref.directory_gendertag)
+ if(!new_gendertag)
+ return
+ pref.directory_gendertag = new_gendertag
+ return TOPIC_REFRESH
+ else if(href_list["directory_sexualitytag"])
+ var/new_sexualitytag = tgui_input_list(user, "Pick a new Sexuality/Orientation tag for the character directory", "Character Sexuality/Orientation Tag", GLOB.char_directory_sexualitytags, pref.directory_sexualitytag)
+ if(!new_sexualitytag)
+ return
+ pref.directory_sexualitytag = new_sexualitytag
+ return TOPIC_REFRESH
else if(href_list["directory_erptag"])
var/new_erptag = tgui_input_list(user, "Pick a new ERP tag for the character directory", "Character ERP Tag", GLOB.char_directory_erptags, pref.directory_erptag)
if(!new_erptag)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index cf77959927..61620146ea 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -613,6 +613,9 @@ var/list/preferences_datums = list()
character.ooc_notes = read_preference(/datum/preference/text/living/ooc_notes)
character.ooc_notes_dislikes = read_preference(/datum/preference/text/living/ooc_notes_dislikes)
character.ooc_notes_likes = read_preference(/datum/preference/text/living/ooc_notes_likes)
+ character.ooc_notes_favs = read_preference(/datum/preference/text/living/ooc_notes_favs)
+ character.ooc_notes_maybes = read_preference(/datum/preference/text/living/ooc_notes_maybes)
+ character.ooc_notes_style = read_preference(/datum/preference/toggle/living/ooc_notes_style)
character.weight = weight_vr
character.weight_gain = weight_gain
diff --git a/code/modules/client/preferences/types/character/general/01_basic.dm b/code/modules/client/preferences/types/character/general/01_basic.dm
index e2a9652954..d466b39b90 100644
--- a/code/modules/client/preferences/types/character/general/01_basic.dm
+++ b/code/modules/client/preferences/types/character/general/01_basic.dm
@@ -115,7 +115,6 @@
target.ooc_notes_dislikes = value
return
-// CHOMP specific, but added here not to forget
/datum/preference/toggle/living/ooc_notes_style
category = PREFERENCE_CATEGORY_MANUALLY_RENDERED
savefile_key = "OOC_Notes_System"
@@ -124,7 +123,7 @@
can_randomize = FALSE
/datum/preference/toggle/living/ooc_notes_style/apply_to_living(mob/living/target, value)
- // target.ooc_notes_style // Not available on virgo
+ target.ooc_notes_style = value
return
/datum/preference/text/living/ooc_notes_maybes
@@ -135,7 +134,7 @@
can_randomize = FALSE
/datum/preference/text/living/ooc_notes_maybes/apply_to_living(mob/living/target, value)
- // target.ooc_notes_maybes = value // Not available on virgo
+ target.ooc_notes_maybes = value
return
/datum/preference/text/living/ooc_notes_favs
@@ -146,7 +145,7 @@
can_randomize = FALSE
/datum/preference/text/living/ooc_notes_favs/apply_to_living(mob/living/target, value)
- // target.ooc_notes_favs = value // Not available on virgo
+ target.ooc_notes_favs = value
return
/datum/preference/toggle/human/name_is_always_random
diff --git a/code/modules/client/preferences/types/game/misc.dm b/code/modules/client/preferences/types/game/misc.dm
index 85e6d47c3e..dd36250210 100644
--- a/code/modules/client/preferences/types/game/misc.dm
+++ b/code/modules/client/preferences/types/game/misc.dm
@@ -106,3 +106,13 @@
/datum/preference/text/lastchangelog/is_accessible(datum/preferences/preferences)
..()
return FALSE
+
+/datum/preference/toggle/random_emote_pitch
+ category = PREFERENCE_CATEGORY_GAME_PREFERENCES
+ savefile_key = "EMOTE_VARY"
+ savefile_identifier = PREFERENCE_PLAYER
+
+/datum/preference/toggle/autotranscore
+ category = PREFERENCE_CATEGORY_GAME_PREFERENCES
+ savefile_key = "AUTOTRANSCORE"
+ savefile_identifier = PREFERENCE_PLAYER
diff --git a/code/modules/client/preferences_vr.dm b/code/modules/client/preferences_vr.dm
index c3a8d182bc..fdb793a1d7 100644
--- a/code/modules/client/preferences_vr.dm
+++ b/code/modules/client/preferences_vr.dm
@@ -2,6 +2,8 @@
var/show_in_directory = 1 //Show in Character Directory
var/directory_tag = "Unset" //Sorting tag to use in character directory
var/directory_erptag = "Unset" //ditto, but for non-vore scenes
+ var/directory_gendertag = "Unset" // Gender stuff!
+ var/directory_sexualitytag = "Unset" // Sexuality!
var/directory_ad = "" //Advertisement stuff to show in character directory.
var/sensorpref = 5 //Set character's suit sensor level
var/capture_crystal = 1 //Whether or not someone is able to be caught with capture crystals
diff --git a/code/modules/client/verbs/character_directory.dm b/code/modules/client/verbs/character_directory.dm
index 0d9cab006c..4352fd0af4 100644
--- a/code/modules/client/verbs/character_directory.dm
+++ b/code/modules/client/verbs/character_directory.dm
@@ -34,10 +34,16 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
data["personalVisibility"] = user.mind.show_in_directory
data["personalTag"] = user.mind.directory_tag || "Unset"
data["personalErpTag"] = user.mind.directory_erptag || "Unset"
+ data["personalEventTag"] = GLOB.vantag_choices_list[user.mind.vantag_preference]
+ data["personalGenderTag"] = user.mind.directory_gendertag || "Unset"
+ data["personalSexualityTag"] = user.mind.directory_sexualitytag || "Unset"
else if (user?.client?.prefs)
data["personalVisibility"] = user.client.prefs.show_in_directory
data["personalTag"] = user.client.prefs.directory_tag || "Unset"
data["personalErpTag"] = user.client.prefs.directory_erptag || "Unset"
+ data["personalEventTag"] = GLOB.vantag_choices_list[user.client.prefs.vantag_preference]
+ data["personalGenderTag"] = user.client.prefs.directory_gendertag || "Unset"
+ data["personalSexualityTag"] = user.client.prefs.directory_sexualitytag || "Unset"
return data
@@ -55,6 +61,14 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
var/name = null
var/species = null
var/ooc_notes = null
+ var/ooc_notes_favs = null
+ var/ooc_notes_likes = null
+ var/ooc_notes_maybes = null
+ var/ooc_notes_dislikes = null
+ var/ooc_notes_style = null
+ var/gendertag = null
+ var/sexualitytag = null
+ var/eventtag = GLOB.vantag_choices_list[VANTAG_NONE]
var/flavor_text = null
var/tag
var/erptag
@@ -63,35 +77,67 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
tag = C.mob.mind.directory_tag || "Unset"
erptag = C.mob.mind.directory_erptag || "Unset"
character_ad = C.mob.mind.directory_ad
+ gendertag = C.mob.mind.directory_gendertag || "Unset"
+ sexualitytag = C.mob.mind.directory_sexualitytag || "Unset"
+ eventtag = GLOB.vantag_choices_list[C.mob.mind.vantag_preference]
else
tag = C.prefs.directory_tag || "Unset"
erptag = C.prefs.directory_erptag || "Unset"
character_ad = C.prefs.directory_ad
+ gendertag = C.prefs.directory_gendertag || "Unset"
+ sexualitytag = C.prefs.directory_sexualitytag || "Unset"
+ eventtag = GLOB.vantag_choices_list[C.prefs.vantag_preference]
if(ishuman(C.mob))
var/mob/living/carbon/human/H = C.mob
- //if(data_core && GLOB.data_core.general)
- // if(!find_general_record("name", H.real_name))
- // if(!find_record("name", H.real_name, data_core.hidden_general))
- // continue
- name = H.real_name
+ var/strangername = H.real_name
+ if(GLOB.data_core && GLOB.data_core.general)
+ if(!find_general_record("name", H.real_name))
+ if(!find_record("name", H.real_name, GLOB.data_core.hidden_general))
+ strangername = "unknown"
+ name = strangername
species = "[H.custom_species ? H.custom_species : H.species.name]"
ooc_notes = H.ooc_notes
- if(H.ooc_notes_likes)
- ooc_notes += "\n\nLIKES\n\n[H.ooc_notes_likes]"
- if(H.ooc_notes_dislikes)
- ooc_notes += "\n\nDISLIKES\n\n[H.ooc_notes_dislikes]"
- flavor_text = H.flavor_texts["general"]
+ if(H.ooc_notes_style && (H.ooc_notes_favs || H.ooc_notes_likes || H.ooc_notes_maybes || H.ooc_notes_dislikes))
+ ooc_notes = H.ooc_notes + "\n\n"
+ ooc_notes_favs = H.ooc_notes_favs
+ ooc_notes_likes = H.ooc_notes_likes
+ ooc_notes_maybes = H.ooc_notes_maybes
+ ooc_notes_dislikes = H.ooc_notes_dislikes
+ ooc_notes_style = H.ooc_notes_style
+ else
+ if(H.ooc_notes_favs)
+ ooc_notes += "\n\nFAVOURITES\n\n[H.ooc_notes_favs]"
+ if(H.ooc_notes_likes)
+ ooc_notes += "\n\nLIKES\n\n[H.ooc_notes_likes]"
+ if(H.ooc_notes_maybes)
+ ooc_notes += "\n\nMAYBES\n\n[H.ooc_notes_maybes]"
+ if(H.ooc_notes_dislikes)
+ ooc_notes += "\n\nDISLIKES\n\n[H.ooc_notes_dislikes]"
+ if(LAZYLEN(H.flavor_texts))
+ flavor_text = H.flavor_texts["general"]
if(isAI(C.mob))
var/mob/living/silicon/ai/A = C.mob
name = A.name
species = "Artificial Intelligence"
ooc_notes = A.ooc_notes
- if(A.ooc_notes_likes)
- ooc_notes += "\n\nLIKES\n\n[A.ooc_notes_likes]"
- if(A.ooc_notes_dislikes)
- ooc_notes += "\n\nDISLIKES\n\n[A.ooc_notes_dislikes]"
+ if(A.ooc_notes_style && (A.ooc_notes_favs || A.ooc_notes_likes || A.ooc_notes_maybes || A.ooc_notes_dislikes))
+ ooc_notes = A.ooc_notes + "\n\n"
+ ooc_notes_favs = A.ooc_notes_favs
+ ooc_notes_likes = A.ooc_notes_likes
+ ooc_notes_maybes = A.ooc_notes_maybes
+ ooc_notes_dislikes = A.ooc_notes_dislikes
+ ooc_notes_style = A.ooc_notes_style
+ else
+ if(A.ooc_notes_favs)
+ ooc_notes += "\n\nFAVOURITES\n\n[A.ooc_notes_favs]"
+ if(A.ooc_notes_likes)
+ ooc_notes += "\n\nLIKES\n\n[A.ooc_notes_likes]"
+ if(A.ooc_notes_maybes)
+ ooc_notes += "\n\nMAYBES\n\n[A.ooc_notes_maybes]"
+ if(A.ooc_notes_dislikes)
+ ooc_notes += "\n\nDISLIKES\n\n[A.ooc_notes_dislikes]"
flavor_text = null // No flavor text for AIs :c
@@ -102,10 +148,22 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
name = R.name
species = "[R.modtype] [R.braintype]"
ooc_notes = R.ooc_notes
- if(R.ooc_notes_likes)
- ooc_notes += "\n\nLIKES\n\n[R.ooc_notes_likes]"
- if(R.ooc_notes_dislikes)
- ooc_notes += "\n\nDISLIKES\n\n[R.ooc_notes_dislikes]"
+ if(R.ooc_notes_style && (R.ooc_notes_favs || R.ooc_notes_likes || R.ooc_notes_maybes || R.ooc_notes_dislikes))
+ ooc_notes = R.ooc_notes + "\n\n"
+ ooc_notes_favs = R.ooc_notes_favs
+ ooc_notes_likes = R.ooc_notes_likes
+ ooc_notes_maybes = R.ooc_notes_maybes
+ ooc_notes_dislikes = R.ooc_notes_dislikes
+ ooc_notes_style = R.ooc_notes_style
+ else
+ if(R.ooc_notes_favs)
+ ooc_notes += "\n\nFAVOURITES\n\n[R.ooc_notes_favs]"
+ if(R.ooc_notes_likes)
+ ooc_notes += "\n\nLIKES\n\n[R.ooc_notes_likes]"
+ if(R.ooc_notes_maybes)
+ ooc_notes += "\n\nMAYBES\n\n[R.ooc_notes_maybes]"
+ if(R.ooc_notes_dislikes)
+ ooc_notes += "\n\nDISLIKES\n\n[R.ooc_notes_dislikes]"
flavor_text = R.flavor_text
@@ -114,23 +172,45 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
name = P.name
species = "pAI"
ooc_notes = P.ooc_notes
- if(P.ooc_notes_likes)
- ooc_notes += "\n\nLIKES\n\n[P.ooc_notes_likes]"
- if(P.ooc_notes_dislikes)
- ooc_notes += "\n\nDISLIKES\n\n[P.ooc_notes_dislikes]"
-
+ if(P.ooc_notes_style && (P.ooc_notes_favs || P.ooc_notes_likes || P.ooc_notes_maybes || P.ooc_notes_dislikes))
+ ooc_notes = P.ooc_notes + "\n\n"
+ ooc_notes_favs = P.ooc_notes_favs
+ ooc_notes_likes = P.ooc_notes_likes
+ ooc_notes_maybes = P.ooc_notes_maybes
+ ooc_notes_dislikes = P.ooc_notes_dislikes
+ ooc_notes_style = P.ooc_notes_style
+ else
+ if(P.ooc_notes_favs)
+ ooc_notes += "\n\nFAVOURITES\n\n[P.ooc_notes_favs]"
+ if(P.ooc_notes_likes)
+ ooc_notes += "\n\nLIKES\n\n[P.ooc_notes_likes]"
+ if(P.ooc_notes_maybes)
+ ooc_notes += "\n\nMAYBES\n\n[P.ooc_notes_maybes]"
+ if(P.ooc_notes_dislikes)
+ ooc_notes += "\n\nDISLIKES\n\n[P.ooc_notes_dislikes]"
flavor_text = P.flavor_text
if(isanimal(C.mob))
var/mob/living/simple_mob/S = C.mob
name = S.name
- species = initial(S.name)
+ species = S.character_directory_species()
ooc_notes = S.ooc_notes
- if(S.ooc_notes_likes)
- ooc_notes += "\n\nLIKES\n\n[S.ooc_notes_likes]"
- if(S.ooc_notes_dislikes)
- ooc_notes += "\n\nDISLIKES\n\n[S.ooc_notes_dislikes]"
-
+ if(S.ooc_notes_style && (S.ooc_notes_favs || S.ooc_notes_likes || S.ooc_notes_maybes || S.ooc_notes_dislikes))
+ ooc_notes = S.ooc_notes + "\n\n"
+ ooc_notes_favs = S.ooc_notes_favs
+ ooc_notes_likes = S.ooc_notes_likes
+ ooc_notes_maybes = S.ooc_notes_maybes
+ ooc_notes_dislikes = S.ooc_notes_dislikes
+ ooc_notes_style = S.ooc_notes_style
+ else
+ if(S.ooc_notes_favs)
+ ooc_notes += "\n\nFAVOURITES\n\n[S.ooc_notes_favs]"
+ if(S.ooc_notes_likes)
+ ooc_notes += "\n\nLIKES\n\n[S.ooc_notes_likes]"
+ if(S.ooc_notes_maybes)
+ ooc_notes += "\n\nMAYBES\n\n[S.ooc_notes_maybes]"
+ if(S.ooc_notes_dislikes)
+ ooc_notes += "\n\nDISLIKES\n\n[S.ooc_notes_dislikes]"
flavor_text = S.desc
// It's okay if we fail to find OOC notes and flavor text
@@ -141,6 +221,14 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
directory_mobs.Add(list(list(
"name" = name,
"species" = species,
+ "ooc_notes_favs" = ooc_notes_favs,
+ "ooc_notes_likes" = ooc_notes_likes,
+ "ooc_notes_maybes" = ooc_notes_maybes,
+ "ooc_notes_dislikes" = ooc_notes_dislikes,
+ "ooc_notes_style" = ooc_notes_style,
+ "gendertag" = gendertag,
+ "sexualitytag" = sexualitytag,
+ "eventtag" = eventtag,
"ooc_notes" = ooc_notes,
"tag" = tag,
"erptag" = erptag,
@@ -203,6 +291,24 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
if(isnull(new_ad))
return
return set_for_mind_or_prefs(user, action, new_ad, can_set_prefs, can_set_mind)
+ if("setGenderTag")
+ var/list/new_gendertag = tgui_input_list(usr, "Pick a new Gender tag for the character directory. This is YOUR gender, not what you prefer.", "Character Gender Tag", GLOB.char_directory_gendertags)
+ if(!new_gendertag)
+ return
+ return set_for_mind_or_prefs(user, action, new_gendertag, can_set_prefs, can_set_mind)
+ if("setSexualityTag")
+ var/list/new_sexualitytag = tgui_input_list(usr, "Pick a new Sexuality/Orientation tag for the character directory", "Character Sexuality/Orientation Tag", GLOB.char_directory_sexualitytags)
+ if(!new_sexualitytag)
+ return
+ return set_for_mind_or_prefs(user, action, new_sexualitytag, can_set_prefs, can_set_mind)
+ if("setEventTag")
+ var/list/names_list = list()
+ for(var/C in GLOB.vantag_choices_list)
+ names_list[GLOB.vantag_choices_list[C]] = C
+ var/list/new_eventtag = tgui_input_list(usr, "Pick your preference for event involvement", "Event Preference Tag", usr?.client?.prefs?.vantag_preference, names_list)
+ if(!new_eventtag)
+ return
+ return set_for_mind_or_prefs(user, action, names_list[new_eventtag], can_set_prefs, can_set_mind)
/datum/character_directory/proc/set_for_mind_or_prefs(mob/user, action, new_value, can_set_prefs, can_set_mind)
can_set_prefs &&= !!user.client.prefs
@@ -235,3 +341,18 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
if (can_set_mind)
user.mind.directory_ad = new_value
return TRUE
+ if ("setEventTag")
+ if (can_set_prefs)
+ user.client.prefs.vantag_preference = new_value
+ if (can_set_mind)
+ user.mind.vantag_preference = new_value
+ if ("setGenderTag")
+ if (can_set_prefs)
+ user.client.prefs.directory_gendertag = new_value
+ if (can_set_mind)
+ user.mind.directory_gendertag = new_value
+ if ("setSexualityTag")
+ if (can_set_prefs)
+ user.client.prefs.directory_sexualitytag = new_value
+ if (can_set_mind)
+ user.mind.directory_sexualitytag = new_value
diff --git a/code/modules/emotes/emote_define.dm b/code/modules/emotes/emote_define.dm
index 38c4868a22..ba035b627f 100644
--- a/code/modules/emotes/emote_define.dm
+++ b/code/modules/emotes/emote_define.dm
@@ -189,7 +189,11 @@ var/global/list/emotes_by_key
if(islist(sound_to_play) && length(sound_to_play))
sound_to_play = pick(sound_to_play)
if(sound_to_play)
- playsound(user.loc, sound_to_play, use_sound["vol"], sound_vary, frequency = null, preference = sound_preferences) //VOREStation Add - Preference
+ if(istype(user, /mob))
+ var/mob/u = user
+ playsound(user.loc, sound_to_play, use_sound["vol"], u.read_preference(/datum/preference/toggle/random_emote_pitch) && sound_vary, extrarange = use_sound["exr"], frequency = u.voice_freq, preference = sound_preferences, volume_channel = use_sound["volchannel"])
+ else
+ playsound(user.loc, sound_to_play, use_sound["vol"], sound_vary, extrarange = use_sound["exr"], frequency = null, preference = sound_preferences, volume_channel = use_sound["volchannel"])
/decl/emote/proc/mob_can_use(var/mob/user)
return istype(user) && user.stat != DEAD && (type in user.get_available_emotes())
diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm
index ce911762b9..c8de7e1223 100644
--- a/code/modules/mob/living/bot/bot.dm
+++ b/code/modules/mob/living/bot/bot.dm
@@ -520,6 +520,9 @@
ooc_notes = AI.ooc_notes
ooc_notes_likes = AI.ooc_notes_likes
ooc_notes_dislikes = AI.ooc_notes_dislikes
+ ooc_notes_favs = AI.ooc_notes_favs
+ ooc_notes_maybes = AI.ooc_notes_maybes
+ ooc_notes_style = AI.ooc_notes_style
to_chat(src, span_notice("You feel a tingle in your circuits as your systems interface with \the [initial(src.name)]."))
if(AI.idcard.GetAccess())
botcard.access |= AI.idcard.GetAccess()
@@ -531,6 +534,9 @@
AI.ooc_notes = ooc_notes
AI.ooc_notes_likes = ooc_notes_likes
AI.ooc_notes_dislikes = ooc_notes_dislikes
+ AI.ooc_notes_favs = ooc_notes_favs
+ AI.ooc_notes_maybes = ooc_notes_maybes
+ AI.ooc_notes_style = ooc_notes_style
paicard.forceMove(src.loc)
paicard = null
name = initial(name)
diff --git a/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm b/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm
index 8ab66fa08a..512d4d44d8 100644
--- a/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm
+++ b/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm
@@ -378,6 +378,9 @@
blob.ooc_notes = ooc_notes
blob.ooc_notes_likes = ooc_notes_likes
blob.ooc_notes_dislikes = ooc_notes_dislikes
+ blob.ooc_notes_favs = ooc_notes_favs
+ blob.ooc_notes_maybes = ooc_notes_maybes
+ blob.ooc_notes_style = ooc_notes_style
blob.transforming = FALSE
blob.name = name
blob.real_name = real_name
@@ -467,6 +470,9 @@
ooc_notes = blob.ooc_notes // Updating notes incase they change them in blob form.
ooc_notes_likes = blob.ooc_notes_likes
ooc_notes_dislikes = blob.ooc_notes_dislikes
+ ooc_notes_favs = blob.ooc_notes_favs
+ ooc_notes_maybes = blob.ooc_notes_maybes
+ ooc_notes_style = blob.ooc_notes_style
transforming = FALSE
blob.name = "Promethean Blob"
var/obj/item/hat = blob.hat
diff --git a/code/modules/mob/living/carbon/human/species/station/protean/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean/protean_blob.dm
index daa2c399c6..0f91d6df4b 100644
--- a/code/modules/mob/living/carbon/human/species/station/protean/protean_blob.dm
+++ b/code/modules/mob/living/carbon/human/species/station/protean/protean_blob.dm
@@ -475,6 +475,9 @@
blob.ooc_notes = ooc_notes
blob.ooc_notes_likes = ooc_notes_likes
blob.ooc_notes_dislikes = ooc_notes_dislikes
+ blob.ooc_notes_favs = ooc_notes_favs
+ blob.ooc_notes_maybes = ooc_notes_maybes
+ blob.ooc_notes_style = ooc_notes_style
temporary_form = blob
var/obj/item/radio/R = null
if(isradio(l_ear))
@@ -602,6 +605,9 @@
ooc_notes = blob.ooc_notes // Lets give the protean any updated notes from blob form.
ooc_notes_likes = blob.ooc_notes_likes
ooc_notes_dislikes = blob.ooc_notes_dislikes
+ ooc_notes_favs = blob.ooc_notes_favs
+ ooc_notes_maybes = blob.ooc_notes_maybes
+ ooc_notes_style = blob.ooc_notes_style
temporary_form = null
//Transfer vore organs
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 8263274955..67006c76ab 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -1433,6 +1433,36 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
struggle_anim_taur = FALSE
update_vore_tail_sprite()
+/mob/living/carbon/human/proc/GetAppearanceFromPrefs(var/flavourtext, var/oocnotes)
+ /* Jank code that effectively creates the client's mob from save, then copies its appearance to our current mob.
+ Intended to be used with shapeshifter species so we don't reset their organs in doing so.*/
+ if(client.prefs)
+ var/mob/living/carbon/human/dummy/mannequin/Dummy = get_mannequin(client.ckey)
+ client.prefs.copy_to(Dummy)
+ //Important, since some sprites only work for specific species
+ /* Probably not needed anymore since impersonate_bodytype no longer exists
+ if(Dummy.species.base_species == "Promethean")
+ impersonate_bodytype = "Human"
+ else
+ impersonate_bodytype = Dummy.species.base_species
+ */
+ custom_species = Dummy.custom_species
+ var/list/traits = dna.species_traits.Copy()
+ dna = Dummy.dna.Clone()
+ dna.species_traits.Cut()
+ dna.species_traits = traits.Copy()
+ UpdateAppearance()
+ icon = Dummy.icon
+ if(flavourtext)
+ flavor_texts = client.prefs.flavor_texts.Copy()
+ if(oocnotes)
+ ooc_notes = client.prefs.read_preference(/datum/preference/text/living/ooc_notes)
+ ooc_notes_likes = client.prefs.read_preference(/datum/preference/text/living/ooc_notes_likes)
+ ooc_notes_dislikes = client.prefs.read_preference(/datum/preference/text/living/ooc_notes_dislikes)
+ ooc_notes_favs = read_preference(/datum/preference/text/living/ooc_notes_favs)
+ ooc_notes_maybes = read_preference(/datum/preference/text/living/ooc_notes_maybes)
+ ooc_notes_style = read_preference(/datum/preference/toggle/living/ooc_notes_style)
+
//Human Overlays Indexes/////////
#undef MUTATIONS_LAYER
#undef SKIN_LAYER
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 4fd58a9a29..1895a3fbb7 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1477,3 +1477,39 @@
drop.invisibility = 0
//else
// come up with drips for other mobs someday
+
+/mob/living/proc/set_metainfo_favs(var/mob/user, var/reopen = TRUE)
+ if(user != src)
+ return
+ var/new_metadata = strip_html_simple(tgui_input_text(user, "Enter any information you'd like others to see relating to your FAVOURITE roleplay preferences. This will not be saved permanently unless you click save in the OOC notes panel! Type \"!clear\" to empty.", "Game Preference" , html_decode(ooc_notes_favs), multiline = TRUE, prevent_enter = TRUE))
+ if(new_metadata && CanUseTopic(user))
+ if(new_metadata == "!clear")
+ new_metadata = ""
+ ooc_notes_favs = new_metadata
+ client.prefs.update_preference_by_type(/datum/preference/text/living/ooc_notes_favs, new_metadata)
+ to_chat(user, span_filter_notice("OOC note favs have been updated. Don't forget to save!"))
+ log_admin("[key_name(user)] updated their OOC note favs mid-round.")
+ if(reopen)
+ ooc_notes_window(user)
+
+/mob/living/proc/set_metainfo_maybes(var/mob/user, var/reopen = TRUE)
+ if(user != src)
+ return
+ var/new_metadata = strip_html_simple(tgui_input_text(user, "Enter any information you'd like others to see relating to your MAYBE roleplay preferences. This will not be saved permanently unless you click save in the OOC notes panel! Type \"!clear\" to empty.", "Game Preference" , html_decode(ooc_notes_maybes), multiline = TRUE, prevent_enter = TRUE))
+ if(new_metadata && CanUseTopic(user))
+ if(new_metadata == "!clear")
+ new_metadata = ""
+ ooc_notes_maybes = new_metadata
+ client.prefs.update_preference_by_type(/datum/preference/text/living/ooc_notes_maybes, new_metadata)
+ to_chat(user, span_filter_notice("OOC note maybes have been updated. Don't forget to save!"))
+ log_admin("[key_name(user)] updated their OOC note maybes mid-round.")
+ if(reopen)
+ ooc_notes_window(user)
+
+/mob/living/proc/set_metainfo_ooc_style(var/mob/user, var/reopen = TRUE)
+ if(user != src)
+ return
+ ooc_notes_style = !ooc_notes_style
+ client.prefs.update_preference_by_type(/datum/preference/toggle/living/ooc_notes_style, ooc_notes_style)
+ if(reopen)
+ ooc_notes_window(user)
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index c4344676f8..d9b4106bcf 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -112,3 +112,7 @@
var/mob/living/tf_form // Shapeshifter shenanigans
var/tf_form_ckey
+
+ var/ooc_notes_favs = null
+ var/ooc_notes_maybes = null
+ var/ooc_notes_style = FALSE
diff --git a/code/modules/mob/living/living_vr.dm b/code/modules/mob/living/living_vr.dm
index 1eb3684979..8bc8c2b365 100644
--- a/code/modules/mob/living/living_vr.dm
+++ b/code/modules/mob/living/living_vr.dm
@@ -91,11 +91,49 @@
if(!ooc_notes)
return
var/msg = ooc_notes
- if(ooc_notes_likes)
- msg += "
LIKES
[ooc_notes_likes]"
- if(ooc_notes_dislikes)
- msg += "
DISLIKES
[ooc_notes_dislikes]"
- to_chat(user, span_chatexport("[src]'s Metainfo:
[msg]"))
+ if(ooc_notes_style && (ooc_notes_favs || ooc_notes_likes || ooc_notes_maybes || ooc_notes_dislikes) && !user.client?.prefs?.read_preference(/datum/preference/toggle/vchat_enable)) // Oldchat hates proper formatting
+ msg += "
"
+ msg += "
| \t[span_blue("FAVOURITES")] | " + if(ooc_notes_likes) + msg += "\t[span_green("LIKES")] | " + if(ooc_notes_maybes) + msg += "\t[span_yellow("MAYBES")] | " + if(ooc_notes_dislikes) + msg += "\t[span_red("DISLIKES")] | " + msg += "
|---|---|---|---|
| " + for(var/line in splittext(ooc_notes_favs, "\n")) + msg += "\t[line]\n" + msg += " | " + if(ooc_notes_likes) + msg += "" + for(var/line in splittext(ooc_notes_likes, "\n")) + msg += "\t[line]\n" + msg += " | " + if(ooc_notes_maybes) + msg += "" + for(var/line in splittext(ooc_notes_maybes, "\n")) + msg += "\t[line]\n" + msg += " | " + if(ooc_notes_dislikes) + msg += "" + for(var/line in splittext(ooc_notes_dislikes, "\n")) + msg += "\t[line]\n" + msg += " | " + msg += "
[notes]
+[notes]
+| + Edit + | +
[favs]
+| + Edit + | +
[maybes]
+