diff --git a/code/modules/mob/living/carbon/human/species/station/traits/neutral.dm b/code/modules/mob/living/carbon/human/species/station/traits/neutral.dm index 0cc14f6a479..537422f74dc 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits/neutral.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits/neutral.dm @@ -55,11 +55,11 @@ activation_message="Your body feels chilly." primitive_expression_messages=list("shivers.") - /datum/trait/neutral/autohiss_unathi name = "Autohiss (Unathi)" desc = "You roll your S's and x's" cost = 0 + custom_only = FALSE var_changes = list( autohiss_basic_map = list( "s" = list("ss", "sss", "ssss") @@ -68,25 +68,43 @@ "x" = list("ks", "kss", "ksss") ), autohiss_exempt = list(LANGUAGE_UNATHI)) - excludes = list(/datum/trait/neutral/autohiss_tajaran, /datum/trait/neutral/autohiss_zaddat) - custom_only = FALSE + excludes = list( + /datum/trait/neutral/autohiss_tajaran, + /datum/trait/neutral/autohiss_zaddat, + /datum/trait/neutral/autohiss_vassilian, + /datum/trait/neutral/autohiss_yingish, + /datum/trait/neutral/autohiss_unathi/xenochimera, + /datum/trait/neutral/autohiss_tajaran/xenochimera, + /datum/trait/neutral/autohiss_zaddat/xenochimera, + /datum/trait/neutral/autohiss_vassilian/xenochimera, + /datum/trait/neutral/autohiss_yingish/xenochimera) /datum/trait/neutral/autohiss_tajaran name = "Autohiss (Tajaran)" desc = "You roll your R's." cost = 0 + custom_only = FALSE var_changes = list( autohiss_basic_map = list( "r" = list("rr", "rrr", "rrrr") ), autohiss_exempt = list(LANGUAGE_SIIK,LANGUAGE_AKHANI,LANGUAGE_ALAI)) - excludes = list(/datum/trait/neutral/autohiss_unathi, /datum/trait/neutral/autohiss_zaddat) - custom_only = FALSE + excludes = list( + /datum/trait/neutral/autohiss_unathi, + /datum/trait/neutral/autohiss_zaddat, + /datum/trait/neutral/autohiss_vassilian, + /datum/trait/neutral/autohiss_yingish, + /datum/trait/neutral/autohiss_unathi/xenochimera, + /datum/trait/neutral/autohiss_tajaran/xenochimera, + /datum/trait/neutral/autohiss_zaddat/xenochimera, + /datum/trait/neutral/autohiss_vassilian/xenochimera, + /datum/trait/neutral/autohiss_yingish/xenochimera) /datum/trait/neutral/autohiss_zaddat name = "Autohiss (Zaddat)" desc = "You buzz your S's and F's." cost = 0 + custom_only = FALSE var_changes = list( autohiss_basic_map = list( "f" = list("v","vh"), @@ -99,8 +117,70 @@ "v" = list("vv", "vvv") ), autohiss_exempt = list(LANGUAGE_ZADDAT,LANGUAGE_VESPINAE)) - excludes = list(/datum/trait/neutral/autohiss_tajaran, /datum/trait/neutral/autohiss_unathi) + excludes = list( + /datum/trait/neutral/autohiss_tajaran, + /datum/trait/neutral/autohiss_unathi, + /datum/trait/neutral/autohiss_vassilian, + /datum/trait/neutral/autohiss_yingish, + /datum/trait/neutral/autohiss_unathi/xenochimera, + /datum/trait/neutral/autohiss_tajaran/xenochimera, + /datum/trait/neutral/autohiss_zaddat/xenochimera, + /datum/trait/neutral/autohiss_vassilian/xenochimera, + /datum/trait/neutral/autohiss_yingish/xenochimera) + +/datum/trait/neutral/autohiss_vassilian + name = "Autohiss (Vassilian)" + desc = "You buzz your S's, F's, Th's, and R's." + cost = 0 custom_only = FALSE + var_changes = list( + autohiss_basic_map = list( + "s" = list("sz", "z", "zz"), + "f" = list("zk") + ), + autohiss_extra_map = list( + "th" = list("zk", "szk"), + "r" = list("rk") + ), + autohiss_exempt = list(LANGUAGE_VESPINAE)) + excludes = list( + /datum/trait/neutral/autohiss_tajaran, + /datum/trait/neutral/autohiss_unathi, + /datum/trait/neutral/autohiss_zaddat, + /datum/trait/neutral/autohiss_yingish, + /datum/trait/neutral/autohiss_unathi/xenochimera, + /datum/trait/neutral/autohiss_tajaran/xenochimera, + /datum/trait/neutral/autohiss_zaddat/xenochimera, + /datum/trait/neutral/autohiss_vassilian/xenochimera, + /datum/trait/neutral/autohiss_yingish/xenochimera) + +/datum/trait/neutral/autohiss_yingish + name = "Autohiss (Yingish)" + desc = "You pronounce th's with a lisp, a bit like zhis!" + cost = 0 + custom_only = FALSE + var_changes = list( + autohiss_basic_map = list( + "thi" = list("z"), + "shi" = list("z"), + "tha" = list("z"), + "tho" = list("z") + ), + autohiss_extra_map = list( + "the" = list("z"), + "so" = list("z") + ), + autohiss_exempt = list()) + excludes = list( + /datum/trait/neutral/autohiss_tajaran, + /datum/trait/neutral/autohiss_unathi, + /datum/trait/neutral/autohiss_zaddat, + /datum/trait/neutral/autohiss_vassilian, + /datum/trait/neutral/autohiss_unathi/xenochimera, + /datum/trait/neutral/autohiss_tajaran/xenochimera, + /datum/trait/neutral/autohiss_zaddat/xenochimera, + /datum/trait/neutral/autohiss_vassilian/xenochimera, + /datum/trait/neutral/autohiss_yingish/xenochimera) /datum/trait/neutral/bloodsucker name = "Bloodsucker, Obligate" @@ -1475,7 +1555,16 @@ "x" = list("ks", "kss", "ksss") ), autohiss_exempt = list("Sinta'unathi")) - excludes = list(/datum/trait/neutral/autohiss_tajaran) + excludes = list( + /datum/trait/neutral/autohiss_unathi, + /datum/trait/neutral/autohiss_tajaran, + /datum/trait/neutral/autohiss_zaddat, + /datum/trait/neutral/autohiss_vassilian, + /datum/trait/neutral/autohiss_yingish, + /datum/trait/neutral/autohiss_tajaran/xenochimera, + /datum/trait/neutral/autohiss_zaddat/xenochimera, + /datum/trait/neutral/autohiss_vassilian/xenochimera, + /datum/trait/neutral/autohiss_yingish/xenochimera) /datum/trait/neutral/autohiss_tajaran/xenochimera sort = TRAIT_SORT_SPECIES @@ -1489,4 +1578,101 @@ "r" = list("rr", "rrr", "rrrr") ), autohiss_exempt = list("Siik")) - excludes = list(/datum/trait/neutral/autohiss_unathi) + excludes = list( + /datum/trait/neutral/autohiss_unathi, + /datum/trait/neutral/autohiss_tajaran, + /datum/trait/neutral/autohiss_zaddat, + /datum/trait/neutral/autohiss_vassilian, + /datum/trait/neutral/autohiss_yingish, + /datum/trait/neutral/autohiss_unathi/xenochimera, + /datum/trait/neutral/autohiss_zaddat/xenochimera, + /datum/trait/neutral/autohiss_vassilian/xenochimera, + /datum/trait/neutral/autohiss_yingish/xenochimera) + +/datum/trait/neutral/autohiss_zaddat/xenochimera + sort = TRAIT_SORT_SPECIES + allowed_species = list(SPECIES_XENOCHIMERA) + name = "Xenochimera: Autohiss (Zaddat)" + desc = "You buzz your S's and F's." + cost = 0 + custom_only = FALSE + var_changes = list( + autohiss_basic_map = list( + "f" = list("v","vh"), + "ph" = list("v", "vh") + ), + autohiss_extra_map = list( + "s" = list("z", "zz", "zzz"), + "ce" = list("z", "zz"), + "ci" = list("z", "zz"), + "v" = list("vv", "vvv") + ), + autohiss_exempt = list(LANGUAGE_ZADDAT,LANGUAGE_VESPINAE)) + excludes = list( + /datum/trait/neutral/autohiss_tajaran, + /datum/trait/neutral/autohiss_unathi, + /datum/trait/neutral/autohiss_zaddat, + /datum/trait/neutral/autohiss_vassilian, + /datum/trait/neutral/autohiss_yingish, + /datum/trait/neutral/autohiss_unathi/xenochimera, + /datum/trait/neutral/autohiss_tajaran/xenochimera, + /datum/trait/neutral/autohiss_vassilian/xenochimera, + /datum/trait/neutral/autohiss_yingish/xenochimera) + +/datum/trait/neutral/autohiss_vassilian/xenochimera + sort = TRAIT_SORT_SPECIES + allowed_species = list(SPECIES_XENOCHIMERA) + name = "Xenochimera: Autohiss (Vassilian)" + desc = "You buzz your S's, F's, Th's, and R's." + cost = 0 + custom_only = FALSE + var_changes = list( + autohiss_basic_map = list( + "s" = list("sz", "z", "zz"), + "f" = list("zk") + ), + autohiss_extra_map = list( + "th" = list("zk", "szk"), + "r" = list("rk") + ), + autohiss_exempt = list(LANGUAGE_VESPINAE)) + excludes = list( + /datum/trait/neutral/autohiss_tajaran, + /datum/trait/neutral/autohiss_unathi, + /datum/trait/neutral/autohiss_zaddat, + /datum/trait/neutral/autohiss_vassilian, + /datum/trait/neutral/autohiss_yingish, + /datum/trait/neutral/autohiss_unathi/xenochimera, + /datum/trait/neutral/autohiss_tajaran/xenochimera, + /datum/trait/neutral/autohiss_zaddat/xenochimera, + /datum/trait/neutral/autohiss_yingish/xenochimera) + +/datum/trait/neutral/autohiss_yingish/xenochimera + sort = TRAIT_SORT_SPECIES + allowed_species = list(SPECIES_XENOCHIMERA) + name = "Xenochimera: Autohiss (Yingish)" + desc = "You pronounce th's with a lisp, a bit like zhis!" + cost = 0 + custom_only = FALSE + var_changes = list( + autohiss_basic_map = list( + "thi" = list("z"), + "shi" = list("z"), + "tha" = list("z"), + "tho" = list("z") + ), + autohiss_extra_map = list( + "the" = list("z"), + "so" = list("z") + ), + autohiss_exempt = list()) + excludes = list( + /datum/trait/neutral/autohiss_tajaran, + /datum/trait/neutral/autohiss_unathi, + /datum/trait/neutral/autohiss_zaddat, + /datum/trait/neutral/autohiss_vassilian, + /datum/trait/neutral/autohiss_yingish, + /datum/trait/neutral/autohiss_unathi/xenochimera, + /datum/trait/neutral/autohiss_tajaran/xenochimera, + /datum/trait/neutral/autohiss_zaddat/xenochimera, + /datum/trait/neutral/autohiss_vassilian/xenochimera) diff --git a/code/unit_tests/authohiss_tests.dm b/code/unit_tests/authohiss_tests.dm new file mode 100644 index 00000000000..0abc49fea67 --- /dev/null +++ b/code/unit_tests/authohiss_tests.dm @@ -0,0 +1,36 @@ +/datum/unit_test/autohiss_shall_be_exclusive + name = "TRAITS: Autohiss traits shall be exclusive" + +/datum/unit_test/autohiss_shall_be_exclusive/start_test() + var/failed = FALSE + + var/list/hiss_list = list() + for(var/traitpath in GLOB.all_traits) + var/datum/trait/T = GLOB.all_traits[traitpath] + if(!T.var_changes) + continue + if(!islist(T.var_changes["autohiss_basic_map"])) + continue + hiss_list += T + + for(var/datum/trait/T in hiss_list) + if(T.type in T.excludes) + log_unit_test("[T.type]: Trait - Autohiss excludes itself.") + failed = TRUE + + if(!T.excludes) + log_unit_test("[T.type]: Trait - Autohiss missing exclusion list.") + failed = TRUE + continue + + var/list/exempt_list = hiss_list.Copy() - T // MUST exclude all others except itself + for(var/datum/trait/EX in exempt_list) + if(!(EX.type in T.excludes)) + log_unit_test("[T.type]: Trait - Autohiss missing exclusion for [EX].") + failed = TRUE + + if(failed) + fail("One or more autohiss traits allow another autohiss to be chosen with it.") + else + pass("All [hiss_list.len] autohiss traits are properly exclusive.") + return failed diff --git a/vorestation.dme b/vorestation.dme index 61bfb107a08..35d09769e23 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -4482,6 +4482,7 @@ #include "code\modules\xenobio\machinery\processor.dm" #include "code\modules\xgm\xgm_gas_data.dm" #include "code\modules\xgm\xgm_gas_mixture.dm" +#include "code\unit_tests\authohiss_tests.dm" #include "code\unit_tests\clothing_tests.dm" #include "code\unit_tests\cosmetic_tests.dm" #include "code\unit_tests\decl_tests.dm"