From 59a5b8885b9e8db45c72204cb72a9fc82a54ae0f Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Fri, 13 Jan 2023 23:23:33 -0500 Subject: [PATCH] v2.0.0: full impl for the Champion subclass, including talents --- .../main/assets/interfaces/talent_icons.png | Bin 5850 -> 5985 bytes .../assets/messages/actors/actors.properties | 15 ++++++-- .../shatteredpixeldungeon/actors/Char.java | 18 ++++++++++ .../actors/hero/Talent.java | 16 +++++++-- .../items/weapon/melee/MeleeWeapon.java | 34 +++++++++++++++--- 5 files changed, 73 insertions(+), 10 deletions(-) diff --git a/core/src/main/assets/interfaces/talent_icons.png b/core/src/main/assets/interfaces/talent_icons.png index b7ed0ffcc5f15b1591ac12cf8a50066167de4415..f5cc67c3ddc7fd780ba502b3f95573723d8988c7 100644 GIT binary patch delta 5704 zcmYLtc|4Te|Ngn}nK5CQ(n1v4EFpyKW@snzh^!e(=pjqWl5*eDW2?*{OHrn$dZ-jB zTb3DAmJ}sR5+nOgjBS?t=kxpLd;WaC&UIby_v@VZb(U_8{(X$S5O}So3?X$blIH*b z&}F-mrvP=h%Nu~r!^aPq+lNDy8PS)zkAOql7ZNo~YL2`uKK|%4hMX^+^e=z2&M}ig zJl4(roLy<7Jk;NBRaaN{ujj+K*dNP3mUNrv10_1?GehSOQpgelephSD(?>ZM!k5RM zloyU_UE4Wu1LIEIq_4NRfxP)Xr6!rfHldvQD~VrFS((yr`JWxl{m(rM%?!2Zbl$o` zmzNzc9Ppr_V}pWNhMYRp)J#whmdJM?hf-@n!7+gP$1Nz}n3aN~VzJ>08rx?eVeQz2niLQ&Z>)5v z71X1pvF_E^3CH>$WJjF}(xj=OKab8NtYvX2I$*YoMLU2_C9h+6w}luBE5YEvq8x5q zNXxxENzs()VZ8<)q|29nRk~HPG$*W;OC`t$H7h#W{>yL((l#6SlG)L76m<~GW`OBl zO>vNc_pKj6zBL3WvFmNO&YG_-!HQ5%6^&Ge#NgQzK(eaxTHMm#ZJ!(qz?4J4zQLdP zE^GcyXjl!n?V(Of^tKQhtc7)P+|>dt8uU=j?&4R%^uWpL<6vn*XUeNH@*O8~MFcvc z750vh|DjY5#oG={EA+fubwop8uWNW;%rZg*X*GsDuDQL$Mr~;WLP5;PY{v4OsRG-O zX>&Sky>uYt8#3-`tJfOQGY$)cOF5_gQmBz zQ_UG!l(;%*wmnCv0j80=&^mE6cxm#`rD4YrK@|Cd%&jpM8T=LOF{$C+>kTS~WMpDV zN1>=W(#+r~c4&!`^sQ80{2WQ!u~I09$(5?e4Ly8iiQ zGTj`S&!-R9_Zv!?kcp>g#$lEW%)|(7bUCu6s zIPM@XM-_}ch+%vGb%^^KE>S0BBmk~orhy1@>{S-#AkKM?Wg54tM4d-K* zwkB={d-Qpl?u66Q)P8*uAShAKf>Eu4mWBiD1b@?eAHl2Z1Qg~#j4t?lBu=(Z4LFxa z$*q@!O>w8R!J_%|lITsS39jpm7&xA&5`ghsonokB&VP`9-CVXEN#Ca2J|vF#i)a*X zZzlQwk`$T6rZ}b-i8DJu-uI3fxjz|}ZGRrw6;#$&5QhuWRx4k9AF)bXuV)V-_!&^58ImQ?S|witm_mR$>S( z5&bzdD1ADztKJQauj*Q+w+jynmG}4;kQcvF6R}_01qwmNve)EH55%OFzeqF8X4XGu zg{7cZ=wX3Sy4m`j7$gaWO0WZ?25io#VjK8jzpv683&=w0wr4e-N3rtE%Rj3Y3$}mJ zU*4Ng8Xkw-Vuj805(E#2IDuC;c*`6#S-*dB7wB%$H&(-TbjyN{90`;k$8YJ&g_zeD zPQ6MAozIa=ygKu`kE7;T{o%v<7umwziZFU;n3J&E_(H6lx;TQg&Q7fdUW7Vr6pA1E(Z^ew!Qn^^4YDg{ zEV{7Po~MzZjcTwT;u!9Gz#rP$f_#A!F)>i21o;Y%E+AImG8Q-ngS6CSz4NypRLwXt zXD`yekV)CN?*xwie>c5YJ&f#$2!ImF^6XC=lbuofeKYi^y4_0Zhzuxu@E9X< zBhVWBw(o6H1axRhv5>2O~diCN1Lqp2#I{8oJM;?Xx?kg}_x`wKMpbys9k3^h|7 zc)7bfK^%O}&_r!ME%SrZr!`{oQpFi58M^1-=CtW5Yh24c%w&tZ3xC`Mlv2ovq6-T7 zEtklsE?40X)|iSYCvmxtv6XU9*>&&#)RJ?|4qLJtLjSIJ6RBS@@PQjn#L3W4+!wjT za&I%M=wX+RaJmsWC`p(jY8rJ#UQq

?1tlZXL=(i(Y?u%zXF($d` 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 VDLgJ&Emu~<=HRgd1^eA@{2wSUYnlK6 diff --git a/core/src/main/assets/messages/actors/actors.properties b/core/src/main/assets/messages/actors/actors.properties index f5bcc5235..ac77bb169 100644 --- a/core/src/main/assets/messages/actors/actors.properties +++ b/core/src/main/assets/messages/actors/actors.properties @@ -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 diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java index 7e4d84295..5b15cb0f7 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java @@ -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(); 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 a2e863e88..f6c5a8669 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 @@ -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); 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 a71e0a464..bcf893e2f 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 @@ -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 ){