diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm
index 8b8ab2b73ed..5c2ef580402 100644
--- a/code/datums/outfits/outfit.dm
+++ b/code/datums/outfits/outfit.dm
@@ -93,7 +93,7 @@
post_equip(H)
if(W) // We set ID info last to ensure the ID photo is as correct as possible.
- H.set_id_info(W)
+ H.set_id_info(W, H.client)
return 1
/datum/outfit/proc/equip_base(mob/living/carbon/human/H)
diff --git a/code/datums/uplink/announcements.dm b/code/datums/uplink/announcements.dm
index 737f7c77d67..b339c6b4818 100644
--- a/code/datums/uplink/announcements.dm
+++ b/code/datums/uplink/announcements.dm
@@ -60,7 +60,7 @@
general.fields["rank"] = I.assignment
general.fields["real_rank"] = I.assignment
general.fields["name"] = I.registered_name
- general.fields["sex"] = I.sex
+ general.fields["sex"] = capitalize(user.gender)
else
var/mob/living/carbon/human/H
if(istype(user,/mob/living/carbon/human))
@@ -89,8 +89,6 @@
medical.fields["b_dna"] = random_medical_record.fields["b_type"]
if(I)
- general.fields["fingerprint"] = I.fingerprint_hash
- medical.fields["b_type"] = I.blood_type
medical.fields["b_dna"] = I.dna_hash
AnnounceArrivalSimple(general.fields["name"], general.fields["rank"])
diff --git a/code/game/objects/items/id_cards/contractor_ids.dm b/code/game/objects/items/id_cards/contractor_ids.dm
index 4d6b7482967..6ad380561b6 100644
--- a/code/game/objects/items/id_cards/contractor_ids.dm
+++ b/code/game/objects/items/id_cards/contractor_ids.dm
@@ -5,10 +5,10 @@
icon_state = "chit"
/obj/item/card/id/contractor/dat()
+ . += "Employing Company: [employing_coperation]"
+ . += "External Job Title: [extern_title]"
+ // . += "Expiration Date: [expiry_date]"
. = ..()
- . += "Employing Company: [employing_coperation]"
- . += "External Job Title: [extern_title]"
- // . += "Expiration Date: [expiry_date]"
/obj/item/card/id/contractor/update_icon()
return 0
diff --git a/code/game/objects/items/id_cards/guest.dm b/code/game/objects/items/id_cards/guest.dm
index 2678c68b3ba..e28529260bd 100644
--- a/code/game/objects/items/id_cards/guest.dm
+++ b/code/game/objects/items/id_cards/guest.dm
@@ -52,19 +52,18 @@
else
. += "It expired at [worldtime2stationtime(expire_time)]."
-/obj/item/card/id/guest/read()
- if(!Adjacent(usr))
- return //Too far to read
+/obj/item/card/id/guest/get_description_info()
+ . = ..()
if (expired)
- to_chat(usr, "This pass expired at [worldtime2stationtime(expire_time)].")
+ . += SPAN_NOTICE("This pass expired at [worldtime2stationtime(expire_time)].")
else
- to_chat(usr, "This pass expires at [worldtime2stationtime(expire_time)].")
- to_chat(usr, "It grants access to following areas:")
+ . += SPAN_NOTICE("This pass expires at [worldtime2stationtime(expire_time)].")
+ . += SPAN_NOTICE("It grants access to following areas:")
for (var/A in access)
- to_chat(usr, "[get_access_desc(A)].")
- to_chat(usr, "Issuing reason: [given_reason].")
- to_chat(usr, SPAN_NOTICE("Issuer name: [giver_name]"))
- to_chat(usr, SPAN_NOTICE("Issuer rank: [giver_rank]"))
+ . += SPAN_NOTICE("[get_access_desc(A)].")
+ . += SPAN_NOTICE("Issuing reason: [given_reason].")
+ . += SPAN_NOTICE("Issuer name: [giver_name]")
+ . += SPAN_NOTICE("Issuer rank: [giver_rank]")
/obj/item/card/id/guest/attack_self(mob/user)
. = ..()
diff --git a/code/game/objects/items/id_cards/station_ids.dm b/code/game/objects/items/id_cards/station_ids.dm
index 07ba5cc3bb9..f14e2d1b912 100644
--- a/code/game/objects/items/id_cards/station_ids.dm
+++ b/code/game/objects/items/id_cards/station_ids.dm
@@ -14,13 +14,16 @@
slot_flags = SLOT_ID | SLOT_EARS
var/age = "\[UNSET\]"
- var/blood_type = "\[UNSET\]"
var/dna_hash = "\[UNSET\]"
- var/fingerprint_hash = "\[UNSET\]"
- var/sex = "\[UNSET\]"
+ var/pronouns = "\[UNSET\]"
var/species = "\[UNSET\]"
var/icon/front
var/icon/side
+ var/photoupdatequeued
+
+ /// Keyed list containing confidential information, such as blood type, vetalism, and more
+ var/list/extra_info = list()
+ var/extra_info_visible
var/last_job_switch
var/lost_access = list()
@@ -52,15 +55,28 @@
job_access_type = getting_from
/obj/item/card/id/examine(mob/user, dist)
- var/list/result = dat()
- result.Insert(1, ..())
- return result
- //show(user)
-
-/obj/item/card/id/examine_more(mob/user)
. = ..()
- . += SPAN_NOTICE("You examine [src] closer, and note the following...")
-
+ . += "
"
+ . += dat()
+ . += "
"
+ if(Adjacent(user))
+ . += SPAN_NOTICE("Alt-click to [extra_info_visible ? "close" : "open"] the confidential information flap.")
+ return .
+
+/obj/item/card/id/get_description_info()
+ . = ..()
+ if(.)
+ . += "
"
if(mining_points)
. += "There's [mining_points] mining equipment redemption point\s loaded onto this card."
@@ -102,26 +118,46 @@
return
/obj/item/card/id/proc/set_id_photo(var/mob/M)
- var/icon/charicon = cached_character_icon(M)
- front = icon(charicon,dir = SOUTH)
- side = icon(charicon,dir = WEST)
+ if(!photoupdatequeued)
+ addtimer(CALLBACK(src, PROC_REF(_set_id_photo)), 1)
+ photoupdatequeued = M
+
-/mob/proc/set_id_info(var/obj/item/card/id/id_card)
+/obj/item/card/id/proc/_set_id_photo()
+ var/mob/M = photoupdatequeued
+ if(istype(M))
+ UNTIL(!(M.atom_flags & ATOM_OVERLAY_QUEUED)) // this is necessary specifically because roundstart characters simply do not render their clothes, as they are waiting for overlays to compile. we are in hell we think
+ front = get_flat_icon(M, SOUTH, TRUE)
+ side = get_flat_icon(M, WEST, TRUE)
+ photoupdatequeued = null
+
+/mob/proc/set_id_info(obj/item/card/id/id_card, client/C)
+ id_card.extra_info = list()
id_card.age = 0
id_card.registered_name = real_name
- id_card.sex = capitalize(gender)
- id_card.set_id_photo(src)
+ id_card.extra_info["sex"] = "Biological Sex: [capitalize(gender)]" //most people just use sex for the handful of pixels worth of difference in body model but eh why the hell not
+ var/datum/gender/G = GLOB.gender_datums[get_gender()]
+ if(istype(G))
+ id_card.pronouns = G.pronoun_preview
+ else
+ id_card.pronouns = "Unknown"
if(dna)
- id_card.blood_type = dna.b_type
+ id_card.extra_info["bloodtype"] = "Blood Type: [dna.b_type]"
+ id_card.extra_info["dnahash"] = "DNA Hash: [dna.unique_enzymes]"
+ id_card.extra_info["fingerprint"] = "Fingerprint: [md5(dna.uni_identity)]"
id_card.dna_hash = dna.unique_enzymes
- id_card.fingerprint_hash= md5(dna.uni_identity)
+ if(C && C.prefs)
+ id_card.extra_info += C.prefs.get_trait_id_info()
id_card.update_name()
+ id_card.set_id_photo(src)
-/mob/living/carbon/human/set_id_info(var/obj/item/card/id/id_card)
+/mob/living/carbon/human/set_id_info(obj/item/card/id/id_card, client/C)
..()
id_card.age = age
- id_card.species = src.species.name
+ id_card.species = custom_species ? custom_species : species.get_examine_name()
+
+ id_card.extra_info["biospecies"] = "Biological Species: [species.get_examine_name()]"
if(istype(id_card,/obj/item/card/id/contractor))
var/obj/item/card/id/contractor/c_id = id_card
@@ -131,17 +167,20 @@
/obj/item/card/id/proc/dat()
var/dat = list()
- dat += "Name: [registered_name]"
- dat += "Sex: [sex]"
- dat += "Age: [age]"
- dat += "Rank: [assignment]"
- dat += "Species: [species]"
- // dat += "Fingerprint: [fingerprint_hash]
\n"
- dat += "Blood Type: [blood_type]"
- // dat += "DNA Hash: [dna_hash]
\n"
- /*if(front && side)
- dat +="Photo | "*/
- //dat += ""
+ dat += "Name: [registered_name]"
+ dat += "Pronouns: [pronouns]"
+ dat += "Age: [age]"
+ dat += "Rank: [assignment]"
+ dat += "Species: [species]"
+ if(extra_info_visible)
+ dat += SPAN_NOTICE("
CONFIDENTIAL:")
+ if(length(extra_info))
+ for(var/key in extra_info) // doing a simple dat += extra_info just results in the ID displaying all the keys instead of the actual text tied to 'em
+ dat += extra_info[key]
+ else
+ dat += SPAN_NOTICE("The confidential information section is blank.")
+ else
+ dat += "The confidential information flap is closed."
return dat
/obj/item/card/id/attack_self(mob/user)
@@ -154,22 +193,19 @@
src.add_fingerprint(user)
return
+/obj/item/card/id/AltClick(mob/user)
+ if(Adjacent(user))
+ extra_info_visible = !extra_info_visible
+ user.visible_message("[user] flips [src]'s confidential information flap [extra_info_visible ? "open" : "closed"].",\
+ "You flip [src]'s confidential information flap [extra_info_visible ? "open" : "closed"].")
+
+
/obj/item/card/id/GetAccess()
return access.Copy()
/obj/item/card/id/GetID()
return src
-/obj/item/card/id/verb/read()
- set name = "Read ID Card"
- set category = VERB_CATEGORY_OBJECT
- set src in usr
-
- to_chat(usr, "[icon2html(thing = src, target = usr)] [src.name]: The current assignment on the card is [src.assignment].")
- to_chat(usr, "The blood type on the card is [blood_type].")
- to_chat(usr, "The DNA hash on the card is [dna_hash].")
- to_chat(usr, "The fingerprint hash on the card is [fingerprint_hash].")
-
/obj/item/card/id/vv_get_dropdown()
. = ..()
VV_DROPDOWN_OPTION(null, "-----")
diff --git a/code/game/objects/items/id_cards/syndicate_ids.dm b/code/game/objects/items/id_cards/syndicate_ids.dm
index 87ce989d2a9..a8a4dc4e761 100644
--- a/code/game/objects/items/id_cards/syndicate_ids.dm
+++ b/code/game/objects/items/id_cards/syndicate_ids.dm
@@ -51,12 +51,10 @@
entries[++entries.len] = list("name" = "Age", "value" = age)
entries[++entries.len] = list("name" = "Appearance", "value" = "Set")
entries[++entries.len] = list("name" = "Assignment", "value" = assignment)
- entries[++entries.len] = list("name" = "Blood Type", "value" = blood_type)
entries[++entries.len] = list("name" = "DNA Hash", "value" = dna_hash)
- entries[++entries.len] = list("name" = "Fingerprint Hash", "value" = fingerprint_hash)
entries[++entries.len] = list("name" = "Name", "value" = registered_name)
entries[++entries.len] = list("name" = "Photo", "value" = "Update")
- entries[++entries.len] = list("name" = "Sex", "value" = sex)
+ entries[++entries.len] = list("name" = "Pronouns", "value" = pronouns)
entries[++entries.len] = list("name" = "Factory Reset", "value" = "Use With Care")
data["electronic_warfare"] = electronic_warfare
data["entries"] = entries
@@ -122,17 +120,6 @@
to_chat(user, "Occupation changed to '[new_job]'.")
update_name()
. = 1
- if("Blood Type")
- var/default = blood_type
- if(default == initial(blood_type) && ishuman(user))
- var/mob/living/carbon/human/H = user
- if(H.dna)
- default = H.dna.b_type
- var/new_blood_type = sanitize(input(user,"What blood type would you like to be written on this card?","Agent Card Blood Type",default) as null|text)
- if(!isnull(new_blood_type) && CanUseTopic(user, state))
- src.blood_type = new_blood_type
- to_chat(user, "Blood type changed to '[new_blood_type]'.")
- . = 1
if("DNA Hash")
var/default = dna_hash
if(default == initial(dna_hash) && ishuman(user))
@@ -144,17 +131,6 @@
src.dna_hash = new_dna_hash
to_chat(user, "DNA hash changed to '[new_dna_hash]'.")
. = 1
- if("Fingerprint Hash")
- var/default = fingerprint_hash
- if(default == initial(fingerprint_hash) && ishuman(user))
- var/mob/living/carbon/human/H = user
- if(H.dna)
- default = md5(H.dna.uni_identity)
- var/new_fingerprint_hash = sanitize(input(user,"What fingerprint hash would you like to be written on this card?","Agent Card Fingerprint Hash",default) as null|text)
- if(!isnull(new_fingerprint_hash) && CanUseTopic(user, state))
- src.fingerprint_hash = new_fingerprint_hash
- to_chat(user, "Fingerprint hash changed to '[new_fingerprint_hash]'.")
- . = 1
if("Name")
var/new_name = sanitizeName(input(user,"What name would you like to put on this card?","Agent Card Name", registered_name) as null|text)
if(!isnull(new_name) && CanUseTopic(user, state))
@@ -166,28 +142,28 @@
set_id_photo(user)
to_chat(user, "Photo changed.")
. = 1
- if("Sex")
- var/new_sex = sanitize(input(user,"What sex would you like to put on this card?","Agent Card Sex", sex) as null|text)
- if(!isnull(new_sex) && CanUseTopic(user, state))
- src.sex = new_sex
- to_chat(user, "Sex changed to '[new_sex]'.")
+ if("Pronouns")
+ var/new_pronouns = sanitize(input(user,"What pronouns would you like to put on this card?","Agent Card Sex", pronouns) as null|text)
+ if(!isnull(new_pronouns) && CanUseTopic(user, state))
+ src.pronouns = new_pronouns
+ to_chat(user, "Sex changed to '[new_pronouns]'.")
. = 1
if("Factory Reset")
if(alert("This will factory reset the card, including access and owner. Continue?", "Factory Reset", "No", "Yes") == "Yes" && CanUseTopic(user, state))
age = initial(age)
access = syndicate_access.Copy()
assignment = initial(assignment)
- blood_type = initial(blood_type)
+ //blood_type = initial(blood_type)
dna_hash = initial(dna_hash)
electronic_warfare = initial(electronic_warfare)
- fingerprint_hash = initial(fingerprint_hash)
+ //fingerprint_hash = initial(fingerprint_hash)
icon_state = initial(icon_state)
sprite_stack = list("")
update_icon()
name = initial(name)
registered_name = initial(registered_name)
unset_registered_user()
- sex = initial(sex)
+ pronouns = initial(pronouns)
to_chat(user, "All information has been deleted from \the [src].")
. = 1
diff --git a/code/modules/mob/living/carbon/human/traits/_trait.dm b/code/modules/mob/living/carbon/human/traits/_trait.dm
index 553c79953e9..9e709eb0c28 100644
--- a/code/modules/mob/living/carbon/human/traits/_trait.dm
+++ b/code/modules/mob/living/carbon/human/traits/_trait.dm
@@ -2,6 +2,11 @@
var/name
var/desc = "Contact a developer if you see this trait."
+ /// Extra IC information about this trait that gets placed within the confidential flap of ID cards
+ var/extra_id_info
+ /// Whether or not this trait can have extra info opted out of
+ var/extra_id_info_optional = TRUE
+
/// 0 is neutral, negative cost means negative, positive cost means positive.
var/cost = 0
/// A list to apply to the custom species vars.
diff --git a/code/modules/mob/living/carbon/human/traits/negative.dm b/code/modules/mob/living/carbon/human/traits/negative.dm
index 3cf63d3cb80..44e033c2d3f 100644
--- a/code/modules/mob/living/carbon/human/traits/negative.dm
+++ b/code/modules/mob/living/carbon/human/traits/negative.dm
@@ -14,6 +14,7 @@
name = "Low Endurance"
desc = "Reduces your maximum total hitpoints to 75."
cost = -2
+ extra_id_info = "Employee is unusually susceptible to all forms of harm."
var_changes = list("total_health" = 75)
/datum/trait/negative/endurance_low/apply(datum/species/S, mob/living/carbon/human/H)
@@ -24,6 +25,7 @@
name = "Extremely Low Endurance"
desc = "Reduces your maximum total hitpoints to 50."
cost = -3 //Teshari HP. This makes the person a lot more suseptable to getting stunned, killed, etc.
+ extra_id_info = "Employee is extremely susceptible to all forms of harm."
var_changes = list("total_health" = 50)
/datum/trait/negative/endurance_very_low/apply(datum/species/S, mob/living/carbon/human/H)
@@ -46,6 +48,7 @@
name = "Major Brute Weakness"
desc = "You take 50% more brute damage"
cost = -3
+ extra_id_info = "Employee is unusually susceptible to blunt trauma."
var_changes = list("brute_mod" = 1.5)
/datum/trait/negative/minor_burn_weak
@@ -64,6 +67,7 @@
name = "Major Burn Weakness"
desc = "You take 50% more burn damage"
cost = -3
+ extra_id_info = "Employee is unusually sensitive to heat."
var_changes = list("burn_mod" = 1.5)
/datum/trait/negative/toxin_weak
@@ -76,12 +80,14 @@
name = "Major Toxin Weaness"
desc = "You take 50% more toxin damage"
cost = -2
+ extra_id_info = "Employee's organs are ineffective at filtering toxins."
var_changes = list("toxins_mod" = 1.5)
/datum/trait/negative/oxy_weak
name = "Breathe Weakness"
desc = "You take 25% more breathe damage and require 25% more air (20kpa minimum). Make sure to adjust your emergency EVA tanks."
cost = -1
+ extra_id_info = "Employee requires a minimum atmospheric pressure of 20kPa to breathe."
var_changes = list("minimum_breath_pressure" = 20, "oxy_mod" = 1.25)
/datum/trait/negative/rad_weak
@@ -94,6 +100,7 @@
name = "Major Radiation Weakness"
desc = "You take 50% more radition damage"
cost = -2
+ extra_id_info = "Employee is extremely susceptible to radiation."
var_changes = list("radiation_mod" = 1.50)
/datum/trait/negative/conductive
@@ -106,6 +113,7 @@
name = "Major Conductive"
desc = "Increases your susceptibility to electric shocks by 100%"
cost = -2
+ extra_id_info = "Employee is exceptionally conductive."
var_changes = list("siemens_coefficient" = 2.0) //This makes you extremely weak to tasers.
/datum/trait/negative/hollow
@@ -123,6 +131,7 @@
name = "Hollow Bones/Brittle Alloy"
desc = "Your bones and robot limbs are significantly easier to break."
cost = -4 //I feel like this should be higher, but let's see where it goes
+ extra_id_info = "Employee's bones are unusually fragile."
/datum/trait/negative/hollow_plus/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
@@ -141,6 +150,7 @@
desc = "You simply can't see colors at all, period. You are 100% colorblind."
cost = -1
custom_only = FALSE
+ extra_id_info = "Employee is only capable of perceiving luminance, and cannot perceive hues or saturation."
/datum/trait/negative/colorblind/mono/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
@@ -150,6 +160,7 @@
name = "Colorblindness (Para Vulp)"
desc = "You have a severe issue with green colors and have difficulty recognizing them from red colors."
cost = -1
+ extra_id_info = "Employee has a form of red/green colorblindness."
/datum/trait/negative/colorblind/para_vulp/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
@@ -159,6 +170,7 @@
name = "Colorblindness (Para Taj)"
desc = "You have a minor issue with blue colors and have difficulty recognizing them from red colors."
cost = -1
+ extra_id_info = "Employee has a form of blue/red colorblindness."
/datum/trait/negative/colorblind/para_taj/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
@@ -168,6 +180,7 @@
name = "Photosensitive"
desc = "You are incredibly vulnerable to bright lights. You are blinded for longer and your skin burns under extreme light."
cost = -1
+ extra_id_info = "Employee is exceptionally sensitive to bright lights."
var_changes = list("flash_mod" = 2)
var_changes = list("flash_burn" = 5)
@@ -175,6 +188,7 @@
name = "Hemophilia"
desc = "You bleed twice as fast as normal."
cost = -1
+ extra_id_info = "Employee is exceptionally prone to bleeding."
var_changes = list("bloodloss_rate" = 2)
// todo: use it as a disability? kinda silly this applies forever
@@ -182,6 +196,7 @@
name = "Blind"
desc = "You're blind. Permanently."
cost = -3
+ extra_id_info = "Employee has extremely limited vision."
custom_only = FALSE
excludes = list(
/datum/trait/negative/deaf
@@ -196,6 +211,7 @@
name = "Deaf"
desc = "You're deaf. Permanently."
cost = -2
+ extra_id_info = "Employee cannot perceive sound."
custom_only = FALSE
traits = list(
TRAIT_DEAF
@@ -213,6 +229,7 @@
name = "Mute"
desc = "You're mute. Permanently."
cost = 0 // TTS bypasses this instantly, no powergaming mute ass explo characters
+ extra_id_info = "Employee is incapable of vocalizing."
custom_only = FALSE
traits = list(
TRAIT_MUTE
diff --git a/code/modules/mob/living/carbon/human/traits/neutral.dm b/code/modules/mob/living/carbon/human/traits/neutral.dm
index 37becd2a3aa..c7ea33c9fac 100644
--- a/code/modules/mob/living/carbon/human/traits/neutral.dm
+++ b/code/modules/mob/living/carbon/human/traits/neutral.dm
@@ -4,6 +4,7 @@
cost = 0
var_changes = list("metabolic_rate" = 1.2, "hunger_factor" = 0.2, "metabolism" = 0.06) // +20% rate and 4x hunger (Teshari level)
excludes = list(/datum/trait/neutral/metabolism_down, /datum/trait/neutral/metabolism_apex)
+ extra_id_info = "Employee has a faster-than-average metabolism."
/datum/trait/neutral/metabolism_down
name = "Slow Metabolism"
@@ -11,6 +12,7 @@
cost = 0
var_changes = list("metabolic_rate" = 0.8, "hunger_factor" = 0.04, "metabolism" = 0.0012) // -20% of default.
excludes = list(/datum/trait/neutral/metabolism_up, /datum/trait/neutral/metabolism_apex)
+ extra_id_info = "Employee has a slower-than-average metabolism."
/datum/trait/neutral/metabolism_apex
name = "Apex Metabolism"
@@ -18,6 +20,7 @@
cost = 0
var_changes = list("metabolic_rate" = 1.4, "hunger_factor" = 0.4, "metabolism" = 0.012) // +40% rate and 8x hunger (Double Teshari)
excludes = list(/datum/trait/neutral/metabolism_up, /datum/trait/neutral/metabolism_down)
+ extra_id_info = "Employee has an unusually fast metabolism."
/datum/trait/neutral/cold_discomfort
name = "Hot-Blooded"
@@ -25,6 +28,7 @@
cost = 0
var_changes = list("heat_discomfort_level" = T0C+19)
excludes = list(/datum/trait/neutral/hot_discomfort)
+ extra_id_info = "Employee is acclimated to colder temperatures."
/datum/trait/neutral/hot_discomfort
name = "Cold-Blooded"
@@ -32,6 +36,7 @@
cost = 0
var_changes = list("cold_discomfort_level" = T0C+21)
excludes = list(/datum/trait/neutral/cold_discomfort)
+ extra_id_info = "Employee is acclimated to warmer temperatures."
/datum/trait/neutral/autohiss_unathi
name = "Autohiss (Unathi)"
@@ -67,6 +72,7 @@
cost = 0
var_changes = list("is_vampire" = TRUE) //The verb is given in human.dm
custom_only = FALSE
+ extra_id_info = "Employee's diet is exclusively blood. Employee has tested negative for vetalism."
/datum/trait/neutral/bloodsucker/apply(datum/species/S, mob/living/carbon/human/H)
..(S,H)
@@ -87,6 +93,7 @@
name = "Vetalan / Vampiric"
desc = "Vampires, officially known as the Vetalan, are weaker to burns, bright lights, and must consume blood to survive. To this end, they can see near-perfectly in the darkness, possess sharp, numbing fangs, and anti-septic saliva."
cost = 0
+ extra_id_info = "Employee is a carrier of Vetalism, and needs to consume blood to survive. Additionally, employee's saliva carries antiseptic properties."
custom_only = FALSE
var_changes = list(
"is_vampire" = TRUE,
@@ -243,6 +250,7 @@
desc = "Your saliva has especially strong antiseptic properties that can be used to heal small wounds."
cost = 0
custom_only = FALSE
+ extra_id_info = "Employee's saliva carries antiseptic properties."
/datum/trait/neutral/antiseptic_saliva/apply(datum/species/S, mob/living/carbon/human/H)
..(S,H)
@@ -265,6 +273,7 @@
var_changes = list(
"breath_type" = GAS_ID_NITROGEN
)
+ extra_id_info = "Employee requires Nitrogen to breathe."
/datum/trait/neutral/cyberpsycho
name = "Cybernetic Rejection Syndrome"
@@ -274,6 +283,7 @@
var_changes = list(
"is_cyberpsycho" = TRUE
)
+ extra_id_info = "Employee's body exhibits violent rejection of cybernetics."
/datum/trait/neutral/cyberpsycho/apply(datum/species/S, mob/living/carbon/human/H)
..(S,H)
@@ -285,3 +295,4 @@
cost = 0
custom_only = FALSE
traits = list(TRAIT_ALCOHOL_INTOLERANT)
+ extra_id_info = "Employee's body is violently intolerant of alcohol."
diff --git a/code/modules/mob/living/carbon/human/traits/positive.dm b/code/modules/mob/living/carbon/human/traits/positive.dm
index d1f42234075..b429282bb8f 100644
--- a/code/modules/mob/living/carbon/human/traits/positive.dm
+++ b/code/modules/mob/living/carbon/human/traits/positive.dm
@@ -96,6 +96,7 @@
desc = "You take 15% less oxygen damge and require 12.5% less air (14kpa minimum)."
cost = 2
var_changes = list("minimum_breath_pressure" = 14, "oxy_mod" = 0.85)
+ extra_id_info = "Employee only requires an atmospheric pressure of 14kPa to breathe."
/datum/trait/positive/oxy_resist_plus
name = "Breathe Resist"
@@ -103,6 +104,7 @@
cost = 3
var_changes = list("minimum_breath_pressure" = 12, "oxy_mod" = 0.75)
excludes = list(/datum/trait/positive/oxy_resist,/datum/trait/positive/oxy_resist_plus)
+ extra_id_info = "Employee only requires an atmospheric pressure of 12kPa to breathe."
/datum/trait/positive/rad_resist
name = "Minor Radiation Resist"
@@ -156,6 +158,7 @@
name = "Antiseptic Saliva"
desc = "Your saliva has especially strong antiseptic properties that can be used to heal small wounds."
cost = 1
+ extra_id_info = "Employee's saliva carries antiseptic properties."
/datum/trait/positive/antiseptic_saliva/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..()
diff --git a/code/modules/preferences/_preferences.dm b/code/modules/preferences/_preferences.dm
index 0b8120fe253..406e9d730d7 100644
--- a/code/modules/preferences/_preferences.dm
+++ b/code/modules/preferences/_preferences.dm
@@ -426,3 +426,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
panel = new(user, "Character Slots", "Character Slots", 300, 390, src)
panel.set_content(dat)
panel.open()
+
+
+/datum/preferences/proc/get_trait_id_info()
+ . = list()
+ for (var/path in (pos_traits + neg_traits + neu_traits) - id_hidden_traits)
+ var/datum/trait/trait = all_traits[path]
+ if(istype(trait))
+ if(trait.extra_id_info)
+ .["[ckey(trait.name)]"] = trait.extra_id_info
+ return .
diff --git a/code/modules/preferences/preference_setup/vore/08_traits.dm b/code/modules/preferences/preference_setup/vore/08_traits.dm
index 3c797938934..250b388b226 100644
--- a/code/modules/preferences/preference_setup/vore/08_traits.dm
+++ b/code/modules/preferences/preference_setup/vore/08_traits.dm
@@ -17,6 +17,8 @@
var/list/neu_traits = list()
var/list/neg_traits = list()
+ var/list/id_hidden_traits = list()
+
var/traits_cheating = 0 //Varedit by admins allows saving new maximums on people who apply/etc
var/starting_trait_points = STARTING_SPECIES_POINTS
var/max_traits = MAX_SPECIES_TRAITS
@@ -32,6 +34,7 @@
S["pos_traits"] >> pref.pos_traits
S["neu_traits"] >> pref.neu_traits
S["neg_traits"] >> pref.neg_traits
+ S["hidden_traits"] >> pref.id_hidden_traits
S["blood_color"] >> pref.blood_color
S["traits_cheating"]>> pref.traits_cheating
@@ -49,6 +52,7 @@
S["pos_traits"] << pref.pos_traits
S["neu_traits"] << pref.neu_traits
S["neg_traits"] << pref.neg_traits
+ S["hidden_traits"] << pref.id_hidden_traits
S["blood_color"] << pref.blood_color
S["traits_cheating"]<< pref.traits_cheating
@@ -64,6 +68,7 @@
if(!pref.pos_traits) pref.pos_traits = list()
if(!pref.neu_traits) pref.neu_traits = list()
if(!pref.neg_traits) pref.neg_traits = list()
+ if(!pref.id_hidden_traits) pref.id_hidden_traits = list()
pref.blood_color = sanitize_hexcolor(pref.blood_color, 6, TRUE, default = "#A10808")
@@ -82,14 +87,24 @@
for(var/path in pref.neu_traits)
if(!(path in neutral_traits))
pref.neu_traits -= path
+ continue
if((pref.real_species_id() != SPECIES_ID_CUSTOM) && !(path in everyone_traits))
pref.neu_traits -= path
//Negative traits
for(var/path in pref.neg_traits)
if(!(path in negative_traits))
pref.neg_traits -= path
+ continue
if((pref.real_species_id() != SPECIES_ID_CUSTOM) && !(path in everyone_traits))
pref.neg_traits -= path
+
+ for(var/path in pref.id_hidden_traits)
+ var/datum/trait/T = all_traits[path]
+ if(!istype(T) || !T.extra_id_info_optional)
+ pref.id_hidden_traits -= path
+ continue
+ if(!(path in pref.pos_traits + pref.neu_traits + pref.neg_traits))
+ pref.id_hidden_traits -= path
var/datum/species/selected_species = pref.real_species_datum()
if(selected_species.selects_bodytype)
@@ -180,6 +195,23 @@
. += "- [trait.name]"
. += ""
+ var/list/id_traits = list()
+ for(var/path in pref.pos_traits + pref.neg_traits + pref.neu_traits)
+ var/datum/trait/T = all_traits[path]
+ if(istype(T) && T.extra_id_info)
+ id_traits |= T
+
+ if(length(id_traits))
+ . += "ID-visible Traits"
+ . += ""
+ . += "
"
+
. += "Blood Color: " //People that want to use a certain species to have that species traits (xenochimera/promethean/spider) should be able to set their own blood color.
. += "Set Color"
. += "R
"
@@ -253,6 +285,19 @@
pref.neg_traits -= trait
return PREFERENCES_REFRESH
+ else if(href_list["id_info_toggle"])
+ var/datum/trait/trait = all_traits[text2path(href_list["id_info_toggle"])]
+ if(!istype(trait))
+ to_chat(user, SPAN_WARNING("???"))
+ return PREFERENCES_REFRESH
+ if(!(trait.type in pref.id_hidden_traits))
+ pref.id_hidden_traits |= trait.type
+ to_chat(user, SPAN_NOTICE("[trait.name] is now hidden from your ID."))
+ else
+ pref.id_hidden_traits -= trait.type
+ to_chat(user, "[trait.name] will now be shown on your ID. It will read as: \"[trait.extra_id_info]\"")
+ return PREFERENCES_REFRESH
+
else if(href_list["custom_say"])
var/say_choice = sanitize(input(usr, "This word or phrase will appear instead of 'says': [pref.real_name] says, \"Hi.\"", "Custom Say", pref.custom_say) as null|text, 12)
if(say_choice)
diff --git a/code/modules/vore/fluffstuff/custom_items.dm b/code/modules/vore/fluffstuff/custom_items.dm
index 6d71cdef762..0ac75f8d292 100644
--- a/code/modules/vore/fluffstuff/custom_items.dm
+++ b/code/modules/vore/fluffstuff/custom_items.dm
@@ -1114,8 +1114,8 @@
assignment = "Xenobiology Director"
access = list(ACCESS_CENTCOM_GENERAL,ACCESS_CENTCOM_THUNDERDOME,ACCESS_CENTCOM_MEDICAL,ACCESS_CENTCOM_DORMS,ACCESS_CENTCOM_STORAGE,ACCESS_CENTCOM_TELEPORTER,ACCESS_SCIENCE_MAIN,ACCESS_SCIENCE_XENOBIO,ACCESS_ENGINEERING_MAINT,ACCESS_SCIENCE_XENOARCH,ACCESS_SCIENCE_ROBOTICS,ACCESS_SCIENCE_TOXINS,ACCESS_SCIENCE_FABRICATION) //Yes, this looks awful. I tried calling both central and resarch access but it didn't work.
age = 39
- blood_type = "O-"
- sex = "Female"
+ //blood_type = "O-"
+ pronouns = "She/her"
/obj/item/fluff/injector //Injectors. Custom item used to explain wild changes in a mob's body or chemistry.
name = "Injector"
diff --git a/maps/submaps/mountains/crashedcontainmentshuttle.dmm b/maps/submaps/mountains/crashedcontainmentshuttle.dmm
index 677e552b5f4..51324af3cdd 100644
--- a/maps/submaps/mountains/crashedcontainmentshuttle.dmm
+++ b/maps/submaps/mountains/crashedcontainmentshuttle.dmm
@@ -439,13 +439,11 @@
/obj/effect/decal/remains/human,
/obj/item/card/id/syndicate{
age = "\\42";
- blood_type = "\\O+";
desc = "A strange ID card.";
dna_hash = "\[REDACTED]";
- fingerprint_hash = "\\------";
name = "Aaron Presley's ID Card(Delivery Service) ";
registered_name = "Aaron Presley";
- sex = "\\Male"
+ pronouns = "\\He/him"
},
/turf/simulated/shuttle/floor/white,
/area/submap/crashedcontainmentshuttle)
diff --git a/maps/submaps/mountains/crashedcontainmentshuttle_vr.dmm b/maps/submaps/mountains/crashedcontainmentshuttle_vr.dmm
index 44abe47d5fd..d93d3361f57 100644
--- a/maps/submaps/mountains/crashedcontainmentshuttle_vr.dmm
+++ b/maps/submaps/mountains/crashedcontainmentshuttle_vr.dmm
@@ -386,13 +386,11 @@
/obj/effect/decal/remains/human,
/obj/item/card/id/syndicate{
age = "\\42";
- blood_type = "\\O+";
desc = "A strange ID card.";
dna_hash = "\[REDACTED]";
- fingerprint_hash = "\\------";
name = "Aaron Presley's ID Card(Delivery Service) ";
registered_name = "Aaron Presley";
- sex = "\\Male"
+ pronouns = "\\He/him"
},
/turf/simulated/shuttle/floor/white,
/area/submap/crashedcontainmentshuttle)