From c6dd94221710aa18d6f7061de7217e537b1ce3c8 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Tue, 24 Feb 2026 04:45:05 -0600 Subject: [PATCH 01/38] moves basic mobs here --- .../code/basic_mobs}/bird.dm | 0 .../code/basic_mobs}/bird_ai.dm | 0 .../code/basic_mobs}/wolf.dm | 36 +++++++++--------- .../icons/garou_forms}/wolf.dmi | Bin tgstation.dme | 5 +-- 5 files changed, 20 insertions(+), 21 deletions(-) rename modular_darkpack/modules/{npc/code/nonhuman/friendly => werewolf_the_apocalypse/code/basic_mobs}/bird.dm (100%) rename modular_darkpack/modules/{npc/code/nonhuman/friendly => werewolf_the_apocalypse/code/basic_mobs}/bird_ai.dm (100%) rename modular_darkpack/modules/{npc/code/nonhuman/friendly => werewolf_the_apocalypse/code/basic_mobs}/wolf.dm (83%) rename modular_darkpack/modules/{npc/icons => werewolf_the_apocalypse/icons/garou_forms}/wolf.dmi (100%) 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 100% rename from modular_darkpack/modules/npc/code/nonhuman/friendly/bird.dm rename to modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird.dm 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 100% 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 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 83% 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..54601c5efe5f 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 = iswerewolfsplat(user) + if(istype(wolp_splat?.auspice, /datum/subsplat/werewolf/auspice/garou/philodox)) // uncomment when dogs + if(wolf_type == TYPE_KINFOLK) + . += span_purple("On closer inspection, they appear to be kin.") + if(HAS_TRAIT(src, TRAIT_WYRMTAINTED)) + . += span_warn("They are strongly wyrm-tainted.") // Remove when we have a wyrm-tainted element or something + + /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) // 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/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/tgstation.dme b/tgstation.dme index d8f50f6ef0ac..32921310c57b 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7341,13 +7341,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" @@ -7678,6 +7675,8 @@ #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\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" From b69a482e33c998edc601c4ae77aa6dea94efe6b0 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Tue, 24 Feb 2026 05:34:41 -0600 Subject: [PATCH 02/38] prelim --- code/__DEFINES/~darkpack/fera/fera.dm | 2 ++ code/__DEFINES/~darkpack/splats.dm | 2 +- config/darkpack_config.txt | 1 + .../code/basic_mobs/wolf.dm | 6 ++-- .../code/splats/fera_splat.dm | 9 +++-- .../code/splats/pref_lore.dm | 34 +++++++++++++++++++ .../code/subsplats/breeds/corax.dm | 13 +++++++ tgstation.dme | 2 ++ 8 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/corax.dm diff --git a/code/__DEFINES/~darkpack/fera/fera.dm b/code/__DEFINES/~darkpack/fera/fera.dm index 7a93866a0454..ffd0792386c5 100644 --- a/code/__DEFINES/~darkpack/fera/fera.dm +++ b/code/__DEFINES/~darkpack/fera/fera.dm @@ -13,6 +13,8 @@ #define BREED_LUPUS "Lupus" #define BREED_CRINOS "Metis" //Its called metis because anything player facing should only show "Metis" instead of "Crinos", despite it being a crinos form. Blame gadabout. +#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 diff --git a/code/__DEFINES/~darkpack/splats.dm b/code/__DEFINES/~darkpack/splats.dm index bdc75565c439..c4443c34816a 100644 --- a/code/__DEFINES/~darkpack/splats.dm +++ b/code/__DEFINES/~darkpack/splats.dm @@ -10,4 +10,4 @@ #define SPLAT_GAROU "splat_garou" #define SPLAT_CORAX "splat_corax" // DARKPACK TODO - CORAX -#define SPLAT_ALL list(SPLAT_NONE, SPLAT_KINDRED, SPLAT_GHOUL, SPLAT_KINFOLK, SPLAT_GAROU) +#define SPLAT_ALL list(SPLAT_NONE, SPLAT_KINDRED, SPLAT_GHOUL, SPLAT_KINFOLK, SPLAT_GAROU, SPLAT_CORAX) diff --git a/config/darkpack_config.txt b/config/darkpack_config.txt index b540b9b946dd..82df0d8a5112 100644 --- a/config/darkpack_config.txt +++ b/config/darkpack_config.txt @@ -23,6 +23,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/modules/werewolf_the_apocalypse/code/basic_mobs/wolf.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/wolf.dm index 54601c5efe5f..59ce174e516d 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/wolf.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/wolf.dm @@ -92,11 +92,11 @@ /mob/living/basic/pet/dog/wolf/examine(mob/user) . = ..() var/datum/splat/werewolf/wolp_splat = iswerewolfsplat(user) - if(istype(wolp_splat?.auspice, /datum/subsplat/werewolf/auspice/garou/philodox)) // uncomment when dogs + 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_warn("They are strongly wyrm-tainted.") // Remove when we have a wyrm-tainted element or something + . += span_warning("They are strongly wyrm-tainted.") /mob/living/basic/pet/dog/wolf/add_obey_commands() @@ -159,7 +159,7 @@ /mob/living/basic/pet/dog/wolf/kinfolk/spiral/Initialize(mapload) . = ..() - ADD_TRAIT(src, TRAIT_WYRMTAINTED) + ADD_TRAIT(src, TRAIT_WYRMTAINTED, INNATE_TRAIT) // STATIC COLORS WOLF_COAT_HELPER(/mob/living/basic/pet/dog/wolf) 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 1b5e676b5e10..26657ab1c2ee 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 @@ -158,10 +158,16 @@ /datum/species/human/shifter/feral ) -/* // DARKPACK TODO - CORAX /datum/splat/werewolf/shifter/corax name = "Corax" id = SPLAT_CORAX + splat_traits = list( + TRAIT_WTA_GAROU_BREED, + TRAIT_WTA_GAROU_AUSPICE, + TRAIT_WTA_GAROU_TRIBE, + TRAIT_FERA_FUR, + TRAIT_FRENETIC_AURA + ) transformation_list = list( /datum/species/human/shifter/homid, /datum/species/human/shifter/war, @@ -172,4 +178,3 @@ 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' -*/ 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..39c0ed5255d2 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 @@ -50,3 +50,37 @@ ) 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 "Lorem Ipsum" + +/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 bonus.", + ), + 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.", + ) + ) + + return to_add 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..f84bee0f7798 --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/corax.dm @@ -0,0 +1,13 @@ +/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_HOMID + start_gnosis = 1 + breed_species = /datum/species/human/shifter/homid + +/datum/subsplat/werewolf/breed_form/corax/corvid + name = BREED_CORVID + start_gnosis = 5 + breed_species = /datum/species/human/shifter/feral diff --git a/tgstation.dme b/tgstation.dme index 32921310c57b..d2d48a465005 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7677,6 +7677,7 @@ #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\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" @@ -7705,6 +7706,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" From 4e0a74ce83c805cfd9561cb406989930b677f1c3 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Thu, 26 Feb 2026 15:39:48 -0600 Subject: [PATCH 03/38] corax --- code/__DEFINES/~darkpack/fera/werewolf_tribe.dm | 8 +++----- .../werewolf_the_apocalypse/code/basic_mobs/bird.dm | 4 +--- .../code/basic_mobs/bird_ai.dm | 2 +- .../code/splats/fera_splat.dm | 1 + .../code/splats/is_werewolf_helpers.dm | 6 ++---- .../code/splats/pref_lore.dm | 6 +++--- .../code/subsplats/tribes/garou.dm | 12 ------------ .../sounds}/caw.ogg | Bin 8 files changed, 11 insertions(+), 28 deletions(-) rename modular_darkpack/modules/{npc/sound => werewolf_the_apocalypse/sounds}/caw.ogg (100%) diff --git a/code/__DEFINES/~darkpack/fera/werewolf_tribe.dm b/code/__DEFINES/~darkpack/fera/werewolf_tribe.dm index 6c040cf46c96..04caa1b42453 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_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_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_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_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_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_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_WEAVER list(TRIBE_GLASS_WALKERS, TRIBE_BONE_GNAWERS) #define TRIBE_WYRM list(TRIBE_BLACK_SPIRAL_DANCERS) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird.dm index e0f7a6715b46..49722e701c31 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/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." @@ -104,8 +103,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/caw.ogg' /mob/living/basic/corvid/crow name = "crow" diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird_ai.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird_ai.dm index c2858c2c4a87..e36529d2c4ae 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/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/caw.ogg') emote_hear = list("Caws.") /datum/ai_planning_subtree/find_and_hunt_target/find_shiney 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 26657ab1c2ee..33d5b0854d82 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 @@ -178,3 +178,4 @@ 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' + 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 427b1be1b8ca..d2bb980be37d 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/iscorax(mob/character) - RETURN_TYPE(/datum/splat/werewolf/shifter/cora +/proc/get_corax_splat(mob/character) + RETURN_TYPE(/datum/splat/werewolf/shifter/corax) return character.get_splat(/datum/splat/werewolf/shifter/corax) -*/ /proc/iskinfolk(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 39c0ed5255d2..9a8ffa0013d2 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,7 +39,7 @@ 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, @@ -58,7 +58,7 @@ human.update_body() /datum/splat/werewolf/shifter/corax/get_splat_description() - return "Lorem Ipsum" + 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( @@ -73,7 +73,7 @@ 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 bonus.", + SPECIES_PERK_DESC = "Corax can shift between 3 diffrent forms that grant them bonuses.", ), list( SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, 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 fcf46b013c7f..4d05148532a2 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 @@ -150,15 +150,3 @@ // /datum/action/gift/smooth_move = 3, // /datum/action/gift/shroud = 4 // ) - -/* // 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/gift/eye_drink = 1, - /datum/action/gift/smooth_move = 2, - /datum/action/gift/suns_guard = 3 - ) - tribe_trait = TRAIT_CORAX -*/ diff --git a/modular_darkpack/modules/npc/sound/caw.ogg b/modular_darkpack/modules/werewolf_the_apocalypse/sounds/caw.ogg similarity index 100% rename from modular_darkpack/modules/npc/sound/caw.ogg rename to modular_darkpack/modules/werewolf_the_apocalypse/sounds/caw.ogg From 16f1ea5e5d91773eead51e7ab358e777c435b31e Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Thu, 26 Feb 2026 15:57:03 -0600 Subject: [PATCH 04/38] warcry --- .../code/basic_mobs/bird.dm | 2 +- .../code/basic_mobs/bird_ai.dm | 2 +- .../werewolf_the_apocalypse/code/emotes.dm | 45 +++++++++++------- .../code/gifts/innate/howling.dm | 4 +- .../code/splats/fera_splat.dm | 4 ++ .../sounds/{ => emotes}/caw.ogg | Bin 6 files changed, 37 insertions(+), 20 deletions(-) rename modular_darkpack/modules/werewolf_the_apocalypse/sounds/{ => emotes}/caw.ogg (100%) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird.dm index 49722e701c31..1e737b23e388 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird.dm @@ -103,7 +103,7 @@ message = "caws!" emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE vary = TRUE - sound = 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/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/werewolf_the_apocalypse/code/basic_mobs/bird_ai.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird_ai.dm index e36529d2c4ae..156783d0ae25 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/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/werewolf_the_apocalypse/sounds/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/werewolf_the_apocalypse/code/emotes.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/emotes.dm index dc36f3a8533e..f1f56b7828d7 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_HOWLER)) + 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,23 @@ 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) + return 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/emotes/caw.ogg' + +/datum/species/human/shifter/war/get_caw_sound(mob/living/carbon/human/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 2432605cc06b..9c77c4cc6774 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 = isshifter(owner) + var/datum/splat/werewolf/shifter/shifter = isshifter(owner) var/list/menu_options = list() for(var/howl_key in howls) menu_options += howls[howl_key]["menu"] @@ -77,7 +77,7 @@ */ var/origin_turf = get_turf(living_mob) ADD_TRAIT(living_mob, TRAIT_LOUD_HOWLER, type) - living_mob.emote("howl") + living_mob.emote(shifter.warcry_emote) REMOVE_TRAIT(living_mob, TRAIT_LOUD_HOWLER, type) var/howl_details 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 33d5b0854d82..e02dc615abcf 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 @@ -105,6 +105,9 @@ 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) @@ -179,3 +182,4 @@ ) transform_sound = 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/corax_transform.ogg' + warcry_emote = "caw" diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/sounds/caw.ogg b/modular_darkpack/modules/werewolf_the_apocalypse/sounds/emotes/caw.ogg similarity index 100% rename from modular_darkpack/modules/werewolf_the_apocalypse/sounds/caw.ogg rename to modular_darkpack/modules/werewolf_the_apocalypse/sounds/emotes/caw.ogg From bdd0b50d040e982e406fc58dca709e02ef88b2bb Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Thu, 26 Feb 2026 16:03:30 -0600 Subject: [PATCH 05/38] yea --- code/__DEFINES/~darkpack/traits/declarations.dm | 2 +- code/_globalvars/traits/_traits.dm | 2 +- code/_globalvars/traits/admin_tooling.dm | 2 +- .../modules/werewolf_the_apocalypse/code/emotes.dm | 8 +++++--- .../werewolf_the_apocalypse/code/gifts/innate/howling.dm | 4 ++-- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm index ad4ab74a8f39..eea03d2a0e1a 100644 --- a/code/__DEFINES/~darkpack/traits/declarations.dm +++ b/code/__DEFINES/~darkpack/traits/declarations.dm @@ -126,7 +126,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai // Expensive but allows us to ensure there resting gets updated. #define TRAIT_TRANSFORM_UPDATES_ICON "transform_updates_icon" // Massivly boosts the range of your howl emote. -#define TRAIT_LOUD_HOWLER "loud_howler" +#define TRAIT_LOUD_WARCRY "loud_warcry" /// Prevents the mob from picking up items larger then small #define TRAIT_SMALL_HANDS "small_hands" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 6c35637a7d3f..d3c70f720b32 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -693,7 +693,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_IRRESISTIBLE_VITAE" = TRAIT_IRRESISTIBLE_VITAE, // DARKPACK EDIT ADD "TRAIT_LAZY" = TRAIT_LAZY, // DARKPACK EDIT ADD "TRAIT_LONGER_FRENZY" = TRAIT_LONGER_FRENZY, // DARKPACK EDIT ADD - "TRAIT_LOUD_HOWLER" = TRAIT_LOUD_HOWLER, // 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_NEEDS_BLOOD" = TRAIT_NEEDS_BLOOD, //DARKPACK EDIT ADD - Hunger and Frenzy diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 544540773ad1..e61ab5d3c049 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -384,7 +384,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_IRRESISTIBLE_VITAE" = TRAIT_IRRESISTIBLE_VITAE, // DARKPACK EDIT ADD "TRAIT_LAZY" = TRAIT_LAZY, // DARKPACK EDIT ADD "TRAIT_LONGER_FRENZY" = TRAIT_LONGER_FRENZY, // DARKPACK EDIT ADD - "TRAIT_LOUD_HOWLER" = TRAIT_LOUD_HOWLER, // 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_NEEDS_BLOOD" = TRAIT_NEEDS_BLOOD, //DARKPACK EDIT ADD - Hunger and Frenzy diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/emotes.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/emotes.dm index f1f56b7828d7..e420323c30d1 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/emotes.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/emotes.dm @@ -27,7 +27,7 @@ emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE /datum/emote/living/warcry/get_range(mob/living/user) - if(HAS_TRAIT(user, TRAIT_LOUD_HOWLER)) + if(HAS_TRAIT(user, TRAIT_LOUD_WARCRY)) return 60 /datum/emote/living/warcry/howl @@ -77,7 +77,9 @@ return /datum/species/human/shifter/get_caw_sound(mob/living/carbon/human/human) - return 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/emotes/caw.ogg' + 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) - return 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/emotes/cawcrinos.ogg' + 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 9c77c4cc6774..ea2792acbefc 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 @@ -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, type) + ADD_TRAIT(living_mob, TRAIT_LOUD_WARCRY, type) living_mob.emote(shifter.warcry_emote) - REMOVE_TRAIT(living_mob, TRAIT_LOUD_HOWLER, type) + REMOVE_TRAIT(living_mob, TRAIT_LOUD_WARCRY, type) var/howl_details var/final_message From 0038a10c898d3df0aa0cae12b83ee4d4a3ded865 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Mon, 6 Apr 2026 23:40:36 -0500 Subject: [PATCH 06/38] yea --- code/__DEFINES/~darkpack/traits/declarations.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm index e007d0f40740..01fccea8378d 100644 --- a/code/__DEFINES/~darkpack/traits/declarations.dm +++ b/code/__DEFINES/~darkpack/traits/declarations.dm @@ -146,8 +146,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// 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 From 009f3a63da931856ed6576b3e3f42ff1ad2df37c Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Tue, 7 Apr 2026 03:49:24 -0500 Subject: [PATCH 07/38] few thinmgs --- code/_globalvars/traits/admin_tooling.dm | 1 + .../modules/weapons/code/projectiles.dm | 22 +++---------------- .../code/basic_mobs/wolf.dm | 2 +- 3 files changed, 5 insertions(+), 20 deletions(-) diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 6945ef008dce..e3fc3b06f909 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -390,6 +390,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_LONGER_FRENZY" = TRAIT_LONGER_FRENZY, // DARKPACK EDIT ADD "TRAIT_LOUD_WARCRY" = TRAIT_LOUD_WARCRY, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_LIGHT_WEAKNESS" = TRAIT_LIGHT_WEAKNESS, // DARKPACK EDIT ADD - Setite Flaw + "TRAIT_MASQUERADE_VIOLATING_EYES" = TRAIT_MASQUERADE_VIOLATING_EYES, // DARKPACK EDIT ADD "TRAIT_MASQUERADE_VIOLATING_FACE" = TRAIT_MASQUERADE_VIOLATING_FACE, // DARKPACK EDIT ADD "TRAIT_NEEDS_BLOOD" = TRAIT_NEEDS_BLOOD, //DARKPACK EDIT ADD - Hunger and Frenzy "TRAIT_NON_INT" = TRAIT_NON_INT, // DARKPACK EDIT ADD diff --git a/modular_darkpack/modules/weapons/code/projectiles.dm b/modular_darkpack/modules/weapons/code/projectiles.dm index 98860519c87d..1c789efd5867 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) -*/ + fera_silver_damage(target, 4) /obj/projectile/bullet/darkpack/vamp75 name = ".75 ball" diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/wolf.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/wolf.dm index 59ce174e516d..1d00dcb56774 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/wolf.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/wolf.dm @@ -91,7 +91,7 @@ /mob/living/basic/pet/dog/wolf/examine(mob/user) . = ..() - var/datum/splat/werewolf/wolp_splat = iswerewolfsplat(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.") From 80eb2a722c91c365c2b93f0bda8f26b26a0e488f Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Tue, 7 Apr 2026 23:31:10 -0500 Subject: [PATCH 08/38] linter fix --- modular_darkpack/modules/weapons/code/projectiles.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_darkpack/modules/weapons/code/projectiles.dm b/modular_darkpack/modules/weapons/code/projectiles.dm index 1c789efd5867..3c664dd9f4a4 100644 --- a/modular_darkpack/modules/weapons/code/projectiles.dm +++ b/modular_darkpack/modules/weapons/code/projectiles.dm @@ -188,7 +188,7 @@ /obj/projectile/bullet/darkpack/vamp762x51mm/silver name = "7.62x51mm silver bullet" -/obj/projectile/bullet/darkpack/vamp762x51mm/silver/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/darkpack/vamp762x51mm/silver/on_hit(atom/target, blocked = FALSE, pierce_hit) . = ..() fera_silver_damage(target, 4) From 662bec83b8316aaf821037515cf5e56fe35870d4 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 11 Apr 2026 10:37:55 -0500 Subject: [PATCH 09/38] yea --- code/_globalvars/traits/_traits.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index d9048be6e0cc..fc93245ab8af 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -703,7 +703,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_LIGHT_WEAKNESS" = TRAIT_LIGHT_WEAKNESS, // DARKPACK EDIT ADD - Setite Flaw "TRAIT_LOCAL_SIXTHSENSE" = TRAIT_LOCAL_SIXTHSENSE, // DARKPACK EDIT ADD "TRAIT_LONGER_FRENZY" = TRAIT_LONGER_FRENZY, // DARKPACK EDIT ADD - "TRAIT_LOUD_HOWLER" = TRAIT_LOUD_HOWLER, // 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 From 20382c2b5a450c708f3dfb6dada58c2821706c06 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 11 Apr 2026 12:01:20 -0500 Subject: [PATCH 10/38] yea --- .../modules/werewolf_the_apocalypse/code/splats/fera_splat.dm | 3 --- 1 file changed, 3 deletions(-) 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 477345126d0b..d938621decbb 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 @@ -180,9 +180,6 @@ name = "Corax" id = SPLAT_CORAX splat_traits = list( - TRAIT_WTA_GAROU_BREED, - TRAIT_WTA_GAROU_AUSPICE, - TRAIT_WTA_GAROU_TRIBE, TRAIT_FERA_FUR, TRAIT_FRENETIC_AURA ) From 0f5cc832371a437f65cbd978a264854ebecaf6be Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Thu, 7 May 2026 18:34:11 -0500 Subject: [PATCH 11/38] kills the hardcode of subsplats to garou --- .../~darkpack/traits/declarations.dm | 6 --- code/_globalvars/traits/_traits.dm | 3 -- code/_globalvars/traits/admin_tooling.dm | 3 -- code/modules/client/preferences_savefile.dm | 4 +- .../code/preferences/auspice.dm | 31 ++++++++++++---- .../code/preferences/breed.dm | 36 ++++++++++++++---- .../code/preferences/tribe.dm | 37 +++++++++++++++---- .../code/splats/fera_splat.dm | 3 -- 8 files changed, 85 insertions(+), 38 deletions(-) diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm index 9e4d2348ebfb..5f8f123d7df2 100644 --- a/code/__DEFINES/~darkpack/traits/declarations.dm +++ b/code/__DEFINES/~darkpack/traits/declarations.dm @@ -123,12 +123,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. diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index fc93245ab8af..73e47f7f50e9 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -750,9 +750,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_VTM_MORALITY" = TRAIT_VTM_MORALITY, // DARKPACK EDIT ADD "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 1dc7eeadd9f2..17b092c4ab92 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -433,9 +433,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_VTM_MORALITY" = TRAIT_VTM_MORALITY, // DARKPACK EDIT ADD "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_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/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/auspice.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/auspice.dm index e4ae0065bda4..0510b0a0a085 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,33 @@ -/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 + 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..2ecee2d1c8e2 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/breed.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/breed.dm @@ -1,12 +1,18 @@ -/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 + var/splat_id -/datum/preference/choiced/subsplat/garou_breed/init_possible_values() - return assoc_to_keys(GLOB.breed_forms_list) +/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/garou_breed/icon_for(value) +/datum/preference/choiced/subsplat/fera_breed/icon_for(value) var/datum/universal_icon/garou_icon = uni_icon('icons/effects/effects.dmi', "nothing") switch(value) if(BREED_HOMID) @@ -31,6 +37,22 @@ 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) +/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/tribe.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/tribe.dm index 289290610c0d..c706b4887e8f 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,39 @@ -/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 + 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/splats/fera_splat.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm index d938621decbb..aedf33db6671 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,9 +86,6 @@ /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, From c29033ac801b603798eed52937b79706743f7fdc Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Thu, 7 May 2026 19:04:00 -0500 Subject: [PATCH 12/38] makes handling for visable on a page vs acctually applied to the mob a bit smarter. --- code/modules/client/preferences.dm | 5 ++++- code/modules/client/preferences/_preference.dm | 13 +++++++++++++ .../code/modules/client/preferences/_preference.dm | 2 ++ .../code/preferences/auspice.dm | 1 + .../code/preferences/breed.dm | 1 + .../code/preferences/tribe.dm | 1 + .../code/splats/fera_splat.dm | 2 +- .../modules/werewolf_the_apocalypse/code/totems.dm | 12 ++++++++++++ 8 files changed, 35 insertions(+), 2 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index c09710573f4a..3679186216d2 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..d96513727dbd 100644 --- a/code/modules/client/preferences/_preference.dm +++ b/code/modules/client/preferences/_preference.dm @@ -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/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/modules/werewolf_the_apocalypse/code/preferences/auspice.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/auspice.dm index 0510b0a0a085..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,6 +1,7 @@ /datum/preference/choiced/subsplat/fera_auspice abstract_type = /datum/preference/choiced/subsplat/fera_auspice main_feature_name = "Auspice" + must_be_accessible = TRUE var/splat_id /datum/preference/choiced/subsplat/fera_auspice/init_possible_values() 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 2ecee2d1c8e2..ddd0400d7d6a 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/breed.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/breed.dm @@ -1,6 +1,7 @@ /datum/preference/choiced/subsplat/fera_breed abstract_type = /datum/preference/choiced/subsplat/fera_breed main_feature_name = "Breed" + must_be_accessible = TRUE var/splat_id /datum/preference/choiced/subsplat/fera_breed/init_possible_values() 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 c706b4887e8f..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,6 +1,7 @@ /datum/preference/choiced/subsplat/fera_tribe abstract_type = /datum/preference/choiced/subsplat/fera_tribe main_feature_name = "Tribe" + must_be_accessible = TRUE var/splat_id /datum/preference/choiced/subsplat/fera_tribe/init_possible_values() 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 aedf33db6671..301f10910400 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 @@ -155,7 +155,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 diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm index 1fdf8f886ee8..97a531c1f66f 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm @@ -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 totem.tribes)) + return FALSE + + return TRUE + /obj/structure/werewolf_totem/attack_hand(mob/living/user, list/modifiers) . = ..() if(user.combat_mode) From ebf23c5e1349546473d2014cc9d6b505a0fd9a2c Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Thu, 7 May 2026 19:27:32 -0500 Subject: [PATCH 13/38] wip for hud --- .../modules/deprecated/icons/32x48.dmi | Bin 37717 -> 35532 bytes .../modules/deprecated/icons/hispo.dmi | Bin 14551 -> 0 bytes .../werewolf_the_apocalypse/code/hud.dm | 4 ++-- .../werewolf_the_apocalypse/code/totems.dm | 4 ++-- .../icons/hud_transforms_corax.dmi | Bin 0 -> 2265 bytes 5 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 modular_darkpack/modules/deprecated/icons/hispo.dmi create mode 100644 modular_darkpack/modules/werewolf_the_apocalypse/icons/hud_transforms_corax.dmi diff --git a/modular_darkpack/modules/deprecated/icons/32x48.dmi b/modular_darkpack/modules/deprecated/icons/32x48.dmi index d3b06fc711f37e379141865d5d674654f1190237..44202e3ea1c263a8bb1fe07713dd9080150bdea0 100644 GIT binary patch literal 35532 zcmd41XIN7~*DjpULhni^0RmW%E{Gt#3J8cw??tL0NDrYmX`x83f*{g+HGn9+O9u@o z0i+XZNFayjdB5+RpXcw%b>*79cQR|;Yxc~VweB@>`p-0IDA_3i0051ars{J50H}EL zts^J9d9py%)p&EG5%|LRovMSkotLxcJ7DUCbu zE(L$g#;tEzT=SnQss6U4w$@fmrBC|`Oh(jIg7=5-3nVzUG z^3q0(-?2JPb6_XC#cqK;PV-p^JY1lAeJlL*r5qKp!{@yNsEt13%%gV@p_kNS-_P`NuH*R330|vCF=^SDYb|_voBhS9Blb!QXd~bd< z5)%@pv9o$>HsHG7b?31O69>=FfsHBOZYF)K90?4a7;7%x3)5!Cs=-qf3SbYY>=Q2K{v9QoVHX4ynm4rQ zSspnMxqjee{}bYVRd3>9*m?eIXMU`&$-QyUyLeFKM%CK7%8u;z!s}<*y)&AG?Gw7H z0B`@Vdql-V-d8=uA(ia`Z7C$JYp?)0xB@Pj;6y6TV8sm61>i%lm6n~)G6-3H;3>EJ z{{`)jWuN98xNd$!Tf0dq%xndQy*;!FarZpN^8fLWBl$dx=>@dKT?Ep%r5uXEF1z|h z>rWnPo+AGT2>NeZ9GTO48odH;@i^DZxHW*MR~CgGzkhQ-kvfZ}HD4Rc>;_&kUho4w zIYa(Zk?PNqal>+OOwUey1-ptMl-fv@sSkY5E=fpVeYp3-$c> zc;40yUwCzx;;VMvfgF+n$(T=P=ZF}&(h3my z0YkFCs!uN|OV*y36$dpCb3ass(&NsojeICwp-;xc7a>PK2yd>BT}e=+!`~7&WG?7D zIbM2Qvi=W7jcbi@7$Jd(NeCBfB^W7Kr?=v7+SBL(|6+ zVFj|R8)E_XfO_?x+~!Uep?)JdTwEI_4W{Fydj%hRkH@Bo1go0Lb2z4SFJNpKBgpHM z8gLt28zfD#PHDRc|_cW6GYS?&7IFeu=uF0;VH z;RYoZef-F*WAzrqn*j^@9ur>PFh{a^!Z2`D-p^ zKh+R=;i_82`u3Y{ze?l;FfOO2*4ij)Ahr8|MMM}==^WFhi`-SyUoTJ7+Y@Srk!X`& zacdC@d4UJ*KOqBoqwy%D{M-=#85Hd7~5$M?qZoxNx~nYXyT%CXkpk7Mz6@V90n*ktTl zvm={|d{QwiJJf8wJb++bHtgk&F+e^GrTySRJl>oFUV`$?hK@Ap0bP7V!<2jhqt;Ha zo_H&~txBLAS-b~yA%`p?-o-n%!`Lc%?bGF0%r{k?4T1I<$4ppPq~J5lhWp&U)>7CN zb?gO3MHo$}(1echpv>*6-OUYNR$~Zz0U}>oa`A){dtCX46&|#Aclt;H^~KkW^=^-y zQ^%{mv~#`~*c-cV;^eWLf4ff>8B$Md*V9JVgGP^`?OK?b;KYX%Wt!P3s$>m(M`2q6 zIaWVb$v=K84nwFD%T?{a|4Y=jO42ML4_z@^IBQgbWPPDHZF853e6w;(6(uv$1<}#GOon`U3!tcS5U=#j)udC6-7JYox z_qL^oq)8qbGPswve%t#hfmeGHCN+Pv1|7qwUEm4AB}f>--r|shSg3TG+GaW&Zw>|N ziZM$#i;7dEh1$*dMgZifo!=k9XwKe3n@smolR?$GbX_pmq0IX7<2WY&wIlQdKX~Z@ zyGn27JiB26%q3VD>%M%kU)lzDag&d2hv(YzwQA8q*chQox+_p6PSk5RWs20o9qC?o z9)ndj@T%dqstVT2IZ=OqGlY@1@7$dwF?xSV4+~L%#eJgqmZ^ipSFHa9{;4E$PZM{h zb*AP=MG0ePvJCuk8<+VD=Xd!Dp9Mz;V;qTo#$Xio9x24Yj;mb2CRKQ34=%3bn^64T3yu72JtysrOrJQl z+%pzR30}#VKU3aJlf4s}3DUHoWdbj4LI)Z`K1L_#Oy%{fIHl305y8dqAck;2Hn7lC zKEIvrdQgyh2y=O4mRf`z);nAyJ}5Lt(z#)r1B>A`*3-rq9wRA?S|%z=Ej3wcESb+j zRGeLhNcGpcA|+!gn7qk>o@eRK60yU?NLzU15pbztkRmtQ?kDrxqYI*@hj8;Q*aDuY zWhnEmh-8@i_PeK8sBF)LoB$2Y`iO|^PS_nDcJABhAO2pt*A2Z^op$(k3;S=q)y555 zgGWkXLj@FQ*qqYX3!Z%=t7s?`3v5Qehv08h5&R-HRGo>ME{; zv6`YkMs&wSGGV(Cbj<9V-_tM0_c_MS(poJ&*z-^HoHZVu<%x`Jg&t0QAAWM zfy}AXB!Ra@jR~kLKl)^c2>A$q@7)l{+^U5WgLNP|$~PB8O8M{PCPb4PW?Kbi*~8Wh zExMVQu;~@(7??xQ$N?}{3ps~w)EHvL_yp~xqFzPsS(IUTaP&Wk`sAHrx9oIu#Weh6 zvbPyi&py5djScGr+t4PH3DZ*vze-Kk>l=vZIl^df@_`*iI|FEV!1nPX?YbifI>JvT znw0C$##pF@z)VNcmB@2sRcEC)tO^EJL_Ygx!i>GUN?A(H4|c#>D)dM}diu;ODWw+3h+t4t|Frf3x!r@~Ah1BLJ}Bniy~U?Mx?uv}XVBev zDKGG{fvYl@(BOd-c$D)Cuq+HR(Ja17*)>nGqz*l7EWC1a3|f}?o?fCXAVcir=5Cr; zEt^OsZw1JNX^BP*7s{P5saff>rIf*D_I@_kioTN9qy@5E%78CEW3R;5h}%>FNE0}2ovo+|;`E_jOiZXU|<;Dsfc~ zTLs6zyiZv#6#b-WefV3wx#`1IY;3A}R@dqPbyDBv%>m*adittoZ2L^V{f0mcO1N+0 zO)%J0J1djn1ym_=iDdsi80|X*vd+*xMyQB6>)zeCwAqkk`Zoh_*GHLCVr!f{T(C}U zVqX<)dBz4`khjCl=A|#!R7SmJ6kVR$g0fS#p!GIxiY|eix72CVmmUhQ&LA$V-9C?d z7EQ-3J@o$IoRo=W zlb#f)gM@F=JrcP0ngLzTt5k7y<4u&p6LzEJLlkp*8-Dp<)7uMzzCjteqQ8IZ`D}d1 zK{62bTN}Ud}0tD@e+X3)3kOiz1c{Hq|b%LS*HfO zBboyoqPjdo7u@^0B`+C$FJ#zc%I1vzL+$iYbzAOUV4L z-1SL&|IFRG0qPOSc}`p8eJjzhW|_>88hbg~2}989ycmqEP26cmH)aw?01unHKAFDm z*v`L7Nq(I|X9AJ!I!V7D!N8diia|ZEesA6IsK?F@y)4>-mnua}+`W$*6l5@P-AS!2 z>49Y)UjKW+dU3k&gGQKgCYfSZyj(w|%XUbgv8aHJ761%qF2qp=gKxE2E6$T#U-eI=~_~KA$m3Dak9@iXSAuk1hE6ECQ)W+xg=NfJ>klyi+Tn zkkt-(Qo-PLsY9mHF8jxC5WYm)dZn9Q)Rjme+p#H@(CQx{z6F%I9f$oIV<@ z6iDyD+ggg9(VFQo6^s9tdOp`CT@yjoory*mN^Hoq8Jn;~`Ohd9HT1_hh8bS}%lvs= zmu@;KH&P4tcW0^_rwe;Gw z(az^yMW>(AQ75{!VVkH8jvq%gy^qWh&>xn(UaQ0$h{AYgv7F_WBcOXWyBsYcSd+d~ zP}dY6-ETBO;2HaMYm^eyP`OEM!T{YWB-gF8ePI+Jwu^fm-}AJ(s`jj269d$ecYS#s zr~H$M$L{%;u`CgXk8Bn^(Iw&nIQH~p#eN3A>kp1r%aC^HXx;?sLn^QCZzSf3wwYA- zk*u8=dyZ>@l5Q&9B^cK__akFa=Xu|{#;MNRjW!CgoU2FNY0%lBDN813GyDs?chQpi zh(iS5tWk{oH}i zD$lT&*k#FT`3Z1Zsdqkc)6?!o5=s4yd*V-pV%7#aR?2xSWaN+&UsK^vE`iz5YKq!Q z?YzuJWq2HPsh?ISju$0d=)XyAQWZ9 zo7EWku9C%#7}%{jirdX!sjSorlQ2QnrZuBGif)o;5zJq-w(^Hxn@fzjKt{+zHRvY^ z`f`c`bZubu&u|lCBB48XjAaq3xafba|IAmQqmD(m)AKx zpRxbU4H-)$6VcX{=9t+>T$I4u%tB&{aEPQ30jiW*INFDn;tVmK*neYZbFp@h zl9FYVIDUr2qCLvJJ$RBen~`bym%9!#OAzwRozjzoG%5CPgOG{JE-R_4Io)3z!uZI5x5dwZKyu4#b$@6y}ddpCyNbhkyb5Se=>>_yx)esj|`@elDy zwp*z+>;Hao3v8`)^U*sIP+S($Rh*)Y`LQ6M6^{NNsg}WEV#C`?Ag(5_;k)HoYi0aw zzKK0Kl!2djYKm*;@AaScG7CxH=usab{*KSh3a9-p!J{G}5VBRZTMs!BzK;dk;jAe$ zIPAJZO0WPW|E!d&8AGE@daj&Mmj_LcPbO93hb;8*z^>j|8c~|V{Ba4Fc`&CrnaOdqyctY@%+VxV#0h&0{S$jI-z~iG2 z+g|c_zZ;}F41Y=P*EnxqhNJDc#I51P5DPIXm`Z|c6uIA`!=}r;#li2L6)@qVn{nRJ z|Nj@nMFK3grhH5yuPFaI-zS3yoK<`=7OFWf=_3ZIm`&rB_6{31S)Hdma*jmm1Y6|< z{8*T`TCdf`_8M3t@+EyH6bLXoUOKKT(y3H?rC1qqzu$Fpnh%)mtU^+{&(=YtN{aH5 zGW=@>OdLc~AGx%5`uy!hg0H<_9fnY2g(G1P3xSbwQDPTDNsY-1lMN z-{{;oHP^>W)sDg3goC$*|Fl}X&8?n&|BYI>>0|W<+dkzJ{7K|698ykjDChG1TmYXj zxPPIL+-+BjD#r`2r{5^B+sQOT(s}(Nh(B#77eq|nP*1duWM(kX( z(1}dvnZkhG#tHb?Wi-uC zE9EOQ+ue7OFIaJx@%ZNZ3KT%$V<(~Z;7}Cd`k}==Rw0~x6Qfz1O8b+-~9&K&T(s#*3p zczL~G@Vf?8v$N^@HDvoT1RnH``O)@u(BMJPl_lm0;`CZjaeT8d5+L>nhyx^ti9MXG zKL*&LCxV#$aTZsGFWoe6k@^uy#Y;_M3ikLz9)L`sHO3pRfl z6dU7oeBgu?4vD3+Hw7S*j!%NlpGdb@cK>!S4akE+ok z#Et#w?iJV!E@XQ%x|q)WkUBDQn)tpcZR=PVVu~KHHgyn75bdi^2wRa?%mSRebyA2) z*Xsra^WO~?wfnep8D~DPaCTMbhyDI>m~I-NBsbIX?9m!YBTWv=VDjJ|DBT-wExAp> zp5{j#vdS6|ifMg7H+mM7vgYkBQya32Q<%W0BxP%0^VuO+0W%!}rHx5^%67d{Sv|%@ zQRruJ#pYO!$Wfci81*+`olLeVfspE~9^rS`$miMC?t{UEO_S?|bA>4UGa7_F-{xxF zt`$&hTCM;wHH=6r{dqoMvNo3kp3DHv`X=n1^Y(3CE|0S*!^d&mzKO%^Q>LM-uEttlm{E-_#}+e2k5)AL}?~*hMaKiYHz5l^FS=+LmXe9*2l=GNKQ@ z5}I%hsO<_Gj-mr0v|mM8ah{;!-3;kaD{)cEJO+4<&r^L zR8NF|cU|qva_4zqEn>eC+G|ioa278V!FU~Z9R=X4-}(zAIxao>hq~Ke5#?D&{g7A$?Xv7PDUm*x%#pZ8DhpPP`gz^To8gat+g#hE5 z7v!4|eBb71=QLPfq%%kC^HD&vT6X>lj`<6gHmq?s6Xql|**V%TwqUK-DC#Z% zKf@9^5Hy_Z>ap2Tc5jn}HKd+f-6SJRl3MK|b0_LgDkun8*J}lpM++?zmK=!`Pidsr z`NA+uHHG5ABPDJ#q&~{O^vSkwv>!in=Iy=`vFvED8R#5$8<5)7<{yYM%Jc6sR9}{7 zxm^H=rxT@9d}Ta2$PHV)?%n*$nK$C4ELKLBDzIO#7i`{q5PV)y(}u}4>?Nb8x%~~z z8|s!yM;JMlY||^?8?sU!o;g*rFnB$~HIJB9MIQdquDse0@+dh{+W8jlVdv%NJpL&5u}uk5qgh9HgGfl|k05xU2G4xdSw&1fZcy3P>esR-n23veYwp5ACAg_!FwBd*t9DH)ra{_}XZR zd@%Ra&$%1QPT}NIRr@SvO#?WO5&+{q2M^=45ew!%)1kKqAD>SBu?THZV!&Fd~UG}F%-e(lMIHD;~+m)0BYC%7%k(AWU@$gb=`1PU{T6j4vvp< z^YbL?Y$73Oa2BQ%g+M;o<&&|M9hF@jr3)U$mk;5h=i%?3<~nfIfzfTeEmBxHBiBrl zp<5dQw^!e5ae0d9)1`wvQ4%f>sBv295UH{$*lL7`>oBQ4S<(-mqd;KBeFerg$GMl5 z5mm0sr?}M(vo{azkC!r0&%Yj@%(_p=?t^9vk?X#V9^|20P@tC?*k4dNMyd>%*fI#V zLMGO2#gqtqRvM$DS=?y!cFvUd>3OUP8d{Kgpy`rVS&Eqw$YS~vGE>$mXXKLV#Sy2g z?2=?W|2+y9fjdcmUG>Hepi;(NY);=fqxngw#;#K?dD;F7%b+OJ)h{1fdob^ZavI#w zv+|m!p!j9o5`nLy!Fi6Nf-#0B&%;+eo@ zh0lVT+v;5Jc@?^0E&(lj0KNpLJm_Q2WcS*jQ-X6+GZty?!1UZTEz!s&OtP6R4^Wq+ zUaRYEK}%jVCMZZO%_ubB@JxIapwEG>hba7J0i0KSk(d53662GFyrTk+#~9z9(<*x| zz|*W0u!l!U7m+>(_J+aew?b=ax*0A2I@TY5N82feUvMd_x+}h8F%?9o9I~GDcnFz! z7(XF9jf%dw96R`zUij%gXVV9Ww$`oE7G^hZN4AI_^#eiB{Pix*Twm96i?@+exT^rb6iy?at+;Qwcw%TFE zLf4#7#P?cR2 z4&I0}@F1hLziKACuj};herZ6(Lt~TM2l->v^Eh+>Mq%h>s%-Ks8q=;HM60Dnr0C>W z!B>?WG}D)G7B!PbH71wTy##N`@g%6a~y9vM3N>VklH)aR0pyNG)vhN9_m3z?`lp`}MgmB}`{_&cDjj z(6ewb#74ElN4p#OWr!iN7g<{%6}Cq)n=vyMsRo*l6RY%CiaW*|vG;t8l#G69dUaXm zX-vNjrf#zkxPJ`83c2}wf~9hd*ru~tpRCNQM*nl-gZy(%BZ=J84R7Erl25V8^Ip9U z$`$8{54%105lvu!{g)0?O+NI^bHqT0x0Hm$*y7ROmY|iC*>hp)o6EN&{W;^Q76VD`gc< z?wY9uG!3Bm`;>dU@;NmPZqBrZQnhKSYAgT>qtqg*9Q;Y0{qvTS5tqi+M5o{t25}Va zQeM1y2RZqsEqItRj$FdCmmA!WTsv0Ua!TZk4?C65yuGCsirZ~OwZt!pR>y6j7%K*g zZ%&6GXP6g6`5CtQ`J17+ufFw9yvUGxpr7+DuyduhnKyviW+!unR2L@o(<&9*!wuby zvZZ=H_!}%0npYZqFQ{Jgj~zrcqq??Ud)X~w_l-IcFd$S_Q}X%9&j|WM+|b#b!%XJVln_GF1D04FnZ2Z zA!9nSGfcV*?I~OdboJ?@k(TPVv0anC);?t2?+eM}h!@6sSy^G-4W@HJ2vqdKPWN(t z%fT(u4AThC^hS3KxSHpb%O`U4t^b`=i1kj)NGP?WYQ7uiV^{XL)(3mh*uckvo_7}P z4R%gsT4*32%0{wd3&M>R;WK~g^cdN7Eu4~5BU#6q8NM{q&Z8um@DOauu3O*RA-lWX zT6w;z;a@wx?KRH_j}rBCNBUf5KN1AB6tBGnUzdvmEim=^j#k*%)RwF92PlvjCb*`S zYI55?Rg4`uu9D`+lAMW%V74wyyRfi*nQ%8F*3c}K3tssfrdX)WnA&|XEgI2d zT_>J#6cH_@n-mDq6zYWa+ID&X@4Btq z^EVfVy?7QtnhWeD^1?B6I>YnGLEey8@IpyemZey2j|egiD-*NJgi4`Y@UycERxfT# zv#V&bhZfn!)u7j({&9JSlscAcSooffuF5oMv#+_Hxj11;s29hcf$uvsGc>7|)6omC z2J0+MkW7L!yP1MtR=}(+Fmb#J$#|r7EmfAsjH&YYK!C9^?TBqa`}ULM)vL5~A}UEe z;fe#gA?o&^U8Cjot2pLcLesBf>^z0W*Yu5Z9xYo(uhbH=G*IVeYh&@%y0&w_E*^3P zM0~{n&>m*oMSFhKuwh}$@sNlyx4yTnzRES(!jos=OWBL%n$xddanL(&V5{gNM5dcE z?4y112HKTb6Q(f6Es>cNE74M5>w8R-QNo4BDTQ++!p7W_3GS)cg5UdXY9+IWU~)+m znluci#zyI{R8r?(h&RW84H!3Hcp$PMu@C5~_gI$?ST6<-zUZY`>95jhc}2@@+iX!d z2c~Y-32WF%p-(vJ=p8GQ*tPfc1kCL6wU(qptX^;zohSjt(^fyYTj6N)Z%Fx;- zYH)5W=}1(6xe*fu?wC>7@YUx28s{QSO|@C>OSpUgFtQto_$NEVX@Q9d4th0{LQ+RAZ!Zexiu z#vKzTMaW8qoy2@aXB0l{R@%b+m&zHw+f7wJpA6AlJ`FzP1DkwFPYoBHZ0*++As=@b zRwgd#PIMNOa(_S~9@|S^t6lk5$ah*Nx!|_pX7Ln@+90xLRQK;&8O&-aY>#f|KA2sI zf!(=4xhzhk$;5H}=&vM7TG z`i`TxS@a0wH`Gr(rn9EDsEFpIHf&~6&{!`}cqrzWq#UB4oODPn+M^s^vT-+N<2*mI z;sQ|V^5yz6@b-Uro&Ts)?umSz4;mzKmN5u)X;KTfIL>&-^I4?MmHP45#GMMrEziIi0~fr5Ag5!s=2OyV zPXyI-Yb$GEPwcy{^KXcG+w}vl@;%ww8{4QJf2#}%*O&b+7A&BAo-)BuVE{6b$0sHL zb{Hx;S0D1e<5)GkcT*?pT>X5{OY}KMRyeQ5TP@((mQ(a!zY|rUXTq-1G^q%DAn7U+2zT0W-4#@#%6W_Tp;e{##q$vrZm261d5Hkn+ea#|bQJ<(D=Dv_= z2Iu%kcco<9ziCz1GI_%h%8>ubnv9Ux=#OHtGUf7G1sYmJP0oUr>kde>(It)2m$EJm z4jPBWbyXAH*6utmiZdg%_%{-d@3W(Kq`O}uGU;<@;~)d;_bqySRLWr!n71_1AOu)#OS7I|eqb{QG2&Yt zp<_e*2%vcMVw|1^ATD~Bdj0yJ_8V!Rp8wK1d8eVZR7mw4RC@A%Sso=|PUrC%UWWd) zOFOA6M{l3a8o!E41c3r6QW2*0litzv-aym4wvp^Yr|5bc2zg2%)O4`S_lF{gLmo~X z$N?u_xE(|{c^L4u3v_Z7yxnLeNdTXJj>#spfdE%2{@izUpQnNgj^yM+c3pE@TZ$C< z20;t3D?yQNF@g&r`J|WgJiOeML4APs#^acb%#b)VMfcr%5Kp@U-F-@HvLUcP26aJ25Zs5o@A8y~Dlkl^H;` z_a#0+&x?AHIgmM*vF%WU^Z!;73X8x7T!P3DoN072uF4bI_+3N3fywnHls zF@lmm;JjB-jjL&KqmtsO`$+nI_9tWVGl`{xJ~<^Ae-m{SuHNltY6Yy`9K#=rp-Dn2 zS`XU4V4|ik{h1a0O`4gBtsm=XkoF+ru+({e)DWWc!o^0%C}s1!A|{1zLlsc*9G5EN z2~l7S%j*lSQb;>ADCgP*K2eYZ9s9}p?e0P}h@$zhC&u8AZgyB!+h z)AzIAu5ctOhrv1?^HE)g#Ep$3aL*i7>;;aSr)e^=ObV?4fxf`xfg|pjP zHP-E6y*s}1^x{?KkHH=Cr12CYL`~T*#xB<#h_&j9>41`$imggSq=bzA4L2Mjrloa+X5(hW+G6rp2seLUE5Ji~p1}*&0D1WPe1W%+;wq z73QxCVdSESl9OQt{sKVNTui(^I&uFb%gHj8*VMN(%e6{gFGr7{f+56W7_6ZRHzk5J z`x1M+IFxKBRB(M#E~_99#;<~2Oa5#5yF9K4;i zbnUd@kx-=>iSN{92aHsM`#o3ZmSZYa3V;h%OrOMe*`CcFIsz>l}Z}wc|5I ziGp2$b@N*%?q3J$6OkSTpEVZdFJ6Dvc;d3rR?`5}YB+ZiJ-On-we?j>DEL^SYy*i! zr0peWcyEh;R{S5Ya{o;#)YX&5?&?&JfzJdzVyaDn2d4#xOkz_IiCrF)b*WfJX>#WM* z#SpCXbf2$V+WMVjXFlCs+_10g3%ZW0jO<``sDiFoaHl5^Xhj$BGn5 zGFe14$371D4Cg2)NQJh>Eh1j4isrDbvYX+^)ewc(Jvx-S+$ynj6^hT1im zmMw5@J;8rJwl2@14_fRxR^5qyQl~!QEDETf3J2H^1o^&v|4+c-KJoI_{j?jmoYWC5 z1=tv`SE!&_d1fMxN?8BPE9xxVsbdY6X#U4^KUU}Lku#3G^!?1Az$4+qjx{<}>E7Z3 zg-$3&rcU^7QL`fBVj6d=Gsd;$ZPs}Z+GhJ{PDVRloh;{I-hkVsj<|e+#`Dsa_d8`+1WlE7mIT|f6 z#+$T`3pe^&aY|-aLxte5^hcf`L~xtiT_R?`l#hQs`W|Rj`YKtm%A2qh?UV_oGP2v- z7UKnxOg@o3u?E&0s|0;=8r&3Ch=nL6k!BrZ8|PzS&l=>#AYpl)D_<6$rk#c2^l*T< zmlFOB;yelnt|S|_nG@QelkJdQkbXgJ#&p^2kYeIqUfulzP&Jzi>rd$-ImS6b`J*_; zT%=JB>*<+3iC@%Dty&m%!7l@O2QMY@c{a(V=k;&uob*fc>RkJAqKWvELg=*?Rt^%Jp*H?Kc=-uRARZlI0azp&yh5JP+iq`sQEjnz(MyQ*J~ z75Px>J!^mUL#HJ5T9HFj-c0`ZXT_dbPV=F<%l*PhRn2d^D&aFru+|8C(b{4-r&OU; ztZ&7`$GX1mlPUHU4%6hX1UD8%C!>$1yjx>Ns)qLO9PHE5`LXZ4&>T%#Q446 zoH%xPXKu#dQE7VzYNOZ~u@OzEkz{q@oFTGEu`*-VA(zZvB-eX$KxKp=T2}HB)=gqB z+G90RHOW-^mU>>5ELA>1y!cNsHi;Hg-mByMi(uXRQwvL zt2#N_ilQZzuzC64_Ypj|FNi;ZC(2IW=B{Wcd^{th*q{0ys5({ra%P+<0gpuA9XU+- zVVAv2IT#wv`H5}v%6hR!B?5ADFb_nfqry~{H-7HQ`^Rs&f{m$;4f-P8;eIZ{l+(e< zeM~UCGPyoQ4{XKOnTeGP(TeQKke{%+-sm_uKA@^tWOz*D=zVJ3SUB+Jm`j|-G57YL zVV0Aq`+t^w^F|c5s8Wl>Jbp;+3#R;AQOcHB$dKI%ubmSNj%0@_QkZ!?T&o67V;@A& zn*Nn+phRn5dpRT)3$3zHeie8lN%I0MI?0 z<}Zp%!{o|+E0CX-pHL8x_T1XkV=NKxMMWQ`3vA|+5o64BBTQ%_&CmASdlAUfzK&|p z)8zwtMBCP~#P^q*!08pA>;^{Ei5zHSOZC24@!Td;`-cH1ufOs+?Lt<=X#+tTVGbp! ziHdsqiJ9U9ZJu8GKr_jgb9Ws@b#iO9E)UGv^Y%Z45gKTbrF@$Ui0`ulku&E-2daNY zPVheL)MFOet2(e zi=v@QT248mZiw}b$FDp}tmv0zDfBfU|L_@((J%&Q#!qe}Fl-`>A?$+>LZo|_VQrbb zDPzXB#$C2qZuuzig~L1+iBXvvY%MLnDCnFkRJd_^so=rgnV+wJS}VT6>5(I}#-}-> z%LbrMMSAQBW0CHB?ab?f54&q;WMJ$ypFOENB%51~mDdq?7s8*Xf_aPVLRdqt9g3Jd4voNhP19+*0X z=L|q~E7;C>hSE#Anv`6!pAn^7!QEZ9$YSB`;@{Z5IJ{Fz`u>eUcL8L~%@-l8qcb-( zqp$fuMGsiPlUD3b%=bMsWkrhV6*rT%B60#eka&v!6wQLe-weUNtz?(HvuKN^=%h4F zG{GW_)-1$2AVFkl^o7y$#+7G@Z?_EWl_3vx%PEAcq@*61slH0G7NWSTG2s8?OPqV8 zos9oy3UYGYqFSvXafiq$$KN&_ptzp;VBRT<`Cn4!{Vzg`e$1TpHpmm0okcNzUnE&M zj)wM9Ng^osDdq>oj%halz8k>pl%(a2#v;28k4r7`ix02Ax>0mbGn3f=HnkcQPdTa5 z(j4a*)wCbRO-jNUoDeiQVeB%JAytc1LVu5wbt9&nMJ~@>JWF!{%~FD`oq>U+TSS7y zY#Q+|ZtMC^ub{=~7;nm7$BJ3DZPjP0PFzRCOO`IbRQQ~$AFLW7$H1?TsW5(3zSF9_ zFO4K=OA5UtZ4>9<$fThx<(m{&L5)3u+B1}zfxqU9yR+z)DGQY|V`ojV$6_E}UMpHW zQ7z}|v~=w8`di0N-f#7qh_YHEc4|Q)q9t--k*ftmx)$tW>7qRqZKU-*{vUs0O4>iT z+S~t{9gQ~rnQ6SS2~H*Jv!-ZP;IL;Oy?s1Cf%i$o>}q>fbo37aV&^V&O4|f<@;R$V zzJ-|dv(}NCIQA2#+kI*NiubQy0NqZsj;&Pynj}bmq;37Ldr+ zUTEid-i~Nkl6BrmbU_1CA|o`SDjJ1U5VGLHc5V+4EOx}|)WS~1-2Vc6^JVqwXk)jJ zo82B4&X0Q;(VEkWis;N0)7%|QhD(_VbIr-H(8W>xx>q=lc)RrKj-VA-Lc@ZaN1AWbS5Ld^5{A?eWM zb6gtoQ93bW`ue<)c4KyL%_)+ci_w)^>jBAsC_M3IrH$wR){;(!E=gU<0GjLZ(_Zhe zNS`#T5GzAnGUD~mf)LhmIf48=L>TPR>YFEYFp9F(WWOi^V=vYNNq-vO-pFQl|TzyA30czwSTI*x}h+ zIKvgZmaVDQF=-7@d4GvbXHX5z(RW*qaxYE{>16ViBzP#CI_`M9@!req_Q`M4o0op5 zw79R!)7#}gfBeiiVDePK`G3)M-qCD#0Usw~)reJ_1ZnWpo~1^J8bv8pTD!K|t2Gj_ zdF)ZUMyb7LX>BD|?Y(P{qIS$T&w2lS-@oo3IVa~PC+C-Y@Av!pTogF-FX}_Q_Ix$R zRzZ&qjz-^A)AAX6wRq&eeN~0bx1~K^Q#@_SGNW*zHscz3YI?P-=ehlP@M@Uy@>4#j z`|HC>J(`<61}BN>@6+Yq#pl_*=X8mhUa0wiN*a+HP9KbKO%EdV-r?UB^5zqZ>yqL%FyVUhpIT>%eqQ z`XR$j6@?AgF`LNzam3p6MT+dN$PjsBqV^LTw00Md$E`gT2r$nohr`y1D~m_GNG zh`WKiLF8`y51wi{(mN2Sg(elVkgGHh<1qez4=nnMEcB{AE9AmE|3Q-R4nJuuglg&n>uojWdD_xCIcGOQtqt2wb01c9`(e455$?0Ze&4ZNE1$(T%;`TA*FmEZh5 z23g-Ir;y>T@PL1YkQ=`t%`bQgXbfCop|D!%BwQn-Ti^PJpxt$XUNeo-J^ifF&OR4K z_U1))C0H#+PG(xT^sXbQupxdw>-yivHkJX9`8p+rD|=Un2Jl(crG1PX8oQUbn6{!C zdyG{55^@s=>8mRb7`U21wOD6IJ~2Mab*9>rxUVt?_e_R_-_G}(naLl1 zJ@*DQ>`@%!+n;5gBAA`CdYUTbxqdt|_kCkp zCyjA$Q{B^f*RgI#(ObuW0um=oO)-M3^ z)R5imAAVQWy0gENy*sy3eOiyX5IIxi`lt1)jYEYyi6F)WhL2f{pQX%g$sy0)w9P0m zIVg~)+>2hw#$%D^T$EYTui3e2a}gVz`Gl*&sS3x5Fd@=k92n(iCf7>6iFss~5^D4GSL0x+bjS3?T}0FT*21f!os-9;G>n`SL`Tu&!(56adYerB z?Cc4r`H5}i{x1K}$mrcpV{#d7-+35UIy=X`253A(@rtWtI8)qPuqYVbUQNlKBk+%X z^>JrX{K8XU5>5jA-357;qT7uaB3k9^Ai-JJ+W` z=m`W-!L>fe;3LMk1JcMPy}UY81iKhYIj;Y6`#~7#ZJ`#|Z7mu=dSFpW9mA+Q0!F&g zoXHt0KUW--JujH}ZMkgir5Q{gzB~sGzi;guSBMyan}%xrk%wZ{60v_)$N8b>DFX3l5Tk^~MDhyRN zGHXmrR_n_BULAXcxz!mNrPtu;J)mo)v?Z={?H5)YvGzrc>l=?kljGJkk*pswtQ8E* zIH!MFqi&kY+TNc<)P*FpTityw$?@YMkrEu$pg`}Y6u5x~B6xv6i0u8KO7`K&6@g0+ z=E(7{pkfVn0dk9LI(9)l*tZ!ih-Zc0>$)m#k#$>+#_Lz_(Y(SFD}}*B*@Y@WCZ&*S zyYf&u1(rEKv+DfI4MG3eCP7c@;Hlqpp^x``H7W4Vnf88dWoC9O(O!PRXHi_Pkh=<^ zax>iwxl|O&=OsV=bN`)W1fR+fM6--mC{vzEJ`O|@6Tf|egbcmQXkrohsE9x#|9J|M z3ILT1Eibs(wIGQ#NTh7y!<~6l|HPu&>nTUMx|{vOv%ruiezp#>9&>Vv#iZ5zLyy+k z|106Emq=6mn@d1bEacp`PWYbKg8Ty^=X$To_kTk7`9>JX)c-@o2&;K$^BCyp`1t>W z-~OM0^_SFs6%;wt71k|(KJzK|=ImPks14V2hW89;$=NBlF1@ajQJrLbKu`Pe4!Il< z!cJkWA+vS4mcep&aPh+?iM7zXs7q!A!*7^;KG#bWPJEFK6zi@Xv1H&9RVDD-GSqrA zYu7tz_t^h%RE2SfjBE;jze^bTc%0DIJE?7}<=l4N;`6bqh5(jEa?#J-bGwUDge+V& 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 diff --git a/modular_darkpack/modules/deprecated/icons/hispo.dmi b/modular_darkpack/modules/deprecated/icons/hispo.dmi deleted file mode 100644 index 51672f049cc7d6792c30818dac486ba74bc49c16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14551 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 Date: Thu, 7 May 2026 22:12:29 -0500 Subject: [PATCH 14/38] fix --- modular_darkpack/modules/jobs/code/_job_assignment.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 From ca9cf244dd45729395c96049f31a485826ceeed6 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Thu, 7 May 2026 23:36:32 -0500 Subject: [PATCH 15/38] breed form icon handling better. --- code/__DEFINES/~darkpack/fera/fera.dm | 3 +- .../code/preferences/breed.dm | 29 ++++--------------- .../code/subsplats/breeds/_breed.dm | 14 +++++++++ .../code/subsplats/breeds/corax.dm | 16 +++++++++- .../code/subsplats/breeds/garou.dm | 15 +++++++++- 5 files changed, 51 insertions(+), 26 deletions(-) diff --git a/code/__DEFINES/~darkpack/fera/fera.dm b/code/__DEFINES/~darkpack/fera/fera.dm index 348e8ecac3b4..b4822184c989 100644 --- a/code/__DEFINES/~darkpack/fera/fera.dm +++ b/code/__DEFINES/~darkpack/fera/fera.dm @@ -9,10 +9,11 @@ #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" 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 ddd0400d7d6a..c325a73d7c36 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/breed.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/breed.dm @@ -14,29 +14,12 @@ return pref_list /datum/preference/choiced/subsplat/fera_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 + 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) 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 index f84bee0f7798..a64881f9abcd 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/corax.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/corax.dm @@ -3,11 +3,25 @@ fera_restriction = SPLAT_CORAX /datum/subsplat/werewolf/breed_form/corax/homid - name = BREED_HOMID + name = BREED_CORAX_HOMID start_gnosis = 1 breed_species = /datum/species/human/shifter/homid + gifts_provided = list( + /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/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) From c547209829525d9688cd71ddc9c2cfa34ba8a142 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 8 May 2026 00:00:03 -0500 Subject: [PATCH 16/38] yeagh --- code/modules/client/preferences/_preference.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/client/preferences/_preference.dm b/code/modules/client/preferences/_preference.dm index d96513727dbd..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) From e0b43920926a428986e88ec486de84b853488862 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 8 May 2026 05:34:22 -0500 Subject: [PATCH 17/38] yeagh --- .../~darkpack/traits/declarations.dm | 2 + code/_globalvars/traits/_traits.dm | 4 +- code/_globalvars/traits/admin_tooling.dm | 2 +- .../werewolf_the_apocalypse/code/delirium.dm | 6 ++- .../code/splats/fera_species.dm | 36 +++----------- .../code/splats/fera_splat.dm | 47 ++++++++++++++++++- 6 files changed, 63 insertions(+), 34 deletions(-) diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm index d3bd43887c21..324ec685f4dd 100644 --- a/code/__DEFINES/~darkpack/traits/declarations.dm +++ b/code/__DEFINES/~darkpack/traits/declarations.dm @@ -136,6 +136,8 @@ 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" +// 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 diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 6c0cdc7f8dcd..bd026c681fa1 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -742,10 +742,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,6 +760,7 @@ 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_WYRMTAINTED" = TRAIT_WYRMTAINTED, // DARKPACK EDIT ADD - WEREWOLF diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index a871d338d75b..f4e737def404 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -400,7 +400,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_LOCAL_SIXTHSENSE" = TRAIT_LOCAL_SIXTHSENSE, // DARKPACK EDIT ADD "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 @@ -438,6 +437,7 @@ 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_WYRMTAINTED" = TRAIT_WYRMTAINTED, // DARKPACK EDIT ADD - WEREWOLF 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/splats/fera_species.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_species.dm index 650ba44d65d8..f0b83f1a0caa 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_species.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/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 @@ -225,13 +222,6 @@ 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' @@ -267,12 +257,6 @@ 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 @@ -307,12 +291,6 @@ 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' 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 0b16f50d7a26..138b82523551 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 @@ -100,6 +100,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) /** @@ -178,6 +180,33 @@ /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, + ) + ) /datum/splat/werewolf/shifter/corax name = "Corax" @@ -191,11 +220,27 @@ /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' warcry_emote = "caw" From 3df2210e4f31452281067f189859da34b9faff67 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 8 May 2026 05:40:23 -0500 Subject: [PATCH 18/38] silver immunity --- code/__DEFINES/~darkpack/traits/declarations.dm | 1 + code/_globalvars/traits/_traits.dm | 1 + code/_globalvars/traits/admin_tooling.dm | 1 + .../modules/werewolf_the_apocalypse/code/silver_damage.dm | 4 ++++ .../modules/werewolf_the_apocalypse/code/splats/fera_splat.dm | 1 + 5 files changed, 8 insertions(+) diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm index 324ec685f4dd..ee07776c9b4f 100644 --- a/code/__DEFINES/~darkpack/traits/declarations.dm +++ b/code/__DEFINES/~darkpack/traits/declarations.dm @@ -136,6 +136,7 @@ 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" // Delirium is effectivly two levels weaker #define TRAIT_WEAK_DELIRIUM "weak_delirium" // Massivly boosts the range of your howl emote. diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index bd026c681fa1..2144ffd2d760 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -711,6 +711,7 @@ 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_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 diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index f4e737def404..e0a9202b7e8a 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -398,6 +398,7 @@ 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_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_MERIT_UNTAMABLE" = TRAIT_MERIT_UNTAMABLE, // DARKPACK EDIT ADD - MERITS_FLAWS 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_splat.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm index 138b82523551..4d50ed4169f5 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 @@ -89,6 +89,7 @@ TRAIT_FERA_FUR, TRAIT_FRENETIC_AURA, TRAIT_FERA_RENOWN, + TRAIT_SILVER_WEAKNESS, ) // id = SPLAT_FERA incompatible_splats = list( From 12fbcd5c00b9cca9c91355b3c769bde035e54286 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 8 May 2026 06:23:34 -0500 Subject: [PATCH 19/38] yeagh --- code/__DEFINES/~darkpack/fera/fera.dm | 11 ++++++- .../~darkpack/traits/declarations.dm | 1 + code/_globalvars/traits/_traits.dm | 1 + code/_globalvars/traits/admin_tooling.dm | 1 + .../werewolf_the_apocalypse/code/hud.dm | 29 +++++++++++++++---- .../code/preferences/fur.dm | 25 +++++++++++++--- .../code/splats/fera_splat.dm | 5 +++- 7 files changed, 62 insertions(+), 11 deletions(-) diff --git a/code/__DEFINES/~darkpack/fera/fera.dm b/code/__DEFINES/~darkpack/fera/fera.dm index b4822184c989..fd28eb1c24c2 100644 --- a/code/__DEFINES/~darkpack/fera/fera.dm +++ b/code/__DEFINES/~darkpack/fera/fera.dm @@ -25,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/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm index ee07776c9b4f..fb9c4e60c5aa 100644 --- a/code/__DEFINES/~darkpack/traits/declarations.dm +++ b/code/__DEFINES/~darkpack/traits/declarations.dm @@ -137,6 +137,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai // 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. diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 2144ffd2d760..144d95286564 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -712,6 +712,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_LIGHT_WEAKNESS" = TRAIT_LIGHT_WEAKNESS, // DARKPACK EDIT ADD - Setite Flaw "TRAIT_LOCAL_SIXTHSENSE" = TRAIT_LOCAL_SIXTHSENSE, // DARKPACK EDIT ADD "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 diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index e0a9202b7e8a..0ba6de609f55 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -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 diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/hud.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/hud.dm index 7a8101079dd8..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,6 +161,18 @@ // 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) . = ..() @@ -174,6 +190,7 @@ 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/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/splats/fera_splat.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm index 4d50ed4169f5..e3285b95e365 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 @@ -117,6 +117,7 @@ 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' COOLDOWN_DECLARE(passive_healing_cd) COOLDOWN_DECLARE(gnosis_regain_cd) @@ -214,7 +215,8 @@ id = SPLAT_CORAX splat_traits = list( TRAIT_FERA_FUR, - TRAIT_FRENETIC_AURA + TRAIT_FRENETIC_AURA, + TRAIT_GOLD_WEAKNESS, ) transformation_list = list( /datum/species/human/shifter/homid, @@ -242,6 +244,7 @@ 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_hud_icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/hud_transforms_corax.dmi' warcry_emote = "caw" From 43c5c1fbb21ad192fd5a82768574010e33dedb8b Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 8 May 2026 17:45:25 -0500 Subject: [PATCH 20/38] sepcies override --- .../mob/living/carbon/human/_species.dm | 6 +++--- .../modules/guestbook/code/human_helpers.dm | 5 +++-- .../code/basic_mobs/bird.dm | 2 +- .../code/{splats => species}/fera_species.dm | 21 +++++++++++++------ .../{splats => species}/transformation.dm | 0 .../code/splats/fera_splat.dm | 4 ++++ tgstation.dme | 4 ++-- 7 files changed, 28 insertions(+), 14 deletions(-) rename modular_darkpack/modules/werewolf_the_apocalypse/code/{splats => species}/fera_species.dm (95%) rename modular_darkpack/modules/werewolf_the_apocalypse/code/{splats => species}/transformation.dm (100%) 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/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/werewolf_the_apocalypse/code/basic_mobs/bird.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird.dm index da49962cf398..d4b6478e825e 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird.dm @@ -66,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 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 95% 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 f0b83f1a0caa..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 @@ -218,14 +218,16 @@ no_equip_flags = ITEM_SLOT_ON_BODY - visible_gender_override = "beast" - mob_pixel_w = -8 mob_size_override = MOB_SIZE_LARGE 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 @@ -253,8 +255,6 @@ no_equip_flags = ITEM_SLOT_ON_BODY - visible_gender_override = "beast" - mob_pixel_w = -16 mob_pixel_z = -8 shift_difficulty = 7 @@ -263,6 +263,10 @@ 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 @@ -289,13 +293,18 @@ no_equip_flags = ITEM_SLOT_ON_BODY - visible_gender_override = "wolf" - 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 e3285b95e365..56a5349b017c 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 @@ -118,6 +118,8 @@ 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) @@ -209,6 +211,7 @@ STAT_MANIPULATION = -3, ) ) + mimmicing_animal = /mob/living/basic/pet/dog/wolf /datum/splat/werewolf/shifter/corax name = "Corax" @@ -245,6 +248,7 @@ SPECIES_FERA_FERAL = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/corax_forms/corvid.dmi' ) transform_hud_icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/hud_transforms_corax.dmi' + mimmicing_animal = /mob/living/basic/corvid/raven warcry_emote = "caw" diff --git a/tgstation.dme b/tgstation.dme index 818cc314131a..7d63f1ca3dff 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7873,14 +7873,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" From ca7632192972d7a39131e22500d161d876c77b0c Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 8 May 2026 20:51:57 -0500 Subject: [PATCH 21/38] enemy ways --- code/__DEFINES/~darkpack/combat.dm | 4 ++ .../code/changing_breeds/corax.dm | 54 +++++++++++++++++++ .../code/splats/fera_splat.dm | 8 +++ .../code/subsplats/breeds/corax.dm | 2 + tgstation.dme | 1 + 5 files changed, 69 insertions(+) create mode 100644 modular_darkpack/modules/werewolf_the_apocalypse/code/changing_breeds/corax.dm 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/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..3efe3bbf4e60 --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/changing_breeds/corax.dm @@ -0,0 +1,54 @@ +/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 + 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/splats/fera_splat.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm index 56a5349b017c..eb40340772dc 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 @@ -160,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)) @@ -252,6 +259,7 @@ warcry_emote = "caw" + /mob/living/carbon/human/splat/kinfolk auto_splats = list(/datum/splat/werewolf/kinfolk) 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 index a64881f9abcd..7c2e61e857d6 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/corax.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/corax.dm @@ -7,6 +7,7 @@ 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, ) @@ -16,6 +17,7 @@ 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, diff --git a/tgstation.dme b/tgstation.dme index 7d63f1ca3dff..aa950f46b270 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7856,6 +7856,7 @@ #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" From ac2bc10f84969c3f6cdfed2910dae44a75cc4b48 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 9 May 2026 02:29:20 -0500 Subject: [PATCH 22/38] yeagh --- .../code/changing_breeds/corax.dm | 1 + .../code/splats/fera_splat.dm | 3 ++- .../code/splats/pref_lore.dm | 16 ++++++++++++++-- 3 files changed, 17 insertions(+), 3 deletions(-) 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 index 3efe3bbf4e60..d9e532a8e29e 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/changing_breeds/corax.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/changing_breeds/corax.dm @@ -32,6 +32,7 @@ ) 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)) 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 eb40340772dc..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 @@ -87,8 +87,8 @@ abstract_type = /datum/splat/werewolf/shifter splat_traits = list( TRAIT_FERA_FUR, - TRAIT_FRENETIC_AURA, TRAIT_FERA_RENOWN, + TRAIT_FRENETIC_AURA, TRAIT_SILVER_WEAKNESS, ) // id = SPLAT_FERA @@ -225,6 +225,7 @@ id = SPLAT_CORAX splat_traits = list( TRAIT_FERA_FUR, + TRAIT_FERA_RENOWN, TRAIT_FRENETIC_AURA, TRAIT_GOLD_WEAKNESS, ) 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 9a8ffa0013d2..92b7e3a5d3ce 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 @@ -46,7 +46,13 @@ 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-bredforms and causes loss of Gnosis.", + ), ) return to_add @@ -80,7 +86,13 @@ 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_MOON, + SPECIES_PERK_NAME = "Gold weakness", + SPECIES_PERK_DESC = "Gold weapons is unable to be soaked in non-bredforms and causes loss of Gnosis.", + ), ) return to_add From 13c2e03c1011347621857e3ec24b88adfc645a2a Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 9 May 2026 02:32:24 -0500 Subject: [PATCH 23/38] minor tweak --- .../werewolf_the_apocalypse/code/splats/pref_lore.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 92b7e3a5d3ce..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 @@ -51,7 +51,7 @@ 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-bredforms and causes loss of Gnosis.", + SPECIES_PERK_DESC = "Silver weapons is unable to be soaked in non-breedforms and causes loss of Gnosis.", ), ) @@ -89,9 +89,9 @@ ), list( SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, - SPECIES_PERK_ICON = FA_ICON_MOON, + SPECIES_PERK_ICON = FA_ICON_SUN, SPECIES_PERK_NAME = "Gold weakness", - SPECIES_PERK_DESC = "Gold weapons is unable to be soaked in non-bredforms and causes loss of Gnosis.", + SPECIES_PERK_DESC = "Gold weapons is unable to be soaked in non-breedforms and causes loss of Gnosis.", ), ) From 1c6f03a27d873cc328b7587cb0fdef8ad6e5fc8d Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 9 May 2026 18:27:44 -0500 Subject: [PATCH 24/38] more tweaks to emeny ways --- .../code/changing_breeds/corax.dm | 52 +++++++++++++++---- .../code/splats/pref_lore.dm | 6 +-- 2 files changed, 46 insertions(+), 12 deletions(-) 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 index d9e532a8e29e..7f7784f6568e 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/changing_breeds/corax.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/changing_breeds/corax.dm @@ -5,38 +5,72 @@ /datum/action/cooldown/power/gift/enemy_ways name = "Enemy Ways" - // desc = "" + desc = "The Corax gains an acute and accurate danger sense" + cooldown_time = 1 SCENES // TTRPG accurate is 1 TURNS but no cost or prevention of spamming + rank = 1 // Put up here so the codeblock can interact with them var/waiting_clients = 0 var/hostiles = 0 + /// A assoc list of answers indexed by weakrefs to the answerer. Used to cache old answers to not spam them. + var/list/datum/weakref/old_answers = list() + /datum/action/cooldown/power/gift/enemy_ways/Activate(atom/target) . = ..() - var/datum/splat/werewolf/wolp_splat = get_werewolf_splat(owner) + waiting_clients = 0 + hostiles = 0 + + var/datum/storyteller_roll/gift/enemy_ways/roll_datum = new() + // More successes normally grants geater information. + var/roll_result = roll_datum.st_roll(owner, bonus = PRIMAL_URGE_PLACEHOLDER) + if(roll_result <= 0) + return TRUE + 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 + var/list/old_answers_resolved = list() + for(var/datum/weakref/guy_ref, old_choice in old_answers) + var/mob/living/resolved_guy = guy_ref.resolve() + if(!resolved_guy) + old_answers[guy_ref] = null + continue + old_answers_resolved[resolved_guy] = old_choice for(var/mob/living/guy in oview(range, owner)) - if(guy.client) + if(guy.stat == DEAD) + continue + + if(old_answers_resolved[guy]) + if(old_answers_resolved[guy] == "Yes") + hostiles++ + else 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.", + "Answer truthfully wether or not your character would consider [GET_GUESTBOOK_NAME(guy, owner)][(GET_GUESTBOOK_NAME(guy, owner) != owner.real_name) ? " ([owner.real_name])" : ""] an enemy.", "Is [GET_GUESTBOOK_NAME(guy, owner)] an Enemy?", list("Yes", "No", "Unsure"), 10 SECONDS ) - if(choice == "Yes") - hostiles += 1 + + // Cache diffenitive answers so that we dont spam them upon recasting + switch(choice) + if("Yes") + hostiles++ + old_answers[WEAKREF(guy)] = choice + if("No") + old_answers[WEAKREF(guy)] = choice + 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(guy.maxHealth < 10) // Filter out fake mobs like cockroaches + continue + if(guy.has_faction(FACTION_HOSTILE)) + hostiles++ if(waiting_clients > 0) ASYNC 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 bed11397aea8..05f23181f7d7 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 @@ -58,9 +58,9 @@ 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.set_haircolor("#241e1c", update = FALSE) + human.set_hairstyle("Long Over Eye", update = TRUE) + human.undershirt = "Shirt (Black)" human.update_body() /datum/splat/werewolf/shifter/corax/get_splat_description() From 3e74d904319144d0694a470b6feefc743d1e300c Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Tue, 19 May 2026 09:21:29 -0500 Subject: [PATCH 25/38] flight code --- .../~darkpack/traits/declarations.dm | 2 ++ .../code/basic_mobs/bird.dm | 4 +-- .../code/changing_breeds/corax.dm | 2 +- .../{garou_organs.dm => fera_organs.dm} | 0 .../code/species/fera_species.dm | 18 +++++++++- .../code/species/flight_action.dm | 35 +++++++++++++++++++ .../code/splats/fera_splat.dm | 1 + .../code/splats/pref_lore.dm | 2 +- tgstation.dme | 3 +- 9 files changed, 61 insertions(+), 6 deletions(-) rename modular_darkpack/modules/werewolf_the_apocalypse/code/species/{garou_organs.dm => fera_organs.dm} (100%) create mode 100644 modular_darkpack/modules/werewolf_the_apocalypse/code/species/flight_action.dm diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm index fb9c4e60c5aa..21616fb5eccc 100644 --- a/code/__DEFINES/~darkpack/traits/declarations.dm +++ b/code/__DEFINES/~darkpack/traits/declarations.dm @@ -136,6 +136,8 @@ 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" +// Fera both grants a flight ability, and has the sprites to support such a thing. (Presently only designed to supprot feral form.) +#define TRAIT_FERA_FLIGHT "fera_flight" #define TRAIT_SILVER_WEAKNESS "silver_weakness" #define TRAIT_GOLD_WEAKNESS "gold_weakness" // Delirium is effectivly two levels weaker diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird.dm index d4b6478e825e..ae252e62ff10 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird.dm @@ -70,8 +70,8 @@ name = "Toggle Flight" desc = "Unfurl or withdraw your wings, toggling your ability to fly" check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_IMMOBILE - button_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "flight" + button_icon = 'modular_darkpack/master_files/icons/hud/actions.dmi' + button_icon_state = "fly" /datum/action/innate/togglecorvidflight/Trigger(mob/clicker, trigger_flags) . = ..() 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 index 7f7784f6568e..fe521021c008 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/changing_breeds/corax.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/changing_breeds/corax.dm @@ -1,7 +1,7 @@ /datum/storyteller_roll/gift/enemy_ways applicable_stats = list(STAT_PERCEPTION) difficulty = 7 - numerical = TRUE + numerical = TRUE // More successes can give more information but i didnt have any good ideas for rn. /datum/action/cooldown/power/gift/enemy_ways name = "Enemy Ways" diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/species/garou_organs.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_organs.dm similarity index 100% rename from modular_darkpack/modules/werewolf_the_apocalypse/code/species/garou_organs.dm rename to modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_organs.dm diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_species.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_species.dm index 04b22e058ca9..cbe799229ff0 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_species.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_species.dm @@ -34,6 +34,7 @@ var/custom_damage_render = FALSE /// Fallback dmi to refrence if we fail to get one from our splat var/fallback_icon + var/has_flight_icon_states = FALSE /// Speed mod applied and removed upon gaining this species var/speed_mod /// Causes delirium, which if the user is affected by, does not cause breaches @@ -113,7 +114,9 @@ if(HAS_TRAIT(human, TRAIT_WYRMTAINTED_SPRITE)) main_iconstate += "spiral" main_iconstate += fur_color - if(human.body_position == LYING_DOWN) + if(has_flight_icon_states && HAS_TRAIT(human, TRAIT_FERA_FLIGHT) && HAS_TRAIT(human, TRAIT_MOVE_FLYING) && HAS_TRAIT(human, TRAIT_NO_FLOATING_ANIM)) + main_iconstate += "_flying" + else if(human.body_position == LYING_DOWN) main_iconstate += "_rest" human.overlays_standing[BODYPARTS_LAYER] = list(image(mob_icon, main_iconstate)) @@ -296,6 +299,7 @@ custom_body_render = TRUE custom_damage_render = TRUE fallback_icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/lupus.dmi' + has_flight_icon_states = TRUE speed_mod = /datum/movespeed_modifier/shifter/feral /datum/species/human/shifter/feral/visible_gender_override(mob/living/carbon/human/holder) @@ -305,6 +309,18 @@ return "beast" +/datum/species/human/shifter/feral/on_species_gain(mob/living/carbon/human/human_who_gained_species, datum/species/old_species, pref_load, regenerate_icons) + . = ..() + if(HAS_TRAIT(human_who_gained_species, TRAIT_FERA_FLIGHT)) + var/datum/action/innate/toggle_fera_flight/ability = new(human_who_gained_species) + ability.Grant(human_who_gained_species) + +/datum/species/human/shifter/feral/on_species_loss(mob/living/carbon/human/human, datum/species/new_species, pref_load) + . = ..() + for(var/datum/action/innate/toggle_fera_flight/action in human.actions) + action.Remove(human) + + /datum/movespeed_modifier/shifter abstract_type = /datum/movespeed_modifier/shifter movetypes = GROUND diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/species/flight_action.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/flight_action.dm new file mode 100644 index 000000000000..aee7d5fbe58b --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/flight_action.dm @@ -0,0 +1,35 @@ +/datum/action/innate/toggle_fera_flight // this action handles fera 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 + button_icon = 'modular_darkpack/master_files/icons/hud/actions.dmi' + button_icon_state = "fly" + +/datum/action/innate/toggle_fera_flight/Trigger(mob/clicker, trigger_flags) + . = ..() + if(!.) + return + + var/mob/living/carbon/human/fera_mob = owner + if(!istype(fera_mob)) + return + if (!(HAS_TRAIT(fera_mob, TRAIT_MOVE_FLYING))) + to_chat(fera_mob, span_notice("You beat your wings and begin to hover gently above the ground...")) + fera_mob.add_traits(list(TRAIT_MOVE_FLYING, TRAIT_NO_FLOATING_ANIM), ACTION_TRAIT) + else + to_chat(fera_mob, span_notice("You settle gently back onto the ground...")) + fera_mob.remove_traits(list(TRAIT_MOVE_FLYING, TRAIT_NO_FLOATING_ANIM), ACTION_TRAIT) + + fera_mob.update_body_parts() + // fera_mob.update_icon(UPDATE_ICON) + +/datum/action/innate/toggle_fera_flight/Remove(mob/removed_from) + . = ..() + + var/mob/living/carbon/human/fera_mob = owner + if(!istype(fera_mob)) + return + to_chat(fera_mob, span_notice("You settle gently back onto the ground...")) + fera_mob.remove_traits(list(TRAIT_MOVE_FLYING, TRAIT_NO_FLOATING_ANIM), ACTION_TRAIT) + + fera_mob.update_body_parts() 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 864103a75d05..48c0c4035bc5 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 @@ -226,6 +226,7 @@ splat_traits = list( TRAIT_FERA_FUR, TRAIT_FERA_RENOWN, + TRAIT_FERA_FLIGHT, TRAIT_FRENETIC_AURA, TRAIT_GOLD_WEAKNESS, ) 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 05f23181f7d7..9734ed1ed630 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 @@ -77,7 +77,7 @@ to_add += list( list( SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, - SPECIES_PERK_ICON = FA_ICON_DOG, + SPECIES_PERK_ICON = FA_ICON_CROW, SPECIES_PERK_NAME = "Shapeshifting", SPECIES_PERK_DESC = "Corax can shift between 3 diffrent forms that grant them bonuses.", ), diff --git a/tgstation.dme b/tgstation.dme index aa950f46b270..3b84e4b8c48f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7874,8 +7874,9 @@ #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_organs.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\flight_action.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_splat.dm" From 37f7842a26dc3a69c9f064f760658b80eaaa0bb3 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Tue, 19 May 2026 09:28:35 -0500 Subject: [PATCH 26/38] yeagh --- .../werewolf_the_apocalypse/code/species/fera_species.dm | 2 +- .../werewolf_the_apocalypse/code/species/flight_action.dm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_species.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_species.dm index cbe799229ff0..d128d48c300f 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_species.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_species.dm @@ -304,7 +304,7 @@ /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) + if(shifter_splat?.mimmicing_animal) return shifter_splat.mimmicing_animal::name return "beast" diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/species/flight_action.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/flight_action.dm index aee7d5fbe58b..527a86e934aa 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/species/flight_action.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/flight_action.dm @@ -24,8 +24,6 @@ // fera_mob.update_icon(UPDATE_ICON) /datum/action/innate/toggle_fera_flight/Remove(mob/removed_from) - . = ..() - var/mob/living/carbon/human/fera_mob = owner if(!istype(fera_mob)) return @@ -33,3 +31,5 @@ fera_mob.remove_traits(list(TRAIT_MOVE_FLYING, TRAIT_NO_FLOATING_ANIM), ACTION_TRAIT) fera_mob.update_body_parts() + + return ..() From b722637fa5e7ac04abae597a7aae19556db8ed37 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Tue, 19 May 2026 10:25:50 -0500 Subject: [PATCH 27/38] yeagh --- .../code/changing_breeds/corax.dm | 1 + .../icons/werewolf_abilities.dmi | Bin 8154 -> 15930 bytes 2 files changed, 1 insertion(+) 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 index fe521021c008..95e566152caf 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/changing_breeds/corax.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/changing_breeds/corax.dm @@ -6,6 +6,7 @@ /datum/action/cooldown/power/gift/enemy_ways name = "Enemy Ways" desc = "The Corax gains an acute and accurate danger sense" + button_icon_state = "enemy_ways" cooldown_time = 1 SCENES // TTRPG accurate is 1 TURNS but no cost or prevention of spamming rank = 1 // Put up here so the codeblock can interact with them diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi b/modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi index 087f71f43b1f047d91d909469be3bb56bc1e9014..abc7d6a6884a05dac1e06170d91a4bc95d6bbed1 100644 GIT binary patch literal 15930 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 literal 8154 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 A_y7O^ From 6fe0c32e070f4ec030b5d9487ed97eb574ac2002 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 20 May 2026 03:41:23 -0500 Subject: [PATCH 28/38] yeagh --- .../modules/mob/living/carbon/human/death.dm | 16 ++++ .../mob/living/carbon/human/human_defines.dm | 2 + .../code/gifts/innate/eye_drink.dm | 86 ++++++++++++++++++ .../code/splats/fera_splat.dm | 9 ++ .../code/subsplats/_subsplat.dm | 8 +- .../icons/werewolf_abilities.dmi | Bin 15930 -> 15811 bytes tgstation.dme | 1 + 7 files changed, 120 insertions(+), 2 deletions(-) create mode 100644 modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/innate/eye_drink.dm diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/death.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/death.dm index 7ca2cf4febe0..722471294e72 100644 --- a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/death.dm +++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/death.dm @@ -7,3 +7,19 @@ GLOB.masquerade_breakers_list -= src GLOB.sabbatites -= src + last_death_info = new() + last_death_info.record_death(src) + + +// Not an override. Usecases will be spread out across modules so it goes here. +/datum/death_report + var/area + var/last_words + var/last_attacker_name + var/suicide + +/datum/death_report/proc/record_death(mob/living/carbon/human/dead_guy) + area = get_area(dead_guy) + last_attacker_name = dead_guy.lastattacker + last_words = dead_guy.last_words + suicide = HAS_TRAIT(dead_guy, TRAIT_SUICIDED) diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/human_defines.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/human_defines.dm index 4ef0b9e89206..ef1bd1877a38 100644 --- a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/human_defines.dm +++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/human_defines.dm @@ -10,3 +10,5 @@ // Visible adjectives, used for Guestbooks. var/visible_adjective = "" + /// A datum that tracks all the information at the time of there death. Used for powers that tell you the sitatuons of there demise. + var/datum/death_report/last_death_info diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/innate/eye_drink.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/innate/eye_drink.dm new file mode 100644 index 000000000000..7ea5cba75cc7 --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/innate/eye_drink.dm @@ -0,0 +1,86 @@ +/datum/storyteller_roll/eye_drink + bumper_text = "Eye-Drinking" + applicable_stats = list(STAT_PERCEPTION, STAT_EMPATHY) + numerical = TRUE + +/datum/action/cooldown/power/gift/eye_drink + name = "Eye-Drinking" + desc = "Consumes the eyes of a corpse to unlock the secrets of its demise." + button_icon_state = "eye_drink" + cooldown_time = 1 SCENES + innate_ability = TRUE + click_to_activate = TRUE + +/datum/action/cooldown/power/gift/eye_drink/Activate(atom/target) + var/mob/living/carbon/human/human_target = astype(target) + if(!human_target) + return + if(!(human_target in range(1, owner))) + return + if(human_target.stat != DEAD) + to_chat(owner, span_warning("[target] must be a corpse.")) + return + var/obj/item/organ/eyes/victim_eyeballs = human_target.get_organ_slot(ORGAN_SLOT_EYES) + if(!victim_eyeballs) + to_chat(owner, span_warning("You cannot drink the eyes of a corpse that has no eyes!")) + return + + . = ..() + + if(!do_after(owner, 1 TURNS)) + return TRUE + + var/datum/storyteller_roll/eye_drink/roll_datum = new() + var/successes = roll_datum.st_roll(owner, human_target) + + var/mob/prompting_mob + if(human_target.client) + prompting_mob = human_target + else + prompting_mob = human_target.get_ghost(TRUE, TRUE) + + if(prompting_mob) + var/permission = tgui_alert(prompting_mob, "Will you allow [owner.real_name] to view your death? They received [successes] successes on their Perception + Empathy roll (Note: You are expected to tell the truth in your character's eyes!)", "Select", list("Yes","No","I don't recall") ,"Yes", 1 MINUTES) + if(permission != "Yes") + to_chat(owner, span_warning("The spirit seems relunctact to let you consume their eyes... so you refrain from doing so.")) + return TRUE + else + if(successes <= 0) + return TRUE + + to_chat(owner, span_notice("You drink of the eyes of [human_target] and a vision fills your mind...")) + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) + + var/deathdesc + if(prompting_mob) + deathdesc = tgui_input_text( + prompting_mob, + "Eye-Drinking", + "Describe a vision of the moments leading up to your death. [owner] received [successes] successes. Be more clear the more successes they received.", + max_length = 300, + multiline = TRUE, + timeout = 5 MINUTES + ) + else if(human_target.last_death_info) + var/datum/death_report/death_info = human_target.last_death_info + var/list/info_list = list() + if(death_info.area) + info_list += "The scene begins in [death_info.area]." + if(death_info.last_attacker_name) + info_list += "Someone attacks them with the apperance of [death_info.last_attacker_name]." + if(death_info.last_words) + info_list += "They mouth something you cannot hear." + + if(death_info.suicide) + info_list += "A graphic scene which shows there unfortunate suicide." + else + info_list += "The scene ends before the specifics of there death is made clear." + deathdesc += jointext(info_list, " ") + + if(!deathdesc) + to_chat(owner, span_warning("The vision is hazy, you can't make out too many details...")) + else + to_chat(owner, "Visions flood your mind: [deathdesc]") + + + return TRUE 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 48c0c4035bc5..b6e307e73f74 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 @@ -138,6 +138,7 @@ if(!QDELETED(owner)) owner.set_species(/datum/species/human) + remove_power(/datum/action/cooldown/power/gift/howling) UnregisterSignal(owner, COMSIG_LIVING_DEATH) /datum/splat/werewolf/shifter/splat_life(seconds_per_tick) @@ -261,6 +262,14 @@ warcry_emote = "caw" +/datum/splat/werewolf/shifter/corax/on_gain() + . = ..() + add_power(/datum/action/cooldown/power/gift/eye_drink) + +/datum/splat/werewolf/shifter/corax/on_lose_or_destroy() + . = ..() + remove_power(/datum/action/cooldown/power/gift/eye_drink) + /mob/living/carbon/human/splat/kinfolk auto_splats = list(/datum/splat/werewolf/kinfolk) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/_subsplat.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/_subsplat.dm index 1d931e94cd30..c3ba54f7b1e7 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/_subsplat.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/_subsplat.dm @@ -8,9 +8,13 @@ // /datum/action/cooldown/power/gift /// All gifts avalible via this subsplat. var/list/gifts_provided = list() + var/list/kinfolk_gifts_provided /datum/subsplat/werewolf/on_gain(mob/living/carbon/human/gaining_mob, datum/splat/gaining_splat, joining_round) . = ..() // Placeholder! - for(var/gift in gifts_provided) - gaining_splat.add_power(gift) + if(kinfolk) + + else + for(var/gift in gifts_provided) + gaining_splat.add_power(gift) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi b/modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi index abc7d6a6884a05dac1e06170d91a4bc95d6bbed1..115c799106edb865b9fa7dd19ccf3be8017d7a37 100644 GIT binary patch delta 13874 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]S*gW4{NPTM^4sVrp0zDJV6>d0Ezgo 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 A%K!iX delta 13980 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 Date: Wed, 20 May 2026 03:46:21 -0500 Subject: [PATCH 29/38] ough --- .../werewolf_the_apocalypse/code/subsplats/_subsplat.dm | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/_subsplat.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/_subsplat.dm index c3ba54f7b1e7..1d931e94cd30 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/_subsplat.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/_subsplat.dm @@ -8,13 +8,9 @@ // /datum/action/cooldown/power/gift /// All gifts avalible via this subsplat. var/list/gifts_provided = list() - var/list/kinfolk_gifts_provided /datum/subsplat/werewolf/on_gain(mob/living/carbon/human/gaining_mob, datum/splat/gaining_splat, joining_round) . = ..() // Placeholder! - if(kinfolk) - - else - for(var/gift in gifts_provided) - gaining_splat.add_power(gift) + for(var/gift in gifts_provided) + gaining_splat.add_power(gift) From 7cf5ab4ce4b187a9fe65207e4a77b2657c75563a Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 20 May 2026 04:37:52 -0500 Subject: [PATCH 30/38] fix --- .../modules/werewolf_the_apocalypse/code/preferences/fur.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 90d644a88090..8b2793630fb6 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/fur.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/fur.dm @@ -1,6 +1,6 @@ /datum/preference/choiced/fera_fur_color abstract_type = /datum/preference/choiced/fera_fur_color - savefile_key = "garou_fur_color" + savefile_key = "fur_color" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES priority = PREFERENCE_PRIORITY_WORLD_OF_DARKNESS @@ -20,12 +20,14 @@ /datum/preference/choiced/fera_fur_color/garou + savefile_key = "garou_fur_color" 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 + savefile_key = "corax_fur_color" splat_id = SPLAT_CORAX /datum/preference/choiced/fera_fur_color/corax/init_possible_values() From 4b7037226bda4361321faf1ce7ac37674e4ce92f Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 20 May 2026 05:11:34 -0500 Subject: [PATCH 31/38] sort and hurt eyeballs --- code/_globalvars/traits/_traits.dm | 5 +++-- code/_globalvars/traits/admin_tooling.dm | 4 ++-- .../werewolf_the_apocalypse/code/gifts/innate/eye_drink.dm | 4 ++++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index a399074c5767..e084e9af530a 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -693,12 +693,14 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_ENHANCED_MELEE_DODGE" = TRAIT_ENHANCED_MELEE_DODGE, // DARKPACK EDIT ADD "TRAIT_FAIR_GLABRO" = TRAIT_FAIR_GLABRO, // DARKPACK EDIT ADD - MERITS_FLAWS "TRAIT_FEEDING_RESTRICTION" = TRAIT_FEEDING_RESTRICTION, // DARKPACK EDIT ADD + "TRAIT_FERA_FLIGHT" = TRAIT_FERA_FLIGHT, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_FERA_FORMS" = TRAIT_FERA_FORMS, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_FERA_FUR" = TRAIT_FERA_FUR, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_FERA_RENOWN" = TRAIT_FERA_RENOWN, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_FORCED_EMOTION" = TRAIT_FORCED_EMOTION, // DARKPACK EDIT ADD - Melpominee "TRAIT_FRENETIC_AURA" = TRAIT_FRENETIC_AURA, // DARKPACK EDIT ADD "TRAIT_GHOST_VISION" = TRAIT_GHOST_VISION, // DARKPACK EDIT ADD - POWERS - (Necromancy) + "TRAIT_GOLD_WEAKNESS" = TRAIT_GOLD_WEAKNESS, // DARKPACK EDIT ADD - WEREWOLF - (corax) "TRAIT_GRIP_OF_THE_DAMNED" = TRAIT_GRIP_OF_THE_DAMNED, // DARKPACK EDIT ADD "TRAIT_GULLET" = TRAIT_GULLET, // DARKPACK EDIT ADD "TRAIT_HOMOSEXUAL" = TRAIT_HOMOSEXUAL, // DARKPACK EDIT ADD @@ -712,8 +714,6 @@ 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_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 @@ -741,6 +741,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_SENSITIVE_HUMANITY" = TRAIT_SENSITIVE_HUMANITY, // DARKPACK EDIT ADD "TRAIT_SERPENTIS_SKIN" = TRAIT_SERPENTIS_SKIN, // DARKPACK EDIT ADD - POWERS - (Serpentis) "TRAIT_SILENCED" = TRAIT_SILENCED, // DARKPACK EDIT ADD - POWERS - (Quietus) + "TRAIT_SILVER_WEAKNESS" = TRAIT_SILVER_WEAKNESS, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_SMALL_HANDS" = TRAIT_SMALL_HANDS, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_STAKED" = TRAIT_STAKED, // DARKPACK EDIT ADD "TRAIT_STAKE_IMMUNE" = TRAIT_STAKE_IMMUNE, // DARKPACK EDIT ADD diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 7343308bbd65..a8de2f45e463 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -387,6 +387,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_FERA_RENOWN" = TRAIT_FERA_RENOWN, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_FRENETIC_AURA" = TRAIT_FRENETIC_AURA, // DARKPACK EDIT ADD "TRAIT_GHOST_VISION" = TRAIT_GHOST_VISION, // DARKPACK EDIT ADD - POWERS - (Necromancy) + "TRAIT_GOLD_WEAKNESS" = TRAIT_GOLD_WEAKNESS, // DARKPACK EDIT ADD - WEREWOLF - (corax) "TRAIT_GRIP_OF_THE_DAMNED" = TRAIT_GRIP_OF_THE_DAMNED, // DARKPACK EDIT ADD "TRAIT_GULLET" = TRAIT_GULLET, // DARKPACK EDIT ADD "TRAIT_HOMOSEXUAL" = TRAIT_HOMOSEXUAL, // DARKPACK EDIT ADD @@ -399,7 +400,6 @@ 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_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_MERIT_UNTAMABLE" = TRAIT_MERIT_UNTAMABLE, // DARKPACK EDIT ADD - MERITS_FLAWS @@ -410,7 +410,6 @@ 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 @@ -423,6 +422,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_SENSITIVE_HUMANITY" = TRAIT_SENSITIVE_HUMANITY, // DARKPACK EDIT ADD "TRAIT_SERPENTIS_SKIN" = TRAIT_SERPENTIS_SKIN, // DARKPACK EDIT ADD - POWERS - (Serpentis) "TRAIT_SILENCED" = TRAIT_SILENCED, // DARKPACK EDIT ADD - POWERS - (Quietus) + "TRAIT_SILVER_WEAKNESS" = TRAIT_SILVER_WEAKNESS, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_SMALL_HANDS" = TRAIT_SMALL_HANDS, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_STAKED" = TRAIT_STAKED, // DARKPACK EDIT ADD "TRAIT_STAKE_IMMUNE" = TRAIT_STAKE_IMMUNE, // DARKPACK EDIT ADD diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/innate/eye_drink.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/innate/eye_drink.dm index 7ea5cba75cc7..27a00fb9f825 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/innate/eye_drink.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/innate/eye_drink.dm @@ -82,5 +82,9 @@ else to_chat(owner, "Visions flood your mind: [deathdesc]") + if(isnpc(human_target)) // Dont have granuliaty for removing one eye and this shows the empty sockets + qdel(victim_eyeballs) + else // Fuck a real player a little less. + victim_eyeballs.apply_scar(pick(LEFT_EYE_SCAR, RIGHT_EYE_SCAR)) return TRUE From c54019c9dfe3cfa9d78b35248393bda08f248b35 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 20 May 2026 09:21:58 -0500 Subject: [PATCH 32/38] test --- modular_darkpack/modules/unit_tests/apply_all_splats.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modular_darkpack/modules/unit_tests/apply_all_splats.dm b/modular_darkpack/modules/unit_tests/apply_all_splats.dm index 05d80bf394dc..931d9b8f0dcf 100644 --- a/modular_darkpack/modules/unit_tests/apply_all_splats.dm +++ b/modular_darkpack/modules/unit_tests/apply_all_splats.dm @@ -50,6 +50,9 @@ else var/datum/splat/checking_type = splat_prio_list["[splat_prio]"] var/datum/splat/real_splat = GLOB.splat_prototypes[checking_type::id] + if(!real_splat) + TEST_FAIL("splat.id [checking_type::id] does not have a prototype in the splat global.") + continue if(splat_type in real_splat.incompatible_splats) continue TEST_FAIL("[splat_type] has the same splat priority as [splat_prio_list["[splat_prio]"]] yet is somehow compatible. priority is [splat_prio].") From 73a52a33faba5cbca03db0f07535e975088548ee Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 20 May 2026 09:27:49 -0500 Subject: [PATCH 33/38] yeagh --- code/__DEFINES/~darkpack/splats.dm | 2 +- .../code/splats/examine_text.dm | 4 +- .../code/splats/renown.dm | 69 +++++++++---------- 3 files changed, 37 insertions(+), 38 deletions(-) diff --git a/code/__DEFINES/~darkpack/splats.dm b/code/__DEFINES/~darkpack/splats.dm index cd889cce6054..81d9e7fa4d1c 100644 --- a/code/__DEFINES/~darkpack/splats.dm +++ b/code/__DEFINES/~darkpack/splats.dm @@ -8,7 +8,7 @@ /// Parent type for shifters. Not player facing. Shouldnt be needed but put here for clarity. //#define SPLAT_FERA "splat_fera" #define SPLAT_GAROU "splat_garou" -#define SPLAT_CORAX "splat_corax" // DARKPACK TODO - CORAX +#define SPLAT_CORAX "splat_corax" #define SPLAT_SHIFTERS list(SPLAT_GAROU, SPLAT_CORAX) #define SPLAT_PRIO_HALFSPLAT 100 diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/examine_text.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/examine_text.dm index 0b31ce429c97..889b14b02630 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/examine_text.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/examine_text.dm @@ -16,10 +16,10 @@ switch(wolp_splat.renown_rank) if(RANK_CUB to RANK_FOSTERN) if(same_tribe) - . += "You know [examined.p_them()] as \a [fera_rank_name(wolp_splat.renown_rank)] of the [wolp_splat.tribe.name]." + . += "You know [examined.p_them()] as \a [fera_rank_name(wolp_splat.renown_rank, wolp_splat.id)] of the [wolp_splat.tribe.name]." is_known = TRUE if(RANK_ADREN to RANK_LEGEND) - . += "You know [examined.p_them()] as \a [fera_rank_name(wolp_splat.renown_rank)] [wolp_splat.auspice.name] of the [wolp_splat.tribe.name]." + . += "You know [examined.p_them()] as \a [fera_rank_name(wolp_splat.renown_rank, wolp_splat.id)] [wolp_splat.auspice.name] of the [wolp_splat.tribe.name]." is_known = TRUE if(is_known) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/renown.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/renown.dm index c747ff3b01d1..50f80a4b1540 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/renown.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/renown.dm @@ -24,7 +24,7 @@ renown_rank = auspice_rank_check() if(old_rank != renown_rank) - to_chat(owner, span_boldnotice("You are now a [fera_rank_name(renown_rank)].")) + to_chat(owner, span_boldnotice("You are now a [fera_rank_name(renown_rank, id)].")) // Not acctually used ANYWHERE rn. Its super easy to just calculate it from our renown anyway. // owner.write_preference_midround(/datum/preference/numeric/fera_rank, renown_rank) @@ -65,39 +65,38 @@ // Pretty iffy on this. This could likely just be moved onto the splat itself so corax and other breeds can override it. /proc/fera_rank_name(rank, breed) - - // if(breed != "Corax") DARKPACK TODO - CORAX - switch(rank) - if(RANK_CUB) - return "cub" // in lowercase so that \a might function during the character examine - if(RANK_CLIATH) - return "cliath" - if(RANK_FOSTERN) - return "fostern" - if(RANK_ADREN) - return "adren" - if(RANK_ATHRO) - return "athro" - if(RANK_ELDER) - return "elder" - if(RANK_LEGEND) - return "legend" -/* DARKPACK TODO - CORAX - switch(rank) - if(0) - return "fledgling" - if(1) - return "oviculum" - if(2) - return "neocornix" - if(3) - return "ales" - if(4) - return "volucris" - if(5) - return "corvus" - if(6) - return "grey eminence" -*/ + switch(breed) + if(SPLAT_CORAX) + switch(rank) + if(RANK_CUB) + return "fledgling" + if(RANK_CLIATH) + return "oviculum" + if(RANK_FOSTERN) + return "neocornix" + if(RANK_ADREN) + return "ales" + if(RANK_ATHRO) + return "volucris" + if(RANK_ELDER) + return "corvus" + if(RANK_LEGEND) + return "grey eminence" + else + switch(rank) + if(RANK_CUB) + return "cub" // in lowercase so that \a might function during the character examine + if(RANK_CLIATH) + return "cliath" + if(RANK_FOSTERN) + return "fostern" + if(RANK_ADREN) + return "adren" + if(RANK_ATHRO) + return "athro" + if(RANK_ELDER) + return "elder" + if(RANK_LEGEND) + return "legend" #undef MAX_RENOWN From c72dc31a1cab0dea849537cc9e471cb44683cb54 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 20 May 2026 09:32:09 -0500 Subject: [PATCH 34/38] yea --- modular_darkpack/modules/unit_tests/apply_all_splats.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_darkpack/modules/unit_tests/apply_all_splats.dm b/modular_darkpack/modules/unit_tests/apply_all_splats.dm index 931d9b8f0dcf..fbc73fec817f 100644 --- a/modular_darkpack/modules/unit_tests/apply_all_splats.dm +++ b/modular_darkpack/modules/unit_tests/apply_all_splats.dm @@ -51,7 +51,7 @@ var/datum/splat/checking_type = splat_prio_list["[splat_prio]"] var/datum/splat/real_splat = GLOB.splat_prototypes[checking_type::id] if(!real_splat) - TEST_FAIL("splat.id [checking_type::id] does not have a prototype in the splat global.") + TEST_FAIL("splat.id: [checking_type::id] from [checking_type] does not have a prototype in the splat global.") continue if(splat_type in real_splat.incompatible_splats) continue From 1c443a8d033a7dd7c1098e44785fe39f5886879d Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 20 May 2026 10:22:49 -0500 Subject: [PATCH 35/38] fix --- modular_darkpack/modules/unit_tests/apply_all_splats.dm | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/modular_darkpack/modules/unit_tests/apply_all_splats.dm b/modular_darkpack/modules/unit_tests/apply_all_splats.dm index fbc73fec817f..e76b1701e48c 100644 --- a/modular_darkpack/modules/unit_tests/apply_all_splats.dm +++ b/modular_darkpack/modules/unit_tests/apply_all_splats.dm @@ -49,10 +49,7 @@ splat_prio_list["[splat_prio]"] = splat_type else var/datum/splat/checking_type = splat_prio_list["[splat_prio]"] - var/datum/splat/real_splat = GLOB.splat_prototypes[checking_type::id] - if(!real_splat) - TEST_FAIL("splat.id: [checking_type::id] from [checking_type] does not have a prototype in the splat global.") - continue + var/datum/splat/real_splat = GLOB.splat_prototypes[checking_type] if(splat_type in real_splat.incompatible_splats) continue TEST_FAIL("[splat_type] has the same splat priority as [splat_prio_list["[splat_prio]"]] yet is somehow compatible. priority is [splat_prio].") From 0ecf5ca81144dbbf20e655cc5d9267615c87dba6 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 20 May 2026 10:24:46 -0500 Subject: [PATCH 36/38] type in list so we can outlaw a whole set of types (like for changlng breeds) --- modular_darkpack/modules/splats/code/splat_management.dm | 2 +- modular_darkpack/modules/unit_tests/apply_all_splats.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_darkpack/modules/splats/code/splat_management.dm b/modular_darkpack/modules/splats/code/splat_management.dm index 3d25638c9a55..04b1e4b14c09 100644 --- a/modular_darkpack/modules/splats/code/splat_management.dm +++ b/modular_darkpack/modules/splats/code/splat_management.dm @@ -55,7 +55,7 @@ */ /mob/living/proc/is_splat_compatible(splat_type) for (var/datum/splat/splat as anything in splats) - if (splat_type in splat.incompatible_splats) + if (is_type_in_list(splat_type, splat.incompatible_splats)) return FALSE if (splat.type == splat_type) return FALSE diff --git a/modular_darkpack/modules/unit_tests/apply_all_splats.dm b/modular_darkpack/modules/unit_tests/apply_all_splats.dm index e76b1701e48c..4cd464f2ff94 100644 --- a/modular_darkpack/modules/unit_tests/apply_all_splats.dm +++ b/modular_darkpack/modules/unit_tests/apply_all_splats.dm @@ -50,7 +50,7 @@ else var/datum/splat/checking_type = splat_prio_list["[splat_prio]"] var/datum/splat/real_splat = GLOB.splat_prototypes[checking_type] - if(splat_type in real_splat.incompatible_splats) + if(is_type_in_list(splat_type, real_splat.incompatible_splats)) continue TEST_FAIL("[splat_type] has the same splat priority as [splat_prio_list["[splat_prio]"]] yet is somehow compatible. priority is [splat_prio].") From d040dac9abb2b3c9dd5bea6f8dfb360e759d504e Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 22 May 2026 13:15:17 -0500 Subject: [PATCH 37/38] yeagh --- modular_darkpack/modules/unit_tests/apply_all_splats.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_darkpack/modules/unit_tests/apply_all_splats.dm b/modular_darkpack/modules/unit_tests/apply_all_splats.dm index 4cd464f2ff94..1d4214c2fed6 100644 --- a/modular_darkpack/modules/unit_tests/apply_all_splats.dm +++ b/modular_darkpack/modules/unit_tests/apply_all_splats.dm @@ -50,7 +50,7 @@ else var/datum/splat/checking_type = splat_prio_list["[splat_prio]"] var/datum/splat/real_splat = GLOB.splat_prototypes[checking_type] - if(is_type_in_list(splat_type, real_splat.incompatible_splats)) + if(is_path_in_list(checking_type, real_splat.incompatible_splats)) continue TEST_FAIL("[splat_type] has the same splat priority as [splat_prio_list["[splat_prio]"]] yet is somehow compatible. priority is [splat_prio].") From 917737031370b4c691096e484011e8745be7540e Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 22 May 2026 13:18:28 -0500 Subject: [PATCH 38/38] revert dis --- modular_darkpack/modules/weapons/code/projectiles.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_darkpack/modules/weapons/code/projectiles.dm b/modular_darkpack/modules/weapons/code/projectiles.dm index 29f602e38191..08fd44d46643 100644 --- a/modular_darkpack/modules/weapons/code/projectiles.dm +++ b/modular_darkpack/modules/weapons/code/projectiles.dm @@ -96,7 +96,7 @@ /obj/projectile/bullet/darkpack/vamp556mm/silver/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() - fera_silver_damage(target, 4) + fera_silver_damage(target, 2) // 5.45x39mm /obj/projectile/bullet/darkpack/vamp545mm