v2.4.0: Big Duelist charge speed changes:

- charge speed down by 33%
- ALL weapon abilities buffed to compensate
- Champion weapons now share a charge count
- Champion now gives bonus charges and charge speed

Champion's secondary charge talent does nothing ATM, and RoF has not been changed, both coming in later commits
This commit is contained in:
Evan Debenham
2024-04-11 16:19:12 -04:00
parent 4bddef477e
commit 11a410f07d
37 changed files with 234 additions and 327 deletions

View File

@@ -595,8 +595,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 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.champion_short_desc=The _Champion_ can wield two weapons and gets more weapon charges. 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 and use either weapon's ability.\n\nShe also gains 2 more max weapon ability charges and +50% weapon ability recharge speed.
actors.hero.herosubclass.monk=monk
actors.hero.herosubclass.monk_short_desc=The _Monk_ builds energy while fighting. This energy can be spent on a variety of unique abilities.
actors.hero.herosubclass.monk_desc=The Monk is a master of physical technique. As she defeats enemies, she gains energy which can be used on a variety of defensive and utility-focused abilities. This energy does not fade over time, but has a cap based on the Monk's level.\n\n1 Energy: quickly strike with fists\n2 Energy: focus to dodge next attack\n3 Energy: instantly dash nearby\n4 Energy: kick an enemy away\n5 Energy: meditate to restore charges

View File

