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 {