Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
12c8a34
ahroun ones
FalloutFalcon Feb 20, 2026
eca2b46
ye
FalloutFalcon Feb 20, 2026
0f1f4e3
ragabash stuf
FalloutFalcon Feb 20, 2026
b8d8d1e
wibble
FalloutFalcon Feb 20, 2026
c1726cf
more stuff
FalloutFalcon Feb 20, 2026
992b86a
move code around
FalloutFalcon Feb 20, 2026
e6b3f0a
sense wyrm
FalloutFalcon Feb 20, 2026
87d3767
yea
FalloutFalcon Feb 20, 2026
217029c
spirit speech
FalloutFalcon Feb 20, 2026
490124b
philodox
FalloutFalcon Feb 21, 2026
0493aff
little helper tho the ssroll is still soft depricated?
FalloutFalcon Feb 21, 2026
f0b6dc1
yea
FalloutFalcon Feb 21, 2026
d4bd7bb
copying some code from discs!
FalloutFalcon Feb 21, 2026
1ab1137
ugh. gilliard are really ttrpg innacurate rn
FalloutFalcon Feb 21, 2026
4785806
yea
FalloutFalcon Feb 21, 2026
9779dda
Merge branch 'master' of https://github.com/DarkPack13/SecondCity int…
FalloutFalcon Feb 24, 2026
1429477
tea
FalloutFalcon Feb 24, 2026
0092432
yea
FalloutFalcon Feb 24, 2026
0a1009f
yea
FalloutFalcon Feb 24, 2026
e02c84c
yea
FalloutFalcon Feb 24, 2026
445bc49
black furies breath of the wyld and other organization
dwinters99 Feb 24, 2026
070d427
leftovers
dwinters99 Feb 24, 2026
7652a5f
not using this yet
dwinters99 Feb 24, 2026
00d9335
extraneous text
dwinters99 Feb 24, 2026
97b5547
abby
dwinters99 Feb 24, 2026
5982e2b
bone gnawer desperate strength
dwinters99 Feb 24, 2026
8bd6b78
abby hates me
dwinters99 Feb 24, 2026
200ea49
Merge branch 'master' into fallout-fallcon-plays
dwinters99 Feb 24, 2026
8879ed7
cleanup
dwinters99 Feb 24, 2026
cee410c
fianna faerie light
dwinters99 Feb 24, 2026
0f31880
Merge branch 'master' into fallout-fallcon-plays
dwinters99 Feb 25, 2026
5a3f727
better proc
FalloutFalcon Feb 25, 2026
3e51607
yea
FalloutFalcon Feb 25, 2026
37dcb9a
yea
FalloutFalcon Feb 25, 2026
3f712df
Merge branch 'master' of https://github.com/DarkPack13/SecondCity int…
FalloutFalcon Feb 25, 2026
115b7b8
Merge branch 'master' into fallout-fallcon-plays
dwinters99 Feb 28, 2026
17a8f3f
Merge remote-tracking branch 'Fallcon/rest-of-auspice-gifts' into fal…
dwinters99 Feb 28, 2026
136f8a1
idk how this happened
dwinters99 Mar 1, 2026
4de46af
Merge branch 'master' into fallout-fallcon-plays
dwinters99 Mar 5, 2026
739918d
Merge remote-tracking branch 'upstream/master' into fallout-fallcon-p…
dwinters99 Mar 6, 2026
34eca4e
desperate strenght sound and faerie light improvements
dwinters99 Mar 7, 2026
5280fbe
visage of fenris
dwinters99 Mar 7, 2026
a430610
todo
dwinters99 Mar 7, 2026
45d5790
Merge branch 'master' into fallout-fallcon-plays
dwinters99 Mar 9, 2026
dde65c2
icons and some other stuff
dwinters99 Mar 14, 2026
98b678f
visage of fenris audio (toad)
dwinters99 Mar 14, 2026
5eb5fb8
remove cooking until later
dwinters99 Mar 14, 2026
f352edc
Merge branch 'master' into fallout-fallcon-plays
dwinters99 Mar 14, 2026
50a807c
Merge branch 'master' into fallout-fallcon-plays
dwinters99 Mar 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,5 @@
//from base of living/CanAllowThrough(): (atom/movable/mover, border_dir)
#define COMSIG_LIVING_CAN_ALLOW_THROUGH "living_can_allow_through"
#define COMPONENT_LIVING_PASSABLE (1<<0)
//from /datum/storyteller_roll/proc/st_roll(), args are the roll datum and role output
#define COMSIG_LIVING_DICE_ROLLED "living_dice_rolled"
2 changes: 1 addition & 1 deletion code/__DEFINES/~darkpack/fera/fera.dm
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,4 @@ GLOBAL_LIST_INIT(garou_fur_colors, list(
"brown" = "brown"
))

