diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 285a48dca51..c46a75e4ac8 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -486,10 +486,6 @@
#define FLASH_PROTECTION_FLASH 1
#define FLASH_PROTECTION_WELDER 2
-// Roundstart trait system
-
-#define MAX_QUIRKS 6 //The maximum amount of quirks one character can have at roundstart
-
// AI Toggles
#define AI_CAMERA_LUMINOSITY 5
#define AI_VOX // Comment out if you don't want VOX to be enabled and have players download the voice sounds.
diff --git a/code/__DEFINES/~nova_defines/traits/declarations.dm b/code/__DEFINES/~nova_defines/traits/declarations.dm
index de08a0d7378..40d6688773d 100644
--- a/code/__DEFINES/~nova_defines/traits/declarations.dm
+++ b/code/__DEFINES/~nova_defines/traits/declarations.dm
@@ -33,9 +33,6 @@
/// Trait to spawn with a pet in a pet carrier (veteran only)
#define TRAIT_PET_OWNER "pet_owner"
-/// adds -6 quirk to negative quirks for free points.
-#define TRAIT_GIFTED "gifted"
-
//AdditionalEmotes *turf traits
#define TRAIT_WATER_ASPECT "water_aspect"
#define TRAIT_WEBBING_ASPECT "webbing_aspect"
@@ -44,7 +41,7 @@
#define TRAIT_SPARKLE_ASPECT "sparkle_aspect"
// Trait sources
-#define TRAIT_GHOSTROLE "ghostrole" // NOVA EDIT ADDITION -- Ghost Cafe Traits
+#define TRAIT_GHOSTROLE "ghostrole"
/// One can breath under water, you get me?
#define TRAIT_WATER_BREATHING "water_breathing"
diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm
index cf34b7c3df4..f61dea2a5bb 100644
--- a/code/_globalvars/traits/_traits.dm
+++ b/code/_globalvars/traits/_traits.dm
@@ -618,7 +618,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_FLORAL_ASPECT" = TRAIT_FLORAL_ASPECT,
"TRAIT_FREE_GHOST" = TRAIT_FREE_GHOST,
"TRAIT_GHOSTROLE" = TRAIT_GHOSTROLE,
- "TRAIT_GIFTED" = TRAIT_GIFTED,
+
"TRAIT_GLASSBLOWING" = TRAIT_GLASSBLOWING,
"TRAIT_GLOVES" = TRAIT_GLOVES,
"TRAIT_GLUED_ITEM" = TRAIT_GLUED_ITEM,
diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm
index 919df198dab..695c8bce0ac 100644
--- a/code/_globalvars/traits/admin_tooling.dm
+++ b/code/_globalvars/traits/admin_tooling.dm
@@ -296,7 +296,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_FLORAL_ASPECT" = TRAIT_FLORAL_ASPECT,
"TRAIT_FREE_GHOST" = TRAIT_FREE_GHOST,
"TRAIT_GHOSTROLE" = TRAIT_GHOSTROLE,
- "TRAIT_GIFTED" = TRAIT_GIFTED,
"TRAIT_GLASSBLOWING" = TRAIT_GLASSBLOWING,
"TRAIT_GLOVES" = TRAIT_GLOVES,
"TRAIT_GLUED_ITEM" = TRAIT_GLUED_ITEM,
diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm
index f377964700f..a5c88d97dc6 100644
--- a/code/controllers/configuration/entries/game_options.dm
+++ b/code/controllers/configuration/entries/game_options.dm
@@ -445,3 +445,12 @@
default = list("0" = 10, "1" = 10, "2" = 3, "2.5" = 1)
key_mode = KEY_MODE_TEXT
value_mode = VALUE_MODE_NUM
+
+// Configs for the Quirk system
+/// Disables Quirk point balancing for the server and clients.
+/datum/config_entry/flag/disable_quirk_points
+
+/// The maximum amount of positive quirks one character can have at roundstart.
+/datum/config_entry/number/max_positive_quirks
+ default = 6
+ min_val = -1
diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm
index 040276b5596..64606a94be1 100644
--- a/code/controllers/subsystem/processing/quirks.dm
+++ b/code/controllers/subsystem/processing/quirks.dm
@@ -125,10 +125,15 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
var/bonus_quirks = max((length(user.quirks) + rand(-RANDOM_QUIRK_BONUS, RANDOM_QUIRK_BONUS)), MINIMUM_RANDOM_QUIRKS)
var/added_quirk_count = 0 //How many we've added
var/list/quirks_to_add = list() //Quirks we're adding
- var/good_count = 0 //Maximum of 6 good perks
+ var/good_count = 0
var/score //What point score we're at
///Cached list of possible quirks
var/list/possible_quirks = quirks.Copy()
+
+ var/max_positive_quirks = CONFIG_GET(number/max_positive_quirks)
+ if(max_positive_quirks < 0)
+ max_positive_quirks = 6
+
//Create a random list of stuff to start with
while(bonus_quirks > added_quirk_count)
var/quirk = pick(possible_quirks) //quirk is a string
@@ -158,19 +163,20 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
quirks_to_add += quirk
//And have benefits too
- while(score < 0 && good_count <= MAX_QUIRKS)
- if(!length(possible_quirks))//Lets not get stuck
- break
- var/quirk = pick(quirks)
- if(quirk in GLOB.quirk_blacklist) //prevent blacklisted
- possible_quirks -= quirk
- continue
- if(!quirk_points[quirk] > 0) //positive only
- possible_quirks -= quirk
- continue
- good_count++
- score += quirk_points[quirk]
- quirks_to_add += quirk
+ if(max_positive_quirks > 0)
+ while(score < 0 && good_count <= max_positive_quirks)
+ if(!length(possible_quirks))//Lets not get stuck
+ break
+ var/quirk = pick(quirks)
+ if(quirk in GLOB.quirk_blacklist) //prevent blacklisted
+ possible_quirks -= quirk
+ continue
+ if(!(quirk_points[quirk] > 0)) //positive only
+ possible_quirks -= quirk
+ continue
+ good_count++
+ score += quirk_points[quirk]
+ quirks_to_add += quirk
for(var/datum/quirk/quirk as anything in user.quirks)
if(quirk.name in quirks_to_add) //Don't delete ones we keep
@@ -188,6 +194,8 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
/datum/controller/subsystem/processing/quirks/proc/filter_invalid_quirks(list/quirks, list/augments) // NOVA EDIT - AUGMENTS+
var/list/new_quirks = list()
var/list/positive_quirks = list()
+ var/points_enabled = !CONFIG_GET(flag/disable_quirk_points)
+ var/max_positive_quirks = CONFIG_GET(number/max_positive_quirks)
var/balance = 0
var/list/all_quirks = get_quirks()
@@ -224,7 +232,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
var/value = initial(quirk.value)
if (value > 0)
- if (positive_quirks.len == MAX_QUIRKS)
+ if (max_positive_quirks >= 0 && positive_quirks.len == max_positive_quirks)
continue
positive_quirks[quirk_name] = value
@@ -232,7 +240,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
balance += value
new_quirks += quirk_name
- if (balance > 0)
+ if (points_enabled && balance > 0)
var/balance_left_to_remove = balance
for (var/positive_quirk in positive_quirks)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 8aa3258c120..8372b3f1400 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -178,6 +178,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
//NOVA EDIT BEGIN
data["preview_selection"] = preview_pref
+ data["quirk_points_enabled"] = !CONFIG_GET(flag/disable_quirk_points)
data["quirks_balance"] = GetQuirkBalance()
data["positive_quirk_count"] = GetPositiveQuirkCount()
//NOVA EDIT END
@@ -540,6 +541,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
.++
/datum/preferences/proc/validate_quirks()
+ if(CONFIG_GET(flag/disable_quirk_points))
+ return
if(GetQuirkBalance() < 0)
all_quirks = list()
diff --git a/code/modules/client/preferences/middleware/quirks.dm b/code/modules/client/preferences/middleware/quirks.dm
index be8bee46549..f6866f41634 100644
--- a/code/modules/client/preferences/middleware/quirks.dm
+++ b/code/modules/client/preferences/middleware/quirks.dm
@@ -31,8 +31,13 @@
var/list/quirks = SSquirks.get_quirks()
+ var/max_positive_quirks = CONFIG_GET(number/max_positive_quirks)
+ var/positive_quirks_disabled = max_positive_quirks == 0
for (var/quirk_name in quirks)
var/datum/quirk/quirk = quirks[quirk_name]
+ if(positive_quirks_disabled && initial(quirk.value) > 0)
+ continue
+
var/datum/quirk_constant_data/constant_data = GLOB.all_quirk_constant_data[quirk]
var/list/datum/preference/customization_options = constant_data?.get_customization_data()
@@ -48,9 +53,10 @@
)
return list(
- "max_positive_quirks" = MAX_QUIRKS,
+ "max_positive_quirks" = max_positive_quirks,
"quirk_info" = quirk_info,
"quirk_blacklist" = GLOB.quirk_string_blacklist,
+ "points_enabled" = !CONFIG_GET(flag/disable_quirk_points),
)
/datum/preference_middleware/quirks/on_new_character(mob/user)
diff --git a/config/game_options.txt b/config/game_options.txt
index 112835e2d10..d80877383b4 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -582,6 +582,17 @@ NEGATIVE_STATION_TRAITS 1 4
NEGATIVE_STATION_TRAITS 2 2
NEGATIVE_STATION_TRAITS 3 1
+# Uncomment to disable Quirk point balancing for the server and clients.
+# If enabled, players will be able to select positive quirks without first selecting negative quirks.
+# If enabled, randomized Quirks will still use points internally, in order to maintain balance.
+#DISABLE_QUIRK_POINTS
+
+# The maximum amount of positive quirks one character can have at roundstart.
+# If set to -1, then players will be able to select any quantity of positive quirks.
+# If set to 0, then players won't be able to select any positive quirks.
+# If commented-out or undefined, the maximum default is 6.
+MAX_POSITIVE_QUIRKS 6
+
## FF CONFIGS
ROUNDSTART_RACES nabber
ROUNDSTART_RACES teshari_alt
diff --git a/modular_nova/master_files/code/datums/quirks/negative_quirks/gifted.dm b/modular_nova/master_files/code/datums/quirks/negative_quirks/gifted.dm
deleted file mode 100644
index 12ce77b9f19..00000000000
--- a/modular_nova/master_files/code/datums/quirks/negative_quirks/gifted.dm
+++ /dev/null
@@ -1,12 +0,0 @@
-/datum/quirk/gifted
- name = "Gifted"
- desc = "You were born a bit lucky, intelligent, or something in between. You're able to do a little more."
- icon = FA_ICON_DOVE
- quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_HIDE_FROM_SCAN
- value = -6
- mob_trait = TRAIT_GIFTED
- gain_text = span_danger("You feel like you're just a little bit more flexible.")
- lose_text = span_notice("You feel a little less flexible.")
- medical_record_text = "Patient has a history of uncanny fortune."
- hardcore_value = 0
- hidden_quirk = TRUE // FF EDIT: ADDITION - Removing freebie points, staff decision
diff --git a/tgstation.dme b/tgstation.dme
index a8dfd4736e3..1c340f63dac 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -6240,7 +6240,6 @@
#include "modular_nova\master_files\code\datums\quirks\negative_quirks\all_nighter.dm"
#include "modular_nova\master_files\code\datums\quirks\negative_quirks\blooddeficiency.dm"
#include "modular_nova\master_files\code\datums\quirks\negative_quirks\brainproblems.dm"
-#include "modular_nova\master_files\code\datums\quirks\negative_quirks\gifted.dm"
#include "modular_nova\master_files\code\datums\quirks\negative_quirks\heavy_sleeper.dm"
#include "modular_nova\master_files\code\datums\quirks\negative_quirks\narcolepsy.dm"
#include "modular_nova\master_files\code\datums\quirks\negative_quirks\nerve_staple.dm"
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/LimbsPage.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/LimbsPage.tsx
index 44a0e20d35e..da74d6b267a 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/LimbsPage.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/LimbsPage.tsx
@@ -145,7 +145,10 @@ export const AugmentationPage = (props) => {
onSelected={(value) => {
// Since the costs are positive,
// it's added and not substracted
- if (balance + props.limb.costs[value] > 0) {
+ if (
+ data.quirk_points_enabled &&
+ balance + props.limb.costs[value] > 0
+ ) {
return;
}
act('set_limb_aug', {
@@ -198,7 +201,10 @@ export const OrganPage = (props) => {
displayText={props.organ.chosen_organ}
onSelected={(value) => {
// Since the costs are positive, it's added and not substracted
- if (balance + props.organ.costs[value] > 0) {
+ if (
+ data.quirk_points_enabled &&
+ balance + props.organ.costs[value] > 0
+ ) {
return;
}
act('set_organ_aug', {
@@ -245,27 +251,32 @@ export const LimbsPage = (props) => {
width="100%"
/>
-
-
-
-
-
- {balance}
-
+ {data.quirk_points_enabled ? (
+
+ ) : (
+ ''
+ )}
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/QuirksPage.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/QuirksPage.tsx
index 9235a8bf15a..9096bc43a64 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/QuirksPage.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/QuirksPage.tsx
@@ -322,6 +322,7 @@ export function QuirksPage(props) {
max_positive_quirks: maxPositiveQuirks,
quirk_blacklist: quirkBlacklist,
quirk_info: quirkInfo,
+ points_enabled: pointsEnabled,
} = quirks_data.quirks; // NOVA EDIT - Quirks balance refactor
const quirks = Object.entries(quirkInfo);
@@ -342,9 +343,12 @@ export function QuirksPage(props) {
const quirk = quirkInfo[quirkName];
if (quirk.value > 0) {
- if (positiveQuirks >= maxPositiveQuirks) {
+ if (
+ maxPositiveQuirks !== -1 &&
+ positiveQuirks >= maxPositiveQuirks
+ ) {
return "You can't have any more positive quirks!";
- } else if (balance + quirk.value > 0) {
+ } else if (pointsEnabled && balance + quirk.value > 0) {
return 'You need a negative quirk to balance this out!';
}
}
@@ -383,7 +387,7 @@ export function QuirksPage(props) {
const getReasonToNotRemove = (quirkName: string) => {
const quirk = quirkInfo[quirkName];
- if (balance - quirk.value > 0) {
+ if (pointsEnabled && balance - quirk.value > 0) {
return 'You need to remove a positive quirk first!';
}
@@ -395,13 +399,21 @@ export function QuirksPage(props) {
- Positive Quirks
+ {maxPositiveQuirks > 0 ? (
+ Positive Quirks
+ ) : (
+
+ )}
-
- {positiveQuirks} / {maxPositiveQuirks}
-
+ {maxPositiveQuirks > 0 ? (
+
+ {positiveQuirks} / {maxPositiveQuirks}
+
+ ) : (
+
+ )}
@@ -449,11 +461,19 @@ export function QuirksPage(props) {
- Quirk Balance
+ {pointsEnabled ? (
+ Quirk Balance
+ ) : (
+ 0 ? 3.4 : 0} />
+ )}
- {balance}
+ {pointsEnabled ? (
+ {balance}
+ ) : (
+ 0 ? 3.4 : 0} />
+ )}
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/data.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/data.ts
index b7e331bc51d..a3932fa10e6 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/data.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/data.ts
@@ -140,6 +140,7 @@ export type QuirkInfo = {
max_positive_quirks: number;
quirk_info: Record;
quirk_blacklist: string[][];
+ points_enabled: boolean;
};
export enum RandomSetting {
@@ -230,6 +231,7 @@ export type PreferencesMenuData = {
selected_languages: Language[];
unselected_languages: Language[];
total_language_points: number;
+ quirk_points_enabled: number;
quirks_balance: number;
positive_quirk_count: number;
species_restricted_jobs?: string[];