v2.0.0: implemented the two base T3 talents for the Duelist

This commit is contained in:
Evan Debenham
2022-12-16 13:29:18 -05:00
parent 94cb9a7309
commit 65b89da180
14 changed files with 97 additions and 34 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@@ -809,16 +809,22 @@ actors.hero.talent.aggressive_barrier.meta_desc=_If this talent is gained by a d
actors.hero.talent.focused_meal.title=focused meal 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 _1 weapon charge_.\n\n_+2:_ Eating food takes the Duelist 1 turn and grants her _1.5 weapon charge_. actors.hero.talent.focused_meal.desc=_+1:_ Eating food takes the Duelist 1 turn and grants her _1 weapon charge_.\n\n_+2:_ Eating food takes the Duelist 1 turn and grants her _1.5 weapon charge_.
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 attack equal to their level/3 at +1, and level/2 at +2. 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 attack equal to their level/3 at +1, or level/2 at +2.
actors.hero.talent.restored_agility.title=restored agility 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.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.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 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, and +7.5% melee damage while recharging at +2. 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.swift_equip.title=swift equip 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 50 turn cooldown.\n\n_+2:_ The Duelist can switch her equipped weapon instantly _twice within 5 turns_, with a 50 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_, with a 50 turn cooldown.\n\n_+2:_ The Duelist can switch her equipped weapon instantly _twice within 5 turns_, with a 50 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.lightweight_charge.title=lightweight charge
actors.hero.talent.lightweight_charge.desc=_+1:_ When the Duelist uses the ability of a tier 1/2/3 melee weapon, it consumes _17/11/8% less charge_.\n\n_+2:_ When the Duelist uses the ability of a tier 1/2/3 melee weapon, it consumes _33/22/17% less charge_.\n\n_+3:_ When the Duelist uses the ability of a tier 1/2/3 melee weapon, it consumes _50/33/25% less charge_.
actors.hero.talent.lightweight_charge.meta_desc=_If this talent is gained by a different hero_ it will instead increase the damage of tier 2/3 melee weapons by 10/5% at +1, 20/10% at +2, or 30/15% at +3. Tier 1 weapons are unaffected.
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 _8% more melee damage_ to them for 5 turns.\n\n_+2:_ When the Duelist hits an enemy with a thrown weapon, she will deal _16% more melee damage_ to them for 5 turns.\n\n_+3:_ When the Duelist hits an enemy with a thrown weapon, she will deal _24% more melee damage_ to them for 5 turns.
#universal #universal
actors.hero.talent.heroic_energy.title=heroic energy actors.hero.talent.heroic_energy.title=heroic energy
actors.hero.talent.heroic_energy.rat_title=ratroic energy actors.hero.talent.heroic_energy.rat_title=ratroic energy

View File

