diff --git a/code/__DEFINES/~~bubber_defines/quirk_whitelist.dm b/code/__DEFINES/~~bubber_defines/quirk_whitelist.dm
new file mode 100644
index 00000000000..c699b9d07cc
--- /dev/null
+++ b/code/__DEFINES/~~bubber_defines/quirk_whitelist.dm
@@ -0,0 +1,4 @@
+// Modular file for whitelist bitflag defines
+
+/// Quirk only applicable to a roundstartslime
+#define QUIRK_SLIMEPERSON_ONLY (1<<0)
diff --git a/code/__DEFINES/~~bubber_defines/traits.dm b/code/__DEFINES/~~bubber_defines/traits.dm
new file mode 100644
index 00000000000..ec675566419
--- /dev/null
+++ b/code/__DEFINES/~~bubber_defines/traits.dm
@@ -0,0 +1 @@
+#define TRAIT_HYDROPHILIC "hydrophilic"
diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm
index 7f96f90c0a9..0d19420aa39 100644
--- a/code/controllers/subsystem/processing/quirks.dm
+++ b/code/controllers/subsystem/processing/quirks.dm
@@ -38,6 +38,13 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
//SKYRAT EDIT ADDITION END
)
+ //BUBBER EDIT ADDITION START - Species quirks
+ /// A list of quirks that can only be used by a certain species. Format: list(quirk, species define)
+ var/static/list/quirk_species_whitelist = list(
+ list("Hydrophilic", "[SPECIES_SLIMESTART]")
+ )
+ //BUBBER EDIT ADDITION END
+
/datum/controller/subsystem/processing/quirks/Initialize()
get_quirks()
return SS_INIT_SUCCESS
diff --git a/code/datums/quirks/_quirk.dm b/code/datums/quirks/_quirk.dm
index 85885e62127..8655b4f0dbc 100644
--- a/code/datums/quirks/_quirk.dm
+++ b/code/datums/quirks/_quirk.dm
@@ -9,6 +9,8 @@
var/value = 0
/// Flags related to this quirk.
var/quirk_flags = QUIRK_HUMAN_ONLY
+ /// Flags related to species whitelists.
+ var/quirk_whitelist_flags //BUBBER EDIT - Species whitelists // Whitelist bitflags in code/__DEFINES/~~bubber_defines/quirk_whitelist.dm
/// Reference to the mob currently tied to this quirk datum. Quirks are not singletons.
var/mob/living/quirk_holder
/// Text displayed when this quirk is assigned to a mob (and not transferred)
@@ -67,6 +69,12 @@
if(quirk_holder)
CRASH("Attempted to add quirk to a holder when it already has a holder.")
+ //BUBBER EDIT ADDITION START - Species quirks
+ //We silently fail if a whitelisted quirk *somehow* got into someone's preferences.
+ if(quirk_whitelist_flags & QUIRK_SLIMEPERSON_ONLY && !isroundstartslime(new_holder))
+ CRASH("Attempted to add quirk [name] to [quirk_holder], but the species is ineligible for it!")
+ //BUBBER EDIT ADDITION END
+
quirk_holder = new_holder
quirk_holder.quirks += src
// If we weren't passed a client source try to use a present one
diff --git a/code/modules/client/preferences/middleware/quirks.dm b/code/modules/client/preferences/middleware/quirks.dm
index cf6fb2e0d80..22020129b1a 100644
--- a/code/modules/client/preferences/middleware/quirks.dm
+++ b/code/modules/client/preferences/middleware/quirks.dm
@@ -45,6 +45,7 @@
"max_positive_quirks" = MAX_QUIRKS,
"quirk_info" = quirk_info,
"quirk_blacklist" = SSquirks.quirk_blacklist,
+ "quirk_species_whitelist" = SSquirks.quirk_species_whitelist, //BUBBER EDIT - Species quirks
)
/datum/preference_middleware/quirks/on_new_character(mob/user)
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index bcc2bbae7f9..897f53db308 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -262,6 +262,13 @@
/datum/reagent/water/expose_mob(mob/living/exposed_mob, methods = TOUCH, reac_volume)//Splashing people with water can help put them out!
. = ..()
if(methods & TOUCH)
+ //BUBBER EDIT ADDITION START - Species quirks; Hydrophilic trait
+ if(HAS_TRAIT(exposed_mob, TRAIT_HYDROPHILIC))
+ exposed_mob.blood_volume = max(exposed_mob.blood_volume - 30, 0) //So we don't end up with slimes going to -2535% blood.
+ to_chat(exposed_mob, span_warning("The water causes you to melt away!"))
+ return
+ //BUBBER EDIT ADDITION END
+
exposed_mob.extinguish_mob() // extinguish removes all fire stacks
exposed_mob.adjust_wet_stacks(reac_volume * WATER_TO_WET_STACKS_FACTOR_TOUCH) // Water makes you wet, at a 50% water-to-wet-stacks ratio. Which, in turn, gives you some mild protection from being set on fire!
diff --git a/modular_zubbers/code/datums/bubber_quirks/hydrophilic.dm b/modular_zubbers/code/datums/bubber_quirks/hydrophilic.dm
new file mode 100644
index 00000000000..08742a9ec67
--- /dev/null
+++ b/modular_zubbers/code/datums/bubber_quirks/hydrophilic.dm
@@ -0,0 +1,12 @@
+/datum/quirk/hydrophilic
+ name = "Hydrophilic"
+ desc = "(Slimeperson only) Your molecules are highly hydrophilic - or, in layman's terms, dissolve very well in water. You should probably stay away from it..."
+ icon = "bug" // I can't be asked to make an icon for this, my spritework sucks.
+ value = 0
+ quirk_flags = QUIRK_HUMAN_ONLY
+ quirk_whitelist_flags = QUIRK_SLIMEPERSON_ONLY
+ gain_text = "You get the feeling you should stay away from water..."
+ lose_text = "Somehow, you feel as if water is no longer dangerous."
+ medical_record_text = "Patient scans indicate extreme hydrophilicity."
+ hardcore_value = 0
+ mob_trait = TRAIT_HYDROPHILIC
diff --git a/tgstation.dme b/tgstation.dme
index c815590861a..e14bd345ed9 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -388,6 +388,8 @@
#include "code\__DEFINES\~skyrat_defines\_HELPERS\atmos_mapping_helpers.dm"
#include "code\__DEFINES\~skyrat_defines\_HELPERS\lighting.dm"
#include "code\__DEFINES\~~bubber_defines\access.dm"
+#include "code\__DEFINES\~~bubber_defines\quirk_whitelist.dm"
+#include "code\__DEFINES\~~bubber_defines\traits.dm"
#include "code\__HELPERS\_auxtools_api.dm"
#include "code\__HELPERS\_lists.dm"
#include "code\__HELPERS\_planes.dm"
@@ -6693,6 +6695,7 @@
#include "modular_skyrat\modules\xenos_skyrat_redo\code\xeno_types\spitter.dm"
#include "modular_skyrat\modules\xenos_skyrat_redo\code\xeno_types\warrior.dm"
#include "modular_zubbers\code\datums\ert.dm"
+#include "modular_zubbers\code\datums\bubber_quirks\hydrophilic.dm"
#include "modular_zubbers\code\datums\id_trim\jobs.dm"
#include "modular_zubbers\code\game\area\areas\station.dm"
#include "modular_zubbers\code\game\objects\effects\landmarks.dm"
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/QuirksPage.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/QuirksPage.tsx
index 16b5f20bf61..c5ec6198f62 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/QuirksPage.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/QuirksPage.tsx
@@ -148,6 +148,8 @@ export const QuirksPage = (props, context) => {
const {
max_positive_quirks: maxPositiveQuirks,
quirk_blacklist: quirkBlacklist,
+ // BUBBER EDIT ADDITION - Species quirks
+ quirk_species_whitelist: quirkSpeciesWhitelist,
quirk_info: quirkInfo,
} = quirks_data.quirks; // SKYRAT EDIT - Quirks balance refactor
@@ -201,6 +203,29 @@ export const QuirksPage = (props, context) => {
}
}
+ // BUBBER EDIT ADDITION START - Species quirks
+
+ // Iterate through all whitelists
+
+ for (const whitelist of quirkSpeciesWhitelist) {
+ const currentSpeciesName = data.character_preferences.misc.species;
+
+ // Format: Quirk ([0]), Species define ([1])
+ const whitelistSpeciesName = whitelist[1];
+ // Quirk is not in the whitelisted ones, continue to next list
+ if (whitelist.indexOf(quirk.name) === -1) {
+ continue;
+ }
+
+ // If the selected species is NOT in the list, do not give the quirk
+ // Otherwise, give the quirk
+ if (whitelist.indexOf(currentSpeciesName) === -1) {
+ return `This quirk can only be taken by ${whitelistSpeciesName}!`;
+ }
+ }
+
+ // BUBBER EDIT ADDITION END
+
return undefined;
};
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/data.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/data.ts
index 3d6d5734316..db81f408636 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/data.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/data.ts
@@ -133,6 +133,7 @@ export type QuirkInfo = {
max_positive_quirks: number;
quirk_info: Record;
quirk_blacklist: string[][];
+ quirk_species_whitelist: string[][]; // BUBBER EDIT ADDITION - Species quirks
};
export enum RandomSetting {