diff --git a/core/src/main/assets/messages/actors/actors.properties b/core/src/main/assets/messages/actors/actors.properties index e0132b65b..b769464e8 100644 --- a/core/src/main/assets/messages/actors/actors.properties +++ b/core/src/main/assets/messages/actors/actors.properties @@ -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 diff --git a/core/src/main/assets/messages/items/items.properties b/core/src/main/assets/messages/items/items.properties index 774bb29ea..1553d24c8 100644 --- a/core/src/main/assets/messages/items/items.properties +++ b/core/src/main/assets/messages/items/items.properties @@ -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 diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Invisibility.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Invisibility.java index e1a21915f..f6a2fa34b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Invisibility.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Invisibility.java @@ -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(); + } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java index 859a52a47..5b4e5f691 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java @@ -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"); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/AssassinsBlade.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/AssassinsBlade.java index 0b221f1be..72f7535e0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/AssassinsBlade.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/AssassinsBlade.java @@ -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); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/BattleAxe.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/BattleAxe.java index a34860a0d..d5d2d5f71 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/BattleAxe.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/BattleAxe.java @@ -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 { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Crossbow.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Crossbow.java index 82a322edb..f6af0709f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Crossbow.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Crossbow.java @@ -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); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Dagger.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Dagger.java index 61fc877a8..bdef57383 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Dagger.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Dagger.java @@ -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); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Dirk.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Dirk.java index 87fe8fc31..ae8689236 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Dirk.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Dirk.java @@ -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); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Flail.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Flail.java index 60e6fe8f5..65d8b957e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Flail.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Flail.java @@ -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 { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Gauntlet.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Gauntlet.java index f37881ee6..0b33c7a8e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Gauntlet.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Gauntlet.java @@ -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 { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Glaive.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Glaive.java index cb0686d07..7e92a7a13 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Glaive.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Glaive.java @@ -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 { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Gloves.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Gloves.java index bd3a4efea..2ab8df9f0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Gloves.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Gloves.java @@ -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 { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Greataxe.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Greataxe.java index b9a02149d..e3a2332cb 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Greataxe.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Greataxe.java @@ -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 { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Greatshield.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Greatshield.java index a08ef46c6..49bfa8332 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Greatshield.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Greatshield.java @@ -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); } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Greatsword.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Greatsword.java index 089692857..26a653d3c 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Greatsword.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Greatsword.java @@ -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 { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/HandAxe.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/HandAxe.java index c6d270a7b..8bfcd5f69 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/HandAxe.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/HandAxe.java @@ -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 { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Katana.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Katana.java index 0d0966d2f..2c02e8a50 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Katana.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Katana.java @@ -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 { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Longsword.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Longsword.java index b7002314b..ac7780cf6 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Longsword.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Longsword.java @@ -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 { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Mace.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Mace.java index 29ed1de3e..dbc3092d1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Mace.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Mace.java @@ -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); 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 ceafb4928..98a3c83e2 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 @@ -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 diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Quarterstaff.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Quarterstaff.java index 2e3bf2ad6..22501a149 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Quarterstaff.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Quarterstaff.java @@ -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); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Rapier.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Rapier.java index 48f48694c..d41604462 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Rapier.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Rapier.java @@ -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 { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/RoundShield.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/RoundShield.java index 7086a5194..16e316250 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/RoundShield.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/RoundShield.java @@ -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); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/RunicBlade.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/RunicBlade.java index ec70f03d0..f2243f675 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/RunicBlade.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/RunicBlade.java @@ -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); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Sai.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Sai.java index 64c10cd47..4d8f7d0d0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Sai.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Sai.java @@ -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; + } + } } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Scimitar.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Scimitar.java index f6537d4a3..1dfc2c5f1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Scimitar.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Scimitar.java @@ -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); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Shortsword.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Shortsword.java index 3686c74bc..64f4ef27d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Shortsword.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Shortsword.java @@ -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 { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Sickle.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Sickle.java index 3ccd619de..ee5ff43dd 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Sickle.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Sickle.java @@ -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); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Spear.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Spear.java index aa168632c..625e7a76c 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Spear.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Spear.java @@ -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 { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Sword.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Sword.java index 281dcbe51..d5fbb0018 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Sword.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Sword.java @@ -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(); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/WarHammer.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/WarHammer.java index 593c2092f..3e8b50371 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/WarHammer.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/WarHammer.java @@ -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 { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/WarScythe.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/WarScythe.java index c30b93c2f..868cdac28 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/WarScythe.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/WarScythe.java @@ -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); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Whip.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Whip.java index 57806a251..9e3929b8c 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Whip.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Whip.java @@ -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); } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/WornShortsword.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/WornShortsword.java index d976b5b83..a7077304c 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/WornShortsword.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/WornShortsword.java @@ -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 { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/Dart.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/Dart.java index 346d7c768..424db4097 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/Dart.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/Dart.java @@ -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()){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/TippedDart.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/TippedDart.java index 19a688b84..1ee78dbeb 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/TippedDart.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/TippedDart.java @@ -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.