diff --git a/code/__DEFINES/~darkpack/combat.dm b/code/__DEFINES/~darkpack/combat.dm
index 164bad9dfd99..2f6fec55c831 100644
--- a/code/__DEFINES/~darkpack/combat.dm
+++ b/code/__DEFINES/~darkpack/combat.dm
@@ -17,3 +17,7 @@
#define LETHAL "lethal"
// exists in code/__DEFINES/~darkpack/aggravated_damage.dm
//#define AGGRAVATED
+
+// To convert a measure of yards into tiles/range
+#define YARDS / 5
+#define YARDS_TO_TILES * 5
diff --git a/code/__DEFINES/~darkpack/fera/fera.dm b/code/__DEFINES/~darkpack/fera/fera.dm
index 6a2f0b7a33f9..fd28eb1c24c2 100644
--- a/code/__DEFINES/~darkpack/fera/fera.dm
+++ b/code/__DEFINES/~darkpack/fera/fera.dm
@@ -9,10 +9,13 @@
#define MAX_GNOSIS 10
#define PRIMAL_URGE_PLACEHOLDER 3
-#define BREED_HOMID "Homid"
+#define BREED_GAROU_HOMID "Garou Homid"
#define BREED_LUPUS "Lupus"
#define BREED_CRINOS "Crinos"
+#define BREED_CORAX_HOMID "Corax Homid"
+#define BREED_CORVID "Corvid"
+
#define FEATURE_FUR_COLOR "fera_fur"
// fera will likely have a seperate list of colors but uses the same feature or var as other fera
@@ -22,7 +25,16 @@ GLOBAL_LIST_INIT(garou_fur_colors, list(
"red" = "red",
"white" = "white",
"ginger" = "ginger",
- "brown" = "brown"
+ "brown" = "brown",
+))
+
+GLOBAL_LIST_INIT(corax_fur_colors, list(
+ "black" = "black",
+ "brown" = "brown",
+ "white" = "white",
+ "green" = "green",
+ "red" = "red",
+ "gray" = "gray",
))
#define STATUS_EFFECT_DELIRIUM /datum/status_effect/delirium
diff --git a/code/__DEFINES/~darkpack/fera/werewolf_tribe.dm b/code/__DEFINES/~darkpack/fera/werewolf_tribe.dm
index e9bfd5a7b088..1d2c927cce83 100644
--- a/code/__DEFINES/~darkpack/fera/werewolf_tribe.dm
+++ b/code/__DEFINES/~darkpack/fera/werewolf_tribe.dm
@@ -16,10 +16,8 @@
#define TRIBE_STARGAZERS "Stargazers"
#define TRIBE_BLACK_SPIRAL_DANCERS "Black Spiral Dancers"
-#define TRIBE_CORAX "Corax" // DARKPACK TODO - CORAX
-
-#define TRIBE_LIST_ALL list(TRIBE_RONIN, TRIBE_GALESTALKERS, TRIBE_CHILDREN_OF_GAIA, TRIBE_UKTENA, TRIBE_FIANNA, TRIBE_GET_OF_FENRIS, TRIBE_BLACK_FURIES, TRIBE_SILVER_FANGS, TRIBE_SILENT_STRIDERS, TRIBE_RED_TALONS, TRIBE_STARGAZERS, TRIBE_GLASS_WALKERS, TRIBE_BONE_GNAWERS, TRIBE_SHADOW_LORDS, TRIBE_BLACK_SPIRAL_DANCERS, TRIBE_CORAX)
-#define TRIBE_LIST_GAIA list(TRIBE_GALESTALKERS, TRIBE_CHILDREN_OF_GAIA, TRIBE_UKTENA, TRIBE_FIANNA, TRIBE_GET_OF_FENRIS, TRIBE_BLACK_FURIES, TRIBE_SILVER_FANGS, TRIBE_SILENT_STRIDERS, TRIBE_RED_TALONS, TRIBE_STARGAZERS, TRIBE_GLASS_WALKERS, TRIBE_BONE_GNAWERS, TRIBE_SHADOW_LORDS, TRIBE_CORAX)
-#define TRIBE_LIST_WYLD list(TRIBE_GALESTALKERS, TRIBE_CHILDREN_OF_GAIA, TRIBE_UKTENA, TRIBE_FIANNA, TRIBE_GET_OF_FENRIS, TRIBE_BLACK_FURIES, TRIBE_SILVER_FANGS, TRIBE_SILENT_STRIDERS, TRIBE_RED_TALONS, TRIBE_STARGAZERS, TRIBE_SHADOW_LORDS, TRIBE_CORAX)
+#define TRIBE_LIST_ALL list(TRIBE_RONIN, TRIBE_GALESTALKERS, TRIBE_CHILDREN_OF_GAIA, TRIBE_UKTENA, TRIBE_FIANNA, TRIBE_GET_OF_FENRIS, TRIBE_BLACK_FURIES, TRIBE_SILVER_FANGS, TRIBE_SILENT_STRIDERS, TRIBE_RED_TALONS, TRIBE_STARGAZERS, TRIBE_GLASS_WALKERS, TRIBE_BONE_GNAWERS, TRIBE_SHADOW_LORDS, TRIBE_BLACK_SPIRAL_DANCERS)
+#define TRIBE_LIST_GAIA list(TRIBE_GALESTALKERS, TRIBE_CHILDREN_OF_GAIA, TRIBE_UKTENA, TRIBE_FIANNA, TRIBE_GET_OF_FENRIS, TRIBE_BLACK_FURIES, TRIBE_SILVER_FANGS, TRIBE_SILENT_STRIDERS, TRIBE_RED_TALONS, TRIBE_STARGAZERS, TRIBE_GLASS_WALKERS, TRIBE_BONE_GNAWERS, TRIBE_SHADOW_LORDS)
+#define TRIBE_LIST_WYLD list(TRIBE_GALESTALKERS, TRIBE_CHILDREN_OF_GAIA, TRIBE_UKTENA, TRIBE_FIANNA, TRIBE_GET_OF_FENRIS, TRIBE_BLACK_FURIES, TRIBE_SILVER_FANGS, TRIBE_SILENT_STRIDERS, TRIBE_RED_TALONS, TRIBE_STARGAZERS, TRIBE_SHADOW_LORDS)
#define TRIBE_LIST_WEAVER list(TRIBE_GLASS_WALKERS, TRIBE_BONE_GNAWERS)
#define TRIBE_LIST_WYRM list(TRIBE_BLACK_SPIRAL_DANCERS)
diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm
index 5fc637e1b77b..fb9c4e60c5aa 100644
--- a/code/__DEFINES/~darkpack/traits/declarations.dm
+++ b/code/__DEFINES/~darkpack/traits/declarations.dm
@@ -126,12 +126,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
// If the splat uses the WTA renown system described in W20 p. 245
#define TRAIT_FERA_RENOWN "wta_fera_renown"
-/// If the species has garou breeds to select.
-#define TRAIT_WTA_GAROU_BREED "wta_garou_breeds"
-// if the species has garou tribes to select.
-#define TRAIT_WTA_GAROU_TRIBE "wta_garou_tribes"
-// If the species has garou auspices to select.
-#define TRAIT_WTA_GAROU_AUSPICE "wta_garou_auspice"
// This mob has fur!
#define TRAIT_FERA_FUR "fera_fur"
/// If the fera is wyrm tainted.
@@ -142,11 +136,15 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_NO_LYING_ANGLE "no_lying_angle"
// Expensive but allows us to ensure there resting gets updated.
#define TRAIT_TRANSFORM_UPDATES_ICON "transform_updates_icon"
+#define TRAIT_SILVER_WEAKNESS "silver_weakness"
+#define TRAIT_GOLD_WEAKNESS "gold_weakness"
+// Delirium is effectivly two levels weaker
+#define TRAIT_WEAK_DELIRIUM "weak_delirium"
+// Massivly boosts the range of your howl emote.
+#define TRAIT_LOUD_WARCRY "loud_warcry"
/// Prevents the mob from picking up items larger then small
#define TRAIT_SMALL_HANDS "small_hands"
// Traits granted via gifts
-// Massivly boosts the range of your howl emote.
-#define TRAIT_LOUD_HOWLER "loud_howler"
#define TRAIT_RAZOR_CLAWS "razor_claws"
/// Sixth sense restricted to view range
diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm
index ce73e59955f3..144d95286564 100644
--- a/code/_globalvars/traits/_traits.dm
+++ b/code/_globalvars/traits/_traits.dm
@@ -711,7 +711,9 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_LAZY" = TRAIT_LAZY, // DARKPACK EDIT ADD
"TRAIT_LIGHT_WEAKNESS" = TRAIT_LIGHT_WEAKNESS, // DARKPACK EDIT ADD - Setite Flaw
"TRAIT_LOCAL_SIXTHSENSE" = TRAIT_LOCAL_SIXTHSENSE, // DARKPACK EDIT ADD
- "TRAIT_LOUD_HOWLER" = TRAIT_LOUD_HOWLER, // DARKPACK EDIT ADD - WEREWOLF
+ "TRAIT_SILVER_WEAKNESS" = TRAIT_SILVER_WEAKNESS, // DARKPACK EDIT ADD - WEREWOLF
+ "TRAIT_GOLD_WEAKNESS" = TRAIT_GOLD_WEAKNESS, // DARKPACK EDIT ADD - WEREWOLF - (corax)
+ "TRAIT_LOUD_WARCRY" = TRAIT_LOUD_WARCRY, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_MASQUERADE_VIOLATING_EYES" = TRAIT_MASQUERADE_VIOLATING_EYES, // DARKPACK EDIT ADD
"TRAIT_MASQUERADE_VIOLATING_FACE" = TRAIT_MASQUERADE_VIOLATING_FACE, // DARKPACK EDIT ADD
"TRAIT_MERIT_UNTAMABLE" = TRAIT_MERIT_UNTAMABLE, // DARKPACK EDIT ADD - MERITS_FLAWS
@@ -742,10 +744,9 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_STAKED" = TRAIT_STAKED, // DARKPACK EDIT ADD
"TRAIT_STAKE_IMMUNE" = TRAIT_STAKE_IMMUNE, // DARKPACK EDIT ADD
"TRAIT_STAKE_RESISTANT" = TRAIT_STAKE_RESISTANT, // DARKPACK EDIT ADD
- "TRAIT_THE_LARGEST_MAW" = TRAIT_THE_LARGEST_MAW, // DARKPACK EDIT ADD - MERITS/FLAWS
- "TRAIT_THIRD_EYE" = TRAIT_THIRD_EYE, // DARKPACK EDIT ADD - Tremere & Salubri Quirk
"TRAIT_STILLNESS_OF_DEATH" = TRAIT_STILLNESS_OF_DEATH, // DARKPACK EDIT ADD - Gargoyle Quirk
"TRAIT_THE_LARGEST_MAW" = TRAIT_THE_LARGEST_MAW, // DARKPACK EDIT ADD - MERITS/FLAWS
+ "TRAIT_THIRD_EYE" = TRAIT_THIRD_EYE, // DARKPACK EDIT ADD - Tremere & Salubri Quirk
"TRAIT_TIMEWARPER" = TRAIT_TIMEWARPER, // DARKPACK EDIT ADD
"TRAIT_TIME_SENSE" = TRAIT_TIME_SENSE, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_TORPOR" = TRAIT_TORPOR, // DARKPACK EDIT ADD
@@ -761,11 +762,9 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_VITAE_ADDICTION" = TRAIT_VITAE_ADDICTION, // DARKPACK EDIT ADD
"TRAIT_VTM_CLANS" = TRAIT_VTM_CLANS, // DARKPACK EDIT ADD
"TRAIT_VTM_MORALITY" = TRAIT_VTM_MORALITY, // DARKPACK EDIT ADD
+ "TRAIT_WEAK_DELIRIUM" = TRAIT_WEAK_DELIRIUM, // DARKPACK EDIT ADD - WEREWOLF - (corax)
"TRAIT_WEAK_TO_DOMINATE" = TRAIT_WEAK_TO_DOMINATE, // DARKPACK EDIT ADD - POWERS - (Dominate)
"TRAIT_WEAK_WILLED" = TRAIT_WEAK_WILLED, // DARKPACK EDIT ADD - MERITS_FLAWS
- "TRAIT_WTA_GAROU_AUSPICE" = TRAIT_WTA_GAROU_AUSPICE, // DARKPACK EDIT ADD - WEREWOLF
- "TRAIT_WTA_GAROU_BREED" = TRAIT_WTA_GAROU_BREED, // DARKPACK EDIT ADD - WEREWOLF
- "TRAIT_WTA_GAROU_TRIBE" = TRAIT_WTA_GAROU_TRIBE, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_WYRMTAINTED" = TRAIT_WYRMTAINTED, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_WYRMTAINTED_SPRITE" = TRAIT_WYRMTAINTED_SPRITE, // DARKPACK EDIT ADD - WEREWOLF
),
diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm
index 1c3ea433381f..0ba6de609f55 100644
--- a/code/_globalvars/traits/admin_tooling.dm
+++ b/code/_globalvars/traits/admin_tooling.dm
@@ -398,9 +398,9 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_LAZY" = TRAIT_LAZY, // DARKPACK EDIT ADD
"TRAIT_LIGHT_WEAKNESS" = TRAIT_LIGHT_WEAKNESS, // DARKPACK EDIT ADD - Setite Flaw
"TRAIT_LOCAL_SIXTHSENSE" = TRAIT_LOCAL_SIXTHSENSE, // DARKPACK EDIT ADD
- "TRAIT_LOUD_HOWLER" = TRAIT_LOUD_HOWLER, // DARKPACK EDIT ADD - WEREWOLF
+ "TRAIT_SILVER_WEAKNESS" = TRAIT_SILVER_WEAKNESS, // DARKPACK EDIT ADD - WEREWOLF
+ "TRAIT_LOUD_WARCRY" = TRAIT_LOUD_WARCRY, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_MASQUERADE_VIOLATING_EYES" = TRAIT_MASQUERADE_VIOLATING_EYES, // DARKPACK EDIT ADD
- "TRAIT_MASQUERADE_VIOLATING_FACE" = TRAIT_MASQUERADE_VIOLATING_FACE, // DARKPACK EDIT ADD
"TRAIT_MERIT_UNTAMABLE" = TRAIT_MERIT_UNTAMABLE, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_METAMORPH" = TRAIT_METAMORPH, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_NEEDS_BLOOD" = TRAIT_NEEDS_BLOOD, // DARKPACK EDIT ADD - Hunger and Frenzy
@@ -409,6 +409,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_NO_EYE_CONTACT" = TRAIT_NO_EYE_CONTACT, // DARKPACK EDIT ADD
"TRAIT_NO_LYING_ANGLE" = TRAIT_NO_LYING_ANGLE, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_OBFUSCATED" = TRAIT_OBFUSCATED, // DARKPACK EDIT ADD
+ "TRAIT_GOLD_WEAKNESS" = TRAIT_GOLD_WEAKNESS, // DARKPACK EDIT ADD - WEREWOLF - (corax)
"TRAIT_PAINFUL_VAMPIRE_KISS" = TRAIT_PAINFUL_VAMPIRE_KISS, // DARKPACK EDIT ADD
"TRAIT_PALE_AURA" = TRAIT_PALE_AURA, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_PASS_THROUGH_WALLS" = TRAIT_PASS_THROUGH_WALLS, // DARKPACK EDIT ADD
@@ -438,11 +439,9 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_VITAE_ADDICTION" = TRAIT_VITAE_ADDICTION, // DARKPACK EDIT ADD
"TRAIT_VTM_CLANS" = TRAIT_VTM_CLANS, // DARKPACK EDIT ADD
"TRAIT_VTM_MORALITY" = TRAIT_VTM_MORALITY, // DARKPACK EDIT ADD
+ "TRAIT_WEAK_DELIRIUM" = TRAIT_WEAK_DELIRIUM, // DARKPACK EDIT ADD - WEREWOLF - (corax)
"TRAIT_WEAK_TO_DOMINATE" = TRAIT_WEAK_TO_DOMINATE, // DARKPACK EDIT ADD - POWERS - (Dominate)
"TRAIT_WEAK_WILLED" = TRAIT_WEAK_WILLED, // DARKPACK EDIT ADD - MERITS_FLAWS
- "TRAIT_WTA_GAROU_AUSPICE" = TRAIT_WTA_GAROU_AUSPICE, // DARKPACK EDIT ADD - WEREWOLF
- "TRAIT_WTA_GAROU_BREED" = TRAIT_WTA_GAROU_BREED, // DARKPACK EDIT ADD - WEREWOLF
- "TRAIT_WTA_GAROU_TRIBE" = TRAIT_WTA_GAROU_TRIBE, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_WYRMTAINTED" = TRAIT_WYRMTAINTED, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_WYRMTAINTED_SPRITE" = TRAIT_WYRMTAINTED_SPRITE, // DARKPACK EDIT ADD - WEREWOLF
),
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 3096a2dfee31..5f4d16cf9cb7 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -347,7 +347,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/list/preferences = list()
for (var/datum/preference/preference as anything in get_preferences_in_priority_order())
- if (!preference.is_accessible(src))
+ if (!preference.visible_in_page(src)) // DARKPACK EDIT CHANGE - (is_accessible to visible_in_page)
continue
var/value = read_preference(preference.type)
@@ -579,6 +579,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if (preference.must_have_relevant_trait && preference.relevant_inherent_trait)
if (!HAS_TRAIT(character, preference.relevant_inherent_trait))
continue
+
+ if (preference.must_be_accessible && !preference.is_accessible(src))
+ continue
// DARKPACK EDIT ADD END - TTRPG preferences
preference.apply_to_human(character, read_preference(preference.type))
diff --git a/code/modules/client/preferences/_preference.dm b/code/modules/client/preferences/_preference.dm
index 9bf2c2d8c8e6..14c785261538 100644
--- a/code/modules/client/preferences/_preference.dm
+++ b/code/modules/client/preferences/_preference.dm
@@ -307,7 +307,7 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key())
/// This will, for instance, update the character preference view.
/// Performs sanity checks.
/datum/preferences/proc/update_preference(datum/preference/preference, preference_value)
- if (!preference.is_accessible(src))
+ if (!preference.visible_in_page(src)) // DARKPACK EDIT CHANGE - (is_accessible to visible_in_page)
return FALSE
var/new_value = preference.deserialize(preference_value, src)
@@ -377,11 +377,24 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key())
if (!has_relevant_feature(preferences))
return FALSE
+ /* // DARKPACK EDIT REMOVAL - Moved to a wrapper proc
if (!should_show_on_page(preferences.current_window))
return FALSE
+ */
return TRUE
+// DARKPACK EDIT ADD START
+/datum/preference/proc/visible_in_page(datum/preferences/preferences)
+ SHOULD_CALL_PARENT(TRUE)
+ SHOULD_NOT_SLEEP(TRUE)
+
+ if (!should_show_on_page(preferences.current_window))
+ return FALSE
+
+ return is_accessible(preferences)
+// DARKPACK EDIT ADD END
+
/// Returns whether or not, given the PREFERENCE_TAB_*, this preference should
/// appear.
/datum/preference/proc/should_show_on_page(preference_tab)
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 06e366574b2e..71cde6752df3 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -187,8 +187,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
/datum/preferences/proc/update_character_darkpack(current_version, list/save_data)
if (current_version < 2)
- if(read_preference(/datum/preference/choiced/subsplat/garou_breed) == "Metis")
- write_preference(GLOB.preference_entries[/datum/preference/choiced/subsplat/garou_breed], BREED_CRINOS)
+ if(read_preference(/datum/preference/choiced/subsplat/fera_breed/garou) == "Metis")
+ write_preference(GLOB.preference_entries[/datum/preference/choiced/subsplat/fera_breed/garou], BREED_CRINOS)
// DARKPACK EDIT ADD END
/// checks through keybindings for outdated unbound keys and updates them
diff --git a/config/darkpack_config.txt b/config/darkpack_config.txt
index bd565bc978fd..cc12cdbc5df1 100644
--- a/config/darkpack_config.txt
+++ b/config/darkpack_config.txt
@@ -35,6 +35,7 @@ ROUNDSTART_SPLATS splat_kindred
ROUNDSTART_SPLATS splat_ghoul
ROUNDSTART_SPLATS splat_kinfolk
ROUNDSTART_SPLATS splat_garou
+ROUNDSTART_SPLATS splat_corax
## If dead people and ghosts can LOOC to people who are alive.
DISABLE_GHOST_LOOC
diff --git a/modular_darkpack/master_files/code/modules/client/preferences/_preference.dm b/modular_darkpack/master_files/code/modules/client/preferences/_preference.dm
index c3a008fbc7e3..27004194aab9 100644
--- a/modular_darkpack/master_files/code/modules/client/preferences/_preference.dm
+++ b/modular_darkpack/master_files/code/modules/client/preferences/_preference.dm
@@ -2,3 +2,5 @@
/// If set to TRUE, this preference will not be applied unless the character has the preference's relevant inherent trait
var/must_have_relevant_trait = FALSE
+ /// If set to TRUE, only apply preference to the mob if it acctually shows up on there sheet
+ var/must_be_accessible = FALSE
diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/_species.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/_species.dm
index 4c429d28433c..c99570f3bc4c 100644
--- a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/_species.dm
+++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/_species.dm
@@ -1,4 +1,4 @@
-/datum/species
- /// Used in get_generic_name to replace gender
- var/visible_gender_override
+/// Used in get_generic_name to replace gender
+/datum/species/proc/visible_gender_override(mob/living/carbon/human/holder)
+ return
diff --git a/modular_darkpack/modules/deprecated/icons/32x48.dmi b/modular_darkpack/modules/deprecated/icons/32x48.dmi
index d3b06fc711f3..44202e3ea1c2 100644
Binary files a/modular_darkpack/modules/deprecated/icons/32x48.dmi and b/modular_darkpack/modules/deprecated/icons/32x48.dmi differ
diff --git a/modular_darkpack/modules/deprecated/icons/hispo.dmi b/modular_darkpack/modules/deprecated/icons/hispo.dmi
deleted file mode 100644
index 51672f049cc7..000000000000
Binary files a/modular_darkpack/modules/deprecated/icons/hispo.dmi and /dev/null differ
diff --git a/modular_darkpack/modules/guestbook/code/human_helpers.dm b/modular_darkpack/modules/guestbook/code/human_helpers.dm
index 27103c3e0b7d..caffb332351c 100644
--- a/modular_darkpack/modules/guestbook/code/human_helpers.dm
+++ b/modular_darkpack/modules/guestbook/code/human_helpers.dm
@@ -7,8 +7,9 @@
visible_gender = "Woman"
else
visible_gender = "Person"
- if(dna?.species.visible_gender_override)
- visible_gender = dna.species.visible_gender_override
+ var/override = dna?.species.visible_gender_override(src)
+ if(override)
+ visible_gender = override
return visible_gender
diff --git a/modular_darkpack/modules/jobs/code/_job_assignment.dm b/modular_darkpack/modules/jobs/code/_job_assignment.dm
index d73b23cacffc..b88b7df1f5ad 100644
--- a/modular_darkpack/modules/jobs/code/_job_assignment.dm
+++ b/modular_darkpack/modules/jobs/code/_job_assignment.dm
@@ -72,7 +72,7 @@
return JOB_UNAVAILABLE_KINDRED_CLAN
/datum/controller/subsystem/job/proc/check_garou_prefs(client/player_client, mob/dead/new_player/player, datum/job/possible_job, debug_prefix = "", add_job_to_log = FALSE)
- var/datum/subsplat/werewolf/auspice/auspice = get_fera_auspice(player_client.prefs.read_preference(/datum/preference/choiced/subsplat/garou_auspice))
+ var/datum/subsplat/werewolf/auspice/auspice = get_fera_auspice(player_client.prefs.read_preference(/datum/preference/choiced/subsplat/fera_auspice/garou))
if(possible_job.allowed_auspice && !(auspice.name in possible_job.allowed_auspice))
job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_FERA_AUSPICE, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]")
return JOB_UNAVAILABLE_FERA_AUSPICE
@@ -80,7 +80,7 @@
job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_FERA_AUSPICE, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]")
return JOB_UNAVAILABLE_FERA_AUSPICE
- var/datum/subsplat/werewolf/tribe/tribe = get_fera_tribe(player_client.prefs.read_preference(/datum/preference/choiced/subsplat/garou_tribe))
+ var/datum/subsplat/werewolf/tribe/tribe = get_fera_tribe(player_client.prefs.read_preference(/datum/preference/choiced/subsplat/fera_tribe/garou))
if(possible_job.allowed_tribes && !(tribe.name in possible_job.allowed_tribes))
job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_FERA_TRIBE, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]")
return JOB_UNAVAILABLE_FERA_TRIBE
diff --git a/modular_darkpack/modules/weapons/code/projectiles.dm b/modular_darkpack/modules/weapons/code/projectiles.dm
index 98860519c87d..3c664dd9f4a4 100644
--- a/modular_darkpack/modules/weapons/code/projectiles.dm
+++ b/modular_darkpack/modules/weapons/code/projectiles.dm
@@ -94,18 +94,10 @@
name = "5.56mm silver bullet"
armour_penetration = 20
-/*
/obj/projectile/bullet/darkpack/vamp556mm/silver/on_hit(atom/target, blocked = 0, pierce_hit)
. = ..()
- if(iswerewolf(target) || get_garou_splat(target))
- var/mob/living/carbon/M = target
- if(M.auspice.gnosis)
- if(prob(50))
- adjust_gnosis(-1, M)
+ fera_silver_damage(target, 4)
- M.apply_damage(20, AGGRAVATED)
- M.apply_status_effect(STATUS_EFFECT_SILVER_SLOWDOWN)
-*/
// 5.45x39mm
/obj/projectile/bullet/darkpack/vamp545mm
name = "5.45mm bullet"
@@ -195,18 +187,10 @@
/obj/projectile/bullet/darkpack/vamp762x51mm/silver
name = "7.62x51mm silver bullet"
-/*
-/obj/projectile/bullet/darkpack/vamp762x51mm/silver/on_hit(atom/target, blocked = FALSE)
- . = ..()
- if(iswerewolf(target) || get_garou_splat(target))
- var/mob/living/carbon/M = target
- if(M.auspice.gnosis)
- if(prob(50))
- adjust_gnosis(-1, M)
- M.apply_damage(20, CLONE)
- M.apply_status_effect(STATUS_EFFECT_SILVER_SLOWDOWN)
-*/
+/obj/projectile/bullet/darkpack/vamp762x51mm/silver/on_hit(atom/target, blocked = FALSE, pierce_hit)
+ . = ..()
+ fera_silver_damage(target, 4)
/obj/projectile/bullet/darkpack/vamp75
name = ".75 ball"
diff --git a/modular_darkpack/modules/npc/code/nonhuman/friendly/bird.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird.dm
similarity index 94%
rename from modular_darkpack/modules/npc/code/nonhuman/friendly/bird.dm
rename to modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird.dm
index 138e534a3e2e..d4b6478e825e 100644
--- a/modular_darkpack/modules/npc/code/nonhuman/friendly/bird.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird.dm
@@ -1,4 +1,3 @@
-// DARKPACK TODO - CORAX - (Corax kinfolk and thus should be grouped into WTA soon.)
/mob/living/basic/corvid
name = "corvid"
desc = "Caw."
@@ -67,7 +66,7 @@
// eyes_overlay.layer = ABOVE_LIGHTING_LAYER
. += eyes_overlay
-/datum/action/innate/togglecorvidflight // this action handles corvid forms toggle their flight, and swaps their sprite to be of the relevant type, I'm making it a gift because it's also what Hispo is under
+/datum/action/innate/togglecorvidflight // this action handles corvid forms toggle their flight, and swaps their sprite to be of the relevant type.
name = "Toggle Flight"
desc = "Unfurl or withdraw your wings, toggling your ability to fly"
check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_IMMOBILE
@@ -108,8 +107,7 @@
message = "caws!"
emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE
vary = TRUE
- // DARKPACK TODO - CORAX - (Move to wta folder)
- sound = 'modular_darkpack/modules/npc/sound/caw.ogg'
+ sound = 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/emotes/caw.ogg'
/mob/living/basic/corvid/crow
name = "crow"
diff --git a/modular_darkpack/modules/npc/code/nonhuman/friendly/bird_ai.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird_ai.dm
similarity index 94%
rename from modular_darkpack/modules/npc/code/nonhuman/friendly/bird_ai.dm
rename to modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird_ai.dm
index 1573ea48bb87..c627732fbddf 100644
--- a/modular_darkpack/modules/npc/code/nonhuman/friendly/bird_ai.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird_ai.dm
@@ -17,7 +17,7 @@
/datum/ai_planning_subtree/random_speech/corvid
speech_chance = 5
speak = list("Caw!")
- sound = list('modular_darkpack/modules/npc/sound/caw.ogg')
+ sound = list('modular_darkpack/modules/werewolf_the_apocalypse/sounds/emotes/caw.ogg')
emote_hear = list("Caws.")
/datum/ai_planning_subtree/find_and_hunt_target/find_shiney
diff --git a/modular_darkpack/modules/npc/code/nonhuman/friendly/wolf.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/wolf.dm
similarity index 84%
rename from modular_darkpack/modules/npc/code/nonhuman/friendly/wolf.dm
rename to modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/wolf.dm
index 0fbd0256d074..1d00dcb56774 100644
--- a/modular_darkpack/modules/npc/code/nonhuman/friendly/wolf.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/wolf.dm
@@ -7,7 +7,6 @@
#define TYPE_MUNDANE "wolf"
#define TYPE_KINFOLK "kinfolk"
-#define TYPE_SPIRAL "spiral"
#define WOLF_COAT_HELPER(wolf_type) \
##wolf_type/black { \
@@ -41,7 +40,7 @@
icon_state = "wolf1"
desc = "That's a big, scary wolf. Might be best to steer clear."
base_icon_state = "wolf"
- icon = 'modular_darkpack/modules/npc/icons/wolf.dmi'
+ icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/wolf.dmi'
var/random_wolf_color = TRUE
var/coat_color = COAT_BLACK
var/wolf_type = TYPE_MUNDANE
@@ -80,27 +79,26 @@
/mob/living/basic/pet/dog/wolf/Initialize(mapload)
. = ..()
add_verb(src, /mob/living/proc/toggle_resting)
- var/coat_type
-
-/* if(user.auspice == AUSPICE_PHILODOX && wolf_type != TYPE_MUNDANE) // uncomment when dogs
- switch(wolf_type)
- if(TYPE_KINFOLK)
- . += span_purple("On closer inspection, they appear to be kin.")
- if(TYPE_SPIRAL)
- . += span_warn("They are strongly wyrm-tainted.") // Remove when we have a wyrm-tainted element or something
- coat_type = TYPE_SPIRAL
-*/
-
if(random_wolf_color)
coat_color = rand(1, 6)
- icon_state = "[base_icon_state][coat_type][coat_color]"
- icon_living = "[base_icon_state][coat_type][coat_color]"
- icon_dead = "[base_icon_state][coat_type][coat_color]_dead"
+ icon_state = "[base_icon_state][coat_color]"
+ icon_living = "[base_icon_state][coat_color]"
+ icon_dead = "[base_icon_state][coat_color]_dead"
// AddElement(/datum/element/ai_retaliate)
update_appearance(UPDATE_ICON)
+/mob/living/basic/pet/dog/wolf/examine(mob/user)
+ . = ..()
+ var/datum/splat/werewolf/wolp_splat = get_werewolf_splat(user)
+ if(istype(wolp_splat?.auspice, /datum/subsplat/werewolf/auspice/garou/philodox))
+ if(wolf_type == TYPE_KINFOLK)
+ . += span_purple("On closer inspection, they appear to be kin.")
+ if(HAS_TRAIT(src, TRAIT_WYRMTAINTED))
+ . += span_warning("They are strongly wyrm-tainted.")
+
+
/mob/living/basic/pet/dog/wolf/add_obey_commands()
var/static/list/pet_commands = list(
/datum/pet_command/idle,
@@ -158,7 +156,10 @@
real_name = "tainted kinfolk"
icon_state = "wolfspiral1"
base_icon_state = "wolfspiral"
- wolf_type = TYPE_SPIRAL
+
+/mob/living/basic/pet/dog/wolf/kinfolk/spiral/Initialize(mapload)
+ . = ..()
+ ADD_TRAIT(src, TRAIT_WYRMTAINTED, INNATE_TRAIT)
// STATIC COLORS
WOLF_COAT_HELPER(/mob/living/basic/pet/dog/wolf)
@@ -176,4 +177,3 @@ WOLF_COAT_HELPER(/mob/living/basic/pet/dog/wolf/kinfolk/spiral)
#undef TYPE_MUNDANE
#undef TYPE_KINFOLK
-#undef TYPE_SPIRAL
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/changing_breeds/corax.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/changing_breeds/corax.dm
new file mode 100644
index 000000000000..d9e532a8e29e
--- /dev/null
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/changing_breeds/corax.dm
@@ -0,0 +1,55 @@
+/datum/storyteller_roll/gift/enemy_ways
+ applicable_stats = list(STAT_PERCEPTION)
+ difficulty = 7
+ numerical = TRUE
+
+/datum/action/cooldown/power/gift/enemy_ways
+ name = "Enemy Ways"
+ // desc = ""
+ // Put up here so the codeblock can interact with them
+ var/waiting_clients = 0
+ var/hostiles = 0
+
+/datum/action/cooldown/power/gift/enemy_ways/Activate(atom/target)
+ . = ..()
+ var/datum/splat/werewolf/wolp_splat = get_werewolf_splat(owner)
+
+ var/range = round(((wolp_splat?.renown[RENOWN_WISDOM] ? wolp_splat.renown[RENOWN_WISDOM] : 1) YARDS) * 20)
+
+ waiting_clients = 0
+ hostiles = 0
+
+ for(var/mob/living/guy in oview(range, owner))
+ if(guy.client)
+ waiting_clients++
+ ASYNC
+ var/choice = tgui_alert(
+ guy,
+ "Answer truthfully wether or not your character would consider [GET_GUESTBOOK_NAME(guy, owner)]([owner.real_name]) an enemy.",
+ "Is [GET_GUESTBOOK_NAME(guy, owner)] an Enemy?",
+ list("Yes", "No", "Unsure"),
+ 10 SECONDS
+ )
+ if(choice == "Yes")
+ hostiles += 1
+ guy.log_message("Answered [choice ? choice : "Nothing"] when asked if [owner] was hostile via Enemy's Ways.", LOG_GAME)
+ waiting_clients--
+ else
+ if(!guy.faction_check_atom(owner) && !guy.has_ally(owner))
+ hostiles += 1
+
+ if(waiting_clients > 0)
+ ASYNC
+ #define TIME_FOR_SLEEPS 0.5 SECONDS
+ var/time_waited = 0
+ while(waiting_clients > 0)
+ if(time_waited >= 10 SECONDS)
+ break
+ time_waited += TIME_FOR_SLEEPS
+ sleep(TIME_FOR_SLEEPS)
+ #undef TIME_FOR_SLEEPS
+ to_chat(owner, span_notice("The Grandfather Thunder's Stormcrow returns you its information. There are [hostiles] within [range] tiles."))
+ else
+ to_chat(owner, span_notice("The Grandfather Thunder's Stormcrow returns you its information. There are [hostiles] within [range] tiles."))
+
+ return TRUE
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/delirium.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/delirium.dm
index 21cc0c806757..5aed8ee6252c 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/delirium.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/delirium.dm
@@ -36,8 +36,12 @@
if(!wolf)
return FALSE
+ var/effective_dots = human_owner.st_get_stat(STAT_PERMANENT_WILLPOWER)
+ if(HAS_TRAIT(wolf, TRAIT_WEAK_DELIRIUM))
+ effective_dots += 2
+ willpower_dots = clamp(effective_dots, 1, 10)
+
to_chat(owner, span_boldwarning("Something DEEP inside you fill you with [willpower_levels[willpower_dots]] at the sight of [wolf]"))
- willpower_dots = clamp(human_owner.st_get_stat(STAT_PERMANENT_WILLPOWER), 1, 10)
if(owner.client)
// dir SOUTH is admitting i compeletly lost the fight against this stupid bullshit and cant get the image to properly mimmic the direction of the mob.
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/emotes.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/emotes.dm
index d7462edc11b3..cade821e3ad0 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/emotes.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/emotes.dm
@@ -22,27 +22,21 @@
/datum/species/human/shifter/feral/get_growl_sound(mob/living/carbon/human/human)
return 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/emotes/lupus_growl.ogg'
-/* // DARKPACK TODO - CORAX
-/datum/emote/living/caw
- key = "caw"
- key_third_person = "caws"
-message = "caws!"
+/datum/emote/living/warcry
+ abstract_type = /datum/emote/living/warcry
emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE
-/datum/emote/living/caw/get_sound(mob/living/carbon/human/user)
- if(!istype(user))
- return
- return user.dna.species.get_caw_sound(user)
-*/
+/datum/emote/living/warcry/get_range(mob/living/user)
+ if(HAS_TRAIT(user, TRAIT_LOUD_WARCRY))
+ return 60
-/datum/emote/living/howl
+/datum/emote/living/warcry/howl
key = "howl"
key_third_person = "howls"
message = "howls!"
message_param = "howls for %t!"
- emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE
-/datum/emote/living/howl/get_sound(mob/living/user)
+/datum/emote/living/warcry/howl/get_sound(mob/living/user)
var/static/list/howl_sounds = list(
'modular_darkpack/modules/werewolf_the_apocalypse/sounds/emotes/awo1.ogg',
'modular_darkpack/modules/werewolf_the_apocalypse/sounds/emotes/awo2.ogg',
@@ -56,9 +50,8 @@ message = "caws!"
if(user.is_clan(/datum/subsplat/vampire_clan/gangrel))
return pick(howl_sounds)
-/datum/emote/living/howl/get_range(mob/living/user)
- if(HAS_TRAIT(user, TRAIT_LOUD_HOWLER))
- return 60
+/datum/emote/living/warcry/howl/get_range(mob/living/user)
+ . = ..()
if(isdog(user) || istype(user, /mob/living/basic/mining/wolf))
return 7
@@ -68,3 +61,25 @@ message = "caws!"
if(user.is_clan(/datum/subsplat/vampire_clan/gangrel))
return 7
+
+
+/datum/emote/living/warcry/caw
+ key = "caw"
+ key_third_person = "caws"
+ message = "caws!"
+
+/datum/emote/living/warcry/caw/get_sound(mob/living/carbon/human/user)
+ if(!istype(user))
+ return
+ return user.dna.species.get_caw_sound(user)
+
+/datum/species/proc/get_caw_sound(mob/living/carbon/human/human)
+ return
+
+/datum/species/human/shifter/get_caw_sound(mob/living/carbon/human/human)
+ if(get_corax_splat(human))
+ return 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/emotes/caw.ogg'
+
+/datum/species/human/shifter/war/get_caw_sound(mob/living/carbon/human/human)
+ if(get_corax_splat(human))
+ return 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/emotes/cawcrinos.ogg'
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/innate/howling.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/innate/howling.dm
index 41f6e86075b6..92136aa6ff92 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/innate/howling.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/innate/howling.dm
@@ -54,7 +54,7 @@
. = ..()
var/mob/living/living_mob = owner
- var/datum/splat/werewolf/shifter = get_shifter_splat(owner)
+ var/datum/splat/werewolf/shifter/shifter = get_shifter_splat(owner)
var/list/menu_options = list()
for(var/howl_key in howls)
menu_options += howls[howl_key]["menu"]
@@ -76,9 +76,9 @@
garou_message = replacetext(garou_message, "tribe", tribe)
*/
var/origin_turf = get_turf(living_mob)
- ADD_TRAIT(living_mob, TRAIT_LOUD_HOWLER, GIFT_TRAIT)
- living_mob.emote("howl")
- REMOVE_TRAIT(living_mob, TRAIT_LOUD_HOWLER, GIFT_TRAIT)
+ ADD_TRAIT(living_mob, TRAIT_LOUD_WARCRY, GIFT_TRAIT)
+ living_mob.emote(shifter.warcry_emote)
+ REMOVE_TRAIT(living_mob, TRAIT_LOUD_WARCRY, GIFT_TRAIT)
var/howl_details
var/final_message
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/hud.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/hud.dm
index 0f9059e82980..f03b9f164040 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/hud.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/hud.dm
@@ -4,16 +4,19 @@
#define UI_LIVING_TRANSFORM_WAR "EAST-1,CENTER+1:40"
#define UI_LIVING_TRANSFORM_FERAL "EAST,CENTER+1:40"
-/datum/hud/proc/add_werewolf_elements()
+/datum/hud/proc/add_werewolf_elements(datum/splat/werewolf/werewolf_splat)
+ // if(werewolf_splat.uses_rage || werewolf_splat.uses_gnosis)
add_screen_object(/atom/movable/screen/auspice, HUD_MOB_AUSPICE, HUD_GROUP_INFO)
add_screen_object(/atom/movable/screen/rage_and_gnosis, HUD_MOB_RAGE_AND_GNOSIS, HUD_GROUP_INFO)
- add_screen_object(/atom/movable/screen/fera_transform/homid, HUD_MOB_HOMID_TRANS, HUD_GROUP_INFO)
- add_screen_object(/atom/movable/screen/fera_transform/war, HUD_MOB_WAR_TRANS, HUD_GROUP_INFO)
- add_screen_object(/atom/movable/screen/fera_transform/feral, HUD_MOB_FERAL_TRANS, HUD_GROUP_INFO)
+ if(istype(werewolf_splat, /datum/splat/werewolf/shifter))
+ add_screen_object(/atom/movable/screen/fera_transform/homid, HUD_MOB_HOMID_TRANS, HUD_GROUP_INFO)
+ add_screen_object(/atom/movable/screen/fera_transform/war, HUD_MOB_WAR_TRANS, HUD_GROUP_INFO)
+ add_screen_object(/atom/movable/screen/fera_transform/feral, HUD_MOB_FERAL_TRANS, HUD_GROUP_INFO)
/datum/splat/werewolf/add_relevent_huds(datum/hud/hud_used)
- hud_used.add_werewolf_elements()
+ hud_used.add_werewolf_elements(src)
+
/atom/movable/screen/auspice
name = "auspice"
@@ -131,6 +134,7 @@
return ..()
+
/atom/movable/screen/fera_transform
abstract_type = /atom/movable/screen/fera_transform
icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/hud_transforms.dmi'
@@ -157,23 +161,36 @@
// Right click for alt forms like glabro and hispo. Ctrl click to use rage to do it instantly (doesnt matter if its breed form tho)
shifting.transform_fera(LAZYACCESS(modifiers, RIGHT_CLICK) ? right_click_transform : left_click_transform, LAZYACCESS(modifiers, CTRL_CLICK))
+/atom/movable/screen/fera_transform/update_icon(updates)
+ . = ..()
+
+ var/mob/living/owner = hud?.mymob
+ if(!istype(owner))
+ return
+
+ var/datum/splat/werewolf/shifter/our_splat = get_shifter_splat(owner)
+ if(!istype(our_splat))
+ return
+
+ icon = our_splat.transform_hud_icon
/atom/movable/screen/fera_transform/add_context(atom/source, list/context, obj/item/held_item, mob/user)
. = ..()
var/datum/splat/werewolf/shifter/shifting = get_shifter_splat(user)
- if(left_click_transform)
+ if(left_click_transform && (left_click_transform in shifting.transformation_list))
context[SCREENTIP_CONTEXT_LMB] = "Shift to [left_click_transform::name]"
if(left_click_transform != shifting.get_breed_form_species())
context[SCREENTIP_CONTEXT_CTRL_LMB] = "Shift using rage"
- if(right_click_transform)
+ if(right_click_transform && (right_click_transform in shifting.transformation_list))
context[SCREENTIP_CONTEXT_RMB] = "Shift to [right_click_transform::name]"
if(right_click_transform != shifting.get_breed_form_species())
context[SCREENTIP_CONTEXT_CTRL_RMB] = "Shift using rage"
return CONTEXTUAL_SCREENTIP_SET
+
/atom/movable/screen/fera_transform/homid
name = "homid form"
icon_state = "homid"
@@ -181,12 +198,14 @@
left_click_transform = /datum/species/human/shifter/homid
right_click_transform = /datum/species/human/shifter/bestial
+
/atom/movable/screen/fera_transform/war
name = "war form"
icon_state = "war"
screen_loc = UI_LIVING_TRANSFORM_WAR
left_click_transform = /datum/species/human/shifter/war
+
/atom/movable/screen/fera_transform/feral
name = "feral form"
icon_state = "feral"
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/auspice.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/auspice.dm
index e4ae0065bda4..9afffe9d5f73 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/auspice.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/auspice.dm
@@ -1,16 +1,34 @@
-/datum/preference/choiced/subsplat/garou_auspice
- savefile_key = "garou_auspice"
+/datum/preference/choiced/subsplat/fera_auspice
+ abstract_type = /datum/preference/choiced/subsplat/fera_auspice
main_feature_name = "Auspice"
- relevant_inherent_trait = TRAIT_WTA_GAROU_AUSPICE
+ must_be_accessible = TRUE
+ var/splat_id
-/datum/preference/choiced/subsplat/garou_auspice/init_possible_values()
- return assoc_to_keys(GLOB.auspices_list) // This would be inclusive of ALL auspices so many need to be reworked when adding other fera
+/datum/preference/choiced/subsplat/fera_auspice/init_possible_values()
+ var/list/pref_list = list()
+ // Key is type path not singleton
+ for(var/datum/subsplat/werewolf/auspice/key as anything in GLOB.auspices)
+ if(key::fera_restriction != splat_id)
+ continue
+ UNTYPED_LIST_ADD(pref_list, key::name)
+ return pref_list
-/datum/preference/choiced/subsplat/garou_auspice/icon_for(value)
+/datum/preference/choiced/subsplat/fera_auspice/icon_for(value)
var/datum/universal_icon/auspice_icon = uni_icon('icons/effects/effects.dmi', "nothing")
auspice_icon.blend_icon(uni_icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/auspices.dmi', replacetext(LOWER_TEXT(value), " ", "_")), ICON_OVERLAY)
return auspice_icon
-/datum/preference/choiced/subsplat/garou_auspice/apply_to_human(mob/living/carbon/human/target, value)
+/datum/preference/choiced/subsplat/fera_auspice/apply_to_human(mob/living/carbon/human/target, value)
var/joining_round = !isdummy(target)
target.set_auspice(value, joining_round)
+
+/datum/preference/choiced/subsplat/fera_auspice/is_accessible(datum/preferences/preferences)
+ . = ..()
+ var/datum/splat/splat_path = preferences.read_preference(/datum/preference/choiced/splats)
+ if(!ispath(splat_path) || splat_path::id != splat_id)
+ return FALSE
+
+
+/datum/preference/choiced/subsplat/fera_auspice/garou
+ savefile_key = "garou_auspice"
+ splat_id = SPLAT_GAROU
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/breed.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/breed.dm
index f914e87c17e8..c325a73d7c36 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/breed.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/breed.dm
@@ -1,36 +1,42 @@
-/datum/preference/choiced/subsplat/garou_breed
- savefile_key = "garou_breed"
+/datum/preference/choiced/subsplat/fera_breed
+ abstract_type = /datum/preference/choiced/subsplat/fera_breed
main_feature_name = "Breed"
- relevant_inherent_trait = TRAIT_WTA_GAROU_BREED
-
-/datum/preference/choiced/subsplat/garou_breed/init_possible_values()
- return assoc_to_keys(GLOB.breed_forms_list)
-
-/datum/preference/choiced/subsplat/garou_breed/icon_for(value)
- var/datum/universal_icon/garou_icon = uni_icon('icons/effects/effects.dmi', "nothing")
- switch(value)
- if(BREED_HOMID)
- var/datum/universal_icon/breed_homid = uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_head_m")
- breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_chest_m"), ICON_OVERLAY)
- breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_arm"), ICON_OVERLAY)
- breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_arm"), ICON_OVERLAY)
- breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_leg"), ICON_OVERLAY)
- breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_leg"), ICON_OVERLAY)
- breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_hand"), ICON_OVERLAY)
- breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_hand"), ICON_OVERLAY)
- breed_homid.blend_color(skintone2hex("caucasian1"), ICON_MULTIPLY)
- breed_homid.scale(32, 32)
- garou_icon.blend_icon(breed_homid, ICON_OVERLAY)
- if(BREED_LUPUS)
- var/datum/universal_icon/breed_lupus = uni_icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/lupus.dmi', "black")
- breed_lupus.scale(32, 32)
- garou_icon.blend_icon(breed_lupus, ICON_OVERLAY)
- if(BREED_CRINOS)
- var/datum/universal_icon/breed_crinos = uni_icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/crinos.dmi', "black")
- breed_crinos.scale(32, 32)
- garou_icon.blend_icon(breed_crinos, ICON_OVERLAY)
- return garou_icon
-
-/datum/preference/choiced/subsplat/garou_breed/apply_to_human(mob/living/carbon/human/target, value)
+ must_be_accessible = TRUE
+ var/splat_id
+
+/datum/preference/choiced/subsplat/fera_breed/init_possible_values()
+ var/list/pref_list = list()
+ // Key is type path not singleton
+ for(var/datum/subsplat/werewolf/breed_form/key as anything in GLOB.breed_forms)
+ if(key::fera_restriction != splat_id)
+ continue
+ UNTYPED_LIST_ADD(pref_list, key::name)
+ return pref_list
+
+/datum/preference/choiced/subsplat/fera_breed/icon_for(value)
+ var/datum/universal_icon/breed_icon = uni_icon('icons/effects/effects.dmi', "nothing")
+
+ var/datum/subsplat/werewolf/breed_form/breed_form = get_fera_breed_form(value)
+ breed_form.generation_pref_icon(breed_icon)
+
+ return breed_icon
+
+/datum/preference/choiced/subsplat/fera_breed/apply_to_human(mob/living/carbon/human/target, value)
var/joining_round = !isdummy(target)
target.set_breed_form(value, joining_round)
+
+/datum/preference/choiced/subsplat/fera_breed/is_accessible(datum/preferences/preferences)
+ . = ..()
+ var/datum/splat/splat_path = preferences.read_preference(/datum/preference/choiced/splats)
+ if(!ispath(splat_path) || splat_path::id != splat_id)
+ return FALSE
+
+
+/datum/preference/choiced/subsplat/fera_breed/garou
+ savefile_key = "garou_breed"
+ splat_id = SPLAT_GAROU
+
+
+/datum/preference/choiced/subsplat/fera_breed/coeax
+ savefile_key = "corax_breed"
+ splat_id = SPLAT_CORAX
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/fur.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/fur.dm
index 5ffe5a8988fd..90d644a88090 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/fur.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/fur.dm
@@ -1,4 +1,5 @@
-/datum/preference/choiced/garou_fur_color
+/datum/preference/choiced/fera_fur_color
+ abstract_type = /datum/preference/choiced/fera_fur_color
savefile_key = "garou_fur_color"
savefile_identifier = PREFERENCE_CHARACTER
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
@@ -6,10 +7,26 @@
main_feature_name = "Fera Fur Color"
relevant_inherent_trait = TRAIT_FERA_FUR
must_have_relevant_trait = TRUE
+ var/splat_id
-/datum/preference/choiced/garou_fur_color/init_possible_values()
+/datum/preference/choiced/fera_fur_color/apply_to_human(mob/living/carbon/human/target, value)
+ target.dna.features[FEATURE_FUR_COLOR] = value
+
+/datum/preference/choiced/fera_fur_color/is_accessible(datum/preferences/preferences)
+ . = ..()
+ var/datum/splat/splat_path = preferences.read_preference(/datum/preference/choiced/splats)
+ if(!ispath(splat_path) || splat_path::id != splat_id)
+ return FALSE
+
+
+/datum/preference/choiced/fera_fur_color/garou
+ splat_id = SPLAT_GAROU
+
+/datum/preference/choiced/fera_fur_color/garou/init_possible_values()
return assoc_to_keys(GLOB.garou_fur_colors)
+/datum/preference/choiced/fera_fur_color/corax
+ splat_id = SPLAT_CORAX
-/datum/preference/choiced/garou_fur_color/apply_to_human(mob/living/carbon/human/target, value)
- target.dna.features[FEATURE_FUR_COLOR] = value
+/datum/preference/choiced/fera_fur_color/corax/init_possible_values()
+ return assoc_to_keys(GLOB.corax_fur_colors)
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/tribe.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/tribe.dm
index 289290610c0d..20ee26de9950 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/tribe.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/tribe.dm
@@ -1,16 +1,40 @@
-/datum/preference/choiced/subsplat/garou_tribe
- savefile_key = "garou_tribe"
+/datum/preference/choiced/subsplat/fera_tribe
+ abstract_type = /datum/preference/choiced/subsplat/fera_tribe
main_feature_name = "Tribe"
- relevant_inherent_trait = TRAIT_WTA_GAROU_TRIBE
+ must_be_accessible = TRUE
+ var/splat_id
-/datum/preference/choiced/subsplat/garou_tribe/init_possible_values()
- return assoc_to_keys(GLOB.tribes_list) // This would be inclusive of ALL tribes so many need to be reworked when adding other fera
+/datum/preference/choiced/subsplat/fera_tribe/init_possible_values()
+ var/list/pref_list = list()
+ // Key is type path not singleton
+ for(var/datum/subsplat/werewolf/tribe/key as anything in GLOB.fera_tribes)
+ if(key::fera_restriction != splat_id)
+ continue
+ UNTYPED_LIST_ADD(pref_list, key::name)
+ return pref_list
-/datum/preference/choiced/subsplat/garou_tribe/icon_for(value)
+/datum/preference/choiced/subsplat/fera_tribe/icon_for(value)
var/datum/universal_icon/tribe_icon = uni_icon('icons/effects/effects.dmi', "nothing")
tribe_icon.blend_icon(uni_icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/tribes.dmi', replacetext(LOWER_TEXT(value), " ", "_")), ICON_OVERLAY)
return tribe_icon
-/datum/preference/choiced/subsplat/garou_tribe/apply_to_human(mob/living/carbon/human/target, value)
+/datum/preference/choiced/subsplat/fera_tribe/apply_to_human(mob/living/carbon/human/target, value)
var/joining_round = !isdummy(target)
target.set_fera_tribe(value, joining_round)
+
+/datum/preference/choiced/subsplat/fera_tribe/is_accessible(datum/preferences/preferences)
+ . = ..()
+ var/datum/splat/splat_path = preferences.read_preference(/datum/preference/choiced/splats)
+ if(!ispath(splat_path) || splat_path::id != splat_id)
+ return FALSE
+
+
+/datum/preference/choiced/subsplat/fera_tribe/garou
+ splat_id = SPLAT_GAROU
+ savefile_key = "garou_tribe"
+
+/* // Exist in the changing breeds book.
+/datum/preference/choiced/subsplat/fera_tribe/corax
+ splat_id = SPLAT_CORAX
+ savefile_key = "corax_tribe"
+*/
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/silver_damage.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/silver_damage.dm
index 24dc27e71fe0..cc168c8a1a77 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/silver_damage.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/silver_damage.dm
@@ -19,6 +19,8 @@
/obj/projectile/bullet/proc/fera_silver_damage(mob/living/carbon/human/target, dice = 0)
if(!istype(target))
return
+ if(!HAS_TRAIT(target, TRAIT_SILVER_WEAKNESS))
+ return
var/datum/splat/werewolf/shifter/shot_pup_splat = get_shifter_splat(target)
if(shot_pup_splat)
var/mob/living/carbon/human/shot_pup = target
@@ -31,6 +33,8 @@
/obj/item/proc/fera_silver_damage(mob/living/carbon/human/target, dice = 0, gnosis_damage = 0)
if(!istype(target))
return
+ if(!HAS_TRAIT(target, TRAIT_SILVER_WEAKNESS))
+ return
var/datum/splat/werewolf/shifter/shot_pup_splat = get_shifter_splat(target)
if(shot_pup_splat)
var/mob/living/carbon/human/shot_pup = target
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_species.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_species.dm
similarity index 91%
rename from modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_species.dm
rename to modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_species.dm
index 650ba44d65d8..04b22e058ca9 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_species.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_species.dm
@@ -26,8 +26,6 @@
var/mob_pixel_z
/// If declared will override the mob size.
var/mob_size_override
- /// Stats added and removed upon gaining the species
- var/list/form_bonus_stats = list()
/// Dice roll difficulty required to shift into this form
var/shift_difficulty = 6
/// If update_body_parts is allowed to override the body render
@@ -67,8 +65,13 @@
clear_buffs(human)
+/datum/species/human/shifter/proc/get_buffs(mob/living/carbon/human/human)
+ var/datum/splat/werewolf/shifter/shifter_splat = get_shifter_splat(human)
+ if(shifter_splat?.transformation_stats && shifter_splat.transformation_stats[id])
+ return shifter_splat.transformation_stats[id]
+
/datum/species/human/shifter/proc/add_buffs(mob/living/carbon/human/human)
- for(var/key, value in form_bonus_stats)
+ for(var/key, value in get_buffs(human))
if(!should_add_buff(human, key, value))
continue
human.st_add_stat_mod(key, value, type)
@@ -77,7 +80,7 @@
return TRUE
/datum/species/human/shifter/proc/clear_buffs(mob/living/carbon/human/human)
- for(var/key, value in form_bonus_stats)
+ for(var/key, value in get_buffs(human))
human.st_remove_stat_mod(key, type)
/datum/species/human/shifter/proc/is_veil_breaching_form(mob/living/carbon/human/human)
@@ -148,12 +151,6 @@
/datum/species/human/shifter/bestial
name = "bestial form"
id = SPECIES_FERA_BESTIAL
- form_bonus_stats = list(
- STAT_STRENGTH = 2,
- STAT_STAMINA = 2,
- STAT_MANIPULATION = -2,
- STAT_APPEARANCE = -1
- )
shift_difficulty = 7
fallback_icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/glabro.dmi'
veil_breaching_form = TRUE
@@ -221,21 +218,16 @@
no_equip_flags = ITEM_SLOT_ON_BODY
- visible_gender_override = "beast"
-
mob_pixel_w = -8
mob_size_override = MOB_SIZE_LARGE
- form_bonus_stats = list(
- STAT_STRENGTH = 4,
- STAT_STAMINA = 3,
- STAT_DEXTERITY = 1,
- STAT_MANIPULATION = -3,
- // STAT_APPEARANCE = 0 // NOT YET SUPPORTED
- )
custom_body_render = TRUE
custom_damage_render = TRUE
fallback_icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/crinos.dmi'
+/datum/species/human/shifter/war/visible_gender_override(mob/living/carbon/human/holder)
+ return "beast"
+
+
/datum/species/human/shifter/dire
name = "dire form"
id = SPECIES_FERA_DIRE
@@ -263,22 +255,18 @@
no_equip_flags = ITEM_SLOT_ON_BODY
- visible_gender_override = "beast"
-
mob_pixel_w = -16
mob_pixel_z = -8
- form_bonus_stats = list(
- STAT_STRENGTH = 3,
- STAT_STAMINA = 3,
- STAT_DEXTERITY = 2,
- STAT_MANIPULATION = -3,
- )
shift_difficulty = 7
custom_body_render = TRUE
custom_damage_render = TRUE
fallback_icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/hispo.dmi'
speed_mod = /datum/movespeed_modifier/shifter/dire
+/datum/species/human/shifter/dire/visible_gender_override(mob/living/carbon/human/holder)
+ return "beast"
+
+
/datum/species/human/shifter/feral
name = "feral form"
id = SPECIES_FERA_FERAL
@@ -305,19 +293,18 @@
no_equip_flags = ITEM_SLOT_ON_BODY
- visible_gender_override = "wolf"
-
- form_bonus_stats = list(
- STAT_STRENGTH = 1,
- STAT_STAMINA = 2,
- STAT_DEXTERITY = 2,
- STAT_MANIPULATION = -3,
- )
custom_body_render = TRUE
custom_damage_render = TRUE
fallback_icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/lupus.dmi'
speed_mod = /datum/movespeed_modifier/shifter/feral
+/datum/species/human/shifter/feral/visible_gender_override(mob/living/carbon/human/holder)
+ var/datum/splat/werewolf/shifter/shifter_splat = get_shifter_splat(holder)
+ if(shifter_splat.mimmicing_animal)
+ return shifter_splat.mimmicing_animal::name
+
+ return "beast"
+
/datum/movespeed_modifier/shifter
abstract_type = /datum/movespeed_modifier/shifter
movetypes = GROUND
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/transformation.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/transformation.dm
similarity index 100%
rename from modular_darkpack/modules/werewolf_the_apocalypse/code/splats/transformation.dm
rename to modular_darkpack/modules/werewolf_the_apocalypse/code/species/transformation.dm
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm
index 1327bf4e11d3..864103a75d05 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm
@@ -86,12 +86,10 @@
/datum/splat/werewolf/shifter
abstract_type = /datum/splat/werewolf/shifter
splat_traits = list(
- TRAIT_WTA_GAROU_BREED,
- TRAIT_WTA_GAROU_AUSPICE,
- TRAIT_WTA_GAROU_TRIBE,
TRAIT_FERA_FUR,
- TRAIT_FRENETIC_AURA,
TRAIT_FERA_RENOWN,
+ TRAIT_FRENETIC_AURA,
+ TRAIT_SILVER_WEAKNESS,
)
// id = SPLAT_FERA
incompatible_splats = list(
@@ -103,6 +101,8 @@
splat_priority = SPLAT_PRIO_SHIFTER
var/list/transformation_list = list()
+ /// Stats added and removed upon gaining the species of the splat. Assoc list indexed by the species ids for each form
+ var/list/transformation_stats
var/transform_sound = 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/transform.ogg'
COOLDOWN_DECLARE(transform_cd)
/**
@@ -117,9 +117,15 @@
SPECIES_FERA_DIRE = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/hispo.dmi',
SPECIES_FERA_FERAL = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/lupus.dmi'
)
+ var/transform_hud_icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/hud_transforms.dmi'
+ /// Type path of the animal we look like in our feral form
+ var/mob/living/basic/mimmicing_animal
COOLDOWN_DECLARE(passive_healing_cd)
COOLDOWN_DECLARE(gnosis_regain_cd)
+ /// Emote uses for activations of gifts and other things
+ var/warcry_emote = "howl"
+
/datum/splat/werewolf/shifter/on_gain()
. = ..()
owner.set_species(/datum/species/human/shifter/homid)
@@ -154,6 +160,13 @@
continue
guy.apply_status_effect(STATUS_EFFECT_DELIRIUM, owner)
+/datum/splat/werewolf/shifter/proc/causes_delirium()
+ var/datum/species/human/shifter/shifter_species = owner.dna.species
+ if(istype(shifter_species))
+ return FALSE
+ if(shifter_species.causes_delirium && !HAS_TRAIT(owner, TRAIT_PIERCED_VEIL))
+ return TRUE
+
// Being used to represent meditating in your caern
/datum/splat/werewolf/shifter/proc/regain_gnosis_process(seconds_per_tick)
if(!COOLDOWN_FINISHED(src, gnosis_regain_cd))
@@ -161,7 +174,7 @@
for(var/obj/structure/werewolf_totem/totem in GLOB.totems)
if(totem.broken)
continue
- if(!(tribe?.name in totem.tribes))
+ if(!totem.is_friend_of_totem(owner))
continue
if(get_area(totem) != get_area(owner))
continue
@@ -178,22 +191,74 @@
/datum/species/human/shifter/dire,
/datum/species/human/shifter/feral
)
+ transformation_stats = list(
+ SPECIES_FERA_BESTIAL = list(
+ STAT_STRENGTH = 2,
+ STAT_STAMINA = 2,
+ STAT_MANIPULATION = -2,
+ STAT_APPEARANCE = -1
+ ),
+ SPECIES_FERA_WAR = list(
+ STAT_STRENGTH = 4,
+ STAT_STAMINA = 3,
+ STAT_DEXTERITY = 1,
+ STAT_MANIPULATION = -3,
+ // STAT_APPEARANCE = 0 // NOT YET SUPPORTED
+ ),
+ SPECIES_FERA_DIRE = list(
+ STAT_STRENGTH = 3,
+ STAT_STAMINA = 3,
+ STAT_DEXTERITY = 2,
+ STAT_MANIPULATION = -3,
+ ),
+ SPECIES_FERA_FERAL = list(
+ STAT_STRENGTH = 1,
+ STAT_STAMINA = 2,
+ STAT_DEXTERITY = 2,
+ STAT_MANIPULATION = -3,
+ )
+ )
+ mimmicing_animal = /mob/living/basic/pet/dog/wolf
-/* // DARKPACK TODO - CORAX
/datum/splat/werewolf/shifter/corax
name = "Corax"
id = SPLAT_CORAX
+ splat_traits = list(
+ TRAIT_FERA_FUR,
+ TRAIT_FERA_RENOWN,
+ TRAIT_FRENETIC_AURA,
+ TRAIT_GOLD_WEAKNESS,
+ )
transformation_list = list(
/datum/species/human/shifter/homid,
/datum/species/human/shifter/war,
/datum/species/human/shifter/feral
)
+ transformation_stats = list(
+ SPECIES_FERA_WAR = list(
+ STAT_STRENGTH = 1,
+ STAT_STAMINA = 1,
+ STAT_DEXTERITY = 1,
+ STAT_MANIPULATION = -2,
+ STAT_PERCEPTION = 3,
+ // STAT_APPEARANCE = 0 // NOT YET SUPPORTED
+ ),
+ SPECIES_FERA_FERAL = list(
+ STAT_STRENGTH = -1,
+ STAT_DEXTERITY = 1,
+ STAT_MANIPULATION = -3,
+ STAT_PERCEPTION = 4,
+ )
+ )
+ transform_sound = 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/corax_transform.ogg'
mob_icons = list(
SPECIES_FERA_WAR = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/corax_forms/crinos.dmi',
SPECIES_FERA_FERAL = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/corax_forms/corvid.dmi'
)
- transform_sound = 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/corax_transform.ogg'
-*/
+ transform_hud_icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/hud_transforms_corax.dmi'
+ mimmicing_animal = /mob/living/basic/corvid/raven
+
+ warcry_emote = "caw"
/mob/living/carbon/human/splat/kinfolk
@@ -201,3 +266,6 @@
/mob/living/carbon/human/splat/garou
auto_splats = list(/datum/splat/werewolf/shifter/garou)
+
+/mob/living/carbon/human/splat/corax
+ auto_splats = list(/datum/splat/werewolf/shifter/corax)
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/is_werewolf_helpers.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/is_werewolf_helpers.dm
index 08665939ddf5..1054fee7653b 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/is_werewolf_helpers.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/is_werewolf_helpers.dm
@@ -16,12 +16,10 @@
return character.get_splat(/datum/splat/werewolf/shifter/garou)
-/* // DARKPACK TODO - CORAX
/proc/get_corax_splat(mob/character)
- RETURN_TYPE(/datum/splat/werewolf/shifter/cora
+ RETURN_TYPE(/datum/splat/werewolf/shifter/corax)
return character.get_splat(/datum/splat/werewolf/shifter/corax)
-*/
/proc/get_kinfolk_splat(mob/character)
RETURN_TYPE(/datum/splat/werewolf/kinfolk)
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/pref_lore.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/pref_lore.dm
index a37c33482a3e..bed11397aea8 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/pref_lore.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/pref_lore.dm
@@ -39,14 +39,60 @@
SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK,
SPECIES_PERK_ICON = FA_ICON_DOG,
SPECIES_PERK_NAME = "Shapeshifting",
- SPECIES_PERK_DESC = "Garou can shift between 5 diffrent forms that grant them bonus.",
+ SPECIES_PERK_DESC = "Garou can shift between 5 diffrent forms that grant them bonuses.",
),
list(
SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK,
SPECIES_PERK_ICON = FA_ICON_BAND_AID,
SPECIES_PERK_NAME = "Passive healing",
SPECIES_PERK_DESC = "Garou have a strong passive healing while outside of their breed form.",
- )
+ ),
+ list(
+ SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK,
+ SPECIES_PERK_ICON = FA_ICON_MOON,
+ SPECIES_PERK_NAME = "Silver weakness",
+ SPECIES_PERK_DESC = "Silver weapons is unable to be soaked in non-breedforms and causes loss of Gnosis.",
+ ),
+ )
+
+ return to_add
+
+/datum/splat/werewolf/shifter/corax/prepare_human_for_preview(mob/living/carbon/human/human)
+ human.set_haircolor("#502D15", update = FALSE)
+ human.set_hairstyle("Long Hair 3", update = TRUE)
+ human.undershirt = "Shirt (Alien)"
+ human.update_body()
+
+/datum/splat/werewolf/shifter/corax/get_splat_description()
+ return "Messengers of Gaia, children of Raven, and scions of Helios; the wereravens travel accross the globe, guided by their innate curiosity and insatiable thirst for gossip. \nThey are renowned for their ability to gather useful intelligence, and the difficulty of making them stop talking."
+
+/datum/splat/werewolf/shifter/corax/get_splat_lore()
+ return list(
+ "Lorem Ipsum",
+ )
+
+/datum/splat/werewolf/shifter/corax/create_pref_unique_perks()
+ var/list/to_add = list()
+
+ to_add += list(
+ list(
+ SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK,
+ SPECIES_PERK_ICON = FA_ICON_DOG,
+ SPECIES_PERK_NAME = "Shapeshifting",
+ SPECIES_PERK_DESC = "Corax can shift between 3 diffrent forms that grant them bonuses.",
+ ),
+ list(
+ SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK,
+ SPECIES_PERK_ICON = FA_ICON_BAND_AID,
+ SPECIES_PERK_NAME = "Passive healing",
+ SPECIES_PERK_DESC = "Corax have a strong passive healing while outside of their breed form.",
+ ),
+ list(
+ SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK,
+ SPECIES_PERK_ICON = FA_ICON_SUN,
+ SPECIES_PERK_NAME = "Gold weakness",
+ SPECIES_PERK_DESC = "Gold weapons is unable to be soaked in non-breedforms and causes loss of Gnosis.",
+ ),
)
return to_add
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/_breed.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/_breed.dm
index ecb25894efdf..1412ae05a2ad 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/_breed.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/_breed.dm
@@ -11,6 +11,20 @@
var/datum/splat/werewolf/werewolf_splat = astype(gaining_splat)
werewolf_splat?.adjust_gnosis(start_gnosis)
+/datum/subsplat/werewolf/breed_form/proc/generation_pref_icon(datum/universal_icon/main_icon)
+ var/datum/universal_icon/breed_homid = uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_head_m")
+ breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_chest_m"), ICON_OVERLAY)
+ breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_arm"), ICON_OVERLAY)
+ breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_arm"), ICON_OVERLAY)
+ breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_leg"), ICON_OVERLAY)
+ breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_leg"), ICON_OVERLAY)
+ breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_hand"), ICON_OVERLAY)
+ breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_hand"), ICON_OVERLAY)
+ breed_homid.blend_color(skintone2hex("caucasian1"), ICON_MULTIPLY)
+ breed_homid.scale(32, 32)
+ main_icon.blend_icon(breed_homid, ICON_OVERLAY)
+
+
/**
* Gets the singleton of an breed_form
* from its name, typepath, or returns the
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/corax.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/corax.dm
new file mode 100644
index 000000000000..7c2e61e857d6
--- /dev/null
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/corax.dm
@@ -0,0 +1,29 @@
+/datum/subsplat/werewolf/breed_form/corax
+ abstract_type = /datum/subsplat/werewolf/breed_form/corax
+ fera_restriction = SPLAT_CORAX
+
+/datum/subsplat/werewolf/breed_form/corax/homid
+ name = BREED_CORAX_HOMID
+ start_gnosis = 1
+ breed_species = /datum/species/human/shifter/homid
+ gifts_provided = list(
+ /datum/action/cooldown/power/gift/enemy_ways,
+ /datum/action/cooldown/power/gift/open_seal,
+ /datum/action/cooldown/power/gift/spirit_speech,
+ )
+
+/datum/subsplat/werewolf/breed_form/corax/corvid
+ name = BREED_CORVID
+ start_gnosis = 5
+ breed_species = /datum/species/human/shifter/feral
+ gifts_provided = list(
+ /datum/action/cooldown/power/gift/enemy_ways,
+ /datum/action/cooldown/power/gift/scent_of_the_true_form,
+ // /datum/action/cooldown/power/gift/spirit_speech,
+ /datum/action/cooldown/power/gift/truth_of_gaia,
+ )
+
+/datum/subsplat/werewolf/breed_form/corax/corvid/generation_pref_icon(datum/universal_icon/main_icon)
+ var/datum/universal_icon/breed_crinos = uni_icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/corax_forms/corvid.dmi', "black")
+ breed_crinos.scale(32, 32)
+ main_icon.blend_icon(breed_crinos, ICON_OVERLAY)
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/garou.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/garou.dm
index 89195c2f666d..329c30950fe5 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/garou.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/garou.dm
@@ -2,17 +2,30 @@
abstract_type = /datum/subsplat/werewolf/breed_form/garou
fera_restriction = SPLAT_GAROU
+
/datum/subsplat/werewolf/breed_form/garou/homid
- name = BREED_HOMID
+ name = BREED_GAROU_HOMID
start_gnosis = 1
breed_species = /datum/species/human/shifter/homid
+
/datum/subsplat/werewolf/breed_form/garou/crinos
name = BREED_CRINOS
start_gnosis = 3
breed_species = /datum/species/human/shifter/war
+/datum/subsplat/werewolf/breed_form/garou/crinos/generation_pref_icon(datum/universal_icon/main_icon)
+ var/datum/universal_icon/breed_lupus = uni_icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/lupus.dmi', "black")
+ breed_lupus.scale(32, 32)
+ main_icon.blend_icon(breed_lupus, ICON_OVERLAY)
+
+
/datum/subsplat/werewolf/breed_form/garou/lupus
name = BREED_LUPUS
start_gnosis = 5
breed_species = /datum/species/human/shifter/feral
+
+/datum/subsplat/werewolf/breed_form/garou/lupus/generation_pref_icon(datum/universal_icon/main_icon)
+ var/datum/universal_icon/breed_crinos = uni_icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/crinos.dmi', "black")
+ breed_crinos.scale(32, 32)
+ main_icon.blend_icon(breed_crinos, ICON_OVERLAY)
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/tribes/garou.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/tribes/garou.dm
index 3917e1a366d6..e5947e031686 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/tribes/garou.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/tribes/garou.dm
@@ -161,15 +161,3 @@
// /datum/action/cooldown/power/gift/smooth_move,
// /datum/action/cooldown/power/gift/shroud
// )
-
-/* // DARKPACK TODO - CORAX
-/datum/subsplat/werewolf/tribe/garou/corax
- name = TRIBE_CORAX
- desc = "{CONSIDER : THIS IS A PLACEHOLDER, FEATURES WILL BE MISSING.} \nMessengers of Gaia, children of Raven, and scions of Helios; the wereravens travel accross the globe, guided by their innate curiosity and insatiable thirst for gossip. \nThey are renowned for their ability to gather useful intelligence, and the difficulty of making them stop talking."
- gifts_provided = list(
- /datum/action/cooldown/power/gift/eye_drink,
- /datum/action/cooldown/power/gift/smooth_move,
- /datum/action/cooldown/power/gift/suns_guard
- )
- tribe_trait = TRAIT_CORAX
-*/
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm
index 42b0e365caf9..da7ae5dcb71b 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm
@@ -105,7 +105,7 @@
continue
if(human.stat == DEAD)
continue
- if(!(shifter_splat.tribe.name in tribes))
+ if(!is_friend_of_totem(human))
continue
if(damage_change < 0)
@@ -122,6 +122,18 @@
SEND_SOUND(human, sound('modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/inspire.ogg', volume = 50))
shifter_splat.adjust_gnosis(1, FALSE)
+/// Returns true or false wether or not the totems benificial affects will target this mob
+/obj/structure/werewolf_totem/proc/is_friend_of_totem(mob/living/potential_friend)
+ var/datum/splat/werewolf/friends_splat = get_werewolf_splat(potential_friend)
+ if(!friends_splat) // RN the only totem effect relys on a werewolf splat
+ return FALSE
+ if(!friends_splat.tribe) // Dont fuck over tribeless fera. Prob need a better way to determine freinds tho
+ return TRUE
+ if(!(friends_splat.tribe.name in tribes))
+ return FALSE
+
+ return TRUE
+
/obj/structure/werewolf_totem/attack_hand(mob/living/user, list/modifiers)
. = ..()
if(user.combat_mode)
diff --git a/modular_darkpack/modules/npc/icons/wolf.dmi b/modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/wolf.dmi
similarity index 100%
rename from modular_darkpack/modules/npc/icons/wolf.dmi
rename to modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/wolf.dmi
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/icons/hud_transforms_corax.dmi b/modular_darkpack/modules/werewolf_the_apocalypse/icons/hud_transforms_corax.dmi
new file mode 100644
index 000000000000..6d04df9f25d3
Binary files /dev/null and b/modular_darkpack/modules/werewolf_the_apocalypse/icons/hud_transforms_corax.dmi differ
diff --git a/modular_darkpack/modules/npc/sound/caw.ogg b/modular_darkpack/modules/werewolf_the_apocalypse/sounds/emotes/caw.ogg
similarity index 100%
rename from modular_darkpack/modules/npc/sound/caw.ogg
rename to modular_darkpack/modules/werewolf_the_apocalypse/sounds/emotes/caw.ogg
diff --git a/tgstation.dme b/tgstation.dme
index 4bcb29504293..aa950f46b270 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -7484,13 +7484,10 @@
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\blood_guard.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\necromancy_zombies.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\shadow_guard.dm"
-#include "modular_darkpack\modules\npc\code\nonhuman\friendly\bird.dm"
-#include "modular_darkpack\modules\npc\code\nonhuman\friendly\bird_ai.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\friendly\cat.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\friendly\dog.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\friendly\rat.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\friendly\spawners.dm"
-#include "modular_darkpack\modules\npc\code\nonhuman\friendly\wolf.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\hostile\abyss_tentacle.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\hostile\baali_guard.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\hostile\bear.dm"
@@ -7856,6 +7853,10 @@
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\silver_damage.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\totems.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\werewolf_globals.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\basic_mobs\bird.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\basic_mobs\bird_ai.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\basic_mobs\wolf.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\changing_breeds\corax.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\_gift.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\auspices\ahroun.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\auspices\galliard.dm"
@@ -7873,14 +7874,14 @@
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\fur.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\renown.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\tribe.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\species\fera_species.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\species\garou_organs.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\species\transformation.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\splats\examine_text.dm"
-#include "modular_darkpack\modules\werewolf_the_apocalypse\code\splats\fera_species.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\splats\fera_splat.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\splats\is_werewolf_helpers.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\splats\pref_lore.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\splats\renown.dm"
-#include "modular_darkpack\modules\werewolf_the_apocalypse\code\splats\transformation.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\splats\varediting.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\splats\werewolf_gift_management.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\status_effects\delirium.dm"
@@ -7889,6 +7890,7 @@
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\subsplats\auspices\_auspice.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\subsplats\auspices\garou.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\subsplats\breeds\_breed.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\subsplats\breeds\corax.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\subsplats\breeds\garou.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\subsplats\tribes\_tribe.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\subsplats\tribes\garou.dm"