diff --git a/core/src/main/assets/interfaces/talent_icons.png b/core/src/main/assets/interfaces/talent_icons.png index ac6335ca4..fefb3cc88 100644 Binary files a/core/src/main/assets/interfaces/talent_icons.png and b/core/src/main/assets/interfaces/talent_icons.png differ diff --git a/core/src/main/assets/messages/actors/actors.properties b/core/src/main/assets/messages/actors/actors.properties index 9f10b14d0..98ddeed50 100644 --- a/core/src/main/assets/messages/actors/actors.properties +++ b/core/src/main/assets/messages/actors/actors.properties @@ -591,6 +591,10 @@ actors.hero.herosubclass.monk_short_desc=The _Monk_ builds energy while fighting actors.hero.herosubclass.monk_desc=The Monk is a master of physical technique. As she defeats enemies, she gains energy which can be used on a variety of defensive and utility-focused abilities. This energy does not fade over time, but has a cap based on the Monk's level. ##talents +actors.hero.talent$provokedangertracker.name=provoked anger +actors.hero.talent$provokedangertracker.desc=The Warrior has recently lost his shielding, his next physical attack will deal bonus damage.\n\nTurns remaining: %s. +actors.hero.talent$lingeringmagictracker.name=lingering magic +actors.hero.talent$lingeringmagictracker.desc=The Mage has recently used a staff or wand, his next physical attack will deal bonus damage.\n\nTurns remaining: %s. actors.hero.talent$followupstriketracker.name=followup strike actors.hero.talent$followupstriketracker.desc=The Huntress has recently attacked an enemy with a thrown weapon, her next melee attack against the same target will have boosted damage.\n\nTurns remaining: %s. actors.hero.talent$patientstriketracker.name=patient strike @@ -620,8 +624,8 @@ actors.hero.talent.hearty_meal.title=hearty meal actors.hero.talent.hearty_meal.desc=_+1:_ Eating food heals the Warrior for _3 HP_ when he is at or below 30% health.\n\n_+2:_ Eating food heals the Warrior for _5 HP_ when is at or below 30% health. actors.hero.talent.veterans_intuition.title=veteran's intuition actors.hero.talent.veterans_intuition.desc=_+1:_ The Warrior identifies weapons _1.75x faster_ and armor _2.5x faster_.\n\n_+2:_ The Warrior identifies weapons _2.5x faster_ and armor _when he equips it_. -actors.hero.talent.test_subject.title=test subject -actors.hero.talent.test_subject.desc=_+1:_ Whenever the Warrior identifies an item, he heals for _2 HP_.\n\n_+2:_ Whenever the Warrior identifies an item, he heals for _3 HP_. +actors.hero.talent.provoked_anger.title=provoked anger +actors.hero.talent.provoked_anger.desc=_+1:_ When the Warrior's shielding breaks, his next physical attack will deal _1-2 bonus damage_.\n\n_+2:_ When the Warrior's shielding breaks, his next physical attack will deal _2 bonus damage_. actors.hero.talent.iron_will.title=iron will actors.hero.talent.iron_will.desc=_+1:_ The max shield provided by the Warrior's seal is _increased by 1_.\n\n_+2:_ The max shield provided by the Warrior's seal is _increased by 2_. actors.hero.talent.iron_will.meta_desc=_If this talent is gained by a different hero_ it will grant its shielding benefit without the broken seal. @@ -684,8 +688,8 @@ actors.hero.talent.empowering_meal.title=empowering meal actors.hero.talent.empowering_meal.desc=_+1:_ Eating food grants the Mage _2 bonus damage_ on his next 3 wand zaps.\n\n_+2:_ Eating food grants the Mage _3 bonus damage_ on his next 3 wand zaps. actors.hero.talent.scholars_intuition.title=scholar's intuition actors.hero.talent.scholars_intuition.desc=_+1:_ The Mage identifies wands _3x faster_.\n\n_+2:_ The Mage identifies wands _when he uses them_. -actors.hero.talent.tested_hypothesis.title=tested hypothesis -actors.hero.talent.tested_hypothesis.desc=_+1:_ Whenever the Mage identifies an item, he gains _2 turns of wand recharging_.\n\n_+2:_ Whenever the Mage identifies an item, he gains _3 turns of wand recharging_. +actors.hero.talent.lingering_magic.title=lingering magic +actors.hero.talent.lingering_magic.desc=_+1:_ When the Mage zaps with a wand or staff, his next physical attack deals _1-2 bonus damage_.\n\n_+2:_ When the Mage zaps with a wand or staff, his next physical attack deals _2 bonus damage_. actors.hero.talent.backup_barrier.title=backup barrier actors.hero.talent.backup_barrier.desc=_+1:_ The Mage gains _3 shielding_ whenever he spends the last charge in his staff.\n\n_+2:_ The Mage gains _5 shielding_ whenever he spends the last charge in his staff. actors.hero.talent.backup_barrier.meta_desc=_If this talent is gained by a different hero_ it will instead trigger from the hero's highest level wand. diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java index a87c8889b..47b6fb30a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java @@ -773,6 +773,12 @@ public abstract class Char extends Actor { shielded -= dmg; HP -= dmg; + if (HP > 0 && shielded > 0 && shielding() == 0){ + if (this instanceof Hero && ((Hero) this).hasTalent(Talent.PROVOKED_ANGER)){ + Buff.affect(this, Talent.ProvokedAngerTracker.class, 5f); + } + } + if (HP > 0 && buff(Grim.GrimTracker.class) != null){ float finalChance = buff(Grim.GrimTracker.class).maxChance; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Talent.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Talent.java index 14c6fca1d..af5b5ab02 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Talent.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Talent.java @@ -85,7 +85,7 @@ import java.util.LinkedHashMap; public enum Talent { //Warrior T1 - HEARTY_MEAL(0), VETERANS_INTUITION(1), TEST_SUBJECT(2), IRON_WILL(3), + HEARTY_MEAL(0), VETERANS_INTUITION(1), PROVOKED_ANGER(2), IRON_WILL(3), //Warrior T2 IRON_STOMACH(4), LIQUID_WILLPOWER(5), RUNIC_TRANSFERENCE(6), LETHAL_MOMENTUM(7), IMPROVISED_PROJECTILES(8), //Warrior T3 @@ -102,7 +102,7 @@ public enum Talent { SUSTAINED_RETRIBUTION(23, 4), SHRUG_IT_OFF(24, 4), EVEN_THE_ODDS(25, 4), //Mage T1 - EMPOWERING_MEAL(32), SCHOLARS_INTUITION(33), TESTED_HYPOTHESIS(34), BACKUP_BARRIER(35), + EMPOWERING_MEAL(32), SCHOLARS_INTUITION(33), LINGERING_MAGIC(34), BACKUP_BARRIER(35), //Mage T2 ENERGIZING_MEAL(36), INSCRIBED_POWER(37), WAND_PRESERVATION(38), ARCANE_VISION(39), SHIELD_BATTERY(40), //Mage T3 @@ -658,21 +658,23 @@ public enum Talent { //note that IDing can happen in alchemy scene, so be careful with VFX here public static void onItemIdentified( Hero hero, Item item ){ - if (hero.hasTalent(TEST_SUBJECT)){ - //heal for 2/3 HP - hero.HP = Math.min(hero.HP + 1 + hero.pointsInTalent(TEST_SUBJECT), hero.HT); - if (hero.sprite != null) { - hero.sprite.showStatusWithIcon(CharSprite.POSITIVE, Integer.toString(1 + hero.pointsInTalent(TEST_SUBJECT)), FloatingText.HEALING); - } - } - if (hero.hasTalent(TESTED_HYPOTHESIS)){ - //2/3 turns of wand recharging - Buff.affect(hero, Recharging.class, 1f + hero.pointsInTalent(TESTED_HYPOTHESIS)); - ScrollOfRecharging.charge(hero); - } + //currently no talents that trigger here, it wasn't a very popular trigger =( } public static int onAttackProc( Hero hero, Char enemy, int dmg ){ + + if (hero.hasTalent(Talent.PROVOKED_ANGER) + && hero.buff(ProvokedAngerTracker.class) != null){ + dmg += Random.IntRange(hero.pointsInTalent(Talent.PROVOKED_ANGER) , 2); + hero.buff(ProvokedAngerTracker.class).detach(); + } + + if (hero.hasTalent(Talent.LINGERING_MAGIC) + && hero.buff(LingeringMagicTracker.class) != null){ + dmg += Random.IntRange(hero.pointsInTalent(Talent.LINGERING_MAGIC) , 2); + hero.buff(LingeringMagicTracker.class).detach(); + } + if (hero.hasTalent(Talent.SUCKER_PUNCH) && enemy instanceof Mob && ((Mob) enemy).surprisedBy(hero) && enemy.buff(SuckerPunchTracker.class) == null){ @@ -719,6 +721,18 @@ public enum Talent { return dmg; } + public static class ProvokedAngerTracker extends FlavourBuff{ + { type = Buff.buffType.POSITIVE; } + public int icon() { return BuffIndicator.WEAPON; } + public void tintIcon(Image icon) { icon.hardlight(1.43f, 1.43f, 1.43f); } + public float iconFadePercent() { return Math.max(0, 1f - (visualcooldown() / 5)); } + } + public static class LingeringMagicTracker extends FlavourBuff{ + { type = Buff.buffType.POSITIVE; } + public int icon() { return BuffIndicator.WEAPON; } + public void tintIcon(Image icon) { icon.hardlight(1.43f, 1.43f, 0f); } + public float iconFadePercent() { return Math.max(0, 1f - (visualcooldown() / 5)); } + } public static class SuckerPunchTracker extends Buff{}; public static class FollowupStrikeTracker extends FlavourBuff{ public int object; @@ -759,10 +773,10 @@ public enum Talent { //tier 1 switch (cls){ case WARRIOR: default: - Collections.addAll(tierTalents, HEARTY_MEAL, VETERANS_INTUITION, TEST_SUBJECT, IRON_WILL); + Collections.addAll(tierTalents, HEARTY_MEAL, VETERANS_INTUITION, PROVOKED_ANGER, IRON_WILL); break; case MAGE: - Collections.addAll(tierTalents, EMPOWERING_MEAL, SCHOLARS_INTUITION, TESTED_HYPOTHESIS, BACKUP_BARRIER); + Collections.addAll(tierTalents, EMPOWERING_MEAL, SCHOLARS_INTUITION, LINGERING_MAGIC, BACKUP_BARRIER); break; case ROGUE: Collections.addAll(tierTalents, CACHED_RATIONS, THIEFS_INTUITION, SUCKER_PUNCH, PROTECTIVE_SHADOWS); @@ -934,6 +948,9 @@ public enum Talent { private static final HashSet removedTalents = new HashSet<>(); static{ + //v2.4.0 + removedTalents.add("TEST_SUBJECT"); + removedTalents.add("TESTED_HYPOTHESIS"); //v2.2.0 removedTalents.add("EMPOWERING_SCROLLS"); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java index 8f8cb2b14..21a4b5dce 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java @@ -445,8 +445,14 @@ public abstract class Wand extends Item { && !Dungeon.hero.belongings.contains(this)){ Buff.prolong(Dungeon.hero, Talent.EmpoweredStrikeTracker.class, 10f); - } + + if (Dungeon.hero.hasTalent(Talent.LINGERING_MAGIC) + && charger != null && charger.target == Dungeon.hero){ + + Buff.affect(Dungeon.hero, Talent.LingeringMagicTracker.class, 5f); + } + Invisibility.dispel(); updateQuickslot();