From a7f473d611f98dc67d842ebd3bf01538548871de Mon Sep 17 00:00:00 2001 From: spookydonut Date: Sun, 20 Aug 2023 02:21:32 +0800 Subject: [PATCH] Use typepaths for the quirk blacklist (#77727) ## About The Pull Request The string list is awful for maintainability and is the reason the filter_invalid_quirks() proc wouldn't work properly. randomise_quirks() is still broken though. ## Why It's Good For The Game ## Changelog :cl: fix: Incompatible quirks in existing savefiles shouldn't be possible anymore. /:cl: --- .../subsystem/processing/quirks.dm | 66 +++++++++++-------- .../client/preferences/middleware/quirks.dm | 2 +- .../mob/dead/new_player/preferences_setup.dm | 2 +- 3 files changed, 41 insertions(+), 29 deletions(-) diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index 922f7c6b370..62b72cad300 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -1,6 +1,41 @@ #define EXP_ASSIGN_WAYFINDER 1200 #define RANDOM_QUIRK_BONUS 3 #define MINIMUM_RANDOM_QUIRKS 3 + +// Shifted to glob so they are generated at world start instead of risking players doing preference stuff before the subsystem inits +GLOBAL_LIST_INIT_TYPED(quirk_blacklist, /list/datum/quirk, list( + list(/datum/quirk/item_quirk/blindness, /datum/quirk/item_quirk/nearsighted), + list(/datum/quirk/jolly, /datum/quirk/depression, /datum/quirk/apathetic, /datum/quirk/hypersensitive), + list(/datum/quirk/no_taste, /datum/quirk/vegetarian, /datum/quirk/deviant_tastes, /datum/quirk/gamer), + list(/datum/quirk/pineapple_liker, /datum/quirk/pineapple_hater, /datum/quirk/gamer), + list(/datum/quirk/alcohol_tolerance, /datum/quirk/light_drinker), + list(/datum/quirk/item_quirk/clown_enjoyer, /datum/quirk/item_quirk/mime_fan, /datum/quirk/item_quirk/pride_pin), + list(/datum/quirk/bad_touch, /datum/quirk/friendly), + list(/datum/quirk/extrovert, /datum/quirk/introvert), + list(/datum/quirk/prosthetic_limb, /datum/quirk/quadruple_amputee, /datum/quirk/body_purist), + list(/datum/quirk/prosthetic_organ, /datum/quirk/tin_man, /datum/quirk/body_purist), + list(/datum/quirk/quadruple_amputee, /datum/quirk/paraplegic, /datum/quirk/hemiplegic), + list(/datum/quirk/quadruple_amputee, /datum/quirk/frail), + list(/datum/quirk/social_anxiety, /datum/quirk/mute), + list(/datum/quirk/mute, /datum/quirk/softspoken), + list(/datum/quirk/poor_aim, /datum/quirk/bighands), + list(/datum/quirk/bilingual, /datum/quirk/foreigner), + list(/datum/quirk/spacer_born, /datum/quirk/paraplegic, /datum/quirk/item_quirk/settler), + list(/datum/quirk/photophobia, /datum/quirk/nyctophobia), + list(/datum/quirk/item_quirk/settler, /datum/quirk/freerunning), +)) + +GLOBAL_LIST_INIT(quirk_string_blacklist, generate_quirk_string_blacklist()) + +/proc/generate_quirk_string_blacklist() + var/list/string_blacklist = list() + for(var/blacklist in GLOB.quirk_blacklist) + var/list/string_list = list() + for(var/datum/quirk/typepath as anything in blacklist) + string_list += initial(typepath.name) + string_blacklist += list(string_list) + return string_blacklist + //Used to process and handle roundstart quirks // - Quirk strings are used for faster checking in code // - Quirk datums are stored and hold different effects, as well as being a vector for applying trait string @@ -16,29 +51,6 @@ PROCESSING_SUBSYSTEM_DEF(quirks) ///An assoc list of quirks that can be obtained as a hardcore character, and their hardcore value. var/list/hardcore_quirks = list() - /// A list of quirks that can not be used with each other. Format: list(quirk1,quirk2),list(quirk3,quirk4) - var/static/list/quirk_blacklist = list( - list("Blind", "Nearsighted"), - list("Jolly", "Depression", "Apathetic", "Hypersensitive"), - list("Ageusia", "Vegetarian", "Deviant Tastes", "Gamer"), - list("Ananas Affinity", "Ananas Aversion", "Gamer"), - list("Alcohol Tolerance", "Light Drinker"), - list("Clown Enjoyer", "Mime Fan", "Pride Pin"), - list("Bad Touch", "Friendly"), - list("Extrovert", "Introvert"), - list("Prosthetic Limb", "Quadruple Amputee", "Body Purist"), - list("Prosthetic Organ", "Tin Man", "Body Purist"), - list("Quadruple Amputee", "Paraplegic", "Hemiplegic"), - list("Quadruple Amputee", "Frail"), - list("Social Anxiety", "Mute"), - list("Mute", "Soft-Spoken"), - list("Stormtrooper Aim", "Big Hands"), - list("Bilingual", "Foreigner"), - list("Spacer", "Paraplegic", "Settler"), - list("Photophobia", "Nyctophobia"), - list("Settler", "Freerunning"), - ) - /datum/controller/subsystem/processing/quirks/Initialize() get_quirks() return SS_INIT_SUCCESS @@ -98,7 +110,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) //Create a random list of stuff to start with while(bonus_quirks > added_quirk_count) var/quirk = pick(possible_quirks) //quirk is a string - if(quirk in quirk_blacklist) //prevent blacklisted + if(quirk in GLOB.quirk_blacklist) //prevent blacklisted possible_quirks -= quirk continue if(quirk_points[quirk] > 0) @@ -113,7 +125,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) if(!length(possible_quirks))//Lets not get stuck break var/quirk = pick(quirks) - if(quirk in quirk_blacklist) //prevent blacklisted + if(quirk in GLOB.quirk_blacklist) //prevent blacklisted possible_quirks -= quirk continue if(!quirk_points[quirk] < 0)//negative only @@ -128,7 +140,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) if(!length(possible_quirks))//Lets not get stuck break var/quirk = pick(quirks) - if(quirk in quirk_blacklist) //prevent blacklisted + if(quirk in GLOB.quirk_blacklist) //prevent blacklisted possible_quirks -= quirk continue if(!quirk_points[quirk] > 0) //positive only @@ -168,7 +180,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) var/blacklisted = FALSE - for (var/list/blacklist as anything in quirk_blacklist) + for (var/list/blacklist as anything in GLOB.quirk_blacklist) if (!(quirk in blacklist)) continue diff --git a/code/modules/client/preferences/middleware/quirks.dm b/code/modules/client/preferences/middleware/quirks.dm index 2c741c67f10..a3634dec35a 100644 --- a/code/modules/client/preferences/middleware/quirks.dm +++ b/code/modules/client/preferences/middleware/quirks.dm @@ -43,7 +43,7 @@ return list( "max_positive_quirks" = MAX_QUIRKS, "quirk_info" = quirk_info, - "quirk_blacklist" = SSquirks.quirk_blacklist, + "quirk_blacklist" = GLOB.quirk_string_blacklist, ) /datum/preference_middleware/quirks/on_new_character(mob/user) diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index 665ebff0684..c86155e8295 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -55,7 +55,7 @@ var/datum/quirk/picked_quirk = pick(available_hardcore_quirks) var/picked_quirk_blacklisted = FALSE - for(var/bl in SSquirks.quirk_blacklist) //Check if the quirk is blacklisted with our current quirks. quirk_blacklist is a list of lists. + for(var/bl in GLOB.quirk_blacklist) //Check if the quirk is blacklisted with our current quirks. quirk_blacklist is a list of lists. var/list/blacklist = bl if(!(picked_quirk in blacklist)) continue