diff --git a/code/__DEFINES/~darkpack/auras.dm b/code/__DEFINES/~darkpack/auras.dm
index 36089be022f3..663c4938eafb 100644
--- a/code/__DEFINES/~darkpack/auras.dm
+++ b/code/__DEFINES/~darkpack/auras.dm
@@ -15,7 +15,7 @@
#define AURA_HAPPY COLOR_VIVID_RED // Vermillion
#define AURA_HATEFUL COLOR_BLACK // Black
#define AURA_IDEALISTIC COLOR_YELLOW // Yellow
-#define AURA_INNOCENT COLOR_WHITE // White
+#define AURA_INNOCENT COLOR_OFF_WHITE // White
#define AURA_LOVESTRUCK COLOR_BLUE // Blue
#define AURA_OBSESSED COLOR_GREEN // Green
#define AURA_SAD COLOR_SILVER // Silver
diff --git a/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm b/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm
index 0ea48837babf..0b5a3408e523 100644
--- a/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm
+++ b/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm
@@ -7,3 +7,5 @@
//from base of living/CanAllowThrough(): (atom/movable/mover, border_dir)
#define COMSIG_LIVING_CAN_ALLOW_THROUGH "living_can_allow_through"
#define COMPONENT_LIVING_PASSABLE (1<<0)
+//from /datum/storyteller_roll/proc/st_roll(), args are the roll datum and role output
+#define COMSIG_LIVING_DICE_ROLLED "living_dice_rolled"
diff --git a/code/__DEFINES/~darkpack/fera/fera.dm b/code/__DEFINES/~darkpack/fera/fera.dm
index e85b890600ff..5eb76a3149ab 100644
--- a/code/__DEFINES/~darkpack/fera/fera.dm
+++ b/code/__DEFINES/~darkpack/fera/fera.dm
@@ -25,4 +25,4 @@ GLOBAL_LIST_INIT(garou_fur_colors, list(
"brown" = "brown"
))
-#define STATUS_EFFECT_SILVER_BULLLET_STACKS /datum/status_effect/stacking/silver_bullets
+#define STATUS_EFFECT_SILVER_BULLET_STACKS /datum/status_effect/stacking/silver_bullets
diff --git a/code/__DEFINES/~darkpack/splats.dm b/code/__DEFINES/~darkpack/splats.dm
index 1106992bae2b..694818303b91 100644
--- a/code/__DEFINES/~darkpack/splats.dm
+++ b/code/__DEFINES/~darkpack/splats.dm
@@ -9,6 +9,7 @@
//#define SPLAT_FERA "splat_fera"
#define SPLAT_GAROU "splat_garou"
#define SPLAT_CORAX "splat_corax" // DARKPACK TODO - CORAX
+#define SPLAT_SHIFTERS list(SPLAT_GAROU, SPLAT_CORAX)
#define SPLAT_ALL list(SPLAT_NONE, SPLAT_KINDRED, SPLAT_GHOUL, SPLAT_KINFOLK, SPLAT_GAROU)
diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm
index 9255a6b497dc..cfdb2ee75227 100644
--- a/code/__DEFINES/~darkpack/traits/declarations.dm
+++ b/code/__DEFINES/~darkpack/traits/declarations.dm
@@ -42,7 +42,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_CHARMER "charmer"
// Mutates the apperance of auras
-#define TRAIT_COLD_AURA "cold_aura"
+#define TRAIT_PALE_AURA "pale_aura"
#define TRAIT_WARM_AURA "warm_aura"
#define TRAIT_FRENETIC_AURA "frenetic_aura"
@@ -86,8 +86,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_VTM_MORALITY "vtm_morality"
/// Uses Vampire: The Masquerade Clans/Bloodlines
#define TRAIT_VTM_CLANS "vtm_clans"
-/// This species drinks blood
-#define TRAIT_BLOOD_DRINKER "blood_drinker"
/// Does not biologically age, and so has a disconnected biological and chronological age
#define TRAIT_UNAGING "unaging"
// Does the mob have ghostsight?
@@ -147,11 +145,18 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_SURGERY_INAPPLICABLE "surgery_inapplicable"
// BELOW ARE ALL MERITS/FLAWS
#define TRAIT_ILLEGAL_IDENTITY "illegal_identity" // GOVERNMENT
+#define TRAIT_ANIMAL_MUSK "animal_musk"
#define TRAIT_PERMAFANGS "permafangs"
#define TRAIT_ORGANOVORE "organovore"
#define TRAIT_SANGUINE_INCONGRUITY "sanguine_incongruity"
#define TRAIT_MONSTROUS "monstrous"
#define TRAIT_HORRIFIC_APPEARANCE "horrific_appearance"
+#define TRAIT_PIERCED_VEIL "pierced_veil"
+#define TRAIT_WEAK_WILLED "weak_willed"
+#define TRAIT_TIME_SENSE "time_sense"
+#define TRAIT_METAMORPH "metamorph"
+#define TRAIT_MERIT_UNTAMABLE "merit_untamable"
+#define TRAIT_FAIR_GLABRO "fair_glabro"
// END TRAIT DEFINES
diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm
index b7fd8ea48755..94989223bd4b 100644
--- a/code/_globalvars/traits/_traits.dm
+++ b/code/_globalvars/traits/_traits.dm
@@ -665,7 +665,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_SPACE_ANT_IMMUNITY" = TRAIT_SPACE_ANT_IMMUNITY,
"TRAIT_BRAIN_TRAUMA_IMMUNITY" = TRAIT_BRAIN_TRAUMA_IMMUNITY,
"TRAIT_NECROPOLIS_WORSHIP" = TRAIT_NECROPOLIS_WORSHIP,
- "TRAIT_BLOOD_DRINKER" = TRAIT_BLOOD_DRINKER, // DARKPACK EDIT ADD
+ "TRAIT_ANIMAL_MUSK" = TRAIT_ANIMAL_MUSK, // DARKPACK EDIT ADD - MERITS/FLAWS
"TRAIT_BLOODY_LOVER" = TRAIT_BLOODY_LOVER, // DARKPACK EDIT ADD
"TRAIT_BLOODY_SUCKER" = TRAIT_BLOODY_SUCKER, // DARKPACK EDIT ADD
"TRAIT_BLUSH_OF_HEALTH" = TRAIT_BLUSH_OF_HEALTH, // DARKPACK EDIT ADD
@@ -673,13 +673,13 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_CAN_ENTER_TORPOR" = TRAIT_CAN_ENTER_TORPOR, // DARKPACK EDIT ADD
"TRAIT_CHARMER" = TRAIT_CHARMER, // DARKPACK EDIT ADD
"TRAIT_COFFIN_THERAPY" = TRAIT_COFFIN_THERAPY, // DARKPACK EDIT ADD
- "TRAIT_COLD_AURA" = TRAIT_COLD_AURA, // DARKPACK EDIT ADD
+ "TRAIT_PALE_AURA" = TRAIT_PALE_AURA, // DARKPACK EDIT ADD - MERITS/FLAWS
"TRAIT_CONSENSUAL_FEEDING_ONLY" = TRAIT_CONSENSUAL_FEEDING_ONLY, // DARKPACK EDIT ADD
"TRAIT_DEFICIENT_VITAE" = TRAIT_DEFICIENT_VITAE, // DARKPACK EDIT ADD
"TRAIT_DIABLERIE" = TRAIT_DIABLERIE, // DARKPACK EDIT ADD
"TRAIT_DISCO_DANCER" = TRAIT_DISCO_DANCER, // DARKPACK EDIT ADD
"TRAIT_ENHANCED_MELEE_DODGE" = TRAIT_ENHANCED_MELEE_DODGE, // DARKPACK EDIT ADD
- "TRAIT_FAKE_SOULLESS" = TRAIT_FAKE_SOULLESS, // 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_FUR" = TRAIT_FERA_FUR, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_FORCED_EMOTION" = TRAIT_FORCED_EMOTION, // DARKPACK EDIT ADD - Melpominee
@@ -699,6 +699,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_LOUD_HOWLER" = TRAIT_LOUD_HOWLER, // 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_NEEDS_BLOOD" = TRAIT_NEEDS_BLOOD, //DARKPACK EDIT ADD - Hunger and Frenzy
"TRAIT_NO_EYE_CONTACT" = TRAIT_NO_EYE_CONTACT, // DARKPACK EDIT ADD
"TRAIT_ORGANOVORE" = TRAIT_ORGANOVORE, // DARKPACK EDIT ADD - Nagaraja
@@ -724,6 +725,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_STAKE_IMMUNE" = TRAIT_STAKE_IMMUNE, // DARKPACK EDIT ADD
"TRAIT_STAKE_RESISTANT" = TRAIT_STAKE_RESISTANT, // DARKPACK EDIT ADD
"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
"TRAIT_TOUGH_FLESH" = TRAIT_TOUGH_FLESH, // DARKPACK EDIT ADD
"TRAIT_TRANSFORM_UPDATES_ICON" = TRAIT_TRANSFORM_UPDATES_ICON, // DARKPACK EDIT ADD - WEREWOLF
@@ -737,11 +739,14 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_VTM_MORALITY" = TRAIT_VTM_MORALITY, // DARKPACK EDIT ADD
"TRAIT_WARM_AURA" = TRAIT_WARM_AURA, // 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
+ "TRAIT_METAMORPH" = TRAIT_METAMORPH, // DARKPACK EDIT ADD - MERITS/FLAWS
+ "TRAIT_PIERCED_VEIL" = TRAIT_PIERCED_VEIL, // DARKPACK EDIT ADD - MERITS/FLAWS
),
/mob/living/carbon = list(
"TRAIT_BRAINLESS_CARBON" = TRAIT_BRAINLESS_CARBON,
diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm
index ae8c5d1e3a73..aa937df8f8ec 100644
--- a/code/_globalvars/traits/admin_tooling.dm
+++ b/code/_globalvars/traits/admin_tooling.dm
@@ -356,7 +356,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_LEFT_EYE_SCAR" = TRAIT_LEFT_EYE_SCAR,
"TRAIT_RIGHT_EYE_SCAR" = TRAIT_RIGHT_EYE_SCAR,
"TRAIT_CARPOTOXIN_IMMUNE" = TRAIT_CARPOTOXIN_IMMUNE,
- "TRAIT_BLOOD_DRINKER" = TRAIT_BLOOD_DRINKER, // DARKPACK EDIT ADD
+ "TRAIT_ANIMAL_MUSK" = TRAIT_ANIMAL_MUSK, // DARKPACK EDIT ADD - MERITS/FLAWS
"TRAIT_BLOODY_LOVER" = TRAIT_BLOODY_LOVER, // DARKPACK EDIT ADD
"TRAIT_BLOODY_SUCKER" = TRAIT_BLOODY_SUCKER, // DARKPACK EDIT ADD
"TRAIT_BLUSH_OF_HEALTH" = TRAIT_BLUSH_OF_HEALTH, // DARKPACK EDIT ADD
@@ -364,13 +364,13 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_CAN_ENTER_TORPOR" = TRAIT_CAN_ENTER_TORPOR, // DARKPACK EDIT ADD
"TRAIT_CHARMER" = TRAIT_CHARMER, // DARKPACK EDIT ADD
"TRAIT_COFFIN_THERAPY" = TRAIT_COFFIN_THERAPY, // DARKPACK EDIT ADD
- "TRAIT_COLD_AURA" = TRAIT_COLD_AURA, // DARKPACK EDIT ADD
+ "TRAIT_PALE_AURA" = TRAIT_PALE_AURA, // DARKPACK EDIT ADD - MERITS/FLAWS
"TRAIT_CONSENSUAL_FEEDING_ONLY" = TRAIT_CONSENSUAL_FEEDING_ONLY, // DARKPACK EDIT ADD
"TRAIT_DEFICIENT_VITAE" = TRAIT_DEFICIENT_VITAE, // DARKPACK EDIT ADD
"TRAIT_DIABLERIE" = TRAIT_DIABLERIE, // DARKPACK EDIT ADD
"TRAIT_DISCO_DANCER" = TRAIT_DISCO_DANCER, // DARKPACK EDIT ADD
"TRAIT_ENHANCED_MELEE_DODGE" = TRAIT_ENHANCED_MELEE_DODGE, // DARKPACK EDIT ADD
- "TRAIT_FAKE_SOULLESS" = TRAIT_FAKE_SOULLESS, // 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_FUR" = TRAIT_FERA_FUR, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_FRENETIC_AURA" = TRAIT_FRENETIC_AURA, // DARKPACK EDIT ADD
@@ -389,6 +389,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_LOUD_HOWLER" = TRAIT_LOUD_HOWLER, // 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_NEEDS_BLOOD" = TRAIT_NEEDS_BLOOD, //DARKPACK EDIT ADD - Hunger and Frenzy
"TRAIT_NON_INT" = TRAIT_NON_INT, // DARKPACK EDIT ADD
"TRAIT_NO_EYE_CONTACT" = TRAIT_NO_EYE_CONTACT, // DARKPACK EDIT ADD
@@ -397,6 +398,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_PAINFUL_VAMPIRE_KISS" = TRAIT_PAINFUL_VAMPIRE_KISS, // DARKPACK EDIT ADD
"TRAIT_PASSDOOR" = TRAIT_PASSDOOR, // DARKPACK EDIT ADD
"TRAIT_PASS_THROUGH_WALLS" = TRAIT_PASS_THROUGH_WALLS, // DARKPACK EDIT ADD
+ "TRAIT_PERMAFANGS" = TRAIT_PERMAFANGS, // DARKPACK EDIT ADD - MERITS/FLAWS
"TRAIT_RAZOR_CLAWS" = TRAIT_RAZOR_CLAWS, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_REJECTED_BY_TECHNOLOGY" = TRAIT_REJECTED_BY_TECHNOLOGY, // DARKPACK EDIT ADD
"TRAIT_REPELLED_BY_HOLINESS" = TRAIT_REPELLED_BY_HOLINESS, // DARKPACK EDIT ADD
@@ -409,6 +411,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_STAKE_IMMUNE" = TRAIT_STAKE_IMMUNE, // DARKPACK EDIT ADD
"TRAIT_STAKE_RESISTANT" = TRAIT_STAKE_RESISTANT, // DARKPACK EDIT ADD
"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
"TRAIT_TOUGH_FLESH" = TRAIT_TOUGH_FLESH, // DARKPACK EDIT ADD
"TRAIT_TRANSFORM_UPDATES_ICON" = TRAIT_TRANSFORM_UPDATES_ICON, // DARKPACK EDIT ADD - WEREWOLF
@@ -421,11 +424,14 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_VTM_MORALITY" = TRAIT_VTM_MORALITY, // DARKPACK EDIT ADD
"TRAIT_WARM_AURA" = TRAIT_WARM_AURA, // 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
+ "TRAIT_METAMORPH" = TRAIT_METAMORPH, // DARKPACK EDIT ADD - MERITS/FLAWS
+ "TRAIT_PIERCED_VEIL" = TRAIT_PIERCED_VEIL, // DARKPACK EDIT ADD - MERITS/FLAWS
),
/obj/item = list(
"TRAIT_APC_SHOCKING" = TRAIT_APC_SHOCKING,
diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm
index 63effdc09f57..8b9b85cd7fc0 100644
--- a/code/controllers/subsystem/processing/quirks.dm
+++ b/code/controllers/subsystem/processing/quirks.dm
@@ -26,6 +26,7 @@ GLOBAL_LIST_INIT_TYPED(quirk_blacklist, /list/datum/quirk, list(
list(/datum/quirk/settler, /datum/quirk/freerunning),
list(/datum/quirk/numb, /datum/quirk/selfaware),
list(/datum/quirk/empath, /datum/quirk/evil),
+ list(/datum/quirk/darkpack/weak_willed, /datum/quirk/darkpack/untamable), // DARKPACK EDIT ADD - MERITS/FLAWS
))
GLOBAL_LIST_INIT(quirk_string_blacklist, generate_quirk_string_blacklist())
diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm
index 7de2877e519f..081e4682178f 100644
--- a/code/controllers/subsystem/statpanel.dm
+++ b/code/controllers/subsystem/statpanel.dm
@@ -39,9 +39,10 @@ SUBSYSTEM_DEF(statpanels)
"Round ID: [GLOB.round_id ? GLOB.round_id : "NULL"]",
"Server Time: [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss", world.timezone)]",
"Round Time: [ROUND_TIME()]",
- "Local City Time: [SSticker.round_start_timeofday ? "[station_time_timestamp("hh:mm MMM")] [CURRENT_STATION_YEAR]" : "The round hasn't started yet!"]",
+ // "Station Time: [station_time_timestamp()]", // DARKPACK EDIT REMOVAL - MERITS/FLAWS - (Time sense)
"Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)",
- "---", // DARKPACK EDIT ADD
+ "\n", // DARKPACK EDIT ADD
+ "Canon: [GLOB.canon_event ? "Yes" : "No"]", // DARKPACK EDIT ADD
"Masquerade: [SSmasquerade.get_description()]", // DARKPACK EDIT ADD
)
diff --git a/code/datums/quirks/negative_quirks/scarred_eye.dm b/code/datums/quirks/negative_quirks/scarred_eye.dm
index 3bead4bb248b..e7920e767c22 100644
--- a/code/datums/quirks/negative_quirks/scarred_eye.dm
+++ b/code/datums/quirks/negative_quirks/scarred_eye.dm
@@ -1,5 +1,5 @@
/datum/quirk/item_quirk/scarred_eye
- name = "Scarred Eye"
+ name = "One Eye" // DARKPACK EDIT CHANGE - MERITS/FLAWS
desc = "An accident in your past has cost you one of your eyes, but you got a cool eyepatch. Yarr!"
icon = FA_ICON_EYE_SLASH
value = -2
@@ -9,6 +9,7 @@
hardcore_value = 2
quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE
mail_goodies = list(/obj/item/reagent_containers/cup/glass/bottle/rum, /obj/item/clothing/mask/bandana/red)
+ darkpack_allowed = TRUE // DARKPACK EDIT ADD - MERITS/FLAWS
/datum/quirk_constant_data/eye_scarring
associated_typepath = /datum/quirk/item_quirk/scarred_eye
diff --git a/code/modules/client/preferences/scarred_eye.dm b/code/modules/client/preferences/scarred_eye.dm
index 6cb0286fe86e..5905a13e2bec 100644
--- a/code/modules/client/preferences/scarred_eye.dm
+++ b/code/modules/client/preferences/scarred_eye.dm
@@ -14,7 +14,7 @@
if (!.)
return FALSE
- return "Scarred Eye" in preferences.all_quirks
+ return /datum/quirk/item_quirk/scarred_eye::name in preferences.all_quirks // DARKPACK EDIT CHANGE
/datum/preference/choiced/scarred_eye/apply_to_human(mob/living/carbon/human/target, value)
return
diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm
index e08d49af9ed8..7e0b4eca3c36 100644
--- a/code/modules/mob/living/carbon/examine.dm
+++ b/code/modules/mob/living/carbon/examine.dm
@@ -184,12 +184,16 @@
var/mob/living/carbon/human/husrc = src // gross istypesrc but easier than refactoring even further for now
if(husrc.skin_tone == "albino")
apparent_blood_volume -= (BLOOD_VOLUME_NORMAL * 0.25) // knocks you down a few pegs
- if(HAS_TRAIT(user, TRAIT_COLD_AURA))
+ // DARKPACK EDIT ADD START
+ if(HAS_TRAIT(user, TRAIT_PALE_AURA))
apparent_blood_volume -= (BLOOD_VOLUME_NORMAL * 0.25)
+ /* I need a citation on if this thing is real, i got nothing.
if(HAS_TRAIT(user, TRAIT_WARM_AURA))
apparent_blood_volume += (BLOOD_VOLUME_NORMAL * 0.25)
+ */
if(HAS_TRAIT(user, TRAIT_BLUSH_OF_HEALTH))
apparent_blood_volume += (BLOOD_VOLUME_NORMAL * 0.50)
+ // DAKRPACK EDIT ADD END
switch(apparent_blood_volume)
if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE)
. += span_warning("[t_He] [t_has] pale skin.")
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 9d8b40041a8e..13da711e780a 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -911,7 +911,11 @@
/// Adds this list to the output to the stat browser
/mob/proc/get_status_tab_items()
- . = list("") //we want to offset unique stuff from standard stuff
+ // DARKPACK EDIT CHANGE START - MERITS/FLAWS - (Time sense)
+ . = list()
+ . += get_time_status()
+ . += "" //we want to offset unique stuff from standard stuff
+ // DARKPACK EDIT CHANGE END
SEND_SIGNAL(src, COMSIG_MOB_GET_STATUS_TAB_ITEMS, .)
return .
diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/examine.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/examine.dm
index 102b857cf700..881af604f24c 100644
--- a/modular_darkpack/master_files/code/modules/mob/living/carbon/examine.dm
+++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/examine.dm
@@ -26,6 +26,9 @@
if(HAS_TRAIT(src, TRAIT_SERPENTIS_SKIN) && !(HIDEJUMPSUIT)) // 'hidden by modest clothing'
. += span_danger("[p_They()] [p_are()] covered in... scales!?
")
+ if(HAS_TRAIT(src, TRAIT_ANIMAL_MUSK))
+ . += span_warning("[p_they(TRUE)] smell[p_s()] weirdly animal like...
")
+
if(!(obscured_slots & HIDEFACE))
switch(st_get_stat(STAT_APPEARANCE))
if(0)
diff --git a/modular_darkpack/modules/merits_flaws/code/_darkpack_quirk.dm b/modular_darkpack/modules/merits_flaws/code/_darkpack_quirk.dm
index 1a4bca060dcf..b64b641edb48 100644
--- a/modular_darkpack/modules/merits_flaws/code/_darkpack_quirk.dm
+++ b/modular_darkpack/modules/merits_flaws/code/_darkpack_quirk.dm
@@ -26,6 +26,8 @@
if(splat.id in allowed_splats)
has_allowed_splat = TRUE
break
+ if(!new_holder.splats && (SPLAT_NONE in allowed_splats))
+ has_allowed_splat = TRUE
if(!has_allowed_splat)
return FALSE
@@ -50,7 +52,8 @@
return TRUE
var/datum/splat/splat_path = GLOB.splat_prototypes[mob_splat]
- var/splat_id = splat_path?.id
+ // If splat is null, just assume we have no splat.
+ var/splat_id = splat_path?.id ? splat_path.id : SPLAT_NONE
if(forbidden_splats && (splat_id in forbidden_splats))
return FALSE
diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/animal_musk.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/animal_musk.dm
new file mode 100644
index 000000000000..0f683a469923
--- /dev/null
+++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/animal_musk.dm
@@ -0,0 +1,12 @@
+// W20 p. 473
+/datum/quirk/darkpack/animal_musk
+ name = "Animal Musk"
+ // A little unsure who to do the logic on the social roll rn.
+ desc = {"(This is roleplay/flavor text at the moment) You have the odor of an animal, even in Homid form.
+ Whenever you are indoors or in a crowd of people, you make all Social rolls at a +2 difficulty.
+ Outdoors or in situations where you can distance yourself from humans, your odor is not noticeable.
+ Wolves (and lupus-born Garou) take little notice of this Flaw.."}
+ value = -1
+ mob_trait = TRAIT_ANIMAL_MUSK
+ icon = FA_ICON_SPRAY_CAN_SPARKLES // icon = FA_ICON_BUGS
+ allowed_splats = SPLAT_SHIFTERS
diff --git a/modular_darkpack/modules/quirks/code/negative_quirks/derangement.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/derangement.dm
similarity index 89%
rename from modular_darkpack/modules/quirks/code/negative_quirks/derangement.dm
rename to modular_darkpack/modules/merits_flaws/code/negative_quirks/derangement.dm
index 713465fb9780..1f7d9ce5bfa9 100644
--- a/modular_darkpack/modules/quirks/code/negative_quirks/derangement.dm
+++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/derangement.dm
@@ -1,7 +1,7 @@
#define FLOOR_DISAPPEAR 3 SECONDS
-/datum/quirk/derangement
+/datum/quirk/darkpack/derangement
name = "Derangement"
desc = "Suffer from a permanent, incurable derangement that alters your perception."
icon = FA_ICON_HOUSE_MEDICAL_CIRCLE_EXCLAMATION
@@ -17,10 +17,10 @@
var/list/derangements
COOLDOWN_DECLARE(next_process)
-/datum/quirk/derangement/add()
+/datum/quirk/darkpack/derangement/add()
derangements = subtypesof(/datum/hallucination/malk)
-/datum/quirk/derangement/process(seconds_per_tick)
+/datum/quirk/darkpack/derangement/process(seconds_per_tick)
if(!quirk_holder.client)
return
if(!COOLDOWN_FINISHED(src, next_process))
@@ -35,7 +35,7 @@
// largely taken from https://github.com/The-Final-Nights/The-Final-Nights/pull/287
// based on the work of maaacha
-/datum/quirk/derangement/proc/handle_malk_floors()
+/datum/quirk/darkpack/derangement/proc/handle_malk_floors()
if(!quirk_holder?.client)
return
//Floors go crazy go stupid
@@ -46,7 +46,7 @@
continue
handle_malk_floor(floor)
-/datum/quirk/derangement/proc/handle_malk_floor(turf/open/floor)
+/datum/quirk/darkpack/derangement/proc/handle_malk_floor(turf/open/floor)
var/mutable_appearance/fake_floor = image(floor.icon, floor, floor.icon_state, floor.layer)
quirk_holder?.client.images += fake_floor
var/offset = pick(-3,-2, -1, 1, 2, 3)
@@ -54,11 +54,11 @@
animate(fake_floor, pixel_y = offset, time = disappearfirst, flags = ANIMATION_RELATIVE)
addtimer(CALLBACK(src, PROC_REF(malk_floor_stage1), quirk_holder, offset, fake_floor), disappearfirst, TIMER_CLIENT_TIME)
-/datum/quirk/derangement/proc/malk_floor_stage1(mob/living/malk, offset, mutable_appearance/fake_floor)
+/datum/quirk/darkpack/derangement/proc/malk_floor_stage1(mob/living/malk, offset, mutable_appearance/fake_floor)
animate(fake_floor, pixel_y = -offset, time = FLOOR_DISAPPEAR, flags = ANIMATION_RELATIVE)
addtimer(CALLBACK(src, PROC_REF(malk_floor_stage2), malk, fake_floor), FLOOR_DISAPPEAR, TIMER_CLIENT_TIME)
-/datum/quirk/derangement/proc/malk_floor_stage2(mob/living/malk, mutable_appearance/fake_floor)
+/datum/quirk/darkpack/derangement/proc/malk_floor_stage2(mob/living/malk, mutable_appearance/fake_floor)
malk.client?.images -= fake_floor
/datum/hallucination/malk
diff --git a/modular_darkpack/modules/merits_flaws/code/horrific_appearance_quirk.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/horrific_appearance_quirk.dm
similarity index 100%
rename from modular_darkpack/modules/merits_flaws/code/horrific_appearance_quirk.dm
rename to modular_darkpack/modules/merits_flaws/code/negative_quirks/horrific_appearance_quirk.dm
diff --git a/modular_darkpack/modules/merits_flaws/code/monstrous_quirk.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/monstrous_quirk.dm
similarity index 100%
rename from modular_darkpack/modules/merits_flaws/code/monstrous_quirk.dm
rename to modular_darkpack/modules/merits_flaws/code/negative_quirks/monstrous_quirk.dm
diff --git a/modular_darkpack/modules/merits_flaws/code/organovore.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/organovore.dm
similarity index 100%
rename from modular_darkpack/modules/merits_flaws/code/organovore.dm
rename to modular_darkpack/modules/merits_flaws/code/negative_quirks/organovore.dm
diff --git a/modular_darkpack/modules/merits_flaws/code/permanent_fangs.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/permanent_fangs.dm
similarity index 85%
rename from modular_darkpack/modules/merits_flaws/code/permanent_fangs.dm
rename to modular_darkpack/modules/merits_flaws/code/negative_quirks/permanent_fangs.dm
index 8ee8a3d81f9a..d4463c3c5acd 100644
--- a/modular_darkpack/modules/merits_flaws/code/permanent_fangs.dm
+++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/permanent_fangs.dm
@@ -1,6 +1,8 @@
+// V20 p. 482
/datum/quirk/darkpack/permafangs
name = "Permanent Fangs"
desc = "Your fangs do not retract, making it impossible for you to hide your true nature. While some mortals may think you've had your teeth filed or are wearing prosthetics, sooner or later you're going to run into someone who knows what you truly are."
+ // TTRPG accurate would be -3? But this is also missing the max Appearance lock..
value = -1
mob_trait = TRAIT_PERMAFANGS
gain_text = span_notice("Your fangs become stuck.")
diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/pierced_veil.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/pierced_veil.dm
new file mode 100644
index 000000000000..c05a8d72e10f
--- /dev/null
+++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/pierced_veil.dm
@@ -0,0 +1,10 @@
+// W20 p. 484
+/datum/quirk/darkpack/pierced_veil
+ name = "Pierced Veil"
+ // A little unsure who to do the logic on the social roll rn.
+ desc = {"Unlike most Garou, your Crinos form does not trigger the Delirium in mortals.
+ This makes you particularly vulnerable to werewolf hunters, who may find it less difficult to pursue you back to your caern, putting the members of your sept in considerable danger."}
+ value = -3
+ mob_trait = TRAIT_PIERCED_VEIL
+ icon = FA_ICON_MASKS_THEATER
+ allowed_splats = SPLAT_SHIFTERS
diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/weak_willed.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/weak_willed.dm
new file mode 100644
index 000000000000..bc2c12965d19
--- /dev/null
+++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/weak_willed.dm
@@ -0,0 +1,16 @@
+// W20 p. 478, V20 p. 486
+/datum/quirk/darkpack/weak_willed
+ name = "Weak Willed"
+ desc = {"You have little resistance to attempts to dominate or intimidate you.
+ Domination-focused Powers such as Dominate automatically succeed against you.
+ Your difficulties to resist mind-altering spells or magic, are increased by two."}
+ /* Need to implement the other effects still.....
+ desc = {"You have little resistance to attempts to dominate or intimidate you.
+ Domination-focused Powers such as Dominate, Staredown, Roll Over, etc. automatically succeed against you.
+ Your difficulties to resist Social Talents such as Intimidation or Leadership, as well as mind-altering spells or magic, are increased by two.
+ Your Willpower may never rise above 4"}
+ */
+ value = -1
+ mob_trait = TRAIT_WEAK_WILLED
+ icon = FA_ICON_BRAIN
+
diff --git a/modular_darkpack/modules/merits_flaws/code/illegal_identity.dm b/modular_darkpack/modules/merits_flaws/code/neutral_quirks/illegal_identity.dm
similarity index 98%
rename from modular_darkpack/modules/merits_flaws/code/illegal_identity.dm
rename to modular_darkpack/modules/merits_flaws/code/neutral_quirks/illegal_identity.dm
index 07688d52bdc5..7011d373b5b4 100644
--- a/modular_darkpack/modules/merits_flaws/code/illegal_identity.dm
+++ b/modular_darkpack/modules/merits_flaws/code/neutral_quirks/illegal_identity.dm
@@ -1,3 +1,4 @@
+// Homebrew?
/datum/quirk/darkpack/illegal_identity
name = "Illegal Identity"
desc = "Illegal immigrant? Died legally? Born a wolf? The cops aren't happy."
diff --git a/modular_darkpack/modules/quirks/code/quirks.dm b/modular_darkpack/modules/merits_flaws/code/old_quirks.dm
similarity index 100%
rename from modular_darkpack/modules/quirks/code/quirks.dm
rename to modular_darkpack/modules/merits_flaws/code/old_quirks.dm
diff --git a/modular_darkpack/modules/merits_flaws/code/positive_quirks/beserk.dm b/modular_darkpack/modules/merits_flaws/code/positive_quirks/beserk.dm
new file mode 100644
index 000000000000..debce1198337
--- /dev/null
+++ b/modular_darkpack/modules/merits_flaws/code/positive_quirks/beserk.dm
@@ -0,0 +1,23 @@
+/* DARKPACK TODO - FRENZY
+// W20 p. 473
+/datum/quirk/darkpack/metamorph
+ name = "Metamorph"
+ desc = {"You have uncanny control over your inner anger, and can use your Rage as most Garou cannot.
+ You can enter a berserk frenzy at will, ignoring your wound penalties.
+ You still suffer the consequences of any actions committed in the throes of frenzy.
+ When circumstances might cause you to frenzy, you must make a standard roll to see if you do so or not."}
+ value = 2
+ icon = FA_ICON_ANGRY
+ allowed_splats = SPLAT_SHIFTERS
+
+/datum/quirk/darkpack/metamorph/add(client/client_source)
+ . = ..()
+ add_verb(quirk_holder, /mob/living/carbon/human/proc/manual_frenzy)
+
+/datum/quirk/darkpack/metamorph/remove()
+ . = ..()
+ remove_verb(quirk_holder, /mob/living/carbon/human/proc/manual_frenzy)
+
+/mob/living/carbon/human/proc/manual_frenzy()
+ return
+*/
diff --git a/modular_darkpack/modules/merits_flaws/code/positive_quirks/fair_glabro.dm b/modular_darkpack/modules/merits_flaws/code/positive_quirks/fair_glabro.dm
new file mode 100644
index 000000000000..508eef62a44d
--- /dev/null
+++ b/modular_darkpack/modules/merits_flaws/code/positive_quirks/fair_glabro.dm
@@ -0,0 +1,8 @@
+// W20 p. 472
+/datum/quirk/darkpack/fair_glabro
+ name = "Fair Glabro"
+ desc = "You have a Glabro form that can pass for human, though it's still larger than normal people. You have no penalties to Social Attributes in Glabro form."
+ value = 2
+ mob_trait = TRAIT_FAIR_GLABRO
+ icon = FA_ICON_PERSON_HALF_DRESS
+ allowed_splats = list(SPLAT_GAROU)
diff --git a/modular_darkpack/modules/merits_flaws/code/giovanni_sanguine_incongruity.dm b/modular_darkpack/modules/merits_flaws/code/positive_quirks/giovanni_sanguine_incongruity.dm
similarity index 100%
rename from modular_darkpack/modules/merits_flaws/code/giovanni_sanguine_incongruity.dm
rename to modular_darkpack/modules/merits_flaws/code/positive_quirks/giovanni_sanguine_incongruity.dm
diff --git a/modular_darkpack/modules/merits_flaws/code/positive_quirks/metamorph.dm b/modular_darkpack/modules/merits_flaws/code/positive_quirks/metamorph.dm
new file mode 100644
index 000000000000..b71e7626b970
--- /dev/null
+++ b/modular_darkpack/modules/merits_flaws/code/positive_quirks/metamorph.dm
@@ -0,0 +1,18 @@
+// W20 p. 473
+/datum/quirk/darkpack/metamorph
+ name = "Metamorph"
+ desc = {"Shapechanging for you is as easy as breathing.
+ You do not need to roll to change forms, nor is it necessary to spend a Rage point for an instantaneous shift.
+ You make your changes as if you scored five successes on your roll to shift forms.
+ If you lose consciousness from wounds or for some other reason, you may roll Wits + Primal Urge (difficulty 8) to choose which form you assume rather than reverting to breed form."}
+ value = 7
+ mob_trait = TRAIT_METAMORPH
+ // I love the greg sam. sa
+ icon = FA_ICON_BUG
+ allowed_splats = SPLAT_SHIFTERS
+
+/datum/storyteller_roll/metamorph
+ bumper_text = "metamorph"
+ applicable_stats = (STAT_WITS) // + PRIMAL_URGE
+ difficulty = 8
+ roll_output_type = ROLL_PRIVATE
diff --git a/modular_darkpack/modules/merits_flaws/code/positive_quirks/pale_aura.dm b/modular_darkpack/modules/merits_flaws/code/positive_quirks/pale_aura.dm
new file mode 100644
index 000000000000..ab605f190a8a
--- /dev/null
+++ b/modular_darkpack/modules/merits_flaws/code/positive_quirks/pale_aura.dm
@@ -0,0 +1,12 @@
+// Ghouls & Revenants p. 137, HH p. 43
+/datum/quirk/darkpack/pale_aura
+ name = "Pale Aura"
+ desc = {"Any color your character's aura takes has a pale cast to it, as though he was a vampire."}
+ /*{"Any color your character's aura takes has a pale cast to it, as though he was a vampire.
+ Unless her player gains five chapter two or more successes on an Aura Perception roll,
+ any vampire discerns your character's aura as one belonging to the Kindred"}
+ */
+ value = 2
+ mob_trait = TRAIT_PALE_AURA
+ icon = FA_ICON_TEMPERATURE_EMPTY
+ allowed_splats = list(SPLAT_NONE, SPLAT_GHOUL)
diff --git a/modular_darkpack/modules/merits_flaws/code/positive_quirks/time_sense.dm b/modular_darkpack/modules/merits_flaws/code/positive_quirks/time_sense.dm
new file mode 100644
index 000000000000..132718fd3b99
--- /dev/null
+++ b/modular_darkpack/modules/merits_flaws/code/positive_quirks/time_sense.dm
@@ -0,0 +1,21 @@
+// W20 p. 475
+/datum/quirk/darkpack/time_sense
+ name = "Time Sense"
+ desc = {"You have an innate sense of time and are able to estimate the passage of time accurately without using a watch or other mechanical device,
+ even after long periods of unconsciousness. This allows you to know (among other things) what phase the moon is in."}
+ value = 1
+ mob_trait = TRAIT_TIME_SENSE
+ icon = FA_ICON_STOPWATCH
+
+/mob/proc/get_time_status()
+ . = list()
+ . += "Local City Time: [SSticker.round_start_timeofday ? "[station_time_timestamp("hh:mm MMM")] [CURRENT_STATION_YEAR]" : "The round hasn't started yet!"]"
+
+/mob/living/get_time_status()
+ . = list()
+ if(HAS_TRAIT(src, TRAIT_TIME_SENSE))
+ . += "Local City Time: [station_time_timestamp("hh:mm MMM")] [CURRENT_STATION_YEAR]"
+ . += "Phase of moon: [GLOB.moon_state]"
+ else
+ . += "Local City Time: [CURRENT_STATION_YEAR]? Get a watch."
+
diff --git a/modular_darkpack/modules/merits_flaws/code/positive_quirks/untamable.dm b/modular_darkpack/modules/merits_flaws/code/positive_quirks/untamable.dm
new file mode 100644
index 000000000000..913de0114813
--- /dev/null
+++ b/modular_darkpack/modules/merits_flaws/code/positive_quirks/untamable.dm
@@ -0,0 +1,11 @@
+// W20 p. 476
+/datum/quirk/darkpack/untamable
+ name = "Untamable"
+ desc = {"You are a wild soul who has never bent to the leash.
+ You are immune to vampiric Domination (but not emotional manipulations via Presence)"}
+ // Change this line when we add these gifts.
+ // You are immune to vampiric Domination (but not emotional manipulations via Presence) and these Gifts will not work on you: Roll Over, Obedience, and Mastery."}
+ value = 5
+ mob_trait = TRAIT_MERIT_UNTAMABLE
+ icon = FA_ICON_SHIELD_DOG
+ allowed_splats = SPLAT_SHIFTERS
diff --git a/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm b/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm
index 461ed16fbbf1..cd5331e5e903 100644
--- a/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm
+++ b/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm
@@ -1,3 +1,5 @@
+#define AUSPEX_LAYER BELOW_MOB_LAYER
+
/datum/atom_hud/data/auspex_aura
hud_icons = list(AUSPEX_AURA_HUD)
@@ -39,7 +41,7 @@
var/image/holder = parent_mob.hud_list[AUSPEX_AURA_HUD]
if(!holder)
holder = new
- var/mutable_appearance/aura_appearance = mutable_appearance('modular_darkpack/modules/powers/icons/auras.dmi', "aura", ABOVE_MOB_LAYER, parent_mob, GAME_PLANE)
+ var/mutable_appearance/aura_appearance = mutable_appearance('modular_darkpack/modules/powers/icons/auras.dmi', "aura", AUSPEX_LAYER, parent_mob, GAME_PLANE)
update_aura_colors(aura_appearance, holder)
update_aura_overlays(aura_appearance, holder)
update_aura_filters(aura_appearance, holder)
@@ -60,9 +62,9 @@
holder.appearance = aura_appearance
var/mob/parent_mob = parent
- if(get_kindred_splat(parent_mob))
+ if(HAS_TRAIT(parent, TRAIT_PALE_AURA))
var/icon/temporary_icon_holder = holder.appearance
- var/mutable_appearance/aura_image = mutable_appearance(temporary_icon_holder, "aura", ABOVE_MOB_LAYER, parent_mob, GAME_PLANE)
+ var/mutable_appearance/aura_image = mutable_appearance(temporary_icon_holder, "aura", AUSPEX_LAYER, parent_mob, GAME_PLANE)
var/list/hsv_color_value = rgb2hsv(holder.color)
hsv_color_value[2] = hsv_color_value[2] * 0.7 // Reduce saturation for kindred
@@ -73,7 +75,7 @@
// DARKPACK TODO - aura still needs real sprites.
if(HAS_TRAIT(parent_mob, TRAIT_FRENETIC_AURA))
var/icon/temporary_icon_holder = holder.appearance
- var/mutable_appearance/aura_image = mutable_appearance(temporary_icon_holder, "old_aura_bright", ABOVE_MOB_LAYER, parent_mob, GAME_PLANE)
+ var/mutable_appearance/aura_image = mutable_appearance(temporary_icon_holder, "old_aura_bright", AUSPEX_LAYER, parent_mob, GAME_PLANE)
var/list/hsv_color_value = rgb2hsv(holder.color)
hsv_color_value[2] = hsv_color_value[2] * 1.5 // Way brighter for shapeshifters
@@ -93,15 +95,15 @@
if(current_aura == AURA_ANXIOUS)
var/icon/temporary_icon_holder = icon('modular_darkpack/modules/powers/icons/auras.dmi', "aura")
var/icon/static_icon = getStaticIcon(temporary_icon_holder)
- var/mutable_appearance/static_image = mutable_appearance(static_icon, "aura", ABOVE_MOB_LAYER+2, parent_mob, GAME_PLANE)
+ var/mutable_appearance/static_image = mutable_appearance(static_icon, "aura", AUSPEX_LAYER+0.01, parent_mob, GAME_PLANE)
static_image.appearance_flags |= RESET_COLOR
holder.add_overlay(static_image)
- if(get_ghoul_splat(parent_mob))
+ if(!HAS_TRAIT(parent, TRAIT_PALE_AURA) && get_ghoul_splat(parent_mob))
var/icon/temporary_icon_holder = icon('modular_darkpack/modules/powers/icons/auras.dmi', "aurablotch")
- var/mutable_appearance/aura_blotches = mutable_appearance(temporary_icon_holder, "aurablotch", ABOVE_MOB_LAYER+3, parent_mob, GAME_PLANE)
+ var/mutable_appearance/aura_blotches = mutable_appearance(temporary_icon_holder, "aurablotch", AUSPEX_LAYER+0.02, parent_mob, GAME_PLANE)
- var/list/hsv_color_value = rgb2hsv(aura_appearance.color)
+ var/list/hsv_color_value = rgb2hsv(holder.color)
hsv_color_value[2] = hsv_color_value[2] * 0.7 // Reduce saturation for ghouls
var/icon/icon_mask = getIconMask(aura_blotches)
@@ -120,3 +122,4 @@
if(HAS_TRAIT(parent_mob, TRAIT_IN_FRENZY))
apply_wibbly_filters(holder)
+#undef AUSPEX_LAYER
diff --git a/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm b/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm
index 2c8398f3ea74..83a0326b9441 100644
--- a/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm
+++ b/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm
@@ -107,12 +107,15 @@
var/mypower = SSroll.storyteller_roll(owner_stat, difficulty = theirpower, roller = owner, numerical = TRUE)
//tremere have built-in safeguards to easily dominate their stone servitors
- var/mob/living/carbon/human/human_target = target
if(HAS_TRAIT(target, TRAIT_WEAK_TO_DOMINATE))
theirpower -= 2
+ if(HAS_TRAIT(target, TRAIT_WEAK_WILLED))
+ theirpower -= 2
+
//wearing dark sunglasses makes it harder for the Dominator to capture the victim's gaze and raises difficulty -- V20 'Dominate' section titled 'Eye Contact'
var/total_tint = 0
+ var/mob/living/carbon/human/human_target = target
for(var/obj/item/clothing/worn_item in human_target.get_equipped_items(INCLUDE_ABSTRACT))
total_tint += worn_item.tint
@@ -136,9 +139,13 @@
var/datum/splat/vampire/kindred/target_splat = get_kindred_splat(target)
if(target_splat)
if(owner_splat.generation > target_splat.generation)
- to_chat(owner, span_warning("Your fail to dominate [target], as their blood is more potent than yours!"))
+ to_chat(owner, span_warning("You fail to dominate [target], as their blood is more potent than yours!"))
return FALSE
+ if(HAS_TRAIT(target, TRAIT_MERIT_UNTAMABLE))
+ to_chat(owner, span_warning("You fail to dominate [target], they are an untamable beast!"))
+ return FALSE
+
if(numerical == TRUE)
return mypower
diff --git a/modular_darkpack/modules/powers/code/discipline/melpominee.dm b/modular_darkpack/modules/powers/code/discipline/melpominee.dm
index 8530d45912dd..7fce7cbd8719 100644
--- a/modular_darkpack/modules/powers/code/discipline/melpominee.dm
+++ b/modular_darkpack/modules/powers/code/discipline/melpominee.dm
@@ -350,14 +350,14 @@
listener.overlays_standing[MUTATIONS_LAYER] = song_overlay
listener.apply_overlay(MUTATIONS_LAYER)
if(cumulative_our_power[listener] >= 20)
- listener.add_quirk(/datum/quirk/derangement)
+ listener.add_quirk(/datum/quirk/darkpack/derangement)
if(cumulative_list[listener] <= cumulative_our_power[listener]-6)
- if(listener.add_quirk(/datum/quirk/derangement))
+ if(listener.add_quirk(/datum/quirk/darkpack/derangement))
addtimer(CALLBACK(src, PROC_REF(remove_derangement), listener), 1 SCENES)
/datum/discipline_power/melpominee/sirens_beckoning/proc/remove_derangement(mob/living/carbon/listener)
- listener.remove_quirk(/datum/quirk/derangement)
+ listener.remove_quirk(/datum/quirk/darkpack/derangement)
/datum/discipline_power/melpominee/sirens_beckoning/deactivate(mob/living/carbon/target)
. = ..()
diff --git a/modular_darkpack/modules/powers/code/discipline/temporis/temporis.dm b/modular_darkpack/modules/powers/code/discipline/temporis/temporis.dm
index 839b6e4bb325..32264cf723b0 100644
--- a/modular_darkpack/modules/powers/code/discipline/temporis/temporis.dm
+++ b/modular_darkpack/modules/powers/code/discipline/temporis/temporis.dm
@@ -36,6 +36,9 @@
check_flags = DISC_CHECK_CONSCIOUS
vitae_cost = 0
+/datum/discipline_power/temporis/hourglass_of_the_mind/post_gain()
+ ADD_TRAIT(owner, TRAIT_TIME_SENSE, DISCIPLINE_TRAIT)
+
/datum/discipline_power/temporis/hourglass_of_the_mind/activate()
. = ..()
to_chat(owner, "[station_time_timestamp("hh:mm:ss")]")
diff --git a/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm b/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm
index 7621113087d1..0ac46b1dc569 100644
--- a/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm
+++ b/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm
@@ -85,6 +85,7 @@
LAZYADDASSOC(mobs_last_rolled, WEAKREF(roller), list(world.time, output))
+ SEND_SIGNAL(roller, COMSIG_LIVING_DICE_ROLLED, src, output)
return output
diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/kindred_splat.dm b/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/kindred_splat.dm
index 5526207a4eaa..f31f40416a8b 100644
--- a/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/kindred_splat.dm
+++ b/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/kindred_splat.dm
@@ -15,7 +15,8 @@
TRAIT_VTM_MORALITY,
TRAIT_VTM_CLANS,
TRAIT_UNAGING,
- TRAIT_DRINKS_BLOOD
+ TRAIT_DRINKS_BLOOD,
+ TRAIT_PALE_AURA,
)
splat_actions = list(
/datum/action/cooldown/mob_cooldown/give_vitae,
diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/malkavian/malkavian.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/malkavian/malkavian.dm
index c74d1bcfd05d..e8029f15fc38 100644
--- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/malkavian/malkavian.dm
+++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/malkavian/malkavian.dm
@@ -21,7 +21,7 @@
var/datum/action/cooldown/malk_speech/malk_font = new(gaining_mob)
hivemind.Grant(gaining_mob)
malk_font.Grant(gaining_mob)
- gaining_mob.add_quirk(/datum/quirk/derangement)
+ gaining_mob.add_quirk(/datum/quirk/darkpack/derangement)
// Madness Network handling
LAZYADD(madness_network, gaining_mob)
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/black_furies.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/black_furies.dm
new file mode 100644
index 000000000000..41cd66428a1c
--- /dev/null
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/black_furies.dm
@@ -0,0 +1,71 @@
+/* • Breath of the Wyld - W20 p.173
+ *
+ * Furies embrace the energy of creation, and they can share that passion with others.
+ * With this Gift, the Black Fury instills a feeling of vitality, life, and lucidity in another living being.
+ * It is taught by a servant of Pegasus.
+ *
+ * Roll Gnosis (difficulty 5 against Garou, Kinfolk; 6 otherwise).
+ * Success grants the recipient an additional die to all mental rolls for the rest of the scene.
+ * Also adds 1 to the difficulty of rage rolls made in this time.
+ *
+ * TODO: Rage check difficulty and audio. Use a horse sound.
+*/
+
+/datum/action/cooldown/power/gift/breath_of_the_wyld
+ name = "Breath of the Wyld"
+ desc = "The Fury instills a target with a rush of lucidity."
+ button_icon_state = "breath_of_the_wyld"
+ click_to_activate = TRUE
+ rank = 1
+
+/datum/action/cooldown/power/gift/breath_of_the_wyld/Activate(atom/target)
+ if(!isliving(target))
+ return
+ if(!(target in range(1, owner)))
+ return
+
+ . = ..()
+
+ var/mob/living/victim = target
+ var/mob/living/caster = owner
+ var/datum/splat/werewolf/casting_splat = get_werewolf_splat(caster)
+ var/roll_difficulty = get_werewolf_splat(target) ? 5 : 6
+
+ var/datum/storyteller_roll/roll_datum = new()
+ roll_datum.difficulty = roll_difficulty
+ var/roll_result = roll_datum.st_roll(caster, target, casting_splat.gnosis)
+
+ if(roll_result != ROLL_SUCCESS)
+ return
+
+ victim.apply_status_effect(/datum/status_effect/breath_of_the_wyld)
+
+ StartCooldown()
+ return TRUE
+
+/datum/status_effect/breath_of_the_wyld
+ id = "breath_of_the_wyld"
+ duration = 1 SCENES
+
+ status_type = STATUS_EFFECT_REPLACE
+
+ alert_type = /atom/movable/screen/alert/status_effect/breath_of_the_wyld
+
+/datum/status_effect/breath_of_the_wyld/on_apply()
+ owner.st_add_stat_mod(STAT_PERCEPTION, 1, type)
+ owner.st_add_stat_mod(STAT_INTELLIGENCE, 1, type)
+ owner.st_add_stat_mod(STAT_WITS, 1, type)
+ to_chat(owner, span_notice("You feel a sense of heightened lucidity."))
+ return TRUE
+
+/datum/status_effect/breath_of_the_wyld/on_remove()
+ owner.st_remove_stat_mod(STAT_PERCEPTION, type)
+ owner.st_remove_stat_mod(STAT_INTELLIGENCE, type)
+ owner.st_remove_stat_mod(STAT_WITS, type)
+ to_chat(owner, span_warning("Your mind settles, returning to it's normal state of lucidity."))
+
+/atom/movable/screen/alert/status_effect/breath_of_the_wyld
+ name = "Breath of the Wyld"
+ desc = "Gain an additional die to all mental checks, but suffer a penalty to rage check difficulty." // TODO: rage difficulty code
+ icon = 'modular_darkpack/modules/deprecated/icons/hud/screen_alert.dmi'
+ icon_state = "riddle" // TODO: get an icon for this
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/black_spiral_dancer.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/black_spiral_dancer.dm
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/bone_gnawers.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/bone_gnawers.dm
new file mode 100644
index 000000000000..9bf76494c4c9
--- /dev/null
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/bone_gnawers.dm
@@ -0,0 +1,88 @@
+/* • Desperate Strength - W20 p.174
+ *
+ * The werewolf calls on desperate reserves for a sudden surge of strength. A badger-spirit teaches this Gift.
+ *
+ * Select a number 1-5 on a radial menu and add that much strength to the next strength roll. Take 10 brute damage per level of strength.
+ *
+ * TODO: audio. Include a badger sound.
+*/
+/datum/action/cooldown/power/gift/desperate_strength
+ name = "Desperate Strength"
+ desc = "Call on desperate reserves for a sudden surge of strength."
+ button_icon_state = "desperate_strength"
+ rank = 1
+
+/datum/action/cooldown/power/gift/desperate_strength/IsAvailable(feedback)
+ . = ..()
+ if(owner.has_status_effect(/datum/status_effect/desperate_strength))
+ if(feedback)
+ to_chat(owner, span_warning("[name] cannot be used again right now."))
+ return FALSE
+
+/datum/action/cooldown/power/gift/desperate_strength/Activate(atom/target)
+ var/mob/living/caster = owner
+ var/list/radial_menu_options = list(
+ "One" = icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/gifts/tribes/bone_gnawers.dmi', "radial_one"),
+ "Two" = icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/gifts/tribes/bone_gnawers.dmi', "radial_two"),
+ "Three" = icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/gifts/tribes/bone_gnawers.dmi', "radial_three"),
+ "Four" = icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/gifts/tribes/bone_gnawers.dmi', "radial_four"),
+ "Five" = icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/gifts/tribes/bone_gnawers.dmi', "radial_five"),
+ )
+
+ var/pick = show_radial_menu(owner, owner, radial_menu_options)
+ var/value
+
+ switch(pick)
+ if("One")
+ value = 1
+ if("Two")
+ value = 2
+ if("Three")
+ value = 3
+ if("Four")
+ value = 4
+ if("Five")
+ value = 5
+
+ if(!isnull(value))
+ caster.apply_status_effect(/datum/status_effect/desperate_strength, value)
+
+/datum/status_effect/desperate_strength
+ id = "desperate_strength"
+ duration = STATUS_EFFECT_PERMANENT
+
+ status_type = STATUS_EFFECT_UNIQUE
+
+ alert_type = /atom/movable/screen/alert/status_effect/desperate_strength
+ /// Passed in by the gift's activate
+ var/value
+
+/datum/status_effect/desperate_strength/on_creation(mob/living/owner, value)
+ src.value = value
+ return ..()
+
+/datum/status_effect/desperate_strength/on_apply()
+ owner.st_add_stat_mod(STAT_STRENGTH, value, type)
+ to_chat(owner, span_userdanger("You feel stronger... at a cost."))
+ RegisterSignal(owner, COMSIG_LIVING_DICE_ROLLED, PROC_REF(on_dice_rolled))
+ playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/desperate_strength_activate.ogg', 75, FALSE)
+ return TRUE
+
+/datum/status_effect/desperate_strength/proc/on_dice_rolled(mob/living/roller, datum/storyteller_roll/roll_datum, output)
+ SIGNAL_HANDLER
+
+ if(STAT_STRENGTH in roll_datum.applicable_stats)
+ qdel(src)
+
+/datum/status_effect/desperate_strength/on_remove()
+ owner.adjust_brute_loss(value TTRPG_DAMAGE)
+ owner.st_remove_stat_mod(STAT_STRENGTH, type)
+ playsound(owner, 'sound/effects/magic/disintegrate.ogg', 50, FALSE)
+ to_chat(owner, span_warning("Your strength subsides, the pain of your wounds creeping back in..."))
+ UnregisterSignal(owner, COMSIG_LIVING_DICE_ROLLED)
+
+/atom/movable/screen/alert/status_effect/desperate_strength
+ name = "Desperate Strength"
+ desc = "Your next roll will be made with bonus strength, at the penalty of bashing damage!"
+ icon = 'modular_darkpack/modules/deprecated/icons/hud/screen_alert.dmi'
+ icon_state = "riddle" // TODO: get an icon for this
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/fianna.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/fianna.dm
new file mode 100644
index 000000000000..b969227fec19
--- /dev/null
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/fianna.dm
@@ -0,0 +1,107 @@
+/* • Faerie Light - W20 p.178-179
+ *
+ * The Fianna conjures a small, bobbing sphere of light. It’s no brighter than a torch,
+ * but that’s usually enough to light the werewolf’s way — or lead foes into an ambush.
+ * A marsh-spirit teaches this Gift.
+ *
+ * Roll Wits + Occult (PLACEHOLDER FOR Wits + Enigmas). On success, summon a light on the turf clicked on. If clicked on a mob,
+ * the light orbits the mob. When clicked on by the summoner, it orbits or de-orbits them. When clicked on by another, the light is dispelled.
+ * Lasts for 1 scene.
+ *
+*/
+
+/obj/effect/faerie_light // TODO: add an animate or something to make this gently bob up and down
+ name = "orb of light"
+ desc = "Happy to light your way."
+ icon = 'icons/obj/lighting.dmi' // TODO: or maybe a new icon that has that baked in?
+ icon_state = "orb"
+ light_system = OVERLAY_LIGHT
+ light_range = 4
+ light_power = 1.3
+ light_color = "#79f1ff"
+ light_flags = LIGHT_ATTACHED
+ layer = ABOVE_ALL_MOB_LAYER
+ plane = ABOVE_GAME_PLANE
+ var/mob/living/summoner
+
+/obj/effect/faerie_light/Initialize(mapload)
+ . = ..()
+ register_context()
+
+/obj/effect/faerie_light/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
+ . = ..()
+ if(user == summoner)
+ context[SCREENTIP_CONTEXT_LMB] = "[orbit_target ? "Dismiss" : "Beckon"]"
+ else
+ context[SCREENTIP_CONTEXT_LMB] = "Dispel"
+
+ context[SCREENTIP_CONTEXT_RMB] = "Dispel"
+
+ return CONTEXTUAL_SCREENTIP_SET
+
+/obj/effect/faerie_light/attack_hand(mob/living/user, list/modifiers)
+ . = ..()
+ if(user != summoner)
+ to_chat(user, span_purple("You [ishuman(user) ? "wave your hand at" : "paw at"] [src], causing it to float away and disappear."))
+ animate(src, 1 SECONDS, alpha = 0)
+ QDEL_IN(src, 1.1 SECONDS)
+ return TRUE
+ else if(orbit_target)
+ to_chat(user, span_purple("You [ishuman(user) ? "wave your hand at" : "paw at"] [src], causing it to float away and remain still."))
+ orbit_target.orbiters.end_orbit(src)
+ animate(src, flags = ANIMATION_END_NOW)
+ return TRUE
+ else
+ to_chat(user, span_purple("You [ishuman(user) ? "wave your hand at" : "paw at"] [src], causing it to float over to you happily."))
+ orbit(user, 20)
+ return TRUE
+
+/obj/effect/faerie_light/attack_hand_secondary(mob/living/user, list/modifiers)
+ . = ..()
+ to_chat(user, span_purple("You [ishuman(user) ? "wave your hand at" : "paw at"] [src], causing it to float away and disappear.")) // Don't have paws? Too bad.
+ animate(src, 1 SECONDS, alpha = 0)
+ QDEL_IN(src, 1.1 SECONDS)
+ return TRUE
+
+/obj/effect/faerie_light/proc/timeout(time)
+ QDEL_IN(src, time)
+
+/obj/effect/faerie_light/Destroy()
+ . = ..()
+ if(orbit_target)
+ orbit_target.orbiters.end_orbit(src)
+
+/datum/action/cooldown/power/gift/faerie_light
+ name = "Faerie Light"
+ desc = "Create a bobbing mote of light to light your way or attract targets for an ambush."
+ button_icon_state = null // TODO: icon
+ click_to_activate = TRUE
+
+ rank = 1
+ cooldown_time = 1 TURNS
+
+/datum/action/cooldown/power/gift/faerie_light/Activate(atom/target)
+ . = ..()
+
+ var/datum/storyteller_roll/roll_datum = new()
+ roll_datum.applicable_stats = list(STAT_WITS, STAT_OCCULT)
+ roll_datum.difficulty = 6
+ var/roll_result = roll_datum.st_roll(owner)
+
+ if(roll_result <= 0)
+ return FALSE
+
+ var/obj/effect/faerie_light/cool_guy = new /obj/effect/faerie_light(get_turf(target))
+ cool_guy.summoner = owner
+ cool_guy.alpha = 0
+ animate(cool_guy, 1 SECONDS, alpha = 255, easing = BOUNCE_EASING)
+
+ if(isliving(target))
+ cool_guy.orbit(target, 20)
+
+ cool_guy.timeout(1 SCENES)
+
+ playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/faerie_light_activate.ogg', 75, FALSE)
+
+ StartCooldown()
+ return TRUE
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/get_of_fenris.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/get_of_fenris.dm
new file mode 100644
index 000000000000..bd41b466a050
--- /dev/null
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/get_of_fenris.dm
@@ -0,0 +1,83 @@
+/* • Visage of Fenris - W20 p.180
+ *
+ * The Get appears larger and more fearsome, commanding respect from peers
+ * and cowing his foes. A wolf or toad spirit teaches this Gift.
+ *
+ * Simple slowdown AOE.
+ *
+ * TODO: distinguish between friend and foe for the -1 social check thing
+ *
+ * TODO: less placeholder sound
+*/
+
+/datum/storyteller_roll/visage_of_fenris
+ bumper_text = "Visage of Fenris"
+ applicable_stats = list(STAT_CHARISMA, STAT_INTIMIDATION)
+ numerical = TRUE
+ roll_output_type = ROLL_PUBLIC
+
+/datum/movespeed_modifier/visage_of_fenris
+ multiplicative_slowdown = 0.75
+
+/datum/action/cooldown/power/gift/visage_of_fenris
+ name = "Visage of Fenris"
+ desc = "Appear larger and more fearsome to your foes, rooting them to the spot in awe."
+ button_icon_state = "visage_of_fenris"
+ rank = 1
+ cooldown_time = 1 SCENES
+ var/list/affected = list()
+
+/datum/action/cooldown/power/gift/visage_of_fenris/Activate(atom/target)
+ . = ..()
+ var/datum/splat/werewolf/our_splat = get_werewolf_splat(owner)
+ var/datum/splat/werewolf/guy_splat
+ var/datum/storyteller_roll/visage_of_fenris/roll_datum = new()
+ var/successes = roll_datum.st_roll(owner)
+
+ var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(owner.loc, owner)
+ animate(D, alpha = 0, color = COLOR_RED, transform = matrix()*2, time = 3)
+
+ playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/visage_of_fenris.ogg', 75, FALSE)
+
+ for(var/mob/living/guy in viewers(world.view, owner))
+ if(guy == owner)
+ continue
+
+ var/difference = 0
+ if(get_werewolf_splat(guy))
+ guy_splat = get_werewolf_splat(guy)
+ if(guy_splat && (our_splat.renown_rank < guy_splat.renown_rank))
+ difference = guy_splat.renown_rank-our_splat.renown_rank
+ if(successes && (successes >= difference*2))
+ guy.apply_status_effect(/datum/status_effect/visage_of_fenris)
+
+ StartCooldown()
+ return TRUE
+
+/datum/status_effect/visage_of_fenris
+ id = "visage_of_fenris"
+ duration = 6 TURNS // Nonstandard amount of time but 3 minutes of slowdown sucks.
+
+ status_type = STATUS_EFFECT_REPLACE
+
+ alert_type = /atom/movable/screen/alert/status_effect/visage_of_fenris
+
+/datum/status_effect/visage_of_fenris/on_apply() // TODO: make this a signal handler that turns the slowdown off when can't see the get for N seconds
+ owner.add_movespeed_modifier(/datum/movespeed_modifier/visage_of_fenris)
+ to_chat(owner, span_userdanger("You are consumed with terror, rooting you to the spot!"))
+
+ if(prob(50))
+ owner.emote("gasp")
+ else
+ owner.emote("scream")
+
+ return TRUE
+
+/datum/status_effect/visage_of_fenris/on_remove()
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/visage_of_fenris)
+
+/atom/movable/screen/alert/status_effect/visage_of_fenris
+ name = "Visage of Fenris"
+ desc = "You are consumed with terror, rooting you to the spot!"
+ icon = 'modular_darkpack/modules/deprecated/icons/hud/screen_alert.dmi'
+ icon_state = "fear" // TODO: get an icon for this
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/tribes.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/tribes.dm
deleted file mode 100644
index b63f6d3c0edd..000000000000
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/tribes.dm
+++ /dev/null
@@ -1,223 +0,0 @@
-/datum/action/cooldown/power/gift/stoic_pose
- name = "Stoic Pose"
- desc = "With this gift garou sends theirself into cryo-state, ignoring all incoming damage but also covering themself in a block of ice."
- button_icon_state = "stoic_pose"
- rage_cost = 2
- gnosis_cost = 1
-
-/datum/action/cooldown/power/gift/stoic_pose/Trigger()
- . = ..()
- if(allowed_to_proceed)
- playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/ice_blocking.ogg', 100, FALSE)
- var/mob/living/carbon/C = owner
- if(get_garou_splat(C))
- var/obj/were_ice/W = new (get_turf(owner))
- C.Stun(12 SECONDS)
- C.forceMove(W)
- spawn(12 SECONDS)
- C.forceMove(get_turf(W))
- qdel(W)
- if(iscrinos(C))
- var/obj/were_ice/crinos/W = new (get_turf(owner))
- C.Stun(12 SECONDS)
- C.forceMove(W)
- spawn(12 SECONDS)
- C.forceMove(get_turf(W))
- qdel(W)
- if(islupus(C))
- var/obj/were_ice/lupus/W = new (get_turf(owner))
- C.Stun(12 SECONDS)
- C.forceMove(W)
- spawn(12 SECONDS)
- C.forceMove(get_turf(W))
- qdel(W)
-
-/obj/were_ice
- name = "ice block"
- desc = "Stores some precious organs..."
- icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_lupus.dmi'
- icon_state = "ice_man"
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF
-
-/obj/were_ice/lupus
- icon_state = "ice_wolf"
-
-/obj/were_ice/crinos
- icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf.dmi'
- icon_state = "ice"
- pixel_w = -8
-
-/datum/action/cooldown/power/gift/freezing_wind
- name = "Freezing Wind"
- desc = "Garou of Wendigo Tribe can create a stream of cold, freezing wind, and strike her foes with it."
- button_icon_state = "freezing_wind"
- rage_cost = 1
- //gnosis_cost = 1
-
-/datum/action/cooldown/power/gift/freezing_wind/Trigger()
- . = ..()
- if(allowed_to_proceed)
- playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/wind_cast.ogg', 100, FALSE)
- for(var/turf/T in range(3, get_step(get_step(owner, owner.dir), owner.dir)))
- if(owner.loc != T)
- var/obj/effect/wind/W = new(T)
- W.dir = owner.dir
- W.strength = 100
- spawn(200)
- qdel(W)
-// if(allowed_to_proceed)
-
-/datum/action/cooldown/power/gift/bloody_feast
- name = "Bloody Feast"
- desc = "By eating a grabbed corpse, garou can redeem their lost health and heal the injuries."
- button_icon_state = "bloody_feast"
- rage_cost = 2
- gnosis_cost = 1
-
-/datum/action/cooldown/power/gift/bloody_feast/Trigger()
- . = ..()
- if(allowed_to_proceed)
- var/mob/living/carbon/C = owner
- if(C.pulling)
- if(isliving(C.pulling))
- var/mob/living/L = C.pulling
- if(L.stat == DEAD)
- playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/bloody_feast.ogg', 50, FALSE)
- qdel(L)
- C.revive(full_heal = TRUE, admin_revive = TRUE)
-
-/datum/action/cooldown/power/gift/stinky_fur
- name = "Stinky Fur"
- desc = "Garou creates an aura of very toxic smell, which disorientates everyone around."
- button_icon_state = "stinky_fur"
-
-/datum/action/cooldown/power/gift/stinky_fur/Trigger()
- . = ..()
- if(allowed_to_proceed)
- playsound(get_turf(owner), 'modular_darkpack/modules/powers/sounds/necromancy.ogg', 75, FALSE)
- for(var/mob/living/carbon/C in orange(5, owner))
- if(prob(25))
- C.vomit()
- C.dizziness += 10
- C.add_confusion(10)
-
-/datum/action/cooldown/power/gift/venom_claws
- name = "Venom Claws"
- desc = "While this ability is active, strikes with claws poison foes of garou."
- button_icon_state = "venom_claws"
- rage_cost = 1
-
-/datum/action/cooldown/power/gift/venom_claws/Trigger()
- . = ..()
- if(allowed_to_proceed)
- if(ishuman(owner))
- playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/venom_claws.ogg', 75, FALSE)
- var/mob/living/carbon/human/H = owner
- H.melee_damage_lower = initial(H.melee_damage_lower)+15
- H.melee_damage_upper = initial(H.melee_damage_upper)+15
- H.tox_damage_plus = 15
- to_chat(owner, span_notice("You feel your claws filling with pure venom..."))
- spawn(12 SECONDS)
- H.tox_damage_plus = 0
- H.melee_damage_lower = initial(H.melee_damage_lower)
- H.melee_damage_upper = initial(H.melee_damage_upper)
- to_chat(owner, span_warning("Your claws are not poison anymore..."))
- else
- playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/venom_claws.ogg', 75, FALSE)
- var/mob/living/carbon/H = owner
- H.melee_damage_lower = initial(H.melee_damage_lower)+10
- H.melee_damage_upper = initial(H.melee_damage_upper)+10
- H.tox_damage_plus = 10
- to_chat(owner, span_notice("You feel your claws filling with pure venom..."))
- spawn(12 SECONDS)
- H.tox_damage_plus = 0
- H.melee_damage_lower = initial(H.melee_damage_lower)
- H.melee_damage_upper = initial(H.melee_damage_upper)
- to_chat(owner, span_warning("Your claws are not poison anymore..."))
-
-/datum/action/cooldown/power/gift/burning_scars
- name = "Burning Scars"
- desc = "Garou creates an aura of very hot air, which burns everyone around."
- button_icon_state = "burning_scars"
- rage_cost = 2
- gnosis_cost = 1
-
-/datum/action/cooldown/power/gift/burning_scars/Trigger()
- . = ..()
- if(allowed_to_proceed)
- owner.visible_message(span_danger("[owner.name] crackles with heat!"), span_danger("You crackle with heat, charging up your Gift!"))
- if(do_after(owner, 3 SECONDS))
- for(var/mob/living/L in orange(5, owner))
- L.adjust_fire_loss(40)
- for(var/turf/T in orange(4, get_turf(owner)))
- var/obj/effect/abstract/turf_fire/F = new(T)
- spawn(5)
- qdel(F)
-
-/datum/action/cooldown/power/gift/smooth_move
- name = "Smooth Move"
- desc = "Garou jumps forward, avoiding every damage for a moment."
- button_icon_state = "smooth_move"
- //rage_cost = 1 somewhat useless gift with MMB pounce
-
-/datum/action/cooldown/power/gift/smooth_move/Trigger()
- . = ..()
- if(allowed_to_proceed)
- var/turf/T = get_turf(get_step(get_step(get_step(owner, owner.dir), owner.dir), owner.dir))
- if(!T || T == owner.loc)
- return
- owner.visible_message(span_danger("[owner] charges!"))
- owner.setDir(get_dir(owner, T))
- var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(owner.loc,owner)
- animate(D, alpha = 0, color = "#FF0000", transform = matrix()*2, time = 1)
- spawn(3)
- owner.throw_at(T, get_dist(owner, T), 1, owner, 0)
-
-/datum/action/cooldown/power/gift/digital_feelings
- name = "Digital Feelings"
- desc = "Every technology creates an electrical strike, which hits garou's enemies."
- button_icon_state = "digital_feelings"
- rage_cost = 2
- gnosis_cost = 1
-
-/datum/action/cooldown/power/gift/digital_feelings/Trigger()
- . = ..()
- if(allowed_to_proceed)
- owner.visible_message(span_danger("[owner.name] crackles with static electricity!"), span_danger("You crackle with static electricity, charging up your Gift!"))
- if(do_after(owner, 3 SECONDS))
- playsound(owner, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5)
- tesla_zap(owner, 3, 30, ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN | ZAP_ALLOW_DUPLICATES)
- for(var/mob/living/L in orange(6, owner))
- L.electrocute_act(30, owner, siemens_coeff = 1, flags = NONE)
-
-/datum/action/cooldown/power/gift/elemental_improvement
- name = "Elemental Improvement"
- desc = "Garou flesh replaces itself with prothesis, making it less vulnerable to brute damage, but more for burn damage."
- button_icon_state = "elemental_improvement"
- rage_cost = 2
- gnosis_cost = 1
-
-/datum/action/cooldown/power/gift/elemental_improvement/Trigger()
- . = ..()
- if(allowed_to_proceed)
- animate(owner, color = "#6a839a", time = 10)
- if(ishuman(owner))
- playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/electro_cast.ogg', 75, FALSE)
- var/mob/living/carbon/human/H = owner
- H.physiology.armor.melee = 25
- H.physiology.armor.bullet = 45
- to_chat(owner, span_notice("You feel your skin replaced with the machine..."))
- spawn(20 SECONDS)
- H.physiology.armor.melee = initial(H.physiology.armor.melee)
- H.physiology.armor.bullet = initial(H.physiology.armor.bullet)
- to_chat(owner, span_warning("Your skin is natural again..."))
- owner.color = "#FFFFFF"
- else
- playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/electro_cast.ogg', 75, FALSE)
- var/mob/living/carbon/werewolf/H = owner
- H.werewolf_armor = 45
- to_chat(owner, span_notice("You feel your skin replaced with the machine..."))
- spawn(20 SECONDS)
- H.werewolf_armor = initial(H.werewolf_armor)
- to_chat(owner, span_warning("Your skin is natural again..."))
- owner.color = "#FFFFFF"
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 1ba31483be0f..24dc27e71fe0 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/silver_damage.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/silver_damage.dm
@@ -22,7 +22,7 @@
var/datum/splat/werewolf/shifter/shot_pup_splat = get_shifter_splat(target)
if(shot_pup_splat)
var/mob/living/carbon/human/shot_pup = target
- shot_pup.apply_status_effect(STATUS_EFFECT_SILVER_BULLLET_STACKS)
+ shot_pup.apply_status_effect(STATUS_EFFECT_SILVER_BULLET_STACKS)
if(!shot_pup_splat.is_breed_form())
// IDK. This is might TTRPG inaccurate RN because i think it should acctaully convert ALL the damage to agg not just add some agg to it.
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 6a084af0f920..40b7cee7e220 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
@@ -48,8 +48,7 @@
human_who_gained_species.add_offsets(type, w_add = mob_pixel_w, z_add = mob_pixel_z)
- for(var/key, value in form_bonus_stats)
- human_who_gained_species.st_add_stat_mod(key, value, type)
+ add_buffs(human_who_gained_species)
/datum/species/human/shifter/on_species_loss(mob/living/carbon/human/human, datum/species/new_species, pref_load)
. = ..()
@@ -58,9 +57,23 @@
human.remove_offsets(type)
+ clear_buffs(human)
+
+/datum/species/human/shifter/proc/add_buffs(mob/living/carbon/human/human)
+ for(var/key, value in form_bonus_stats)
+ if(!should_add_buff(human, key, value))
+ continue
+ human.st_add_stat_mod(key, value, type)
+
+/datum/species/human/shifter/proc/should_add_buff(mob/living/carbon/human/human, datum/st_stat/buff_type, amount)
+ return TRUE
+
+/datum/species/human/shifter/proc/clear_buffs(mob/living/carbon/human/human)
for(var/key, value in form_bonus_stats)
human.st_remove_stat_mod(key, type)
+/datum/species/human/shifter/proc/is_veil_breaching_form(mob/living/carbon/human/human)
+ return veil_breaching_form
/// Fetch the mobs fur color from their features.
/datum/species/human/shifter/proc/get_fur_color(mob/living/carbon/human/human)
@@ -137,20 +150,28 @@
fallback_icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/glabro.dmi'
veil_breaching_form = TRUE
+/datum/species/human/shifter/bestial/should_add_buff(mob/living/carbon/human/human, datum/st_stat/buff_type, amount)
+ . = ..()
+ // Raw string check instead of a define or type path is pretty bleak
+ if(HAS_TRAIT(human, TRAIT_FAIR_GLABRO) && (buff_type::subcategory == "Social") && (amount < 0))
+ return FALSE
+
+/datum/species/human/shifter/bestial/is_veil_breaching_form(mob/living/carbon/human/human)
+ if(HAS_TRAIT(human, TRAIT_FAIR_GLABRO))
+ return FALSE
+ return ..()
+
/datum/species/human/shifter/bestial/on_species_gain(mob/living/carbon/human/human_who_gained_species, datum/species/old_species, pref_load, regenerate_icons)
. = ..()
human_who_gained_species.update_mob_height()
human_who_gained_species.update_transform(1.25)
-
- human_who_gained_species.remove_overlay(BODY_ADJ_LAYER)
-
- var/fur_color = get_fur_color(human_who_gained_species)
- var/mob_icon = get_mob_icon(human_who_gained_species)
-
- human_who_gained_species.overlays_standing[BODY_ADJ_LAYER] = list(image(mob_icon, fur_color))
-
- human_who_gained_species.apply_overlay(BODY_ADJ_LAYER)
+ if(!HAS_TRAIT(human_who_gained_species, TRAIT_FAIR_GLABRO))
+ human_who_gained_species.remove_overlay(BODY_ADJ_LAYER)
+ var/fur_color = get_fur_color(human_who_gained_species)
+ var/mob_icon = get_mob_icon(human_who_gained_species)
+ human_who_gained_species.overlays_standing[BODY_ADJ_LAYER] = list(image(mob_icon, fur_color))
+ human_who_gained_species.apply_overlay(BODY_ADJ_LAYER)
/datum/species/human/shifter/bestial/on_species_loss(mob/living/carbon/human/human, datum/species/new_species, pref_load)
. = ..()
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 523dbddf83ca..ef55593288ba 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
@@ -140,7 +140,7 @@
COOLDOWN_START(src, passive_healing_cd, 1 TURNS)
var/datum/species/human/shifter/shifter_species = owner.dna.species
if(istype(shifter_species))
- if(shifter_species.veil_breaching_form && !shifter_species.causes_delerium)
+ if(shifter_species.is_veil_breaching_form(owner) && (!shifter_species.causes_delerium || HAS_TRAIT(owner, TRAIT_PIERCED_VEIL)))
SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION)
// Being used to represent meditating in your caern
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/transformation.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/transformation.dm
index 5988945b512a..966652e34c66 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/transformation.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/transformation.dm
@@ -19,7 +19,9 @@
to_chat(owner, span_warning("Your shifting is on cooldown for one turn."))
return
- if(ispath(get_breed_form_species(), form_to_transform))
+ if(HAS_TRAIT(owner, TRAIT_METAMORPH))
+ requires_roll = FALSE
+ else if(ispath(get_breed_form_species(), form_to_transform))
requires_roll = FALSE
else if(costs_rage)
if(adjust_rage(-1, TRUE))
@@ -38,7 +40,7 @@
transform_roll.difficulty = form_to_transform::shift_difficulty
switch(transform_roll.st_roll(owner, owner, PRIMAL_URGE_PLACEHOLDER))
if(ROLL_SUCCESS)
- EMPTY_BLOCK_GUARD
+ pass()
if(ROLL_FAILURE, ROLL_BOTCH)
return
@@ -60,6 +62,15 @@
addtimer(CALLBACK(src, PROC_REF(transform_finish), form_to_transform, time_to_transform), time_to_transform * 0.9)
/datum/splat/werewolf/shifter/proc/revert_to_breed_form()
+ if(HAS_TRAIT(owner, TRAIT_METAMORPH))
+ var/datum/storyteller_roll/metamorph/roll_datum = new()
+ if(roll_datum.st_roll(owner, bonus = PRIMAL_URGE_PLACEHOLDER) == ROLL_SUCCESS)
+ // First valid use of timeout discovered (we dont want to be able to hold it out)
+ var/choice = tgui_input_list(owner, "Revert to your choosen form", "Metamorph", transformation_list, get_breed_form_species(), 1 TURNS)
+ if(choice in transformation_list)
+ transform_fera(choice, force = TRUE)
+ return
+
transform_fera(get_breed_form_species(), force = TRUE)
/datum/splat/werewolf/shifter/proc/transform_finish(form_to_transform, time_taken = DOGGY_ANIMATION_TIME)
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 f434d04a3478..3c364561c64c 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
@@ -7,89 +7,95 @@
name = TRIBE_GALESTALKERS
desc = "Tireless trackers and peerless hunters, the galestalkers carry the namesake of the wind that crosses the tundra."
// gifts_provided = list(
- // /datum/action/gift/stoic_pose = 1,
- // /datum/action/gift/freezing_wind = 2,
- // /datum/action/gift/bloody_feast = 3
+ // /datum/action/cooldown/power/gift/stoic_pose,
+ // /datum/action/cooldown/power/gift/freezing_wind,
+ // /datum/action/cooldown/power/gift/bloody_feast
// )
subsplat_keys = /obj/item/vamp/keys/nps
/datum/subsplat/werewolf/tribe/garou/ghostcouncil
name = TRIBE_UKTENA
desc = "Seekers of mystery and highly secretive, the Uktena is one of the most misunderstood tribes. Their ranks include guides, academics and the religious."
- // gifts_provided = list(
- // /datum/action/gift/shroud = 1,
- // /datum/action/gift/coils_of_the_serpent = 2,
- // /datum/action/gift/banish_totem = 3
- // )
+ gifts_provided = list(
+ /datum/action/cooldown/power/gift/spirit_speech,
+ // /datum/action/cooldown/power/gift/shroud,
+ // /datum/action/cooldown/power/gift/coils_of_the_serpent,
+ // /datum/action/cooldown/power/gift/banish_totem
+ )
subsplat_keys = /obj/item/vamp/keys/nps
/datum/subsplat/werewolf/tribe/garou/hartwardens
name = TRIBE_FIANNA
desc = "Growing, creating, cultivating and maintaining the most natural of Gaia's creations, the Wardens are some of the closest to nature. Wherever they are, they coax Gaia's blessing out of whatever they can."
- // gifts_provided = list(
- // /datum/action/gift/stoic_pose = 1,
- // /datum/action/gift/freezing_wind = 2,
- // /datum/action/gift/bloody_feast = 3
- // )
+ gifts_provided = list(
+ /datum/action/cooldown/power/gift/faerie_light,
+ // /datum/action/cooldown/power/gift/stoic_pose,
+ // /datum/action/cooldown/power/gift/freezing_wind,
+ // /datum/action/cooldown/power/gift/bloody_feast
+ )
subsplat_keys = /obj/item/vamp/keys/nps
/datum/subsplat/werewolf/tribe/garou/glasswalkers
name = TRIBE_GLASS_WALKERS
desc = "The closest to the Weaver, they find themselves deeply entrenched in modern human society, religion, technology and cities. Every new invention and every new discovery is one that aids the Glass Walkers, instead of impeding them."
// gifts_provided = list(
- // /datum/action/gift/smooth_move = 1,
- // /datum/action/gift/digital_feelings = 2,
- // /datum/action/gift/elemental_improvement = 3
+ // /datum/action/cooldown/power/gift/smooth_move,
+ // /datum/action/cooldown/power/gift/digital_feelings,
+ // /datum/action/cooldown/power/gift/elemental_improvement
// )
subsplat_keys = /obj/item/vamp/keys/techstore
/datum/subsplat/werewolf/tribe/garou/bonegnawers
name = TRIBE_BONE_GNAWERS
desc = "Survivors and scavengers, often destitute and homeless. The Gnawers are seen as mongrels who live off scraps, but they know better. They're the true survivors, patiently waiting for their moment to strike against overconfident foes."
- // gifts_provided = list(
- // /datum/action/gift/guise_of_the_hound = 1,
- // /datum/action/gift/infest = 2,
- // /datum/action/gift/gift_of_the_termite = 3
- // )
+ gifts_provided = list(
+ /datum/action/cooldown/power/gift/desperate_strength,
+ // /datum/action/cooldown/power/gift/guise_of_the_hound,
+ // /datum/action/cooldown/power/gift/infest,
+ // /datum/action/cooldown/power/gift/gift_of_the_termite
+ )
subsplat_keys = /obj/item/vamp/keys/children_of_gaia
/datum/subsplat/werewolf/tribe/garou/childrenofgaia
name = TRIBE_CHILDREN_OF_GAIA
desc = "Peacekeepers, negotiators, treaty-makers and philosophers. The Children of Gaia strive as hard as they can create an understanding and unity between the disparate tribes that will allow them to form a united front against their foes."
- // gifts_provided = list(
- // /datum/action/gift/stoic_pose = 1,
- // /datum/action/gift/freezing_wind = 2,
- // /datum/action/gift/bloody_feast = 3
- // )
+ gifts_provided = list(
+ /datum/action/cooldown/power/gift/mothers_touch,
+ /datum/action/cooldown/power/gift/resist_pain,
+ // /datum/action/cooldown/power/gift/stoic_pose,
+ // /datum/action/cooldown/power/gift/freezing_wind,
+ // /datum/action/cooldown/power/gift/bloody_feast
+ )
subsplat_keys = /obj/item/vamp/keys/children_of_gaia
/datum/subsplat/werewolf/tribe/garou/getoffenris
name = TRIBE_GET_OF_FENRIS
desc = "Warriors, compassionate and fierce. They view themselves are Gaia's strongest heroes, but the rest of the tribes view them with caution, their violence more famous than their courage."
- // gifts_provided = list(
- // /datum/action/gift/stoic_pose = 1,
- // /datum/action/gift/freezing_wind = 2,
- // /datum/action/gift/bloody_feast = 3
- // )
+ gifts_provided = list(
+ /datum/action/cooldown/power/gift/visage_of_fenris,
+ // /datum/action/cooldown/power/gift/stoic_pose,
+ // /datum/action/cooldown/power/gift/freezing_wind,
+ // /datum/action/cooldown/power/gift/bloody_feast
+ )
subsplat_keys = /obj/item/vamp/keys/nps
/datum/subsplat/werewolf/tribe/garou/blackfuries
name = TRIBE_BLACK_FURIES
desc = "An all-female tribe, and the matriarchs of the Garou. The Black Furies are known fondly for their honor, wisdom, pride and impressive prowess in battle."
- // gifts_provided = list(
- // /datum/action/gift/stoic_pose = 1,
- // /datum/action/gift/freezing_wind = 2,
- // /datum/action/gift/bloody_feast = 3
- // )
+ gifts_provided = list(
+ /datum/action/cooldown/power/gift/breath_of_the_wyld,
+ // /datum/action/cooldown/power/gift/freezing_wind,
+ // /datum/action/cooldown/power/gift/bloody_feast
+ )
subsplat_keys = /obj/item/vamp/keys/nps
/datum/subsplat/werewolf/tribe/garou/silentstriders
name = TRIBE_SILENT_STRIDERS
desc = "Highly spiritual nomads, the Silent Striders have headed deeper and longer into the depths of the Umbra than any other tribe."
// gifts_provided = list(
- // /datum/action/gift/stoic_pose = 1,
- // /datum/action/gift/freezing_wind = 2,
- // /datum/action/gift/bloody_feast = 3
+ // /datum/action/cooldown/power/gift/stoic_pose,
+ // /datum/action/cooldown/power/gift/freezing_wind,
+ // /datum/action/cooldown/power/gift/bloody_feast
// )
subsplat_keys = /obj/item/vamp/keys/nps
@@ -97,9 +103,9 @@
name = TRIBE_SHADOW_LORDS
desc = "The closest one could consider a Garou to being a 'politician'. They manipulate the tribes, and their enemies, and rely on cunning and wits more than physical strength. Not to say there aren't adept warriors in their ranks, but the tribe tends towards brains than brawn."
// gifts_provided = list(
- // /datum/action/gift/stoic_pose = 1,
- // /datum/action/gift/freezing_wind = 2,
- // /datum/action/gift/bloody_feast = 3
+ // /datum/action/cooldown/power/gift/stoic_pose,
+ // /datum/action/cooldown/power/gift/freezing_wind,
+ // /datum/action/cooldown/power/gift/bloody_feast
// )
subsplat_keys = /obj/item/vamp/keys/techstore
@@ -107,18 +113,18 @@
name = TRIBE_RED_TALONS
desc = "Exclusively consisting of lupus, the Red Talons shun humanity and think of them as a blight on Gaia."
// gifts_provided = list(
- // /datum/action/gift/stoic_pose = 1,
- // /datum/action/gift/freezing_wind = 2,
- // /datum/action/gift/bloody_feast = 3
+ // /datum/action/cooldown/power/gift/stoic_pose,
+ // /datum/action/cooldown/power/gift/freezing_wind,
+ // /datum/action/cooldown/power/gift/bloody_feast
// )
/datum/subsplat/werewolf/tribe/garou/silverfangs
name = TRIBE_SILVER_FANGS
desc = "Commonly known as the 'Alphas' of the Garou Nation, their ranks consist of traditional rulers and wartime leaders. Known for being honorable and having courage, odd mental quirks have begun plaguing their young members, and the tribe is beginning to suffer from diseases of the spirit and mind."
// gifts_provided = list(
- // /datum/action/gift/stoic_pose = 1,
- // /datum/action/gift/freezing_wind = 2,
- // /datum/action/gift/bloody_feast = 3
+ // /datum/action/cooldown/power/gift/stoic_pose,
+ // /datum/action/cooldown/power/gift/freezing_wind,
+ // /datum/action/cooldown/power/gift/bloody_feast
// )
subsplat_keys = /obj/item/vamp/keys/nps
@@ -126,9 +132,9 @@
name = TRIBE_STARGAZERS
desc = "The calmest of the Garou, they are well known for their introversion. They are the smallest of the remaining tribes, many of their kind wiped out by the Wyrm."
// gifts_provided = list(
- // /datum/action/gift/stoic_pose = 1,
- // /datum/action/gift/freezing_wind = 2,
- // /datum/action/gift/bloody_feast = 3
+ // /datum/action/cooldown/power/gift/stoic_pose,
+ // /datum/action/cooldown/power/gift/freezing_wind,
+ // /datum/action/cooldown/power/gift/bloody_feast
// )
subsplat_keys = /obj/item/vamp/keys/nps
@@ -136,19 +142,19 @@
name = TRIBE_BLACK_SPIRAL_DANCERS
desc = "The lost tribe. The dreadwolves. Those who dance lockstep with the Wyrm. They who have entered the labyrinth and come back, changed.\n{THIS IS AN ADVANCED TRIBE AND NOT RECOMMENDED FOR BEGINNERS. LORE KNOWLEDGE IS REQUIRED TO PLAY THIS TRIBE}"
// gifts_provided = list(
- // /datum/action/gift/stinky_fur = 1,
- // /datum/action/gift/venom_claws = 2,
- // /datum/action/gift/burning_scars = 3
+ // /datum/action/cooldown/power/gift/stinky_fur,
+ // /datum/action/cooldown/power/gift/venom_claws,
+ // /datum/action/cooldown/power/gift/burning_scars
// )
/datum/subsplat/werewolf/tribe/garou/ronin
name = TRIBE_RONIN
desc = "Garou who, for one reason or another, find themselves as outcasts of the Nation."
// gifts_provided = list(
- // /datum/action/gift/guise_of_the_hound = 1,
- // /datum/action/gift/stoic_pose = 2,
- // /datum/action/gift/smooth_move = 3,
- // /datum/action/gift/shroud = 4
+ // /datum/action/cooldown/power/gift/guise_of_the_hound,
+ // /datum/action/cooldown/power/gift/stoic_pose,
+ // /datum/action/cooldown/power/gift/smooth_move,
+ // /datum/action/cooldown/power/gift/shroud
// )
/* // DARKPACK TODO - CORAX
@@ -156,9 +162,9 @@
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
+ /datum/action/cooldown/power/gift/eye_drink,
+ /datum/action/cooldown/power/gift/smooth_move,
+ /datum/action/cooldown/power/gift/suns_guard
)
tribe_trait = TRAIT_CORAX
*/
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/icons/gifts/tribes/bone_gnawers.dmi b/modular_darkpack/modules/werewolf_the_apocalypse/icons/gifts/tribes/bone_gnawers.dmi
new file mode 100644
index 000000000000..a595e1059493
Binary files /dev/null and b/modular_darkpack/modules/werewolf_the_apocalypse/icons/gifts/tribes/bone_gnawers.dmi differ
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/desperate_strength_activate.ogg b/modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/desperate_strength_activate.ogg
new file mode 100644
index 000000000000..e57c914379a9
Binary files /dev/null and b/modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/desperate_strength_activate.ogg differ
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/faerie_light_activate.ogg b/modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/faerie_light_activate.ogg
new file mode 100644
index 000000000000..8abac741114e
Binary files /dev/null and b/modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/faerie_light_activate.ogg differ
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/visage_of_fenris.ogg b/modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/visage_of_fenris.ogg
new file mode 100644
index 000000000000..8518d1511141
Binary files /dev/null and b/modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/visage_of_fenris.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index bed052847136..5a2db18d0d62 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -7314,12 +7314,22 @@
#include "modular_darkpack\modules\matrix\code\job.dm"
#include "modular_darkpack\modules\matrix\code\matrix.dm"
#include "modular_darkpack\modules\merits_flaws\code\_darkpack_quirk.dm"
-#include "modular_darkpack\modules\merits_flaws\code\giovanni_sanguine_incongruity.dm"
-#include "modular_darkpack\modules\merits_flaws\code\horrific_appearance_quirk.dm"
-#include "modular_darkpack\modules\merits_flaws\code\illegal_identity.dm"
-#include "modular_darkpack\modules\merits_flaws\code\monstrous_quirk.dm"
-#include "modular_darkpack\modules\merits_flaws\code\organovore.dm"
-#include "modular_darkpack\modules\merits_flaws\code\permanent_fangs.dm"
+#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\animal_musk.dm"
+#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\derangement.dm"
+#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\horrific_appearance_quirk.dm"
+#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\monstrous_quirk.dm"
+#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\organovore.dm"
+#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\permanent_fangs.dm"
+#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\pierced_veil.dm"
+#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\weak_willed.dm"
+#include "modular_darkpack\modules\merits_flaws\code\neutral_quirks\illegal_identity.dm"
+#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\beserk.dm"
+#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\fair_glabro.dm"
+#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\giovanni_sanguine_incongruity.dm"
+#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\metamorph.dm"
+#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\pale_aura.dm"
+#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\time_sense.dm"
+#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\untamable.dm"
#include "modular_darkpack\modules\mob_spawners\code\citizen.dm"
#include "modular_darkpack\modules\movie_theatre\code\areas.dm"
#include "modular_darkpack\modules\movie_theatre\code\fluff.dm"
@@ -7492,7 +7502,6 @@
#include "modular_darkpack\modules\powers\code\discipline\vicissitude\surgeries\sex_change.dm"
#include "modular_darkpack\modules\powers\code\discipline\vicissitude\surgeries\skin_colour_change.dm"
#include "modular_darkpack\modules\preferences\height_preference.dm"
-#include "modular_darkpack\modules\quirks\code\negative_quirks\derangement.dm"
#include "modular_darkpack\modules\radios\code\admin_verb.dm"
#include "modular_darkpack\modules\radios\code\radio.dm"
#include "modular_darkpack\modules\radios\code\transceiver.dm"
@@ -7732,6 +7741,11 @@
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\auspices\ragabash.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\auspices\theurge.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\innate\howling.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\black_furies.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\black_spiral_dancer.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\bone_gnawers.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\fianna.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\get_of_fenris.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\auspice.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\breed.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\fur.dm"