From d8b023774e7f7d7965af1069a8657426aaa03ce9 Mon Sep 17 00:00:00 2001 From: AnturK Date: Sun, 30 Jun 2019 05:07:21 +0200 Subject: [PATCH] Quirk preferences fixes (#44823) Removes the useless split by value lists. Updates savefile after removing invalid quirks. I'd prefer usual savefile validation but quirk lists are built pretty late. Other solution would be hooking all prefs to after quirk SS initializes, this seems less intrusive if ugly but I'm open to alternative suggestions. --- .../subsystem/processing/quirks.dm | 5 ++ code/modules/client/preferences.dm | 59 +++++++------------ code/modules/client/preferences_savefile.dm | 9 --- 3 files changed, 26 insertions(+), 47 deletions(-) diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index bf003d0d470..ce3ab89472e 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -30,9 +30,14 @@ PROCESSING_SUBSYSTEM_DEF(quirks) quirk_points[initial(T.name)] = initial(T.value) /datum/controller/subsystem/processing/quirks/proc/AssignQuirks(mob/living/user, client/cli, spawn_effects) + var/badquirk = FALSE for(var/V in cli.prefs.all_quirks) var/datum/quirk/Q = quirks[V] if(Q) user.add_quirk(Q, spawn_effects) else stack_trace("Invalid quirk \"[V]\" in client [cli.ckey] preferences") + cli.prefs.all_quirks -= V + badquirk = TRUE + if(badquirk) + cli.prefs.save_character() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index f6d22b41d1f..f37c72d740d 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -72,10 +72,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/preferred_ai_core_display = "Blue" var/prefered_security_department = SEC_DEPT_RANDOM - //Quirk list - var/list/positive_quirks = list() - var/list/negative_quirks = list() - var/list/neutral_quirks = list() + //Quirk list var/list/all_quirks = list() //Job preferences 2.0 - indexed by job title , no key or value implies never @@ -835,7 +832,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(!SSquirks.quirks.len) dat += "The quirk subsystem hasn't finished initializing, please hold..." dat += "
Done

" - else dat += "
Choose quirk setup

" dat += "
Left-click to add or remove quirks. You need negative quirks to have positive ones.
\ @@ -843,7 +839,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "
Done
" dat += "
" dat += "
Current quirks: [all_quirks.len ? all_quirks.Join(", ") : "None"]
" - dat += "
[positive_quirks.len] / [MAX_QUIRKS] max positive quirks
\ + dat += "
[GetPositiveQuirkCount()] / [MAX_QUIRKS] max positive quirks
\ Quirk balance remaining: [GetQuirkBalance()]

" for(var/V in SSquirks.quirks) var/datum/quirk/T = SSquirks.quirks[V] @@ -893,6 +889,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) bal -= initial(T.value) return bal +/datum/preferences/proc/GetPositiveQuirkCount() + . = 0 + for(var/q in all_quirks) + if(SSquirks.quirk_points[q] > 0) + .++ + /datum/preferences/Topic(href, href_list, hsrc) //yeah, gotta do this I guess.. . = ..() if(href_list["close"]) @@ -959,42 +961,23 @@ GLOBAL_LIST_EMPTY(preferences_datums) to_chat(user, "[quirk] is incompatible with [Q].") return var/value = SSquirks.quirk_points[quirk] - if(value == 0) - if(quirk in neutral_quirks) - neutral_quirks -= quirk - all_quirks -= quirk - else - neutral_quirks += quirk - all_quirks += quirk + var/balance = GetQuirkBalance() + if(quirk in all_quirks) + if(balance + value < 0) + to_chat(user, "Refunding this would cause you to go below your balance!") + return + all_quirks -= quirk else - var/balance = GetQuirkBalance() - if(quirk in positive_quirks) - positive_quirks -= quirk - all_quirks -= quirk - else if(quirk in negative_quirks) - if(balance + value < 0) - to_chat(user, "Refunding this would cause you to go below your balance!") - return - negative_quirks -= quirk - all_quirks -= quirk - else if(value > 0) - if(positive_quirks.len >= MAX_QUIRKS) - to_chat(user, "You can't have more than [MAX_QUIRKS] positive quirks!") - return - if(balance - value < 0) - to_chat(user, "You don't have enough balance to gain this quirk!") - return - positive_quirks += quirk - all_quirks += quirk - else - negative_quirks += quirk - all_quirks += quirk + if(GetPositiveQuirkCount() >= MAX_QUIRKS) + to_chat(user, "You can't have more than [MAX_QUIRKS] positive quirks!") + return + if(balance - value < 0) + to_chat(user, "You don't have enough balance to gain this quirk!") + return + all_quirks += quirk SetQuirks(user) if("reset") all_quirks = list() - positive_quirks = list() - negative_quirks = list() - neutral_quirks = list() SetQuirks(user) else SetQuirks(user) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 763caa72bef..b895e423f1d 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -323,9 +323,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Quirks S["all_quirks"] >> all_quirks - S["positive_quirks"] >> positive_quirks - S["negative_quirks"] >> negative_quirks - S["neutral_quirks"] >> neutral_quirks //try to fix any outdated data if necessary if(needs_update >= 0) @@ -398,9 +395,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car job_preferences -= j all_quirks = SANITIZE_LIST(all_quirks) - positive_quirks = SANITIZE_LIST(positive_quirks) - negative_quirks = SANITIZE_LIST(negative_quirks) - neutral_quirks = SANITIZE_LIST(neutral_quirks) return TRUE @@ -460,9 +454,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Quirks WRITE_FILE(S["all_quirks"] , all_quirks) - WRITE_FILE(S["positive_quirks"] , positive_quirks) - WRITE_FILE(S["negative_quirks"] , negative_quirks) - WRITE_FILE(S["neutral_quirks"] , neutral_quirks) return TRUE