@@ -1589,22 +1589,22 @@ items.weapon.enchantments.vampiric.elestrike_desc=An elemental strike with a vam
items.weapon.melee.assassinsblade.name=assassin's blade
items.weapon.melee.assassinsblade.stats_desc=This weapon is stronger against unaware enemies.
items.weapon.melee.assassinsblade.ability_name=sneak
items.weapon.melee.assassinsblade.typical_ability_desc=The Duelist can _sneak_ while wielding an assassin's blade. This ability lets the Duelist instantly blink up to 3 tiles away and typically grants her _%d turns of invisibility,_ but costs 2 charges.
items.weapon.melee.assassinsblade.ability_desc=The Duelist can _sneak_ while wielding an assassin's blade. This ability lets the Duelist instantly blink up to 3 tiles away and grants her _%d turns of invisibility,_ but costs 2 charges.
items.weapon.melee.assassinsblade.typical_ability_desc=The Duelist can _sneak_ while wielding an assassin's blade. This ability lets the Duelist instantly blink up to 3 tiles away and typically grants her _%d turns of invisibility._
items.weapon.melee.assassinsblade.ability_desc=The Duelist can _sneak_ while wielding an assassin's blade. This ability lets the Duelist instantly blink up to 3 tiles away and grants her _%d turns of invisibility._
items.weapon.melee.assassinsblade.desc=A small wavy blade made of obsidian, difficult to use despite being lightweight, but deadly if it finds the right mark.
items.weapon.melee.battleaxe.name=battle axe
items.weapon.melee.battleaxe.stats_desc=This is a rather accurate weapon.
items.weapon.melee.battleaxe.ability_name=heavy blow
items.weapon.melee.battleaxe.typical_ability_desc=The Duelist can perform a _heavy blow_ with a battle axe. This concentrated attack typically deals _%1$d-%2$d damage_ and dazes for 5 turns, reducing accuracy and evasion by 50%%. This ability costs 2 charges if it does not surprise the enemy.
items.weapon.melee.battleaxe.ability_desc=The Duelist can perform a _heavy blow_ with a battle axe. This concentrated attack deals _%1$d-%2$d damage_ and dazes for 5 turns, reducing accuracy and evasion by 50%%. This ability costs 2 charges if it does not surprise the enemy.
items.weapon.melee.battleaxe.typical_ability_desc=The Duelist can perform a _heavy blow_ with a battle axe. This concentrated attack typically deals _%1$d-%2$d damage_ if it surprised the enemy, and dazes them for 5 turns which reduces accuracy and evasion by 50%%. Heavy blow deals regular damage if it does not surprise the enemy.
items.weapon.melee.battleaxe.ability_desc=The Duelist can perform a _heavy blow_ with a battle axe. This concentrated attack deals _%1$d-%2$d damage_ if it surprised the enemy, and dazes them for 5 turns which reduces accuracy and evasion by 50%%. Heavy blow deals regular damage if it does not surprise the enemy.
items.weapon.melee.battleaxe.desc=The enormous steel head of this battle axe puts considerable heft behind each wide stroke.
items.weapon.melee.crossbow.name=crossbow
items.weapon.melee.crossbow.stats_desc=This weapon enhances the damage of thrown darts when equipped, and will even grant its enchantment to them.
items.weapon.melee.crossbow.ability_name=charged shot
items.weapon.melee.crossbow.typical_ability_desc=The Duelist can ready a _charged shot_ with a crossbow. This ability activates instantly and causes the next fired dart to always hit, apply on-hit effects to enemies in a 5x5 tile area, and typically last for _%d more uses_ if it is tipped.
items.weapon.melee.crossbow.ability_desc=The Duelist can ready a _charged shot_ with a crossbow. This ability activates instantly and causes the next fired dart to always hit, apply on-hit effects to enemies in a 5x5 tile area, and last last for _%d more uses_ if it is tipped.
items.weapon.melee.crossbow.typical_ability_desc=The Duelist can ready a _charged shot_ with a crossbow. This ability activates instantly and causes the next fired dart to always hit, apply on-hit effects to enemies in a 7x7 tile area, and typically last for _%d more uses_ if it is tipped.
items.weapon.melee.crossbow.ability_desc=The Duelist can ready a _charged shot_ with a crossbow. This ability activates instantly and causes the next fired dart to always hit, apply on-hit effects to enemies in a 7x7 tile area, and last last for _%d more uses_ if it is tipped.
items.weapon.melee.crossbow.desc=A fairly intricate weapon which shoots bolts at exceptional speeds. While it isn't designed for it, this crossbow's heft and sturdy construction make it a decent melee weapon as well.
items.weapon.melee.crossbow$chargedshot.name=charged shot
items.weapon.melee.crossbow$chargedshot.desc=The Duelist is focusing power into her crossbow. The next dart she fires with it will always hit and apply tipped dart effects and the crossbow's enchantment in a 5x5 area. Positive dart effects will only affect allies, and harmful effects will only apply to enemies.\n\nTipped darts will also have four extra uses when fired using a charged shot. The Duelist cannot use this ability to apply positive dart effects to herself.
@@ -1612,23 +1612,23 @@ items.weapon.melee.crossbow$chargedshot.desc=The Duelist is focusing power into
items.weapon.melee.dagger.name=dagger
items.weapon.melee.dagger.stats_desc=This weapon is stronger against unaware enemies.
items.weapon.melee.dagger.ability_name=sneak
items.weapon.melee.dagger.typical_ability_desc=The Duelist can _sneak_ while wielding a dagger. This ability lets the Duelist instantly blink up to 5 tiles away and typically grants her _%d turns of invisibility_, but costs 2 charges.
items.weapon.melee.dagger.ability_desc=The Duelist can _sneak_ while wielding a dagger. This ability lets the Duelist instantly blink up to 5 tiles away and grants her _%d turns of invisibility_, but costs 2 charges.
items.weapon.melee.dagger.typical_ability_desc=The Duelist can _sneak_ while wielding a dagger. This ability lets the Duelist instantly blink up to 5 tiles away and typically grants her _%d turns of invisibility._
items.weapon.melee.dagger.ability_desc=The Duelist can _sneak_ while wielding a dagger. This ability lets the Duelist instantly blink up to 5 tiles away and grants her _%d turns of invisibility._
items.weapon.melee.dagger.desc=A simple iron dagger with a worn wooden handle.
items.weapon.melee.dirk.name=dirk
items.weapon.melee.dirk.stats_desc=This weapon is stronger against unaware enemies.
items.weapon.melee.dirk.ability_name=sneak
items.weapon.melee.dirk.typical_ability_desc=The Duelist can _sneak_ while wielding a dirk. This ability lets the Duelist instantly blink up to 4 tiles away and typically grants her _%d turns of invisibility_, but costs 2 charges.
items.weapon.melee.dirk.ability_desc=The Duelist can _sneak_ while wielding a dirk. This ability lets the Duelist instantly blink up to 4 tiles away and grants her _%d turns of invisibility_, but costs 2 charges.
items.weapon.melee.dirk.typical_ability_desc=The Duelist can _sneak_ while wielding a dirk. This ability lets the Duelist instantly blink up to 4 tiles away and typically grants her _%d turns of invisibility._
items.weapon.melee.dirk.ability_desc=The Duelist can _sneak_ while wielding a dirk. This ability lets the Duelist instantly blink up to 4 tiles away and grants her _%d turns of invisibility._
items.weapon.melee.dirk.desc=A longer thrusting dagger, gives a bit more steel to plunge into foes.
items.weapon.melee.flail.name=flail
items.weapon.melee.flail.stats_desc=This is a rather inaccurate weapon.\nThis weapon cannot surprise attack.
items.weapon.melee.flail.ability_name=spin
items.weapon.melee.flail.spin_warn=You can't spin the flail any more.
items.weapon.melee.flail.typical_ability_desc=The Duelist can _spin_ a flail to build up power for a short time. Each turn the flail is spun it will typically deal _+%d damage_, to a max of 3 times. A spinning flail is also guaranteed to hit. Starting to spin the flail costs 2 charges.
items.weapon.melee.flail.ability_desc=The Duelist can _spin_ a flail to build up power for a short time. Each turn the flail is spun it will deal _+%d damage_, to a max of 3 times. A spinning flail is also guaranteed to hit. Starting to spin the flail costs 2 charges.
items.weapon.melee.flail.typical_ability_desc=The Duelist can _spin_ a flail to build up power for a short time. Each turn the flail is spun it will typically deal _+%d damage_, to a max of 3 times. A spinning flail is also guaranteed to hit. Only starting to spin the flail costs a charge.
items.weapon.melee.flail.ability_desc=The Duelist can _spin_ a flail to build up power for a short time. Each turn the flail is spun it will deal _+%d damage_, to a max of 3 times. A spinning flail is also guaranteed to hit. Only starting to spin the flail costs a charge.
items.weapon.melee.flail.desc=A spiked ball attached to a handle by a length of chain. Very unwieldy, but devastating if it lands a solid hit.
items.weapon.melee.flail$spinabilitytracker.name=spinning
items.weapon.melee.flail$spinabilitytracker.desc=The Duelist is spinning her flail, building damage for her next attack with it. Each spin takes one turn but increases damage, to a max of three spins. The flail is also guaranteed to hit while spinning.\n\nCurrent spins: %1$d%%.\nTurns remaining: %2$s.
@@ -1657,29 +1657,29 @@ items.weapon.melee.gloves.desc=These studded gloves don't provide any real prote
items.weapon.melee.greataxe.name=greataxe
items.weapon.melee.greataxe.stats_desc=This weapon is incredibly heavy.
items.weapon.melee.greataxe.ability_name=retribution
items.weapon.melee.greataxe.typical_ability_desc=The Duelist can perform a _retribution_ attack with a greataxe if she is below 50%% health. This devastating attack typically deals _%1$d-%2$d damage_ and is guaranteed to hit.
items.weapon.melee.greataxe.ability_desc=The Duelist can perform a _retribution_ attack with a greataxe if she is below 50%% health. This devastating attack typically deals _%1$d-%2$d damage_ and is guaranteed to hit.
items.weapon.melee.greataxe.typical_ability_desc=The Duelist can perform a _retribution_ attack with a greataxe if she is below 50%% health. This devastating attack typically deals _%1$d-%2$d damage,_ is guaranteed to hit, and is instantaneous if it kills an enemy.
items.weapon.melee.greataxe.ability_desc=The Duelist can perform a _retribution_ attack with a greataxe if she is below 50%% health. This devastating attack deals _%1$d-%2$d damage,_ is guaranteed to hit, and is instantaneous if it kills an enemy.
items.weapon.melee.greataxe.desc=Meant to be wielded over the shoulder, this titanic axe is as powerful as it is heavy.
items.weapon.melee.greatshield.name=greatshield
items.weapon.melee.greatshield.typical_stats_desc=Typically this weapon blocks 0-%d damage. This blocking scales with upgrades.
items.weapon.melee.greatshield.stats_desc=This weapon blocks 0-%d damage. This blocking scales with upgrades.
items.weapon.melee.greatshield.ability_name=guard
items.weapon.melee.greatshield.typical_ability_desc=The Duelist can _guard_ herself with a greatshield, completely negating the next physical or magical attack made against her typically within _%d turns_.
items.weapon.melee.greatshield.ability_desc=The Duelist can _guard_ herself with a greatshield, completely negating the next physical or magical attack made against her within _%d turns_.
items.weapon.melee.greatshield.typical_ability_desc=The Duelist can _guard_ herself with a greatshield, completely negating all physical or magical attacks made against her typically for _%d turns_. Once the Duelist has blocked an attack, attacking back or using magic will end guarding.
items.weapon.melee.greatshield.ability_desc=The Duelist can _guard_ herself with a greatshield, completely negating all physical or magical attacks made against her for _%d turns_. Once the Duelist has blocked an attack, attacking back or using magic will end guarding.
items.weapon.melee.greatshield.desc=More like a mobile wall than a shield, this gigantic mass of metal aids defense, but doesn't leave much room for attacking.
items.weapon.melee.greatsword.name=greatsword
items.weapon.melee.greatsword.ability_name=cleave
items.weapon.melee.greatsword.typical_ability_desc=The Duelist can _cleave_ an enemy with a greatsword. This typically deals _%1$d-%2$d damage_ and is guaranteed to hit. If cleave kills an enemy the Duelist can use cleave again within 5 turns for free.
items.weapon.melee.greatsword.ability_desc=The Duelist can _cleave_ an enemy with a greatsword. This deals _%1$d-%2$d damage_ and is guaranteed to hit. If cleave kills an enemy the Duelist can use cleave again within 5 turns for free.
items.weapon.melee.greatsword.typical_ability_desc=The Duelist can _cleave_ an enemy with a greatsword. This typically deals _%1$d-%2$d damage_ and is guaranteed to hit. If cleave kills an enemy it is instantaneous and the Duelist can use cleave again within 5 turns for free.
items.weapon.melee.greatsword.ability_desc=The Duelist can _cleave_ an enemy with a greatsword. This deals _%1$d-%2$d damage_ and is guaranteed to hit. If cleave kills an enemy it is instantaneous and the Duelist can use cleave again within 5 turns for free.
items.weapon.melee.greatsword.desc=This towering blade inflicts heavy damage by investing its heft into every swing.
items.weapon.melee.handaxe.name=hand axe
items.weapon.melee.handaxe.stats_desc=This is a rather accurate weapon.
items.weapon.melee.handaxe.ability_name=heavy blow
items.weapon.melee.handaxe.typical_ability_desc=The Duelist can perform a _heavy blow_ with a hand axe. This concentrated attack typically deals _%1$d-%2$d damage_ and dazes for 5 turns, reducing accuracy and evasion by 50%%. This ability costs 2 charges if it does not surprise the enemy.
items.weapon.melee.handaxe.ability_desc=The Duelist can perform a _heavy blow_ with a hand axe. This concentrated attack deals _%1$d-%2$d damage_ and dazes for 5 turns, reducing accuracy and evasion by 50%%. This ability costs 2 charges if it does not surprise the enemy.
items.weapon.melee.handaxe.typical_ability_desc=The Duelist can perform a _heavy blow_ with a hand axe. This concentrated attack typically deals _%1$d-%2$d damage_ if it surprised the enemy, and dazes them for 5 turns which reduces accuracy and evasion by 50%%. Heavy blow deals regular damage if it does not surprise the enemy.
items.weapon.melee.handaxe.ability_desc=The Duelist can perform a _heavy blow_ with a hand axe. This concentrated attack deals _%1$d-%2$d damage_ if it surprised the enemy, and dazes them for 5 turns which reduces accuracy and evasion by 50%%. Heavy blow deals regular damage if it does not surprise the enemy.
items.weapon.melee.handaxe.desc=A light axe, most commonly used for felling trees. The wide blade works well against foes as well.
items.weapon.melee.katana.name=katana
@@ -1698,8 +1698,8 @@ items.weapon.melee.longsword.desc=This sword's long razor-sharp steel blade shin
items.weapon.melee.mace.name=mace
items.weapon.melee.mace.stats_desc=This is a rather accurate weapon.
items.weapon.melee.mace.ability_name=heavy blow
items.weapon.melee.mace.typical_ability_desc=The Duelist can perform a _heavy blow_ with a mace. This concentrated attack typically deals _%1$d-%2$d damage_ and dazes for 5 turns, reducing accuracy and evasion by 50%%. This ability costs 2 charges if it does not surprise the enemy.
items.weapon.melee.mace.ability_desc=The Duelist can perform a _heavy blow_ with a mace. This concentrated attack deals _%1$d-%2$d damage_ and dazes for 5 turns, reducing accuracy and evasion by 50%%. This ability costs 2 charges if it does not surprise the enemy.
items.weapon.melee.mace.typical_ability_desc=The Duelist can perform a _heavy blow_ with a mace. This concentrated attack typically deals _%1$d-%2$d damage_ if it surprised the enemy, and dazes them for 5 turns which reduces accuracy and evasion by 50%%. Heavy blow deals regular damage if it does not surprise the enemy.
items.weapon.melee.mace.ability_desc=The Duelist can perform a _heavy blow_ with a mace. This concentrated attack deals _%1$d-%2$d damage_ if it surprised the enemy, and dazes them for 5 turns which reduces accuracy and evasion by 50%%. Heavy blow deals regular damage if it does not surprise the enemy.
items.weapon.melee.mace.desc=The large iron head of this weapon inflicts substantial damage.
items.weapon.melee.magesstaff.name=mage's staff
@@ -1739,15 +1739,15 @@ items.weapon.melee.meleeweapon.swap_full=You can't do that with a full inventory
items.weapon.melee.shortsword.name=shortsword
items.weapon.melee.shortsword.ability_name=cleave
items.weapon.melee.shortsword.typical_ability_desc=The Duelist can _cleave_ an enemy with a shortsword. This typically deals _%1$d-%2$d damage_ and is guaranteed to hit. If cleave kills an enemy the Duelist can use cleave again within 5 turns for free.
items.weapon.melee.shortsword.ability_desc=The Duelist can _cleave_ an enemy with a shortsword. This deals _%1$d-%2$d damage_ and is guaranteed to hit. If cleave kills an enemy the Duelist can use cleave again within 5 turns for free.
items.weapon.melee.shortsword.typical_ability_desc=The Duelist can _cleave_ an enemy with a shortsword. This typically deals _%1$d-%2$d damage_ and is guaranteed to hit. If cleave kills an enemy it is instantaneous and the Duelist can use cleave again within 5 turns for free.
items.weapon.melee.shortsword.ability_desc=The Duelist can _cleave_ an enemy with a shortsword. This deals _%1$d-%2$d damage_ and is guaranteed to hit. If cleave kills an enemy it is instantaneous and the Duelist can use cleave again within 5 turns for free.
items.weapon.melee.shortsword.desc=A quite short sword, only a few inches longer than a dagger.
items.weapon.melee.quarterstaff.name=quarterstaff
items.weapon.melee.quarterstaff.stats_desc=This weapon blocks 0-2 damage.
items.weapon.melee.quarterstaff.ability_name=defensive stance
items.weapon.melee.quarterstaff.typical_ability_desc=The Duelist can assume a _defensive stance_ with a quarterstaff. This stance triples her evasion typically for _%d turns_ and takes no time to activate, but costs 2 charges.
items.weapon.melee.quarterstaff.ability_desc=The Duelist can assume a _defensive stance_ with a quarterstaff. This stance triples her evasion for _%d turns_ and takes no time to activate, but costs 2 charges.
items.weapon.melee.quarterstaff.typical_ability_desc=The Duelist can assume a _defensive stance_ with a quarterstaff. This stance takes no times to activate and triples her evasion typically for _%d turns._
items.weapon.melee.quarterstaff.ability_desc=The Duelist can assume a _defensive stance_ with a quarterstaff. This stance takes no times to activate and triples her evasion for _%d turns._
items.weapon.melee.quarterstaff.desc=A staff of hardwood, its ends are shod with iron.
items.weapon.melee.quarterstaff$defensivestance.name=defensive stance
items.weapon.melee.quarterstaff$defensivestance.desc=The Duelist is using her quarterstaff to deflect incoming blows and projectiles. As long as she is in this stance, her evasion against all attacks is tripled.\n\nTurns remaining: %s.
@@ -1763,12 +1763,12 @@ items.weapon.melee.roundshield.name=round shield
items.weapon.melee.roundshield.typical_stats_desc=Typically this weapon blocks 0-%d damage. This blocking scales with upgrades.
items.weapon.melee.roundshield.stats_desc=This weapon blocks 0-%d damage. This blocking scales with upgrades.
items.weapon.melee.roundshield.ability_name=guard
items.weapon.melee.roundshield.typical_ability_desc=The Duelist can _guard_ herself with a round shield, completely negating the next physical or magical attack made against her typically within _%d turns_.
items.weapon.melee.roundshield.ability_desc=The Duelist can _guard_ herself with a round shield, completely negating the next physical or magical attack made against her within _%d turns_.
items.weapon.melee.roundshield.typical_ability_desc=The Duelist can _guard_ herself with a round shield, completely negating all physical or magical attacks made against her typically for _%d turns_. Once the Duelist has blocked an attack, attacking back or using magic will end guarding.
items.weapon.melee.roundshield.ability_desc=The Duelist can _guard_ herself with a round shield, completely negating all physical or magical attacks made against her for _%d turns_. Once the Duelist has blocked an attack, attacking back or using magic will end guarding.
items.weapon.melee.roundshield.desc=This large shield effectively blocks attacks and makes a decent weapon in a pinch.
items.weapon.melee.roundshield$guardtracker.name=guarding
items.weapon.melee.roundshield$guardtracker.guarded=guarded
items.weapon.melee.roundshield$guardtracker.desc=The Duelist has readied her shield in anticipation of an incoming attack. The next physical or magical attack made against her will be completely negated.\n\nTurns remaining: %s.
items.weapon.melee.roundshield$guardtracker.desc=The Duelist has readied her shield in anticipation of incoming attacks. Physical or magical attack made against her will be completely negated.\n\nTurns remaining: %s.
items.weapon.melee.runicblade.name=runic blade
items.weapon.melee.runicblade.stats_desc=This weapon benefits more from upgrades.
@@ -1780,26 +1780,26 @@ items.weapon.melee.runicblade.desc=A mysterious weapon from a distant land, with
items.weapon.melee.sai.name=sai
items.weapon.melee.sai.stats_desc=This is a very fast weapon.
items.weapon.melee.sai.ability_name=combo strike
items.weapon.melee.sai.typical_ability_desc=The Duelist can perform a _combo strike_ with sai. This attack is guaranteed to hit and typically deals _+%d damage_ for each time the Duelist has already successfully attacked with melee or thrown weapons in the last 5 turns.
items.weapon.melee.sai.ability_desc=The Duelist can perform a _combo strike_ with sai. This attack is guaranteed to hit and deals _+%d damage_ for each time the Duelist has already successfully attacked with melee or thrown weapons in the last 5 turns.
items.weapon.melee.sai.typical_ability_desc=The Duelist can perform a _combo strike_ with sai. This attack is guaranteed to hit and typically deals _+%d damage_ for each time the Duelist has successfully attacked with a melee or thrown weapon recently. Not successfully attacking for 5 turns resets this combo.
items.weapon.melee.sai.ability_desc=The Duelist can perform a _combo strike_ with sai. This attack is guaranteed to hit and deals _+%d damage_ for each time the Duelist has successfully attacked with a melee or thrown weapon recently. Not successfully attacking for 5 turns resets this combo.
items.weapon.melee.sai.desc=Two thin blades meant to be wielded in one hand each. Excellent for tearing down enemies with a flurry of cuts.
items.weapon.melee.sai$combostriketracker.name=combo strike
items.weapon.melee.sai$combostriketracker.desc=The Duelist is building combo that can be used to increase the damage of the combo strike ability. Each strike made with a melee or thrown weapon in the last 5 turns will count.\n\nRecent hits: %d.
items.weapon.melee.sai$combostriketracker.desc=The Duelist is building combo that can be used to increase the damage of the combo strike ability. Each sucessful attack made with a melee or thrown weapon will count, but not successfully attacking for 5 turns resets this combo.\n\nRecent hits: %1$d.\n\nTurns until hits are lost: %2$s.
items.weapon.melee.scimitar.name=scimitar
items.weapon.melee.scimitar.stats_desc=This is a rather fast weapon.
items.weapon.melee.scimitar.ability_name=sword dance
items.weapon.melee.scimitar.typical_ability_desc=The Duelist can perform a _sword dance_ with a scimitar. This stance grants the Duelist +60%% attack speed and +25%% accuracy typically for _%d turns_, takes no time to activate, and costs 2 charges.
items.weapon.melee.scimitar.ability_desc=The Duelist can perform a _sword dance_ with a scimitar. This stance grants the Duelist +60%% attack speed and +25%% accuracy for _%d turns_, takes no time to activate, and costs 2 charges.
items.weapon.melee.scimitar.typical_ability_desc=The Duelist can perform a _sword dance_ with a scimitar. This stance takes no time to activate and grants the Duelist +60%% attack speed and +50%% accuracy typically for _%d turns._
items.weapon.melee.scimitar.ability_desc=The Duelist can perform a _sword dance_ with a scimitar. This stance takes no time to activate and grants the Duelist +60%% attack speed and +50%% accuracy for _%d turns._
items.weapon.melee.scimitar.desc=A thick curved blade. Its shape allows for faster, yet less powerful attacks.
items.weapon.melee.scimitar$sworddance.name=sword dance
items.weapon.melee.scimitar$sworddance.desc=The Duelist is making quick momentum based strikes in a sort of dance. While this stance is active, she attacks 60%% faster (enough to attack exactly twice a turn with a scimitar) and has +25%% accuracy.\n\nTurns remaining: %s.
items.weapon.melee.scimitar$sworddance.desc=The Duelist is making quick momentum based strikes in a sort of dance. While this stance is active, she attacks 60%% faster (enough to attack exactly twice a turn with a scimitar) and has +50%% accuracy.\n\nTurns remaining: %s.
items.weapon.melee.sickle.name=sickle
items.weapon.melee.sickle.stats_desc=This is a rather inaccurate weapon.
items.weapon.melee.sickle.ability_name=harvest
items.weapon.melee.sickle.typical_ability_desc=The Duelist can _harvest_ an enemy with a sickle. This devastating attack typically inflicts _%1$d-%2$d bleeding_ instead of damage and is guaranteed to hit, but costs 2 charges.
items.weapon.melee.sickle.ability_desc=The Duelist can _harvest_ an enemy with a sickle. This devastating attack inflicts _%1$d-%2$d bleeding_ instead of damage and is guaranteed to hit, but costs 2 charges.
items.weapon.melee.sickle.typical_ability_desc=The Duelist can _harvest_ an enemy with a sickle. This devastating attack is guaranteed to hit and typically deals _%d damage,_ but applies the damage as bleeding instead.
items.weapon.melee.sickle.ability_desc=The Duelist can _harvest_ an enemy with a sickle. This devastating attack is guaranteed to hit and deals _%d damage,_ but applies the damage as bleeding instead.
items.weapon.melee.sickle.desc=A handheld farming tool that can double as a strong but unwieldy weapon.
items.weapon.melee.spear.name=spear
@@ -1811,8 +1811,8 @@ items.weapon.melee.spear.desc=A slender wooden rod tipped with sharpened iron.
items.weapon.melee.sword.name=sword
items.weapon.melee.sword.ability_name=cleave
items.weapon.melee.sword.typical_ability_desc=The Duelist can _cleave_ an enemy with a sword. This typically deals _%1$d-%2$d damage_ and is guaranteed to hit. If cleave kills an enemy the Duelist can use cleave again within 5 turns for free.
items.weapon.melee.sword.ability_desc=The Duelist can _cleave_ an enemy with a sword. This deals _%1$d-%2$d damage_ and is guaranteed to hit. If cleave kills an enemy the Duelist can use cleave again within 5 turns for free.
items.weapon.melee.sword.typical_ability_desc=The Duelist can _cleave_ an enemy with a sword. This typically deals _%1$d-%2$d damage_ and is guaranteed to hit. If cleave kills an enemy it is instantaneous and the Duelist can use cleave again within 5 turns for free.
items.weapon.melee.sword.ability_desc=The Duelist can _cleave_ an enemy with a sword. This deals _%1$d-%2$d damage_ and is guaranteed to hit. If cleave kills an enemy it is instantaneous and the Duelist can use cleave again within 5 turns for free.
items.weapon.melee.sword.desc=A nicely balanced sword. Not too large, but still notably longer than a shortsword.
items.weapon.melee.sword$cleavetracker.name=cleave
items.weapon.melee.sword$cleavetracker.desc=The Duelist is ready to follow up on her previous cleave. The next use of cleave will not cost any weapon ability charge.\n\nTurns remaining: %s.
@@ -1820,15 +1820,15 @@ items.weapon.melee.sword$cleavetracker.desc=The Duelist is ready to follow up on
items.weapon.melee.warhammer.name=war hammer
items.weapon.melee.warhammer.stats_desc=This is a rather accurate weapon.
items.weapon.melee.warhammer.ability_name=heavy blow
items.weapon.melee.warhammer.typical_ability_desc=The Duelist can perform a _heavy blow_ with a war hammer. This concentrated attack typically deals _%1$d-%2$d damage_ and dazes for 5 turns, reducing accuracy and evasion by 50%%. This ability costs 2 charges if it does not surprise the enemy.
items.weapon.melee.warhammer.ability_desc=The Duelist can perform a _heavy blow_ with a war hammer. This concentrated attack deals _%1$d-%2$d damage_ and dazes for 5 turns, reducing accuracy and evasion by 50%%. This ability costs 2 charges if it does not surprise the enemy.
items.weapon.melee.warhammer.typical_ability_desc=The Duelist can perform a _heavy blow_ with a war hammer. This concentrated attack typically deals _%1$d-%2$d damage_ if it surprised the enemy, and dazes them for 5 turns which reduces accuracy and evasion by 50%%. Heavy blow deals regular damage if it does not surprise the enemy.
items.weapon.melee.warhammer.ability_desc=The Duelist can perform a _heavy blow_ with a war hammer. This concentrated attack deals _%1$d-%2$d damage_ if it surprised the enemy, and dazes them for 5 turns which reduces accuracy and evasion by 50%%. Heavy blow deals regular damage if it does not surprise the enemy.
items.weapon.melee.warhammer.desc=Few creatures can withstand the crushing blow of this towering mass of lead and steel, but it takes great strength to use effectively.
items.weapon.melee.warscythe.name=war scythe
items.weapon.melee.warscythe.stats_desc=This is a rather inaccurate weapon.
items.weapon.melee.warscythe.ability_name=harvest
items.weapon.melee.warscythe.typical_ability_desc=The Duelist can _harvest_ an enemy with a war scythe. This devastating attack typically inflicts _%1$d-%2$d bleeding_ instead of damage and is guaranteed to hit, but costs 2 charges.
items.weapon.melee.warscythe.ability_desc=The Duelist can _harvest_ an enemy with a war scythe. This devastating attack inflicts _%1$d-%2$d bleeding_ instead of damage and is guaranteed to hit, but costs 2 charges.
items.weapon.melee.warscythe.typical_ability_desc=The Duelist can _harvest_ an enemy with a war scythe. This devastating attack is guaranteed to hit and typically deals _%d damage,_ but applies the damage as bleeding instead.
items.weapon.melee.warscythe.ability_desc=The Duelist can _harvest_ an enemy with a war scythe. This devastating attack is guaranteed to hit and typically deals _%d damage,_ but applies the damage as bleeding instead.
items.weapon.melee.warscythe.desc=This large and unwieldy tool has been reinforced to make it better at cutting foes than crops.
items.weapon.melee.whip.name=whip
@@ -1840,8 +1840,8 @@ items.weapon.melee.whip.desc=While the barbed length of rope at the end of this
items.weapon.melee.wornshortsword.name=worn shortsword
items.weapon.melee.wornshortsword.ability_name=cleave
items.weapon.melee.wornshortsword.typical_ability_desc=The Duelist can _cleave_ an enemy with a worn shortsword. This typically deals _%1$d-%2$d damage_ and is guaranteed to hit. If cleave kills an enemy the Duelist can use cleave again within 5 turns for free.
items.weapon.melee.wornshortsword.ability_desc=The Duelist can _cleave_ an enemy with a worn shortsword. This deals _%1$d-%2$d damage_ and is guaranteed to hit. If cleave kills an enemy the Duelist can use cleave again within 5 turns for free.
items.weapon.melee.wornshortsword.typical_ability_desc=The Duelist can _cleave_ an enemy with a worn shortsword. This typically deals _%1$d-%2$d damage_ and is guaranteed to hit. If cleave kills an enemy it is instantaneous and the Duelist can use cleave again within 5 turns for free.
items.weapon.melee.wornshortsword.ability_desc=The Duelist can _cleave_ an enemy with a worn shortsword. This deals _%1$d-%2$d damage_ and is guaranteed to hit. If cleave kills an enemy it is instantaneous and the Duelist can use cleave again within 5 turns for free.
items.weapon.melee.wornshortsword.desc=A quite short sword, worn down through heavy use. It is both weaker and a bit lighter than a shortsword in better condition.
@@ -2073,7 +2073,7 @@ items.kindofmisc.unequip_message=You must unequip one of these items first. Sele
items.kindofweapon.swift_equip=You swiftly equip your weapon.
items.kindofweapon.equip_cursed=Your grip involuntarily tightens around the weapon.
items.kindofweapon.which_equip_msg=Which weapon slot would you like to equip this item to?\n\nThe Champion directly attacks with her primary weapon, but can use the ability of either weapon. Both weapons have their own charge count.\n\nThe Champion can also swap her primary and secondary weapon instantly.
items.kindofweapon.which_equip_msg=Which weapon slot would you like to equip this item to?\n\nThe Champion directly attacks with her primary weapon, but can use the ability of either weapon. Both weapons share the same charge count.\n\nThe Champion can also swap her primary and secondary weapon instantly.
items.kindofweapon.which_equip_primary=Primary (%s)
items.kindofweapon.which_equip_secondary=Secondary (%s)
items.kindofweapon.empty=empty