#define STATUS_EFFECT_SILVER_BULLLET_STACKS /datum/status_effect/stacking/silver_bullets
#define STATUS_EFFECT_SILVER_BULLET_STACKS /datum/status_effect/stacking/silver_bullets
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@

LAZYADDASSOC(mobs_last_rolled, WEAKREF(roller), list(world.time, output))

SEND_SIGNAL(roller, COMSIG_LIVING_DICE_ROLLED, src, output)
return output


Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/* • Breath of the Wyld - W20 p.173
*
* Furies embrace the energy of creation, and they can share that passion with others.
* With this Gift, the Black Fury instills a feeling of vitality, life, and lucidity in another living being.
* It is taught by a servant of Pegasus.
*
* Roll Gnosis (difficulty 5 against Garou, Kinfolk; 6 otherwise).
* Success grants the recipient an additional die to all mental rolls for the rest of the scene.
* Also adds 1 to the difficulty of rage rolls made in this time.
*
* TODO: Rage check difficulty and audio. Use a horse sound.
*/

/datum/action/cooldown/power/gift/breath_of_the_wyld
name = "Breath of the Wyld"
desc = "The Fury instills a target with a rush of lucidity."
button_icon_state = "breath_of_the_wyld"
click_to_activate = TRUE
rank = 1

/datum/action/cooldown/power/gift/breath_of_the_wyld/Activate(atom/target)
if(!isliving(target))
return
if(!(target in range(1, owner)))
return

. = ..()

var/mob/living/victim = target
var/mob/living/caster = owner
var/datum/splat/werewolf/casting_splat = iswerewolfsplat(caster)
var/roll_difficulty = iswerewolfsplat(target) ? 5 : 6

var/datum/storyteller_roll/roll_datum = new()
roll_datum.difficulty = roll_difficulty
var/roll_result = roll_datum.st_roll(caster, target, casting_splat.gnosis)

if(roll_result != ROLL_SUCCESS)
return

victim.apply_status_effect(/datum/status_effect/breath_of_the_wyld)

StartCooldown()
return TRUE

/datum/status_effect/breath_of_the_wyld
id = "breath_of_the_wyld"
duration = 1 SCENES

status_type = STATUS_EFFECT_REPLACE

alert_type = /atom/movable/screen/alert/status_effect/breath_of_the_wyld

/datum/status_effect/breath_of_the_wyld/on_apply()
owner.st_add_stat_mod(STAT_PERCEPTION, 1, type)
owner.st_add_stat_mod(STAT_INTELLIGENCE, 1, type)
owner.st_add_stat_mod(STAT_WITS, 1, type)
to_chat(owner, span_notice("You feel a sense of heightened lucidity."))
return TRUE

/datum/status_effect/breath_of_the_wyld/on_remove()
owner.st_remove_stat_mod(STAT_PERCEPTION, type)
owner.st_remove_stat_mod(STAT_INTELLIGENCE, type)
owner.st_remove_stat_mod(STAT_WITS, type)
to_chat(owner, span_warning("Your mind settles, returning to it's normal state of lucidity."))

