diff --git a/code/game/dna/genes/gene.dm b/code/game/dna/genes/gene.dm index 7f61e5b7ef..209d998bac 100644 --- a/code/game/dna/genes/gene.dm +++ b/code/game/dna/genes/gene.dm @@ -101,23 +101,11 @@ continue // check trait if not. CONFLICT-O-TRON ENGAGE - var/datum/trait/instance_test = GLOB.all_traits[P] - if(path in instance_test.excludes) + if(check_trait_conflict(linked_trait, GLOB.all_traits[P])) conflict_traits |= P has_conflict = TRUE continue - for(var/V in linked_trait.var_changes) - if(V == "flags") - continue - if(V in instance_test.var_changes) - conflict_traits |= P - has_conflict = TRUE - continue - for(var/V in linked_trait.var_changes_pref) - if(V in instance_test.var_changes_pref) - conflict_traits |= P - has_conflict = TRUE - continue + return has_conflict /datum/gene/trait/activate(var/mob/M, var/connected, var/mut_flags) diff --git a/code/modules/client/preference_setup/general/12_traits.dm b/code/modules/client/preference_setup/general/12_traits.dm index 9f18725d7e..b40d09ed71 100644 --- a/code/modules/client/preference_setup/general/12_traits.dm +++ b/code/modules/client/preference_setup/general/12_traits.dm @@ -381,24 +381,11 @@ if(trait_choice in (pref.pos_traits + pref.neu_traits + pref.neg_traits)) conflict = instance.name - varconflict: - for(var/P in (pref.pos_traits + pref.neu_traits + pref.neg_traits)) - var/datum/trait/instance_test = GLOB.all_traits[P] - if(path in instance_test.excludes) - conflict = instance_test.name - break varconflict - - for(var/V in instance.var_changes) - if(V == "flags") - continue - if(V in instance_test.var_changes) - conflict = instance_test.name - break varconflict - - for(var/V in instance.var_changes_pref) - if(V in instance_test.var_changes_pref) - conflict = instance_test.name - break varconflict + for(var/P in (pref.pos_traits + pref.neu_traits + pref.neg_traits)) + var/datum/trait/other_trait = GLOB.all_traits[P] + if(check_trait_conflict(instance, other_trait)) + conflict = other_trait.name + break if(conflict) tgui_alert_async(user, "You cannot take this trait and [conflict] at the same time. Please remove that trait, or pick another trait to add.", "Error") @@ -408,6 +395,23 @@ mylist[path] = instance.get_default_prefs() return TOPIC_REFRESH +/// Compare traits and return TRUE if the traits alter the same vars or would conflict through some other method, such as their exclusion list. +/proc/check_trait_conflict(datum/trait/our_trait, datum/trait/other_trait) + if(our_trait.type in other_trait.excludes) + return TRUE + + for(var/V in our_trait.var_changes) + if(V == "flags") // Flags can stack + continue + if(V in other_trait.var_changes) + return TRUE + + for(var/V in our_trait.var_changes_pref) + if(V in other_trait.var_changes_pref) + return TRUE + + return FALSE + #undef POSITIVE_MODE #undef NEUTRAL_MODE #undef NEGATIVE_MODE