v2.0.0: full impl for the Champion subclass, including talents

This commit is contained in:
Evan Debenham
2023-01-13 23:23:33 -05:00
parent ccb944fb30
commit 59a5b8885b
5 changed files with 73 additions and 10 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@@ -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

View File

@@ -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();

View File

@@ -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);

View File

@@ -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 ){