/atom/movable/screen/alert/status_effect/breath_of_the_wyld
name = "Breath of the Wyld"
desc = "Gain an additional die to all mental checks, but suffer a penalty to rage check difficulty." // TODO: rage difficulty code
icon = 'modular_darkpack/modules/deprecated/icons/hud/screen_alert.dmi'
icon_state = "riddle" // TODO: get an icon for this
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/* • Desperate Strength - W20 p.174
*
* The werewolf calls on desperate reserves for a sudden surge of strength. A badger-spirit teaches this Gift.
*
* Select a number 1-5 on a radial menu and add that much strength to the next strength roll. Take 10 brute damage per level of strength.
*
* TODO: audio. Include a badger sound.
*/
/datum/action/cooldown/power/gift/desperate_strength
name = "Desperate Strength"
desc = "Call on desperate reserves for a sudden surge of strength."
button_icon_state = "desperate_strength"
rank = 1

/datum/action/cooldown/power/gift/desperate_strength/IsAvailable(feedback)
. = ..()
if(owner.has_status_effect(/datum/status_effect/desperate_strength))
if(feedback)
to_chat(owner, span_warning("[name] cannot be used again right now."))
return FALSE

/datum/action/cooldown/power/gift/desperate_strength/Activate(atom/target)
var/mob/living/caster = owner
var/list/radial_menu_options = list(
"One" = icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/gifts/tribes/bone_gnawers.dmi', "radial_one"),
"Two" = icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/gifts/tribes/bone_gnawers.dmi', "radial_two"),
"Three" = icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/gifts/tribes/bone_gnawers.dmi', "radial_three"),
"Four" = icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/gifts/tribes/bone_gnawers.dmi', "radial_four"),
"Five" = icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/gifts/tribes/bone_gnawers.dmi', "radial_five"),
)

var/pick = show_radial_menu(owner, owner, radial_menu_options)
var/value

switch(pick)
if("One")
value = 1
if("Two")
value = 2
if("Three")
value = 3
if("Four")
value = 4
if("Five")
value = 5

if(!isnull(value))
caster.apply_status_effect(/datum/status_effect/desperate_strength, value)

/datum/status_effect/desperate_strength
id = "desperate_strength"
duration = STATUS_EFFECT_PERMANENT

status_type = STATUS_EFFECT_UNIQUE

alert_type = /atom/movable/screen/alert/status_effect/desperate_strength
/// Passed in by the gift's activate
var/value

/datum/status_effect/desperate_strength/on_creation(mob/living/owner, value)
src.value = value
return ..()

/datum/status_effect/desperate_strength/on_apply()
owner.st_add_stat_mod(STAT_STRENGTH, value, type)
to_chat(owner, span_userdanger("You feel stronger... at a cost."))
RegisterSignal(owner, COMSIG_LIVING_DICE_ROLLED, PROC_REF(on_dice_rolled))
playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/desperate_strength_activate.ogg', 75, FALSE)
return TRUE

/datum/status_effect/desperate_strength/proc/on_dice_rolled(mob/living/roller, datum/storyteller_roll/roll_datum, output)
SIGNAL_HANDLER

if(STAT_STRENGTH in roll_datum.applicable_stats)
qdel(src)

/datum/status_effect/desperate_strength/on_remove()
owner.adjust_brute_loss(value TTRPG_DAMAGE)
owner.st_remove_stat_mod(STAT_STRENGTH, type)
playsound(owner, 'sound/effects/magic/disintegrate.ogg', 50, FALSE)
to_chat(owner, span_warning("Your strength subsides, the pain of your wounds creeping back in..."))
UnregisterSignal(owner, COMSIG_LIVING_DICE_ROLLED)

