From 12c8a34bd68c391c03103e2a4b16e9f877dedde0 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Thu, 19 Feb 2026 22:50:52 -0600 Subject: [PATCH 01/16] ahroun ones --- .../~darkpack/traits/declarations.dm | 6 +- code/__DEFINES/~darkpack/traits/sources.dm | 2 + code/_globalvars/traits/_traits.dm | 3 +- .../modules/splats/code/powers/_power.dm | 20 +++++ .../mob_affecting_adjustments/mob_procs.dm | 9 ++ .../code/gifts/_gift.dm | 8 +- .../code/gifts/auspices/ahroun.dm | 81 +++++++++++++++++ .../code/gifts/auspices/galliard.dm | 3 + .../code/gifts/auspices/philodox.dm | 1 + .../code/gifts/auspices/ragabash.dm | 2 + .../code/gifts/auspices/theurge.dm | 1 + .../code/gifts/innate/howling.dm | 6 +- .../werewolf_the_apocalypse/code/old/gifts.dm | 89 ------------------- .../code/subsplats/auspices/garou.dm | 6 +- 14 files changed, 138 insertions(+), 99 deletions(-) diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm index 1d0d3424b7f0..c9a439e96fce 100644 --- a/code/__DEFINES/~darkpack/traits/declarations.dm +++ b/code/__DEFINES/~darkpack/traits/declarations.dm @@ -130,10 +130,12 @@ 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" -// Massivly boosts the range of your howl emote. -#define TRAIT_LOUD_HOWLER "loud_howler" /// 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" // BELOW ARE ALL MERITS/FLAWS #define TRAIT_ILLEGAL_IDENTITY "illegal_identity" // GOVERNMENT diff --git a/code/__DEFINES/~darkpack/traits/sources.dm b/code/__DEFINES/~darkpack/traits/sources.dm index 6402f89925de..fbe972ee6d3a 100644 --- a/code/__DEFINES/~darkpack/traits/sources.dm +++ b/code/__DEFINES/~darkpack/traits/sources.dm @@ -4,6 +4,8 @@ #define CLAN_TRAIT "clan" #define DISCIPLINE_TRAIT "discipline" +#define GIFT_TRAIT "gift" + #define STAKE_TRAIT "stake" #define DAMAGE_TRAIT "damage" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 04f7eed6098b..e4d5ffaddf8d 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -731,9 +731,10 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_ILLEGAL_IDENTITY" = TRAIT_ILLEGAL_IDENTITY, // DARKPACK EDIT ADD - GOVERMENT "TRAIT_NO_LYING_ANGLE" = TRAIT_NO_LYING_ANGLE, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_TRANSFORM_UPDATES_ICON" = TRAIT_TRANSFORM_UPDATES_ICON, // DARKPACK EDIT ADD - WEREWOLF - "TRAIT_LOUD_HOWLER" = TRAIT_LOUD_HOWLER, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_FERA_FUR" = TRAIT_FERA_FUR, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_SMALL_HANDS" = TRAIT_SMALL_HANDS, // DARKPACK EDIT ADD - WEREWOLF + "TRAIT_LOUD_HOWLER" = TRAIT_LOUD_HOWLER, // DARKPACK EDIT ADD - WEREWOLF + "TRAIT_RAZOR_CLAWS" = TRAIT_RAZOR_CLAWS, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_NECROPOLIS_WORSHIP" = TRAIT_NECROPOLIS_WORSHIP, ), /mob/living/carbon = list( diff --git a/modular_darkpack/modules/splats/code/powers/_power.dm b/modular_darkpack/modules/splats/code/powers/_power.dm index 10480f589040..c9f5698cbe8d 100644 --- a/modular_darkpack/modules/splats/code/powers/_power.dm +++ b/modular_darkpack/modules/splats/code/powers/_power.dm @@ -6,3 +6,23 @@ // Not used presently but good future proofing incase behavoirs care. /// Means that this action is not a real power, but some sort of innate ability we represent as a power/disc/gift mechnaicly. var/innate_ability = FALSE + + /// How much temporary willpower is required to use this ability + var/willpower_req = 0 + +/datum/action/cooldown/power/IsAvailable(feedback) + . = ..() + + if(willpower_req && isliving(owner)) + var/mob/living/living_owner = owner + if(willpower_req > living_owner.st_get_stat(STAT_TEMPORARY_WILLPOWER)) + if(feedback) + to_chat(owner, span_warning("You don't have enough willpower to do that!")) + return FALSE + +/datum/action/cooldown/power/Activate(atom/target) + . = ..() + + if(willpower_req && isliving(owner)) + var/mob/living/living_owner = owner + living_owner.st_change_stat(STAT_TEMPORARY_WILLPOWER, -willpower_req) diff --git a/modular_darkpack/modules/storyteller_stats/code/mob_affecting_adjustments/mob_procs.dm b/modular_darkpack/modules/storyteller_stats/code/mob_affecting_adjustments/mob_procs.dm index 4bf56f68f8b8..4c818b3164af 100644 --- a/modular_darkpack/modules/storyteller_stats/code/mob_affecting_adjustments/mob_procs.dm +++ b/modular_darkpack/modules/storyteller_stats/code/mob_affecting_adjustments/mob_procs.dm @@ -16,6 +16,15 @@ var/datum/st_stat/given_stat = storyteller_stats["[stat_path]"] return given_stat?.set_score(amount) +/// Changes a specific mob's stat from its stats list by the given amount. +/mob/living/proc/st_change_stat(stat_path, amount) + var/datum/st_stat/given_stat = storyteller_stats["[stat_path]"] + if(amount > 0) + return given_stat?.increase_score(amount) + else + return given_stat?.decrease_score(amount) + + /mob/living/proc/st_add_stat_mod(stat_path, amount, source) var/datum/st_stat/given_stat = storyteller_stats["[stat_path]"] return given_stat?.add_stat_mod(amount, source) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm index 8dfddb0a207e..de1c95c8504f 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm @@ -20,6 +20,10 @@ return FALSE var/datum/splat/werewolf/casting_splat = iswerewolfsplat(owner) + if(!casting_splat) + if(feedback) + owner.balloon_alert(owner, "not a gift user!") + return FALSE if(get_rage_cost()) if(casting_splat.rage < get_rage_cost()) @@ -37,15 +41,13 @@ /datum/action/cooldown/power/gift/Activate(atom/target) . = ..() - if(!ishuman(owner)) - return FALSE var/datum/splat/werewolf/casting_splat = iswerewolfsplat(owner) - if(get_rage_cost()) casting_splat.adjust_rage(-get_rage_cost(), owner, FALSE) if(get_gnosis_cost()) casting_splat.adjust_gnosis(-get_gnosis_cost(), owner, FALSE) + to_chat(owner, span_notice("You activate the [name]...")) /datum/action/cooldown/power/gift/proc/get_rage_cost() diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm index 5422173bfc98..9c07ea06c330 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm @@ -3,6 +3,7 @@ desc = "This Gift allows the Garou to send her foe sprawling with but a touch." button_icon_state = "falling_touch" click_to_activate = TRUE + rank = 1 /datum/action/cooldown/power/gift/falling_touch/set_click_ability(mob/on_who) . = ..() @@ -43,3 +44,83 @@ StartCooldown() return TRUE + + +/datum/action/cooldown/power/gift/inspiration + name = "Inspiration" + desc = "The Garou with this Gift lends new resolve and righteous anger to his brethren." + button_icon_state = "inspiration" + gnosis_req = 1 + rank = 1 + +/datum/action/cooldown/power/gift/inspiration/Activate(atom/target) + . = ..() + playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/inspiration.ogg', 75, FALSE) + owner.emote("scream") + for(var/mob/living/nearby_guy in oviewers(7, owner)) + nearby_guy.apply_status_effect(/datum/status_effect/inspiration) + +/datum/status_effect/inspiration + id = "inspiration" + duration = 1 SCENES + status_type = STATUS_EFFECT_REPLACE + alert_type = /atom/movable/screen/alert/status_effect/inspiration + +/datum/status_effect/inspiration/on_apply() + . = ..() + if(isliving(owner)) + var/mob/living/living_owner = owner + living_owner.st_change_stat(STAT_TEMPORARY_WILLPOWER, 1) + +/datum/status_effect/inspiration/on_remove() + if(isliving(owner)) + var/mob/living/living_owner = owner + // Ugh. We really dont have a way to represent or register the spending of a temporary temp willpoint.... + living_owner.st_change_stat(STAT_TEMPORARY_WILLPOWER, -1) + return ..() + +/atom/movable/screen/alert/status_effect/inspiration + name = "Inspiration" + desc = "You have an extra temporary willpower for one scene!" + icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi' + icon_state = "inspiration" + + +/datum/action/cooldown/power/gift/razor_claws + name = "Razor Claws" + desc = "By raking his claws over stone, steel, or another hard surface, the Ahroun hones them to razor sharpness." + button_icon_state = "razor_claws" + rank = 1 + rage_req = 1 + +/datum/action/cooldown/power/gift/razor_claws/Activate(atom/target) + to_chat(owner, span_notice("You feel your claws sharpening...")) + playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/razor_claws.ogg', 75, FALSE) + if(!do_after(owner, 1 TURNS)) + return + var/mob/living/living_owner = astype(owner) + living_owner?.apply_status_effect(/datum/status_effect/razor_claws) + . = ..() + +// DARKPACK TODO - Requires https://github.com/DarkPack13/SecondCity/pull/680 for its stat handling. +/datum/status_effect/razor_claws + id = "razor claws" + duration = 1 SCENES + status_type = STATUS_EFFECT_REPLACE + alert_type = /atom/movable/screen/alert/status_effect/razor_claws + +/datum/status_effect/razor_claws/on_apply() + . = ..() + playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/razor_claws.ogg', 75, FALSE) + ADD_TRAIT(owner, TRAIT_RAZOR_CLAWS, GIFT_TRAIT) + +/datum/status_effect/razor_claws/on_remove() + REMOVE_TRAIT(owner, TRAIT_RAZOR_CLAWS, GIFT_TRAIT) + to_chat(owner, span_warning("Your claws are not sharp anymore...")) + return ..() + +/atom/movable/screen/alert/razor_claws/inspiration + name = "Razor Claws" + // desc = "You have an extra temporary willpower for one scene!" + icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi' + icon_state = "razor_claws" diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/galliard.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/galliard.dm index 7774c0b3e5e7..a571d50fe670 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/galliard.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/galliard.dm @@ -3,6 +3,7 @@ name = "Beast Speech" desc = "The werewolf with this Gift may communicate with any animals from fish to mammals." button_icon_state = "beast_speech" + rank = 1 rage_req = 1 //gnosis_req = 1 @@ -31,6 +32,7 @@ desc = "The werewolf may send her howl far beyond the normal range of hearing and imbue it with great emotion, stirring the hearts of fellow Garou and chilling the bones of all others." button_icon_state = "call_of_the_wyld" rage_req = 1 + rank = 1 /datum/action/cooldown/power/gift/call_of_the_wyld/Activate(atom/target) . = ..() @@ -54,6 +56,7 @@ name = "Mindspeak" desc = "By invoking the power of waking dreams, the Garou can place any chosen characters into silent communion." button_icon_state = "mindspeak" + rank = 1 // gnosis_req = 1 diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm index ceff6a58f470..2c65bb63ed9b 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm @@ -3,6 +3,7 @@ desc = "This Gift allows the Garou to determine the true nature of a person." button_icon_state = "scent_of_the_true_form" click_to_activate = TRUE + rank = 1 var/static/list/wyld_descriptors = list( "ozone", "euphoria", diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm index 5455734ebfa7..01483b32243f 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm @@ -20,6 +20,7 @@ name = "Infectious Laughter" desc = "When the Ragabash laughs, those around her are compelled to follow along, forgetting their grievances. Uses the last message you spoke for the ability" button_icon_state = "infectious_laughter" + rank = 1 // I dont acctually see anything in the book that is causes rage. // rage_req = 1 var/last_spoken_message @@ -83,6 +84,7 @@ name = "Open Seal" desc = "With this Gift, the Garou can open nearly any sort of closed or locked physical device." button_icon_state = "open_seal" + rank = 1 // gnosis_req = 1 /datum/action/cooldown/power/gift/open_seal/Activate(atom/target) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm index eb26fdefe41c..7ad92dfb1306 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm @@ -14,6 +14,7 @@ the scar is received and an extra Gnosis point is spent. desc = "The Garou is able to heal the wounds of any living creature, aggravated or otherwise, simply by laying hands over the afflicted area." button_icon_state = "mothers_touch" click_to_activate = TRUE + rank = 1 //rage_req = 1 gnosis_req = 1 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..48d5825028fe 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 @@ -48,7 +48,7 @@ if(istype(get_area(owner), /area/vtm/interior/penumbra)) if(feedback) to_chat(owner, span_warning("Your howl echoes and dissipates into the Umbra, it's sound blanketed by the spiritual energy of the Velvet Shadow.")) - return + return FALSE /datum/action/cooldown/power/gift/howling/Activate(atom/target) . = ..() @@ -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_HOWLER, GIFT_TRAIT) living_mob.emote("howl") - REMOVE_TRAIT(living_mob, TRAIT_LOUD_HOWLER, type) + REMOVE_TRAIT(living_mob, TRAIT_LOUD_HOWLER, GIFT_TRAIT) var/howl_details var/final_message diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/old/gifts.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/old/gifts.dm index 86fec51a85d5..2f7ac90a7e4f 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/old/gifts.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/old/gifts.dm @@ -1,92 +1,3 @@ -/datum/action/cooldown/power/gift/falling_touch - name = "Falling Touch" - desc = "This Gift allows the Garou to send her foe sprawling with but a touch." - button_icon_state = "falling_touch" - rage_req = 1 - -/datum/action/cooldown/power/gift/falling_touch/Activate(atom/target) - . = ..() - if(allowed_to_proceed) - var/mob/living/carbon/H = owner - playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/falling_touch.ogg', 75, FALSE) - H.put_in_active_hand(new /obj/item/melee/touch_attack/werewolf(H)) - -/datum/action/cooldown/power/gift/inspiration - name = "Inspiration" - desc = "The Garou with this Gift lends new resolve and righteous anger to his brethren." - button_icon_state = "inspiration" - rage_req = 1 - -/mob/living/carbon/Life() - . = ..() - if(inspired) - if(stat != DEAD) - adjust_brute_loss(-10, TRUE) - var/obj/effect/celerity/C = new(get_turf(src)) - C.appearance = appearance - C.dir = dir - var/matrix/ntransform = matrix(C.transform) - ntransform.Scale(2, 2) - animate(C, transform = ntransform, alpha = 0, time = 3) - -/mob/living/carbon/proc/inspired() - inspired = TRUE - to_chat(src, span_notice("You feel inspired...")) - spawn(150) - to_chat(src, span_warning("You no longer feel inspired...")) - inspired = FALSE - -/datum/action/cooldown/power/gift/inspiration/Activate(atom/target) - . = ..() - if(allowed_to_proceed) - var/mob/living/carbon/H = owner - playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/inspiration.ogg', 75, FALSE) - H.emote("scream") - for(var/mob/living/carbon/C in range(5, owner)) - if(iswerewolf(C) || isgarou(C)) - if(C.auspice.tribe == H.auspice.tribe) - C.inspired() - -/datum/action/cooldown/power/gift/razor_claws - name = "Razor Claws" - desc = "By raking his claws over stone, steel, or another hard surface, the Ahroun hones them to razor sharpness." - button_icon_state = "razor_claws" - rage_req = 1 - -/datum/action/cooldown/power/gift/razor_claws/Activate(atom/target) - . = ..() - if(allowed_to_proceed) - if(ishuman(owner)) - playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/razor_claws.ogg', 75, FALSE) - var/mob/living/carbon/human/H = owner - H.dna.species.attack_verb = "slash" - H.dna.species.attack_sound = 'sound/items/weapons/slash.ogg' - H.dna.species.miss_sound = 'sound/items/weapons/slashmiss.ogg' - H.dna.species.punchdamagelow = 20 - H.dna.species.punchdamagehigh = 20 - H.agg_damage_plus = 5 - to_chat(owner, span_notice("You feel your claws sharpening...")) - spawn(150) - H.dna.species.attack_verb = initial(H.dna.species.attack_verb) - H.dna.species.attack_sound = initial(H.dna.species.attack_sound) - H.dna.species.miss_sound = initial(H.dna.species.miss_sound) - H.dna.species.punchdamagelow = initial(H.dna.species.punchdamagelow) - H.dna.species.punchdamagehigh = initial(H.dna.species.punchdamagehigh) - H.agg_damage_plus = 0 - to_chat(owner, span_warning("Your claws are not sharp anymore...")) - else - playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/razor_claws.ogg', 75, FALSE) - var/mob/living/carbon/H = owner - H.melee_damage_lower = H.melee_damage_lower+15 - H.melee_damage_upper = H.melee_damage_upper+15 - H.agg_damage_plus = 3 - to_chat(owner, span_notice("You feel your claws sharpening...")) - spawn(150) - H.melee_damage_lower = initial(H.melee_damage_lower) - H.melee_damage_upper = initial(H.melee_damage_upper) - H.agg_damage_plus = 0 - to_chat(owner, span_warning("Your claws are not sharp anymore...")) - /datum/action/cooldown/power/gift/resist_pain name = "Resist Pain" desc = "Through force of will, the Philodox is able to ignore the pain of his wounds and continue acting normally." diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm index c045c1e49215..e458b00932d7 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm @@ -7,7 +7,11 @@ name = AUSPICE_AHROUN desc = "The Ahroun is the archetype of the werewolf as murderous beast, though they range from unapologetic berserkers to hardened veterans tempering their Rage with discipline. Their high levels of Rage put them on the edge at all times - the Full Moon's blessing is a hair trigger, among other things. Those closer to the waxing moon tend to exult in the glory of the war, while those closer to the waning moon are more viciously pragmatic, ruthless in their bloodthirst. Every Ahroun is a dangerous individual to be around, but when the forces of the Wyrm attack, their packmates are glad to have a Full Moon warrior at the front of the charge." start_rage = 5 - gifts_provided= list(/datum/action/cooldown/power/gift/falling_touch)//, /datum/action/cooldown/power/gift/inspiration, /datum/action/cooldown/power/gift/razor_claws) + gifts_provided= list( + /datum/action/cooldown/power/gift/falling_touch, + /datum/action/cooldown/power/gift/inspiration, + /datum/action/cooldown/power/gift/razor_claws, + ) moons_born_under = list(MOON_FULL) /datum/subsplat/werewolf/auspice/garou/ahroun/rank_requirments(list/renown) From eca2b46ee8dcae3f1119761e2a8c6a4d4a465360 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Thu, 19 Feb 2026 23:15:47 -0600 Subject: [PATCH 02/16] ye --- .../werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm index 9c07ea06c330..14e477f26ccd 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm @@ -119,8 +119,8 @@ to_chat(owner, span_warning("Your claws are not sharp anymore...")) return ..() -/atom/movable/screen/alert/razor_claws/inspiration +/atom/movable/screen/alert/status_effect/razor_claws name = "Razor Claws" - // desc = "You have an extra temporary willpower for one scene!" + desc = "Your claws do extra damage." icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi' icon_state = "razor_claws" From 0f1f4e31c9e4c5b8993dfde91ceaf1ffcefd3038 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 20 Feb 2026 01:24:56 -0600 Subject: [PATCH 03/16] ragabash stuf --- modular_darkpack/modules/areas/code/__vtm.dm | 4 ++ .../areas/code/interiors/endron_facility.dm | 2 + .../modules/areas/code/interiors/garou.dm | 1 + .../modules/areas/code/outsides/forest.dm | 1 + .../modules/areas/code/random_gen.dm | 2 + .../modules/doors/code/vampdoor.dm | 12 ++++ .../werewolf_the_apocalypse/code/gauntlet.dm | 6 ++ .../code/gifts/_gift.dm | 6 ++ .../code/gifts/auspices/ahroun.dm | 14 ++--- .../code/gifts/auspices/ragabash.dm | 57 +++++++++++++------ .../code/splats/fera_splat.dm | 14 +++-- .../code/subsplats/auspices/garou.dm | 4 +- tgstation.dme | 1 + 13 files changed, 91 insertions(+), 33 deletions(-) create mode 100644 modular_darkpack/modules/werewolf_the_apocalypse/code/gauntlet.dm diff --git a/modular_darkpack/modules/areas/code/__vtm.dm b/modular_darkpack/modules/areas/code/__vtm.dm index 58b3d2d86363..71afaff63047 100644 --- a/modular_darkpack/modules/areas/code/__vtm.dm +++ b/modular_darkpack/modules/areas/code/__vtm.dm @@ -7,6 +7,10 @@ outdoors = TRUE var/zone_type = ZONE_MASQUERADE + // 7 is an average city street. + /// The rating of the gauntlet, the Gauntlet is strongest near certain types of environments + var/gauntlet_rating = 7 // WEREWOLF + /area/vtm/powered(chan) if (!requires_power) return TRUE diff --git a/modular_darkpack/modules/areas/code/interiors/endron_facility.dm b/modular_darkpack/modules/areas/code/interiors/endron_facility.dm index 17be97f4b145..b5861760c854 100644 --- a/modular_darkpack/modules/areas/code/interiors/endron_facility.dm +++ b/modular_darkpack/modules/areas/code/interiors/endron_facility.dm @@ -4,6 +4,7 @@ zone_type = ZONE_NO_MASQUERADE music_index = MUSIC_FOREST fire_controled = FALSE + gauntlet_rating = 8 /area/vtm/interior/endron_facility/restricted name = MAIN_EVIL_COMPANY + " Facility Restricted" @@ -23,6 +24,7 @@ icon_state = "supply" zone_type = ZONE_NO_MASQUERADE fire_controled = TRUE + gauntlet_rating = 6 /area/vtm/interior/endron_facility/plant name = "Endron Processing Plant" diff --git a/modular_darkpack/modules/areas/code/interiors/garou.dm b/modular_darkpack/modules/areas/code/interiors/garou.dm index edf0bc42cc12..61d28ab27d6c 100644 --- a/modular_darkpack/modules/areas/code/interiors/garou.dm +++ b/modular_darkpack/modules/areas/code/interiors/garou.dm @@ -2,6 +2,7 @@ name = "Children of Gaia Caern" icon_state = "cog_caern" zone_type = ZONE_ELYSIUM + gauntlet_rating = 5 /area/vtm/interior/cog/pantry name = "Earth's Bounty Food Pantry" diff --git a/modular_darkpack/modules/areas/code/outsides/forest.dm b/modular_darkpack/modules/areas/code/outsides/forest.dm index 29bee2c1ce1f..5d5c00880bea 100644 --- a/modular_darkpack/modules/areas/code/outsides/forest.dm +++ b/modular_darkpack/modules/areas/code/outsides/forest.dm @@ -3,3 +3,4 @@ icon_state = "park" zone_type = ZONE_NO_MASQUERADE sound_environment = SOUND_ENVIRONMENT_FOREST + gauntlet_rating = 6 diff --git a/modular_darkpack/modules/areas/code/random_gen.dm b/modular_darkpack/modules/areas/code/random_gen.dm index 1a3653d55085..3d1aa7727e57 100644 --- a/modular_darkpack/modules/areas/code/random_gen.dm +++ b/modular_darkpack/modules/areas/code/random_gen.dm @@ -3,6 +3,7 @@ icon_state = "park" outdoors = TRUE map_generator = /datum/map_generator/jungle_generator + gauntlet_rating = 6 /area/vtm/planetgeneration/woodland @@ -10,3 +11,4 @@ icon_state = "cog_caern" outdoors = TRUE map_generator = /datum/map_generator/jungle_generator/woodland + gauntlet_rating = 6 diff --git a/modular_darkpack/modules/doors/code/vampdoor.dm b/modular_darkpack/modules/doors/code/vampdoor.dm index e326d7a8da04..01fb316bba1c 100644 --- a/modular_darkpack/modules/doors/code/vampdoor.dm +++ b/modular_darkpack/modules/doors/code/vampdoor.dm @@ -45,6 +45,11 @@ AddElement(/datum/element/contextual_screentip_bare_hands, rmb_text = "Try lock") + var/static/list/loc_connections = list( + COMSIG_ATOM_MAGICALLY_UNLOCKED = PROC_REF(on_magic_unlock), + ) + AddElement(/datum/element/connect_loc, loc_connections) + /obj/structure/vampdoor/CanAStarPass(to_dir, datum/can_pass_info/pass_info) return !density || !locked @@ -162,6 +167,13 @@ closed = FALSE SEND_SIGNAL(src, COMSIG_AIRLOCK_OPEN) +/// Signal proc for [COMSIG_ATOM_MAGICALLY_UNLOCKED]. Unlock and open up when we get knock casted. +/obj/structure/vampdoor/proc/on_magic_unlock(datum/source, datum/action/cooldown/spell/aoe/knock/spell, atom/caster) + SIGNAL_HANDLER + + locked = FALSE + INVOKE_ASYNC(src, PROC_REF(open_door)) + /obj/structure/vampdoor/proc/close_door(mob/user, force) if(!force) for(var/mob/living/L in src.loc) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gauntlet.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gauntlet.dm new file mode 100644 index 000000000000..c66cae920103 --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gauntlet.dm @@ -0,0 +1,6 @@ +/atom/proc/get_gauntlet_rating() + var/area/vtm/my_area = astype(get_area(src)) + if(my_area) + return my_area.gauntlet_rating + return 7 + diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm index de1c95c8504f..526bcb107efa 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm @@ -55,3 +55,9 @@ /datum/action/cooldown/power/gift/proc/get_gnosis_cost() return gnosis_req + + +/atom/movable/screen/alert/status_effect/gift + icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi' + overlay_state = "bg_gift" + overlay_icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi' diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm index 14e477f26ccd..534a578e89bb 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm @@ -64,7 +64,7 @@ id = "inspiration" duration = 1 SCENES status_type = STATUS_EFFECT_REPLACE - alert_type = /atom/movable/screen/alert/status_effect/inspiration + alert_type = /atom/movable/screen/alert/status_effect/gift/inspiration /datum/status_effect/inspiration/on_apply() . = ..() @@ -79,10 +79,9 @@ living_owner.st_change_stat(STAT_TEMPORARY_WILLPOWER, -1) return ..() -/atom/movable/screen/alert/status_effect/inspiration +/atom/movable/screen/alert/status_effect/gift/inspiration name = "Inspiration" desc = "You have an extra temporary willpower for one scene!" - icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi' icon_state = "inspiration" @@ -98,16 +97,16 @@ playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/razor_claws.ogg', 75, FALSE) if(!do_after(owner, 1 TURNS)) return + . = ..() var/mob/living/living_owner = astype(owner) living_owner?.apply_status_effect(/datum/status_effect/razor_claws) - . = ..() // DARKPACK TODO - Requires https://github.com/DarkPack13/SecondCity/pull/680 for its stat handling. /datum/status_effect/razor_claws - id = "razor claws" + id = "razor_claws" duration = 1 SCENES status_type = STATUS_EFFECT_REPLACE - alert_type = /atom/movable/screen/alert/status_effect/razor_claws + alert_type = /atom/movable/screen/alert/status_effect/gift/razor_claws /datum/status_effect/razor_claws/on_apply() . = ..() @@ -119,8 +118,7 @@ to_chat(owner, span_warning("Your claws are not sharp anymore...")) return ..() -/atom/movable/screen/alert/status_effect/razor_claws +/atom/movable/screen/alert/status_effect/gift/razor_claws name = "Razor Claws" desc = "Your claws do extra damage." - icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi' icon_state = "razor_claws" diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm index 01483b32243f..4a5075b51972 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm @@ -1,4 +1,4 @@ -/* +// W20 p. 161 /datum/action/cooldown/power/gift/blur_of_the_milky_eye name = "Blur Of The Milky Eye" desc = "The Garou's form becomes a shimmering blur, allowing him to pass unnoticed among others." @@ -8,13 +8,29 @@ /datum/action/cooldown/power/gift/blur_of_the_milky_eye/Activate(atom/target) . = ..() - if(allowed_to_proceed) - var/mob/living/carbon/C = owner - C.alpha = 36 - playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/milky_blur.ogg', 75, FALSE) - spawn(20 SECONDS) - C.alpha = 255 -*/ + var/mob/living/living_owner = astype(owner) + living_owner?.apply_status_effect(/datum/status_effect/blur_of_the_milky_eye) + +/datum/status_effect/blur_of_the_milky_eye + id = "blur_of_the_milky_eye" + duration = 1 SCENES + status_type = STATUS_EFFECT_REPLACE + alert_type = /atom/movable/screen/alert/status_effect/gift/blur_of_the_milky_eye + +/datum/status_effect/blur_of_the_milky_eye/on_apply() + . = ..() + playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/milky_blur.ogg', 75, FALSE) + owner.alpha = 30 + +/datum/status_effect/blur_of_the_milky_eye/on_remove() + owner.alpha = initial(owner.alpha) + return ..() + +/atom/movable/screen/alert/status_effect/gift/blur_of_the_milky_eye + name = "Blur Of The Milky Eye" + desc = "The Garou's form becomes a shimmering blur, allowing him to pass unnoticed among others." + icon_state = "blur_of_the_milky_eye" + /datum/action/cooldown/power/gift/infectious_laughter name = "Infectious Laughter" @@ -59,7 +75,7 @@ var/mob/living/carbon/human/human_owner = owner owner.emote("laugh") - playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/infectious_laughter.ogg', 50, FALSE) + playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/infectious_laughter.ogg', 50, FALSE) var/list/hearers = oviewers(DEFAULT_MESSAGE_RANGE, owner) var/highest_diff = 0 for(var/mob/living/dice_guy in hearers) @@ -76,22 +92,27 @@ last_spoken_message = null when_spoken = 0 - // laughers.emote("laugh") -/* + /datum/action/cooldown/power/gift/open_seal name = "Open Seal" desc = "With this Gift, the Garou can open nearly any sort of closed or locked physical device." button_icon_state = "open_seal" + click_to_activate = TRUE rank = 1 -// gnosis_req = 1 + gnosis_req = 1 /datum/action/cooldown/power/gift/open_seal/Activate(atom/target) . = ..() - if(allowed_to_proceed) - for(var/obj/structure/vampdoor/V in range(5, owner)) - if(V.closed) - if(V.lockpick_difficulty < 10) - V.open_door(owner, TRUE) -*/ + + var/datum/splat/werewolf/our_splat = iswerewolfsplat(owner) + + var/roll_result = SSroll.storyteller_roll(our_splat.permanent_gnosis, target.get_gauntlet_rating(), owner) + if(roll_result == ROLL_SUCCESS) + var/turf/target_turf = get_turf(target) + SEND_SIGNAL(target_turf, COMSIG_ATOM_MAGICALLY_UNLOCKED, src, owner) + playsound(owner, 'sound/effects/magic/knock.ogg', 50, FALSE) + + StartCooldown() + 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 1b5e676b5e10..cf6fe6c87822 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 @@ -4,10 +4,14 @@ power_type = /datum/action/cooldown/power/gift + // Perm is for rolls + // Non-perm/ or temp is for expenditure var/uses_rage = FALSE + var/permanent_rage = 10 var/rage = 0 // without a merit kinfolk cannot use gnosis var/uses_gnosis = FALSE + var/permanent_gnosis = 10 var/gnosis = 0 var/list/renown = list() @@ -22,8 +26,8 @@ return FALSE if(amount > 0) - if(rage < MAX_RAGE) - rage = min(MAX_RAGE, rage+amount) + if(rage < permanent_rage) + rage = min(permanent_rage, rage+amount) if(sound) SEND_SOUND(owner, sound('modular_darkpack/modules/werewolf_the_apocalypse/sounds/rage_increase.ogg', volume = 50)) to_chat(owner, span_userdanger("RAGE INCREASES")) @@ -46,8 +50,8 @@ return FALSE if(amount > 0) - if(gnosis < MAX_GNOSIS) - gnosis = clamp(gnosis + amount, 0, MAX_GNOSIS) + if(gnosis < permanent_gnosis) + gnosis = clamp(gnosis + amount, 0, permanent_gnosis) if(sound) SEND_SOUND(owner, sound('modular_darkpack/modules/deprecated/sounds/humanity_gain.ogg', volume = 50)) to_chat(owner, span_boldnotice("GNOSIS INCREASES")) @@ -55,7 +59,7 @@ return FALSE if(amount < 0) if(gnosis > 0) - gnosis = clamp(gnosis + amount, 0, MAX_GNOSIS) + gnosis = clamp(gnosis + amount, 0, permanent_gnosis) if(sound) SEND_SOUND(owner, sound('modular_darkpack/modules/werewolf_the_apocalypse/sounds/rage_decrease.ogg', volume = 50)) to_chat(owner, span_boldnotice("GNOSIS DECREASES")) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm index e458b00932d7..26d85c6904ea 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm @@ -119,8 +119,8 @@ start_rage = 1 gifts_provided= list( // /datum/action/cooldown/power/gift/blur_of_the_milky_eye, - /datum/action/cooldown/power/gift/infectious_laughter - // /datum/action/cooldown/power/gift/open_seal, + /datum/action/cooldown/power/gift/infectious_laughter, + /datum/action/cooldown/power/gift/open_seal, ) moons_born_under = list(MOON_NEW) diff --git a/tgstation.dme b/tgstation.dme index 6baf63fa2097..f30d2255368e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7667,6 +7667,7 @@ #include "modular_darkpack\modules\weather\code\effects.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\emotes.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\garou_languages.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gauntlet.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\glyphs.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\hud.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\silver_damage.dm" From b8d8d1e05ea004d2ce4326ec4d2cb483b528bd22 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 20 Feb 2026 01:30:36 -0600 Subject: [PATCH 04/16] wibble --- .../werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm index 4a5075b51972..aaab483714ea 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm @@ -21,9 +21,11 @@ . = ..() playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/milky_blur.ogg', 75, FALSE) owner.alpha = 30 + apply_wibbly_filters(owner) /datum/status_effect/blur_of_the_milky_eye/on_remove() owner.alpha = initial(owner.alpha) + remove_wibbly_filters(owner) return ..() /atom/movable/screen/alert/status_effect/gift/blur_of_the_milky_eye From c1726cfcb3c6b70eeb66f88367376415ff3087d7 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 20 Feb 2026 02:21:42 -0600 Subject: [PATCH 05/16] more stuff --- .../code/gifts/_gift.dm | 2 +- .../code/gifts/auspices/ahroun.dm | 8 ++--- .../code/gifts/auspices/ragabash.dm | 31 ++++++++++++------- .../code/gifts/auspices/theurge.dm | 1 - .../code/subsplats/auspices/garou.dm | 2 +- 5 files changed, 26 insertions(+), 18 deletions(-) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm index 526bcb107efa..ce9732f1e92e 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm @@ -59,5 +59,5 @@ /atom/movable/screen/alert/status_effect/gift icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi' - overlay_state = "bg_gift" + icon_state = "bg_gift" overlay_icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi' diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm index 534a578e89bb..a3252a43bd39 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm @@ -80,9 +80,9 @@ return ..() /atom/movable/screen/alert/status_effect/gift/inspiration - name = "Inspiration" + name = /datum/action/cooldown/power/gift/inspiration::name desc = "You have an extra temporary willpower for one scene!" - icon_state = "inspiration" + overlay_state = /datum/action/cooldown/power/gift/inspiration::button_icon_state /datum/action/cooldown/power/gift/razor_claws @@ -119,6 +119,6 @@ return ..() /atom/movable/screen/alert/status_effect/gift/razor_claws - name = "Razor Claws" + name = /datum/action/cooldown/power/gift/razor_claws::name desc = "Your claws do extra damage." - icon_state = "razor_claws" + overlay_state = /datum/action/cooldown/power/gift/razor_claws::button_icon_state diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm index aaab483714ea..3107badfb460 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm @@ -3,13 +3,21 @@ name = "Blur Of The Milky Eye" desc = "The Garou's form becomes a shimmering blur, allowing him to pass unnoticed among others." button_icon_state = "blur_of_the_milky_eye" - rage_req = 2 - //gnosis_req = 1 + cooldown_time = 1 SCENES + rank = 1 /datum/action/cooldown/power/gift/blur_of_the_milky_eye/Activate(atom/target) . = ..() var/mob/living/living_owner = astype(owner) - living_owner?.apply_status_effect(/datum/status_effect/blur_of_the_milky_eye) + + var/datum/storyteller_roll/roll_datum = new() + roll_datum.applicable_stats = list(STAT_MANIPULATION, STAT_STEALTH) + roll_datum.numerical = TRUE + roll_datum.difficulty = 8 + var/roll_result = roll_datum.st_roll(owner) + + if(roll_result > 0) + living_owner?.apply_status_effect(/datum/status_effect/blur_of_the_milky_eye) /datum/status_effect/blur_of_the_milky_eye id = "blur_of_the_milky_eye" @@ -20,7 +28,7 @@ /datum/status_effect/blur_of_the_milky_eye/on_apply() . = ..() playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/milky_blur.ogg', 75, FALSE) - owner.alpha = 30 + owner.alpha = 50 apply_wibbly_filters(owner) /datum/status_effect/blur_of_the_milky_eye/on_remove() @@ -29,9 +37,9 @@ return ..() /atom/movable/screen/alert/status_effect/gift/blur_of_the_milky_eye - name = "Blur Of The Milky Eye" - desc = "The Garou's form becomes a shimmering blur, allowing him to pass unnoticed among others." - icon_state = "blur_of_the_milky_eye" + name = /datum/action/cooldown/power/gift/blur_of_the_milky_eye::name + desc = /datum/action/cooldown/power/gift/blur_of_the_milky_eye::desc + overlay_state = /datum/action/cooldown/power/gift/blur_of_the_milky_eye::button_icon_state /datum/action/cooldown/power/gift/infectious_laughter @@ -59,6 +67,7 @@ last_spoken_message = speech_args[SPEECH_MESSAGE] when_spoken = world.time + build_all_button_icons(UPDATE_BUTTON_STATUS) /datum/action/cooldown/power/gift/infectious_laughter/IsAvailable(feedback) . = ..() @@ -70,11 +79,8 @@ /datum/action/cooldown/power/gift/infectious_laughter/Activate(atom/target) . = ..() - if(!ishuman(owner)) - return if(!last_spoken_message || (when_spoken + 3 TURNS < world.time)) return - var/mob/living/carbon/human/human_owner = owner owner.emote("laugh") playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/infectious_laughter.ogg', 50, FALSE) @@ -85,7 +91,10 @@ if(!rage_haver) continue highest_diff = max(highest_diff, rage_haver.rage) - var/roll = SSroll.storyteller_roll(human_owner.st_get_stat(STAT_MANIPULATION) + human_owner.st_get_stat(STAT_EMPATHY), highest_diff, owner) + var/datum/storyteller_roll/roll_datum = new() + roll_datum.applicable_stats = list(STAT_MANIPULATION, STAT_EMPATHY) + roll_datum.difficulty = highest_diff + var/roll = roll_datum.st_roll(owner) if(roll == ROLL_SUCCESS) for(var/mob/living/hearer in hearers) to_chat(hearer, span_hypnophrase("The message bounces around in your head, \"[last_spoken_message]\". You struggle to recall why you might have been mad.")) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm index 7ad92dfb1306..2e73777d18c4 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm @@ -19,7 +19,6 @@ the scar is received and an extra Gnosis point is spent. //rage_req = 1 gnosis_req = 1 - /datum/action/cooldown/power/gift/mothers_touch/Activate(atom/target) if(!isliving(target)) return diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm index 26d85c6904ea..cf51b9042bf2 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm @@ -118,7 +118,7 @@ desc = "The Ragabash born under the waxing new moon is usually light-hearted and capricious, while one born under the waning new moon has a slightly more wicked and ruthless streak. It's a rare Ragabash indeed that lacks a keen wit and the capacity to find some humor in any situation, no matter how bleak. Many other werewolves are slow to take the Ragabash seriously, though, as it's difficult to tell the difference between a New Moon's mockery that points out a grievous flaw in a plan and similar mockery that simply amuses him. Sometimes a Ragabash points out that the emperor has no clothes - but sometimes they're the first to cry wolf, so to speak." start_rage = 1 gifts_provided= list( - // /datum/action/cooldown/power/gift/blur_of_the_milky_eye, + /datum/action/cooldown/power/gift/blur_of_the_milky_eye, /datum/action/cooldown/power/gift/infectious_laughter, /datum/action/cooldown/power/gift/open_seal, ) From 992b86a3b9055700211fdbba8fa57b1a1bb04327 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 20 Feb 2026 02:34:02 -0600 Subject: [PATCH 06/16] move code around --- .../code/gifts/auspices/ahroun.dm | 3 +- .../code/gifts/auspices/philodox.dm | 39 +++++ .../code/gifts/auspices/theurge.dm | 33 ++++ .../werewolf_the_apocalypse/code/old/gifts.dm | 150 ------------------ 4 files changed, 73 insertions(+), 152 deletions(-) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm index a3252a43bd39..b4cf02b00d99 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm @@ -9,7 +9,6 @@ . = ..() SEND_SOUND(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/falling_touch.ogg') - /datum/action/cooldown/power/gift/falling_touch/Activate(atom/target) if(!isliving(target)) return @@ -25,7 +24,7 @@ if(caster.combat_mode) victim.Knockdown(1 TURNS) victim.Immobilize(1 TURNS) - playsound(get_turf(caster), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/falling_touch_activate.ogg', 75, FALSE) // red-tailed hawk sound mixed with disintegrate.ogg + playsound(caster, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/falling_touch_activate.ogg', 75, FALSE) // red-tailed hawk sound mixed with disintegrate.ogg SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) if(holding) victim.attackby(holding, caster) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm index 2c65bb63ed9b..723ba8f23568 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm @@ -1,3 +1,34 @@ +/* +/datum/action/cooldown/power/gift/resist_pain + name = "Resist Pain" + desc = "Through force of will, the Philodox is able to ignore the pain of his wounds and continue acting normally." + button_icon_state = "resist_pain" + rage_req = 2 + +/datum/action/cooldown/power/gift/resist_pain/Activate(atom/target) + . = ..() + if(allowed_to_proceed) + if(ishuman(owner)) + playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/resist_pain.ogg', 75, FALSE) + var/mob/living/carbon/human/H = owner + H.physiology.armor.melee = 40 + H.physiology.armor.bullet = 25 + to_chat(owner, span_notice("You feel your skin thickering...")) + spawn(15 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 thin again...")) + else + playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/resist_pain.ogg', 75, FALSE) + var/mob/living/carbon/werewolf/H = owner + H.werewolf_armor = 40 + to_chat(owner, span_notice("You feel your skin thickering...")) + spawn(15 SECONDS) + H.werewolf_armor = initial(H.werewolf_armor) + to_chat(owner, span_warning("Your skin is thin again...")) +*/ + + /datum/action/cooldown/power/gift/scent_of_the_true_form name = "Scent Of The True Form" desc = "This Gift allows the Garou to determine the true nature of a person." @@ -105,3 +136,11 @@ StartCooldown() return TRUE + +/* +/datum/action/cooldown/power/gift/truth_of_gaia + name = "Truth Of Gaia" + desc = "As judges of the Litany, Philodox have the ability to sense whether others have spoken truth or falsehood." + button_icon_state = "truth_of_gaia" +// rage_req = 1 +*/ diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm index 2e73777d18c4..768bb95734ed 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm @@ -38,3 +38,36 @@ the scar is received and an extra Gnosis point is spent. SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) StartCooldown() return TRUE + +/* +/datum/action/cooldown/power/gift/sense_wyrm + name = "Sense Wyrm" + desc = "This Gift allows the werewolf to sense the presence of Wyrm." + button_icon_state = "sense_wyrm" + rage_req = 1 + +/datum/action/cooldown/power/gift/sense_wyrm/Activate(atom/target) + . = ..() + if(allowed_to_proceed) + var/mob/living/carbon/C = owner + C.sight = SEE_MOBS|SEE_OBJS + playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/sense_wyrm.ogg', 75, FALSE) + to_chat(owner, span_notice("You feel your sense sharpening...")) + spawn(200) + C.sight = initial(C.sight) + to_chat(owner, span_warning("You no longer sense anything more than normal...")) + +/datum/action/cooldown/power/gift/spirit_speech + name = "Spirit Speech" + desc = "This Gift allows the Garou to communicate with encountered spirits." + button_icon_state = "spirit_speech" + //gnosis_req = 1 + +/datum/action/cooldown/power/gift/spirit_speech/Activate(atom/target) + . = ..() + if(allowed_to_proceed) + var/mob/living/carbon/C = owner + C.see_invisible = SEE_INVISIBLE_OBSERVER + spawn(200) + C.see_invisible = initial(C.see_invisible) +*/ diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/old/gifts.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/old/gifts.dm index 2f7ac90a7e4f..85af6949c2e7 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/old/gifts.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/old/gifts.dm @@ -1,83 +1,3 @@ -/datum/action/cooldown/power/gift/resist_pain - name = "Resist Pain" - desc = "Through force of will, the Philodox is able to ignore the pain of his wounds and continue acting normally." - button_icon_state = "resist_pain" - rage_req = 2 - -/datum/action/cooldown/power/gift/resist_pain/Activate(atom/target) - . = ..() - if(allowed_to_proceed) - if(ishuman(owner)) - playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/resist_pain.ogg', 75, FALSE) - var/mob/living/carbon/human/H = owner - H.physiology.armor.melee = 40 - H.physiology.armor.bullet = 25 - to_chat(owner, span_notice("You feel your skin thickering...")) - spawn(15 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 thin again...")) - else - playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/resist_pain.ogg', 75, FALSE) - var/mob/living/carbon/werewolf/H = owner - H.werewolf_armor = 40 - to_chat(owner, span_notice("You feel your skin thickering...")) - spawn(15 SECONDS) - H.werewolf_armor = initial(H.werewolf_armor) - to_chat(owner, span_warning("Your skin is thin again...")) - -/datum/action/cooldown/power/gift/scent_of_the_true_form - name = "Scent Of The True Form" - desc = "This Gift allows the Garou to determine the true nature of a person." - button_icon_state = "scent_of_the_true_form" - rage_req = 1 - //gnosis_req = 1 - -/datum/action/cooldown/power/gift/scent_of_the_true_form/Activate(atom/target) - . = ..() - if(allowed_to_proceed) - var/datum/atom_hud/abductor_hud = GLOB.huds[DATA_HUD_ABDUCTOR] - abductor_hud.add_hud_to(owner) - spawn(200) - abductor_hud.remove_hud_from(owner) - -/datum/action/cooldown/power/gift/truth_of_gaia - name = "Truth Of Gaia" - desc = "As judges of the Litany, Philodox have the ability to sense whether others have spoken truth or falsehood." - button_icon_state = "truth_of_gaia" -// rage_req = 1 - -/datum/action/cooldown/power/gift/sense_wyrm - name = "Sense Wyrm" - desc = "This Gift allows the werewolf to sense the presence of Wyrm." - button_icon_state = "sense_wyrm" - rage_req = 1 - -/datum/action/cooldown/power/gift/sense_wyrm/Activate(atom/target) - . = ..() - if(allowed_to_proceed) - var/mob/living/carbon/C = owner - C.sight = SEE_MOBS|SEE_OBJS - playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/sense_wyrm.ogg', 75, FALSE) - to_chat(owner, span_notice("You feel your sense sharpening...")) - spawn(200) - C.sight = initial(C.sight) - to_chat(owner, span_warning("You no longer sense anything more than normal...")) - -/datum/action/cooldown/power/gift/spirit_speech - name = "Spirit Speech" - desc = "This Gift allows the Garou to communicate with encountered spirits." - button_icon_state = "spirit_speech" - //gnosis_req = 1 - -/datum/action/cooldown/power/gift/spirit_speech/Activate(atom/target) - . = ..() - if(allowed_to_proceed) - var/mob/living/carbon/C = owner - C.see_invisible = SEE_INVISIBLE_OBSERVER - spawn(200) - C.see_invisible = initial(C.see_invisible) - /datum/action/cooldown/power/gift/rage_heal name = "Rage Heal" desc = "This Gift allows the Garou to heal severe injuries with rage." @@ -131,73 +51,3 @@ C.sprite_apparel = 0 else C.sprite_apparel = min(4, C.sprite_apparel+1) - -/datum/action/cooldown/power/gift/hispo - name = "Hispo Form" - desc = "Change your Lupus form into Hispo and backwards." - button_icon_state = "hispo" - -/datum/action/cooldown/power/gift/hispo/Activate(atom/target) - . = ..() - if(allowed_to_proceed) - var/mob/living/carbon/werewolf/lupus/H = owner - playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/transform.ogg', 50, FALSE) - if(H.hispo) - H.icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_lupus.dmi' - H.pixel_w = 0 - H.pixel_z = 0 - H.melee_damage_lower = initial(H.melee_damage_lower) - H.melee_damage_upper = initial(H.melee_damage_upper) - H.hispo = FALSE - H.update_icons() - H.remove_movespeed_modifier(/datum/movespeed_modifier/crinosform) - H.add_movespeed_modifier(/datum/movespeed_modifier/lupusform) - else - H.icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/hispo.dmi' - H.pixel_w = -16 - H.pixel_z = -16 - H.melee_damage_lower = 35 - H.melee_damage_upper = 55 - H.hispo = TRUE - H.update_icons() - H.remove_movespeed_modifier(/datum/movespeed_modifier/lupusform) - H.add_movespeed_modifier(/datum/movespeed_modifier/crinosform) - -/datum/action/cooldown/power/gift/glabro - name = "Glabro Form" - desc = "Change your Homid form into Glabro and backwards." - button_icon_state = "glabro" - -/datum/action/cooldown/power/gift/glabro/Activate(atom/target) - . = ..() - if(allowed_to_proceed) - var/mob/living/carbon/human/H = owner - var/datum/species/garou/G = H.dna.species - playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/transform.ogg', 50, FALSE) - if(G.glabro) - H.remove_overlay(PROTEAN_LAYER) - G.punchdamagelow -= 15 - G.punchdamagehigh -= 15 - H.st_remove_stat_mod(STAT_STRENGTH, "glabro_form") - H.physiology.armor.melee -= 15 - H.physiology.armor.bullet -= 15 - var/matrix/M = matrix() - M.Scale(1) - animate(H, transform = M, time = 1 SECONDS) - G.glabro = FALSE - H.update_icons() - else - H.remove_overlay(PROTEAN_LAYER) - var/mutable_appearance/glabro_overlay = mutable_appearance('modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/werewolf_abilities.dmi', H.transformator.crinos_form?.sprite_color, -PROTEAN_LAYER) - H.overlays_standing[PROTEAN_LAYER] = glabro_overlay - H.apply_overlay(PROTEAN_LAYER) - G.punchdamagelow += 15 - G.punchdamagehigh += 15 - H.st_add_stat_mod(STAT_STRENGTH, 3, "glabro_form") - H.physiology.armor.melee += 15 - H.physiology.armor.bullet += 15 - var/matrix/M = matrix() - M.Scale(1.23) - animate(H, transform = M, time = 1 SECONDS) - G.glabro = TRUE - H.update_icons() From e6b3f0af4a51141eff9d3f8b391864041a346b8e Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 20 Feb 2026 14:48:08 -0600 Subject: [PATCH 07/16] sense wyrm --- .../~darkpack/traits/declarations.dm | 4 +- code/_globalvars/traits/_traits.dm | 1 + .../modules/splats/code/human_dummies.dm | 9 +++ .../code/splats/ghoul_splat/make_ghoul.dm | 3 + .../code/splats/kindred_splat/make_kindred.dm | 3 + .../code/gifts/auspices/theurge.dm | 59 +++++++++++++++---- .../code/splats/fera_species.dm | 2 +- .../code/splats/fera_splat.dm | 9 +++ .../code/subsplats/auspices/garou.dm | 2 +- tgstation.dme | 1 + 10 files changed, 79 insertions(+), 14 deletions(-) create mode 100644 modular_darkpack/modules/splats/code/human_dummies.dm diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm index c9a439e96fce..5d9e62b0f9c1 100644 --- a/code/__DEFINES/~darkpack/traits/declarations.dm +++ b/code/__DEFINES/~darkpack/traits/declarations.dm @@ -124,8 +124,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_WTA_GAROU_AUSPICE "wta_garou_auspice" // This mob has fur! #define TRAIT_FERA_FUR "fera_fur" -/// If the fera is wyrm tainted. Affects their sprite. +/// If the fera is wyrm tainted. #define TRAIT_WYRMTAINTED "wyrm_tainted" +/// If the fera is wyrm tainted. Affects their sprite. +#define TRAIT_WYRMTAINTED_SPRITE "wyrm_tainted_sprite" /// For living mobs to prevent adjustments to their lying angle. Used primarly for fera. #define TRAIT_NO_LYING_ANGLE "no_lying_angle" // Expensive but allows us to ensure there resting gets updated. diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index e4d5ffaddf8d..4203459defe6 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -692,6 +692,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_WING_BUFFET_TIRED" = TRAIT_WING_BUFFET_TIRED, "TRAIT_WOUND_LICKER" = TRAIT_WOUND_LICKER, "TRAIT_WYRMTAINTED" = TRAIT_WYRMTAINTED, // DARKPACK EDIT ADD + "TRAIT_WYRMTAINTED_SPRITE" = TRAIT_WYRMTAINTED_SPRITE, // DARKPACK EDIT ADD "TRAIT_XENO_HOST" = TRAIT_XENO_HOST, "TRAIT_XENO_IMMUNE" = TRAIT_XENO_IMMUNE, "TRAIT_XRAY_HEARING" = TRAIT_XRAY_HEARING, diff --git a/modular_darkpack/modules/splats/code/human_dummies.dm b/modular_darkpack/modules/splats/code/human_dummies.dm new file mode 100644 index 000000000000..c3dfc61a4934 --- /dev/null +++ b/modular_darkpack/modules/splats/code/human_dummies.dm @@ -0,0 +1,9 @@ +// mimmics /mob/living/carbon/human/species to allow for quick testing +/mob/living/carbon/human/splat + abstract_type = /mob/living/carbon/human/splat + var/auto_splats = list() + +/mob/living/carbon/human/splat/Initialize(mapload) + . = ..() + for(var/splat in auto_splats) + add_splat(splat) diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/splats/ghoul_splat/make_ghoul.dm b/modular_darkpack/modules/vampire_the_masquerade/code/splats/ghoul_splat/make_ghoul.dm index b711203a495a..0bf0978c692f 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/splats/ghoul_splat/make_ghoul.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/splats/ghoul_splat/make_ghoul.dm @@ -2,3 +2,6 @@ RETURN_TYPE(/datum/splat/vampire/ghoul) return add_splat(/datum/splat/vampire/ghoul, domitor) + +/mob/living/carbon/human/splat/ghoul + auto_splats = list(/datum/splat/vampire/ghoul) diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/make_kindred.dm b/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/make_kindred.dm index 44421fb3e4b5..48ec91f48ce3 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/make_kindred.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/make_kindred.dm @@ -27,3 +27,6 @@ childe_clan = GLOB.vampire_clans[/datum/vampire_clan/caitiff] return make_kindred(sire_splat.generation + 1, childe_clan, FALSE, sire) + +/mob/living/carbon/human/splat/kindred + auto_splats = list(/datum/splat/vampire/kindred) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm index 768bb95734ed..c0aa6afd6051 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm @@ -39,24 +39,61 @@ the scar is received and an extra Gnosis point is spent. StartCooldown() return TRUE -/* /datum/action/cooldown/power/gift/sense_wyrm name = "Sense Wyrm" - desc = "This Gift allows the werewolf to sense the presence of Wyrm." + desc = "This Gift allows the werewolf to trace the location of all wyrm-tainted entities within the area." button_icon_state = "sense_wyrm" - rage_req = 1 + var/list/navigation_images = list() /datum/action/cooldown/power/gift/sense_wyrm/Activate(atom/target) . = ..() - if(allowed_to_proceed) - var/mob/living/carbon/C = owner - C.sight = SEE_MOBS|SEE_OBJS - playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/sense_wyrm.ogg', 75, FALSE) - to_chat(owner, span_notice("You feel your sense sharpening...")) - spawn(200) - C.sight = initial(C.sight) - to_chat(owner, span_warning("You no longer sense anything more than normal...")) + cut_navigation() + + var/list/wyrm_targets_in_range = list() + for(var/mob/living/target_guy in orange(owner, 30)) + var/difficulty = get_sense_difficulty(target_guy) + if(difficulty) + wyrm_targets_in_range[target_guy] = difficulty + + for(var/mob/living/target_guy, difficulty in wyrm_targets_in_range) + var/list/path = get_path_to(owner, target_guy, 50, access = owner.get_access(), skip_first = FALSE) + for(var/i in 1 to length(path)) + var/turf/current_turf = path[i] + var/image/path_image = image(icon = 'icons/effects/effects.dmi', icon_state = "smoke", layer = HIGH_PIPE_LAYER, loc = current_turf) + SET_PLANE(path_image, GAME_PLANE, current_turf) + if(i == length(path)) + path_image.color = COLOR_PURPLE_GRAY + else + path_image.color = COLOR_PALE_PURPLE_GRAY + path_image.alpha = rand(5, path_image.alpha/2) + owner.client?.images += path_image + navigation_images += path_image + RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(cut_navigation)) + +/datum/action/cooldown/power/gift/sense_wyrm/proc/cut_navigation() + SIGNAL_HANDLER + for(var/image/navigation_path in navigation_images) + owner.client?.images -= navigation_path + navigation_images.Cut() + UnregisterSignal(owner, COMSIG_LIVING_DEATH) + +/datum/action/cooldown/power/gift/sense_wyrm/proc/get_sense_difficulty(mob/living/target) + // To be used for stuff like banes. + if(HAS_TRAIT(target, TRAIT_WYRMTAINTED)) + . = 6 + + if(HAS_TRAIT(target, TRAIT_WYRMTAINTED_SPRITE)) + . = 5 + + var/datum/splat/vampire/kindred/kindred_splat = iskindred(target) + if(kindred_splat) + if(!kindred_splat.enlightenment) + . = 6 + else if(target.st_get_stat(STAT_MORALITY) <= 7) + . = 6 + +/* /datum/action/cooldown/power/gift/spirit_speech name = "Spirit Speech" desc = "This Gift allows the Garou to communicate with encountered spirits." 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 384cfec4311f..7b04298e9690 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 @@ -86,7 +86,7 @@ var/mob_icon = get_mob_icon(human) var/main_iconstate = "" - if(HAS_TRAIT(human, TRAIT_WYRMTAINTED)) + if(HAS_TRAIT(human, TRAIT_WYRMTAINTED_SPRITE)) main_iconstate += "spiral" main_iconstate += fur_color if(human.body_position == LYING_DOWN) 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 cf6fe6c87822..797eec8ea936 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 @@ -177,3 +177,12 @@ ) transform_sound = 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/corax_transform.ogg' */ + + +/mob/living/carbon/human/splat/kinfolk + auto_splats = list(/datum/splat/werewolf/kinfolk) + +/mob/living/carbon/human/splat/garou + auto_splats = list(/datum/splat/werewolf/shifter/garou) + + diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm index cf51b9042bf2..5c8b9d05f971 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm @@ -90,7 +90,7 @@ start_rage = 2 gifts_provided = list( /datum/action/cooldown/power/gift/mothers_touch, - // /datum/action/cooldown/power/gift/sense_wyrm, + /datum/action/cooldown/power/gift/sense_wyrm, // /datum/action/cooldown/power/gift/spirit_speech ) moons_born_under = list(MOON_WANING_CRESCENT, MOON_WAXING_CRESENT) diff --git a/tgstation.dme b/tgstation.dme index f30d2255368e..0f9e3b6b5123 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7521,6 +7521,7 @@ #include "modular_darkpack\modules\splats\code\__splat.dm" #include "modular_darkpack\modules\splats\code\gaining_splats.dm" #include "modular_darkpack\modules\splats\code\hud_managment.dm" +#include "modular_darkpack\modules\splats\code\human_dummies.dm" #include "modular_darkpack\modules\splats\code\is_splat_helpers.dm" #include "modular_darkpack\modules\splats\code\losing_splats.dm" #include "modular_darkpack\modules\splats\code\splat_configs.dm" From 87d3767c3dbc39abf18e284ca26803b462da7332 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 20 Feb 2026 15:21:23 -0600 Subject: [PATCH 08/16] yea --- code/_globalvars/traits/admin_tooling.dm | 2 ++ .../code/gifts/auspices/theurge.dm | 14 ++++++++++++++ .../code/splats/fera_splat.dm | 2 -- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index a5e9ce27bdd6..690fa545c776 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -355,6 +355,8 @@ 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_WYRMTAINTED" = TRAIT_WYRMTAINTED, // DARKPACK EDIT ADD + "TRAIT_WYRMTAINTED_SPRITE" = TRAIT_WYRMTAINTED_SPRITE, // DARKPACK EDIT ADD "TRAIT_THAUMATURGY_KNOWLEDGE" = TRAIT_THAUMATURGY_KNOWLEDGE, // DARKPACK EDIT ADD "TRAIT_VICISSITUDE_KNOWLEDGE" = TRAIT_VICISSITUDE_KNOWLEDGE, // DARKPACK EDIT ADD "TRAIT_MYSTICISM_KNOWLEDGE" = TRAIT_MYSTICISM_KNOWLEDGE, // DARKPACK EDIT ADD diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm index c0aa6afd6051..1950f3d72219 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm @@ -49,12 +49,26 @@ the scar is received and an extra Gnosis point is spent. . = ..() cut_navigation() + var/lowest_difficulty = 0 var/list/wyrm_targets_in_range = list() for(var/mob/living/target_guy in orange(owner, 30)) var/difficulty = get_sense_difficulty(target_guy) if(difficulty) + if(!lowest_difficulty || (difficulty < lowest_difficulty)) + lowest_difficulty = difficulty wyrm_targets_in_range[target_guy] = difficulty + if(!lowest_difficulty) + return + + var/datum/storyteller_roll/roll_datum = new() + roll_datum.applicable_stats = list(STAT_PERCEPTION, STAT_OCCULT) + roll_datum.difficulty = lowest_difficulty + var/roll_result = roll_datum.st_roll(owner) + + if(roll_result != ROLL_SUCCESS) + return + for(var/mob/living/target_guy, difficulty in wyrm_targets_in_range) var/list/path = get_path_to(owner, target_guy, 50, access = owner.get_access(), skip_first = FALSE) for(var/i in 1 to length(path)) 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 797eec8ea936..8cbcccf4e0d0 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 @@ -184,5 +184,3 @@ /mob/living/carbon/human/splat/garou auto_splats = list(/datum/splat/werewolf/shifter/garou) - - From 217029c7e9df80ba3603b80442c440e454c7b0ed Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 20 Feb 2026 16:07:41 -0600 Subject: [PATCH 09/16] spirit speech --- .../~darkpack/traits/declarations.dm | 3 +++ code/__HELPERS/mobs.dm | 4 +++ code/_globalvars/traits/_traits.dm | 1 + code/_globalvars/traits/admin_tooling.dm | 11 ++++---- .../code/gifts/_gift.dm | 4 ++- .../code/gifts/auspices/philodox.dm | 26 ++++--------------- .../code/gifts/auspices/theurge.dm | 23 ++++++++++------ .../code/subsplats/auspices/garou.dm | 2 +- 8 files changed, 38 insertions(+), 36 deletions(-) diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm index 5d9e62b0f9c1..34bf0b5be4d8 100644 --- a/code/__DEFINES/~darkpack/traits/declarations.dm +++ b/code/__DEFINES/~darkpack/traits/declarations.dm @@ -139,6 +139,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_LOUD_HOWLER "loud_howler" #define TRAIT_RAZOR_CLAWS "razor_claws" +/// Sixth sense restricted to view range +#define TRAIT_LOCAL_SIXTHSENSE "local_sixth_sense" + // BELOW ARE ALL MERITS/FLAWS #define TRAIT_ILLEGAL_IDENTITY "illegal_identity" // GOVERNMENT #define TRAIT_PERMAFANGS "permafangs" diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 5b997464250f..a138dbdbf0f3 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -403,6 +403,10 @@ GLOBAL_LIST_INIT(skin_tone_names, list( override = TRUE if(HAS_TRAIT(M, TRAIT_SIXTHSENSE) && message_type == DEADCHAT_REGULAR) override = TRUE + // DARKPACK EDIT ADD START + if(HAS_TRAIT(M, TRAIT_LOCAL_SIXTHSENSE) && (message_type == DEADCHAT_REGULAR) && (source in orange(DEFAULT_MESSAGE_RANGE, M))) + override = TRUE + // DARKPACK EDIT ADD END if(SSticker.current_state == GAME_STATE_FINISHED) override = TRUE if(isnewplayer(M) && !override) diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 4203459defe6..53e9ef760e9e 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -736,6 +736,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_SMALL_HANDS" = TRAIT_SMALL_HANDS, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_LOUD_HOWLER" = TRAIT_LOUD_HOWLER, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_RAZOR_CLAWS" = TRAIT_RAZOR_CLAWS, // DARKPACK EDIT ADD - WEREWOLF + "TRAIT_LOCAL_SIXTHSENSE" = TRAIT_LOCAL_SIXTHSENSE, // DARKPACK EDIT ADD "TRAIT_NECROPOLIS_WORSHIP" = TRAIT_NECROPOLIS_WORSHIP, ), /mob/living/carbon = list( diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 690fa545c776..eaf388a2315e 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -355,11 +355,12 @@ 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_WYRMTAINTED" = TRAIT_WYRMTAINTED, // DARKPACK EDIT ADD - "TRAIT_WYRMTAINTED_SPRITE" = TRAIT_WYRMTAINTED_SPRITE, // DARKPACK EDIT ADD - "TRAIT_THAUMATURGY_KNOWLEDGE" = TRAIT_THAUMATURGY_KNOWLEDGE, // DARKPACK EDIT ADD - "TRAIT_VICISSITUDE_KNOWLEDGE" = TRAIT_VICISSITUDE_KNOWLEDGE, // DARKPACK EDIT ADD - "TRAIT_MYSTICISM_KNOWLEDGE" = TRAIT_MYSTICISM_KNOWLEDGE, // DARKPACK EDIT ADD + "TRAIT_WYRMTAINTED" = TRAIT_WYRMTAINTED, // DARKPACK EDIT ADD - WEREWOLF + "TRAIT_WYRMTAINTED_SPRITE" = TRAIT_WYRMTAINTED_SPRITE, // DARKPACK EDIT ADD - WEREWOLF + "TRAIT_THAUMATURGY_KNOWLEDGE" = TRAIT_THAUMATURGY_KNOWLEDGE, // DARKPACK EDIT ADD - POWERS + "TRAIT_VICISSITUDE_KNOWLEDGE" = TRAIT_VICISSITUDE_KNOWLEDGE, // DARKPACK EDIT ADD - POWERS + "TRAIT_MYSTICISM_KNOWLEDGE" = TRAIT_MYSTICISM_KNOWLEDGE, // DARKPACK EDIT ADD - POWERS + "TRAIT_LOCAL_SIXTHSENSE" = TRAIT_LOCAL_SIXTHSENSE, // DARKPACK EDIT ADD ), /obj/item = list( "TRAIT_APC_SHOCKING" = TRAIT_APC_SHOCKING, diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm index ce9732f1e92e..51f10579e2be 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm @@ -7,6 +7,7 @@ check_flags = AB_CHECK_IMMOBILE|AB_CHECK_CONSCIOUS + var/default_activate_message = TRUE var/rage_req = 0 var/gnosis_req = 0 @@ -48,7 +49,8 @@ if(get_gnosis_cost()) casting_splat.adjust_gnosis(-get_gnosis_cost(), owner, FALSE) - to_chat(owner, span_notice("You activate the [name]...")) + if(default_activate_message) + to_chat(owner, span_notice("You activate the [name]...")) /datum/action/cooldown/power/gift/proc/get_rage_cost() return rage_req diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm index 723ba8f23568..8b956b638554 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm @@ -1,4 +1,4 @@ -/* + /datum/action/cooldown/power/gift/resist_pain name = "Resist Pain" desc = "Through force of will, the Philodox is able to ignore the pain of his wounds and continue acting normally." @@ -7,26 +7,10 @@ /datum/action/cooldown/power/gift/resist_pain/Activate(atom/target) . = ..() - if(allowed_to_proceed) - if(ishuman(owner)) - playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/resist_pain.ogg', 75, FALSE) - var/mob/living/carbon/human/H = owner - H.physiology.armor.melee = 40 - H.physiology.armor.bullet = 25 - to_chat(owner, span_notice("You feel your skin thickering...")) - spawn(15 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 thin again...")) - else - playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/resist_pain.ogg', 75, FALSE) - var/mob/living/carbon/werewolf/H = owner - H.werewolf_armor = 40 - to_chat(owner, span_notice("You feel your skin thickering...")) - spawn(15 SECONDS) - H.werewolf_armor = initial(H.werewolf_armor) - to_chat(owner, span_warning("Your skin is thin again...")) -*/ + to_chat(owner, span_notice("You feel your skin thickering...")) + playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/resist_pain.ogg', 75, FALSE) + + to_chat(owner, span_warning("Your skin is thin again...")) /datum/action/cooldown/power/gift/scent_of_the_true_form diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm index 1950f3d72219..6053f2e0a3e2 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm @@ -107,18 +107,25 @@ the scar is received and an extra Gnosis point is spent. else if(target.st_get_stat(STAT_MORALITY) <= 7) . = 6 -/* /datum/action/cooldown/power/gift/spirit_speech name = "Spirit Speech" desc = "This Gift allows the Garou to communicate with encountered spirits." button_icon_state = "spirit_speech" - //gnosis_req = 1 + +/datum/action/cooldown/power/gift/spirit_speech/Grant(mob/granted_to) + . = ..() + ADD_TRAIT(granted_to, TRAIT_LOCAL_SIXTHSENSE, GIFT_TRAIT) /datum/action/cooldown/power/gift/spirit_speech/Activate(atom/target) . = ..() - if(allowed_to_proceed) - var/mob/living/carbon/C = owner - C.see_invisible = SEE_INVISIBLE_OBSERVER - spawn(200) - C.see_invisible = initial(C.see_invisible) -*/ + + if(HAS_TRAIT_FROM(owner, TRAIT_LOCAL_SIXTHSENSE, GIFT_TRAIT)) + REMOVE_TRAIT(owner, TRAIT_LOCAL_SIXTHSENSE, GIFT_TRAIT) + to_chat(owner, span_notice("You deactivate [name].")) + else + ADD_TRAIT(owner, TRAIT_LOCAL_SIXTHSENSE, GIFT_TRAIT) + to_chat(owner, span_notice("You activate [name].")) + +/datum/action/cooldown/power/gift/spirit_speech/Remove(mob/removed_from) + . = ..() + REMOVE_TRAIT(removed_from, TRAIT_LOCAL_SIXTHSENSE, GIFT_TRAIT) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm index 5c8b9d05f971..2a60fb177717 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm @@ -91,7 +91,7 @@ gifts_provided = list( /datum/action/cooldown/power/gift/mothers_touch, /datum/action/cooldown/power/gift/sense_wyrm, - // /datum/action/cooldown/power/gift/spirit_speech + /datum/action/cooldown/power/gift/spirit_speech ) moons_born_under = list(MOON_WANING_CRESCENT, MOON_WAXING_CRESENT) From 490124bb6deac6cfda88889e5f80397d8d7339ee Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 20 Feb 2026 18:46:10 -0600 Subject: [PATCH 10/16] philodox --- icons/effects/mouse_pointers/discipline.dmi | Bin 1439 -> 0 bytes .../modules/deprecated/sounds/necromancy.ogg | Bin 49031 -> 0 bytes .../code/kindred/give_vitae.dm | 2 +- .../code/gifts/auspices/galliard.dm | 2 +- .../code/gifts/auspices/philodox.dm | 65 ++++++++++++++++-- .../code/gifts/auspices/ragabash.dm | 2 +- .../code/gifts/auspices/theurge.dm | 2 + .../code/gifts/tribes/tribes.dm | 16 ++--- .../code/subsplats/auspices/garou.dm | 6 +- .../sounds/gifts}/bloody_feast.ogg | Bin .../sounds/gifts}/electro_cast.ogg | Bin .../sounds/{ => gifts}/ice_blocking.ogg | Bin .../sounds/{ => gifts}/inspiration.ogg | Bin .../sounds/{ => gifts}/inspire.ogg | Bin .../sounds/{ => gifts}/milky_blur.ogg | Bin .../sounds/{ => gifts}/razor_claws.ogg | Bin .../sounds/gifts}/resist_pain.ogg | Bin .../sounds/gifts}/venom_claws.ogg | Bin .../sounds/gifts}/wolves.ogg | Bin 19 files changed, 77 insertions(+), 18 deletions(-) delete mode 100644 icons/effects/mouse_pointers/discipline.dmi delete mode 100644 modular_darkpack/modules/deprecated/sounds/necromancy.ogg rename modular_darkpack/modules/{deprecated/sounds => werewolf_the_apocalypse/sounds/gifts}/bloody_feast.ogg (100%) rename modular_darkpack/modules/{deprecated/sounds => werewolf_the_apocalypse/sounds/gifts}/electro_cast.ogg (100%) rename modular_darkpack/modules/werewolf_the_apocalypse/sounds/{ => gifts}/ice_blocking.ogg (100%) rename modular_darkpack/modules/werewolf_the_apocalypse/sounds/{ => gifts}/inspiration.ogg (100%) rename modular_darkpack/modules/werewolf_the_apocalypse/sounds/{ => gifts}/inspire.ogg (100%) rename modular_darkpack/modules/werewolf_the_apocalypse/sounds/{ => gifts}/milky_blur.ogg (100%) rename modular_darkpack/modules/werewolf_the_apocalypse/sounds/{ => gifts}/razor_claws.ogg (100%) rename modular_darkpack/modules/{deprecated/sounds => werewolf_the_apocalypse/sounds/gifts}/resist_pain.ogg (100%) rename modular_darkpack/modules/{deprecated/sounds => werewolf_the_apocalypse/sounds/gifts}/venom_claws.ogg (100%) rename modular_darkpack/modules/{deprecated/sounds => werewolf_the_apocalypse/sounds/gifts}/wolves.ogg (100%) diff --git a/icons/effects/mouse_pointers/discipline.dmi b/icons/effects/mouse_pointers/discipline.dmi deleted file mode 100644 index 3a01efceb96e9f8739b9c10f92478285cf456827..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1439 zcmV;Q1z`G#P)004jl0{{R3eocQU0000XP)t-sz`(#u z2?=cq3Z4%SECK}0Dj7T$6ig~CjDCC^0tCRoz)W~UEC2ui0d!JMQvg8b*k%9#0C0L# zSad{Xb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1gNKs9{|-~AwZlqYyf4zh!J004gh3A0SGYsjmy^r2m_D>0FW7z|KXnw;7veeeN6f?t3Fyi#1zo3 zLW-@h0@1*b)}VH%Qr0~mB(0oZ^5V3IKd(i&R8u>cH<=YkkOHlTp> zKn{E3A@a7K%#`OmW!jF*)cNeu;5z3-KLkKB5cWpaj0~U`0NxRbqeI>VUPjfS@4#*f z0ixMeI*P?E7h&VanP)H*`Y8IDVl?2%QTb;i3t=OYE`h!Lod8=o3D>OCb8`}w>SPqp z8`1UX`LQ@^^;zB2SIMEF!)ww@%VA*j<*B|-Ukxp?$zN6WS?QGC3|<`nJi%5Od99cE zbC+Fq`BSAn>|4p<@ZsB2ycWxJw3WWRsbFU~Z_BoDKQ5y@kM)a&Gi=pOF+01mUDyv?&$si6g+Y`1H3%5sa3U^i5>%t$I z6Z#Unc)b*d&m4HF~uI6ojyiCl>u_@%o{ z4!i+O?5U)08L*^xf&O)t{sFis68ts4Q-YcJ;4!SPC7{PNKQMqDf$C|hDXtffF)w=L z+-cEaU;{#-$z6a!DK+gf?YiCNXh7K)@(d&_zKDSo$t^I2*28#?VO!8M@~{qM4cz(~ zLe~g7IQFCz7nyL;ne9bqebjt;)IzQZv2U`)7CnnswdF}NID`#xM%|=mtLy6)S?b7T zYq7e{2855##;;|Sk$2f;mtFp+Ql;>BrQueUNwJM{?<8E{I;%ybVe0YIke$@sUhs&9 z7?+#K4PL*)d+rx5nLu(Kwg!qdIWjr=`~a`Xgi-k(dz>mK2o*_%(8V?s>OLNC6NDAI z+&(Mdz=TTMePZC6^u(!!ZOQZGvV$Z}W&}(irGE$saR3Ei4;65OXOPy|c+7M!Eiw-#5Y;KrFRGVQiU#7v0E#tV6tHnIEHsvzXdvsyiC*Y0Q_`nu zQ#wpNT4gU2(N8poj}ZIEXEBA1hG`vE9Jz1wo_;j&ciCl^U3S^!cb0b)5k{7JoI<002ovPDHLkV1j8Jn3Dhi diff --git a/modular_darkpack/modules/deprecated/sounds/necromancy.ogg b/modular_darkpack/modules/deprecated/sounds/necromancy.ogg deleted file mode 100644 index 09ad3577247042cc0c5492d9e2f84462193e43de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49031 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%0AuLSLm36$N>zDR4@TY>~gow5`#sBcV>$ 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 3) var/mob/living/simple_animal/hostile/beastmaster/B = pick(C.beastmaster) qdel(B) - playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/wolves.ogg', 75, FALSE) + playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/wolves.ogg', 75, FALSE) if(!length(C.beastmaster)) var/datum/action/beastmaster_stay/E1 = new() E1.Grant(C) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm index 8b956b638554..13fc8c4fb41c 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm @@ -3,15 +3,39 @@ name = "Resist Pain" desc = "Through force of will, the Philodox is able to ignore the pain of his wounds and continue acting normally." button_icon_state = "resist_pain" - rage_req = 2 + rank = 1 + willpower_req = 1 /datum/action/cooldown/power/gift/resist_pain/Activate(atom/target) . = ..() - to_chat(owner, span_notice("You feel your skin thickering...")) - playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/resist_pain.ogg', 75, FALSE) + var/mob/living/living_owner = astype(owner) + + playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/resist_pain.ogg', 75, FALSE) + living_owner.apply_status_effect(/datum/status_effect/resist_pain) + +/datum/status_effect/resist_pain + id = "resist_pain" + duration = 1 SCENES + status_type = STATUS_EFFECT_REPLACE + alert_type = /atom/movable/screen/alert/status_effect/gift/resist_pain + +/datum/status_effect/resist_pain/on_apply() + . = ..() + + to_chat(owner, span_notice("You feel your skin thickening...")) + owner.add_traits(list(TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA), GIFT_TRAIT) +/datum/status_effect/resist_pain/on_remove() + owner.remove_traits(list(TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA), GIFT_TRAIT) to_chat(owner, span_warning("Your skin is thin again...")) + return ..() + +/atom/movable/screen/alert/status_effect/gift/resist_pain + name = /datum/action/cooldown/power/gift/resist_pain::name + desc = /datum/action/cooldown/power/gift/resist_pain::desc + overlay_state = /datum/action/cooldown/power/gift/resist_pain::button_icon_state + /datum/action/cooldown/power/gift/scent_of_the_true_form name = "Scent Of The True Form" @@ -121,10 +145,39 @@ StartCooldown() return TRUE -/* + /datum/action/cooldown/power/gift/truth_of_gaia name = "Truth Of Gaia" desc = "As judges of the Litany, Philodox have the ability to sense whether others have spoken truth or falsehood." button_icon_state = "truth_of_gaia" -// rage_req = 1 -*/ + click_to_activate = TRUE + rank = 1 + +/datum/action/cooldown/power/gift/truth_of_gaia/Activate(atom/target) + var/mob/living/living_target = astype(target) + if(!living_target) + return FALSE + + . = ..() + + var/datum/storyteller_roll/roll_datum = new() + roll_datum.applicable_stats = list(STAT_INTELLIGENCE, STAT_EMPATHY) + roll_datum.difficulty = living_target.st_get_stat(STAT_MANIPULATION) + living_target.st_get_stat(STAT_SUBTERFUGE) + var/roll_result = roll_datum.st_roll(owner) + + if(roll_result != ROLL_SUCCESS) + return + + SEND_SOUND(target, sound('sound/effects/magic/clockwork/invoke_general.ogg', volume = 50)) // LOOK OUT! A WEREWOLF IS SMELLING YOU! + var/response_w = tgui_input_list(target, "Does your character believe your last statement is the truth?", name, list("Yes", "No", "Not sure")) + + switch(response_w) + if("Yes") + to_chat(owner, span_notice("[target]'s scent bares the aroma of truthfulness.")) + if("No") // Lying! + to_chat(owner, span_notice("[target]'s scent bares the aroma of deceit.")) + else // Dunno + to_chat(owner, span_notice("[target]'s scent is uncertain. You can't determine the truth one way or the other.")) + + StartCooldown() + return TRUE diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm index 3107badfb460..90b084154f97 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm @@ -27,7 +27,7 @@ /datum/status_effect/blur_of_the_milky_eye/on_apply() . = ..() - playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/milky_blur.ogg', 75, FALSE) + playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/milky_blur.ogg', 75, FALSE) owner.alpha = 50 apply_wibbly_filters(owner) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm index 6053f2e0a3e2..4a8cb5a41c89 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm @@ -43,6 +43,7 @@ the scar is received and an extra Gnosis point is spent. name = "Sense Wyrm" desc = "This Gift allows the werewolf to trace the location of all wyrm-tainted entities within the area." button_icon_state = "sense_wyrm" + rank = 1 var/list/navigation_images = list() /datum/action/cooldown/power/gift/sense_wyrm/Activate(atom/target) @@ -111,6 +112,7 @@ the scar is received and an extra Gnosis point is spent. name = "Spirit Speech" desc = "This Gift allows the Garou to communicate with encountered spirits." button_icon_state = "spirit_speech" + rank = 1 /datum/action/cooldown/power/gift/spirit_speech/Grant(mob/granted_to) . = ..() 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 index 4ecee4e784c0..1631ca4d5904 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/tribes.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/tribes.dm @@ -8,7 +8,7 @@ /datum/action/cooldown/power/gift/stoic_pose/Trigger() . = ..() if(allowed_to_proceed) - playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/ice_blocking.ogg', 100, FALSE) + playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/ice_blocking.ogg', 100, FALSE) var/mob/living/carbon/C = owner if(isgarou(C)) var/obj/were_ice/W = new (get_turf(owner)) @@ -57,7 +57,7 @@ /datum/action/cooldown/power/gift/freezing_wind/Trigger() . = ..() if(allowed_to_proceed) - playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/wind_cast.ogg', 100, FALSE) + 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) @@ -82,7 +82,7 @@ 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/bloody_feast.ogg', 50, FALSE) + 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) @@ -94,7 +94,7 @@ /datum/action/cooldown/power/gift/stinky_fur/Trigger() . = ..() if(allowed_to_proceed) - playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/necromancy.ogg', 75, FALSE) + 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() @@ -111,7 +111,7 @@ . = ..() if(allowed_to_proceed) if(ishuman(owner)) - playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/venom_claws.ogg', 75, FALSE) + 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 @@ -123,7 +123,7 @@ 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/venom_claws.ogg', 75, FALSE) + 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 @@ -202,7 +202,7 @@ if(allowed_to_proceed) animate(owner, color = "#6a839a", time = 10) if(ishuman(owner)) - playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/electro_cast.ogg', 75, FALSE) + 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 @@ -213,7 +213,7 @@ 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/electro_cast.ogg', 75, FALSE) + 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...")) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm index 2a60fb177717..f196265fc459 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm @@ -63,7 +63,11 @@ name = AUSPICE_PHILODOX desc = "Buried so heavily in his role as impartial judge and jury, the Philodox may seem aloof, even surprisingly cold-blooded for a werewolf. Those born under the waxing Half Moon may seem unusually serene and disaffected, their emotions only emerging when their Rage comes to a boil. The waning-moon Philodox is more incisive and judgmental, his all-seeing eye always carefully watching his packmates and colleagues for any departure from the expected. The Half Moons' opinions are somewhat feared, yet highly respected - a word of praise or condemnation means much coming from those born to see both sides of every struggle." start_rage = 3 - gifts_provided= list(/datum/action/cooldown/power/gift/scent_of_the_true_form)//,/datum/action/cooldown/power/gift/resist_pain, /datum/action/cooldown/power/gift/truth_of_gaia) + gifts_provided= list( + /datum/action/cooldown/power/gift/resist_pain, + /datum/action/cooldown/power/gift/scent_of_the_true_form, + /datum/action/cooldown/power/gift/truth_of_gaia, + ) moons_born_under = list(MOON_FIRST_QUARTER, MOON_LAST_QUARTER) /datum/subsplat/werewolf/auspice/garou/philodox/rank_requirments(list/renown) diff --git a/modular_darkpack/modules/deprecated/sounds/bloody_feast.ogg b/modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/bloody_feast.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/bloody_feast.ogg rename to modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/bloody_feast.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/electro_cast.ogg b/modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/electro_cast.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/electro_cast.ogg rename to modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/electro_cast.ogg diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/sounds/ice_blocking.ogg b/modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/ice_blocking.ogg similarity index 100% rename from modular_darkpack/modules/werewolf_the_apocalypse/sounds/ice_blocking.ogg rename to modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/ice_blocking.ogg diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/sounds/inspiration.ogg b/modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/inspiration.ogg similarity index 100% rename from modular_darkpack/modules/werewolf_the_apocalypse/sounds/inspiration.ogg rename to modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/inspiration.ogg diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/sounds/inspire.ogg b/modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/inspire.ogg similarity index 100% rename from modular_darkpack/modules/werewolf_the_apocalypse/sounds/inspire.ogg rename to modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/inspire.ogg diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/sounds/milky_blur.ogg b/modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/milky_blur.ogg similarity index 100% rename from modular_darkpack/modules/werewolf_the_apocalypse/sounds/milky_blur.ogg rename to modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/milky_blur.ogg diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/sounds/razor_claws.ogg b/modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/razor_claws.ogg similarity index 100% rename from modular_darkpack/modules/werewolf_the_apocalypse/sounds/razor_claws.ogg rename to modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/razor_claws.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/resist_pain.ogg b/modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/resist_pain.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/resist_pain.ogg rename to modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/resist_pain.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/venom_claws.ogg b/modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/venom_claws.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/venom_claws.ogg rename to modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/venom_claws.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/wolves.ogg b/modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/wolves.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/wolves.ogg rename to modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/wolves.ogg From 0493affa5bab95e2a2566655aa9fc126c55d0938 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 20 Feb 2026 18:59:30 -0600 Subject: [PATCH 11/16] little helper tho the ssroll is still soft depricated? --- .../storyteller_dice/code/roll_subsystem.dm | 7 ++++++ .../code/gifts/auspices/philodox.dm | 25 +++++++++++-------- .../code/gifts/auspices/theurge.dm | 2 +- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/modular_darkpack/modules/storyteller_dice/code/roll_subsystem.dm b/modular_darkpack/modules/storyteller_dice/code/roll_subsystem.dm index 9abca7539c78..3187e547dcc7 100644 --- a/modular_darkpack/modules/storyteller_dice/code/roll_subsystem.dm +++ b/modular_darkpack/modules/storyteller_dice/code/roll_subsystem.dm @@ -32,6 +32,13 @@ SUBSYSTEM_DEF(roll) dice_roll.numerical = numerical return dice_roll.st_roll(roller, roller, dice) +/datum/controller/subsystem/roll/proc/storyteller_roll_stats(applic_stats = list(), bonus = 0, difficulty = 6, mob/living/roller = null, numerical = FALSE) + var/datum/storyteller_roll/dice_roll = new() + dice_roll.applicable_stats = applic_stats + dice_roll.difficulty = difficulty + dice_roll.numerical = numerical + return dice_roll.st_roll(roller, roller, bonus) + //Config datums for exploding dice /datum/config_entry/flag/on_crit_additional_success diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm index 13fc8c4fb41c..7e8d475acd7f 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm @@ -103,7 +103,7 @@ secondary_descriptor = "[pick(wyrm_descriptors)]" to_chat(owner, span_purple("[victim] smells like kin[secondary_descriptor ? "...
...and of [secondary_descriptor]." : "."]")) else - var/successes = SSroll.storyteller_roll(caster.st_get_stat(STAT_PERCEPTION) + PRIMAL_URGE_PLACEHOLDER, 6, owner, numerical = TRUE) + var/successes = SSroll.storyteller_roll_stats(list(STAT_PERCEPTION), PRIMAL_URGE_PLACEHOLDER, 6, owner, numerical = TRUE) switch(successes) if(0) to_chat(owner, span_purple("You can't exactly tell what [victim] smells like.")) @@ -122,6 +122,8 @@ // to_chat(owner, span_purple("[victim] smells of brimstone.")) // if(ismummy(victim)) // to_chat(owner, span_purple("[victim] smells of [pick(wyld_descriptors)]")) + else + to_chat(owner, span_purple("[victim] smells mundane.")) if(4) if(iskindred(victim)) to_chat(owner, span_purple("[victim] smells of [pick(wyrm_descriptors)]")) @@ -139,6 +141,8 @@ // to_chat(owner, span_purple("[victim] smells of [pick(wyld_descriptors)]")) // if(ismage(victim)) // to_chat(owner, span_purple("[victim] smells of pure energy.")) + else + to_chat(owner, span_purple("[victim] smells mundane.")) caster.emote("sniff") @@ -169,15 +173,16 @@ return SEND_SOUND(target, sound('sound/effects/magic/clockwork/invoke_general.ogg', volume = 50)) // LOOK OUT! A WEREWOLF IS SMELLING YOU! - var/response_w = tgui_input_list(target, "Does your character believe your last statement is the truth?", name, list("Yes", "No", "Not sure")) - - switch(response_w) - if("Yes") - to_chat(owner, span_notice("[target]'s scent bares the aroma of truthfulness.")) - if("No") // Lying! - to_chat(owner, span_notice("[target]'s scent bares the aroma of deceit.")) - else // Dunno - to_chat(owner, span_notice("[target]'s scent is uncertain. You can't determine the truth one way or the other.")) + + ASYNC + var/response_w = tgui_input_list(target, "Does your character believe your last statement is the truth?", name, list("Yes", "No", "Not sure")) + switch(response_w) + if("Yes") + to_chat(owner, span_notice("[target]'s scent bares the aroma of truthfulness.")) + if("No") // Lying! + to_chat(owner, span_notice("[target]'s scent bares the aroma of deceit.")) + else // Dunno + to_chat(owner, span_notice("[target]'s scent is uncertain. You can't determine the truth one way or the other.")) StartCooldown() return TRUE diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm index 4a8cb5a41c89..2564f06090ce 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm @@ -30,7 +30,7 @@ the scar is received and an extra Gnosis point is spent. var/mob/living/living_owner = owner var/datum/splat/werewolf/werewolf_splat = iswerewolfsplat(owner) var/difficulty = werewolf_splat.uses_rage ? werewolf_splat.rage : 5 - var/successes = SSroll.storyteller_roll(living_owner.st_get_stat(STAT_INTELLIGENCE) + living_owner.st_get_stat(STAT_EMPATHY), difficulty, owner, TRUE) + var/successes = SSroll.storyteller_roll_stats(list(STAT_INTELLIGENCE, STAT_EMPATHY), 0, difficulty, owner, TRUE) var/mob/living/living_target = target living_target.heal_storyteller_health(successes, TRUE, TRUE, TRUE) From f0b6dc11a7465a59063566e2d63703116748514f Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 20 Feb 2026 19:13:44 -0600 Subject: [PATCH 12/16] yea --- .../powers/code/discipline/animalism.dm | 2 +- .../code/gifts/auspices/ahroun.dm | 6 ++--- .../code/gifts/auspices/galliard.dm | 22 +++++-------------- .../code/gifts/auspices/theurge.dm | 1 - .../werewolf_the_apocalypse/code/totems.dm | 2 +- 5 files changed, 10 insertions(+), 23 deletions(-) diff --git a/modular_darkpack/modules/powers/code/discipline/animalism.dm b/modular_darkpack/modules/powers/code/discipline/animalism.dm index d9baea2fa6e6..bbb2c5081d21 100644 --- a/modular_darkpack/modules/powers/code/discipline/animalism.dm +++ b/modular_darkpack/modules/powers/code/discipline/animalism.dm @@ -7,7 +7,7 @@ /datum/discipline_power/animalism name = "Animalism power name" desc = "Animalism power description" - effect_sound = 'modular_darkpack/modules/deprecated/sounds/wolves.ogg' + effect_sound = 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/wolves.ogg' /datum/discipline_power/animalism/activate() . = ..() diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm index b4cf02b00d99..8460d0df2652 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm @@ -54,7 +54,7 @@ /datum/action/cooldown/power/gift/inspiration/Activate(atom/target) . = ..() - playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/inspiration.ogg', 75, FALSE) + playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/inspiration.ogg', 75, FALSE) owner.emote("scream") for(var/mob/living/nearby_guy in oviewers(7, owner)) nearby_guy.apply_status_effect(/datum/status_effect/inspiration) @@ -93,7 +93,7 @@ /datum/action/cooldown/power/gift/razor_claws/Activate(atom/target) to_chat(owner, span_notice("You feel your claws sharpening...")) - playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/razor_claws.ogg', 75, FALSE) + playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/razor_claws.ogg', 75, FALSE) if(!do_after(owner, 1 TURNS)) return . = ..() @@ -109,7 +109,7 @@ /datum/status_effect/razor_claws/on_apply() . = ..() - playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/razor_claws.ogg', 75, FALSE) + playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/razor_claws.ogg', 75, FALSE) ADD_TRAIT(owner, TRAIT_RAZOR_CLAWS, GIFT_TRAIT) /datum/status_effect/razor_claws/on_remove() diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/galliard.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/galliard.dm index b5a50cb1f11d..ed98f76e4f94 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/galliard.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/galliard.dm @@ -1,4 +1,3 @@ -/* /datum/action/cooldown/power/gift/beast_speech name = "Beast Speech" desc = "The werewolf with this Gift may communicate with any animals from fish to mammals." @@ -7,24 +6,13 @@ rage_req = 1 //gnosis_req = 1 +// Extreamly TTRPG innacurate. /datum/action/cooldown/power/gift/beast_speech/Activate(atom/target) . = ..() - if(allowed_to_proceed) - var/mob/living/carbon/C = owner - if(length(C.beastmaster) > 3) - var/mob/living/simple_animal/hostile/beastmaster/B = pick(C.beastmaster) - qdel(B) - playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/wolves.ogg', 75, FALSE) - if(!length(C.beastmaster)) - var/datum/action/beastmaster_stay/E1 = new() - E1.Grant(C) - var/datum/action/beastmaster_deaggro/E2 = new() - E2.Grant(C) - var/mob/living/simple_animal/hostile/beastmaster/D = new(get_turf(C)) - D.my_creator = C - C.beastmaster |= D - D.beastmaster = C -*/ + + var/mob/living/carbon/human/human_owner = astype(owner) + playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/wolves.ogg', 75, FALSE) + human_owner?.add_beastmaster_minion(/mob/living/basic/pet/dog/darkpack/summoned) /* /datum/action/cooldown/power/gift/call_of_the_wyld diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm index 2564f06090ce..c528bad9c4c3 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm @@ -27,7 +27,6 @@ the scar is received and an extra Gnosis point is spent. . = ..() - var/mob/living/living_owner = owner var/datum/splat/werewolf/werewolf_splat = iswerewolfsplat(owner) var/difficulty = werewolf_splat.uses_rage ? werewolf_splat.rage : 5 var/successes = SSroll.storyteller_roll_stats(list(STAT_INTELLIGENCE, STAT_EMPATHY), 0, difficulty, owner, TRUE) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm index 5566401817ef..8328661545ae 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm @@ -119,7 +119,7 @@ shifter_splat.adjust_rage(1, FALSE) else to_chat(human, span_boldnotice("YOUR TOTEM IS RESTORED")) - SEND_SOUND(human, sound('modular_darkpack/modules/werewolf_the_apocalypse/sounds/inspire.ogg', volume = 50)) + SEND_SOUND(human, sound('modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/inspire.ogg', volume = 50)) shifter_splat.adjust_gnosis(1, FALSE) /obj/structure/werewolf_totem/attack_hand(mob/living/user, list/modifiers) From d4bd7bb029cadb5d7a196e38f9ca8d92c9e28b0d Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 20 Feb 2026 19:37:24 -0600 Subject: [PATCH 13/16] copying some code from discs! --- .../modules/splats/code/powers/_power.dm | 33 +++++++++++---- .../code/gifts/_gift.dm | 41 +++++++++++-------- .../code/gifts/auspices/ahroun.dm | 4 +- .../code/gifts/auspices/galliard.dm | 8 ++-- .../code/gifts/auspices/philodox.dm | 2 +- .../code/gifts/auspices/ragabash.dm | 4 +- .../code/gifts/auspices/theurge.dm | 4 +- .../code/gifts/innate/howling.dm | 2 +- .../code/gifts/tribes/tribes.dm | 28 ++++++------- .../werewolf_the_apocalypse/code/old/gifts.dm | 2 +- 10 files changed, 75 insertions(+), 53 deletions(-) diff --git a/modular_darkpack/modules/splats/code/powers/_power.dm b/modular_darkpack/modules/splats/code/powers/_power.dm index c9f5698cbe8d..d99530edb81d 100644 --- a/modular_darkpack/modules/splats/code/powers/_power.dm +++ b/modular_darkpack/modules/splats/code/powers/_power.dm @@ -8,21 +8,38 @@ var/innate_ability = FALSE /// How much temporary willpower is required to use this ability - var/willpower_req = 0 + var/willpower_cost = 0 /datum/action/cooldown/power/IsAvailable(feedback) . = ..() - if(willpower_req && isliving(owner)) + if(!can_afford(feedback)) + return FALSE + +/datum/action/cooldown/power/Activate(atom/target) + . = ..() + + spend_resources() + + +/** + * Returns a boolean of if the caster can afford + * this power's cost cost. + */ +/datum/action/cooldown/power/proc/can_afford(feedback) + if(willpower_cost && isliving(owner)) var/mob/living/living_owner = owner - if(willpower_req > living_owner.st_get_stat(STAT_TEMPORARY_WILLPOWER)) + if(willpower_cost > living_owner.st_get_stat(STAT_TEMPORARY_WILLPOWER)) if(feedback) to_chat(owner, span_warning("You don't have enough willpower to do that!")) return FALSE + return TRUE -/datum/action/cooldown/power/Activate(atom/target) - . = ..() - - if(willpower_req && isliving(owner)) +/** + * Overridable proc handling the spending of resources (willpower/vitae/rage/etc) + * when casting the power. + */ +/datum/action/cooldown/power/proc/spend_resources() + if(willpower_cost && isliving(owner)) var/mob/living/living_owner = owner - living_owner.st_change_stat(STAT_TEMPORARY_WILLPOWER, -willpower_req) + living_owner.st_change_stat(STAT_TEMPORARY_WILLPOWER, -willpower_cost) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm index 51f10579e2be..95fa3ecad84b 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm @@ -9,54 +9,59 @@ var/default_activate_message = TRUE - var/rage_req = 0 - var/gnosis_req = 0 + var/rage_cost = 0 + var/gnosis_cost = 0 /datum/action/cooldown/power/gift/IsAvailable(feedback) . = ..() - if(!ishuman(owner)) - if(feedback) - owner.balloon_alert(owner, "not human!") - return FALSE - var/datum/splat/werewolf/casting_splat = iswerewolfsplat(owner) if(!casting_splat) if(feedback) owner.balloon_alert(owner, "not a gift user!") return FALSE +/datum/action/cooldown/power/gift/Activate(atom/target) + . = ..() + + if(default_activate_message) + to_chat(owner, span_notice("You activate the [name]...")) + +/datum/action/cooldown/power/gift/can_afford(feedback) + . = ..() + var/datum/splat/werewolf/casting_splat = iswerewolfsplat(owner) + if(get_rage_cost()) + if(!casting_splat) + return FALSE if(casting_splat.rage < get_rage_cost()) if(feedback) to_chat(owner, span_warning("You don't have enough RAGE to do that!")) SEND_SOUND(owner, sound('modular_darkpack/modules/werewolf_the_apocalypse/sounds/werewolf_cast_failed.ogg', volume = 50)) return FALSE - if(gnosis_req) - if(casting_splat.gnosis < gnosis_req) + if(gnosis_cost) + if(!casting_splat) + return FALSE + if(casting_splat.gnosis < gnosis_cost) if(feedback) to_chat(owner, span_warning("You don't have enough GNOSIS to do that!")) SEND_SOUND(owner, sound('modular_darkpack/modules/werewolf_the_apocalypse/sounds/werewolf_cast_failed.ogg', volume = 50)) return FALSE - -/datum/action/cooldown/power/gift/Activate(atom/target) +/datum/action/cooldown/power/gift/spend_resources() . = ..() - var/datum/splat/werewolf/casting_splat = iswerewolfsplat(owner) if(get_rage_cost()) - casting_splat.adjust_rage(-get_rage_cost(), owner, FALSE) + casting_splat?.adjust_rage(-get_rage_cost(), owner, FALSE) if(get_gnosis_cost()) - casting_splat.adjust_gnosis(-get_gnosis_cost(), owner, FALSE) + casting_splat?.adjust_gnosis(-get_gnosis_cost(), owner, FALSE) - if(default_activate_message) - to_chat(owner, span_notice("You activate the [name]...")) /datum/action/cooldown/power/gift/proc/get_rage_cost() - return rage_req + return rage_cost /datum/action/cooldown/power/gift/proc/get_gnosis_cost() - return gnosis_req + return gnosis_cost /atom/movable/screen/alert/status_effect/gift diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm index 8460d0df2652..72598ccee025 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm @@ -49,7 +49,7 @@ name = "Inspiration" desc = "The Garou with this Gift lends new resolve and righteous anger to his brethren." button_icon_state = "inspiration" - gnosis_req = 1 + gnosis_cost = 1 rank = 1 /datum/action/cooldown/power/gift/inspiration/Activate(atom/target) @@ -89,7 +89,7 @@ desc = "By raking his claws over stone, steel, or another hard surface, the Ahroun hones them to razor sharpness." button_icon_state = "razor_claws" rank = 1 - rage_req = 1 + rage_cost = 1 /datum/action/cooldown/power/gift/razor_claws/Activate(atom/target) to_chat(owner, span_notice("You feel your claws sharpening...")) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/galliard.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/galliard.dm index ed98f76e4f94..bb63ec39f78e 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/galliard.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/galliard.dm @@ -3,8 +3,8 @@ desc = "The werewolf with this Gift may communicate with any animals from fish to mammals." button_icon_state = "beast_speech" rank = 1 - rage_req = 1 - //gnosis_req = 1 + rage_cost = 1 + //gnosis_cost = 1 // Extreamly TTRPG innacurate. /datum/action/cooldown/power/gift/beast_speech/Activate(atom/target) @@ -19,7 +19,7 @@ name = "Call Of The Wyld" desc = "The werewolf may send her howl far beyond the normal range of hearing and imbue it with great emotion, stirring the hearts of fellow Garou and chilling the bones of all others." button_icon_state = "call_of_the_wyld" - rage_req = 1 + rage_cost = 1 rank = 1 /datum/action/cooldown/power/gift/call_of_the_wyld/Activate(atom/target) @@ -45,7 +45,7 @@ desc = "By invoking the power of waking dreams, the Garou can place any chosen characters into silent communion." button_icon_state = "mindspeak" rank = 1 -// gnosis_req = 1 +// gnosis_cost = 1 /datum/action/cooldown/power/gift/mindspeak/Activate(atom/target) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm index 7e8d475acd7f..0b785813a5fe 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/philodox.dm @@ -4,7 +4,7 @@ desc = "Through force of will, the Philodox is able to ignore the pain of his wounds and continue acting normally." button_icon_state = "resist_pain" rank = 1 - willpower_req = 1 + willpower_cost = 1 /datum/action/cooldown/power/gift/resist_pain/Activate(atom/target) . = ..() diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm index 90b084154f97..4881dc8a2595 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm @@ -48,7 +48,7 @@ button_icon_state = "infectious_laughter" rank = 1 // I dont acctually see anything in the book that is causes rage. - // rage_req = 1 + // rage_cost = 1 var/last_spoken_message var/when_spoken = 0 @@ -112,7 +112,7 @@ button_icon_state = "open_seal" click_to_activate = TRUE rank = 1 - gnosis_req = 1 + gnosis_cost = 1 /datum/action/cooldown/power/gift/open_seal/Activate(atom/target) . = ..() diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm index c528bad9c4c3..2b4c9e214ef8 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm @@ -16,8 +16,8 @@ the scar is received and an extra Gnosis point is spent. click_to_activate = TRUE rank = 1 - //rage_req = 1 - gnosis_req = 1 + //rage_cost = 1 + gnosis_cost = 1 /datum/action/cooldown/power/gift/mothers_touch/Activate(atom/target) if(!isliving(target)) 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 48d5825028fe..d495238fde35 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 @@ -2,7 +2,7 @@ name = "Howl" desc = "The werewolf may send her howl far beyond the normal range of hearing and communicate a single word or concept to all other Garou across the city." button_icon_state = "call_of_the_wyld" - rage_req = 1 + rage_cost = 1 check_flags = null innate_ability = TRUE var/static/list/howls = list( 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 index 1631ca4d5904..c25f2f664c73 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/tribes.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/tribes.dm @@ -2,8 +2,8 @@ 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_req = 2 - gnosis_req = 1 + rage_cost = 2 + gnosis_cost = 1 /datum/action/cooldown/power/gift/stoic_pose/Trigger() . = ..() @@ -51,8 +51,8 @@ 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_req = 1 - //gnosis_req = 1 + rage_cost = 1 + //gnosis_cost = 1 /datum/action/cooldown/power/gift/freezing_wind/Trigger() . = ..() @@ -71,8 +71,8 @@ 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_req = 2 - gnosis_req = 1 + rage_cost = 2 + gnosis_cost = 1 /datum/action/cooldown/power/gift/bloody_feast/Trigger() . = ..() @@ -105,7 +105,7 @@ name = "Venom Claws" desc = "While this ability is active, strikes with claws poison foes of garou." button_icon_state = "venom_claws" - rage_req = 1 + rage_cost = 1 /datum/action/cooldown/power/gift/venom_claws/Trigger() . = ..() @@ -139,8 +139,8 @@ name = "Burning Scars" desc = "Garou creates an aura of very hot air, which burns everyone around." button_icon_state = "burning_scars" - rage_req = 2 - gnosis_req = 1 + rage_cost = 2 + gnosis_cost = 1 /datum/action/cooldown/power/gift/burning_scars/Trigger() . = ..() @@ -158,7 +158,7 @@ name = "Smooth Move" desc = "Garou jumps forward, avoiding every damage for a moment." button_icon_state = "smooth_move" - //rage_req = 1 somewhat useless gift with MMB pounce + //rage_cost = 1 somewhat useless gift with MMB pounce /datum/action/cooldown/power/gift/smooth_move/Trigger() . = ..() @@ -177,8 +177,8 @@ name = "Digital Feelings" desc = "Every technology creates an electrical strike, which hits garou's enemies." button_icon_state = "digital_feelings" - rage_req = 2 - gnosis_req = 1 + rage_cost = 2 + gnosis_cost = 1 /datum/action/cooldown/power/gift/digital_feelings/Trigger() . = ..() @@ -194,8 +194,8 @@ 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_req = 2 - gnosis_req = 1 + rage_cost = 2 + gnosis_cost = 1 /datum/action/cooldown/power/gift/elemental_improvement/Trigger() . = ..() diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/old/gifts.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/old/gifts.dm index 85af6949c2e7..0d5bd0396e56 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/old/gifts.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/old/gifts.dm @@ -2,7 +2,7 @@ name = "Rage Heal" desc = "This Gift allows the Garou to heal severe injuries with rage." button_icon_state = "rage_heal" - rage_req = 1 + rage_cost = 1 check_flags = null /datum/action/cooldown/power/gift/rage_heal/Activate(atom/target) From 1ab11370ee7e32d67916f2c7c985bffa83a403a8 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 20 Feb 2026 19:40:54 -0600 Subject: [PATCH 14/16] ugh. gilliard are really ttrpg innacurate rn --- .../code/gifts/auspices/galliard.dm | 19 ++++++------------- .../code/subsplats/auspices/garou.dm | 4 ++-- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/galliard.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/galliard.dm index bb63ec39f78e..cee2f18394e9 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/galliard.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/galliard.dm @@ -14,7 +14,6 @@ playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/wolves.ogg', 75, FALSE) human_owner?.add_beastmaster_minion(/mob/living/basic/pet/dog/darkpack/summoned) -/* /datum/action/cooldown/power/gift/call_of_the_wyld name = "Call Of The Wyld" desc = "The werewolf may send her howl far beyond the normal range of hearing and imbue it with great emotion, stirring the hearts of fellow Garou and chilling the bones of all others." @@ -25,19 +24,13 @@ /datum/action/cooldown/power/gift/call_of_the_wyld/Activate(atom/target) . = ..() - if(!ishuman(owner)) - return - var/mob/living/carbon/human/human_owner = owner - if(allowed_to_proceed) - var/mob/living/carbon/C = owner - C.emote("howl") - for(var/mob/living/carbon/A in orange(6, owner)) - if(isgarou(A) || iswerewolf(A)) - A.emote("howl") - spawn(1 SECONDS) - adjust_gnosis(1, A, TRUE) + owner.emote("howl") + for(var/mob/living/carbon/humna/guy in orange(7, owner)) + var/datum/splat/werewolf/werewolf_splat = iswerewolfsplat(guy) + if(werewolf_splat) + guy.emote("howl") + werewolf_splat.adjust_gnosis(1) // awo1 -*/ // Very inaccurate right now /datum/action/cooldown/power/gift/mindspeak diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm index f196265fc459..e43fa49cdae7 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/auspices/garou.dm @@ -36,8 +36,8 @@ desc = "Where the Philodox is stoic, the Galliard is a creature of unbridled passion. The Gibbous Moon is a fiery muse, and stirs its children into great heights and depths of emotion. While all Galliards are prone to immense mirth and immense melancholy, those born under a waning moon fall more readily into dark, consuming passions; they are the tragedians of the Garou, mastering tales of doom, ruin, sacrifice and loss. Conversely, their waxing-moon cousins sing of triumph and conquest, of the pounding heart and the love of life. They tend to be the soul of their pack's morale - when the Galliard is willing to go on, so too are all the others." start_rage = 4 gifts_provided = list( - // /datum/action/cooldown/power/gift/beast_speech, - // /datum/action/cooldown/power/gift/call_of_the_wyld, + /datum/action/cooldown/power/gift/beast_speech, + /datum/action/cooldown/power/gift/call_of_the_wyld, /datum/action/cooldown/power/gift/mindspeak ) moons_born_under = list(MOON_WAXING_GIBBOUS, MOON_WANING_GIBBOUS) From 4785806e6029c795bbb06e49d40ff173c74719fe Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 20 Feb 2026 19:43:55 -0600 Subject: [PATCH 15/16] yea --- .../werewolf_the_apocalypse/code/gifts/auspices/galliard.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/galliard.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/galliard.dm index cee2f18394e9..11797387513f 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/galliard.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/galliard.dm @@ -11,9 +11,10 @@ . = ..() var/mob/living/carbon/human/human_owner = astype(owner) - playsound(get_turf(owner), 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/wolves.ogg', 75, FALSE) + playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/wolves.ogg', 75, FALSE) human_owner?.add_beastmaster_minion(/mob/living/basic/pet/dog/darkpack/summoned) + /datum/action/cooldown/power/gift/call_of_the_wyld name = "Call Of The Wyld" desc = "The werewolf may send her howl far beyond the normal range of hearing and imbue it with great emotion, stirring the hearts of fellow Garou and chilling the bones of all others." @@ -25,13 +26,14 @@ . = ..() owner.emote("howl") - for(var/mob/living/carbon/humna/guy in orange(7, owner)) + for(var/mob/living/carbon/human/guy in orange(7, owner)) var/datum/splat/werewolf/werewolf_splat = iswerewolfsplat(guy) if(werewolf_splat) guy.emote("howl") werewolf_splat.adjust_gnosis(1) // awo1 + // Very inaccurate right now /datum/action/cooldown/power/gift/mindspeak name = "Mindspeak" From 2d3638a74c8e3f411a935ce6468cbf33f93e2512 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Thu, 19 Feb 2026 23:15:47 -0600 Subject: [PATCH 16/16] ye --- .../code/gifts/auspices/ahroun.dm | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm index 5422173bfc98..191b6987b6fb 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ahroun.dm @@ -43,3 +43,83 @@ StartCooldown() return TRUE + + +/datum/action/cooldown/power/gift/inspiration + name = "Inspiration" + desc = "The Garou with this Gift lends new resolve and righteous anger to his brethren." + button_icon_state = "inspiration" + gnosis_req = 1 + rank = 1 + +/datum/action/cooldown/power/gift/inspiration/Activate(atom/target) + . = ..() + playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/inspiration.ogg', 75, FALSE) + owner.emote("scream") + for(var/mob/living/nearby_guy in oviewers(7, owner)) + nearby_guy.apply_status_effect(/datum/status_effect/inspiration) + +/datum/status_effect/inspiration + id = "inspiration" + duration = 1 SCENES + status_type = STATUS_EFFECT_REPLACE + alert_type = /atom/movable/screen/alert/status_effect/inspiration + +/datum/status_effect/inspiration/on_apply() + . = ..() + if(isliving(owner)) + var/mob/living/living_owner = owner + living_owner.st_change_stat(STAT_TEMPORARY_WILLPOWER, 1) + +/datum/status_effect/inspiration/on_remove() + if(isliving(owner)) + var/mob/living/living_owner = owner + // Ugh. We really dont have a way to represent or register the spending of a temporary temp willpoint.... + living_owner.st_change_stat(STAT_TEMPORARY_WILLPOWER, -1) + return ..() + +/atom/movable/screen/alert/status_effect/inspiration + name = "Inspiration" + desc = "You have an extra temporary willpower for one scene!" + icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi' + icon_state = "inspiration" + + +/datum/action/cooldown/power/gift/razor_claws + name = "Razor Claws" + desc = "By raking his claws over stone, steel, or another hard surface, the Ahroun hones them to razor sharpness." + button_icon_state = "razor_claws" + rank = 1 + rage_req = 1 + +/datum/action/cooldown/power/gift/razor_claws/Activate(atom/target) + to_chat(owner, span_notice("You feel your claws sharpening...")) + playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/razor_claws.ogg', 75, FALSE) + if(!do_after(owner, 1 TURNS)) + return + var/mob/living/living_owner = astype(owner) + living_owner?.apply_status_effect(/datum/status_effect/razor_claws) + . = ..() + +// DARKPACK TODO - Requires https://github.com/DarkPack13/SecondCity/pull/680 for its stat handling. +/datum/status_effect/razor_claws + id = "razor claws" + duration = 1 SCENES + status_type = STATUS_EFFECT_REPLACE + alert_type = /atom/movable/screen/alert/status_effect/razor_claws + +/datum/status_effect/razor_claws/on_apply() + . = ..() + playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/razor_claws.ogg', 75, FALSE) + ADD_TRAIT(owner, TRAIT_RAZOR_CLAWS, GIFT_TRAIT) + +/datum/status_effect/razor_claws/on_remove() + REMOVE_TRAIT(owner, TRAIT_RAZOR_CLAWS, GIFT_TRAIT) + to_chat(owner, span_warning("Your claws are not sharp anymore...")) + return ..() + +/atom/movable/screen/alert/status_effect/razor_claws + name = "Razor Claws" + desc = "Your claws do extra damage." + icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi' + icon_state = "razor_claws"