v2.0.0: full impl for the Champion subclass, including talents
This commit is contained in:
Binary file not shown.
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.8 KiB |
@@ -535,8 +535,8 @@ actors.hero.herosubclass.warden=warden
|
||||
actors.hero.herosubclass.warden_short_desc=The _Warden_ can see through tall grass and gains bonus effects when she plants seeds and tramples plants.
|
||||
actors.hero.herosubclass.warden_desc=The Warden has a strong connection to nature which grants her a variety of bonus effects relating to grass and plants. She is able to see through tall and furrowed grass as if it were empty space.\n\nThe Warden causes grass to sprout up around any seed she throws or plants, and gains special effects when trampling plants. These special effects replace the regular plant effects, meaning that no plant is harmful for her to step on.
|
||||
actors.hero.herosubclass.champion=champion
|
||||
actors.hero.herosubclass.champion_short_desc=The _Champion_ can wield a two weapons. She attacks with her primary weapon, can use abilities from either, and they share upgrades.
|
||||
actors.hero.herosubclass.champion_desc=The Champion is a master of melee weapons who can equip a secondary weapon in addition to her primary one. Her regular attacks use her primary weapon, but she can swap her primary weapon instantly. The secondary weapon's ability can be used at any time, and has its own ability charges.\n\nIf one of her two weapons is higher level than the other and the same or higher tier, then the weaker weapon will be boosted to the upgrade level of the stronger one!
|
||||
actors.hero.herosubclass.champion_short_desc=The _Champion_ can wield a two weapons. Her regular attacks use her primary weapon, but she can swap weapons and use either weapon's ability.
|
||||
actors.hero.herosubclass.champion_desc=The Champion is a master of melee weapons who can equip a secondary weapon in addition to her primary one. Her regular attacks use her primary weapon, but she can swap her primary weapon instantly.\n\nThe secondary weapon's ability can be used at any time and has its own ability charges. Her secondary weapon charges have a 50% reduced charge cap and charge speed.
|
||||
actors.hero.herosubclass.adept=adept
|
||||
actors.hero.herosubclass.adept_short_desc=The _Adept_ builds energy while fighting. This energy can be spent on a variety of unique abilities.
|
||||
actors.hero.herosubclass.adept_desc=The Adept is a master of ... . As she defeats enemies, she gains energy which can be used on a variety of defensive and utlity-focused abilities. This energy does not fade over time, but has a cap based on the Adept's level.\n\nTODO
|
||||
@@ -554,6 +554,8 @@ 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
|
||||
actors.hero.talent$swiftequipcooldown.desc=You have recently used this talent, and must wait before using it again.\n\nTurns remaining: %s.
|
||||
actors.hero.talent$combinedlethalitytriggertracker.name=combined lethality
|
||||
actors.hero.talent$combinedlethalitytriggertracker.desc=The Duelist's next attack will execute enemies below a certain health threshold.\n\nTurns remaining: %s.
|
||||
|
||||
#warrior
|
||||
actors.hero.talent.hearty_meal.title=hearty meal
|
||||
@@ -826,7 +828,7 @@ actors.hero.talent.focused_meal.meta_desc=_If this talent is gained by a differe
|
||||
actors.hero.talent.restored_agility.title=restored agility
|
||||
actors.hero.talent.restored_agility.desc=_+1:_ The Duelist has _2x evasion_ while drinking potions of healing.\n\n_+2:_ The Duelist has _5x evasion_ while drinking potions of healing.\n\nThis talent also triggers when drinking potions or elixirs based on potions of healing.
|
||||
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.desc=_+1:_ The Duelist gains one primary weapon charge every _15 turns_ when under the effect of wand or artifact recharging buffs.\n\n_+2:_ The Duelist gains one primary 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 with a weapon ability, she gains _1 turn_ of haste.\n\n_+2:_ When the Duelist lands a killing blow with a weapon ability, she gains _2 turns_ of haste.
|
||||
@@ -840,6 +842,13 @@ actors.hero.talent.lightweight_charge.meta_desc=_If this talent is gained by a d
|
||||
actors.hero.talent.deadly_followup.title=deadly followup
|
||||
actors.hero.talent.deadly_followup.desc=_+1:_ When the Duelist hits an enemy with a thrown weapon, she will deal _7% more melee damage_ to them for 5 turns.\n\n_+2:_ When the Duelist hits an enemy with a thrown weapon, she will deal _13% more melee damage_ to them for 5 turns.\n\n_+3:_ When the Duelist hits an enemy with a thrown weapon, she will deal _20% more melee damage_ to them for 5 turns.
|
||||
|
||||
actors.hero.talent.secondary_charge.title=secondary charge
|
||||
actors.hero.talent.secondary_charge.desc=_+1:_ The Champion's secondary weapon charge speed and charge cap are increased to _58%_ of her primary, from 50%.\n\n_+1:_ The Champion's secondary weapon charge speed and charge cap are increased to _67%_ of her primary, from 50%.\n\n_+1:_ The Champion's secondary weapon charge speed and charge cap are increased to _75%_ of her primary, from 50%.
|
||||
actors.hero.talent.twin_upgrades.title=twin upgrades
|
||||
actors.hero.talent.twin_upgrades.desc=_+1:_ If the weaker of the Champion's two equipped weapons is _2 or more tiers lower_ than the stronger one, it is boosted to the stronger weapon's level.\n\n_+2:_ If the weaker of the Champion's two equipped weapons is _1 or more tiers lower_ than the stronger one, it is boosted to the stronger weapon's level.\n\n_+3:_ If the weaker of the Champion's two equipped weapons is _the same tier or lower_ than the stronger one, it is boosted to the stronger weapon's level.
|
||||
actors.hero.talent.combined_lethality.title=combined lethality
|
||||
actors.hero.talent.combined_lethality.desc=_+1:_ If the Champion uses two different weapon abilities successively, the second ability will execute any non-boss enemy _below 8% health_.\n\n_+2:_ If the Champion uses two different weapon abilities successively, the second ability will execute any non-boss enemy _below 17% health_.\n\n_+3:_ If the Champion uses two different weapon abilities successively, the second ability will execute any non-boss enemy _below 25% health_.\n\nIf the second ability does not contain an attack, this talent will instead trigger on the Champion's next attack within 5 turns.
|
||||
|
||||
#universal
|
||||
actors.hero.talent.heroic_energy.title=heroic energy
|
||||
actors.hero.talent.heroic_energy.rat_title=ratroic energy
|
||||
|
||||
@@ -428,6 +428,24 @@ public abstract class Char extends Actor {
|
||||
enemy.sprite.showStatus(CharSprite.NEGATIVE, Messages.get(Preparation.class, "assassinated"));
|
||||
}
|
||||
|
||||
Talent.CombinedLethalityTriggerTracker combinedLethality = buff(Talent.CombinedLethalityTriggerTracker.class);
|
||||
if (combinedLethality != null){
|
||||
if ( enemy.isAlive() && enemy.alignment != alignment && !Char.hasProp(enemy, Property.BOSS)
|
||||
&& !Char.hasProp(enemy, Property.MINIBOSS) && this instanceof Hero &&
|
||||
(enemy.HP/(float)enemy.HT) <= 0.0834f*((Hero)this).pointsInTalent(Talent.COMBINED_LETHALITY)) {
|
||||
enemy.HP = 0;
|
||||
if (!enemy.isAlive()) {
|
||||
enemy.die(this);
|
||||
} else {
|
||||
//helps with triggering any on-damage effects that need to activate
|
||||
enemy.damage(-1, this);
|
||||
DeathMark.processFearTheReaper(enemy);
|
||||
}
|
||||
enemy.sprite.showStatus(CharSprite.NEGATIVE, "executed");
|
||||
}
|
||||
buff(Talent.CombinedLethalityTriggerTracker.class).detach();
|
||||
}
|
||||
|
||||
enemy.sprite.bloodBurstA( sprite.center(), effectiveDamage );
|
||||
enemy.sprite.flash();
|
||||
|
||||
|
||||
@@ -154,7 +154,7 @@ public enum Talent {
|
||||
//Duelist T3
|
||||
LIGHTWEIGHT_CHARGE(137, 3), DEADLY_FOLLOWUP(138, 3),
|
||||
//Duelist S1 T3
|
||||
DUELIST_S1_1(139, 3), DUELIST_S1_2(140, 3), DUELIST_S1_3(141, 3),
|
||||
SECONDARY_CHARGE(139, 3), TWIN_UPGRADES(140, 3), COMBINED_LETHALITY(141, 3),
|
||||
//Duelist S2 T3
|
||||
DUELIST_S2_1(142, 3), DUELIST_S2_2(143, 3), DUELIST_S2_3(144, 3),
|
||||
//Duelist A1 T4
|
||||
@@ -266,6 +266,14 @@ public enum Talent {
|
||||
}
|
||||
};
|
||||
public static class DeadlyFollowupTracker extends FlavourBuff{};
|
||||
public static class CombinedLethalityAbilityTracker extends FlavourBuff{
|
||||
public MeleeWeapon weapon;
|
||||
};
|
||||
public static class CombinedLethalityTriggerTracker extends FlavourBuff{
|
||||
{ type = buffType.POSITIVE; }
|
||||
public int icon() { return BuffIndicator.CORRUPT; }
|
||||
public void tintIcon(Image icon) { icon.hardlight(0.6f, 0.15f, 0.6f); }
|
||||
};
|
||||
|
||||
int icon;
|
||||
int maxPoints;
|
||||
@@ -369,6 +377,10 @@ public enum Talent {
|
||||
if (talent == HEIGHTENED_SENSES || talent == FARSIGHT){
|
||||
Dungeon.observe();
|
||||
}
|
||||
|
||||
if (talent == SECONDARY_CHARGE || talent == TWIN_UPGRADES){
|
||||
Item.updateQuickslot();
|
||||
}
|
||||
}
|
||||
|
||||
public static class CachedRationsDropped extends CounterBuff{{revivePersists = true;}};
|
||||
@@ -780,7 +792,7 @@ public enum Talent {
|
||||
Collections.addAll(tierTalents, DURABLE_TIPS, BARKSKIN, SHIELDING_DEW);
|
||||
break;
|
||||
case CHAMPION:
|
||||
Collections.addAll(tierTalents, DUELIST_S1_1, DUELIST_S1_2, DUELIST_S1_3);
|
||||
Collections.addAll(tierTalents, SECONDARY_CHARGE, TWIN_UPGRADES, COMBINED_LETHALITY);
|
||||
break;
|
||||
case ADEPT:
|
||||
Collections.addAll(tierTalents, DUELIST_S2_1, DUELIST_S2_2, DUELIST_S2_3);
|
||||
|
||||
@@ -30,7 +30,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Haste;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Recharging;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Belongings;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroClass;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
|
||||
@@ -185,11 +184,28 @@ public class MeleeWeapon extends Weapon {
|
||||
Buff.affect(hero, Barrier.class).setShield(2);
|
||||
}
|
||||
|
||||
if (hero.buff(Talent.CombinedLethalityAbilityTracker.class) != null
|
||||
&& hero.buff(Talent.CombinedLethalityAbilityTracker.class).weapon != null
|
||||
&& hero.buff(Talent.CombinedLethalityAbilityTracker.class).weapon != this){
|
||||
Buff.affect(hero, Talent.CombinedLethalityTriggerTracker.class, 5f);
|
||||
}
|
||||
|
||||
updateQuickslot();
|
||||
}
|
||||
|
||||
protected void afterAbilityUsed( Hero hero ){
|
||||
hero.belongings.abilityWeapon = null;
|
||||
if (hero.hasTalent(Talent.COMBINED_LETHALITY)) {
|
||||
Talent.CombinedLethalityAbilityTracker tracker = hero.buff(Talent.CombinedLethalityAbilityTracker.class);
|
||||
if (tracker == null){
|
||||
Buff.affect(hero, Talent.CombinedLethalityAbilityTracker.class, hero.cooldown()).weapon = this;
|
||||
} else if (tracker.weapon == this || tracker.weapon == null) {
|
||||
Buff.prolong(hero, Talent.CombinedLethalityAbilityTracker.class, hero.cooldown());
|
||||
} else {
|
||||
//we triggered the talent, so remove the tracker
|
||||
tracker.detach();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void onAbilityKill( Hero hero ){
|
||||
@@ -229,13 +245,14 @@ public class MeleeWeapon extends Weapon {
|
||||
|
||||
@Override
|
||||
public int buffedLvl() {
|
||||
if (Dungeon.hero.subClass == HeroSubClass.CHAMPION && isEquipped(Dungeon.hero)){
|
||||
if (isEquipped(Dungeon.hero) && Dungeon.hero.hasTalent(Talent.TWIN_UPGRADES)){
|
||||
KindOfWeapon other = null;
|
||||
if (Dungeon.hero.belongings.weapon() != this) other = Dungeon.hero.belongings.weapon();
|
||||
if (Dungeon.hero.belongings.secondWep() != this) other = Dungeon.hero.belongings.secondWep();
|
||||
|
||||
//weaker weapon needs to be 2/1/0 tiers lower, based on talent level
|
||||
if (other instanceof MeleeWeapon
|
||||
&& tier <= ((MeleeWeapon) other).tier
|
||||
&& (tier+(3-Dungeon.hero.pointsInTalent(Talent.TWIN_UPGRADES))) <= ((MeleeWeapon) other).tier
|
||||
&& other.level() > super.buffedLvl()){
|
||||
return other.level();
|
||||
}
|
||||
@@ -386,7 +403,9 @@ public class MeleeWeapon extends Weapon {
|
||||
if (Dungeon.hero.subClass == HeroSubClass.CHAMPION
|
||||
&& secondCharges < secondChargeCap()) {
|
||||
if (lock == null || lock.regenOn()) {
|
||||
secondPartialCharge += 1 / (100f - (chargeCap() - 2 * secondCharges)); // 100 to 80 turns per charge
|
||||
// 100 to 80 turns per charge without talent
|
||||
// up to 75 to 67 turns per charge at max talent level
|
||||
secondPartialCharge += secondChargeMultiplier() / (50f-(secondChargeCap()-secondCharges));
|
||||
}
|
||||
|
||||
if (secondPartialCharge >= 1) {
|
||||
@@ -425,7 +444,12 @@ public class MeleeWeapon extends Weapon {
|
||||
}
|
||||
|
||||
public int secondChargeCap(){
|
||||
return chargeCap()/2;
|
||||
return Math.round(chargeCap() * secondChargeMultiplier());
|
||||
}
|
||||
|
||||
public float secondChargeMultiplier(){
|
||||
//50% - 75%, depending on talent
|
||||
return 0.5f + 0.0834f*Dungeon.hero.pointsInTalent(Talent.SECONDARY_CHARGE);
|
||||
}
|
||||
|
||||
public void gainCharge( float charge ){
|
||||
|
||||
Reference in New Issue
Block a user