diff --git a/code/__defines/pronouns.dm b/code/__defines/pronouns.dm
new file mode 100644
index 00000000000..c0515426e35
--- /dev/null
+++ b/code/__defines/pronouns.dm
@@ -0,0 +1,40 @@
+/// she, he, they, it "%PRONOUN_they" = "p_they"
+/// She, He, They, It "%PRONOUN_They" = "p_They"
+/// her, his, their, its "%PRONOUN_their" = "p_their"
+/// Her, His, Their, Its "%PRONOUN_Their" = "p_Their"
+/// hers, his, theirs, its "%PRONOUN_theirs" = "p_theirs"
+/// Hers, His, Theirs, Its "%PRONOUN_Theirs" = "p_Theirs"
+/// her, him, them, it "%PRONOUN_them" = "p_them"
+/// Her, Him, Them, It "%PRONOUN_Them" = "p_Them"
+/// has, have "%PRONOUN_have" = "p_have"
+/// is, are "%PRONOUN_are" = "p_are"
+/// was, were "%PRONOUN_were" = "p_were"
+/// does, do "%PRONOUN_do" = "p_do"
+/// she has, he has, they have, it has "%PRONOUN_theyve" = "p_theyve"
+/// She has, He has, They have, It has "%PRONOUN_Theyve" = "p_Theyve"
+/// she is, he is, they are, it is "%PRONOUN_theyre" = "p_theyre"
+/// She is, He is, They are, It is "%PRONOUN_Theyre" = "p_Theyre"
+/// s, null (she looks, they look) "%PRONOUN_s" = "p_s"
+/// es, null (she goes, they go) "%PRONOUN_es" = "p_es"
+
+/// A list for all the pronoun procs, if you need to iterate or search through it or something.
+#define ALL_PRONOUNS list( \
+ "%PRONOUN_they" = TYPE_PROC_REF(/datum, p_they), \
+ "%PRONOUN_They" = TYPE_PROC_REF(/datum, p_They), \
+ "%PRONOUN_their" = TYPE_PROC_REF(/datum, p_their), \
+ "%PRONOUN_Their" = TYPE_PROC_REF(/datum, p_Their), \
+ "%PRONOUN_theirs" = TYPE_PROC_REF(/datum, p_theirs), \
+ "%PRONOUN_Theirs" = TYPE_PROC_REF(/datum, p_Theirs), \
+ "%PRONOUN_them" = TYPE_PROC_REF(/datum, p_them), \
+ "%PRONOUN_Them" = TYPE_PROC_REF(/datum, p_Them), \
+ "%PRONOUN_have" = TYPE_PROC_REF(/datum, p_have), \
+ "%PRONOUN_are" = TYPE_PROC_REF(/datum, p_are), \
+ "%PRONOUN_were" = TYPE_PROC_REF(/datum, p_were), \
+ "%PRONOUN_do" = TYPE_PROC_REF(/datum, p_do), \
+ "%PRONOUN_theyve" = TYPE_PROC_REF(/datum, p_theyve), \
+ "%PRONOUN_Theyve" = TYPE_PROC_REF(/datum, p_Theyve), \
+ "%PRONOUN_theyre" = TYPE_PROC_REF(/datum, p_theyre), \
+ "%PRONOUN_Theyre" = TYPE_PROC_REF(/datum, p_Theyre), \
+ "%PRONOUN_s" = TYPE_PROC_REF(/datum, p_s), \
+ "%PRONOUN_es" = TYPE_PROC_REF(/datum, p_es) \
+)
diff --git a/code/_helpers/gender.dm b/code/_helpers/gender.dm
new file mode 100644
index 00000000000..17dbbd3ebae
--- /dev/null
+++ b/code/_helpers/gender.dm
@@ -0,0 +1,620 @@
+#define GET_TARGET_PRONOUN(target, pronoun, gender) call(target, ALL_PRONOUNS[pronoun])(gender)
+
+// DATUM GENDER
+// They don't have gender (often), but everything else does.
+
+/datum/proc/p_they(temp_gender)
+ return "it"
+
+/datum/proc/p_They(temp_gender)
+ return capitalize(p_they(temp_gender))
+
+/datum/proc/p_their(temp_gender)
+ return "its"
+
+/datum/proc/p_Their(temp_gender)
+ return capitalize(p_their(temp_gender))
+
+/datum/proc/p_theirs(temp_gender)
+ return "its"
+
+/datum/proc/p_Theirs(temp_gender)
+ return capitalize(p_Theirs(temp_gender))
+
+/datum/proc/p_them(temp_gender)
+ return "it"
+
+/datum/proc/p_Them(temp_gender)
+ return capitalize(p_them(temp_gender))
+
+/datum/proc/p_have(temp_gender)
+ return "has"
+
+/datum/proc/p_are(temp_gender)
+ return "is"
+
+/datum/proc/p_were(temp_gender)
+ return "was"
+
+/datum/proc/p_do(temp_gender)
+ return "does"
+
+/datum/proc/p_theyve(temp_gender)
+ return p_they(temp_gender) + "'" + copytext_char(p_have(temp_gender), 3)
+
+/datum/proc/p_Theyve(temp_gender)
+ return p_They(temp_gender) + "'" + copytext_char(p_have(temp_gender), 3)
+
+/datum/proc/p_theyre(temp_gender)
+ return p_they(temp_gender) + "'" + copytext_char(p_are(temp_gender), 2)
+
+/datum/proc/p_Theyre(temp_gender)
+ return p_they(temp_gender) + "'" + copytext_char(p_are(temp_gender), 2)
+
+/datum/proc/p_s(temp_gender)
+ return "s"
+
+/datum/proc/p_es(temp_gender)
+ return "es"
+
+/datum/proc/p_themselves(temp_gender)
+ return "itself"
+
+/datum/proc/plural_s(pluralize)
+ switch(copytext_char(pluralize, -2))
+ if("ss")
+ return "es"
+ if("sh")
+ return "es"
+ if("ch")
+ return "es"
+ else
+ switch(copytext_char(pluralize, -1))
+ if("s", "x", "z")
+ return "es"
+ else
+ return "s"
+
+/// A proc to replace pronouns in a string with the appropriate pronouns for a target atom.
+/// Uses associative list access from a __DEFINE list, since associative access is slightly faster
+/datum/proc/REPLACE_PRONOUNS(target_string, atom/targeted_atom, targeted_gender = null)
+ /// If someone specifies targeted_gender we choose that,
+ /// otherwise we go off the gender of our object
+ var/gender
+ if(targeted_gender)
+ if(!istext(targeted_gender) || !(targeted_gender in list(MALE, FEMALE, PLURAL, NEUTER, HERM)))
+ stack_trace("REPLACE_PRONOUNS called with improper parameters.")
+ return
+ gender = targeted_gender
+ else
+ gender = targeted_atom.get_visible_gender()
+ ///The pronouns are ordered by their length to avoid %PRONOUN_Theyve being translated to "Heve" instead of "He's", for example
+ var/regex/pronoun_regex = regex("%PRONOUN(_(theirs|Theirs|theyve|Theyve|theyre|Theyre|their|Their|they|They|them|Them|have|were|are|do|es|s))")
+ while(pronoun_regex.Find(target_string))
+ target_string = pronoun_regex.Replace(target_string, GET_TARGET_PRONOUN(targeted_atom, pronoun_regex.match, gender))
+ return target_string
+
+// CLIENT GENDER
+
+/client/p_they(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ switch(temp_gender)
+ if(FEMALE)
+ return "she"
+ if(MALE)
+ return "he"
+ if(NEUTER)
+ return "it"
+ if(HERM)
+ return "shi"
+ else
+ return "they"
+
+/client/p_their(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ switch(temp_gender)
+ if(FEMALE)
+ return "her"
+ if(MALE)
+ return "his"
+ if(NEUTER)
+ return "its"
+ if(HERM)
+ return "hir"
+ else
+ return "their"
+
+/client/p_theirs(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ switch(temp_gender)
+ if(FEMALE)
+ return "hers"
+ if(MALE)
+ return "his"
+ if(NEUTER)
+ return "its"
+ if(HERM)
+ return "hirs"
+ else
+ return "theirs"
+
+/client/p_them(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ switch(temp_gender)
+ if(FEMALE)
+ return "her"
+ if(MALE)
+ return "him"
+ if(NEUTER)
+ return "it"
+ if(HERM)
+ return "hir"
+ else
+ return "them"
+
+/client/p_have(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender == PLURAL)
+ return "have"
+ return "has"
+
+/client/p_are(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender == PLURAL)
+ return "are"
+ return "is"
+
+/client/p_were(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender == PLURAL)
+ return "were"
+ return "was"
+
+/client/p_do(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender == PLURAL)
+ return "do"
+ return "does"
+
+/client/p_s(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender != PLURAL)
+ return "s"
+
+/client/p_es(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender != PLURAL && temp_gender != NEUTER)
+ return "es"
+
+/client/p_themselves(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ switch(temp_gender)
+ if(FEMALE)
+ return "herself"
+ if(MALE)
+ return "himself"
+ if(PLURAL)
+ return "themselves"
+ if(HERM)
+ return "hirself"
+ else
+ return "itself"
+
+// MOB GENDER
+
+/mob/p_they(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ switch(temp_gender)
+ if(FEMALE)
+ return "she"
+ if(MALE)
+ return "he"
+ if(PLURAL)
+ return "they"
+ if(HERM)
+ return "shi"
+ else
+ return "it"
+
+/mob/p_their(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ switch(temp_gender)
+ if(FEMALE)
+ return "her"
+ if(MALE)
+ return "his"
+ if(PLURAL)
+ return "their"
+ if(HERM)
+ return "hir"
+ else
+ return "its"
+
+/mob/p_theirs(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ switch(temp_gender)
+ if(FEMALE)
+ return "hers"
+ if(MALE)
+ return "his"
+ if(PLURAL)
+ return "theirs"
+ if(HERM)
+ return "hirs"
+ else
+ return "its"
+
+/mob/p_them(capitalized, temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ switch(temp_gender)
+ if(FEMALE)
+ return "her"
+ if(MALE)
+ return "him"
+ if(PLURAL)
+ return "them"
+ if(HERM)
+ return "hir"
+ else
+ return "it"
+
+/mob/p_have(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender == PLURAL)
+ return "have"
+ return "has"
+
+/mob/p_are(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender == PLURAL)
+ return "are"
+ return "is"
+
+/mob/p_were(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender == PLURAL)
+ return "were"
+ return "was"
+
+/mob/p_do(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender == PLURAL)
+ return "do"
+ return "does"
+
+/mob/p_s(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender != PLURAL)
+ return "s"
+
+/mob/p_es(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender != PLURAL)
+ return "es"
+
+/mob/p_themselves(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ switch(temp_gender)
+ if(FEMALE)
+ return "herself"
+ if(MALE)
+ return "himself"
+ if(PLURAL)
+ return "themselves"
+ if(HERM)
+ return "hirself"
+ else
+ return "itself"
+
+// ATOM GENDER
+
+/atom/p_they(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ switch(temp_gender)
+ if(FEMALE)
+ return "she"
+ if(MALE)
+ return "he"
+ if(PLURAL)
+ return "they"
+ if(HERM)
+ return "shi"
+ else
+ return "it"
+
+/atom/p_their(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ switch(temp_gender)
+ if(FEMALE)
+ return "her"
+ if(MALE)
+ return "his"
+ if(PLURAL)
+ return "their"
+ if(HERM)
+ return "hir"
+ else
+ return "its"
+
+/atom/p_theirs(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ switch(temp_gender)
+ if(FEMALE)
+ return "hers"
+ if(MALE)
+ return "his"
+ if(PLURAL)
+ return "theirs"
+ if(HERM)
+ return "hirs"
+ else
+ return "its"
+
+/atom/p_them(capitalized, temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ switch(temp_gender)
+ if(FEMALE)
+ return "her"
+ if(MALE)
+ return "him"
+ if(PLURAL)
+ return "them"
+ if(HERM)
+ return "hir"
+ else
+ return "it"
+
+/atom/p_have(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender == PLURAL)
+ return "have"
+ return "has"
+
+/atom/p_are(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender == PLURAL)
+ return "are"
+ return "is"
+
+/atom/p_were(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender == PLURAL)
+ return "were"
+ return "was"
+
+/atom/p_do(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender == PLURAL)
+ return "do"
+ return "does"
+
+/atom/p_s(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender != PLURAL)
+ return "s"
+
+/atom/p_es(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender != PLURAL)
+ return "es"
+
+/atom/p_themselves(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ switch(temp_gender)
+ if(FEMALE)
+ return "herself"
+ if(MALE)
+ return "himself"
+ if(PLURAL)
+ return "themselves"
+ if(HERM)
+ return "hirself"
+ else
+ return "itself"
+
+/atom/proc/get_visible_gender(mob/user, force)
+ return gender
+
+// CARBON GENDER
+
+/mob/living/carbon/human/get_visible_gender(mob/user, force)
+ if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT) && (wear_mask && (wear_mask & HIDEFACE) || isobj(head) && (head.body_parts_covered & FACE)))
+ return PLURAL
+ return gender
+
+/mob/living/carbon/human/p_they(temp_gender)
+ temp_gender ||= get_visible_gender()
+ return ..()
+
+/mob/living/carbon/human/p_their(temp_gender)
+ temp_gender ||= get_visible_gender()
+ return ..()
+
+/mob/living/carbon/human/p_theirs(capitalized, temp_gender)
+ temp_gender ||= get_visible_gender()
+ return ..()
+
+/mob/living/carbon/human/p_them(capitalized, temp_gender)
+ temp_gender ||= get_visible_gender()
+ return ..()
+
+/mob/living/carbon/human/p_have(temp_gender)
+ temp_gender ||= get_visible_gender()
+ return ..()
+
+/mob/living/carbon/human/p_are(temp_gender)
+ temp_gender ||= get_visible_gender()
+ return ..()
+
+/mob/living/carbon/human/p_were(temp_gender)
+ temp_gender ||= get_visible_gender()
+ return ..()
+
+/mob/living/carbon/human/p_do(temp_gender)
+ temp_gender ||= get_visible_gender()
+ return ..()
+
+/mob/living/carbon/human/p_s(temp_gender)
+ temp_gender ||= get_visible_gender()
+ return ..()
+
+/mob/living/carbon/human/p_es(temp_gender)
+ temp_gender ||= get_visible_gender()
+ return ..()
+
+/mob/living/carbon/human/p_themselves(temp_gender)
+ temp_gender ||= get_visible_gender()
+ return ..()
+
+// ITEM GENDER
+
+/obj/item/clothing/p_they(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender == PLURAL)
+ return "they"
+ return "it"
+
+/obj/item/clothing/p_their(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender == PLURAL)
+ return "their"
+ return "its"
+
+/obj/item/clothing/p_theirs(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender == PLURAL)
+ return "theirs"
+ return "its"
+
+/obj/item/clothing/p_them(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender == PLURAL)
+ return "them"
+ return "it"
+
+/obj/item/clothing/p_have(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender == PLURAL)
+ return "have"
+ return "has"
+
+/obj/item/clothing/p_are(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender == PLURAL)
+ return "are"
+ return "is"
+
+/obj/item/clothing/p_were(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender == PLURAL)
+ return "were"
+ return "was"
+
+/obj/item/clothing/p_do(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender == PLURAL)
+ return "do"
+ return "does"
+
+/obj/item/clothing/p_s(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender != PLURAL)
+ return "s"
+
+/obj/item/clothing/p_es(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ if(temp_gender != PLURAL)
+ return "es"
+
+/obj/item/clothing/p_themselves(temp_gender)
+ if(!temp_gender)
+ temp_gender = gender
+ switch(temp_gender)
+ if(FEMALE)
+ return "herself"
+ if(MALE)
+ return "himself"
+ if(PLURAL)
+ return "themselves"
+ if(HERM)
+ return "hirself"
+ else
+ return "itself"
+
+// MIND GENDER
+
+/datum/mind/p_they(temp_gender)
+ return current?.p_they(temp_gender) || ..()
+
+/datum/mind/p_their(temp_gender)
+ return current?.p_their(temp_gender) || ..()
+
+/datum/mind/p_theirs(temp_gender)
+ return current?.p_theirs(temp_gender) || ..()
+
+/datum/mind/p_them(capitalized, temp_gender)
+ return current?.p_them(capitalized, temp_gender) || ..()
+
+/datum/mind/p_have(temp_gender)
+ return current?.p_have(temp_gender) || ..()
+
+/datum/mind/p_are(temp_gender)
+ return current?.p_are(temp_gender) || ..()
+
+/datum/mind/p_were(temp_gender)
+ return current?.p_were(temp_gender) || ..()
+
+/datum/mind/p_do(temp_gender)
+ return current?.p_do(temp_gender) || ..()
+
+/datum/mind/p_s(temp_gender)
+ return current?.p_s(temp_gender) || ..()
+
+/datum/mind/p_es(temp_gender)
+ return current?.p_es(temp_gender) || ..()
+
+/datum/mind/p_themselves(temp_gender)
+ return current?.p_themselves(temp_gender) || ..()
diff --git a/code/datums/components/traits/unlucky.dm b/code/datums/components/traits/unlucky.dm
index 81f7abf0de5..91ccb253f33 100644
--- a/code/datums/components/traits/unlucky.dm
+++ b/code/datums/components/traits/unlucky.dm
@@ -278,8 +278,7 @@
for(var/obj/structure/table/evil_table in the_turf)
if(!evil_table.material) //We only want tables, not just table frames.
continue
- var/datum/gender/gender = GLOB.gender_datums[living_guy.get_visible_gender()]
- living_guy.visible_message(span_danger("[living_guy] stubs [gender.his] toe on [evil_table]!"), span_bolddanger("You stub your toe on [evil_table]!"))
+ living_guy.visible_message(span_danger("[living_guy] stubs [living_guy.p_their()] toe on [evil_table]!"), span_bolddanger("You stub your toe on [evil_table]!"))
living_guy.apply_damage(2 * damage_mod, BRUTE, pick(BP_L_FOOT, BP_R_FOOT), used_weapon = "blunt force trauma")
living_guy.adjustHalLoss(25) //It REALLY hurts.
living_guy.Weaken(3)
@@ -314,8 +313,7 @@
if(prob(30 * luck_mod) && our_guy.get_bodypart_name(BP_HEAD)) /// Bonk!
playsound(our_guy, 'sound/effects/tableheadsmash.ogg', 90, TRUE)
- var/datum/gender/gender = GLOB.gender_datums[our_guy.get_visible_gender()]
- our_guy.visible_message(span_danger("[our_guy] hits [gender.his] head really badly falling down!"), span_bolddanger("You hit your head really badly falling down!"))
+ our_guy.visible_message(span_danger("[our_guy] hits [our_guy.p_their()] head really badly falling down!"), span_bolddanger("You hit your head really badly falling down!"))
var/max_health_coefficient = (our_guy.maxHealth * 0.5)
our_guy.apply_damage(max_health_coefficient * damage_mod, BRUTE, BP_HEAD, used_weapon = "slipping")
if(ishuman(our_guy))
@@ -457,8 +455,7 @@
if(!damage_to_inflict)
return
- var/datum/gender/gender = GLOB.gender_datums[unlucky_human.get_visible_gender()]
- unlucky_human.visible_message(span_danger("[unlucky_human] accidentally [injury_verb] [gender.his] hand on [item]!"))
+ unlucky_human.visible_message(span_danger("[unlucky_human] accidentally [injury_verb] [unlucky_human.p_their()] hand on [item]!"))
unlucky_human.apply_damage(damage_to_inflict * damage_mod, damage_type, current_hand, sharp = is_sharp, edge = has_edge, used_weapon = injury_type)
/datum/component/omen/proc/check_stairs(mob/living/unlucky_soul)
diff --git a/code/datums/status_effects/debuffs/fire_stacks.dm b/code/datums/status_effects/debuffs/fire_stacks.dm
index 3827552f559..b721b872cff 100644
--- a/code/datums/status_effects/debuffs/fire_stacks.dm
+++ b/code/datums/status_effects/debuffs/fire_stacks.dm
@@ -153,8 +153,7 @@
if(owner.on_fire)
return
- var/datum/gender/T = GLOB.gender_datums[owner.get_visible_gender()]
- return "[T.He] [T.is] covered in something flammable."
+ return "[owner.p_They()] [owner.p_are()] covered in something flammable."
// /datum/status_effect/fire_handler/fire_stacks/proc/owner_touched_sparks()
// SIGNAL_HANDLER
@@ -374,8 +373,7 @@
REMOVE_TRAIT(owner, TRAIT_NO_SLIP_WATER, TRAIT_STATUS_EFFECT(id))
/datum/status_effect/fire_handler/wet_stacks/get_examine_text()
- var/datum/gender/T = GLOB.gender_datums[owner.get_visible_gender()]
- return "[T.He] look[T.s] a little soaked."
+ return "[owner.p_They()] look[owner.p_s()] a little soaked."
/datum/status_effect/fire_handler/wet_stacks/tick(seconds_between_ticks)
var/decay = HAS_TRAIT(owner, TRAIT_WET_FOR_LONGER) ? -0.035 : -0.5
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 7a21b573d1b..e021bba88a0 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -461,8 +461,7 @@ var/list/mob/living/forced_ambiance_list = list()
H.AdjustWeakened(3)
to_chat(mob, span_notice("The sudden appearance of gravity makes you fall to the floor!"))
if(HAS_TRAIT(H, TRAIT_UNLUCKY) && prob(50) && H.get_bodypart_name(BP_HEAD))
- var/datum/gender/gender = GLOB.gender_datums[H.get_visible_gender()]
- H.visible_message(span_warning("[H] falls to the ground from the sudden appearance of gravity, smashing [gender.his] head against the ground!"),span_warning("You smash your head into the ground as gravity appears!"))
+ H.visible_message(span_warning("[H] falls to the ground from the sudden appearance of gravity, smashing [H.p_their()] head against the ground!"),span_warning("You smash your head into the ground as gravity appears!"))
H.apply_damage(14, BRUTE, BP_HEAD, used_weapon = "blunt force")
playsound(H, 'sound/effects/tableheadsmash.ogg', 90, TRUE)
playsound(mob, "bodyfall", 50, 1)
diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm
index d2d64fe5668..64c40e1c144 100644
--- a/code/game/atom/_atom.dm
+++ b/code/game/atom/_atom.dm
@@ -482,9 +482,6 @@
. = ..()
SEND_SIGNAL(src, COMSIG_ATOM_EXITED, AM, new_loc)
-/atom/proc/get_visible_gender(mob/user, force)
- return gender
-
/atom/proc/interact(mob/user)
return
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index c99ac385949..80adbc4c46c 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -160,8 +160,7 @@ var/list/sacrificed = list()
if (!target.can_feel_pain())
target.visible_message(span_warning("The markings below \the [target] glow a bloody red."))
else
- var/datum/gender/TT = GLOB.gender_datums[target.get_visible_gender()]
- target.visible_message(span_warning("[target] writhes in pain as the markings below [TT.him] glow a bloody red."), span_danger("AAAAAAHHHH!"), span_warning("You hear an anguished scream."))
+ target.visible_message(span_warning("[target] writhes in pain as the markings below [target.p_them()] glow a bloody red."), span_danger("AAAAAAHHHH!"), span_warning("You hear an anguished scream."))
if(!waiting_for_input[target]) //so we don't spam them with dialogs if they hesitate
waiting_for_input[target] = 1
@@ -366,17 +365,14 @@ var/list/sacrificed = list()
if(corpse_to_raise.client)
- var/datum/gender/TU = GLOB.gender_datums[corpse_to_raise.get_visible_gender()]
- var/datum/gender/TT = GLOB.gender_datums[body_to_sacrifice.get_visible_gender()]
-
cult.add_antagonist(corpse_to_raise.mind)
corpse_to_raise.revive()
usr.say("Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!")
- corpse_to_raise.visible_message(span_warning("[corpse_to_raise]'s eyes glow with a faint red as [TU.he] stand[TU.s] up, slowly starting to breathe again."), \
+ corpse_to_raise.visible_message(span_warning("[corpse_to_raise]'s eyes glow with a faint red as [corpse_to_raise.p_they()] stand[corpse_to_raise.p_s()] up, slowly starting to breathe again."), \
span_warning("Life... I'm alive again..."), \
span_warning("You hear a faint, slightly familiar whisper."))
- body_to_sacrifice.visible_message(span_danger("[body_to_sacrifice] is torn apart, a black smoke swiftly dissipating from [TT.his] remains!"), \
+ body_to_sacrifice.visible_message(span_danger("[body_to_sacrifice] is torn apart, a black smoke swiftly dissipating from [body_to_sacrifice.p_their()] remains!"), \
span_danger("You feel as your blood boils, tearing you apart."), \
span_danger("You hear a thousand voices, all crying in pain."))
body_to_sacrifice.gib()
@@ -423,9 +419,8 @@ var/list/sacrificed = list()
/obj/effect/rune/proc/ajourney() //some bits copypastaed from admin tools - Urist
if(usr.loc==src.loc)
var/mob/living/carbon/human/L = usr
- var/datum/gender/TU = GLOB.gender_datums[L.get_visible_gender()]
usr.say("Fwe[pick("'","`")]sh mah erl nyag r'ya!")
- usr.visible_message(span_warning("[usr]'s eyes glow blue as [TU.he] freeze[TU.s] in place, absolutely motionless."), \
+ usr.visible_message(span_warning("[usr]'s eyes glow blue as [L.p_they()] freeze[L.p_s()] in place, absolutely motionless."), \
span_warning("The shadow that is your spirit separates itself from your body. You are now in the realm beyond. While this is a great sight, being here strains your mind and body. Hurry..."), \
span_warning("You hear only complete silence for a moment."))
announce_ghost_joinleave(usr.ghostize(1), 1, "You feel that they had to use some [pick("dark", "black", "blood", "forgotten", "forbidden")] magic to [pick("invade","disturb","disrupt","infest","taint","spoil","blight")] this place!")
@@ -590,12 +585,11 @@ var/list/sacrificed = list()
/obj/effect/rune/proc/mend()
var/mob/living/user = usr
- var/datum/gender/TU = GLOB.gender_datums[usr.get_visible_gender()]
src = null
user.say("Uhrast ka'hfa heldsagen ver[pick("'","`")]lot!")
user.take_overall_damage(200, 0)
GLOB.runedec+=10
- user.visible_message(span_danger("\The [user] keels over dead, [TU.his] blood glowing blue as it escapes [TU.his] body and dissipates into thin air."), \
+ user.visible_message(span_danger("\The [user] keels over dead, [usr.p_their()] blood glowing blue as it escapes [usr.p_their()] body and dissipates into thin air."), \
span_danger("In the last moment of your humble life, you feel an immense pain as fabric of reality mends... with your blood."), \
span_warning("You hear faint rustle."))
for(,user.stat==2)
@@ -877,8 +871,7 @@ var/list/sacrificed = list()
if (cultist == user) //just to be sure.
return
if(cultist.buckled || cultist.handcuffed || (!isturf(cultist.loc) && !istype(cultist.loc, /obj/structure/closet)))
- var/datum/gender/TU = GLOB.gender_datums[cultist.get_visible_gender()]
- to_chat(user, span_warning("You cannot summon \the [cultist], for [TU.his] shackles of blood are strong."))
+ to_chat(user, span_warning("You cannot summon \the [cultist], for [cultist.p_their()] shackles of blood are strong."))
return fizzle()
cultist.forceMove(src.loc)
cultist.lying = 1
diff --git a/code/game/gamemodes/endgame/supermatter_cascade/blob.dm b/code/game/gamemodes/endgame/supermatter_cascade/blob.dm
index e0136f8a65d..619241b3060 100644
--- a/code/game/gamemodes/endgame/supermatter_cascade/blob.dm
+++ b/code/game/gamemodes/endgame/supermatter_cascade/blob.dm
@@ -100,8 +100,7 @@
/turf/unsimulated/wall/supermatter/Bumped(atom/AM as mob|obj)
if(isliving(AM))
var/mob/living/M = AM
- var/datum/gender/T = GLOB.gender_datums[M.get_visible_gender()]
- AM.visible_message(span_warning("\The [AM] slams into \the [src] inducing a resonance... [T.his] body starts to glow and catch flame before flashing into ash."),\
+ AM.visible_message(span_warning("\The [AM] slams into \the [src] inducing a resonance... [M.p_Their()] body starts to glow and catch flame before flashing into ash."),\
span_danger("You slam into \the [src] as your ears are filled with unearthly ringing. Your last thought is \"Oh, fuck.\""),\
span_warning("You hear an unearthly noise as a wave of heat washes over you."))
else
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index c20faad032b..f4b261148ec 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -67,8 +67,7 @@ GLOBAL_LIST_EMPTY(all_objectives)
/datum/objective/anti_revolution/execute/find_target()
..()
if(target && target.current)
- var/datum/gender/T = GLOB.gender_datums[target.current.get_visible_gender()]
- explanation_text = "[target.current.real_name], the [target.assigned_role] has extracted confidential information above their clearance. Execute [T.him]."
+ explanation_text = "[target.current.real_name], the [target.assigned_role] has extracted confidential information above their clearance. Execute [target.p_them()]."
else
explanation_text = "Free Objective"
return target
@@ -77,8 +76,7 @@ GLOBAL_LIST_EMPTY(all_objectives)
/datum/objective/anti_revolution/execute/find_target_by_role(role, role_type=0)
..(role, role_type)
if(target && target.current)
- var/datum/gender/T = GLOB.gender_datums[target.current.get_visible_gender()]
- explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has extracted confidential information above their clearance. Execute [T.him]."
+ explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has extracted confidential information above their clearance. Execute [target.p_them()]."
else
explanation_text = "Free Objective"
return target
@@ -126,8 +124,7 @@ GLOBAL_LIST_EMPTY(all_objectives)
/datum/objective/anti_revolution/demote/find_target()
..()
if(target && target.current)
- var/datum/gender/T = GLOB.gender_datums[target.current.get_visible_gender()]
- explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to [using_map.company_name]'s goals. Demote [T.him] to assistant."
+ explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to [using_map.company_name]'s goals. Demote [target.p_them()] to assistant."
else
explanation_text = "Free Objective"
return target
@@ -135,8 +132,7 @@ GLOBAL_LIST_EMPTY(all_objectives)
/datum/objective/anti_revolution/demote/find_target_by_role(role, role_type=0)
..(role, role_type)
if(target && target.current)
- var/datum/gender/T = GLOB.gender_datums[target.current.get_visible_gender()]
- explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has been classified as harmful to [using_map.company_name]'s goals. Demote [T.him] to assistant."
+ explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has been classified as harmful to [using_map.company_name]'s goals. Demote [target.p_them()] to assistant."
else
explanation_text = "Free Objective"
return target
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 3702a06a3a2..e89780b2b05 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -308,8 +308,7 @@
if(!occupant)
return
if(occupant.stat == DEAD)
- var/datum/gender/G = GLOB.gender_datums[occupant.get_visible_gender()]
- to_chat(ui.user, span_danger("This person has no life to preserve anymore. Take [G.him] to a department capable of reanimating [G.him]."))
+ to_chat(ui.user, span_danger("This person has no life to preserve anymore. Take [occupant.p_them()] to a department capable of reanimating [occupant.p_them()]."))
return
var/chemical = params["chemid"]
var/amount = text2num(params["amount"])
diff --git a/code/game/objects/items/leash.dm b/code/game/objects/items/leash.dm
index 1df6055dc6d..f0e4a09e95d 100644
--- a/code/game/objects/items/leash.dm
+++ b/code/game/objects/items/leash.dm
@@ -43,7 +43,7 @@
return
if(!is_wearing_collar(leash_pet)) //The pet has slipped their collar and is not the pet anymore.
leash_pet.visible_message(
- span_warning("[leash_pet] has slipped out of their collar!"),
+ span_warning("[leash_pet] has slipped out of [leash_pet.p_their()] collar!"),
span_warning("You have slipped out of your collar!")
)
clear_leash()
@@ -124,7 +124,7 @@
return
if(get_dist(leash_pet, leash_master) > 3 && !leash_pet.stunned)
leash_pet.visible_message(
- span_warning("[leash_pet] is pulled to the ground by their leash!"),
+ span_warning("[leash_pet] is pulled to the ground by [leash_pet.p_their()] leash!"),
span_warning("You are pulled to the ground by your leash!")
)
leash_pet.apply_effect(20, STUN, 0)
@@ -187,7 +187,7 @@
STOP_PROCESSING(SSobj, src)
/obj/item/leash/proc/struggle_leash()
- leash_pet.visible_message(span_danger("\The [leash_pet] is attempting to unhook their leash!"), span_danger("You attempt to unhook your leash"))
+ leash_pet.visible_message(span_danger("\The [leash_pet] is attempting to unhook [leash_pet.p_their()] leash!"), span_danger("You attempt to unhook your leash"))
add_attack_logs(leash_master,leash_pet,"Self-unleash (attempt)")
if(!do_mob(leash_pet, leash_pet, 35))
diff --git a/code/game/objects/items/toys/mech_toys.dm b/code/game/objects/items/toys/mech_toys.dm
index b4b00cfe5a8..3169b9ec1c7 100644
--- a/code/game/objects/items/toys/mech_toys.dm
+++ b/code/game/objects/items/toys/mech_toys.dm
@@ -166,9 +166,8 @@
return
//extend the offer of battle to the other mech
- var/datum/gender/T = GLOB.gender_datums[user.get_visible_gender()]
to_chat(user, span_notice("You offer battle to [target.name]!"))
- to_chat(target, span_notice(span_bold("[user.name] wants to battle with [T.His] [name]!") + " " + span_italics("Attack them with a toy mech to initiate combat.")))
+ to_chat(target, span_notice(span_bold("[user.name] wants to battle with [user.p_their()] [name]!") + " " + span_italics("Attack them with a toy mech to initiate combat.")))
wants_to_battle = TRUE
addtimer(CALLBACK(src, PROC_REF(withdraw_offer), user), 6 SECONDS)
return
@@ -391,28 +390,25 @@
* * target: optional arg used in Mech PvP battles (if used, attacker is target's toy)
*/
/obj/item/toy/mecha/proc/check_battle_start(mob/living/carbon/user, obj/item/toy/mecha/attacker, mob/living/carbon/target)
- var/datum/gender/T
- if(target)
- T = GLOB.gender_datums[target.get_visible_gender()] // Doing this because Polaris Code has shitty gender datums and it's clunkier than FUCK.
if(attacker && attacker.in_combat)
- to_chat(user, span_notice("[target ? T.His : "Your" ] [attacker.name] is in combat."))
+ to_chat(user, span_notice("[target ? target.p_their() : "Your" ] [attacker.name] is in combat."))
if(target)
to_chat(target, span_notice("Your [attacker.name] is in combat."))
return FALSE
if(in_combat)
to_chat(user, span_notice("Your [name] is in combat."))
if(target)
- to_chat(target, span_notice("[T.His] [name] is in combat."))
+ to_chat(target, span_notice("[target.p_Their()] [name] is in combat."))
return FALSE
if(attacker && attacker.timer > world.time)
- to_chat(user, span_notice("[target?T.His : "Your" ] [attacker.name] isn't ready for battle."))
+ to_chat(user, span_notice("[target ? target.p_their() : "Your" ] [attacker.name] isn't ready for battle."))
if(target)
to_chat(target, span_notice("Your [attacker.name] isn't ready for battle."))
return FALSE
if(timer > world.time)
to_chat(user, span_notice("Your [name] isn't ready for battle."))
if(target)
- to_chat(target, span_notice("[T.His] [name] isn't ready for battle."))
+ to_chat(target, span_notice("[target.p_Their()] [name] isn't ready for battle."))
return FALSE
return TRUE
diff --git a/code/game/objects/items/weapons/canes.dm b/code/game/objects/items/weapons/canes.dm
index af661143c00..c6a25f2d537 100644
--- a/code/game/objects/items/weapons/canes.dm
+++ b/code/game/objects/items/weapons/canes.dm
@@ -29,9 +29,8 @@
temp_blade.attack_self()
/obj/item/cane/concealed/attack_self(var/mob/user)
- var/datum/gender/T = GLOB.gender_datums[user.get_visible_gender()]
if(concealed_blade)
- user.visible_message(span_warning("[user] has unsheathed \a [concealed_blade] from [T.his] [src]!"), "You unsheathe \the [concealed_blade] from \the [src].")
+ user.visible_message(span_warning("[user] has unsheathed \a [concealed_blade] from [user.p_their()] [src]!"), "You unsheathe \the [concealed_blade] from \the [src].")
// Calling drop/put in hands to properly call item drop/pickup procs
playsound(src, 'sound/weapons/holster/sheathout.ogg', 50, 1)
user.drop_from_inventory(src)
@@ -46,8 +45,7 @@
/obj/item/cane/concealed/attackby(var/obj/item/material/sword/katana/caneblade/W, var/mob/user)
if(!src.concealed_blade && istype(W))
- var/datum/gender/T = GLOB.gender_datums[user.get_visible_gender()]
- user.visible_message(span_warning("[user] has sheathed \a [W] into [T.his] [src]!"), "You sheathe \the [W] into \the [src].")
+ user.visible_message(span_warning("[user] has sheathed \a [W] into [user.p_their()] [src]!"), "You sheathe \the [W] into \the [src].")
playsound(src, 'sound/weapons/holster/sheathin.ogg', 50, 1)
user.drop_from_inventory(W)
W.loc = src
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index 52001eb43b6..6cfaeacc7f1 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -133,9 +133,7 @@ var/last_chew = 0
var/obj/item/organ/external/O = H.organs_by_name[(H.hand ? BP_L_HAND : BP_R_HAND)]
if (!O) return
- var/datum/gender/T = GLOB.gender_datums[H.get_visible_gender()]
-
- var/s = span_warning("[H.name] chews on [T.his] [O.name]!")
+ var/s = span_warning("[H.name] chews on [H.p_their()] [O.name]!")
H.visible_message(s, span_warning("You chew on your [O.name]!"))
add_attack_logs(H,H,"chewed own [O.name]")
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index 1d60e33da86..f329124cf9c 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -102,10 +102,9 @@
to_chat(user, span_notice("\The [src] does not seem to have power."))
return
- var/datum/gender/TU = GLOB.gender_datums[user.get_visible_gender()]
if (active)
if ((CLUMSY in user.mutations) && prob(50))
- user.visible_message(span_danger("\The [user] accidentally cuts [TU.himself] with \the [src]."),\
+ user.visible_message(span_danger("\The [user] accidentally cuts [user.p_their()] with \the [src]."),\
span_danger("You accidentally cut yourself with \the [src]."))
user.take_organ_damage(5,5)
deactivate(user)
diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm
index afc0f3f01d8..1f73c1ad3aa 100644
--- a/code/game/objects/structures/kitchen_spike.dm
+++ b/code/game/objects/structures/kitchen_spike.dm
@@ -19,8 +19,7 @@
to_chat(user, span_danger("The spike already has something on it, finish collecting its meat first!"))
else
if(spike(G.affecting))
- var/datum/gender/T = GLOB.gender_datums[G.affecting.get_visible_gender()]
- visible_message(span_danger("[user] has forced [G.affecting] onto the spike, killing [T.him] instantly!"))
+ visible_message(span_danger("[user] has forced [G.affecting] onto the spike, killing [G.p_them()] instantly!"))
var/mob/M = G.affecting
M.forceMove(src)
qdel(G)
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 937034051c4..293718c552a 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -668,10 +668,9 @@
R.cell.charge -= 20
else
B.deductcharge(B.hitcost)
- var/datum/gender/TU = GLOB.gender_datums[user.get_visible_gender()]
user.visible_message( \
- span_danger("[user] was stunned by [TU.his] wet [O]!"), \
- span_userdanger("[user] was stunned by [TU.his] wet [O]!"))
+ span_danger("[user] was stunned by [user.p_their()] wet [O]!"), \
+ span_userdanger("[user] was stunned by [user.p_their()] wet [O]!"))
return 1
else if(istype(O, /obj/item/mop))
O.reagents.add_reagent(REAGENT_ID_WATER, 5)
diff --git a/code/modules/admin/verbs/change_appearance.dm b/code/modules/admin/verbs/change_appearance.dm
index 4569cf74792..4e32e498f3a 100644
--- a/code/modules/admin/verbs/change_appearance.dm
+++ b/code/modules/admin/verbs/change_appearance.dm
@@ -25,13 +25,12 @@
if(!H.client)
to_chat(usr, span_filter_warning(" Only mobs with clients can alter their own appearance."))
return
- var/datum/gender/T = GLOB.gender_datums[H.get_visible_gender()]
switch(tgui_alert(usr, "Do you wish for [H] to be allowed to select non-whitelisted races?","Alter Mob Appearance","Yes","No","Cancel"))
if("Yes")
- log_and_message_admins("has allowed [H] to change [T.his] appearance, without whitelisting of races.")
+ log_and_message_admins("has allowed [H] to change [H.p_their()] appearance, without whitelisting of races.")
H.change_appearance(APPEARANCE_ALL, H, check_species_whitelist = 0)
if("No")
- log_and_message_admins("has allowed [H] to change [T.his] appearance, with whitelisting of races.")
+ log_and_message_admins("has allowed [H] to change [H.p_their()] appearance, with whitelisting of races.")
H.change_appearance(APPEARANCE_ALL, H, check_species_whitelist = 1)
feedback_add_details("admin_verb","CMAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/artifice/cursedform.dm b/code/modules/artifice/cursedform.dm
index ca236f3794e..2fcbad5d4df 100644
--- a/code/modules/artifice/cursedform.dm
+++ b/code/modules/artifice/cursedform.dm
@@ -11,13 +11,12 @@
/obj/item/paper/carbon/cursedform/burnpaper(obj/item/flame/P, mob/user)
var/class = "warning"
- var/datum/gender/TU = GLOB.gender_datums[user.get_visible_gender()]
if(P.lit && !user.restrained())
if(istype(P, /obj/item/flame/lighter/zippo))
class = "rose"
- user.visible_message("[user] holds \the [P] up to \the [src], it looks like [TU.hes] trying to burn it!", \
+ user.visible_message("[user] holds \the [P] up to \the [src], it looks like [user.p_they()] [user.p_are()] trying to burn it!", \
"You hold \the [P] up to \the [src], burning it slowly.")
if(do_after(user, 2 SECONDS, target = src) && P.lit)
diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm
index 9b385944ae9..b479ac82792 100644
--- a/code/modules/assembly/mousetrap.dm
+++ b/code/modules/assembly/mousetrap.dm
@@ -58,7 +58,7 @@
if(!user.hand)
which_hand = BP_R_HAND
triggered(user, which_hand)
- user.visible_message(span_warning("[user] accidentally sets off [src], breaking their fingers."), \
+ user.visible_message(span_warning("[user] accidentally sets off [src], breaking [p_their()] fingers."), \
span_warning("You accidentally trigger [src]!"))
return
@@ -74,7 +74,7 @@
if(!user.hand)
which_hand = BP_R_HAND
triggered(user, which_hand)
- user.visible_message(span_warning("[user] accidentally sets off [src], breaking their fingers."), \
+ user.visible_message(span_warning("[user] accidentally sets off [src], breaking [p_their()] fingers."), \
span_warning("You accidentally trigger [src]!"))
return
..()
@@ -95,7 +95,7 @@
/obj/item/assembly/mousetrap/on_found(var/mob/living/finder)
if(armed)
- finder.visible_message(span_warning("[finder] accidentally sets off [src], breaking their fingers."), \
+ finder.visible_message(span_warning("[finder] accidentally sets off [src], breaking [p_their()] fingers."), \
span_warning("You accidentally trigger [src]!"))
triggered(finder, finder.hand ? BP_L_HAND : BP_R_HAND)
return 1 //end the search!
diff --git a/code/modules/clothing/spacesuits/rig/modules/specific/crusher_gauntlets.dm b/code/modules/clothing/spacesuits/rig/modules/specific/crusher_gauntlets.dm
index 462b5c817f0..71dbe1e53d6 100644
--- a/code/modules/clothing/spacesuits/rig/modules/specific/crusher_gauntlets.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/specific/crusher_gauntlets.dm
@@ -25,7 +25,6 @@
/obj/item/rig_module/gauntlets/activate()
..()
var/mob/living/M = holder.wearer
- var/datum/gender/TU = GLOB.gender_datums[M.get_visible_gender()]
if(M.l_hand && M.r_hand)
to_chat(M, span_danger("Your hands are full."))
@@ -33,7 +32,7 @@
return
if(M.a_intent == I_HURT)
M.visible_message(
- span_danger("[M] throws [TU.his] arms out, extending [stored_gauntlets] from \the [holder] with a click!"),
+ span_danger("[M] throws [M.p_their()] arms out, extending [stored_gauntlets] from \the [holder] with a click!"),
span_danger("You throw your arms out, extending [stored_gauntlets] from \the [holder] with a click!"),
span_notice("You hear a threatening hiss and a click.")
)
diff --git a/code/modules/emotes/emote_define.dm b/code/modules/emotes/emote_define.dm
index fcb8f1652a6..5704d3eec92 100644
--- a/code/modules/emotes/emote_define.dm
+++ b/code/modules/emotes/emote_define.dm
@@ -151,19 +151,17 @@
/decl/emote/proc/replace_target_tokens(var/msg, var/atom/target)
. = msg
if(istype(target))
- var/datum/gender/target_gender = GLOB.gender_datums[target.get_visible_gender()]
- . = replacetext(., "TARGET_THEM", target_gender.him)
- . = replacetext(., "TARGET_THEIR", target_gender.his)
- . = replacetext(., "TARGET_SELF", target_gender.himself)
+ . = replacetext(., "TARGET_THEM", target.p_them())
+ . = replacetext(., "TARGET_THEIR", target.p_their())
+ . = replacetext(., "TARGET_SELF", target.p_themselves())
. = replacetext(., "TARGET", span_bold("\the [target]"))
/decl/emote/proc/replace_user_tokens(var/msg, var/atom/user)
. = msg
if(istype(user))
- var/datum/gender/user_gender = GLOB.gender_datums[user.get_visible_gender()]
- . = replacetext(., "USER_THEM", user_gender.him)
- . = replacetext(., "USER_THEIR", user_gender.his)
- . = replacetext(., "USER_SELF", user_gender.himself)
+ . = replacetext(., "USER_THEM", user.p_them())
+ . = replacetext(., "USER_THEIR", user.p_their())
+ . = replacetext(., "USER_SELF", user.p_themselves())
. = replacetext(., "USER", span_bold("\the [user]"))
/decl/emote/proc/get_radio_message(var/atom/user)
diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm
index d91cc8cb35f..8b93faf1d53 100644
--- a/code/modules/games/cards.dm
+++ b/code/modules/games/cards.dm
@@ -269,8 +269,7 @@
H.concealed = 1
H.update_icon()
if(user==target)
- var/datum/gender/TU = GLOB.gender_datums[user.get_visible_gender()]
- user.visible_message(span_notice("\The [user] deals [dcard] card(s) to [TU.himself]."))
+ user.visible_message(span_notice("\The [user] deals [dcard] card(s) to [user.p_themselves()]."))
else
user.visible_message(span_notice("\The [user] deals [dcard] card(s) to \the [target]."))
H.throw_at(get_step(target,target.dir),10,1,H)
diff --git a/code/modules/genetics/side_effects.dm b/code/modules/genetics/side_effects.dm
index 02249672bc0..7776faaff8c 100644
--- a/code/modules/genetics/side_effects.dm
+++ b/code/modules/genetics/side_effects.dm
@@ -69,8 +69,7 @@
/datum/genetics/side_effect/confuse/start(mob/living/carbon/human/H)
..()
- var/datum/gender/T = GLOB.gender_datums[H.get_visible_gender()]
- H.automatic_custom_emote(VISIBLE_MESSAGE, "has drool running down from [T.his] mouth.", check_stat = TRUE)
+ H.automatic_custom_emote(VISIBLE_MESSAGE, "has drool running down from [H.p_their()] mouth.", check_stat = TRUE)
/datum/genetics/side_effect/confuse/finish(datum/weakref/WR)
if(..()) return
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index 7fde29f9a39..d274be1e4aa 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -176,9 +176,8 @@
dat += "7. Access the Forbidden Lore Vault
"
if(src.arcanecheckout)
new /obj/item/book/tome(src.loc)
- var/datum/gender/T = GLOB.gender_datums[user.get_visible_gender()]
to_chat(user, span_warning("Your sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is a dusty old tome sitting on the desk. You don't really remember printing it."))
- user.visible_message(span_infoplain(span_bold("\The [user]") + " stares at the blank screen for a few moments, [T.his] expression frozen in fear. When [T.he] finally awakens from it, [T.he] looks a lot older."), 2)
+ user.visible_message(span_infoplain(span_bold("\The [user]") + " stares at the blank screen for a few moments, [user.p_their()] expression frozen in fear. When [user.p_they()] finally awaken from it, [user.p_they()] look a lot older."), 2)
src.arcanecheckout = 0
if(1)
// Inventory
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 6eedd3bcc0c..bc5bde3a628 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -762,9 +762,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
)
toggle_ghost_visibility(TRUE)
else
- var/datum/gender/T = GLOB.gender_datums[user.get_visible_gender()]
user.visible_message ( \
- span_warning("\The [user] just tried to smash [T.his] book into that ghost! It's not very effective."), \
+ span_warning("\The [user] just tried to smash [user.p_their()] book into that ghost! It's not very effective."), \
span_warning("You get the feeling that the ghost can't become any more visible.") \
)
diff --git a/code/modules/mob/gender.dm b/code/modules/mob/gender.dm
deleted file mode 100644
index 3ca23531b1a..00000000000
--- a/code/modules/mob/gender.dm
+++ /dev/null
@@ -1,68 +0,0 @@
-
-GLOBAL_LIST_EMPTY(gender_datums)
-
-/hook/startup/proc/populate_gender_datum_list()
- for(var/type in typesof(/datum/gender))
- var/datum/gender/G = new type
- GLOB.gender_datums[G.key] = G
- return 1
-
-/datum/gender
- var/key = "plural"
-
- var/He = "They"
- var/he = "they"
- var/His = "Their"
- var/his = "their"
- var/him = "them"
- var/has = "have"
- var/is = "are"
- var/does = "do"
- var/himself = "themselves"
- var/s = ""
- var/hes = "they're"
-
-/datum/gender/male
- key = "male"
-
- He = "He"
- he = "he"
- His = "His"
- his = "his"
- him = "him"
- has = "has"
- is = "is"
- does = "does"
- himself = "himself"
- s = "s"
- hes = "he's"
-
-/datum/gender/female
- key = "female"
-
- He = "She"
- he = "she"
- His = "Her"
- his = "her"
- him = "her"
- has = "has"
- is = "is"
- does = "does"
- himself = "herself"
- s = "s"
- hes = "she's"
-
-/datum/gender/neuter
- key = "neuter"
-
- He = "It"
- he = "it"
- His = "Its"
- his = "its"
- him = "it"
- has = "has"
- is = "is"
- does = "does"
- himself = "itself"
- s = "s"
- hes = "it's"
diff --git a/code/modules/mob/gender_vr.dm b/code/modules/mob/gender_vr.dm
deleted file mode 100644
index 9b943f8796c..00000000000
--- a/code/modules/mob/gender_vr.dm
+++ /dev/null
@@ -1,14 +0,0 @@
-/datum/gender/herm
- key = "herm"
-
- He = "Shi"
- he = "shi"
- His = "Hir"
- his = "hir"
- him = "hir"
- has = "has"
- is = "is"
- does = "does"
- himself = "hirself"
- s = "s"
- hes = "shi's"
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 35da37ef65b..a017df4c257 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -179,9 +179,8 @@
if (health >= get_crit_point() || on_fire)
if(src == M && ishuman(src))
var/mob/living/carbon/human/H = src
- var/datum/gender/T = GLOB.gender_datums[H.get_visible_gender()]
visible_message( \
- span_notice("[src] examines [T.himself]."), \
+ span_notice("[src] examines [p_themselves()]."), \
span_notice("You check yourself for injuries.") \
)
@@ -260,23 +259,21 @@
var/show_ssd
var/mob/living/carbon/human/H = src
- var/datum/gender/T = GLOB.gender_datums[H.get_visible_gender()] // make sure to cast to human before using get_gender() or get_visible_gender()!
if(istype(H)) show_ssd = H.species.show_ssd
if(show_ssd && !client && !teleop)
- M.visible_message(span_notice("[M] shakes [src] trying to wake [T.him] up!"), \
- span_notice("You shake [src], but [T.he] [T.does] not respond... Maybe [T.he] [T.has] S.S.D?"))
+ M.visible_message(span_notice("[M] shakes [src] trying to wake [H.p_them()] up!"), \
+ span_notice("You shake [src], but [p_they()] [p_do()] not respond... Maybe [H.p_theyre()] S.S.D?"))
else if(lying || src.sleeping)
AdjustSleeping(-5)
if(src.sleeping == 0)
src.resting = 0
if(H) H.in_stasis = 0 //VOREStation Add - Just In Case
- M.visible_message(span_notice("[M] shakes [src] trying to wake [T.him] up!"), \
- span_notice("You shake [src] trying to wake [T.him] up!"))
+ M.visible_message(span_notice("[M] shakes [src] trying to wake [H.p_them()] up!"), \
+ span_notice("You shake [src] trying to wake [H.p_them()] up!"))
else
var/mob/living/carbon/human/hugger = M
- var/datum/gender/TM = GLOB.gender_datums[M.get_visible_gender()]
if(M.resting == 1) //Are they resting on the ground?
- M.visible_message(span_notice("[M] grabs onto [src] and pulls [TM.himself] up"), \
+ M.visible_message(span_notice("[M] grabs onto [src] and pulls [M.p_themselves()] up"), \
span_notice("You grip onto [src] and pull yourself up off the ground!"))
if(M.fire_stacks >= (src.fire_stacks + 3)) //Fire checks.
src.adjust_fire_stacks(1)
@@ -288,8 +285,8 @@
else if(istype(hugger))
hugger.species.hug(hugger,src)
else
- M.visible_message(span_notice("[M] hugs [src] to make [T.him] feel better!"), \
- span_notice("You hug [src] to make [T.him] feel better!"))
+ M.visible_message(span_notice("[M] hugs [src] to make [H.p_them()] feel better!"), \
+ span_notice("You hug [src] to make [H.p_them()] feel better!"))
if(M.fire_stacks >= (src.fire_stacks + 3))
src.adjust_fire_stacks(1)
M.adjust_fire_stacks(-1)
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 792b300b19e..a1b6685a2d7 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -348,14 +348,12 @@ var/list/_simple_mob_default_emotes = list(
set desc = "Sets a description which will be shown when someone examines you."
set category = "IC.Settings"
- var/datum/gender/T = GLOB.gender_datums[get_visible_gender()]
-
var/new_pose
var/quiet_pose = FALSE
var/include_icon = TRUE
var/list/pose_options = list()
- new_pose = strip_html_simple(tgui_input_text(src, "This is [src]. [T.he]...", "Pose", null))
+ new_pose = strip_html_simple(tgui_input_text(src, "This is [src]. [p_they()]...", "Pose", null))
if(!new_pose)
pose = null
remove_pose_indicator()
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 7bcc157e28f..e145fa60c7b 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -77,12 +77,6 @@
BP_L_LEG = skip_body & EXAMINE_SKIPLEGS,
BP_R_LEG = skip_body & EXAMINE_SKIPLEGS)
- var/gender_hidden = (skip_gear & EXAMINE_SKIPJUMPSUIT) && (skip_body & EXAMINE_SKIPFACE)
- var/gender_key = get_visible_gender(user, gender_hidden)
- var/datum/gender/T = GLOB.gender_datums[gender_key]
- if (!T)
- CRASH({"Null gender datum on examine: mob="[src]",hidden="[gender_hidden]",key="[gender_key]",bio="[gender]",id="[identifying_gender]""})
-
var/name_ender = ""
if(!((skip_gear & EXAMINE_SKIPJUMPSUIT) && (skip_body & EXAMINE_SKIPFACE)))
if(custom_species)
@@ -121,16 +115,16 @@
tie_msg += " [lowertext(english_list(accessory_descs))]."
if(w_uniform.forensic_data?.has_blooddna())
- msg += span_warning("[T.He] [T.is] wearing [icon2html(w_uniform,user.client)] [w_uniform.gender==PLURAL?"some":"a"] [(w_uniform.blood_color != "#030303") ? "blood" : "oil"]-stained [w_uniform.name]![tie_msg]")
+ msg += span_warning("[user.p_Theyre()] wearing [icon2html(w_uniform,user.client)] [w_uniform.gender==PLURAL?"some":"a"] [(w_uniform.blood_color != "#030303") ? "blood" : "oil"]-stained [w_uniform.name]![tie_msg]")
else
- msg += "[T.He] [T.is] wearing [icon2html(w_uniform,user.client)] \a [w_uniform].[tie_msg]"
+ msg += "[user.p_Theyre()] wearing [icon2html(w_uniform,user.client)] \a [w_uniform].[tie_msg]"
//head
if(head && !(skip_gear & EXAMINE_SKIPHELMET) && head.show_examine)
if(head.forensic_data?.has_blooddna())
- msg += span_warning("[T.He] [T.is] wearing [icon2html(head,user.client)] [head.gender==PLURAL?"some":"a"] [(head.blood_color != "#030303") ? "blood" : "oil"]-stained [head.name] on [T.his] head!")
+ msg += span_warning("[user.p_Theyre()] wearing [icon2html(head,user.client)] [head.gender==PLURAL?"some":"a"] [(head.blood_color != "#030303") ? "blood" : "oil"]-stained [head.name] on [user.p_their()] head!")
else
- msg += "[T.He] [T.is] wearing [icon2html(head,user.client)] \a [head] on [T.his] head."
+ msg += "[user.p_Theyre()] wearing [icon2html(head,user.client)] \a [head] on [user.p_their()] head."
//suit/armour
if(wear_suit)
@@ -145,37 +139,37 @@
tie_msg += " [lowertext(english_list(accessory_descs))]."
if(wear_suit.forensic_data?.has_blooddna())
- msg += span_warning("[T.He] [T.is] wearing [icon2html(wear_suit,user.client)] [wear_suit.gender==PLURAL?"some":"a"] [(wear_suit.blood_color != "#030303") ? "blood" : "oil"]-stained [wear_suit.name]![tie_msg]")
+ msg += span_warning("[user.p_Theyre()] wearing [icon2html(wear_suit,user.client)] [wear_suit.gender==PLURAL?"some":"a"] [(wear_suit.blood_color != "#030303") ? "blood" : "oil"]-stained [wear_suit.name]![tie_msg]")
else
- msg += "[T.He] [T.is] wearing [icon2html(wear_suit,user.client)] \a [wear_suit].[tie_msg]"
+ msg += "[user.p_Theyre()] wearing [icon2html(wear_suit,user.client)] \a [wear_suit].[tie_msg]"
//suit/armour storage
if(s_store && !(skip_gear & EXAMINE_SKIPSUITSTORAGE) && s_store.show_examine)
if(s_store.forensic_data?.has_blooddna())
- msg += span_warning("[T.He] [T.is] carrying [icon2html(s_store,user.client)] [s_store.gender==PLURAL?"some":"a"] [(s_store.blood_color != "#030303") ? "blood" : "oil"]-stained [s_store.name] on [T.his] [wear_suit.name]!")
+ msg += span_warning("[user.p_Theyre()] carrying [icon2html(s_store,user.client)] [s_store.gender==PLURAL?"some":"a"] [(s_store.blood_color != "#030303") ? "blood" : "oil"]-stained [s_store.name] on [user.p_their()] [wear_suit.name]!")
else
- msg += "[T.He] [T.is] carrying [icon2html(s_store,user.client)] \a [s_store] on [T.his] [wear_suit.name]."
+ msg += "[user.p_Theyre()] carrying [icon2html(s_store,user.client)] \a [s_store] on [user.p_their()] [wear_suit.name]."
//back
if(back && !(skip_gear & EXAMINE_SKIPBACKPACK) && back.show_examine)
if(back.forensic_data?.has_blooddna())
- msg += span_warning("[T.He] [T.has] [icon2html(back,user.client)] [back.gender==PLURAL?"some":"a"] [(back.blood_color != "#030303") ? "blood" : "oil"]-stained [back] on [T.his] back.")
+ msg += span_warning("[user.p_Theyve()] [icon2html(back,user.client)] [back.gender==PLURAL?"some":"a"] [(back.blood_color != "#030303") ? "blood" : "oil"]-stained [back] on [user.p_their()] back.")
else
- msg += "[T.He] [T.has] [icon2html(back,user.client)] \a [back] on [T.his] back."
+ msg += "[user.p_Theyve()] [icon2html(back,user.client)] \a [back] on [user.p_their()] back."
//left hand
if(l_hand && l_hand.show_examine)
if(l_hand.forensic_data?.has_blooddna())
- msg += span_warning("[T.He] [T.is] holding [icon2html(l_hand,user.client)] [l_hand.gender==PLURAL?"some":"a"] [(l_hand.blood_color != "#030303") ? "blood" : "oil"]-stained [l_hand.name] in [T.his] left hand!")
+ msg += span_warning("[user.p_Theyre()] holding [icon2html(l_hand,user.client)] [l_hand.gender==PLURAL?"some":"a"] [(l_hand.blood_color != "#030303") ? "blood" : "oil"]-stained [l_hand.name] in [user.p_their()] left hand!")
else
- msg += "[T.He] [T.is] holding [icon2html(l_hand,user.client)] \a [l_hand] in [T.his] left hand."
+ msg += "[user.p_Theyre()] holding [icon2html(l_hand,user.client)] \a [l_hand] in [user.p_their()] left hand."
//right hand
if(r_hand && r_hand.show_examine)
if(r_hand.forensic_data?.has_blooddna())
- msg += span_warning("[T.He] [T.is] holding [icon2html(r_hand,user.client)] [r_hand.gender==PLURAL?"some":"a"] [(r_hand.blood_color != "#030303") ? "blood" : "oil"]-stained [r_hand.name] in [T.his] right hand!")
+ msg += span_warning("[user.p_Theyre()] holding [icon2html(r_hand,user.client)] [r_hand.gender==PLURAL?"some":"a"] [(r_hand.blood_color != "#030303") ? "blood" : "oil"]-stained [r_hand.name] in [user.p_their()] right hand!")
else
- msg += "[T.He] [T.is] holding [icon2html(r_hand,user.client)] \a [r_hand] in [T.his] right hand."
+ msg += "[user.p_Theyre()] holding [icon2html(r_hand,user.client)] \a [r_hand] in [user.p_their()] right hand."
//gloves
if(gloves && !(skip_gear & EXAMINE_SKIPGLOVES) && gloves.show_examine)
@@ -190,88 +184,88 @@
gloves_acc_msg += " [lowertext(english_list(accessory_descs))]."
if(gloves.forensic_data?.has_blooddna())
- msg += span_warning("[T.He] [T.has] [icon2html(gloves,user.client)] [gloves.gender==PLURAL?"some":"a"] [(gloves.blood_color != "#030303") ? "blood" : "oil"]-stained [gloves.name] on [T.his] hands![gloves_acc_msg]")
+ msg += span_warning("[user.p_Theyve()] [icon2html(gloves,user.client)] [gloves.gender==PLURAL?"some":"a"] [(gloves.blood_color != "#030303") ? "blood" : "oil"]-stained [gloves.name] on [user.p_their()] hands![gloves_acc_msg]")
else
- msg += "[T.He] [T.has] [icon2html(gloves,user.client)] \a [gloves] on [T.his] hands.[gloves_acc_msg]"
+ msg += "[user.p_Theyve()] [icon2html(gloves,user.client)] \a [gloves] on [user.p_their()] hands.[gloves_acc_msg]"
else if(forensic_data?.has_blooddna() && !(skip_body & EXAMINE_SKIPHANDS))
- msg += span_warning("[T.He] [T.has] [(hand_blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained hands!")
+ msg += span_warning("[user.p_Theyve()] [(hand_blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained hands!")
//handcuffed?
if(handcuffed && handcuffed.show_examine)
if(istype(handcuffed, /obj/item/handcuffs/cable))
- msg += span_warning("[T.He] [T.is] [icon2html(handcuffed,user.client)] restrained with cable!")
+ msg += span_warning("[user.p_Theyre()] [icon2html(handcuffed,user.client)] restrained with cable!")
else
- msg += span_warning("[T.He] [T.is] [icon2html(handcuffed,user.client)] handcuffed!")
+ msg += span_warning("[user.p_Theyre()] [icon2html(handcuffed,user.client)] handcuffed!")
//buckled
if(buckled)
- msg += span_warning("[T.He] [T.is] [icon2html(buckled,user.client)] buckled to [buckled]!")
+ msg += span_warning("[user.p_Theyre()] [icon2html(buckled,user.client)] buckled to [buckled]!")
//belt
if(belt && !(skip_gear & EXAMINE_SKIPBELT) && belt.show_examine)
if(belt.forensic_data?.has_blooddna())
- msg += span_warning("[T.He] [T.has] [icon2html(belt,user.client)] [belt.gender==PLURAL?"some":"a"] [(belt.blood_color != "#030303") ? "blood" : "oil"]-stained [belt.name] about [T.his] waist!")
+ msg += span_warning("[user.p_Theyve()] [icon2html(belt,user.client)] [belt.gender==PLURAL?"some":"a"] [(belt.blood_color != "#030303") ? "blood" : "oil"]-stained [belt.name] about [user.p_their()] waist!")
else
- msg += "[T.He] [T.has] [icon2html(belt,user.client)] \a [belt] about [T.his] waist."
+ msg += "[user.p_Theyve()] [icon2html(belt,user.client)] \a [belt] about [user.p_their()] waist."
//shoes
if(shoes && !(skip_gear & EXAMINE_SKIPSHOES) && shoes.show_examine)
if(shoes.forensic_data?.has_blooddna())
- msg += span_warning("[T.He] [T.is] wearing [icon2html(shoes,user.client)] [shoes.gender==PLURAL?"some":"a"] [(shoes.blood_color != "#030303") ? "blood" : "oil"]-stained [shoes.name] on [T.his] feet!")
+ msg += span_warning("[user.p_Theyre()] wearing [icon2html(shoes,user.client)] [shoes.gender==PLURAL?"some":"a"] [(shoes.blood_color != "#030303") ? "blood" : "oil"]-stained [shoes.name] on [user.p_their()] feet!")
else
- msg += "[T.He] [T.is] wearing [icon2html(shoes,user.client)] \a [shoes] on [T.his] feet."
+ msg += "[user.p_Theyre()] wearing [icon2html(shoes,user.client)] \a [shoes] on [user.p_their()] feet."
else if(feet_blood_DNA && !(skip_body & EXAMINE_SKIPHANDS))
- msg += span_warning("[T.He] [T.has] [(feet_blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained feet!")
+ msg += span_warning("[user.p_Theyve()] [(feet_blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained feet!")
//mask
if(wear_mask && !(skip_gear & EXAMINE_SKIPMASK) && wear_mask.show_examine)
- var/descriptor = "on [T.his] face"
+ var/descriptor = "on [user.p_their()] face"
if(istype(wear_mask, /obj/item/grenade) && check_has_mouth())
- descriptor = "in [T.his] mouth"
+ descriptor = "in [user.p_their()] mouth"
if(wear_mask.forensic_data?.has_blooddna())
- msg += span_warning("[T.He] [T.has] [icon2html(wear_mask,user.client)] [wear_mask.gender==PLURAL?"some":"a"] [(wear_mask.blood_color != "#030303") ? "blood" : "oil"]-stained [wear_mask.name] [descriptor]!")
+ msg += span_warning("[user.p_Theyve()] [icon2html(wear_mask,user.client)] [wear_mask.gender==PLURAL?"some":"a"] [(wear_mask.blood_color != "#030303") ? "blood" : "oil"]-stained [wear_mask.name] [descriptor]!")
else
- msg += "[T.He] [T.has] [icon2html(wear_mask,user.client)] \a [wear_mask] [descriptor]."
+ msg += "[user.p_Theyve()] [icon2html(wear_mask,user.client)] \a [wear_mask] [descriptor]."
//eyes
if(glasses && !(skip_gear & EXAMINE_SKIPEYEWEAR) && glasses.show_examine)
if(glasses.forensic_data?.has_blooddna())
- msg += span_warning("[T.He] [T.has] [icon2html(glasses,user.client)] [glasses.gender==PLURAL?"some":"a"] [(glasses.blood_color != "#030303") ? "blood" : "oil"]-stained [glasses] covering [T.his] eyes!")
+ msg += span_warning("[user.p_Theyve()] [icon2html(glasses,user.client)] [glasses.gender==PLURAL?"some":"a"] [(glasses.blood_color != "#030303") ? "blood" : "oil"]-stained [glasses] covering [user.p_their()] eyes!")
else
- msg += "[T.He] [T.has] [icon2html(glasses,user.client)] \a [glasses] covering [T.his] eyes."
+ msg += "[user.p_Theyve()] [icon2html(glasses,user.client)] \a [glasses] covering [user.p_their()] eyes."
//left ear
if(l_ear && !(skip_gear & EXAMINE_SKIPEARS) && l_ear.show_examine)
- msg += "[T.He] [T.has] [icon2html(l_ear,user.client)] \a [l_ear] on [T.his] left ear."
+ msg += "[user.p_Theyve()] [icon2html(l_ear,user.client)] \a [l_ear] on [user.p_their()] left ear."
//right ear
if(r_ear && !(skip_gear & EXAMINE_SKIPEARS) && r_ear.show_examine)
- msg += "[T.He] [T.has] [icon2html(r_ear,user.client)] \a [r_ear] on [T.his] right ear."
+ msg += "[user.p_Theyve()] [icon2html(r_ear,user.client)] \a [r_ear] on [user.p_their()] right ear."
//ID
if(wear_id && wear_id.show_examine)
- msg += "[T.He] [T.is] wearing [icon2html(wear_id,user.client)]\a [wear_id]."
+ msg += "[user.p_Theyre()] wearing [icon2html(wear_id,user.client)]\a [wear_id]."
//Jitters
var/jitter = get_jittery()
if(jitter)
if(jitter >= 300)
- msg += span_boldwarning("[T.He] [T.is] convulsing violently!")
+ msg += span_boldwarning("[user.p_Theyre()] convulsing violently!")
else if(jitter >= 200)
- msg += span_warning("[T.He] [T.is] extremely jittery.")
+ msg += span_warning("[user.p_Theyre()] extremely jittery.")
else if(jitter >= 100)
- msg += span_warning("[T.He] [T.is] twitching ever so slightly.")
+ msg += span_warning("[user.p_Theyre()] twitching ever so slightly.")
//splints
for(var/organ in BP_ALL)
var/obj/item/organ/external/o = get_organ(organ)
if(o && o.splinted && o.splinted.loc == o)
- msg += span_warning("[T.He] [T.has] \a [o.splinted] on [T.his] [o.name]!")
+ msg += span_warning("[user.p_Theyve()] \a [o.splinted] on [user.p_their()] [o.name]!")
if(suiciding)
- msg += span_warning("[T.He] appears to have commited suicide... there is no hope of recovery.")
+ msg += span_warning("[user.p_They()] appears to have commited suicide... there is no hope of recovery.")
var/list/vorestrings = list()
vorestrings += examine_weight()
@@ -281,39 +275,39 @@
vorestrings += examine_step_size()
vorestrings += examine_nif()
vorestrings += examine_chimera()
- vorestrings += examine_body_writing(hidden, T)
+ vorestrings += examine_body_writing(hidden)
for(var/entry in vorestrings)
if(entry == "" || entry == null)
vorestrings -= entry
msg += vorestrings
if(mSmallsize in mutations)
- msg += "[T.He] [T.is] very short!"
+ msg += "[user.p_Theyre()] very short!"
if (src.stat)
- msg += span_warning("[T.He] [T.is]n't responding to anything around [T.him] and seems to be asleep.")
+ msg += span_warning("[user.p_Theyre()]n't responding to anything around [user.p_they()] and seems to be asleep.")
if((stat == 2 || src.losebreath) && get_dist(user, src) <= 3)
- msg += span_warning("[T.He] [T.does] not appear to be breathing.")
+ msg += span_warning("[user.p_They()] [user.p_do()] not appear to be breathing.")
if(ishuman(user) && !user.stat && Adjacent(user))
user.visible_message(span_infoplain(span_bold("[user]") + " checks [src]'s pulse."), span_infoplain("You check [src]'s pulse."))
spawn(15)
if(isobserver(user) || (Adjacent(user) && !user.stat)) // If you're a corpse then you can't exactly check their pulse, but ghosts can see anything
if(pulse == PULSE_NONE)
- to_chat(user, span_deadsay("[T.He] [T.has] no pulse[src.client ? "" : " and [T.his] soul has departed"]..."))
+ to_chat(user, span_deadsay("[user.p_Theyve()] no pulse[src.client ? "" : " and [user.p_their()] soul has departed"]..."))
else
- to_chat(user, span_deadsay("[T.He] [T.has] a pulse!"))
+ to_chat(user, span_deadsay("[user.p_Theyve()] a pulse!"))
if(fire_stacks)
- msg += "[T.He] [T.is] covered in some liquid."
+ msg += "[user.p_Theyre()] covered in some liquid."
if(on_fire)
- msg += span_warning("[T.He] [T.is] on fire!.")
+ msg += span_warning("[user.p_Theyre()] on fire!.")
var/ssd_msg = species.get_ssd(src)
if(ssd_msg && (!should_have_organ(O_BRAIN) || has_brain()) && stat != DEAD)
if(!key)
- msg += span_deadsay("[T.He] [T.is] [ssd_msg]. It doesn't look like [T.he] [T.is] waking up anytime soon.")
+ msg += span_deadsay("[user.p_Theyre()] [ssd_msg]. It doesn't look like [user.p_theyre()] waking up anytime soon.")
else if(!client)
- msg += span_deadsay("[T.He] [T.is] [ssd_msg].")
+ msg += span_deadsay("[user.p_Theyre()] [ssd_msg].")
if(client && away_from_keyboard && manual_afk)
msg += "\[Away From Keyboard for [round((client.inactivity/10)/60)] minutes\]"
else if(client && ((client.inactivity / 10) / 60 > 10)) //10 Minutes
@@ -332,9 +326,9 @@
var/obj/item/organ/external/E = organs_by_name[organ_tag]
if(!E)
- wound_flavor_text["[organ_descriptor]"] = span_boldwarning("[T.He] [T.is] missing [T.his] [organ_descriptor].")
+ wound_flavor_text["[organ_descriptor]"] = span_boldwarning("[user.p_Theyre()] missing [user.p_their()] [organ_descriptor].")
else if(E.is_stump())
- wound_flavor_text["[organ_descriptor]"] = span_boldwarning("[T.He] [T.has] a stump where [T.his] [organ_descriptor] should be.")
+ wound_flavor_text["[organ_descriptor]"] = span_boldwarning("[user.p_Theyve()] a stump where [user.p_their()] [organ_descriptor] should be.")
else
continue
@@ -343,38 +337,38 @@
if((temp.organ_tag in hidden) && hidden[temp.organ_tag])
continue //Organ is hidden, don't talk about it
if(temp.status & ORGAN_DESTROYED)
- wound_flavor_text["[temp.name]"] = span_boldwarning("[T.He] [T.is] missing [T.his] [temp.name].")
+ wound_flavor_text["[temp.name]"] = span_boldwarning("[user.p_Theyre()] missing [user.p_their()] [temp.name].")
continue
if(!looks_synth && temp.robotic == ORGAN_ROBOT)
if(!(temp.brute_dam + temp.burn_dam))
- wound_flavor_text["[temp.name]"] = "[T.He] [T.has] a [temp.name]."
+ wound_flavor_text["[temp.name]"] = "[user.p_Theyve()] a [temp.name]."
else
- wound_flavor_text["[temp.name]"] = span_warning("[T.He] [T.has] a [temp.name] with [temp.get_wounds_desc()]!")
+ wound_flavor_text["[temp.name]"] = span_warning("[user.p_Theyve()] a [temp.name] with [temp.get_wounds_desc()]!")
continue
else if(temp.wounds.len > 0 || temp.open)
if(temp.is_stump() && temp.parent_organ && organs_by_name[temp.parent_organ])
var/obj/item/organ/external/parent = organs_by_name[temp.parent_organ]
- wound_flavor_text["[temp.name]"] = span_warning("[T.He] [T.has] [temp.get_wounds_desc()] on [T.his] [parent.name].")
+ wound_flavor_text["[temp.name]"] = span_warning("[user.p_Theyve()] [temp.get_wounds_desc()] on [user.p_their()] [parent.name].")
else
- wound_flavor_text["[temp.name]"] = span_warning("[T.He] [T.has] [temp.get_wounds_desc()] on [T.his] [temp.name].")
+ wound_flavor_text["[temp.name]"] = span_warning("[user.p_Theyve()] [temp.get_wounds_desc()] on [user.p_their()] [temp.name].")
else
wound_flavor_text["[temp.name]"] = ""
if(temp.dislocated == 1)
- wound_flavor_text["[temp.name]"] += span_warning("[T.His] [temp.joint] is dislocated!")
+ wound_flavor_text["[temp.name]"] += span_warning("[user.p_Their()] [temp.joint] is dislocated!")
if(temp.brute_dam > temp.min_broken_damage || (temp.status & (ORGAN_BROKEN | ORGAN_MUTATED)))
- wound_flavor_text["[temp.name]"] += span_warning("[T.His] [temp.name] is dented and swollen!")
+ wound_flavor_text["[temp.name]"] += span_warning("[user.p_Their()] [temp.name] is dented and swollen!")
if(temp.germ_level > INFECTION_LEVEL_TWO && !(temp.status & ORGAN_DEAD))
- wound_flavor_text["[temp.name]"] += span_warning("[T.His] [temp.name] looks very infected!")
+ wound_flavor_text["[temp.name]"] += span_warning("[user.p_Their()] [temp.name] looks very infected!")
else if(temp.status & ORGAN_DEAD)
- wound_flavor_text["[temp.name]"] += span_warning("[T.His] [temp.name] looks rotten!")
+ wound_flavor_text["[temp.name]"] += span_warning("[user.p_Their()] [temp.name] looks rotten!")
if(temp.status & ORGAN_BLEEDING)
- is_bleeding["[temp.name]"] += span_danger("[T.His] [temp.name] is bleeding!")
+ is_bleeding["[temp.name]"] += span_danger("[user.p_Their()] [temp.name] is bleeding!")
if(temp.applied_pressure == src)
- applying_pressure = span_info("[T.He] is applying pressure to [T.his] [temp.name].")
+ applying_pressure = span_info("[user.p_They()] is applying pressure to [user.p_their()] [temp.name].")
for(var/limb in wound_flavor_text)
var/flavor = wound_flavor_text[limb]
@@ -385,9 +379,9 @@
if(blood)
msg += blood
for(var/implant in get_visible_implants(0))
- msg += span_danger("[src] [T.has] \a [implant] sticking out of [T.his] flesh!")
+ msg += span_danger("[src] [user.p_have()] \a [implant] sticking out of [user.p_their()] flesh!")
if(digitalcamo)
- msg += "[T.He] [T.is] repulsively uncanny!"
+ msg += "[user.p_Theyre()] repulsively uncanny!"
if(hasHUD(user,"security"))
var/perpname = name
@@ -449,7 +443,7 @@
if(pose)
if(!findtext(pose, regex("\[.?!]$"))) // Will be zero if the last character is not a member of [.?!]
pose = addtext(pose,".") //Makes sure all emotes end with a period.
- msg += "
[T.He] [pose]" //
intentional, extra gap.
+ msg += "
[user.p_They()] [pose]" //
intentional, extra gap.
return msg
diff --git a/code/modules/mob/living/carbon/human/examine_vr.dm b/code/modules/mob/living/carbon/human/examine_vr.dm
index be0fe05ed0d..edeedaab133 100644
--- a/code/modules/mob/living/carbon/human/examine_vr.dm
+++ b/code/modules/mob/living/carbon/human/examine_vr.dm
@@ -139,7 +139,7 @@
else if(xc.feral)
return span_warning("[t_He] [t_has] a crazed, wild look in [t_his] eyes!")
-/mob/living/carbon/human/proc/examine_body_writing(list/hidden, datum/gender/G)
+/mob/living/carbon/human/proc/examine_body_writing(list/hidden)
. = list()
for(var/bodypart in hidden)
@@ -154,4 +154,4 @@
LAZYREMOVE(body_writing, bodypart)
continue
- . += span_notice("[G.He] [G.has] \"[writing]\" written on [G.his] [parse_zone(bodypart)].")
+ . += span_notice("[p_They()] [p_have()] \"[writing]\" written on [p_their()] [parse_zone(bodypart)].")
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index bfef0a1be54..5ecd2261bab 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -866,8 +866,7 @@
/mob/living/carbon/human/proc/play_xylophone()
if(!src.xylophone)
- var/datum/gender/T = GLOB.gender_datums[get_visible_gender()]
- visible_message(span_filter_notice("[span_red("\The [src] begins playing [T.his] ribcage like a xylophone. It's quite spooky.")]"),span_notice("You begin to play a spooky refrain on your ribcage."),span_filter_notice("[span_red("You hear a spooky xylophone melody.")]"))
+ visible_message(span_filter_notice("[span_red("\The [src] begins playing [p_their()] ribcage like a xylophone. It's quite spooky.")]"),span_notice("You begin to play a spooky refrain on your ribcage."),span_filter_notice("[span_red("You hear a spooky xylophone melody.")]"))
var/song = pick('sound/effects/xylophone1.ogg','sound/effects/xylophone2.ogg','sound/effects/xylophone3.ogg')
playsound(src, song, 50, 1, -1)
xylophone = 1
@@ -955,8 +954,7 @@
gender = NEUTER
regenerate_icons()
check_dna()
- var/datum/gender/T = GLOB.gender_datums[get_visible_gender()]
- visible_message(span_notice("\The [src] morphs and changes [T.his] appearance!"), span_notice("You change your appearance!"), span_filter_notice("[span_red("Oh, god! What the hell was that? It sounded like flesh getting squished and bone ground into a different shape!")]"))
+ visible_message(span_notice("\The [src] morphs and changes [p_their()] appearance!"), span_notice("You change your appearance!"), span_filter_notice("[span_red("Oh, god! What the hell was that? It sounded like flesh getting squished and bone ground into a different shape!")]"))
/mob/living/carbon/human/proc/remotesay()
set name = "Project mind"
@@ -1211,16 +1209,13 @@
if(usr.stat || usr.restrained() || !isliving(usr)) return
- var/datum/gender/TU = GLOB.gender_datums[usr.get_visible_gender()]
- var/datum/gender/T = GLOB.gender_datums[get_visible_gender()]
-
if(usr == src)
self = 1
if(!self)
- usr.visible_message(span_notice("[usr] kneels down, puts [TU.his] hand on [src]'s wrist and begins counting [T.his] pulse."),\
+ usr.visible_message(span_notice("[usr] kneels down, puts [usr.p_their()] hand on [src]'s wrist and begins counting [p_their()] pulse."),\
span_filter_notice("You begin counting [src]'s pulse."))
else
- usr.visible_message(span_notice("[usr] begins counting [T.his] pulse."),\
+ usr.visible_message(span_notice("[usr] begins counting [p_their()] pulse."),\
span_filter_notice("You begin counting your pulse."))
if(src.pulse)
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 2f57d1c8b33..1c6ad2a0260 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -33,7 +33,6 @@
return null
/mob/living/carbon/human/attack_hand(mob/living/M as mob)
- var/datum/gender/TT = GLOB.gender_datums[M.get_visible_gender()]
var/mob/living/carbon/human/H = M
if(is_incorporeal())
@@ -84,19 +83,18 @@
// H = THE PERSON DOING THE ATTACK, BUT DEFINED AS A HUMAN. (This is for human specific interactions, such as CPR.)
// M = THE PERSON DOING THE ATTACK, AGAIN, DEFINED AS A MOB
// src = THE PERSON BEING ATTACKED
- // TT = GENDER OF THE TARGET
// has_hands = Local variable. If the attacker has hands or not.
if(I_HELP)
- attack_hand_help_intent(H, M, TT, has_hands)
+ attack_hand_help_intent(H, M, M, has_hands)
if(I_GRAB)
- attack_hand_grab_intent(H, M, TT, has_hands)
+ attack_hand_grab_intent(H, M, has_hands)
if(I_HURT)
- attack_hand_harm_intent(H, M, TT, has_hands)
+ attack_hand_harm_intent(H, M, has_hands)
if(I_DISARM)
- attack_hand_disarm_intent(H, M, TT, has_hands)
+ attack_hand_disarm_intent(H, M, has_hands)
return
@@ -105,7 +103,7 @@
/// This condenses them and makes it less of a cluster.
///Help Intent
-/mob/living/carbon/human/proc/attack_hand_help_intent(var/mob/living/carbon/human/H, var/mob/living/M as mob, var/datum/gender/TT, var/has_hands)
+/mob/living/carbon/human/proc/attack_hand_help_intent(var/mob/living/carbon/human/H, var/mob/living/M as mob, var/has_hands)
PRIVATE_PROC(TRUE)
SHOULD_NOT_OVERRIDE(TRUE)
if(M.restrained()) //If we're restrained, we can't help them. If you want to add snowflake stuff that you can do while restrained, add it here.
@@ -151,7 +149,7 @@
return TRUE
//Disarm Intent
-/mob/living/carbon/human/proc/attack_hand_disarm_intent(var/mob/living/carbon/human/H, var/mob/living/M as mob, var/datum/gender/TT, var/has_hands)
+/mob/living/carbon/human/proc/attack_hand_disarm_intent(var/mob/living/carbon/human/H, var/mob/living/M as mob, var/has_hands)
PRIVATE_PROC(TRUE)
SHOULD_NOT_OVERRIDE(TRUE)
if(M.restrained()) //If we're restrained, we can't disarm them. If you want to add snowflake stuff that you can do while restrained, add it here.
@@ -235,7 +233,7 @@
else
visible_message(span_filter_combat("[span_red(span_bold("[M] attempted to disarm [src]!"))]"))
//Grab Intent
-/mob/living/carbon/human/proc/attack_hand_grab_intent(var/mob/living/carbon/human/H, var/mob/living/M as mob, var/datum/gender/TT, var/has_hands)
+/mob/living/carbon/human/proc/attack_hand_grab_intent(var/mob/living/carbon/human/H, var/mob/living/M as mob, var/has_hands)
PRIVATE_PROC(TRUE)
SHOULD_NOT_OVERRIDE(TRUE)
if(M.restrained()) //If we're restrained, we can't grab them. If you want to add snowflake stuff that you can do while restrained, add it here.
@@ -252,7 +250,7 @@
w_uniform.add_fingerprint(M)
if(buckled)
- to_chat(M, span_notice("You cannot grab [src], [TT.he] is buckled in!"))
+ to_chat(M, span_notice("You cannot grab [src], [M.p_theyre()] buckled in!"))
return
var/obj/item/grab/G = new /obj/item/grab(M, src) //If this is put before the buckled check, the user will be perma-slowed due to a grab existing in nullspace.
if(!G) //the grab will delete itself in New if affecting is anchored
@@ -265,7 +263,7 @@
playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
visible_message(span_warning("[M] has grabbed [src] [(M.zone_sel.selecting == BP_L_HAND || M.zone_sel.selecting == BP_R_HAND)? "by [(gender==FEMALE)? "her" : ((gender==MALE)? "his": "their")] hands": "passively"]!"))
//Harm Intent
-/mob/living/carbon/human/proc/attack_hand_harm_intent(var/mob/living/carbon/human/H, var/mob/living/M as mob, var/datum/gender/TT, var/has_hands)
+/mob/living/carbon/human/proc/attack_hand_harm_intent(var/mob/living/carbon/human/H, var/mob/living/M as mob, var/has_hands)
PRIVATE_PROC(TRUE)
SHOULD_NOT_OVERRIDE(TRUE)
//As a note: This intentionally doesn't immediately return if has_hands is false. This is because you can attack with kicks/bites!
@@ -350,7 +348,7 @@
if(!src.lying)
attack_message = "[H] attempted to strike [src], but missed!"
else
- attack_message = "[H] attempted to strike [src], but [TT.he] rolled out of the way!"
+ attack_message = "[H] attempted to strike [src], but [M.p_they()] rolled out of the way!"
src.set_dir(pick(GLOB.cardinal))
miss_type = 1
@@ -504,10 +502,8 @@
to_chat(user,message)
return FALSE
- var/datum/gender/TU = GLOB.gender_datums[user.get_visible_gender()]
-
if(user == src)
- user.visible_message(span_filter_notice("\The [user] starts applying pressure to [TU.his] [organ.name]!"), span_filter_notice("You start applying pressure to your [organ.name]!"))
+ user.visible_message(span_filter_notice("\The [user] starts applying pressure to [user.p_their()] [organ.name]!"), span_filter_notice("You start applying pressure to your [organ.name]!"))
else
user.visible_message(span_filter_notice("\The [user] starts applying pressure to [src]'s [organ.name]!"), span_filter_notice("You start applying pressure to [src]'s [organ.name]!"))
spawn(0)
@@ -519,7 +515,7 @@
organ.applied_pressure = null
if(user == src)
- user.visible_message(span_filter_notice("\The [user] stops applying pressure to [TU.his] [organ.name]!"), span_filter_notice("You stop applying pressure to your [organ]!"))
+ user.visible_message(span_filter_notice("\The [user] stops applying pressure to [user.p_their()] [organ.name]!"), span_filter_notice("You stop applying pressure to your [organ]!"))
else
user.visible_message(span_filter_notice("\The [user] stops applying pressure to [src]'s [organ.name]!"), span_filter_notice("You stop applying pressure to [src]'s [organ.name]!"))
diff --git a/code/modules/mob/living/carbon/human/human_modular_limbs.dm b/code/modules/mob/living/carbon/human/human_modular_limbs.dm
index 169569ad469..e6f294ba5be 100644
--- a/code/modules/mob/living/carbon/human/human_modular_limbs.dm
+++ b/code/modules/mob/living/carbon/human/human_modular_limbs.dm
@@ -167,9 +167,8 @@
for(var/obj/item/organ/external/child in E.children)
child.status &= ~ORGAN_CUT_AWAY
- var/datum/gender/G = GLOB.gender_datums[gender]
visible_message(
- span_notice("\The [src] attaches \the [E] to [G.his] body!"),
+ span_notice("\The [src] attaches \the [E] to [p_their()] body!"),
span_notice("You attach \the [E] to your body!"))
regenerate_icons() // Not sure why this isn't called by removed(), but without it we don't update our limb appearance.
return TRUE
@@ -195,8 +194,7 @@
E.removed(src)
E.dropInto(loc)
put_in_hands(E)
- var/datum/gender/G = GLOB.gender_datums[gender]
visible_message(
- span_notice("\The [src] detaches [G.his] [E.name]!"),
+ span_notice("\The [src] detaches [p_their()] [E.name]!"),
span_notice("You detach your [E.name]!"))
return TRUE
diff --git a/code/modules/mob/living/carbon/human/species/species_attack.dm b/code/modules/mob/living/carbon/human/species/species_attack.dm
index a5ad16ee266..1dc810ae7bd 100644
--- a/code/modules/mob/living/carbon/human/species/species_attack.dm
+++ b/code/modules/mob/living/carbon/human/species/species_attack.dm
@@ -27,12 +27,10 @@
/datum/unarmed_attack/claws/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
var/obj/item/organ/external/affecting = target.get_organ(zone)
- var/datum/gender/T = GLOB.gender_datums[user.get_visible_gender()]
- var/datum/gender/TT = GLOB.gender_datums[target.get_visible_gender()]
attack_damage = CLAMP(attack_damage, 1, 5)
if(target == user)
- user.visible_message(span_danger("[user] [pick(attack_verb)] [T.himself] in the [affecting.name]!"))
+ user.visible_message(span_danger("[user] [pick(attack_verb)] [user.p_themselves()] in the [affecting.name]!"))
return 0
switch(zone)
@@ -40,20 +38,20 @@
// ----- HEAD ----- //
switch(attack_damage)
if(1 to 2)
- user.visible_message(span_danger("[user] scratched [target] across [TT.his] cheek!"))
+ user.visible_message(span_danger("[user] scratched [target] across [target.p_their()] cheek!"))
if(3 to 4)
user.visible_message(span_danger("[user] [pick(attack_verb)] [target]'s [pick("head", "neck")]!")) //'with spread claws' sounds a little bit odd, just enough that conciseness is better here I think
if(5)
user.visible_message(pick(
- span_danger("[user] rakes [T.his] [pick(attack_noun)] across [target]'s face!"),
- span_danger("[user] tears [T.his] [pick(attack_noun)] into [target]'s face!"),
+ span_danger("[user] rakes [user.p_their()] [pick(attack_noun)] across [target]'s face!"),
+ span_danger("[user] tears [user.p_their()] [pick(attack_noun)] into [target]'s face!"),
))
else
// ----- BODY ----- //
switch(attack_damage)
if(1 to 2) user.visible_message(span_danger("[user] scratched [target]'s [affecting.name]!"))
if(3 to 4) user.visible_message(span_danger("[user] [pick(attack_verb)] [pick("", "", "the side of")] [target]'s [affecting.name]!"))
- if(5) user.visible_message(span_danger("[user] tears [T.his] [pick(attack_noun)] [pick("deep into", "into", "across")] [target]'s [affecting.name]!"))
+ if(5) user.visible_message(span_danger("[user] tears [user.p_their()] [pick(attack_noun)] [pick("deep into", "into", "across")] [target]'s [affecting.name]!"))
/datum/unarmed_attack/claws/strong
attack_name = "strong claws"
diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm
index 4dca9b785b7..9e5318d0ff3 100644
--- a/code/modules/mob/living/carbon/human/unarmed_attack.dm
+++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm
@@ -44,7 +44,6 @@
/datum/unarmed_attack/proc/apply_effects(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/armour,var/attack_damage,var/zone)
var/stun_chance = rand(0, 100)
- var/datum/gender/TT = GLOB.gender_datums[target.get_visible_gender()]
if(attack_damage >= 5 && armour < 2 && !(target == user) && stun_chance <= attack_damage * 5) // 25% standard chance
switch(zone) // strong punches can have effects depending on where they hit
@@ -75,7 +74,7 @@
target.set_dir(GLOB.reverse_dir[target.dir])
target.apply_effect(attack_damage * 0.4, WEAKEN, armour)
if(BP_GROIN)
- target.visible_message(span_warning("[target] looks like [TT.he] [TT.is] in pain!"), span_warning("[(target.gender=="female") ? "Oh god that hurt!" : "Oh no, not your[pick("testicles", "crown jewels", "clockweights", "family jewels", "marbles", "bean bags", "teabags", "sweetmeats", "goolies")]!"]")) // I see no easy way to fix this for non-organic or neuter characters.
+ target.visible_message(span_warning("[target] looks like [target.p_theyre()] in pain!"), span_warning("[(target.gender=="female") ? "Oh god that hurt!" : "Oh no, not your[pick("testicles", "crown jewels", "clockweights", "family jewels", "marbles", "bean bags", "teabags", "sweetmeats", "goolies")]!"]")) // I see no easy way to fix this for non-organic or neuter characters.
target.apply_effects(stutter = attack_damage * 2, agony = attack_damage* 3, blocked = armour)
if(BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT)
if(!target.lying)
@@ -95,15 +94,13 @@
/datum/unarmed_attack/proc/handle_eye_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target)
var/obj/item/organ/internal/eyes/eyes = target.internal_organs_by_name[O_EYES]
- var/datum/gender/TU = GLOB.gender_datums[user.get_visible_gender()]
- var/datum/gender/TT = GLOB.gender_datums[target.get_visible_gender()]
if(eyes)
eyes.take_damage(rand(3,4), 1)
- user.visible_message(span_danger("[user] presses [TU.his] [eye_attack_text] into [target]'s [eyes.name]!"))
+ user.visible_message(span_danger("[user] presses [p_their()] [eye_attack_text] into [target]'s [eyes.name]!"))
var/eye_pain = eyes.organ_can_feel_pain()
to_chat(target, span_danger("You experience[(eye_pain) ? "" : " immense pain as you feel" ] [eye_attack_text_victim] being pressed into your [eyes.name][(eye_pain)? "." : "!"]"))
return
- user.visible_message(span_danger("[user] attempts to press [TU.his] [eye_attack_text] into [target]'s eyes, but [TT.he] [TT.does]n't have any!"))
+ user.visible_message(span_danger("[user] attempts to press [p_their()] [eye_attack_text] into [target]'s eyes, but [target.p_they()] [target.p_do()]n't have any!"))
/datum/unarmed_attack/proc/unarmed_override(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/zone)
return FALSE //return true if the unarmed override prevents further attacks
@@ -143,13 +140,10 @@
var/obj/item/organ/external/affecting = target.get_organ(zone)
var/organ = affecting.name
- var/datum/gender/TU = GLOB.gender_datums[user.get_visible_gender()]
- var/datum/gender/TT = GLOB.gender_datums[target.get_visible_gender()]
-
attack_damage = CLAMP(attack_damage, 1, 5) // We expect damage input of 1 to 5 for this proc. But we leave this check juuust in case.
if(target == user)
- user.visible_message(span_danger("[user] [pick(attack_verb)] [TU.himself] in the [organ]!"))
+ user.visible_message(span_danger("[user] [pick(attack_verb)] [p_themselves()] in the [organ]!"))
return FALSE
if(!target.lying)
@@ -158,7 +152,7 @@
// ----- HEAD ----- //
switch(attack_damage)
if(1 to 2)
- user.visible_message(span_danger("[user] slapped [target] across [TT.his] cheek!"))
+ user.visible_message(span_danger("[user] slapped [target] across [p_their()] cheek!"))
if(3 to 4)
user.visible_message(pick(
40; span_danger("[user] [pick(attack_verb)] [target] in the head!"),
@@ -168,21 +162,21 @@
if(5)
user.visible_message(pick(
30; span_danger("[user] gave [target] a resounding [pick("slap", "punch")] to the face!"),
- 40; span_danger("[user] smashed [TU.his] [pick(attack_noun)] into [target]'s face!"),
+ 40; span_danger("[user] smashed [p_their()] [pick(attack_noun)] into [target]'s face!"),
30; span_danger("[user] gave a strong blow against [target]'s jaw!")
))
else
// ----- BODY ----- //
switch(attack_damage)
if(1 to 2) user.visible_message(span_danger("[user] threw a glancing punch at [target]'s [organ]!"))
- if(1 to 4) user.visible_message(span_danger("[user] [pick(attack_verb)] [target] in [TT.his] [organ]!"))
+ if(1 to 4) user.visible_message(span_danger("[user] [pick(attack_verb)] [target] in [target.p_their()] [organ]!"))
if(5)
user.visible_message(pick(
- 50; span_danger("[user] smashed [TU.his] [pick(attack_noun)] into [target]'s [organ]!"),
+ 50; span_danger("[user] smashed [p_their()] [pick(attack_noun)] into [target]'s [organ]!"),
50; span_danger("[user] landed a striking [pick(attack_noun)] on [target]'s [organ]!")
))
else
- user.visible_message(span_danger("[user] [pick("punched", "threw a punch against", "struck", "slammed [TU.his] [pick(attack_noun)] into")] [target]'s [organ]!")) //why do we have a separate set of verbs for lying targets?
+ user.visible_message(span_danger("[user] [pick("punched", "threw a punch against", "struck", "slammed [p_their()] [pick(attack_noun)] into")] [target]'s [organ]!")) //why do we have a separate set of verbs for lying targets?
/datum/unarmed_attack/kick
attack_name = "kick"
@@ -218,14 +212,13 @@
/datum/unarmed_attack/kick/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
var/obj/item/organ/external/affecting = target.get_organ(zone)
- var/datum/gender/TT = GLOB.gender_datums[target.get_visible_gender()]
var/organ = affecting.name
attack_damage = CLAMP(attack_damage, 1, 5)
switch(attack_damage)
if(1 to 2) user.visible_message(span_danger("[user] threw [target] a glancing [pick(attack_noun)] to the [organ]!")) //it's not that they're kicking lightly, it's that the kick didn't quite connect
- if(3 to 4) user.visible_message(span_danger("[user] [pick(attack_verb)] [target] in [TT.his] [organ]!"))
+ if(3 to 4) user.visible_message(span_danger("[user] [pick(attack_verb)] [target] in [target.p_their()] [organ]!"))
if(5) user.visible_message(span_danger("[user] landed a strong [pick(attack_noun)] against [target]'s [organ]!"))
/datum/unarmed_attack/stomp
@@ -266,13 +259,12 @@
var/obj/item/organ/external/affecting = target.get_organ(zone)
var/organ = affecting.name
var/obj/item/clothing/shoes = user.shoes
- var/datum/gender/TU = GLOB.gender_datums[user.get_visible_gender()]
attack_damage = CLAMP(attack_damage, 1, 5)
switch(attack_damage)
- if(1 to 4) user.visible_message(span_danger("[pick("[user] stomped on", "[user] slammed [TU.his] [shoes ? copytext(shoes.name, 1, -1) : "foot"] down onto")] [target]'s [organ]!"))
- if(5) user.visible_message(span_danger("[pick("[user] landed a powerful stomp on", "[user] stomped down hard on", "[user] slammed [TU.his] [shoes ? copytext(shoes.name, 1, -1) : "foot"] down hard onto")] [target]'s [organ]!")) //Devastated lol. No. We want to say that the stomp was powerful or forceful, not that it /wrought devastation/
+ if(1 to 4) user.visible_message(span_danger("[pick("[user] stomped on", "[user] slammed [user.p_their()] [shoes ? copytext(shoes.name, 1, -1) : "foot"] down onto")] [target]'s [organ]!"))
+ if(5) user.visible_message(span_danger("[pick("[user] landed a powerful stomp on", "[user] stomped down hard on", "[user] slammed [user.p_their()] [shoes ? copytext(shoes.name, 1, -1) : "foot"] down hard onto")] [target]'s [organ]!")) //Devastated lol. No. We want to say that the stomp was powerful or forceful, not that it /wrought devastation/
/datum/unarmed_attack/light_strike
attack_name = "light hit"
diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm
index bf7e2a8c2f3..5a842ff2eae 100644
--- a/code/modules/mob/living/silicon/pai/software_modules.dm
+++ b/code/modules/mob/living/silicon/pai/software_modules.dm
@@ -70,12 +70,11 @@
count++
// Check the carrier
- var/datum/gender/TM = GLOB.gender_datums[M.get_visible_gender()]
var/answer = tgui_alert(M, "[P] is requesting a DNA sample from you. Will you allow it to confirm your identity?", "[P] Check DNA", list("Yes", "No"))
if(answer == "Yes")
var/turf/T = get_turf(P.loc)
for (var/mob/v in viewers(T))
- v.show_message(span_notice("[M] presses [TM.his] thumb against [P]."), 3, span_notice("[P] makes a sharp clicking sound as it extracts DNA material from [M]."), 2)
+ v.show_message(span_notice("[M] presses [M.p_their()] thumb against [P]."), 3, span_notice("[P] makes a sharp clicking sound as it extracts DNA material from [M]."), 2)
var/datum/dna/dna = M.dna
to_chat(P, span_infoplain(span_red("