From 4ae9d2c9344e7ef0633cf4b5a68f92bc20597d9d Mon Sep 17 00:00:00 2001
From: nikothedude <59709059+nikothedude@users.noreply.github.com>
Date: Fri, 15 May 2026 19:10:09 -0400
Subject: [PATCH] Partially reverts #4614, leaving record defaults but
separating exploitables and security (#5560)
## About The Pull Request
Partially reverts #4614.
Exploitables, background, and security are now separate.
## Why It's Good For The Game
This was never a good change. Exploitables and sec records hold
completely separate purposes. Sec should not see every single
exploitable node you have, basically. Additionally, some people have
stuff in their exploitables and background they cant access right now.
Exposing them again lets people retrieve them.
## Proof Of Testing
Screenshots/Videos
## Changelog
:cl:
add: Exploitables, background, and security records are now distinct
record fields, instead of being combinced.
/:cl:
---
code/datums/records/manifest.dm | 3 ++-
code/datums/records/record.dm | 4 +++-
code/modules/mob/living/carbon/human/human.dm | 2 ++
.../code/datums/records/record.dm | 2 ++
.../modules/client/preferences/flavor_text.dm | 21 +++++++++++++++++++
.../code/record_manifest.dm | 7 +++++++
.../client/verbs/character_directory.dm | 8 +++++++
.../skyrat/species_features.tsx | 20 ++++++++++++++++--
8 files changed, 63 insertions(+), 4 deletions(-)
diff --git a/code/datums/records/manifest.dm b/code/datums/records/manifest.dm
index 27221f954cc..00c41459b48 100644
--- a/code/datums/records/manifest.dm
+++ b/code/datums/records/manifest.dm
@@ -143,7 +143,8 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new)
locked_dna = record_dna,
mind_ref = person.mind,
// BUBBER EDIT ADDITION BEGIN - Records
- exploitable_information = person_client?.prefs.read_preference(/datum/preference/text/security) || "",
+ exploitable_information = person_client?.prefs.read_preference(/datum/preference/text/exploitable) || "",
+ background_information = person_client?.prefs.read_preference(/datum/preference/text/background) || "",
// BUBBER EDIT END
)
diff --git a/code/datums/records/record.dm b/code/datums/records/record.dm
index c2682bb6ef8..04f3205a755 100644
--- a/code/datums/records/record.dm
+++ b/code/datums/records/record.dm
@@ -170,6 +170,7 @@
datum/mind/mind_ref,
// BUBBER EDIT BEGIN - Records
exploitable_information = "",
+ background_information = "",
)
. = ..()
src.locked_dna = locked_dna
@@ -178,7 +179,8 @@
GLOB.manifest.locked += src
- // BUBBER EDIT BEGIN - Records
+ // BUBBER EDIT BEGIn - Records
+ src.background_information = background_information
src.exploitable_information = exploitable_information
// BUBBER EDIT END
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 38b11b256b3..4ef0dd1ffe1 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -407,6 +407,8 @@
to_chat(usr, "Medical Record: [target_record.past_medical_records]")
if(href_list["genrecords"])
to_chat(usr, "General Record: [target_record.past_general_records]")
+ if(target_locked_record && href_list["bgrecords"])
+ to_chat(usr, "Background information: [target_locked_record.background_information]")
if(isobserver(usr) || usr.mind.can_see_exploitables || usr.mind.has_exploitables_override)
if(target_locked_record && href_list["exprecords"])
to_chat(usr, "Exploitable information: [target_locked_record.exploitable_information]")
diff --git a/modular_skyrat/master_files/code/datums/records/record.dm b/modular_skyrat/master_files/code/datums/records/record.dm
index 95394044d66..a1ce078754f 100644
--- a/modular_skyrat/master_files/code/datums/records/record.dm
+++ b/modular_skyrat/master_files/code/datums/records/record.dm
@@ -11,5 +11,7 @@
var/past_security_records
/datum/record/locked
+ /// Contains their background information.
+ var/background_information
/// Contains their exploitable information.,
var/exploitable_information
diff --git a/modular_skyrat/master_files/code/modules/client/preferences/flavor_text.dm b/modular_skyrat/master_files/code/modules/client/preferences/flavor_text.dm
index 413add1b0cc..2a761150ae1 100644
--- a/modular_skyrat/master_files/code/modules/client/preferences/flavor_text.dm
+++ b/modular_skyrat/master_files/code/modules/client/preferences/flavor_text.dm
@@ -115,3 +115,24 @@
/datum/preference/text/security/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences)
return FALSE
+
+/datum/preference/text/exploitable
+ category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ savefile_identifier = PREFERENCE_CHARACTER
+ savefile_key = "exploitable_info"
+ maximum_value_length = MAX_FLAVOR_LEN
+
+/datum/preference/text/exploitable/create_default_value()
+ return EXPLOITABLE_DEFAULT_TEXT
+
+/datum/preference/text/exploitable/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences)
+ return FALSE
+
+/datum/preference/text/background
+ category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ savefile_identifier = PREFERENCE_CHARACTER
+ savefile_key = "background_info"
+ maximum_value_length = MAX_FLAVOR_LEN
+
+/datum/preference/text/background/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences)
+ return FALSE
diff --git a/modular_skyrat/modules/records_on_examine/code/record_manifest.dm b/modular_skyrat/modules/records_on_examine/code/record_manifest.dm
index 8c076d0eaca..728d6c04ddc 100644
--- a/modular_skyrat/modules/records_on_examine/code/record_manifest.dm
+++ b/modular_skyrat/modules/records_on_examine/code/record_manifest.dm
@@ -86,6 +86,13 @@
if(!isnull(target_record)) // this can be null
to_chat(usr, "Exploitable information: [target_record.exploitable_information]")
+ else if(action == "show_background")
+ var/background_id = params["background_id"]
+ var/datum/record/locked/target_record = find_record(background_id, TRUE)
+ if(!isnull(target_record))
+ to_chat(usr, "Background information: [target_record.background_information]")
+
+
/datum/record_manifest/ui_data(mob/user)
var/list/positions = list()
diff --git a/modular_zubbers/code/modules/client/verbs/character_directory.dm b/modular_zubbers/code/modules/client/verbs/character_directory.dm
index dc457529b6a..57b6da350ec 100644
--- a/modular_zubbers/code/modules/client/verbs/character_directory.dm
+++ b/modular_zubbers/code/modules/client/verbs/character_directory.dm
@@ -194,6 +194,7 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
var/hypno = "Ask"
var/noncon = "Ask"
var/character_ad = ""
+ var/exploitable = ""
var/ref = REF(mob)
//Just in case something we get is not a mob
if(!mob)
@@ -235,6 +236,13 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
noncon = READ_PREFS(mob, choiced/erp_status_nc)
character_ad = READ_PREFS(mob, text/character_ad)
ooc_notes = READ_PREFS(mob, text/ooc_notes)
+ //If the user is an antagonist or Observer, we want them to be able to see exploitables in the Directory.
+ if(user.mind?.has_antag_datum(/datum/antagonist) || isobserver(user))
+ if(exploitable == EXPLOITABLE_DEFAULT_TEXT)
+ exploitable = "Unset"
+ else exploitable = READ_PREFS(mob, text/exploitable)
+ else exploitable = "Obscured"
+ //And finally, we want to get the mob's name, taking into account disguised names.
name = mob.real_name ? mob.name : mob.real_name
directory_mobs.Add(list(list(
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/species_features.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/species_features.tsx
index 3d14ba49a9d..7790f1c40d0 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/species_features.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/species_features.tsx
@@ -88,9 +88,9 @@ export const general_record: Feature = {
};
export const security_record: Feature = {
- name: 'Records - Personnel',
+ name: 'Records - Security',
description:
- 'Privileged information accessible by Security, antags with information, Command and the NTC. \
+ 'Privileged information accessible by Security, Command and the NTC. \
Used to throw these roles a bone, and give more information to work with. \
For employment and criminal history, loyalties and exploitable tidbits, and more.',
component: FeatureTextInput,
@@ -104,6 +104,22 @@ export const medical_record: Feature = {
component: FeatureTextInput,
};
+export const exploitable_info: Feature = {
+ name: 'Records - Exploitable',
+ description:
+ 'Can be IC or OOC. Viewable by certain antagonists/OPFOR users, as well as ghosts. Generally contains \
+ things like weaknesses, strengths, important background, trigger words, etc. It ALSO may contain things like \
+ antagonist preferences, e.g. if you want to be antagonized, by whom, with what, etc.',
+ component: FeatureTextInput,
+};
+
+export const background_info: Feature = {
+ name: 'Records - Background',
+ description:
+ 'Only viewable by yourself and ghosts. You can have whatever you want in here - it may be valuable as a way to orient yourself to what your character is.',
+ component: FeatureTextInput,
+};
+
export const pda_ringer: Feature = {
name: 'PDA Ringer Message',
description: