diff --git a/code/__DEFINES/~darkpack/auras.dm b/code/__DEFINES/~darkpack/auras.dm index 663c4938eafb..960a2672f80a 100644 --- a/code/__DEFINES/~darkpack/auras.dm +++ b/code/__DEFINES/~darkpack/auras.dm @@ -21,6 +21,7 @@ #define AURA_SAD COLOR_SILVER // Silver #define AURA_SPIRITUAL COLOR_GOLD // Gold #define AURA_SUSPICIOUS COLOR_STRONG_BLUE // Dark Blue +#define AURA_CONFIDENCE COLOR_VIVID_YELLOW // Primarly for the Shadow Lords gift "Aura of Confidence" // Modifier auras. #define AURA_ANXIOUS "Anxious" // Auras appear scrambled like static or white noise @@ -65,7 +66,8 @@ GLOBAL_LIST_INIT(aura_list, sort_list(list( "Anxious" = AURA_ANXIOUS, "Confused" = AURA_CONFUSED, "Daydreaming" = AURA_DAYDREAMING, - "Psychotic" = AURA_PSYCHOTIC + "Psychotic" = AURA_PSYCHOTIC, + "Confidence" = AURA_CONFIDENCE, ))) GLOBAL_LIST_INIT(emotion_to_quality, sort_list(list( @@ -94,5 +96,6 @@ GLOBAL_LIST_INIT(emotion_to_quality, sort_list(list( "Anxious" = "anxiety", "Confused" = "confusion", "Daydreaming" = "absentmindedness", - "Psychotic" = "psychosis" + "Psychotic" = "psychosis", + "Confidence" = "confidence", ))) diff --git a/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm b/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm index 3a96936550da..d5d354bde07b 100644 --- a/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm @@ -7,5 +7,7 @@ //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 base of /datum/storyteller_roll/proc/st_roll(): (mob/living/roller, datum/storyteller_roll/roll_datum, output) +//from base of /datum/storyteller_roll/proc/st_roll(): (mob/living/roller, datum/storyteller_roll/roll_datum, atom/target) +#define COMSIG_LIVING_PRE_DICE_ROLLED "living_dice_rolled" +//from base of /datum/storyteller_roll/proc/st_roll(): (mob/living/roller, datum/storyteller_roll/roll_datum, atom/target, output) #define COMSIG_LIVING_DICE_ROLLED "living_dice_rolled" diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm index 3e7b57415af4..2ca69cc93471 100644 --- a/code/__DEFINES/~darkpack/traits/declarations.dm +++ b/code/__DEFINES/~darkpack/traits/declarations.dm @@ -144,6 +144,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai // Massivly boosts the range of your howl emote. #define TRAIT_LOUD_HOWLER "loud_howler" #define TRAIT_RAZOR_CLAWS "razor_claws" +#define TRAIT_JAMMING_WEAPONS "jamming_weapons" +#define TRAIT_NATURAL "natural" +#define TRAIT_AURA_OF_CONFIDENCE "aura_of_confidence" /// Sixth sense restricted to view range #define TRAIT_LOCAL_SIXTHSENSE "local_sixth_sense" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 4376a8acf4a0..ca75f3d12485 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -39,6 +39,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_UNHITTABLE_BY_LASERS" = TRAIT_UNHITTABLE_BY_LASERS, "TRAIT_UNLINKABLE_FISHING_SPOT" = TRAIT_UNLINKABLE_FISHING_SPOT, "TRAIT_TETHER_ATTACHED" = TRAIT_TETHER_ATTACHED, + "TRAIT_NATURAL" = TRAIT_NATURAL, // DARKPACK EDIT ADD - WEREWOLF ), /atom/movable = list( "TRAIT_ACTIVE_STORAGE" = TRAIT_ACTIVE_STORAGE, @@ -671,6 +672,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_BRAIN_TRAUMA_IMMUNITY" = TRAIT_BRAIN_TRAUMA_IMMUNITY, "TRAIT_NECROPOLIS_WORSHIP" = TRAIT_NECROPOLIS_WORSHIP, "TRAIT_ANIMAL_MUSK" = TRAIT_ANIMAL_MUSK, // DARKPACK EDIT ADD - MERITS/FLAWS + "TRAIT_AURA_OF_CONFIDENCE" = TRAIT_AURA_OF_CONFIDENCE, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_BETRAYERS_MARK" = TRAIT_BETRAYERS_MARK, // DARKPACK EDIT ADD - MERITS/FLAWS - (Tremere) "TRAIT_BLOODY_LOVER" = TRAIT_BLOODY_LOVER, // DARKPACK EDIT ADD "TRAIT_BLOODY_SUCKER" = TRAIT_BLOODY_SUCKER, // DARKPACK EDIT ADD @@ -695,8 +697,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_FORCED_EMOTION" = TRAIT_FORCED_EMOTION, // DARKPACK EDIT ADD - Melpominee "TRAIT_FRENETIC_AURA" = TRAIT_FRENETIC_AURA, // DARKPACK EDIT ADD "TRAIT_GHOST_VISION" = TRAIT_GHOST_VISION, // DARKPACK EDIT ADD - POWERS - (Necromancy) - "TRAIT_GULLET" = TRAIT_GULLET, // DARKPACK EDIT ADD "TRAIT_GRIP_OF_THE_DAMNED" = TRAIT_GRIP_OF_THE_DAMNED, // DARKPACK EDIT ADD + "TRAIT_GULLET" = TRAIT_GULLET, // DARKPACK EDIT ADD "TRAIT_HOMOSEXUAL" = TRAIT_HOMOSEXUAL, // DARKPACK EDIT ADD "TRAIT_HORRIFIC_APPEARANCE" = TRAIT_HORRIFIC_APPEARANCE, // DARKPACK EDIT ADD - Cappadocian Quirk "TRAIT_HUNGRY" = TRAIT_HUNGRY, // DARKPACK EDIT ADD @@ -705,6 +707,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_INVISIBLE_TO_CAMERA" = TRAIT_INVISIBLE_TO_CAMERA, // DARKPACK EDIT ADD "TRAIT_IN_FRENZY" = TRAIT_IN_FRENZY, // DARKPACK EDIT ADD "TRAIT_IRRESISTIBLE_VITAE" = TRAIT_IRRESISTIBLE_VITAE, // DARKPACK EDIT ADD + "TRAIT_JAMMING_WEAPONS" = TRAIT_JAMMING_WEAPONS, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_LAZY" = TRAIT_LAZY, // DARKPACK EDIT ADD "TRAIT_LIGHT_WEAKNESS" = TRAIT_LIGHT_WEAKNESS, // DARKPACK EDIT ADD - Setite Flaw "TRAIT_LOCAL_SIXTHSENSE" = TRAIT_LOCAL_SIXTHSENSE, // DARKPACK EDIT ADD @@ -740,8 +743,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_STAKED" = TRAIT_STAKED, // DARKPACK EDIT ADD "TRAIT_STAKE_IMMUNE" = TRAIT_STAKE_IMMUNE, // DARKPACK EDIT ADD "TRAIT_STAKE_RESISTANT" = TRAIT_STAKE_RESISTANT, // DARKPACK EDIT ADD - "TRAIT_THE_LARGEST_MAW" = TRAIT_THE_LARGEST_MAW, // DARKPACK EDIT ADD - MERITS/FLAWS "TRAIT_STILLNESS_OF_DEATH" = TRAIT_STILLNESS_OF_DEATH, // DARKPACK EDIT ADD - Gargoyle Quirk + "TRAIT_THE_LARGEST_MAW" = TRAIT_THE_LARGEST_MAW, // DARKPACK EDIT ADD - MERITS/FLAWS "TRAIT_TIMEWARPER" = TRAIT_TIMEWARPER, // DARKPACK EDIT ADD "TRAIT_TIME_SENSE" = TRAIT_TIME_SENSE, // DARKPACK EDIT ADD - MERITS/FLAWS "TRAIT_TORPOR" = TRAIT_TORPOR, // DARKPACK EDIT ADD diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index e7b28166c4f8..f784625b5ab3 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -9,6 +9,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_RUSTIMMUNE" = TRAIT_RUSTIMMUNE, "TRAIT_UNHITTABLE_BY_PROJECTILES" = TRAIT_UNHITTABLE_BY_PROJECTILES, "TRAIT_UNHITTABLE_BY_LASERS" = TRAIT_UNHITTABLE_BY_LASERS, + "TRAIT_NATURAL" = TRAIT_NATURAL, // DARKPACK EDIT ADD - WEREWOLF ), /atom/movable = list( "TRAIT_ASHSTORM_IMMUNE" = TRAIT_ASHSTORM_IMMUNE, @@ -363,6 +364,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_RIGHT_EYE_SCAR" = TRAIT_RIGHT_EYE_SCAR, "TRAIT_CARPOTOXIN_IMMUNE" = TRAIT_CARPOTOXIN_IMMUNE, "TRAIT_ANIMAL_MUSK" = TRAIT_ANIMAL_MUSK, // DARKPACK EDIT ADD - MERITS/FLAWS + "TRAIT_AURA_OF_CONFIDENCE" = TRAIT_AURA_OF_CONFIDENCE, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_BLOODY_LOVER" = TRAIT_BLOODY_LOVER, // DARKPACK EDIT ADD "TRAIT_BLOODY_SUCKER" = TRAIT_BLOODY_SUCKER, // DARKPACK EDIT ADD "TRAIT_BLUSH_OF_HEALTH" = TRAIT_BLUSH_OF_HEALTH, // DARKPACK EDIT ADD @@ -384,8 +386,8 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_FERA_RENOWN" = TRAIT_FERA_RENOWN, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_FRENETIC_AURA" = TRAIT_FRENETIC_AURA, // DARKPACK EDIT ADD "TRAIT_GHOST_VISION" = TRAIT_GHOST_VISION, // DARKPACK EDIT ADD - POWERS - (Necromancy) - "TRAIT_GULLET" = TRAIT_GULLET, // DARKPACK EDIT ADD "TRAIT_GRIP_OF_THE_DAMNED" = TRAIT_GRIP_OF_THE_DAMNED, // DARKPACK EDIT ADD + "TRAIT_GULLET" = TRAIT_GULLET, // DARKPACK EDIT ADD "TRAIT_HOMOSEXUAL" = TRAIT_HOMOSEXUAL, // DARKPACK EDIT ADD "TRAIT_HUNGRY" = TRAIT_HUNGRY, // DARKPACK EDIT ADD "TRAIT_HUNTED" = TRAIT_HUNTED, // DARKPACK EDIT ADD @@ -393,6 +395,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_INVISIBLE_TO_CAMERA" = TRAIT_INVISIBLE_TO_CAMERA, // DARKPACK EDIT ADD "TRAIT_IN_FRENZY" = TRAIT_IN_FRENZY, // DARKPACK EDIT ADD "TRAIT_IRRESISTIBLE_VITAE" = TRAIT_IRRESISTIBLE_VITAE, // DARKPACK EDIT ADD + "TRAIT_JAMMING_WEAPONS" = TRAIT_JAMMING_WEAPONS, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_LAZY" = TRAIT_LAZY, // DARKPACK EDIT ADD "TRAIT_LIGHT_WEAKNESS" = TRAIT_LIGHT_WEAKNESS, // DARKPACK EDIT ADD - Setite Flaw "TRAIT_LOCAL_SIXTHSENSE" = TRAIT_LOCAL_SIXTHSENSE, // DARKPACK EDIT ADD diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 618868072488..ae36b8552164 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -235,6 +235,11 @@ return FALSE var/final_force = CALCULATE_FORCE(src, attack_modifiers) + // DARKPACK EDIT ADD START - WEREWOLF + if(HAS_TRAIT(user, TRAIT_JAMMING_WEAPONS) && !HAS_TRAIT(src, TRAIT_NATURAL)) + to_chat(user, span_warning("[src] ineffectively jams or malfunctions!")) + return FALSE + // DARKPACK EDIT ADD END if(damtype != STAMINA && final_force && HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, span_warning("You don't want to harm other living beings!")) return FALSE @@ -288,6 +293,11 @@ user.changeNext_move(attack_speed) if(get(src, /mob/living) == user) // telekinesis. user.do_attack_animation(attacked_atom) + // DARKPACK EDIT ADD START - WEREWOLF + if(HAS_TRAIT(user, TRAIT_JAMMING_WEAPONS) && !HAS_TRAIT(src, TRAIT_NATURAL)) + to_chat(user, span_warning("[src] ineffectively jams or malfunctions!")) + return FALSE + // DARKPACK EDIT ADD END if(attacked_atom.attacked_by(src, user, modifiers, attack_modifiers) == ATTACK_FAILED) return TRUE SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, attacked_atom, user, modifiers, attack_modifiers) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 843f0fcb741c..938ae56c8c81 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -447,6 +447,11 @@ /obj/item/gun/can_trigger_gun(mob/living/user, akimbo_usage) . = ..() + // DARKPACK EDIT ADD START - WEREWOLF + if(HAS_TRAIT(user, TRAIT_JAMMING_WEAPONS) && !HAS_TRAIT(src, TRAIT_NATURAL)) + to_chat(user, span_warning("[src] ineffectively jams or malfunctions!")) + return FALSE + // DARKPACK EDIT ADD END if(!handle_pins(user)) return FALSE diff --git a/modular_darkpack/modules/doors/code/vampdoor.dm b/modular_darkpack/modules/doors/code/vampdoor.dm index 6ea11036e7a5..30450c7d57f4 100644 --- a/modular_darkpack/modules/doors/code/vampdoor.dm +++ b/modular_darkpack/modules/doors/code/vampdoor.dm @@ -360,10 +360,12 @@ /obj/structure/vampdoor/proc/toggle_lock(mob/living/user) playsound(src, lock_sound, 75, TRUE) if(!locked) - to_chat(user, span_notice("[src] is now locked.")) + if(user) + to_chat(user, span_notice("[src] is now locked.")) locked = TRUE else - to_chat(user, span_notice("[src] is now unlocked.")) + if(user) + to_chat(user, span_notice("[src] is now unlocked.")) proc_unlock("key") locked = FALSE return TRUE diff --git a/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm b/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm index 159f4b4a7acc..63b19c499dfd 100644 --- a/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm +++ b/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm @@ -65,6 +65,9 @@ /datum/component/aura/proc/update_emotions(mob/changed_mob, new_emotion) SIGNAL_HANDLER + if(HAS_TRAIT(changed_mob, TRAIT_AURA_OF_CONFIDENCE)) + new_emotion = "Confidence" + if(current_aura == new_emotion) return @@ -93,6 +96,10 @@ /datum/component/aura/proc/update_examine_message(mutable_appearance/aura_appearance) var/mob/parent_mob = parent + if(HAS_TRAIT(parent_mob, TRAIT_AURA_OF_CONFIDENCE)) + examine_message = "[parent_mob.p_Their()] aura is swamped in so much superiority nothing else can be made out." + return + switch(current_aura) if(AURA_AFRAID) examine_message = "[parent_mob.p_Their()] aura burns a bright orange, tense and flickering at the edges." @@ -205,6 +212,9 @@ holder.color = null var/mob/parent_mob = parent + if(HAS_TRAIT(parent_mob, TRAIT_AURA_OF_CONFIDENCE)) + return + if(output_color && has_pale_aura(parent_mob)) var/list/hsv_color_value = rgb2hsv(output_color) hsv_color_value[2] = hsv_color_value[2] * 0.7 // Reduce saturation for kindred @@ -263,6 +273,20 @@ aura_smoke_image.color = aura_appearance.color aura_smoke_image.alpha = 50 + var/matrix/smoke_transform = matrix() + smoke_transform.Scale(1, pick(1.25, 1.5)) + aura_smoke_image.transform = smoke_transform + + var/matrix/classic_aura_transform = matrix() + classic_aura_transform.Scale(pick(0.65, 0.75), 1) + aura_classic_image.transform = classic_aura_transform + + holder.vis_contents += aura_classic_image + holder.vis_contents += aura_smoke_image + + if(HAS_TRAIT(parent_mob, TRAIT_AURA_OF_CONFIDENCE)) + return + if(HAS_TRAIT(parent_mob, TRAIT_DIABLERIE)) var/mutable_appearance/diablerie_image = mutable_appearance('modular_darkpack/modules/powers/icons/auras.dmi', "diab", ABOVE_MOB_LAYER + 1, parent_mob, ABOVE_GAME_PLANE) holder.add_overlay(diablerie_image) @@ -289,17 +313,6 @@ if(isavatar(parent_mob) || isobserver(parent_mob)) holder.opacity = holder.opacity * 0.5 - var/matrix/smoke_transform = matrix() - smoke_transform.Scale(1, pick(1.25, 1.5)) - aura_smoke_image.transform = smoke_transform - - var/matrix/classic_aura_transform = matrix() - classic_aura_transform.Scale(pick(0.65, 0.75), 1) - aura_classic_image.transform = classic_aura_transform - - holder.vis_contents += aura_classic_image - holder.vis_contents += aura_smoke_image - /datum/component/aura/proc/update_aura_filters(mutable_appearance/aura_appearance, image/holder) remove_wibbly_filters(holder) diff --git a/modular_darkpack/modules/powers/code/discipline/protean/claws.dm b/modular_darkpack/modules/powers/code/discipline/protean/claws.dm index fb4799c83acf..0e6186356fc7 100644 --- a/modular_darkpack/modules/powers/code/discipline/protean/claws.dm +++ b/modular_darkpack/modules/powers/code/discipline/protean/claws.dm @@ -16,6 +16,7 @@ /obj/item/gangrel_claws/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_NATURAL, INNATE_TRAIT) /obj/item/gangrel_claws/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() diff --git a/modular_darkpack/modules/splats/code/powers/_power.dm b/modular_darkpack/modules/splats/code/powers/_power.dm index d99530edb81d..2b6a9942b956 100644 --- a/modular_darkpack/modules/splats/code/powers/_power.dm +++ b/modular_darkpack/modules/splats/code/powers/_power.dm @@ -7,6 +7,11 @@ /// 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 + /// If the power manually calls `StartCooldown`, otherwise handled by Activate + var/handles_cooldown = FALSE + /// If the power manually calls `spend_resources` itself, otherwise handled by Activate + var/handles_spend_resources = FALSE + /// How much temporary willpower is required to use this ability var/willpower_cost = 0 @@ -17,9 +22,11 @@ return FALSE /datum/action/cooldown/power/Activate(atom/target) - . = ..() + if(!handles_cooldown) + . = ..() - spend_resources() + if(!handles_spend_resources) + spend_resources() /** @@ -40,6 +47,9 @@ * when casting the power. */ /datum/action/cooldown/power/proc/spend_resources() + SHOULD_CALL_PARENT(TRUE) + if(willpower_cost && isliving(owner)) var/mob/living/living_owner = owner living_owner.st_change_stat(STAT_TEMPORARY_WILLPOWER, -willpower_cost) + to_chat(owner, span_warning("You burn [willpower_cost] willpower.")) diff --git a/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm b/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm index 861bec77bfd9..46394b28a349 100644 --- a/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm +++ b/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm @@ -49,6 +49,8 @@ var/dice_amount = calculate_used_dice(roller, bonus) + bonus += SEND_SIGNAL(roller, COMSIG_LIVING_PRE_DICE_ROLLED, src, target) + var/list/rolled_dice = roll_dice(dice_amount) var/first_line = "[span_tooltip(show_rolling_with(roller, bonus), "[dice_amount] dice")] vs. difficulty [difficulty]." @@ -85,7 +87,7 @@ LAZYADDASSOC(mobs_last_rolled, WEAKREF(roller), list(world.time, output)) - SEND_SIGNAL(roller, COMSIG_LIVING_DICE_ROLLED, src, output) + SEND_SIGNAL(roller, COMSIG_LIVING_DICE_ROLLED, src, target, output) return output 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 dddbe9be9d7c..dc5b3ff86fb0 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm @@ -10,8 +10,6 @@ check_flags = AB_CHECK_IMMOBILE|AB_CHECK_CONSCIOUS - var/default_activate_message = TRUE - var/rage_cost = 0 var/gnosis_cost = 0 @@ -24,12 +22,6 @@ 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 = get_werewolf_splat(owner) 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 20544f098885..1320746e034e 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 @@ -44,6 +44,7 @@ /datum/action/cooldown/power/gift/mindspeak/Activate(atom/target) + . = ..() var/input = tgui_input_text(usr, "What do you want to tell to your Tribe?", name, max_length = MAX_MESSAGE_LEN) if(!input || !IsAvailable(feedback = TRUE)) return 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 5c3254542873..cfff037659de 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 @@ -76,11 +76,11 @@ return FALSE /datum/action/cooldown/power/gift/infectious_laughter/Activate(atom/target) - . = ..() - if(!last_spoken_message || (when_spoken + 3 TURNS < world.time)) return + . = ..() + owner.emote("laugh") playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/infectious_laughter.ogg', 50, FALSE) var/list/hearers = oviewers(DEFAULT_MESSAGE_RANGE, 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 8de7741bae34..1f95156a9aa6 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 @@ -25,9 +25,9 @@ the scar is received and an extra Gnosis point is spent. /datum/action/cooldown/power/gift/mothers_touch/Activate(atom/target) if(!isliving(target)) - return + return FALSE if(!(target in range(1, owner))) - return + return FALSE . = ..() @@ -39,7 +39,6 @@ the scar is received and an extra Gnosis point is spent. living_target.heal_storyteller_health(successes, TRUE, TRUE, TRUE) SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) - StartCooldown() return TRUE /datum/action/cooldown/power/gift/sense_wyrm diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/black_spiral_dancer.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/black_spiral_dancer.dm deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/bone_gnawers.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/bone_gnawers.dm index 5782e5d09769..790a5b14ead1 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/bone_gnawers.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/bone_gnawers.dm @@ -20,6 +20,7 @@ return FALSE /datum/action/cooldown/power/gift/desperate_strength/Activate(atom/target) + . = ..() var/mob/living/caster = owner var/static/list/radial_menu_options = list( "One" = icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/gifts/tribes/bone_gnawers.dmi', "radial_one"), @@ -71,7 +72,7 @@ /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) + if(STAT_STRENGTH in roll_datum.using_stats(roller)) qdel(src) /datum/status_effect/desperate_strength/on_remove() diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/childrenofgaia.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/childrenofgaia.dm new file mode 100644 index 000000000000..948ad6bda837 --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/childrenofgaia.dm @@ -0,0 +1,57 @@ +/datum/storyteller_roll/gift/jam_weapon + bumper_text = "Jam Weapon" + applicable_stats = list(STAT_TEMPORARY_WILLPOWER) + numerical = TRUE + +/datum/action/cooldown/power/gift/jam_weapon + name = "Jam Weapon" + desc = "The Child may stop any Weaver-born weapons from working within the range of his voice." + button_icon_state = "jam_weapon" + rank = 1 + gnosis_cost = 1 + var/list/datum/weakref/jammed_mobs = list() + +/datum/action/cooldown/power/gift/jam_weapon/Activate(atom/target) + . = ..() + #warn could use better flavor/sounds + + // "The player rolls Willpower against a difficulty of highest Willpower of any armed individual within earshot. " + var/highest_willpower = 0 + for(var/mob/living/carbon/human/guy in orange(DEFAULT_MESSAGE_RANGE, owner)) + var/guy_willpower = guy.st_get_stat(STAT_TEMPORARY_WILLPOWER) + if(guy_willpower > highest_willpower) + highest_willpower = guy_willpower + + var/datum/storyteller_roll/gift/jam_weapon/jam_roll = new() + jam_roll.difficulty = highest_willpower + var/roll_result = jam_roll.st_roll(owner) + if(roll_result > 0) + for(var/mob/living/carbon/human/guy in range(DEFAULT_MESSAGE_RANGE, owner)) + guy.apply_status_effect(/datum/status_effect/jam_weapon, roll_result TURNS) + + +/datum/status_effect/jam_weapon + id = "jam_weapon" + duration = STATUS_EFFECT_PERMANENT + + status_type = STATUS_EFFECT_UNIQUE + + alert_type = /atom/movable/screen/alert/status_effect/gift/jam_weapon + +/datum/status_effect/jam_weapon/on_creation(mob/living/owner, duration) + src.duration = duration + return ..() + +/datum/status_effect/jam_weapon/on_apply() + . = ..() + ADD_TRAIT(owner, TRAIT_JAMMING_WEAPONS, GIFT_TRAIT) + +/datum/status_effect/jam_weapon/on_remove() + REMOVE_TRAIT(owner, TRAIT_JAMMING_WEAPONS, GIFT_TRAIT) + return ..() + + +/atom/movable/screen/alert/status_effect/gift/jam_weapon + name = /datum/action/cooldown/power/gift/jam_weapon::name + desc = /datum/action/cooldown/power/gift/jam_weapon::desc + overlay_state = /datum/action/cooldown/power/gift/jam_weapon::button_icon_state diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/fianna.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/fianna.dm index 43fe0083326f..6b3ba6cc5909 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/fianna.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/fianna.dm @@ -74,7 +74,7 @@ /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 + button_icon_state = "faerie_light" click_to_activate = TRUE rank = 1 diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/get_of_fenris.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/get_of_fenris.dm index 198c30aaced5..4a0644b788ba 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/get_of_fenris.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/get_of_fenris.dm @@ -10,11 +10,10 @@ * TODO: less placeholder sound */ -/datum/storyteller_roll/visage_of_fenris +/datum/storyteller_roll/gift/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 @@ -31,7 +30,7 @@ . = ..() var/datum/splat/werewolf/our_splat = get_werewolf_splat(owner) - var/datum/storyteller_roll/visage_of_fenris/roll_datum = new() + var/datum/storyteller_roll/gift/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) @@ -39,7 +38,7 @@ 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)) + for(var/mob/living/guy in viewers(DEFAULT_SIGHT_DISTANCE, owner)) if(guy == owner) continue diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/glasswalkers/control_machine.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/glasswalkers/control_machine.dm new file mode 100644 index 000000000000..aa985c11c329 --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/glasswalkers/control_machine.dm @@ -0,0 +1,277 @@ +/datum/storyteller_roll/gift/control_simple_machine + bumper_text = "Control Simple Machine" + applicable_stats = list(STAT_MANIPULATION, STAT_CRAFTS) + difficulty = 7 + +/datum/storyteller_roll/gift/control_complex_machine + bumper_text = "Control Complex Machine" + applicable_stats = list(STAT_MANIPULATION, STAT_SCIENCE) // or STAT_COMPUTER + + +/datum/action/cooldown/power/gift/control_machine + abstract_type = /datum/action/cooldown/power/gift/control_machine + + click_to_activate = TRUE + + handles_spend_resources = TRUE + willpower_cost = 1 + + var/roll_type + var/datum/storyteller_roll/roll_datum + var/is_complex = FALSE + + /// Stores the most recent target of the ability that succeeded + var/datum/weakref/last_target_ref + /// When the currently weakrefed target was first used. + var/first_target_use = 0 + + var/list/image/object_highlights + +/datum/action/cooldown/power/gift/control_machine/set_click_ability(mob/on_who) + . = ..() + if(!on_who.client) + return + + var/existing_target = last_target_ref?.resolve() + + // Movable cause i dont feel like checking EVERY EVERY atom. + for(var/atom/movable/nearby_atom in oview(on_who, DEFAULT_SIGHT_DISTANCE)) + if(!length(nearby_atom.get_control_machine_options(on_who, is_complex))) + continue + var/color = COLOR_BLUE_LIGHT + if(nearby_atom == existing_target) + color = COLOR_BLUE + + var/image/I = image(loc = nearby_atom) + I.appearance = nearby_atom.appearance + I.layer = nearby_atom.layer - 0.01 + I.pixel_y = 0 + I.pixel_x = 0 + I.pixel_w = 0 + I.pixel_z = 0 + + apply_wibbly_filters(I) + + I.add_filter("control_machine", 1, outline_filter(size = 1, color = color)) + + LAZYINITLIST(object_highlights) + on_who.client.images += I + object_highlights += I + + // SEND_SOUND(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/falling_touch.ogg') + +/datum/action/cooldown/power/gift/control_machine/unset_click_ability(mob/on_who, refund_cooldown = TRUE) + . = ..() + if(!on_who.client || !object_highlights) + return + for(var/image/I in object_highlights) + if(I in on_who.client.images) + on_who.client.images -= I + QDEL_LAZYLIST(object_highlights) + +/datum/action/cooldown/power/gift/control_machine/Activate(atom/target) + var/choices = target.get_control_machine_options(owner, is_complex) + if(!length(choices)) + return FALSE + + var/choice = show_radial_menu(owner, target, choices, autopick_single_option = FALSE) + if(!choice) + return + + . = ..() + + if(!roll_datum) + roll_datum = new roll_type() + + if(first_target_use + 1 SCENES < world.time) // Its been active for a whole scene. Clear it + last_target_ref = null + willpower_cost = 1 + + var/free_to_use = FALSE + + var/last_target = last_target_ref?.resolve() + if(last_target == target) + free_to_use = TRUE + willpower_cost = 0 + + if(free_to_use) + target.run_control_machine(owner, choice, is_complex) + else if(roll_datum.st_roll(owner, target) == ROLL_SUCCESS) + target.run_control_machine(owner, choice, is_complex) + last_target_ref = WEAKREF(target) + first_target_use = world.time + #warn could use better flavor/sounds + + spend_resources() + + return TRUE + + +/datum/action/cooldown/power/gift/control_machine/simple + name = "Control Simple Machine" + desc = "The Garou may command the spirits of the simplest machines, causing levers to flip, doors to unbolt, pulleys to roll, and so on." + #warn no icon + + rank = 1 + + roll_type = /datum/storyteller_roll/gift/control_simple_machine + +// DARKPACK TODO - (gifts past rank 1) +/datum/action/cooldown/power/gift/control_machine/complex + name = "Control Complex Machine" + desc = "Similar to Control Simple Machine, the Glass Walker may now converse with and command the spirits of electronic devices such as computers, smart phones, and cars." + + rank = 3 + + roll_type = /datum/storyteller_roll/gift/control_complex_machine + is_complex = TRUE + + +/atom/proc/get_control_machine_options(mob/living/user, is_complex = FALSE) + RETURN_TYPE(/list) + + . = list() + +/atom/proc/run_control_machine(mob/living/user, choice, is_complex = FALSE) + return + + +/obj/item/grenade/get_control_machine_options(mob/living/user, is_complex = FALSE) + . = ..() + .["prime"] = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_use") + +/obj/item/grenade/run_control_machine(mob/living/user, choice, is_complex = FALSE) + . = ..() + if(is_complex) + return + switch(choice) + if("prime") + arm_grenade() + + +/obj/item/lighter/get_control_machine_options(mob/living/user, is_complex = FALSE) + . = ..() + .["light"] = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_use") + +/obj/item/lighter/run_control_machine(mob/living/user, choice, is_complex = FALSE) + . = ..() + if(is_complex) + return + switch(choice) + if("light") + set_lit(!lit) + + +/* Breaks due to requirng a user really hard. +/obj/item/gun/get_control_machine_options(mob/living/user, is_complex = FALSE) + . = ..() + .["fire"] = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_use") + +/obj/item/gun/run_control_machine(mob/living/user, choice, is_complex = FALSE) + . = ..() + if(is_complex) + return + switch(choice) + if("fire") + process_fire(get_turf(src)) +*/ + + +/* +/obj/machinery/get_control_machine_options(mob/living/user, is_complex = FALSE) + . = ..() + .["unscrew"] = image(icon = 'icons/hud/radial.dmi', icon_state = "machine") + +/obj/machinery/run_control_machine(mob/living/user, choice, is_complex = FALSE) + . = ..() + if(is_complex) + return + switch(choice) + if("unscrew") + toggle_panel_open() + balloon_alert(user, "maintenance hatch [panel_open ? "opened" : "closed"]") +*/ + +/obj/machinery/light/get_control_machine_options(mob/living/user, is_complex = FALSE) + . = ..() + if(status != LIGHT_EMPTY) + .["unscrew"] = image(icon = 'icons/hud/radial.dmi', icon_state = "machine") + +/obj/machinery/light/run_control_machine(mob/living/user, choice, is_complex = FALSE) + . = ..() + if(is_complex) + return + switch(choice) + if("unscrew") + var/obj/item/light/bulb = drop_light_tube() + bulb?.shatter() + + +/obj/machinery/button/get_control_machine_options(mob/living/user, is_complex = FALSE) + . = ..() + .["flick"] = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_use") + +/obj/machinery/button/run_control_machine(mob/living/user, choice, is_complex = FALSE) + . = ..() + if(is_complex) + return + switch(choice) + if("flick") + attempt_press(user) + + +/obj/machinery/shower/get_control_machine_options(mob/living/user, is_complex = FALSE) + . = ..() + if(!is_complex) + .["turn"] = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_use") + +/obj/machinery/shower/run_control_machine(mob/living/user, choice, is_complex = FALSE) + . = ..() + if(is_complex) + return + switch(choice) + if("turn") + interact(user) + + +/obj/machinery/firealarm/get_control_machine_options(mob/living/user, is_complex = FALSE) + . = ..() + if(!is_complex) + .["flip"] = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_use") + +/obj/machinery/firealarm/run_control_machine(mob/living/user, choice, is_complex = FALSE) + . = ..() + if(is_complex) + return + switch(choice) + if("flip") + alarm(user) + + +/obj/vehicle/ridden/scooter/get_control_machine_options(mob/living/user, is_complex = FALSE) + . = ..() + if(!is_complex) + .["roll"] = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_rotate") + +/obj/vehicle/ridden/scooter/run_control_machine(mob/living/user, choice, is_complex = FALSE) + . = ..() + if(is_complex) + return + switch(choice) + if("roll") + step(src, dir) + + +/obj/structure/vampdoor/get_control_machine_options(mob/living/user, is_complex = FALSE) + . = ..() + if(!is_complex) + .["lock"] = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_rotate") + +/obj/structure/vampdoor/run_control_machine(mob/living/user, choice, is_complex = FALSE) + . = ..() + if(is_complex) + return + switch(choice) + if("lock") + if(!locked) + toggle_lock(user) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/glasswalkers/glasswalkers.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/glasswalkers/glasswalkers.dm new file mode 100644 index 000000000000..b89ef6e9f4d9 --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/glasswalkers/glasswalkers.dm @@ -0,0 +1,16 @@ +/* +/datum/action/cooldown/power/gift/hands_full_of_thunder + name = "Hands Full of Thunder" + desc = "Invoke the machine spirits to support you in these trying times. Abstain from needing bullets when you fire a gun." + button_icon_state = "hands_full_of_thunder" + rank = 2 + gnosis_cost = 1 + +/datum/action/cooldown/power/gift/hands_full_of_thunder/Activate(atom/target) + . = ..() + ADD_TRAIT(owner, TRAIT_THUNDERSHOT, "thunder") + to_chat(owner, span_notice("You feel your fingers tingling with electricity...!")) + spawn(1 SCENES) + REMOVE_TRAIT(owner, TRAIT_THUNDERSHOT, "thunder") + to_chat(owner, span_notice("The buzz in your fingertips ebbs...")) +*/ diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/redtalons.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/redtalons.dm new file mode 100644 index 000000000000..8a6a57b536b0 --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/redtalons.dm @@ -0,0 +1,54 @@ +/datum/storyteller_roll/gift/hidden_killer + bumper_text = "Hidden Killer" + applicable_stats = list(STAT_INTELLIGENCE, STAT_LARCENY) + +/datum/action/cooldown/power/gift/hidden_killer + name = "Hidden Killer" + desc = "The Red Talons didn't survive for so long without learning ways to conceal themselves. This Gift allows a werewolf to leave behind no physical evidence that would betray her hand (or claws, or teeth) in a slaying." + #warn no icon + + click_to_activate = TRUE + + rank = 1 + +/datum/action/cooldown/power/gift/hidden_killer/Activate(atom/target) + var/mob/living/carbon/human/human_owner = astype(owner) + var/mob/living/dead_guy = astype(target) + if(!dead_guy || dead_guy.stat != DEAD) + return FALSE + if(!(target in range(1, owner))) + return FALSE + + . = ..() + + // owner.visible_message("[src] presses a hand to [dead_guy]") + + var/datum/storyteller_roll/gift/hidden_killer/roll_datum = new() + var/roll_result = roll_datum.st_roll(owner) + + if(roll_result != ROLL_SUCCESS) + return TRUE + + var/list/owner_blood_dna = human_owner?.get_blood_dna_list() + var/full_print = md5(human_owner.dna.unique_identity) + + for(var/obj/effect/decal/cleanable/blood/blood_spot in range(12, owner)) + for(var/blood_dna in GET_ATOM_BLOOD_DNA(blood_spot)) + if(blood_dna in owner_blood_dna) + qdel(blood_spot) + break + + for(var/atom/nearby_atom in range(8, owner)) + var/datum/forensics/atom_forensics = nearby_atom.forensics + if(!atom_forensics) + continue + + for(var/fingerprint in atom_forensics.fingerprints) + if(fingerprint == full_print) + atom_forensics.fingerprints -= fingerprint + + for(var/bloodprint in atom_forensics.blood_DNA) + if(bloodprint in owner_blood_dna) + atom_forensics.blood_DNA -= bloodprint + + return TRUE diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/shadowlords.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/shadowlords.dm new file mode 100644 index 000000000000..898cee637e9a --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/shadowlords.dm @@ -0,0 +1,121 @@ +/datum/action/cooldown/power/gift/aura_of_confidence + name = "Aura of Confidence" + desc = "The werewolf projects an aura of superiority, preventing attempts to find flaws or read auras." + #warn no icon + // button_icon_state = "aura_of_confidence" + rank = 1 + +// Effect is permenent +/datum/action/cooldown/power/gift/aura_of_confidence/Grant(mob/granted_to) + . = ..() + ADD_TRAIT(granted_to, TRAIT_AURA_OF_CONFIDENCE, GIFT_TRAIT) + SEND_SIGNAL(granted_to, COMSIG_MOB_UPDATE_AURA) + +/datum/action/cooldown/power/gift/aura_of_confidence/Remove(mob/removed_from) + . = ..() + REMOVE_TRAIT(removed_from, TRAIT_AURA_OF_CONFIDENCE, GIFT_TRAIT) + SEND_SIGNAL(removed_from, COMSIG_MOB_UPDATE_AURA) + + + +/datum/storyteller_roll/gift/fatal_flaw + bumper_text = "Fatal Flaw" + applicable_stats = list(STAT_PERCEPTION, STAT_EMPATHY) + numerical = TRUE + + +/datum/action/cooldown/power/gift/fatal_flaw + name = "Fatal Flaw" + desc = "The Shadow Lord can spy a target's weakness, gaining an advantage in combat." + #warn no icon + // button_icon_state = "fatal_flaw" + rank = 1 + click_to_activate = TRUE + +/datum/action/cooldown/power/gift/fatal_flaw/Activate(atom/target) + var/mob/living/living_owner = astype(owner) + var/mob/living/living_target = astype(target) + if(!living_target || (living_target == owner)) + return FALSE + if(!(target in range(DEFAULT_SIGHT_DISTANCE, owner))) + return FALSE + + . = ..() + + if(!do_after(owner, 1 TURNS, timed_action_flags = (IGNORE_USER_LOC_CHANGE|IGNORE_HELD_ITEM))) + return TRUE + + var/datum/storyteller_roll/gift/fatal_flaw/roll_datum = new() + roll_datum.difficulty = living_target.st_get_stats(list(STAT_WITS, STAT_SUBTERFUGE)) + var/roll_result = roll_datum.st_roll(owner, target) + + if(roll_result <= 0) + return TRUE + + living_owner?.apply_status_effect(/datum/status_effect/fatal_flaw, target) + to_chat(owner, span_notice("You study [target] and discover a weakness granting you a bonus dice to attacks.")) + + return TRUE + + +/datum/status_effect/fatal_flaw + id = "fatal_flaw" + duration = 1 SCENES + + status_type = STATUS_EFFECT_REPLACE + + alert_type = /atom/movable/screen/alert/status_effect/gift/fatal_flaw + + var/datum/weakref/target_ref + var/image/highlight + +/datum/status_effect/fatal_flaw/on_creation(mob/living/new_owner, mob/living/target) + target_ref = WEAKREF(target) + . = ..() + +/datum/status_effect/fatal_flaw/on_apply() + RegisterSignal(owner, COMSIG_LIVING_PRE_DICE_ROLLED, PROC_REF(on_dice_rolled)) + + if(!owner?.client) + return + + var/mob/living/target = target_ref?.resolve() + + var/image/highlight = image(loc = target) + highlight.appearance = target.appearance + highlight.layer = target.layer - 0.01 + highlight.pixel_y = 0 + highlight.pixel_x = 0 + highlight.pixel_w = 0 + highlight.pixel_z = 0 + + apply_wibbly_filters(highlight) + + highlight.add_filter("fatal_flaw", 1, outline_filter(size = 1, color = COLOR_PALE_GREEN_GRAY)) + + owner.client.images += highlight + + return TRUE + +/datum/status_effect/fatal_flaw/on_remove() + owner?.client?.images -= highlight + QDEL_NULL(highlight) + + UnregisterSignal(owner, COMSIG_LIVING_PRE_DICE_ROLLED) + +/datum/status_effect/fatal_flaw/proc/on_dice_rolled(mob/living/roller, datum/storyteller_roll/roll_datum, atom/target) + SIGNAL_HANDLER + + if(!istype(roll_datum, /datum/storyteller_roll/damage)) + return + + if(!target || (target != target_ref?.resolve())) + return + + . += 1 // One extra dice + + +/atom/movable/screen/alert/status_effect/gift/fatal_flaw + name = /datum/action/cooldown/power/gift/fatal_flaw::name + desc = /datum/action/cooldown/power/gift/fatal_flaw::desc + overlay_state = /datum/action/cooldown/power/gift/fatal_flaw::button_icon_state diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/tribes/garou.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/tribes/garou.dm index 3917e1a366d6..0690a483adb6 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/tribes/garou.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/tribes/garou.dm @@ -1,4 +1,3 @@ - /datum/subsplat/werewolf/tribe/garou abstract_type = /datum/subsplat/werewolf/tribe/garou fera_restriction = SPLAT_GAROU @@ -38,11 +37,9 @@ /datum/subsplat/werewolf/tribe/garou/glasswalkers name = TRIBE_GLASS_WALKERS desc = "The closest to the Weaver, they find themselves deeply entrenched in modern human society, religion, technology and cities. Every new invention and every new discovery is one that aids the Glass Walkers, instead of impeding them." - // gifts_provided = list( - // /datum/action/cooldown/power/gift/smooth_move, - // /datum/action/cooldown/power/gift/digital_feelings, - // /datum/action/cooldown/power/gift/elemental_improvement - // ) + gifts_provided = list( + /datum/action/cooldown/power/gift/control_machine/simple, + ) subsplat_keys = /obj/item/vamp/keys/techstore /datum/subsplat/werewolf/tribe/garou/bonegnawers @@ -60,11 +57,9 @@ name = TRIBE_CHILDREN_OF_GAIA desc = "Peacekeepers, negotiators, treaty-makers and philosophers. The Children of Gaia strive as hard as they can create an understanding and unity between the disparate tribes that will allow them to form a united front against their foes." gifts_provided = list( - /datum/action/cooldown/power/gift/mothers_touch, - /datum/action/cooldown/power/gift/resist_pain, - // /datum/action/cooldown/power/gift/stoic_pose, - // /datum/action/cooldown/power/gift/freezing_wind, - // /datum/action/cooldown/power/gift/bloody_feast + /datum/action/cooldown/power/gift/jam_weapon + // /datum/action/cooldown/power/gift/mothers_touch, // DARKPACK TODO - (Selectable Gifts) + // /datum/action/cooldown/power/gift/resist_pain, // DARKPACK TODO - (Selectable Gifts) ) subsplat_keys = /obj/item/vamp/keys/children_of_gaia @@ -72,10 +67,9 @@ name = TRIBE_GET_OF_FENRIS desc = "Warriors, compassionate and fierce. They view themselves are Gaia's strongest heroes, but the rest of the tribes view them with caution, their violence more famous than their courage." gifts_provided = list( + // /datum/action/cooldown/power/gift/razor_claws, // DARKPACK TODO - (Selectable Gifts) + // /datum/action/cooldown/power/gift/resist_pain, // DARKPACK TODO - (Selectable Gifts) /datum/action/cooldown/power/gift/visage_of_fenris, - // /datum/action/cooldown/power/gift/stoic_pose, - // /datum/action/cooldown/power/gift/freezing_wind, - // /datum/action/cooldown/power/gift/bloody_feast ) subsplat_keys = /obj/item/vamp/keys/nps @@ -102,21 +96,19 @@ /datum/subsplat/werewolf/tribe/garou/shadowlords name = TRIBE_SHADOW_LORDS desc = "The closest one could consider a Garou to being a 'politician'. They manipulate the tribes, and their enemies, and rely on cunning and wits more than physical strength. Not to say there aren't adept warriors in their ranks, but the tribe tends towards brains than brawn." - // gifts_provided = list( - // /datum/action/cooldown/power/gift/stoic_pose, - // /datum/action/cooldown/power/gift/freezing_wind, - // /datum/action/cooldown/power/gift/bloody_feast - // ) + gifts_provided = list( + /datum/action/cooldown/power/gift/aura_of_confidence, + /datum/action/cooldown/power/gift/fatal_flaw, + ) subsplat_keys = /obj/item/vamp/keys/techstore /datum/subsplat/werewolf/tribe/garou/redtalons name = TRIBE_RED_TALONS desc = "Exclusively consisting of lupus, the Red Talons shun humanity and think of them as a blight on Gaia." - // gifts_provided = list( - // /datum/action/cooldown/power/gift/stoic_pose, - // /datum/action/cooldown/power/gift/freezing_wind, - // /datum/action/cooldown/power/gift/bloody_feast - // ) + gifts_provided = list( + // /datum/action/cooldown/power/gift/beast_speech, // DARKPACK TODO - (Selectable Gifts) + /datum/action/cooldown/power/gift/hidden_killer, + ) /datum/subsplat/werewolf/tribe/garou/silverfangs name = TRIBE_SILVER_FANGS @@ -146,6 +138,7 @@ // /datum/action/cooldown/power/gift/venom_claws, // /datum/action/cooldown/power/gift/burning_scars // ) + // tribe_trait = TRAIT_WYRMTAINTED_SPRITE /datum/subsplat/werewolf/tribe/garou/blackspiraldancers/psychomania_effect(mob/living/target, mob/living/owner) target.playsound_local(target, "modular_darkpack/modules/powers/sounds/daimonion_laughs/demonlaugh3.ogg", 50, FALSE) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi b/modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi index 087f71f43b1f..1ffea652b8c1 100644 Binary files a/modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi and b/modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 1c1df1be4c0b..d15c7968cbef 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7833,10 +7833,14 @@ #include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\auspices\theurge.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\innate\howling.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\black_furies.dm" -#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\black_spiral_dancer.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\bone_gnawers.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\childrenofgaia.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\fianna.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\get_of_fenris.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\redtalons.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\shadowlords.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\glasswalkers\control_machine.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\glasswalkers\glasswalkers.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\auspice.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\breed.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\fur.dm"