/atom/movable/screen/alert/status_effect/desperate_strength
name = "Desperate Strength"
desc = "Your next roll will be made with bonus strength, at the penalty of bashing damage!"
icon = 'modular_darkpack/modules/deprecated/icons/hud/screen_alert.dmi'
icon_state = "riddle" // TODO: get an icon for this
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
/* • Faerie Light - W20 p.178-179
*
* The Fianna conjures a small, bobbing sphere of light. It’s no brighter than a torch,
* but that’s usually enough to light the werewolf’s way — or lead foes into an ambush.
* A marsh-spirit teaches this Gift.
*
* Roll Wits + Occult (PLACEHOLDER FOR Wits + Enigmas). On success, summon a light on the turf clicked on. If clicked on a mob,
* the light orbits the mob. When clicked on by the summoner, it orbits or de-orbits them. When clicked on by another, the light is dispelled.
* Lasts for 1 scene.
*
*/

/obj/effect/faerie_light // TODO: add an animate or something to make this gently bob up and down
name = "orb of light"
desc = "Happy to light your way."
icon = 'icons/obj/lighting.dmi' // TODO: or maybe a new icon that has that baked in?
icon_state = "orb"
light_system = OVERLAY_LIGHT
light_range = 4
light_power = 1.3
light_color = "#79f1ff"
light_flags = LIGHT_ATTACHED
layer = ABOVE_ALL_MOB_LAYER
plane = ABOVE_GAME_PLANE
var/mob/living/summoner

/obj/effect/faerie_light/Initialize(mapload)
. = ..()
register_context()

/obj/effect/faerie_light/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
. = ..()
if(user == summoner)
context[SCREENTIP_CONTEXT_LMB] = "[orbit_target ? "Dismiss" : "Beckon"]"
else
context[SCREENTIP_CONTEXT_LMB] = "Dispel"

context[SCREENTIP_CONTEXT_RMB] = "Dispel"

return CONTEXTUAL_SCREENTIP_SET

/obj/effect/faerie_light/attack_hand(mob/living/user, list/modifiers)
. = ..()
if(user != summoner)
to_chat(user, span_purple("You [ishuman(user) ? "wave your hand at" : "paw at"] [src], causing it to float away and disappear."))
animate(src, 1 SECONDS, alpha = 0)
QDEL_IN(src, 1.1 SECONDS)
return TRUE
else if(orbit_target)
to_chat(user, span_purple("You [ishuman(user) ? "wave your hand at" : "paw at"] [src], causing it to float away and remain still."))
orbit_target.orbiters.end_orbit(src)
animate(src, flags = ANIMATION_END_NOW)
return TRUE
else
to_chat(user, span_purple("You [ishuman(user) ? "wave your hand at" : "paw at"] [src], causing it to float over to you happily."))
orbit(user, 20)
return TRUE

/obj/effect/faerie_light/attack_hand_secondary(mob/living/user, list/modifiers)
. = ..()
to_chat(user, span_purple("You [ishuman(user) ? "wave your hand at" : "paw at"] [src], causing it to float away and disappear.")) // Don't have paws? Too bad.
animate(src, 1 SECONDS, alpha = 0)
QDEL_IN(src, 1.1 SECONDS)
return TRUE

/obj/effect/faerie_light/proc/timeout(time)
QDEL_IN(src, time)

/obj/effect/faerie_light/Destroy()
. = ..()
if(orbit_target)
orbit_target.orbiters.end_orbit(src)

/datum/action/cooldown/power/gift/faerie_light
name = "Faerie Light"
desc = "Create a bobbing mote of light to light your way or attract targets for an ambush."
button_icon_state = null // TODO: icon
click_to_activate = TRUE

rank = 1
cooldown_time = 1 TURNS

/datum/action/cooldown/power/gift/faerie_light/Activate(atom/target)
. = ..()

