[MIRROR] unified conflict check for traits and genes (#11924)

Co-authored-by: Will <7099514+Willburd@users.noreply.github.com>
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
This commit is contained in:
CHOMPStation2StaffMirrorBot
2025-11-07 02:39:07 -07:00
committed by GitHub
parent 7ddccf3a76
commit 5d99b133c9
2 changed files with 24 additions and 32 deletions

View File

@@ -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)

View File

@@ -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