diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index d9a5f7a847..df7a90632c 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -447,3 +447,7 @@ #define DEATHGASP_NO_MESSAGE "no message" #define RESIST_COOLDOWN 2 SECONDS + +#define VISIBLE_GENDER_FORCE_PLURAL 1 // Used by get_visible_gender to return PLURAL +#define VISIBLE_GENDER_FORCE_IDENTIFYING 2 // Used by get_visible_gender to return the mob's identifying gender +#define VISIBLE_GENDER_FORCE_BIOLOGICAL 3 // Used by get_visible_gender to return the mob's biological gender diff --git a/code/game/atoms.dm b/code/game/atoms.dm index d56186f5b0..5ef2fd6818 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -27,7 +27,7 @@ // Overlays ///Our local copy of (non-priority) overlays without byond magic. Use procs in SSoverlays to manipulate - var/list/our_overlays + var/list/our_overlays ///Overlays that should remain on top and not normally removed when using cut_overlay functions, like c4. var/list/priority_overlays ///vis overlays managed by SSvis_overlays to automaticaly turn them like other overlays @@ -35,7 +35,7 @@ ///Our local copy of filter data so we can add/remove it var/list/filter_data - + //Detective Work, used for the duplicate data points kept in the scanners var/list/original_atom // Track if we are already had initialize() called to prevent double-initialization. @@ -681,7 +681,7 @@ if(!isnull(.)) datum_flags |= DF_VAR_EDITED return - + . = ..() /atom/proc/atom_say(message) @@ -716,7 +716,7 @@ . = ..() SEND_SIGNAL(src, COMSIG_ATOM_EXITED, AM, new_loc) -/atom/proc/get_visible_gender() +/atom/proc/get_visible_gender(mob/user, force) return gender /atom/proc/interact(mob/user) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 14e2f452ac..65560c651f 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -76,22 +76,12 @@ BP_L_LEG = skip_body & EXAMINE_SKIPLEGS, BP_R_LEG = skip_body & EXAMINE_SKIPLEGS) - var/datum/gender/T = gender_datums[get_visible_gender()] + var/gender_hidden = (skip_gear & EXAMINE_SKIPJUMPSUIT) && (skip_body & EXAMINE_SKIPFACE) + var/gender_key = get_visible_gender(user, gender_hidden) - if((skip_gear & EXAMINE_SKIPJUMPSUIT) && (skip_body & EXAMINE_SKIPFACE)) //big suits/masks/helmets make it hard to tell their gender - T = gender_datums[PLURAL] - - else if(species && species.ambiguous_genders) - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(H.species && !istype(species, H.species)) - T = gender_datums[PLURAL]// Species with ambiguous_genders will not show their true gender upon examine if the examiner is not also the same species. - if(!(issilicon(user) || isobserver(user))) // Ghosts and borgs are all knowing - T = gender_datums[PLURAL] - - if(!T) - // Just in case someone VVs the gender to something strange. It'll runtime anyway when it hits usages, better to CRASH() now with a helpful message. - CRASH("Gender datum was null; key was '[((skip_gear & EXAMINE_SKIPJUMPSUIT) && (skip_body & EXAMINE_SKIPFACE)) ? PLURAL : gender]'") + var/datum/gender/T = 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))) @@ -144,7 +134,7 @@ LAZYADD(pocket_msg, r_store_message) if(LAZYLEN(pocket_msg)) tie_msg += " Near the waist it has [english_list(pocket_msg)]." - + if(w_uniform.blood_DNA) msg += "[T.He] [T.is] wearing [bicon(w_uniform)] [w_uniform.gender==PLURAL?"some":"a"] [(w_uniform.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [w_uniform.name]![tie_msg]" else diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 52e2b7c5ac..25ac56affc 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -855,13 +855,25 @@ remoteview_target = null reset_view(0) -/mob/living/carbon/human/get_visible_gender() - if(wear_suit && wear_suit.flags_inv & HIDEJUMPSUIT && ((head && head.flags_inv & HIDEMASK) || wear_mask)) - return PLURAL //plural is the gender-neutral default - if(species) - if(species.ambiguous_genders) - return PLURAL // regardless of what you're wearing, your gender can't be figured out - return get_gender() +/mob/living/carbon/human/get_visible_gender(mob/user, force) + switch(force) + if(VISIBLE_GENDER_FORCE_PLURAL) + return PLURAL + if(VISIBLE_GENDER_FORCE_IDENTIFYING) + return get_gender() + if(VISIBLE_GENDER_FORCE_BIOLOGICAL) + return gender + else + if((wear_mask || (head?.flags_inv & HIDEMASK)) && (wear_suit?.flags_inv & HIDEJUMPSUIT)) + return PLURAL + if(species?.ambiguous_genders && user) + if(ishuman(user)) + var/mob/living/carbon/human/human = user + if(!istype(human.species, species)) + return PLURAL + else if(!isobserver(user) && !issilicon(user)) + return PLURAL + return get_gender() /mob/living/carbon/human/proc/increase_germ_level(n) if(gloves)