var/datum/storyteller_roll/roll_datum = new()
roll_datum.applicable_stats = list(STAT_WITS, STAT_OCCULT)
roll_datum.difficulty = 6
var/roll_result = roll_datum.st_roll(owner)

if(roll_result <= 0)
return FALSE

var/obj/effect/faerie_light/cool_guy = new /obj/effect/faerie_light(get_turf(target))
cool_guy.summoner = owner
cool_guy.alpha = 0
animate(cool_guy, 1 SECONDS, alpha = 255, easing = BOUNCE_EASING)

if(isliving(target))
cool_guy.orbit(target, 20)

cool_guy.timeout(1 SCENES)

playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/faerie_light_activate.ogg', 75, FALSE)

StartCooldown()
return TRUE
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
/* • Visage of Fenris - W20 p.180
*
* The Get appears larger and more fearsome, commanding respect from peers
* and cowing his foes. A wolf or toad spirit teaches this Gift.
*
* Simple slowdown AOE.
*
* TODO: distinguish between friend and foe for the -1 social check thing
*
* TODO: less placeholder sound
*/

/datum/storyteller_roll/visage_of_fenris
bumper_text = "Visage of Fenris"
applicable_stats = list(STAT_CHARISMA, STAT_INTIMIDATION)
numerical = TRUE
roll_output_type = ROLL_PUBLIC

/datum/movespeed_modifier/visage_of_fenris
multiplicative_slowdown = 0.75

/datum/action/cooldown/power/gift/visage_of_fenris
name = "Visage of Fenris"
desc = "Appear larger and more fearsome to your foes, rooting them to the spot in awe."
button_icon_state = "visage_of_fenris"
rank = 1
cooldown_time = 1 SCENES
var/list/affected = list()

/datum/action/cooldown/power/gift/visage_of_fenris/Activate(atom/target)
. = ..()
var/datum/splat/werewolf/our_splat = iswerewolfsplat(owner)
var/datum/splat/werewolf/guy_splat
var/datum/storyteller_roll/visage_of_fenris/roll_datum = new()
var/successes = roll_datum.st_roll(owner)

var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(owner.loc, owner)
animate(D, alpha = 0, color = COLOR_RED, transform = matrix()*2, time = 3)

playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/visage_of_fenris.ogg', 75, FALSE)

for(var/mob/living/guy in viewers(world.view, owner))
if(guy == owner)
continue

var/difference = 0
if(isshifter(guy))
guy_splat = iswerewolfsplat(guy)
if(guy_splat && (our_splat.renown_rank < guy_splat.renown_rank))
difference = guy_splat.renown_rank-our_splat.renown_rank
if(successes && (successes >= difference*2))
guy.apply_status_effect(/datum/status_effect/visage_of_fenris)

StartCooldown()
return TRUE

/datum/status_effect/visage_of_fenris
id = "visage_of_fenris"
duration = 6 TURNS // Nonstandard amount of time but 3 minutes of slowdown sucks.

status_type = STATUS_EFFECT_REPLACE

alert_type = /atom/movable/screen/alert/status_effect/visage_of_fenris

/datum/status_effect/visage_of_fenris/on_apply() // TODO: make this a signal handler that turns the slowdown off when can't see the get for N seconds
owner.add_movespeed_modifier(/datum/movespeed_modifier/visage_of_fenris)
to_chat(owner, span_userdanger("You are consumed with terror, rooting you to the spot!"))

if(prob(50))
owner.emote("gasp")
else
owner.emote("scream")

return TRUE

/datum/status_effect/visage_of_fenris/on_remove()
owner.remove_movespeed_modifier(/datum/movespeed_modifier/visage_of_fenris)

/atom/movable/screen/alert/status_effect/visage_of_fenris
name = "Visage of Fenris"
desc = "You are consumed with terror, rooting you to the spot!"
icon = 'modular_darkpack/modules/deprecated/icons/hud/screen_alert.dmi'
icon_state = "fear" // TODO: get an icon for this
Loading
Loading