From 7412614f66b9a8f81bb1eb358dad16ef25200a3b Mon Sep 17 00:00:00 2001
From: Roxy <75404941+TealSeer@users.noreply.github.com>
Date: Sat, 20 Jun 2026 22:14:10 -0400
Subject: [PATCH] Enterprise Resource Planning Tweaks (#5811)
## About The Pull Request
- Readd "Yes - Sub" for NC pref because it got deleted
- Add character gender and attraction to examine text and TGUI box
- Add a separate free use pref, displayed alongside regular ERP pref in
relevant places
## Why It's Good For The Game
Requested by @Rykka-Stormheart
## Proof Of Testing
Screenshots/Videos
## Changelog
:cl:
add: Free use is now a checkbox pref instead of an option in ERP Pref
add: Added character gender and attraction to examine text and popout
fix: Re-added Yes - Sub to NC pref
/:cl:
---
code/__HELPERS/~bubber_helpers/text.dm | 17 +++++++++++
code/modules/mob/living/carbon/examine.dm | 6 +++-
.../client/preferences/erp_preferences.dm | 29 ++++++++++++++++++-
.../modules/mob/living/silicon/examine.dm | 6 +++-
.../code/modules/examine_tgui/examine_tgui.dm | 9 +++++-
tgstation.dme | 1 +
.../character_preferences/skyrat/genitals.tsx | 5 ++++
7 files changed, 69 insertions(+), 4 deletions(-)
create mode 100644 code/__HELPERS/~bubber_helpers/text.dm
diff --git a/code/__HELPERS/~bubber_helpers/text.dm b/code/__HELPERS/~bubber_helpers/text.dm
new file mode 100644
index 00000000000..af6e13cb6f5
--- /dev/null
+++ b/code/__HELPERS/~bubber_helpers/text.dm
@@ -0,0 +1,17 @@
+/// Takes gender and attraction strings and returns a string with the format Gender/Sexuality: arg1, arg2
+/// if either value is Unset, remove that part of the string, if both are Unset, return an empty string
+/proc/get_gender_attraction_string(gender, attraction)
+ var/gender_set = gender != "Unset"
+ var/attraction_set = attraction != "Unset"
+ if(!gender_set && !attraction_set)
+ return ""
+
+ var/list/label = list()
+ var/list/values = list()
+ if(gender_set)
+ label += "Gender"
+ values += gender
+ if(attraction_set)
+ label += "Sexuality"
+ values += attraction
+ return "[english_list(label, and_text = "/")]: [span_revenboldnotice(english_list(values, and_text = ", "))]"
diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm
index 6799413a338..ab6e72af4bb 100644
--- a/code/modules/mob/living/carbon/examine.dm
+++ b/code/modules/mob/living/carbon/examine.dm
@@ -327,9 +327,13 @@
if(client)
var/erp_status_pref = client.prefs.read_preference(/datum/preference/choiced/erp_status)
+ var/free_use_pref = client.prefs.read_preference(/datum/preference/toggle/erp_free_use)
if(erp_status_pref && !CONFIG_GET(flag/disable_erp_preferences))
. += EXAMINE_SECTION_BREAK
- . += span_info("ERP Status: [span_revenboldnotice(erp_status_pref)]")
+ . += span_info("ERP Status: [span_revenboldnotice(erp_status_pref)][free_use_pref ? "[span_revenboldnotice(" - Free Use")]" : ""]")
+ var/line = get_gender_attraction_string(client.prefs.read_preference(/datum/preference/choiced/display_gender), client.prefs.read_preference(/datum/preference/choiced/attraction))
+ if(line)
+ . += span_info(line)
// SKYRAT EDIT END
SEND_SIGNAL(src, COMSIG_ATOM_EXAMINE, user, .)
diff --git a/modular_skyrat/master_files/code/modules/client/preferences/erp_preferences.dm b/modular_skyrat/master_files/code/modules/client/preferences/erp_preferences.dm
index 5a47ae3c3f7..04fa03e2032 100644
--- a/modular_skyrat/master_files/code/modules/client/preferences/erp_preferences.dm
+++ b/modular_skyrat/master_files/code/modules/client/preferences/erp_preferences.dm
@@ -155,7 +155,6 @@
"Ask (L)OOC",
"No",
"Yes",
- "Free Use",
)
/datum/preference/choiced/erp_status/create_default_value()
@@ -180,6 +179,33 @@
/datum/preference/choiced/erp_status/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences)
return FALSE
+/datum/preference/toggle/erp_free_use
+ category = PREFERENCE_CATEGORY_OOC_PREFS
+ savefile_identifier = PREFERENCE_CHARACTER
+ savefile_key = "erp_free_use"
+
+/datum/preference/toggle/erp_free_use/is_accessible(datum/preferences/preferences)
+ if (!..(preferences))
+ return FALSE
+
+ if(CONFIG_GET(flag/disable_erp_preferences))
+ return FALSE
+
+ return preferences.read_preference(/datum/preference/toggle/master_erp_preferences)
+
+/datum/preference/toggle/erp_free_use/deserialize(input, datum/preferences/preferences)
+ if(CONFIG_GET(flag/disable_erp_preferences))
+ return FALSE
+ if(!preferences.read_preference(/datum/preference/toggle/master_erp_preferences))
+ return FALSE
+ return ..()
+
+/datum/preference/toggle/erp_free_use/create_default_value()
+ return FALSE
+
+/datum/preference/toggle/erp_free_use/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences)
+ return FALSE
+
/datum/preference/choiced/erp_status_nc
category = PREFERENCE_CATEGORY_OOC_PREFS
savefile_identifier = PREFERENCE_CHARACTER
@@ -193,6 +219,7 @@
"Yes",
"Yes - Dom",
"Yes - Switch",
+ "Yes - Sub",
)
/datum/preference/choiced/erp_status_nc/create_default_value()
diff --git a/modular_skyrat/modules/customization/modules/mob/living/silicon/examine.dm b/modular_skyrat/modules/customization/modules/mob/living/silicon/examine.dm
index bfc77e49756..16d7d0ee735 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/silicon/examine.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/silicon/examine.dm
@@ -15,8 +15,12 @@
if(client)
var/erp_status_pref = client.prefs.read_preference(/datum/preference/choiced/erp_status)
+ var/free_use_pref = client.prefs.read_preference(/datum/preference/toggle/erp_free_use)
if(erp_status_pref && !CONFIG_GET(flag/disable_erp_preferences))
- . += span_notice("ERP STATUS: [erp_status_pref]")
+ . += span_info("ERP Status: [span_revenboldnotice(erp_status_pref)][free_use_pref ? "[span_revenboldnotice(" - Free Use")]" : ""]")
+ var/line = get_gender_attraction_string(client.prefs.read_preference(/datum/preference/choiced/display_gender), client.prefs.read_preference(/datum/preference/choiced/attraction))
+ if(line)
+ . += span_info(line)
if(temporary_flavor_text)
if(length_char(temporary_flavor_text) <= 40)
. += span_notice("They look different than usual: [temporary_flavor_text]")
diff --git a/modular_zubbers/code/modules/examine_tgui/examine_tgui.dm b/modular_zubbers/code/modules/examine_tgui/examine_tgui.dm
index 4d50696ec97..ab23fc0834a 100644
--- a/modular_zubbers/code/modules/examine_tgui/examine_tgui.dm
+++ b/modular_zubbers/code/modules/examine_tgui/examine_tgui.dm
@@ -72,6 +72,8 @@
var/art_ref_nsfw = preferences?.read_preference(/datum/preference/toggle/art_ref_nsfw)
var/character_ad = ""
+ var/attraction = preferences?.read_preference(/datum/preference/choiced/attraction)
+ var/display_gender = preferences?.read_preference(/datum/preference/choiced/display_gender)
var/emote_length = preferences?.read_preference(/datum/preference/choiced/emote_length)
var/approach = preferences?.read_preference(/datum/preference/choiced/approach_pref)
var/furries = preferences?.read_preference(/datum/preference/choiced/directory_character_prefs/furry_pref)
@@ -85,17 +87,22 @@
if(preferences)
if(preferences.read_preference(/datum/preference/toggle/master_erp_preferences))
var/e_prefs = preferences.read_preference(/datum/preference/choiced/erp_status)
+ var/e_prefs_free_use = preferences.read_preference(/datum/preference/toggle/erp_free_use)
var/e_prefs_hypno = preferences.read_preference(/datum/preference/choiced/erp_status_hypno)
var/e_prefs_v = preferences.read_preference(/datum/preference/choiced/erp_status_v)
var/e_prefs_nc = preferences.read_preference(/datum/preference/choiced/erp_status_nc)
var/e_prefs_mechanical = preferences.read_preference(/datum/preference/choiced/erp_status_mechanics)
- ooc_notes += "ERP: [e_prefs]\n"
+ ooc_notes += "ERP: [e_prefs][e_prefs_free_use ? " - Free Use" : ""]\n"
ooc_notes += "Hypnosis: [e_prefs_hypno]\n"
ooc_notes += "Vore: [e_prefs_v]\n"
ooc_notes += "Non-Con: [e_prefs_nc]\n"
ooc_notes += "ERP Mechanics: [e_prefs_mechanical]\n"
ooc_notes += "\n"
+ if(display_gender != "Unset")
+ character_ad += "Gender: [display_gender]\n"
+ if(attraction != "Unset")
+ character_ad += "Sexuality: [attraction]\n"
character_ad += "Preferred Emote Length: [emote_length]\n"
character_ad += "How to Approach: [approach]\n"
character_ad += "Furries: [furries] | Scalies: [scalies] | Other: [others]\n"
diff --git a/tgstation.dme b/tgstation.dme
index c4475b6921e..f9912fa9574 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -697,6 +697,7 @@
#include "code\__HELPERS\~bubber_helpers\areas.dm"
#include "code\__HELPERS\~bubber_helpers\lists.dm"
#include "code\__HELPERS\~bubber_helpers\mobs.dm"
+#include "code\__HELPERS\~bubber_helpers\text.dm"
#include "code\__HELPERS\~bubber_helpers\virus.dm"
#include "code\__HELPERS\~skyrat_helpers\is_helpers.dm"
#include "code\__HELPERS\~skyrat_helpers\level_traits.dm"
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/genitals.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/genitals.tsx
index ea24962fe23..326d95faf84 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/genitals.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/genitals.tsx
@@ -327,3 +327,8 @@ export const erp_status_pref_mechanics: FeatureChoiced = {
name: 'ERP Mechanical Status',
component: FeatureDropdownInput,
};
+
+export const erp_free_use: FeatureToggle = {
+ name: 'ERP Free Use Status',
+ component: CheckboxInput,
+};