diff --git a/core/src/main/assets/messages/actors/actors.properties b/core/src/main/assets/messages/actors/actors.properties index 4492a62a3..fbd309409 100644 --- a/core/src/main/assets/messages/actors/actors.properties +++ b/core/src/main/assets/messages/actors/actors.properties @@ -220,6 +220,9 @@ actors.buffs.fury.desc=You are angry, enemies won't like you when you're angry.\ actors.buffs.blobimmunity.name=purification barrier actors.buffs.blobimmunity.desc=Some strange force is encasing you in a thin protective barrier, blocking out all harmful airborne effects.\n\nYou are immune to all area-bound effects while this barrier lasts.\n\nTurns of immunity remaining: %s. +actors.buffs.greaterhaste.name=greater haste +actors.buffs.greaterhaste.desc=An incredible boost of speed, for a moment it feels as if everything else is standing still.\n\nWhile under the effects of greater haste moving actions take no time at all, but other actions sre still performed at normal speed. Each step of movement consumes a turn of greater haste.\n\nTurns of greater haste remaining: %d. + actors.buffs.haste.name=haste actors.buffs.haste.desc=Energy courses through your muscles, allowing you to run at incredible speeds!\n\nWhile under the effects of haste you will run at 3x speed, but will perform all other actions at normal speed.\n\nTurns of haste remaining: %s. @@ -619,6 +622,8 @@ actors.hero.talent$seershotcooldown.name=seer shot cooldown actors.hero.talent$seershotcooldown.desc=You have recently used this talent, and must wait before using it again.\n\nTurns remaining: %s. actors.hero.talent$aggressivebarriercooldown.name=aggressive barrier cooldown actors.hero.talent$aggressivebarriercooldown.desc=You have recently used this talent, and must wait before using it again.\n\nTurns remaining: %s. +actors.hero.talent$liquidagilacctracker.name=liquid agility +actors.hero.talent$liquidagilacctracker.desc=The Duelist's next regular melee attack will gain bonus accuracy.\n\nTurns remaining: %s. actors.hero.talent$lethalhastecooldown.name=lethal haste cooldown actors.hero.talent$lethalhastecooldown.desc=You have recently used this talent, and must wait before using it again.\n\nTurns remaining: %s. actors.hero.talent$swiftequipcooldown.name=swift equip cooldown @@ -711,7 +716,7 @@ actors.hero.talent.energizing_meal.desc=_+1:_ Eating food takes the Mage 1 turn actors.hero.talent.inscribed_power.title=inscribed power actors.hero.talent.inscribed_power.desc=_+1:_ When the Mage reads a scroll or uses a spell item, his _next 2 wand zaps_ get +2 levels.\n\n_+2:_ When the Mage reads a scroll or uses a spell item, his _next 3 wand zaps_ get +2 levels.\n\nThe number of enhanced wand zaps is doubled when using a scroll of upgrade, transmutation, or alchemy items that must be crafted using those scrolls.\n\nFor alchemy items with higher output quantities (e.g. most spells), this talent has a chance to trigger based on how many of that item is produced. actors.hero.talent.wand_preservation.title=wand preservation -actors.hero.talent.wand_preservation.desc=_+1:_ When the Mage imbues a new wand into his staff, the old wand has a _67% chance_ of being returned at +0, otherwise it will be returned as 1 arcane resin.\n\n_+2:_ When the Mage imbues a new wand into his staff, the old wand has a _100% chance_ of being returned at +0.\n\nThis talent can preserve wands a maximum of five times, afterward it will always grant 1 arcane resin. +actors.hero.talent.wand_preservation.desc=_+1:_ When the Mage imbues a new wand into his staff, the old wand is returned at +0, _but this can only be done once._\n\n_+2:_ When the Mage imbues a new wand into his staff, the old wandis returned at +0, _this can be done once per hero level._ actors.hero.talent.wand_preservation.meta_desc=_If this talent is gained by a different hero_ it will instead increase the amount of arcane resin gained when putting a wand into an alchemy pot by 1 at +1, or by 2 at +2. actors.hero.talent.arcane_vision.title=arcane vision actors.hero.talent.arcane_vision.desc=_+1:_ When the Mage zaps an enemy, he gains mind vision on them for _10 turns_.\n\n_+2:_ When the Mage zaps an enemy, he gains mind vision on them for _15 turns_. @@ -778,7 +783,7 @@ actors.hero.talent.wide_search.meta_desc=_If this talent is gained by a differen actors.hero.talent.silent_steps.title=silent steps actors.hero.talent.silent_steps.desc=_+1:_ The Rogue will not wake sleeping enemies while he is _3 or more tiles away from them_.\n\n_+2:_ The Rogue will not wake sleeping enemies while he is _not adjacent to them_. actors.hero.talent.rogues_foresight.title=rogue's foresight -actors.hero.talent.rogues_foresight.desc=_+1:_ When the Rogue is on a level with a secret room, he has a _60% chance to notice_ that the level contains a secret.\n\n_+2:_ When the Rogue is on a level with a secret room, he has a _90% chance to notice_ that the level contains a secret. +actors.hero.talent.rogues_foresight.desc=_+1:_ When the Rogue is on a level with a secret room, he has a _75% chance to notice_ that the level contains a secret.\n\n_+2:_ When the Rogue is on a level with a secret room, he has a _100% chance to notice_ that the level contains a secret. actors.hero.talent.light_cloak.title=light cloak actors.hero.talent.light_cloak.desc=_+1:_ The Rogue can use his cloak of shadows when it is not equipped, but it recharges at _25% speed_.\n\n_+2:_ The Rogue can use his cloak of shadows when it is not equipped, but it recharges at _50% speed_.\n\n_+3:_ The Rogue can use his cloak of shadows when it is not equipped, but it recharges at _75% speed_. @@ -898,15 +903,15 @@ actors.hero.talent.focused_meal.title=focused meal actors.hero.talent.focused_meal.desc=_+1:_ Eating food takes the Duelist 1 turn and grants her _0.67 charges_ on her weapons.\n\n_+2:_ Eating food takes the Duelist 1 turn and grants her _1 charge_ on her weapons. actors.hero.talent.focused_meal.meta_desc=_If this talent is gained by a different hero_ it will instead grant bonus damage to their next hit equal to their level/3 at +1, or level/2 at +2. actors.hero.talent.liquid_agility.title=liquid agility -actors.hero.talent.liquid_agility.desc=_+1:_ The Duelist has _4x evasion_ while drinking or throwing a potion, brew, or elixir.\n\n_+2:_ The Duelist has _infinite evasion_ while drinking or throwing a potion, brew, or elixir.\n\nThis evasion bonus lasts for 1 additional turn when using potions of strength, experience, or alchemy items that must be crafted using those potions.\n\nFor alchemy items with higher output quantities (e.g. aqua brew), this talent has a chance to trigger based on how many of that item is produced. +actors.hero.talent.liquid_agility.desc=_+1:_ When drinking a potion, brew, of elixir, the Duelist has _3x evasion_, and has _3x accuracy_ on her next melee weapon attack within 5 turns.\n\n_+2:_ When drinking a potion, brew, of elixir, the Duelist has _infinite evasion_, and has _infinite accuracy_ on her next melee weapon attack within 5 turns.\n\nThis bonus lasts for one additional turn and attack when using potions of strength, experience, or alchemy items that must be crafted using those potions.\n\nFor alchemy items with higher output quantities (e.g. aqua brew), this talent has a chance to trigger based on how many of that item is produced. actors.hero.talent.weapon_recharging.title=weapon recharging actors.hero.talent.weapon_recharging.desc=_+1:_ The Duelist gains one weapon charge every _15 turns_ when under the effect of wand or artifact recharging buffs.\n\n_+2:_ The Duelist gains one weapon charge every _10 turns_ when under the effect of wand or artifact recharging buffs. actors.hero.talent.weapon_recharging.meta_desc=_If this talent is gained by a different hero_ it will instead cause them to deal +5% melee damage while recharging at +1, or +7.5% melee damage while recharging at +2. actors.hero.talent.lethal_haste.title=lethal haste -actors.hero.talent.lethal_haste.desc=_+1:_ When the Duelist lands a killing blow on an enemy with a weapon ability, she gains _2 turns_ of haste.\n\n_+2:_ When the Duelist lands a killing blow on an enemy with a weapon ability, she gains _3 turns_ of haste. +actors.hero.talent.lethal_haste.desc=_+1:_ When the Duelist lands a killing blow on an enemy with a weapon ability, she gains _3 turns_ worth of instant movement.\n\n_+2:_ When the Duelist lands a killing blow on an enemy with a weapon ability, she gains _5 turns_ worth of instant movement. actors.hero.talent.lethal_haste.meta_desc=_If this talent is gained by a different hero_ it will instead trigger with regular weapon attacks, with a 100 turn cooldown. actors.hero.talent.swift_equip.title=swift equip -actors.hero.talent.swift_equip.desc=_+1:_ The Duelist can switch her equipped weapon instantly _one time_, with a 20 turn cooldown.\n\n_+2:_ The Duelist can switch her equipped weapon instantly _twice within 5 turns_, with a 20 turn cooldown.\n\nIf the Duelist has this talent and it is not on cooldown, quick-using an unequipped weapon will equip it. +actors.hero.talent.swift_equip.desc=_+1:_ The Duelist can switch her equipped weapon instantly _one time_ every 20 turns.\n\n_+2:_ The Duelist can switch her equipped weapon instantly _two times_ every 20 turns.\n\nIf the Duelist has this talent and it is not on cooldown, quick-using an unequipped weapon will equip it. actors.hero.talent.precise_assault.title=precise assault actors.hero.talent.precise_assault.desc=_+1:_ When the Duelist uses a weapon ability, she gains _2x accuracy_ on her next melee attack within 5 turns.\n\n_+2:_ When the Duelist uses a weapon ability, she gains _4x accuracy_ on her next melee attack within 5 turns.\n\n_+3:_ When the Duelist uses a weapon ability, she gains _8x accuracy_ on her next melee attack within 5 turns. diff --git a/core/src/main/assets/messages/items/items.properties b/core/src/main/assets/messages/items/items.properties index 12383b693..19840574f 100644 --- a/core/src/main/assets/messages/items/items.properties +++ b/core/src/main/assets/messages/items/items.properties @@ -1802,13 +1802,12 @@ items.weapon.melee.magesstaff.ac_zap=ZAP items.weapon.melee.magesstaff.prompt=Select a wand items.weapon.melee.magesstaff.imbue=You imbue your staff with the %s. items.weapon.melee.magesstaff.preserved=The previous wand was preserved! -items.weapon.melee.magesstaff.preserved_resin=The previous wand was disenchanted into arcane resin. items.weapon.melee.magesstaff.conflict=The conflicting magics erase the enchantment on your staff. items.weapon.melee.magesstaff.id_first=You'll need to identify this wand first. items.weapon.melee.magesstaff.cursed=You can't use a cursed wand. items.weapon.melee.magesstaff.imbue_desc=Are you sure you want to imbue your staff with this wand?\n\nIf the wand being imbued is the same or higher level than the staff, the staff will inherit the level of that wand plus a single one of its own upgrades.\n\nThis imbue will result in a _level %d_ staff. -items.weapon.melee.magesstaff.imbue_lost=The wand currently imbued in your staff will be lost. -items.weapon.melee.magesstaff.imbue_talent=The wand currently imbued in your staff has a _%1$d%% chance_ to be returned at +0. Wand returns remaining: _%2$d_. If your wand is not preserved, you will get 1 arcane resin instead. +items.weapon.melee.magesstaff.imbue_lost=The wand currently imbued in your staff _will be lost_. +items.weapon.melee.magesstaff.imbue_talent=The wand currently imbued in your staff _will be returned at +0_. items.weapon.melee.magesstaff.yes=Yes, I'm sure items.weapon.melee.magesstaff.no=No, I changed my mind items.weapon.melee.magesstaff.desc=Crafted by the Mage himself, this staff is a unique magical weapon which can be imbued with a wand. diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/GreaterHaste.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/GreaterHaste.java new file mode 100644 index 000000000..1096adf4a --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/GreaterHaste.java @@ -0,0 +1,86 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2024 Evan Debenham + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ + +package com.shatteredpixel.shatteredpixeldungeon.actors.buffs; + +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; +import com.watabou.noosa.Image; + +//currently only applies to the hero +public class GreaterHaste extends Buff { + + { + type = buffType.POSITIVE; + } + + private int left; + + @Override + public boolean act() { + + spendMove(); + + spend(TICK); + return true; + } + + public void spendMove(){ + left--; + if (left <= 0){ + detach(); + } + } + + public void set(int time){ + left = time; + } + + @Override + public int icon() { + return BuffIndicator.HASTE; + } + + @Override + public void tintIcon(Image icon) { + icon.hardlight(1f, 0.3f, 0f); + } + + @Override + public float iconFadePercent() { + //currently tied to the lethal haste talent, as that's the only source + float duration = 1 + 2*Dungeon.hero.pointsInTalent(Talent.LETHAL_HASTE); + return Math.max(0, (duration - left) / duration); + } + + @Override + public String iconTextDisplay() { + return Integer.toString(left); + } + + @Override + public String desc() { + return Messages.get(this, "desc", left); + } + +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java index 86aa05c39..92186965d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java @@ -48,6 +48,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Charm; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Combo; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Drowsy; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Foresight; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.GreaterHaste; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.HoldFast; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; @@ -510,9 +511,9 @@ public class Hero extends Char { evasion *= RingOfEvasion.evasionMultiplier( this ); - if (buff(Talent.RestoredAgilityTracker.class) != null){ + if (buff(Talent.LiquidAgilEVATracker.class) != null){ if (pointsInTalent(Talent.LIQUID_AGILITY) == 1){ - evasion *= 4f; + evasion *= 3f; } else if (pointsInTalent(Talent.LIQUID_AGILITY) == 2){ return INFINITE_EVASION; } @@ -1681,6 +1682,10 @@ public class Hero extends Char { float delay = 1 / speed(); + if (buff(GreaterHaste.class) != null){ + delay = 0; + } + if (Dungeon.level.pit[step] && !Dungeon.level.solid[step] && (!flying || buff(Levitation.class) != null && buff(Levitation.class).detachesWithinDelay(delay))){ if (!Chasm.jumpConfirmed){ @@ -1695,6 +1700,10 @@ public class Hero extends Char { return false; } + if (buff(GreaterHaste.class) != null){ + buff(GreaterHaste.class).spendMove(); + } + if (subClass == HeroSubClass.FREERUNNER){ Buff.affect(this, Momentum.class).gainStack(); } @@ -1846,6 +1855,12 @@ public class Hero extends Char { boolean levelUp = false; while (this.exp >= maxExp()) { this.exp -= maxExp(); + + if (buff(Talent.WandPreservationCounter.class) != null + && pointsInTalent(Talent.WAND_PRESERVATION) == 2){ + buff(Talent.WandPreservationCounter.class).detach(); + } + if (lvl < MAX_LEVEL) { lvl++; levelUp = true; 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 8c636a58f..08bd5337c 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 @@ -267,7 +267,27 @@ public enum Talent { public void tintIcon(Image icon) { icon.hardlight(0.35f, 0f, 0.7f); } public float iconFadePercent() { return Math.max(0, visualcooldown() / 50); } }; - public static class RestoredAgilityTracker extends FlavourBuff{}; + public static class LiquidAgilEVATracker extends FlavourBuff{}; + public static class LiquidAgilACCTracker extends FlavourBuff{ + public int uses; + + { type = buffType.POSITIVE; } + public int icon() { return BuffIndicator.INVERT_MARK; } + public void tintIcon(Image icon) { icon.hardlight(0.5f, 0f, 1f); } + public float iconFadePercent() { return Math.max(0, 1f - (visualcooldown() / 5)); } + + private static final String USES = "uses"; + @Override + public void storeInBundle(Bundle bundle) { + super.storeInBundle(bundle); + bundle.put(USES, uses); + } + @Override + public void restoreFromBundle(Bundle bundle) { + super.restoreFromBundle(bundle); + uses = bundle.getInt(USES); + } + }; public static class LethalHasteCooldown extends FlavourBuff{ public int icon() { return BuffIndicator.TIME; } public void tintIcon(Image icon) { icon.hardlight(0.35f, 0f, 0.7f); } @@ -276,7 +296,7 @@ public enum Talent { public static class SwiftEquipCooldown extends FlavourBuff{ public boolean secondUse; public boolean hasSecondUse(){ - return secondUse && cooldown() > 14f; + return secondUse; } public int icon() { return BuffIndicator.TIME; } @@ -616,7 +636,10 @@ public enum Talent { Dungeon.observe(); } if (hero.hasTalent(LIQUID_AGILITY)){ - Buff.prolong(hero, RestoredAgilityTracker.class, hero.cooldown() + Math.max(0, factor-1)); + Buff.prolong(hero, LiquidAgilEVATracker.class, hero.cooldown() + Math.max(0, factor-1)); + if (factor >= 0.5f){ + Buff.prolong(hero, LiquidAgilACCTracker.class, 5f).uses = Math.round(factor); + } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java index becead124..15d00cedf 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java @@ -37,7 +37,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Charm; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Dread; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Haste; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.GreaterHaste; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MindVision; @@ -831,7 +831,7 @@ public abstract class Mob extends Char { && Dungeon.hero.hasTalent(Talent.LETHAL_HASTE) && Dungeon.hero.buff(Talent.LethalHasteCooldown.class) == null){ Buff.affect(Dungeon.hero, Talent.LethalHasteCooldown.class, 100f); - Buff.affect(Dungeon.hero, Haste.class, 1.67f + Dungeon.hero.pointsInTalent(Talent.LETHAL_HASTE)); + Buff.affect(Dungeon.hero, GreaterHaste.class).set(2 + 2*Dungeon.hero.pointsInTalent(Talent.LETHAL_HASTE)); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/MagesStaff.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/MagesStaff.java index ac2518bfe..e66033098 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/MagesStaff.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/MagesStaff.java @@ -32,7 +32,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle; -import com.shatteredpixel.shatteredpixeldungeon.items.ArcaneResin; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.bags.Bag; import com.shatteredpixel.shatteredpixeldungeon.items.bags.MagicalHolster; @@ -226,7 +225,7 @@ public class MagesStaff extends MeleeWeapon { if (owner == Dungeon.hero && Dungeon.hero.hasTalent(Talent.WAND_PRESERVATION)){ Talent.WandPreservationCounter counter = Buff.affect(Dungeon.hero, Talent.WandPreservationCounter.class); - if (counter.count() < 5 && Random.Float() < 0.34f + 0.33f*Dungeon.hero.pointsInTalent(Talent.WAND_PRESERVATION)){ + if (counter.count() == 0){ counter.countUp(1); this.wand.level(0); if (!this.wand.collect()) { @@ -234,13 +233,6 @@ public class MagesStaff extends MeleeWeapon { } GLog.newLine(); GLog.p(Messages.get(this, "preserved")); - } else { - ArcaneResin resin = new ArcaneResin(); - if (!resin.collect()) { - Dungeon.level.drop(resin, owner.pos); - } - GLog.newLine(); - GLog.p(Messages.get(this, "preserved_resin")); } } @@ -445,13 +437,9 @@ public class MagesStaff extends MeleeWeapon { } String bodyText = Messages.get(MagesStaff.class, "imbue_desc", newLevel); - int preservesLeft = Dungeon.hero.hasTalent(Talent.WAND_PRESERVATION) ? 5 : 0; - if (Dungeon.hero.buff(Talent.WandPreservationCounter.class) != null){ - preservesLeft -= Dungeon.hero.buff(Talent.WandPreservationCounter.class).count(); - } - if (Dungeon.hero.hasTalent(Talent.WAND_PRESERVATION)){ - int preserveChance = Dungeon.hero.pointsInTalent(Talent.WAND_PRESERVATION) == 1 ? 67 : 100; - bodyText += "\n\n" + Messages.get(MagesStaff.class, "imbue_talent", preserveChance, preservesLeft); + if (Dungeon.hero.hasTalent(Talent.WAND_PRESERVATION) + && Dungeon.hero.buff(Talent.WandPreservationCounter.class) == null){ + bodyText += "\n\n" + Messages.get(MagesStaff.class, "imbue_talent"); } else { bodyText += "\n\n" + Messages.get(MagesStaff.class, "imbue_lost"); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/MeleeWeapon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/MeleeWeapon.java index ff37045ae..d4efa69ef 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/MeleeWeapon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/MeleeWeapon.java @@ -27,7 +27,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ArtifactRecharge; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barrier; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Haste; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.GreaterHaste; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MonkEnergy; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Recharging; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Regeneration; @@ -235,8 +235,8 @@ public class MeleeWeapon extends Weapon { public static void onAbilityKill( Hero hero, Char killed ){ if (killed.alignment == Char.Alignment.ENEMY && hero.hasTalent(Talent.LETHAL_HASTE)){ - //effectively 2/3 turns of haste - Buff.prolong(hero, Haste.class, 1.67f+hero.pointsInTalent(Talent.LETHAL_HASTE)); + //effectively 3/5 turns of greater haste + Buff.affect(hero, GreaterHaste.class).set(2 + 2*hero.pointsInTalent(Talent.LETHAL_HASTE)); } } @@ -299,18 +299,26 @@ public class MeleeWeapon extends Weapon { float ACC = super.accuracyFactor(owner, target); if (owner instanceof Hero - && ((Hero) owner).hasTalent(Talent.PRECISE_ASSAULT) + && ((Hero) owner).hasTalent(Talent.PRECISE_ASSAULT) || ((Hero) owner).hasTalent(Talent.LIQUID_AGILITY) //does not trigger on ability attacks && ((Hero) owner).belongings.abilityWeapon != this) { if (((Hero) owner).heroClass != HeroClass.DUELIST) { //persistent +10%/20%/30% ACC for other heroes ACC *= 1f + 0.1f * ((Hero) owner).pointsInTalent(Talent.PRECISE_ASSAULT); } else if (this instanceof Flail && owner.buff(Flail.SpinAbilityTracker.class) != null){ - //do nothing, this is not a regular attack so don't consume preciase assault + //do nothing, this is not a regular attack so don't consume talent fx } else if (owner.buff(Talent.PreciseAssaultTracker.class) != null) { // 2x/4x/8x ACC for duelist if she just used a weapon ability ACC *= Math.pow(2, ((Hero) owner).pointsInTalent(Talent.PRECISE_ASSAULT)); owner.buff(Talent.PreciseAssaultTracker.class).detach(); + } else if (owner.buff(Talent.LiquidAgilACCTracker.class) != null){ + //3x/inf. ACC, depending on talent level + ACC *= ((Hero) owner).pointsInTalent(Talent.LIQUID_AGILITY) == 2 ? Float.POSITIVE_INFINITY : 3f; + Talent.LiquidAgilACCTracker buff = owner.buff(Talent.LiquidAgilACCTracker.class); + buff.uses--; + if (buff.uses <= 0) { + buff.detach(); + } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java index 3118fe54a..96d92b765 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java @@ -521,10 +521,10 @@ public class GameScene extends PixelScene { if (r instanceof SecretRoom) reqSecrets--; } - //60%/90% chance, use level's seed so that we get the same result for the same level + //75%/100% chance, use level's seed so that we get the same result for the same level //offset seed slightly to avoid output patterns Random.pushGenerator(Dungeon.seedCurDepth()+1); - if (reqSecrets <= 0 && Random.Int(10) < 3+3*Dungeon.hero.pointsInTalent(Talent.ROGUES_FORESIGHT)){ + if (reqSecrets <= 0 && Random.Int(4) < 2+Dungeon.hero.pointsInTalent(Talent.ROGUES_FORESIGHT)){ GLog.p(Messages.get(this, "secret_hint")); } Random.popGenerator();