@@ -119,6 +119,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.SpiritBow;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Flail; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Flail;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MeleeWeapon;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.RoundShield; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.RoundShield;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Sai; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Sai;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon;
@@ -568,6 +569,17 @@ public class Hero extends Char {
if (wep != null) { if (wep != null) {
dmg = wep.damageRoll( this ); dmg = wep.damageRoll( this );
if (heroClass != HeroClass.DUELIST
&& hasTalent(Talent.LIGHTWEIGHT_CHARGE)
&& wep instanceof MeleeWeapon) {
if (((MeleeWeapon) wep).tier == 2) {
dmg = Math.round(dmg * (1f + 0.1f*pointsInTalent(Talent.LIGHTWEIGHT_CHARGE)));
} else if (((MeleeWeapon) wep).tier == 3) {
dmg = Math.round(dmg * (1f + 0.05f*pointsInTalent(Talent.LIGHTWEIGHT_CHARGE)));
}
}
if (!(wep instanceof MissileWeapon)) dmg += RingOfForce.armedDamageBonus(this); if (!(wep instanceof MissileWeapon)) dmg += RingOfForce.armedDamageBonus(this);
} else { } else {
dmg = RingOfForce.damageRoll(this); dmg = RingOfForce.damageRoll(this);
@@ -1228,13 +1240,6 @@ public class Hero extends Char {
if (wep != null) damage = wep.proc( this, enemy, damage ); if (wep != null) damage = wep.proc( this, enemy, damage );
if (buff(Talent.SpiritBladesTracker.class) != null
&& Random.Int(10) < 3*pointsInTalent(Talent.SPIRIT_BLADES)){
SpiritBow bow = belongings.getItem(SpiritBow.class);
if (bow != null) damage = bow.proc( this, enemy, damage );
buff(Talent.SpiritBladesTracker.class).detach();
}
damage = Talent.onAttackProc( this, enemy, damage ); damage = Talent.onAttackProc( this, enemy, damage );
switch (subClass) { switch (subClass) {

View File

@@ -54,6 +54,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.HornOfPlenty;
import com.shatteredpixel.shatteredpixeldungeon.items.rings.Ring; import com.shatteredpixel.shatteredpixeldungeon.items.rings.Ring;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRecharging; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRecharging;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.SpiritBow;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MeleeWeapon; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MeleeWeapon;
@@ -151,7 +152,7 @@ public enum Talent {
//Duelist T2 //Duelist T2
FOCUSED_MEAL(132), RESTORED_AGILITY(133), WEAPON_RECHARGING(134), DUELIST_T2_4(135), SWIFT_EQUIP(136), FOCUSED_MEAL(132), RESTORED_AGILITY(133), WEAPON_RECHARGING(134), DUELIST_T2_4(135), SWIFT_EQUIP(136),
//Duelist T3 //Duelist T3
DUELIST_T3_1(137, 3), DUELIST_T3_2(138, 3), LIGHTWEIGHT_CHARGE(137, 3), DEADLY_FOLLOWUP(138, 3),
//Duelist S1 T3 //Duelist S1 T3
DUELIST_S1_1(139, 3), DUELIST_S1_2(140, 3), DUELIST_S1_3(141, 3), DUELIST_S1_1(139, 3), DUELIST_S1_2(140, 3), DUELIST_S1_3(141, 3),
//Duelist S2 T3 //Duelist S2 T3
@@ -254,6 +255,7 @@ public enum Talent {
secondUse = bundle.getBoolean(SECOND_USE); secondUse = bundle.getBoolean(SECOND_USE);
} }
}; };
public static class DeadlyFollowupTracker extends FlavourBuff{};
int icon; int icon;
int maxPoints; int maxPoints;
@@ -595,6 +597,24 @@ public enum Talent {
} }
} }
if (hero.buff(Talent.SpiritBladesTracker.class) != null
&& Random.Int(10) < 3*hero.pointsInTalent(Talent.SPIRIT_BLADES)){
SpiritBow bow = hero.belongings.getItem(SpiritBow.class);
if (bow != null) dmg = bow.proc( hero, enemy, dmg );
hero.buff(Talent.SpiritBladesTracker.class).detach();
}
if (hero.hasTalent(DEADLY_FOLLOWUP)) {
if (hero.belongings.weapon() instanceof MissileWeapon) {
Buff.prolong(enemy, DeadlyFollowupTracker.class, 5f);
} else if (enemy.buff(DeadlyFollowupTracker.class) != null){
dmg = Math.round(dmg * (1.0f + .08f*hero.pointsInTalent(DEADLY_FOLLOWUP)));
if (!(enemy instanceof Mob) || !((Mob) enemy).surprisedBy(hero)){
Sample.INSTANCE.play(Assets.Sounds.HIT_STRONG, 0.75f, 1.2f);
}
}
}
return dmg; return dmg;
} }
@@ -685,7 +705,7 @@ public enum Talent {
Collections.addAll(tierTalents, POINT_BLANK, SEER_SHOT); Collections.addAll(tierTalents, POINT_BLANK, SEER_SHOT);
break; break;
case DUELIST: case DUELIST:
Collections.addAll(tierTalents, DUELIST_T3_1, DUELIST_T3_2); Collections.addAll(tierTalents, LIGHTWEIGHT_CHARGE, DEADLY_FOLLOWUP);
break; break;
} }
for (Talent talent : tierTalents){ for (Talent talent : tierTalents){

View File

@@ -67,8 +67,8 @@ public class AssassinsBlade extends MeleeWeapon {
} }
@Override @Override
public int abilityChargeUse() { public float abilityChargeUse( Hero hero ) {
return 2; return 2*super.abilityChargeUse(hero);
} }
@Override @Override

View File

@@ -80,8 +80,8 @@ public class Dagger extends MeleeWeapon {
} }
@Override @Override
public int abilityChargeUse() { public float abilityChargeUse( Hero hero ) {
return 2; return 2*super.abilityChargeUse(hero);
} }
@Override @Override

View File

@@ -67,8 +67,8 @@ public class Dirk extends MeleeWeapon {
} }
@Override @Override
public int abilityChargeUse() { public float abilityChargeUse( Hero hero ) {
return 2; return 2*super.abilityChargeUse(hero);
} }
@Override @Override

View File

@@ -82,8 +82,8 @@ public class Flail extends MeleeWeapon {
} }
@Override @Override
public int abilityChargeUse() { public float abilityChargeUse( Hero hero ) {
return (Dungeon.hero.buff(SpinAbilityTracker.class) == null) ? 2 : 0; return 2*super.abilityChargeUse(hero);
} }
@Override @Override