View File

@@ -28,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.CloakOfShadows;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TimekeepersHourglass;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.RoundShield;
import com.shatteredpixel.shatteredpixeldungeon.plants.Swiftthistle;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
@@ -111,5 +112,10 @@ public class Invisibility extends FlavourBuff {
if (bubble != null){
bubble.detach();
}
RoundShield.GuardTracker guard = ch.buff(RoundShield.GuardTracker.class);
if (guard != null && guard.hasBlocked){
guard.detach();
}
}
}

View File

@@ -479,7 +479,7 @@ public class Hero extends Char {
}
if (buff(Scimitar.SwordDance.class) != null){
accuracy *= 1.25f;
accuracy *= 1.50f;
}
if (!RingOfForce.fightingUnarmed(this)) {
@@ -542,7 +542,8 @@ public class Hero extends Char {
}
if (buff(RoundShield.GuardTracker.class) != null){
buff(RoundShield.GuardTracker.class).detach();
buff(RoundShield.GuardTracker.class).hasBlocked = true;
BuffIndicator.refreshHero();
Sample.INSTANCE.play(Assets.Sounds.HIT_PARRY, 1, Random.Float(0.96f, 1.05f));
return Messages.get(RoundShield.GuardTracker.class, "guarded");
}

View File

@@ -74,11 +74,6 @@ public class AssassinsBlade extends MeleeWeapon {
return false;
}
@Override
protected int baseChargeUse(Hero hero, Char target){
return 2;
}
@Override
protected void duelistAbility(Hero hero, Integer target) {
Dagger.sneakAbility(hero, target, 3, 2+buffedLvl(), this);

View File

@@ -22,9 +22,7 @@
package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
@@ -50,25 +48,16 @@ public class BattleAxe extends MeleeWeapon {
return Messages.get(this, "prompt");
}
@Override
protected int baseChargeUse(Hero hero, Char target){
if (target == null || (target instanceof Mob && ((Mob) target).surprisedBy(hero))) {
return 1;
} else {
return 2;
}
}
@Override
protected void duelistAbility(Hero hero, Integer target) {
//+(4+lvl) damage, roughly equivalent to +35% damage
int dmgBoost = augment.damageFactor(4 + buffedLvl());
//+(5+1.5*lvl) damage, roughly +40% base dmg, +50% scaling
int dmgBoost = augment.damageFactor(5 + Math.round(1.5f*buffedLvl()));
Mace.heavyBlowAbility(hero, target, 1, dmgBoost, this);
}
@Override
public String abilityInfo() {
int dmgBoost = levelKnown ? 4 + buffedLvl() : 4;
int dmgBoost = levelKnown ? 5 + Math.round(1.5f*buffedLvl()) : 5;
if (levelKnown){
return Messages.get(this, "ability_desc", augment.damageFactor(min()+dmgBoost), augment.damageFactor(max()+dmgBoost));
} else {

View File

@@ -79,9 +79,9 @@ public class Crossbow extends MeleeWeapon {
@Override
public String abilityInfo() {
if (levelKnown){
return Messages.get(this, "ability_desc", 2+buffedLvl());
return Messages.get(this, "ability_desc", 3+buffedLvl());
} else {
return Messages.get(this, "typical_ability_desc", 2);
return Messages.get(this, "typical_ability_desc", 3);
}
}

View File

@@ -88,11 +88,6 @@ public class Dagger extends MeleeWeapon {
return false;
}
@Override
protected int baseChargeUse(Hero hero, Char target){
return 2;
}
@Override
protected void duelistAbility(Hero hero, Integer target) {
sneakAbility(hero, target, 5, 2+buffedLvl(), this);

View File

@@ -74,11 +74,6 @@ public class Dirk extends MeleeWeapon {
return false;
}
@Override
protected int baseChargeUse(Hero hero, Char target){
return 2;
}
@Override
protected void duelistAbility(Hero hero, Integer target) {
Dagger.sneakAbility(hero, target, 4, 2+buffedLvl(), this);

View File

@@ -81,7 +81,9 @@ public class Flail extends MeleeWeapon {
});
//we detach and calculate bonus here in case the attack misses (e.g. vs. monks)
spin.detach();
spinBoost = spin.spins * augment.damageFactor(Math.round(6.5f + 1.5f*buffedLvl()));
//+(6+2*lvl) damage per spin, roughly +30% base damage, +45% scaling
// so +90% base dmg, +135% scaling at 3 spins
spinBoost = spin.spins * augment.damageFactor(6 + 2*buffedLvl());
return Float.POSITIVE_INFINITY;
} else {
spinBoost = 0;
@@ -94,7 +96,7 @@ public class Flail extends MeleeWeapon {
if (Dungeon.hero.buff(SpinAbilityTracker.class) != null){
return 0;
} else {
return 2;
return 1;
}
}
@@ -124,7 +126,7 @@ public class Flail extends MeleeWeapon {
@Override
public String abilityInfo() {
int dmgBoost = levelKnown ? Math.round(6.5f + 1.5f*buffedLvl()) : 7;
int dmgBoost = levelKnown ? 6 + 2*buffedLvl() : 6;
if (levelKnown){
return Messages.get(this, "ability_desc", augment.damageFactor(dmgBoost));
} else {

View File

@@ -50,14 +50,14 @@ public class Gauntlet extends MeleeWeapon {
@Override
protected void duelistAbility(Hero hero, Integer target) {
//+(3.5+0.75*lvl) damage, roughly equivalent to +35% damage
int dmgBoost = augment.damageFactor(Math.round(3.5f + 0.75f*buffedLvl()));
//+(4+0.75*lvl) damage, roughly +40% base damage, +40% scaling
int dmgBoost = augment.damageFactor(4 + Math.round(0.75f*buffedLvl()));
Sai.comboStrikeAbility(hero, target, 0, dmgBoost, this);
}
@Override
public String abilityInfo() {
int dmgBoost = levelKnown ? Math.round(3.5f + 0.75f*buffedLvl()) : 4;
int dmgBoost = levelKnown ? 4 + Math.round(0.75f*buffedLvl()) : 4;
if (levelKnown){
return Messages.get(this, "ability_desc", augment.damageFactor(dmgBoost));
} else {

View File

@@ -51,14 +51,14 @@ public class Glaive extends MeleeWeapon {
@Override
protected void duelistAbility(Hero hero, Integer target) {
//+(7+1.33*lvl) damage, roughly equivalent to +30% damage
int dmgBoost = augment.damageFactor(7 + Math.round(1.33f*buffedLvl()));
//+(12+2*lvl) damage, roughly +55% base damage, +45% scaling
int dmgBoost = augment.damageFactor(12 + 2*buffedLvl());
Spear.spikeAbility(hero, target, 1, dmgBoost, this);
}
@Override
public String abilityInfo() {
int dmgBoost = levelKnown ? 7 + Math.round(1.33f*buffedLvl()) : 7;
int dmgBoost = levelKnown ? 12 + 2*buffedLvl() : 12;
if (levelKnown){
return Messages.get(this, "ability_desc", augment.damageFactor(min()+dmgBoost), augment.damageFactor(max()+dmgBoost));
} else {

View File

@@ -52,14 +52,14 @@ public class Gloves extends MeleeWeapon {
@Override
protected void duelistAbility(Hero hero, Integer target) {
//+(1.5+0.5*lvl) damage, roughly equivalent to +45% damage
int dmgBoost = augment.damageFactor(Math.round(1.5f + 0.5f*buffedLvl()));
//+(2+0.5*lvl) damage, roughly +67% base damage, +50% scaling
int dmgBoost = augment.damageFactor(2 + Math.round(0.5f*buffedLvl()));
Sai.comboStrikeAbility(hero, target, 0, dmgBoost, this);
}
@Override
public String abilityInfo() {
int dmgBoost = levelKnown ? Math.round(1.5f + 0.5f*buffedLvl()) : 2;
int dmgBoost = levelKnown ? 2 + Math.round(0.5f*buffedLvl()) : 2;
if (levelKnown){
return Messages.get(this, "ability_desc", augment.damageFactor(dmgBoost));
} else {

View File

@@ -91,17 +91,20 @@ public class Greataxe extends MeleeWeapon {
beforeAbilityUsed(hero, enemy);
AttackIndicator.target(enemy);
//+(12.5+(1.75*lvl)) damage, equivalent to +50% damage
int dmgBoost = augment.damageFactor(Math.round(12.5f + 1.75f*buffedLvl()));
//+(12+(2*lvl)) damage, roughly +50% base damage, +55% scaling
int dmgBoost = augment.damageFactor(12 + 2*buffedLvl());
if (hero.attack(enemy, 1, dmgBoost, Char.INFINITE_ACCURACY)){
Sample.INSTANCE.play(Assets.Sounds.HIT_STRONG);
if (!enemy.isAlive()){
onAbilityKill(hero, enemy);
}
}
Invisibility.dispel();
hero.spendAndNext(hero.attackDelay());
if (!enemy.isAlive()){
hero.next();
onAbilityKill(hero, enemy);
} else {
hero.spendAndNext(hero.attackDelay());
}
afterAbilityUsed(hero);
}
});
@@ -109,7 +112,7 @@ public class Greataxe extends MeleeWeapon {
@Override
public String abilityInfo() {
int dmgBoost = levelKnown ? Math.round(12.5f + 1.75f*buffedLvl()) : 13;
int dmgBoost = levelKnown ? 12 + 2*buffedLvl() : 12;
if (levelKnown){
return Messages.get(this, "ability_desc", augment.damageFactor(min()+dmgBoost), augment.damageFactor(max()+dmgBoost));
} else {

View File

@@ -55,15 +55,15 @@ public class Greatshield extends MeleeWeapon {
@Override
protected void duelistAbility(Hero hero, Integer target) {
RoundShield.guardAbility(hero, 5+buffedLvl(), this);
RoundShield.guardAbility(hero, 3+buffedLvl(), this);
}
@Override
public String abilityInfo() {
if (levelKnown){
return Messages.get(this, "ability_desc", 5+buffedLvl());
return Messages.get(this, "ability_desc", 3+buffedLvl());
} else {
return Messages.get(this, "typical_ability_desc", 5);
return Messages.get(this, "typical_ability_desc", 3);
}
}
}

View File

@@ -53,14 +53,14 @@ public class Greatsword extends MeleeWeapon {
@Override
protected void duelistAbility(Hero hero, Integer target) {
//+(3.5+0.7*lvl) damage, roughly equivalent to +20% damage
int dmgBoost = augment.damageFactor(Math.round(3.5f + 0.7f*buffedLvl()));
//+(5+lvl) damage, roughly +30% base dmg, +30% scaling
int dmgBoost = augment.damageFactor(5 + buffedLvl());
Sword.cleaveAbility(hero, target, 1, dmgBoost, this);
}
@Override
public String abilityInfo() {
int dmgBoost = levelKnown ? Math.round(3.5f + 0.7f*buffedLvl()) : 4;
int dmgBoost = levelKnown ? 5 + buffedLvl() : 5;
if (levelKnown){
return Messages.get(this, "ability_desc", augment.damageFactor(min()+dmgBoost), augment.damageFactor(max()+dmgBoost));
} else {

View File

@@ -22,9 +22,7 @@
package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
@@ -50,25 +48,16 @@ public class HandAxe extends MeleeWeapon {
return Messages.get(this, "prompt");
}
@Override
protected int baseChargeUse(Hero hero, Char target){
if (target == null || (target instanceof Mob && ((Mob) target).surprisedBy(hero))) {
return 1;
} else {
return 2;
}
}
@Override
protected void duelistAbility(Hero hero, Integer target) {
//+(3+lvl) damage, roughly equivalent to +45% damage
int dmgBoost = augment.damageFactor(3 + buffedLvl());
//+(4+1.5*lvl) damage, roughly +55% base dmg, +75% scaling
int dmgBoost = augment.damageFactor(4 + Math.round(1.5f*buffedLvl()));
Mace.heavyBlowAbility(hero, target, 1, dmgBoost, this);
}
@Override
public String abilityInfo() {
int dmgBoost = levelKnown ? 3 + buffedLvl() : 3;
int dmgBoost = levelKnown ? 4 + Math.round(1.5f*buffedLvl()) : 4;
if (levelKnown){
return Messages.get(this, "ability_desc", augment.damageFactor(min()+dmgBoost), augment.damageFactor(max()+dmgBoost));
} else {

View File

@@ -55,14 +55,14 @@ public class Katana extends MeleeWeapon {
@Override
protected void duelistAbility(Hero hero, Integer target) {
//+(4+lvl) damage, equivalent to +33% damage
int dmgBoost = augment.damageFactor(4 + buffedLvl());
//+(6+1.5*lvl) damage, roughly +50% damage
int dmgBoost = augment.damageFactor(6 + Math.round(1.5f*buffedLvl()));
Rapier.lungeAbility(hero, target, 1, dmgBoost, this);
}
@Override
public String abilityInfo() {
int dmgBoost = levelKnown ? 4+buffedLvl() : 4;
int dmgBoost = levelKnown ? 6 + Math.round(1.5f*buffedLvl()) : 6;
if (levelKnown){
return Messages.get(this, "ability_desc", augment.damageFactor(min()+dmgBoost), augment.damageFactor(max()+dmgBoost));
} else {

View File

@@ -53,14 +53,14 @@ public class Longsword extends MeleeWeapon {
@Override
protected void duelistAbility(Hero hero, Integer target) {
//+(3.5+0.7*lvl) damage, roughly equivalent to +23% damage
int dmgBoost = augment.damageFactor(Math.round(3.5f + 0.7f*buffedLvl()));
//+(4+lvl) damage, roughly +30% base dmg, +33% scaling
int dmgBoost = augment.damageFactor(4 + buffedLvl());
Sword.cleaveAbility(hero, target, 1, dmgBoost, this);
}
@Override
public String abilityInfo() {
int dmgBoost = levelKnown ? Math.round(3.5f + 0.7f*buffedLvl()) : 4;
int dmgBoost = levelKnown ? 4 + buffedLvl() : 4;
if (levelKnown){
return Messages.get(this, "ability_desc", augment.damageFactor(min()+dmgBoost), augment.damageFactor(max()+dmgBoost));
} else {

View File

@@ -59,25 +59,16 @@ public class Mace extends MeleeWeapon {
return Messages.get(this, "prompt");
}
@Override
protected int baseChargeUse(Hero hero, Char target){
if (target == null || (target instanceof Mob && ((Mob) target).surprisedBy(hero))) {
return 1;
} else {
return 2;
}
}
@Override
protected void duelistAbility(Hero hero, Integer target) {
//+(4+lvl) damage, roughly equivalent to +40% damage
int dmgBoost = augment.damageFactor(4 + buffedLvl());
//+(4+1.5*lvl) damage, roughly +55% base dmg, +60% scaling
int dmgBoost = augment.damageFactor(5 + Math.round(1.5f*buffedLvl()));
Mace.heavyBlowAbility(hero, target, 1, dmgBoost, this);
}
@Override
public String abilityInfo() {
int dmgBoost = levelKnown ? 4 + buffedLvl() : 4;
int dmgBoost = levelKnown ? 5 + Math.round(1.5f*buffedLvl()) : 5;
if (levelKnown){
return Messages.get(this, "ability_desc", augment.damageFactor(min()+dmgBoost), augment.damageFactor(max()+dmgBoost));
} else {
@@ -104,28 +95,20 @@ public class Mace extends MeleeWeapon {
}
hero.belongings.abilityWeapon = null;
//need to separately check charges here, as non-surprise attacks cost 2
//no bonus damage if attack isn't a surprise
if (enemy instanceof Mob && !((Mob) enemy).surprisedBy(hero)){
Charger charger = Buff.affect(hero, Charger.class);
if (Dungeon.hero.belongings.weapon == wep) {
if (charger.charges + charger.partialCharge < wep.abilityChargeUse(hero, enemy)){
GLog.w(Messages.get(wep, "ability_no_charge"));
return;
}
} else {
if (charger.secondCharges + charger.secondPartialCharge < wep.abilityChargeUse(hero, enemy)){
GLog.w(Messages.get(wep, "ability_no_charge"));
return;
}
}
dmgMulti = Math.min(1, dmgMulti);
dmgBoost = 0;
}
float finalDmgMulti = dmgMulti;
int finalDmgBoost = dmgBoost;
hero.sprite.attack(enemy.pos, new Callback() {
@Override
public void call() {
wep.beforeAbilityUsed(hero, enemy);
AttackIndicator.target(enemy);
if (hero.attack(enemy, dmgMulti, dmgBoost, Char.INFINITE_ACCURACY)) {
if (hero.attack(enemy, finalDmgMulti, finalDmgBoost, Char.INFINITE_ACCURACY)) {
Sample.INSTANCE.play(Assets.Sounds.HIT_STRONG);
if (enemy.isAlive()){
Buff.affect(enemy, Daze.class, Daze.DURATION);

View File

@@ -117,11 +117,7 @@ public class MeleeWeapon extends Weapon {
//do nothing
} else if (STRReq() > hero.STR()){
GLog.w(Messages.get(this, "ability_low_str"));
} else if (hero.belongings.weapon == this &&
(Buff.affect(hero, Charger.class).charges + Buff.affect(hero, Charger.class).partialCharge) < abilityChargeUse(hero, null)) {
GLog.w(Messages.get(this, "ability_no_charge"));
} else if (hero.belongings.secondWep == this &&
(Buff.affect(hero, Charger.class).secondCharges + Buff.affect(hero, Charger.class).secondPartialCharge) < abilityChargeUse(hero, null)) {
} else if ((Buff.affect(hero, Charger.class).charges + Buff.affect(hero, Charger.class).partialCharge) < abilityChargeUse(hero, null)) {
GLog.w(Messages.get(this, "ability_no_charge"));
} else {
@@ -198,18 +194,10 @@ public class MeleeWeapon extends Weapon {
hero.belongings.abilityWeapon = this;
Charger charger = Buff.affect(hero, Charger.class);
if (Dungeon.hero.belongings.weapon == this) {
charger.partialCharge -= abilityChargeUse(hero, target);
while (charger.partialCharge < 0 && charger.charges > 0) {
charger.charges--;
charger.partialCharge++;
}
} else {
charger.secondPartialCharge -= abilityChargeUse(hero, target);
while (charger.secondPartialCharge < 0 && charger.secondCharges > 0) {
charger.secondCharges--;
charger.secondPartialCharge++;
}
charger.partialCharge -= abilityChargeUse(hero, target);
while (charger.partialCharge < 0 && charger.charges > 0) {
charger.charges--;
charger.partialCharge++;
}
if (hero.heroClass == HeroClass.DUELIST
@@ -426,11 +414,7 @@ public class MeleeWeapon extends Weapon {
if (isEquipped(Dungeon.hero)
&& Dungeon.hero.buff(Charger.class) != null) {
Charger buff = Dungeon.hero.buff(Charger.class);
if (Dungeon.hero.belongings.weapon == this) {
return buff.charges + "/" + buff.chargeCap();
} else {
return buff.secondCharges + "/" + buff.secondChargeCap();
}
return buff.charges + "/" + buff.chargeCap();
} else {
return super.status();
}
@@ -456,19 +440,22 @@ public class MeleeWeapon extends Weapon {
public static class Charger extends Buff implements ActionIndicator.Action {
public int charges = 3;
public int charges = 2;
public float partialCharge;
//offhand charge as well?
//champion subclass
public int secondCharges = 3;
public float secondPartialCharge;
@Override
public boolean act() {
if (charges < chargeCap()){
if (Regeneration.regenOn()){
partialCharge += 1/(40f-(chargeCap()-charges)); // 40 to 30 turns per charge
//60 to 45 turns per charge
float chargeToGain = 1/(60f-1.5f*(chargeCap()-charges));
//40 to 30 turns per charge for champion
if (Dungeon.hero.subClass == HeroSubClass.CHAMPION){
chargeToGain *= 1.5f;
}
partialCharge += chargeToGain;
}
int points = ((Hero)target).pointsInTalent(Talent.WEAPON_RECHARGING);
@@ -486,24 +473,6 @@ public class MeleeWeapon extends Weapon {
partialCharge = 0;
}
if (Dungeon.hero.subClass == HeroSubClass.CHAMPION
&& secondCharges < secondChargeCap()) {
if (Regeneration.regenOn()) {
// 80 to 60 turns per charge without talent
// up to 53.333 to 40 turns per charge at max talent level
secondPartialCharge += secondChargeMultiplier() / (40f-(secondChargeCap()-secondCharges));
}
if (secondPartialCharge >= 1) {
secondCharges++;
secondPartialCharge--;
updateQuickslot();
}
} else {
secondPartialCharge = 0;
}
if (ActionIndicator.action != this && Dungeon.hero.subClass == HeroSubClass.CHAMPION) {
ActionIndicator.setAction(this);
}
@@ -526,16 +495,11 @@ public class MeleeWeapon extends Weapon {
}
public int chargeCap(){
return Math.min(10, 3 + (Dungeon.hero.lvl-1)/3);
}
public int secondChargeCap(){
return Math.round(chargeCap() * secondChargeMultiplier());
}
public float secondChargeMultiplier(){
//50% - 75%, depending on talent
return 0.5f + 0.0834f*Dungeon.hero.pointsInTalent(Talent.SECONDARY_CHARGE);
if (Dungeon.hero.subClass == HeroSubClass.CHAMPION){
return Math.min(10, 4 + (Dungeon.hero.lvl - 1) / 4);
} else {
return Math.min(8, 2 + (Dungeon.hero.lvl - 1) / 4);
}
}
public void gainCharge( float charge ){
@@ -553,16 +517,11 @@ public class MeleeWeapon extends Weapon {
public static final String CHARGES = "charges";
private static final String PARTIALCHARGE = "partialCharge";
public static final String SECOND_CHARGES = "second_charges";
private static final String SECOND_PARTIALCHARGE = "second_partialCharge";
@Override
public void storeInBundle(Bundle bundle) {
super.storeInBundle(bundle);
bundle.put(CHARGES, charges);
bundle.put(PARTIALCHARGE, partialCharge);
bundle.put(SECOND_CHARGES, secondCharges);
bundle.put(SECOND_PARTIALCHARGE, secondPartialCharge);
}
@Override
@@ -570,8 +529,6 @@ public class MeleeWeapon extends Weapon {
super.restoreFromBundle(bundle);
charges = bundle.getInt(CHARGES);
partialCharge = bundle.getFloat(PARTIALCHARGE);
secondCharges = bundle.getInt(SECOND_CHARGES);
secondPartialCharge = bundle.getFloat(SECOND_PARTIALCHARGE);
}
@Override

View File

@@ -51,11 +51,6 @@ public class Quarterstaff extends MeleeWeapon {
return 2; //2 extra defence
}
@Override
protected int baseChargeUse(Hero hero, Char target){
return 2;
}
@Override
protected void duelistAbility(Hero hero, Integer target) {
beforeAbilityUsed(hero, null);

View File

@@ -68,14 +68,14 @@ public class Rapier extends MeleeWeapon {
@Override
protected void duelistAbility(Hero hero, Integer target) {
//+(3+lvl) damage, equivalent to +67% damage
int dmgBoost = augment.damageFactor(3 + buffedLvl());
//+(4+lvl) damage, roughly +90% base damage, +67% scaling
int dmgBoost = augment.damageFactor(4 + buffedLvl());
lungeAbility(hero, target, 1, dmgBoost, this);
}
@Override
public String abilityInfo() {
int dmgBoost = levelKnown ? 3+buffedLvl() : 3;
int dmgBoost = levelKnown ? 4+buffedLvl() : 4;
if (levelKnown){
return Messages.get(this, "ability_desc", augment.damageFactor(min()+dmgBoost), augment.damageFactor(max()+dmgBoost));
} else {

View File

@@ -30,6 +30,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.watabou.noosa.Image;
public class RoundShield extends MeleeWeapon {
@@ -62,21 +63,21 @@ public class RoundShield extends MeleeWeapon {
@Override
protected void duelistAbility(Hero hero, Integer target) {
RoundShield.guardAbility(hero, 8+buffedLvl(), this);
RoundShield.guardAbility(hero, 5+buffedLvl(), this);
}
@Override
public String abilityInfo() {
if (levelKnown){
return Messages.get(this, "ability_desc", 8+buffedLvl());
return Messages.get(this, "ability_desc", 5+buffedLvl());
} else {
return Messages.get(this, "typical_ability_desc", 8);
return Messages.get(this, "typical_ability_desc", 5);
}
}
public static void guardAbility(Hero hero, int duration, MeleeWeapon wep){
wep.beforeAbilityUsed(hero, null);
Buff.prolong(hero, GuardTracker.class, duration);
Buff.prolong(hero, GuardTracker.class, duration).hasBlocked = false;
hero.sprite.operate(hero.pos);
hero.spendAndNext(Actor.TICK);
wep.afterAbilityUsed(hero);
@@ -89,11 +90,22 @@ public class RoundShield extends MeleeWeapon {
type = buffType.POSITIVE;
}
public boolean hasBlocked = false;
@Override
public int icon() {
return BuffIndicator.DUEL_GUARD;
}
@Override
public void tintIcon(Image icon) {
if (hasBlocked){
icon.tint(0x651f66, 0.5f);
} else {
icon.resetColor();
}
}
@Override
public float iconFadePercent() {
return Math.max(0, (5 - visualcooldown()) / 5);

View File

@@ -74,7 +74,7 @@ public class RunicBlade extends MeleeWeapon {
//we apply here because of projecting
RunicSlashTracker tracker = Buff.affect(hero, RunicSlashTracker.class);
tracker.boost = 2f + 0.25f*buffedLvl();
tracker.boost = 2f + 0.50f*buffedLvl();
hero.belongings.abilityWeapon = this;
if (!hero.canAttack(enemy)){
GLog.w(Messages.get(this, "ability_bad_position"));
@@ -106,7 +106,7 @@ public class RunicBlade extends MeleeWeapon {
@Override
public String abilityInfo() {
if (levelKnown){
return Messages.get(this, "ability_desc", 200+25*buffedLvl());
return Messages.get(this, "ability_desc", 200+50*buffedLvl());
} else {
return Messages.get(this, "typical_ability_desc", 200);
}

View File

@@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Combo;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
@@ -61,14 +62,14 @@ public class Sai extends MeleeWeapon {
@Override
protected void duelistAbility(Hero hero, Integer target) {
//+(2.5+0.5*lvl) damage, roughly equivalent to +40% damage
int dmgBoost = augment.damageFactor(Math.round(2.5f + 0.5f*buffedLvl()));
//+(3+0.67*lvl) damage, roughly +45% base damage, +45% scaling
int dmgBoost = augment.damageFactor(3 + Math.round(0.67f*buffedLvl()));
Sai.comboStrikeAbility(hero, target, 0, dmgBoost, this);
}
@Override
public String abilityInfo() {
int dmgBoost = levelKnown ? Math.round(2.5f + 0.5f*buffedLvl()) : 3;
int dmgBoost = levelKnown ? 3 + Math.round(0.67f*buffedLvl()) : 3;
if (levelKnown){
return Messages.get(this, "ability_desc", augment.damageFactor(dmgBoost));
} else {
@@ -104,7 +105,7 @@ public class Sai extends MeleeWeapon {
int recentHits = 0;
ComboStrikeTracker buff = hero.buff(ComboStrikeTracker.class);
if (buff != null){
recentHits = buff.totalHits();
recentHits = buff.hits;
buff.detach();
}
@@ -130,14 +131,12 @@ public class Sai extends MeleeWeapon {
type = buffType.POSITIVE;
}
public static int DURATION = 6; //to account for the turn the attack is made in
public int[] hits = new int[DURATION];
public static int DURATION = 5;
private float comboTime = 0f;
public int hits = 0;
@Override
public int icon() {
//pre-v2.1 saves
if (totalHits() == 0) return BuffIndicator.NONE;
if (Dungeon.hero.belongings.weapon() instanceof Gloves
|| Dungeon.hero.belongings.weapon() instanceof Sai
|| Dungeon.hero.belongings.weapon() instanceof Gauntlet
@@ -152,59 +151,63 @@ public class Sai extends MeleeWeapon {
@Override
public boolean act() {
//shuffle all hits down one turn
for (int i = 0; i < DURATION; i++){
if (i == DURATION-1){
hits[i] = 0;
} else {
hits[i] = hits[i+1];
}
}
if (totalHits() == 0){
comboTime-=TICK;
spend(TICK);
if (comboTime <= 0) {
detach();
}
spend(TICK);
return true;
}
public void addHit(){
hits[DURATION-1]++;
hits++;
comboTime = 5f;
if (hits >= 2){
GLog.p( Messages.get(Combo.class, "combo", hits) );
}
}
public int totalHits(){
int sum = 0;
for (int i = 0; i < DURATION; i++){
sum += hits[i];
}
return sum;
@Override
public float iconFadePercent() {
return Math.max(0, (DURATION - comboTime)/ DURATION);
}
@Override
public String iconTextDisplay() {
return Integer.toString(totalHits());
return Integer.toString((int)comboTime);
}
@Override
public String desc() {
return Messages.get(this, "desc", totalHits());
return Messages.get(this, "desc", hits, dispTurns(comboTime));
}
private static final String TIME = "combo_time";
public static String RECENT_HITS = "recent_hits";
@Override
public void storeInBundle(Bundle bundle) {
super.storeInBundle(bundle);
bundle.put(TIME, comboTime);
bundle.put(RECENT_HITS, hits);
}
@Override
public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle);
if (bundle.contains(RECENT_HITS)) {
hits = bundle.getIntArray(RECENT_HITS);
if (bundle.contains(TIME)){
comboTime = bundle.getInt(TIME);
hits = bundle.getInt(RECENT_HITS);
} else {
//pre-2.4.0 saves
comboTime = 5f;
hits = 0;
if (bundle.contains(RECENT_HITS)) {
for (int i : bundle.getIntArray(RECENT_HITS)) {
hits += i;
}
}
}
}
}

View File

@@ -22,7 +22,6 @@
package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
@@ -47,11 +46,6 @@ public class Scimitar extends MeleeWeapon {
lvl*(tier+1); //scaling unchanged
}
@Override
protected int baseChargeUse(Hero hero, Char target){
return 2;
}
@Override
protected void duelistAbility(Hero hero, Integer target) {
beforeAbilityUsed(hero, null);

View File

@@ -53,14 +53,14 @@ public class Shortsword extends MeleeWeapon {
@Override
protected void duelistAbility(Hero hero, Integer target) {
//+(2.5+0.6*lvl) damage, roughly equivalent to +30% damage
int dmgBoost = augment.damageFactor(Math.round(2.5f + 0.6f*buffedLvl()));
//+(3+lvl) damage, roughly +35% base dmg, +50% scaling
int dmgBoost = augment.damageFactor(3 + buffedLvl());
Sword.cleaveAbility(hero, target, 1, dmgBoost, this);
}
@Override
public String abilityInfo() {
int dmgBoost = levelKnown ? Math.round(2.5f + 0.6f*buffedLvl()) : 3;
int dmgBoost = levelKnown ? 3 + buffedLvl() : 3;
if (levelKnown){
return Messages.get(this, "ability_desc", augment.damageFactor(min()+dmgBoost), augment.damageFactor(max()+dmgBoost));
} else {

View File

@@ -53,11 +53,6 @@ public class Sickle extends MeleeWeapon {
lvl*(tier+1); //scaling unchanged
}
@Override
protected int baseChargeUse(Hero hero, Char target){
return 2;
}
@Override
public String targetingPrompt() {
return Messages.get(this, "prompt");
@@ -65,19 +60,18 @@ public class Sickle extends MeleeWeapon {
@Override
protected void duelistAbility(Hero hero, Integer target) {
//+(1.1+lvl/5) damage, roughly equivalent to +10% damage
//..yes such a small boost is very silly
int dmgBoost = augment.damageFactor(Math.round(1.1f + buffedLvl()/5f));
harvestAbility(hero, target, 1f, dmgBoost, this);
//replaces damage with 12+2*lvl bleed, roughly 110% avg dmg at base, 100% avg scaling
int bleedAmt = augment.damageFactor(12 + 2*buffedLvl());
Sickle.harvestAbility(hero, target, 0f, bleedAmt, this);
}
@Override
public String abilityInfo() {
int dmgBoost = levelKnown ? Math.round(1.1f + buffedLvl()/5f) : 1;
int bleedAmt = levelKnown ? 12 + 2*buffedLvl() : 12;
if (levelKnown){
return Messages.get(this, "ability_desc", augment.damageFactor(min()+dmgBoost), augment.damageFactor(max()+dmgBoost));
return Messages.get(this, "ability_desc", augment.damageFactor(bleedAmt));
} else {
return Messages.get(this, "typical_ability_desc", min(0)+dmgBoost, max(0)+dmgBoost);
return Messages.get(this, "typical_ability_desc", bleedAmt);
}
}

View File

@@ -61,14 +61,14 @@ public class Spear extends MeleeWeapon {
@Override
protected void duelistAbility(Hero hero, Integer target) {
//+(5+lvl) damage, roughly equivalent to +45% damage
int dmgBoost = augment.damageFactor(5 + buffedLvl());
//+(7+1.5*lvl) damage, roughly +65% base damage, +60% scaling
int dmgBoost = augment.damageFactor(7 + Math.round(1.5f*buffedLvl()));
Spear.spikeAbility(hero, target, 1, dmgBoost, this);
}
@Override
public String abilityInfo() {
int dmgBoost = levelKnown ? 5 + buffedLvl() : 5;
int dmgBoost = levelKnown ? 7 + Math.round(1.5f*buffedLvl()) : 7;
if (levelKnown){
return Messages.get(this, "ability_desc", augment.damageFactor(min()+dmgBoost), augment.damageFactor(max()+dmgBoost));
} else {

View File

@@ -63,14 +63,14 @@ public class Sword extends MeleeWeapon {
@Override
protected void duelistAbility(Hero hero, Integer target) {
//+(3+0.67*lvl) damage, roughly equivalent to +27% damage
int dmgBoost = augment.damageFactor(3 + Math.round(0.67f*buffedLvl()));
//+(4+lvl) damage, roughly +35% base dmg, +40% scaling
int dmgBoost = augment.damageFactor(4 + buffedLvl());
Sword.cleaveAbility(hero, target, 1, dmgBoost, this);
}
@Override
public String abilityInfo() {
int dmgBoost = levelKnown ? 3+Math.round(0.67f*buffedLvl()) : 3;
int dmgBoost = levelKnown ? 4 + buffedLvl() : 4;
if (levelKnown){
return Messages.get(this, "ability_desc", augment.damageFactor(min()+dmgBoost), augment.damageFactor(max()+dmgBoost));
} else {
@@ -107,11 +107,17 @@ public class Sword extends MeleeWeapon {
}
Invisibility.dispel();
hero.spendAndNext(hero.attackDelay());
if (!enemy.isAlive()){
hero.next();
wep.onAbilityKill(hero, enemy);
Buff.prolong(hero, CleaveTracker.class, 5f);
if (hero.buff(CleaveTracker.class) != null) {
hero.buff(CleaveTracker.class).detach();
} else {
Buff.prolong(hero, CleaveTracker.class, 4f); //1 less as attack was instant
}
} else {
hero.spendAndNext(hero.attackDelay());
if (hero.buff(CleaveTracker.class) != null) {
hero.buff(CleaveTracker.class).detach();
}

View File

@@ -22,9 +22,7 @@
package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
@@ -50,25 +48,16 @@ public class WarHammer extends MeleeWeapon {
return Messages.get(this, "prompt");
}
@Override
protected int baseChargeUse(Hero hero, Char target){
if (target == null || (target instanceof Mob && ((Mob) target).surprisedBy(hero))) {
return 1;
} else {
return 2;
}
}
@Override
protected void duelistAbility(Hero hero, Integer target) {
//+(4+lvl) damage, roughly equivalent to +30% damage
int dmgBoost = augment.damageFactor(4 + buffedLvl());
//+(6+1.5*lvl) damage, roughly +40% base dmg, +45% scaling
int dmgBoost = augment.damageFactor(6 + Math.round(1.5f*buffedLvl()));
Mace.heavyBlowAbility(hero, target, 1, dmgBoost, this);
}
@Override
public String abilityInfo() {
int dmgBoost = levelKnown ? 4 + buffedLvl() : 4;
int dmgBoost = levelKnown ? 6 + Math.round(1.5f*buffedLvl()) : 6;
if (levelKnown){
return Messages.get(this, "ability_desc", augment.damageFactor(min()+dmgBoost), augment.damageFactor(max()+dmgBoost));
} else {

View File

@@ -22,7 +22,6 @@
package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
@@ -44,11 +43,6 @@ public class WarScythe extends MeleeWeapon {
lvl*(tier+1); //scaling unchanged
}
@Override
protected int baseChargeUse(Hero hero, Char target){
return 2;
}
@Override
public String targetingPrompt() {
return Messages.get(this, "prompt");
@@ -56,16 +50,18 @@ public class WarScythe extends MeleeWeapon {
@Override
protected void duelistAbility(Hero hero, Integer target) {
//uses the weapon's norma damage
Sickle.harvestAbility(hero, target, 1f, 0, this);
//replaces damage with 22.5+3.5*lvl bleed, exactly 100% avg damage.
int bleedAmt = augment.damageFactor(Math.round(22.5f + 3.5f*buffedLvl()));
Sickle.harvestAbility(hero, target, 0f, bleedAmt, this);
}
@Override
public String abilityInfo() {
if (levelKnown) {
return Messages.get(this, "ability_desc", augment.damageFactor(min()), augment.damageFactor(max()));
int bleedAmt = levelKnown ? Math.round(22.5f + 3.5f*buffedLvl()) : 23;
if (levelKnown){
return Messages.get(this, "ability_desc", augment.damageFactor(bleedAmt));
} else {
return Messages.get(this, "typical_ability_desc", min(0), max(0));
return Messages.get(this, "typical_ability_desc", bleedAmt);
}
}

View File

@@ -82,8 +82,10 @@ public class Whip extends MeleeWeapon {
@Override
public void call() {
beforeAbilityUsed(hero, finalClosest);
//+(2+0.5*lvl) damage, roughly +20% base damage, +25% scaling
int dmgBoost = augment.damageFactor(2 + Math.round(0.5f*buffedLvl()));
for (Char ch : targets) {
hero.attack(ch, 1, 0, ch == finalClosest ? Char.INFINITE_ACCURACY : 1);
hero.attack(ch, 1, dmgBoost, Char.INFINITE_ACCURACY);
if (!ch.isAlive()){
onAbilityKill(hero, ch);
}
@@ -97,10 +99,11 @@ public class Whip extends MeleeWeapon {
@Override
public String abilityInfo() {
if (levelKnown) {
return Messages.get(this, "ability_desc", augment.damageFactor(min()), augment.damageFactor(max()));
int dmgBoost = levelKnown ? 2 + Math.round(0.5f*buffedLvl()) : 2;
if (levelKnown){
return Messages.get(this, "ability_desc", augment.damageFactor(min()+dmgBoost), augment.damageFactor(max()+dmgBoost));
} else {
return Messages.get(this, "typical_ability_desc", min(0), max(0));
return Messages.get(this, "typical_ability_desc", min(0)+dmgBoost, max(0)+dmgBoost);
}
}
}

View File

@@ -55,14 +55,14 @@ public class WornShortsword extends MeleeWeapon {
@Override
protected void duelistAbility(Hero hero, Integer target) {
//+(2+lvl/2) damage, roughly equivalent to +33% damage
int dmgBoost = augment.damageFactor(2 + Math.round(buffedLvl()/2f));
//+(3+lvl) damage, roughly +55% base dmg, +67% scaling
int dmgBoost = augment.damageFactor(3 + buffedLvl());
Sword.cleaveAbility(hero, target, 1, dmgBoost, this);
}
@Override
public String abilityInfo() {
int dmgBoost = levelKnown ? 2+Math.round(buffedLvl()/2f) : 2;
int dmgBoost = levelKnown ? 3 + buffedLvl() : 3;
if (levelKnown){
return Messages.get(this, "ability_desc", augment.damageFactor(min()+dmgBoost), augment.damageFactor(max()+dmgBoost));
} else {

View File

@@ -168,7 +168,7 @@ public class Dart extends MissileWeapon {
//don't update xbow here, as dart may be the active weapon atm
processingChargedShot = true;
if (chargedShotPos != -1 && bow != null && Dungeon.hero.buff(Crossbow.ChargedShot.class) != null) {
PathFinder.buildDistanceMap(chargedShotPos, Dungeon.level.passable, 2);
PathFinder.buildDistanceMap(chargedShotPos, Dungeon.level.passable, 3);
//necessary to clone as some on-hit effects use Pathfinder
int[] distance = PathFinder.distance.clone();
for (Char ch : Actor.chars()){

View File

@@ -181,9 +181,9 @@ public abstract class TippedDart extends Dart {
float usages = Math.round(MAX_DURABILITY/use);
//grants 4 extra uses with charged shot
//grants 3+lvl extra uses with charged shot
if (bow != null && Dungeon.hero.buff(Crossbow.ChargedShot.class) != null){
usages += 2 + bow.buffedLvl();
usages += 3 + bow.buffedLvl();
}
//at 100 uses, items just last forever.