-
Notifications
You must be signed in to change notification settings - Fork 58
Tribe gifts: Part 1 #715
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Tribe gifts: Part 1 #715
Changes from all commits
12c8a34
eca2b46
0f1f4e3
b8d8d1e
c1726cf
992b86a
e6b3f0a
87d3767
217029c
490124b
0493aff
f0b6dc1
d4bd7bb
1ab1137
4785806
9779dda
1429477
0092432
0a1009f
e02c84c
445bc49
070d427
7652a5f
00d9335
97b5547
5982e2b
8bd6b78
200ea49
8879ed7
cee410c
0f31880
5a3f727
3e51607
37dcb9a
3f712df
115b7b8
17a8f3f
136f8a1
4de46af
739918d
34eca4e
5280fbe
a430610
45d5790
dde65c2
98b678f
5eb5fb8
f352edc
50a807c
96cb5f3
9356fcf
98c2b04
60593c9
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| 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 = get_werewolf_splat(caster) | ||
| var/roll_difficulty = get_werewolf_splat(target) ? 5 : 6 | ||
|
|
||
| var/datum/storyteller_roll/roll_datum = new() | ||
| roll_datum.difficulty = roll_difficulty | ||
| var/roll_result = roll_datum.st_roll(caster, target, casting_splat.gnosis) | ||
|
|
||
| if(roll_result != ROLL_SUCCESS) | ||
| return | ||
|
|
||
| victim.apply_status_effect(/datum/status_effect/breath_of_the_wyld) | ||
|
|
||
| StartCooldown() | ||
| return TRUE | ||
|
|
||
| /datum/status_effect/breath_of_the_wyld | ||
| id = "breath_of_the_wyld" | ||
| duration = 1 SCENES | ||
|
|
||
| status_type = STATUS_EFFECT_REPLACE | ||
|
|
||
| alert_type = /atom/movable/screen/alert/status_effect/breath_of_the_wyld | ||
|
|
||
| /datum/status_effect/breath_of_the_wyld/on_apply() | ||
| owner.st_add_stat_mod(STAT_PERCEPTION, 1, type) | ||
| owner.st_add_stat_mod(STAT_INTELLIGENCE, 1, type) | ||
| owner.st_add_stat_mod(STAT_WITS, 1, type) | ||
|
Comment on lines
+55
to
+57
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. im assuming type is just the typepath? shouldnt sources be defines? i think i remember that being a comment on one of my prs |
||
| 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 | ||
|
Comment on lines
+86
to
+92
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. is the roll numerical = true? also ditto with previous thingy |
||
|
|
||
| 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 = get_werewolf_splat(owner) | ||
| var/datum/splat/werewolf/guy_splat | ||
| var/datum/storyteller_roll/visage_of_fenris/roll_datum = new() | ||
| var/successes = roll_datum.st_roll(owner) | ||
|
|
||
| var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(owner.loc, owner) | ||
| animate(D, alpha = 0, color = COLOR_RED, transform = matrix()*2, time = 3) | ||
|
|
||
| playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/visage_of_fenris.ogg', 75, FALSE) | ||
|
|
||
| for(var/mob/living/guy in viewers(world.view, owner)) | ||
| if(guy == owner) | ||
| continue | ||
|
|
||
| var/difference = 0 | ||
| if(get_werewolf_splat(guy)) | ||
| guy_splat = get_werewolf_splat(guy) | ||
| if(guy_splat && (our_splat.renown_rank < guy_splat.renown_rank)) | ||
| difference = guy_splat.renown_rank-our_splat.renown_rank | ||
| if(successes && (successes >= difference*2)) | ||
| guy.apply_status_effect(/datum/status_effect/visage_of_fenris) | ||
|
|
||
| StartCooldown() | ||
| return TRUE | ||
|
|
||
| /datum/status_effect/visage_of_fenris | ||
| id = "visage_of_fenris" | ||
| duration = 6 TURNS // Nonstandard amount of time but 3 minutes of slowdown sucks. | ||
|
|
||
| status_type = STATUS_EFFECT_REPLACE | ||
|
|
||
| alert_type = /atom/movable/screen/alert/status_effect/visage_of_fenris | ||
|
|
||
| /datum/status_effect/visage_of_fenris/on_apply() // TODO: make this a signal handler that turns the slowdown off when can't see the get for N seconds | ||
| owner.add_movespeed_modifier(/datum/movespeed_modifier/visage_of_fenris) | ||
| to_chat(owner, span_userdanger("You are consumed with terror, rooting you to the spot!")) | ||
|
|
||
| if(prob(50)) | ||
| owner.emote("gasp") | ||
| else | ||
| owner.emote("scream") | ||
|
|
||
| return TRUE | ||
|
|
||
| /datum/status_effect/visage_of_fenris/on_remove() | ||
| owner.remove_movespeed_modifier(/datum/movespeed_modifier/visage_of_fenris) | ||
|
|
||
| /atom/movable/screen/alert/status_effect/visage_of_fenris | ||
| name = "Visage of Fenris" | ||
| desc = "You are consumed with terror, rooting you to the spot!" | ||
| icon = 'modular_darkpack/modules/deprecated/icons/hud/screen_alert.dmi' | ||
| icon_state = "fear" // TODO: get an icon for this |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
maybe a nitpick since i think abby said new()'ing a new datum every time isnt that cost heavy, but to make things cleaner i would suggest storing the datum on the action, then checking if it exists here, and if it doesn't, new() it, so that u only ever create the new datum once, if that makes sense