v2.5.0: T2 talent buffs:
- liquid agility evasion down to 3x at +1, but now also grants 3x/inf. ACC for one attack. - lethal haste now grants 3/5 turns of free movement, instead of haste - swift equip's second use at +2 no longer has a 5 turn timer - wand preservation now always succeeds, no longer grants resin on failure, and is limited to 1 use at +1, and 1 use per level at +2 - Rogues foresight buffed to 75%/100% from 60%/90%
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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 <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user