View File

@@ -38,8 +38,12 @@ public class Greatsword extends MeleeWeapon {
} }
@Override @Override
public int abilityChargeUse() { public float abilityChargeUse( Hero hero ) {
return Dungeon.hero.buff(Sword.CleaveTracker.class) != null ? 0 : 1; if (hero.buff(Sword.CleaveTracker.class) != null){
return 0;
} else {
return super.abilityChargeUse( hero );
}
} }
@Override @Override

View File

@@ -38,8 +38,12 @@ public class Longsword extends MeleeWeapon {
} }
@Override @Override
public int abilityChargeUse() { public float abilityChargeUse( Hero hero ) {
return Dungeon.hero.buff(Sword.CleaveTracker.class) != null ? 0 : 1; if (hero.buff(Sword.CleaveTracker.class) != null){
return 0;
} else {
return super.abilityChargeUse( hero );
}
} }
@Override @Override

View File

@@ -97,7 +97,8 @@ public class MeleeWeapon extends Weapon {
} else { } else {
GLog.w(Messages.get(this, "ability_need_equip")); GLog.w(Messages.get(this, "ability_need_equip"));
} }
} else if (Buff.affect(hero, Charger.class).charges < abilityChargeUse()) { } else if ((Buff.affect(hero, Charger.class).charges + Buff.affect(hero, Charger.class).partialCharge)
< abilityChargeUse(hero)) {
GLog.w(Messages.get(this, "ability_no_charge")); GLog.w(Messages.get(this, "ability_no_charge"));
usesTargeting = false; usesTargeting = false;
} else { } else {
@@ -143,8 +144,13 @@ public class MeleeWeapon extends Weapon {
//TODO make abstract //TODO make abstract
protected void duelistAbility( Hero hero, Integer target ){} protected void duelistAbility( Hero hero, Integer target ){}
protected void onAbilityUsed(Hero hero ){ protected void onAbilityUsed( Hero hero ){
Buff.affect(hero, Charger.class).charges -= abilityChargeUse(); Charger charger = Buff.affect(hero, Charger.class);
charger.partialCharge -= abilityChargeUse( hero );
while (charger.partialCharge < 0){
charger.charges--;
charger.partialCharge++;
}
if (hero.heroClass == HeroClass.DUELIST if (hero.heroClass == HeroClass.DUELIST
&& hero.hasTalent(Talent.AGGRESSIVE_BARRIER) && hero.hasTalent(Talent.AGGRESSIVE_BARRIER)
@@ -155,8 +161,14 @@ public class MeleeWeapon extends Weapon {
updateQuickslot(); updateQuickslot();
} }
public int abilityChargeUse(){ public float abilityChargeUse( Hero hero ){
return 1; float chargeUse = 1f;
if (hero.hasTalent(Talent.LIGHTWEIGHT_CHARGE) && tier <= 3){
// T1/2/3 get 50/33/25% charge use reduction at +3
float chargeUseReduction = 1/(1f+tier) * (hero.pointsInTalent(Talent.LIGHTWEIGHT_CHARGE)/3f);
chargeUse *= 1f - chargeUseReduction;
}
return chargeUse;
} }
public int tier; public int tier;

View File

@@ -38,8 +38,12 @@ public class Shortsword extends MeleeWeapon {
} }
@Override @Override
public int abilityChargeUse() { public float abilityChargeUse( Hero hero ) {
return Dungeon.hero.buff(Sword.CleaveTracker.class) != null ? 0 : 1; if (hero.buff(Sword.CleaveTracker.class) != null){
return 0;
} else {
return super.abilityChargeUse( hero );
}
} }
@Override @Override

View File

@@ -46,8 +46,12 @@ public class Sword extends MeleeWeapon {
} }
@Override @Override
public int abilityChargeUse() { public float abilityChargeUse( Hero hero ) {
return Dungeon.hero.buff(CleaveTracker.class) != null ? 0 : 1; if (hero.buff(Sword.CleaveTracker.class) != null){
return 0;
} else {
return super.abilityChargeUse( hero );
}
} }
@Override @Override

View File

@@ -40,8 +40,12 @@ public class WornShortsword extends MeleeWeapon {
} }
@Override @Override
public int abilityChargeUse() { public float abilityChargeUse( Hero hero ) {
return Dungeon.hero.buff(Sword.CleaveTracker.class) != null ? 0 : 1; if (hero.buff(Sword.CleaveTracker.class) != null){
return 0;
} else {
return super.abilityChargeUse( hero );
}
} }
@Override @Override