From: oskar.wiksten Date: Fri, 30 Mar 2012 16:38:19 +0000 (+0000) Subject: Changes to critical hits - now based on "critical skill" that defines the effective... X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=0bf3fab6781a1344df8511813e2f1bb4a24e5d37;p=users%2Fmchehab%2Fandors-trail.git Changes to critical hits - now based on "critical skill" that defines the effective critical chance by a nonlinear formula (sqrt). Conversation corrections (thanks ctnbeh13) git-svn-id: https://andors-trail.googlecode.com/svn/trunk@227 08aca716-68be-ccc6-4d58-36f5abd142ac --- diff --git a/AndorsTrail/res/layout/traitsinfoview.xml b/AndorsTrail/res/layout/traitsinfoview.xml index 50d756f..c9f5c6e 100644 --- a/AndorsTrail/res/layout/traitsinfoview.xml +++ b/AndorsTrail/res/layout/traitsinfoview.xml @@ -26,8 +26,8 @@ - - + + + + + + diff --git a/AndorsTrail/res/values-de/strings.xml b/AndorsTrail/res/values-de/strings.xml index 29f48a6..e4c6d02 100644 --- a/AndorsTrail/res/values-de/strings.xml +++ b/AndorsTrail/res/values-de/strings.xml @@ -120,7 +120,7 @@ Angriffskosten (AP): Angriffschance: Schaden: - Kritische Treffer: + Kritische Treffer: Faktor bei krit. Treffern: Abwehrchance: Schadensresistenz: diff --git a/AndorsTrail/res/values-fr/strings.xml b/AndorsTrail/res/values-fr/strings.xml index d148c34..d95ae63 100644 --- a/AndorsTrail/res/values-fr/strings.xml +++ b/AndorsTrail/res/values-fr/strings.xml @@ -120,7 +120,7 @@ Coût d\'une attaque (AP) : Probabilité de toucher : Dégâts : - Probabilité de coup critique : + Probabilité de coup critique : Coefficient de coup critique : Probabilité de bloquer : Résistance aux dégâts : diff --git a/AndorsTrail/res/values-it/strings.xml b/AndorsTrail/res/values-it/strings.xml index c8613db..bc0a0a4 100644 --- a/AndorsTrail/res/values-it/strings.xml +++ b/AndorsTrail/res/values-it/strings.xml @@ -118,7 +118,7 @@ Costo attacco (AP): Possibilità attacco: Possibilità danni: - colpo critico: + colpo critico: moltiplicatore critico: Possibilità difesa: Resistenza ai danni: diff --git a/AndorsTrail/res/values-pt/strings.xml b/AndorsTrail/res/values-pt/strings.xml index 219dbce..157aca2 100644 --- a/AndorsTrail/res/values-pt/strings.xml +++ b/AndorsTrail/res/values-pt/strings.xml @@ -120,7 +120,7 @@ Custo de ataque (AP): Probabilidade de ataque: Danos de ataque: - Probabilidade de golpe crítico: + Probabilidade de golpe crítico: Multiplicador de golpe crítico: Probabilidade de bloqueio: Resistência a danos: diff --git a/AndorsTrail/res/values-ru/strings.xml b/AndorsTrail/res/values-ru/strings.xml index 76093cf..cbd6478 100644 --- a/AndorsTrail/res/values-ru/strings.xml +++ b/AndorsTrail/res/values-ru/strings.xml @@ -120,7 +120,7 @@ Цена атаки (AP): Шанс атаки: Сила атаки: - Шанс критического удара: + Шанс критического удара: Критический умножитель: Шанс блока: Сопротивление урону: diff --git a/AndorsTrail/res/values/content_conversationlist.xml b/AndorsTrail/res/values/content_conversationlist.xml index 8b8ba5f..402e953 100644 --- a/AndorsTrail/res/values/content_conversationlist.xml +++ b/AndorsTrail/res/values/content_conversationlist.xml @@ -3528,7 +3528,7 @@ }|}; {ulirfendor_helmet_1|Could it be? Hmm. Let me look at that thing.||{{N|ulirfendor_helmet_2|||||}}|}; -{ulirfendor_helmet_2|Those markings on it are most peculiar. And it was found by the lich that you spoke of?||{{N|ulirfendor_helmet_3|||||}}|}; +{ulirfendor_helmet_2|Those markings on it are most peculiar. It was found by the lich that you spoke of?||{{N|ulirfendor_helmet_3|||||}}|}; {ulirfendor_helmet_3|Hmm. You know what, this could actually be connected to what the shrine speaks of - The Dark Protector||{{N|ulirfendor_helmet_4|||||}}|}; {ulirfendor_helmet_4|I am not certain of what the term \'The Dark Protector\' refers to. At first I thought it might be some creature protecting something, but this helmet seems to fit better in on what the shrine speaks of.||{{N|ulirfendor_helmet_5|||||}}|}; {ulirfendor_helmet_5|It could either be the helmet itself, or that the helmet has some effect on whoever wears it, meaning that the wearer will become the Dark Protector.||{{N|ulirfendor_helmet_6|||||}}|}; @@ -3562,7 +3562,7 @@ {No. I will keep this item for myself instead.|ulirfendor_helmet_keep1|||||} }|}; {ulirfendor_helmet_n8|Think all you want, but please hurry. We need to destroy this thing as soon as possible!|||}; -{ulirfendor_dp_proc_1|Thank you. And the heart of that lich.|{{0|darkprotector|30|}}|{{Here it is.|ulirfendor_dp_proc_2||toszylae_heart|1|0|}}|}; +{ulirfendor_dp_proc_1|Thank you. Next, I need the heart of that lich.|{{0|darkprotector|30|}}|{{Here it is.|ulirfendor_dp_proc_2||toszylae_heart|1|0|}}|}; {ulirfendor_dp_proc_2|Excellent. I will begin the procedure immediately.|{{0|darkprotector|31|}}|{{N|ulirfendor_dp_proc_3|||||}}|}; {ulirfendor_dp_proc_3|(Ulirfendor places the helmet and the lich\'s heart on the ground before him, and opens his backpack of items.)||{{N|ulirfendor_dp_proc_4|||||}}|}; {ulirfendor_dp_proc_4|(He pulls out a leathery potion case from his backpack, and takes out a vial of clear but almost shining liquid.)||{{N|ulirfendor_dp_proc_5|||||}}|}; @@ -3594,7 +3594,7 @@ {ulirfendor_dp_bless_5|There. You now have the dark blessing of the Shadow upon you.|{{0|darkprotector|40|}{2|20|1|}}|{{N|ulirfendor_dp_bless_6|||||}}|}; {ulirfendor_dp_bless_6|Thank you yet again for all you have done here.|||}; {ulirfendor_helmet_keep1|What!? Keep it!? Have you gone mad? We need to destroy it to protect the people!||{ - {Who knows that power I could gain from it? I will keep this for myself.|ulirfendor_helmet_keep2|||||} + {Who knows what power I could gain from it? I will keep this for myself.|ulirfendor_helmet_keep2|||||} {It could be worth a lot. I will keep this for myself.|ulirfendor_helmet_keep2|||||} {I think I should give this a second thought before we begin.|ulirfendor_helmet_n8|||||} }|}; @@ -3693,7 +3693,7 @@ {sign_ulirfendor_8|You start reciting the words of the Kazaul tongue from the book, taking great care of saying the words exactly as the book states them.||{{N|sign_ulirfendor_9|||||}}|}; {sign_ulirfendor_9|As you speak the words, you notice a faint glow coming from the shrine, and you get the eerie feeling that the sand on the ground almost moves by itself.||{{N|sign_ulirfendor_10|||||}}|}; {sign_ulirfendor_10|The movements start to get more visible, almost as if there\'s something crawling under the sand.||{{N|sign_ulirfendor_11|||||}}|}; -{sign_ulirfendor_11|As you get closer to the end of the ritual, the helmet falls over its side, leaving one side down on the ground.||{{N|sign_ulirfendor_12|||||}}|}; +{sign_ulirfendor_11|As you get closer to the end of the ritual, the helmet falls forward, face down in the sand.||{{N|sign_ulirfendor_12|||||}}|}; {sign_ulirfendor_12|Once you speak the final words of the ritual, the ground sinks slightly in front of the shrine, taking part of the helmet down under the sand.||{{N|sign_ulirfendor_13|||||}}|}; {sign_ulirfendor_13|As you pull it out and dust off the sand, you notice a change in texture on the part that was submerged in the sand.||{{Take the helmet|sign_ulirfendor_14|||||}}|}; {sign_ulirfendor_14|You take the helmet, and examine it more closely.|{{0|darkprotector|70|}{1|sign_ulirfendor|0|}}|{{N|sign_ulirfendor_15|||||}}|}; @@ -3797,7 +3797,7 @@ {talion_cure_7|(The potion smells rancid, but you manage to drink it all down. The pain from the stomach decreases, and you feel one of the rotworms crawling up into your mouth. You quickly spit the worm out into the now empty vial.)|{{0|maggots|50|}{1|potion_rotworm|0|}{3|rotworm|-99|}}|{{N|talion_cured_1|||||}}|}; {talion_cured_1|Ah, that seems to have worked. Frankly, I was a little worried that it might not have worked, but seeing you spit out that worm really confirms it. Ha ha.||{ {Yuck! Those things were inside of me?|talion_cured_2|||||} - {What now?|talion_cure_7|||||} + {What now?|talion_cured_3|||||} }|}; {talion_cured_2|Yes. Nasty, aren\'t they? *chuckle*||{{N|talion_cured_3|||||}}|}; {talion_cured_3|That one worm you spit out, you should make sure you hold on to that. It might be valuable in the future.||{ @@ -3836,10 +3836,10 @@ {Ok, I\'ll take it for 400 gold.|talion_bless_guard_2||gold|400|0|} {Never mind, let\'s go back to those other blessings.|talion_bless_1|||||} }|}; -{talion_bless_str_2|Very well. *starts chanting*|{{3|shadowbless_str|60|}}|{{N|talion_bless_2|||||}}|}; -{talion_bless_heal_2|Very well. *starts chanting*|{{3|shadowbless_heal|100|}}|{{N|talion_bless_2|||||}}|}; -{talion_bless_acc_2|Very well. *starts chanting*|{{3|shadowbless_acc|60|}}|{{N|talion_bless_2|||||}}|}; -{talion_bless_guard_2|Very well. *starts chanting*|{{3|shadowbless_guard|50|}}|{{N|talion_bless_2|||||}}|}; +{talion_bless_str_2|Very well. *starts chanting*|{{3|shadowbless_str|30|}}|{{N|talion_bless_2|||||}}|}; +{talion_bless_heal_2|Very well. *starts chanting*|{{3|shadowbless_heal|45|}}|{{N|talion_bless_2|||||}}|}; +{talion_bless_acc_2|Very well. *starts chanting*|{{3|shadowbless_acc|30|}}|{{N|talion_bless_2|||||}}|}; +{talion_bless_guard_2|Very well. *starts chanting*|{{3|shadowbless_guard|20|}}|{{N|talion_bless_2|||||}}|}; {talion_bless_2|There. I hope you will find it useful on your travels.||{ {Thank you, goodbye.|X|||||} {How about some of those other blessings?|talion_bless_1|||||} diff --git a/AndorsTrail/res/values/content_itemlist.xml b/AndorsTrail/res/values/content_itemlist.xml index 27c0ac4..dad7dc2 100644 --- a/AndorsTrail/res/values/content_itemlist.xml +++ b/AndorsTrail/res/values/content_itemlist.xml @@ -342,7 +342,7 @@ {helm_redeye2|items_armours:24|Cap of bloody eyes|2||0|1|1|-5|||||||0|1|8||||||||||||||||||||||}; {helm_defend1|items_armours_3:31|Defender\'s helmet|2||0|1975|1|||||-3|||||8|1|||||||||||||||||||||}; {helm_protector0|items_armours_3:31|Strange looking helmet|2|1|1|0|1|-9|||||||0|1|5||||||||||||||||||||||}; -{helm_protector|items_armours_3:31|Dark protector|2|3|0|1794|1|-6|||||||0|1|13||||||||||||||||||||||}; +{helm_protector|items_armours_3:31|Dark protector|2|3|0|3119|1|-6|||||||0|1|13|1|||||||||||||||||||||}; {armour_chain_remg|items_armours_3:13|Remgard chain mail|3||0|8927|1|||||-7|||||25||||||||||||||||||||||}; {armour_cvest1|items_armours_3:5|Combat vest|3||0|1116|1|||||15|||||8||||||||||||||||||||||}; diff --git a/AndorsTrail/res/values/strings.xml b/AndorsTrail/res/values/strings.xml index 95ab0d0..2f51e03 100644 --- a/AndorsTrail/res/values/strings.xml +++ b/AndorsTrail/res/values/strings.xml @@ -120,7 +120,7 @@ Attack cost (AP): Attack chance: Attack damage: - Critical hit chance: + Critical hit skill: Critical multiplier: Block chance: Damage resistance: @@ -403,7 +403,7 @@ Better shop prices Increased block chance Damage resistance - Increased critical chance + Increased critical skill Increased critical damage Increased maximum action points Higher chance of finding gold @@ -424,7 +424,7 @@ For every skill level, decreases the buying and selling gold penalty by %1$d percentage points. Increases block chance by %1$d for each skill level. Increases damage resistance by %1$d for each skill level. - Increases any existing critical chance given by equipment by %1$d %% for each skill level (percentage of existing critical chance value, not percentage points). + Increases any existing critical skill given by equipment by %1$d %% for each skill level (percentage of existing critical skill value, not percentage points). Increases any existing critical multiplier given by equipment by %1$d %% for each skill level. Increases maximum action points (AP) by %1$d for each skill level. Increases chance of finding gold in monster drops by %1$d %%, and increases amount of gold in drops by %2$d %% for each skill level (up to the maximum amount that the monster drops). @@ -487,5 +487,6 @@ Move to top Move to bottom Immune to critical hits - + Effective critical chance: + diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/HeroinfoActivity_Stats.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/HeroinfoActivity_Stats.java index 72e6a9c..3d3ab5b 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/HeroinfoActivity_Stats.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/HeroinfoActivity_Stats.java @@ -114,7 +114,7 @@ public final class HeroinfoActivity_Stats extends Activity { rangebar_hp.update(player.health); rangebar_exp.update(player.levelExperience); - heroinfo_currenttraits.update(player.combatTraits); + heroinfo_currenttraits.update(player); ArrayList effects_hit = new ArrayList(); ArrayList effects_kill = new ArrayList(); for (int i = 0; i < Inventory.NUM_WORN_SLOTS; ++i) { diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterInfoActivity.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterInfoActivity.java index 7953f82..0fb7fc1 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterInfoActivity.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterInfoActivity.java @@ -85,7 +85,7 @@ public final class MonsterInfoActivity extends Activity { } private void updateTraits(Monster monster) { - monsterinfo_currenttraits.update(monster.combatTraits); + monsterinfo_currenttraits.update(monster); monsterinfo_onhiteffects.update( null, null, diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/SkillInfoActivity.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/SkillInfoActivity.java index ac40ac2..9c4a7fb 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/SkillInfoActivity.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/SkillInfoActivity.java @@ -196,7 +196,7 @@ public final class SkillInfoActivity extends Activity { switch (statID) { case CombatTraits.STAT_COMBAT_ATTACK_COST: return R.string.traitsinfo_attack_cost; case CombatTraits.STAT_COMBAT_ATTACK_CHANCE: return R.string.traitsinfo_attack_chance; - case CombatTraits.STAT_COMBAT_CRITICAL_CHANCE: return R.string.traitsinfo_criticalhit_chance; + case CombatTraits.STAT_COMBAT_CRITICAL_SKILL: return R.string.traitsinfo_criticalhit_skill; case CombatTraits.STAT_COMBAT_CRITICAL_MULTIPLIER: return R.string.traitsinfo_criticalhit_multiplier; case CombatTraits.STAT_COMBAT_DAMAGE_POTENTIAL_MIN: return R.string.traitsinfo_attack_damage; case CombatTraits.STAT_COMBAT_DAMAGE_POTENTIAL_MAX: return R.string.traitsinfo_attack_damage; diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ActorStatsController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ActorStatsController.java index cf266ba..3808a2c 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ActorStatsController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ActorStatsController.java @@ -164,7 +164,7 @@ public class ActorStatsController { actorCombatTraits.criticalMultiplier += (combatTraits.criticalMultiplier * magnitude); } actorCombatTraits.attackChance += (combatTraits.attackChance * magnitude); - actorCombatTraits.criticalChance += (combatTraits.criticalChance * magnitude); + actorCombatTraits.criticalSkill += (combatTraits.criticalSkill * magnitude); actorCombatTraits.damagePotential.add(combatTraits.damagePotential.current * magnitude, true); actorCombatTraits.damagePotential.max += (combatTraits.damagePotential.max * magnitude); actorCombatTraits.blockChance += (combatTraits.blockChance * magnitude); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java index 1c1e346..2ed275d 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java @@ -420,7 +420,7 @@ public final class CombatController implements VisualEffectCompletedCallback { private static float getAverageDamagePerHit(Actor attacker, Actor target) { float result = (float) (getAttackHitChance(attacker.combatTraits, target.combatTraits)) * attacker.combatTraits.damagePotential.average() / 100; if (hasCriticalAttack(attacker, target)) { - result += (float) attacker.combatTraits.criticalChance * result * attacker.combatTraits.criticalMultiplier / 100; + result += (float) attacker.combatTraits.getEffectiveCriticalChance() * result * attacker.combatTraits.criticalMultiplier / 100; } result -= target.combatTraits.damageResistance; return result; @@ -475,7 +475,7 @@ public final class CombatController implements VisualEffectCompletedCallback { int damage = Constants.rollValue(attacker.combatTraits.damagePotential); boolean isCriticalHit = false; if (hasCriticalAttack(attacker, target)) { - isCriticalHit = Constants.roll100(attacker.combatTraits.criticalChance); + isCriticalHit = Constants.roll100(attacker.combatTraits.getEffectiveCriticalChance()); if (isCriticalHit) { damage *= attacker.combatTraits.criticalMultiplier; } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/SkillController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/SkillController.java index 73f3b33..bf8195b 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/SkillController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/SkillController.java @@ -18,8 +18,8 @@ public final class SkillController { combatTraits.damagePotential.add(SkillCollection.PER_SKILLPOINT_INCREASE_WEAPON_DAMAGE_MIN * player.getSkillLevel(SkillCollection.SKILL_WEAPON_DMG), false); combatTraits.blockChance += SkillCollection.PER_SKILLPOINT_INCREASE_DODGE * player.getSkillLevel(SkillCollection.SKILL_DODGE); combatTraits.damageResistance += SkillCollection.PER_SKILLPOINT_INCREASE_BARKSKIN * player.getSkillLevel(SkillCollection.SKILL_BARKSKIN); - if (combatTraits.hasCriticalChanceEffect()) { - combatTraits.criticalChance += combatTraits.criticalChance * SkillCollection.PER_SKILLPOINT_INCREASE_MORE_CRITICALS_PERCENT * player.getSkillLevel(SkillCollection.SKILL_MORE_CRITICALS) / 100; + if (combatTraits.hasCriticalSkillEffect()) { + combatTraits.criticalSkill += combatTraits.criticalSkill * SkillCollection.PER_SKILLPOINT_INCREASE_MORE_CRITICALS_PERCENT * player.getSkillLevel(SkillCollection.SKILL_MORE_CRITICALS) / 100; } if (combatTraits.hasCriticalMultiplierEffect()) { combatTraits.criticalMultiplier += combatTraits.criticalMultiplier * SkillCollection.PER_SKILLPOINT_INCREASE_BETTER_CRITICALS_PERCENT * player.getSkillLevel(SkillCollection.SKILL_BETTER_CRITICALS) / 100; diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/CombatTraits.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/CombatTraits.java index f384a28..224139a 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/CombatTraits.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/CombatTraits.java @@ -11,7 +11,7 @@ import com.gpl.rpg.AndorsTrail.util.Range; public class CombatTraits { public static final int STAT_COMBAT_ATTACK_COST = 0; public static final int STAT_COMBAT_ATTACK_CHANCE = 1; - public static final int STAT_COMBAT_CRITICAL_CHANCE = 2; + public static final int STAT_COMBAT_CRITICAL_SKILL = 2; public static final int STAT_COMBAT_CRITICAL_MULTIPLIER = 3; public static final int STAT_COMBAT_DAMAGE_POTENTIAL_MIN = 4; public static final int STAT_COMBAT_DAMAGE_POTENTIAL_MAX = 5; @@ -21,7 +21,7 @@ public class CombatTraits { public int attackCost; public int attackChance; - public int criticalChance; + public int criticalSkill; public float criticalMultiplier; public final Range damagePotential; @@ -39,7 +39,7 @@ public class CombatTraits { if (copy == null) return; this.attackCost = copy.attackCost; this.attackChance = copy.attackChance; - this.criticalChance = copy.criticalChance; + this.criticalSkill = copy.criticalSkill; this.criticalMultiplier = copy.criticalMultiplier; this.damagePotential.set(copy.damagePotential); this.blockChance = copy.blockChance; @@ -51,7 +51,7 @@ public class CombatTraits { return this.attackCost == other.attackCost && this.attackChance == other.attackChance - && this.criticalChance == other.criticalChance + && this.criticalSkill == other.criticalSkill && this.criticalMultiplier == other.criticalMultiplier && this.damagePotential.equals(other.damagePotential) && this.blockChance == other.blockChance @@ -62,7 +62,7 @@ public class CombatTraits { return this.attackCost == 0 && this.attackChance == 0 - && this.criticalChance == 0 + && this.criticalSkill == 0 && this.criticalMultiplier == 0 && this.damagePotential.current == 0 && this.damagePotential.max == 0 @@ -73,10 +73,17 @@ public class CombatTraits { public boolean hasAttackChanceEffect() { return attackChance != 0; } public boolean hasAttackDamageEffect() { return damagePotential.max != 0; } public boolean hasBlockEffect() { return blockChance != 0; } - public boolean hasCriticalChanceEffect() { return criticalChance != 0; } + public boolean hasCriticalSkillEffect() { return criticalSkill != 0; } public boolean hasCriticalMultiplierEffect() { return criticalMultiplier != 0 && criticalMultiplier != 1; } - public boolean hasCriticalAttacks() { return hasCriticalChanceEffect() && hasCriticalMultiplierEffect(); } + public boolean hasCriticalAttacks() { return hasCriticalSkillEffect() && hasCriticalMultiplierEffect(); } + public int getEffectiveCriticalChance() { + if (criticalSkill <= 0) return 0; + int v = (int) (-5 + 2 * FloatMath.sqrt(5*criticalSkill)); + if (v < 0) return 0; + return v; + } + public int getAttacksPerTurn(final int maxAP) { return (int) Math.floor(maxAP / attackCost); } @@ -85,7 +92,7 @@ public class CombatTraits { switch (statID) { case STAT_COMBAT_ATTACK_COST: return attackCost; case STAT_COMBAT_ATTACK_CHANCE: return attackChance; - case STAT_COMBAT_CRITICAL_CHANCE: return criticalChance; + case STAT_COMBAT_CRITICAL_SKILL: return criticalSkill; case STAT_COMBAT_CRITICAL_MULTIPLIER: return (int) FloatMath.floor(criticalMultiplier); case STAT_COMBAT_DAMAGE_POTENTIAL_MIN: return damagePotential.current; case STAT_COMBAT_DAMAGE_POTENTIAL_MAX: return damagePotential.max; @@ -108,10 +115,10 @@ public class CombatTraits { final int costDMG_Max = isWeapon ? (int) (2*Math.pow(Math.max(0, damagePotential.max), 2.1)) :(int) (2*Math.pow(Math.max(0, damagePotential.max), 3) + damagePotential.max*20); - final int costCC = (int) (2.2*Math.pow(criticalChance, 3)); + final int costCS = (int) (2.2*Math.pow(criticalSkill, 3)); final int costCM = (int) (50*Math.pow(Math.max(0, criticalMultiplier), 2)); - return costBC + costAC + costAP + costDR + costDMG_Min + costDMG_Max + costCC + costCM; + return costBC + costAC + costAP + costDR + costDMG_Min + costDMG_Max + costCS + costCM; } @@ -120,7 +127,7 @@ public class CombatTraits { public CombatTraits(DataInputStream src, int fileversion) throws IOException { this.attackCost = src.readInt(); this.attackChance = src.readInt(); - this.criticalChance = src.readInt(); + this.criticalSkill = src.readInt(); if (fileversion <= 20) { this.criticalMultiplier = src.readInt(); } else { @@ -134,7 +141,7 @@ public class CombatTraits { public void writeToParcel(DataOutputStream dest, int flags) throws IOException { dest.writeInt(attackCost); dest.writeInt(attackChance); - dest.writeInt(criticalChance); + dest.writeInt(criticalSkill); dest.writeFloat(criticalMultiplier); damagePotential.writeToParcel(dest, flags); dest.writeInt(blockChance); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Player.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Player.java index 7a84493..00d2050 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Player.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Player.java @@ -54,7 +54,7 @@ public final class Player extends Actor { CombatTraits combat = new CombatTraits(); combat.attackCost = 3; combat.attackChance = 60; - combat.criticalChance = 0; + combat.criticalSkill = 0; combat.criticalMultiplier = 1; combat.damagePotential.set(1, 1); combat.blockChance = 0; diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemType.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemType.java index f723cd3..7abe135 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemType.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemType.java @@ -116,11 +116,13 @@ public final class ItemType { sb.append(attackEffect.damagePotential.toMinMaxString()); addSpace = true; } - if (attackEffect.hasCriticalChanceEffect()) { + if (attackEffect.hasCriticalSkillEffect()) { sb.append(" +"); - sb.append(attackEffect.criticalChance); - sb.append("%x"); - sb.append(attackEffect.criticalMultiplier); + sb.append(attackEffect.criticalSkill); + sb.append("x"); + if (attackEffect.hasCriticalMultiplierEffect()) { + sb.append(attackEffect.criticalMultiplier); + } } } public static String describeAttackEffect(CombatTraits attackEffect) { diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/MonsterTypeParser.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/MonsterTypeParser.java index f9b29cd..5c819d2 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/MonsterTypeParser.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/MonsterTypeParser.java @@ -60,7 +60,7 @@ public final class MonsterTypeParser extends ResourceParserFor { } private static int getExpectedMonsterExperience(final CombatTraits t, ItemTraits_OnUse hitEffect, final int maxHP, final int maxAP) { if (t == null) return 0; - final float avgAttackHP = t.getAttacksPerTurn(maxAP) * div100(t.attackChance) * t.damagePotential.averagef() * (1 + div100(t.criticalChance) * t.criticalMultiplier); + final float avgAttackHP = t.getAttacksPerTurn(maxAP) * div100(t.attackChance) * t.damagePotential.averagef() * (1 + div100(t.criticalSkill) * t.criticalMultiplier); final float avgDefenseHP = maxHP * (1 + div100(t.blockChance)) + Constants.EXP_FACTOR_DAMAGERESISTANCE * t.damageResistance; int attackConditionBonus = 0; if (hitEffect != null && hitEffect.addedConditions_target != null && hitEffect.addedConditions_target.length > 0) { diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/ResourceParserUtils.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/ResourceParserUtils.java index cc0416b..3c47b3b 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/ResourceParserUtils.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/ResourceParserUtils.java @@ -48,14 +48,14 @@ public final class ResourceParserUtils { public static CombatTraits parseCombatTraits(String[] parts, int startIndex) { String attackCost = parts[startIndex]; String attackChance = parts[startIndex + 1]; - String criticalChance = parts[startIndex + 2]; + String criticalSkill = parts[startIndex + 2]; String criticalMultiplier = parts[startIndex + 3]; ConstRange attackDamage = parseRange(parts[startIndex + 4], parts[startIndex + 5]); String blockChance = parts[startIndex + 6]; String damageResistance = parts[startIndex + 7]; if ( attackCost.length() <= 0 && attackChance.length() <= 0 - && criticalChance.length() <= 0 + && criticalSkill.length() <= 0 && criticalMultiplier.length() <= 0 && attackDamage == null && blockChance.length() <= 0 @@ -66,7 +66,7 @@ public final class ResourceParserUtils { CombatTraits result = new CombatTraits(); result.attackCost = parseInt(attackCost, 0); result.attackChance = parseInt(attackChance, 0); - result.criticalChance = parseInt(criticalChance, 0); + result.criticalSkill = parseInt(criticalSkill, 0); result.criticalMultiplier = parseFloat(criticalMultiplier, 0); if (attackDamage != null) result.damagePotential.set(attackDamage); result.blockChance = parseInt(blockChance, 0); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/AbilityModifierInfoView.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/AbilityModifierInfoView.java index f59eb46..df59cb2 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/AbilityModifierInfoView.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/AbilityModifierInfoView.java @@ -32,7 +32,7 @@ public final class AbilityModifierInfoView extends LinearLayout { final Resources res = getResources(); if (traits != null && traits.combatProficiency != null) { - abilitymodifierinfo_traits.update(traits.combatProficiency); + abilitymodifierinfo_traits.update(traits); abilitymodifierinfo_traits.setVisibility(View.VISIBLE); } else { abilitymodifierinfo_traits.setVisibility(View.GONE); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/BaseTraitsInfoView.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/BaseTraitsInfoView.java index 0691bad..ae391e7 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/BaseTraitsInfoView.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/BaseTraitsInfoView.java @@ -19,7 +19,7 @@ public final class BaseTraitsInfoView extends TraitsInfoView { } public void update(ActorTraits traits) { - super.update(traits.baseCombatTraits); + super.update(traits); basetraitsinfo_max_hp.setText(Integer.toString(traits.maxHP)); basetraitsinfo_max_ap.setText(Integer.toString(traits.maxAP)); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/TraitsInfoView.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/TraitsInfoView.java index 041c7d7..a076bcc 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/TraitsInfoView.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/TraitsInfoView.java @@ -2,6 +2,9 @@ package com.gpl.rpg.AndorsTrail.view; import com.gpl.rpg.AndorsTrail.R; import com.gpl.rpg.AndorsTrail.model.CombatTraits; +import com.gpl.rpg.AndorsTrail.model.ability.traits.AbilityModifierTraits; +import com.gpl.rpg.AndorsTrail.model.actor.Actor; +import com.gpl.rpg.AndorsTrail.model.actor.ActorTraits; import android.content.Context; import android.util.AttributeSet; @@ -16,13 +19,15 @@ public class TraitsInfoView extends TableLayout { private final TableRow traitsinfo_attack_row3; private final TableRow traitsinfo_critical_row1; private final TableRow traitsinfo_critical_row2; + private final TableRow traitsinfo_critical_row3; private final TableRow traitsinfo_defense_row1; private final TableRow traitsinfo_defense_row2; private final TextView traitsinfo_attack_cost; private final TextView traitsinfo_attack_chance; private final TextView traitsinfo_attack_damage; - private final TextView traitsinfo_criticalhit_chance; + private final TextView traitsinfo_criticalhit_skill; private final TextView traitsinfo_criticalhit_multiplier; + private final TextView traitsinfo_criticalhit_effectivechance; private final TextView traitsinfo_defense_chance; private final TextView traitsinfo_defense_damageresist; @@ -40,18 +45,23 @@ public class TraitsInfoView extends TableLayout { traitsinfo_attack_row3 = (TableRow) findViewById(R.id.traitsinfo_attack_row3); traitsinfo_critical_row1 = (TableRow) findViewById(R.id.traitsinfo_critical_row1); traitsinfo_critical_row2 = (TableRow) findViewById(R.id.traitsinfo_critical_row2); + traitsinfo_critical_row3 = (TableRow) findViewById(R.id.traitsinfo_critical_row3); traitsinfo_defense_row1 = (TableRow) findViewById(R.id.traitsinfo_defense_row1); traitsinfo_defense_row2 = (TableRow) findViewById(R.id.traitsinfo_defense_row2); traitsinfo_attack_cost = (TextView) findViewById(R.id.traitsinfo_attack_cost); traitsinfo_attack_chance = (TextView) findViewById(R.id.traitsinfo_attack_chance); traitsinfo_attack_damage = (TextView) findViewById(R.id.traitsinfo_attack_damage); - traitsinfo_criticalhit_chance = (TextView) findViewById(R.id.traitsinfo_criticalhit_chance); + traitsinfo_criticalhit_skill = (TextView) findViewById(R.id.traitsinfo_criticalhit_skill); traitsinfo_criticalhit_multiplier = (TextView) findViewById(R.id.traitsinfo_criticalhit_multiplier); + traitsinfo_criticalhit_effectivechance = (TextView) findViewById(R.id.traitsinfo_criticalhit_effectivechance); traitsinfo_defense_chance = (TextView) findViewById(R.id.traitsinfo_defense_chance); traitsinfo_defense_damageresist = (TextView) findViewById(R.id.traitsinfo_defense_damageresist); } - public void update(CombatTraits traits) { + public void update(Actor actor) { update(actor.combatTraits, true); } + public void update(ActorTraits actorTraits) { update(actorTraits.baseCombatTraits, true); } + public void update(AbilityModifierTraits traits) { update(traits.combatProficiency, false); } + private void update(CombatTraits traits, boolean showEffectiveCriticalChance) { if (traits != null && traits.attackCost != 0) { traitsinfo_attack_row1.setVisibility(View.VISIBLE); traitsinfo_attack_cost.setText(Integer.toString(traits.attackCost)); @@ -70,9 +80,9 @@ public class TraitsInfoView extends TableLayout { } else { traitsinfo_attack_row3.setVisibility(View.GONE); } - if (traits != null && traits.hasCriticalChanceEffect()) { + if (traits != null && traits.hasCriticalSkillEffect()) { traitsinfo_critical_row1.setVisibility(View.VISIBLE); - traitsinfo_criticalhit_chance.setText(Integer.toString(traits.criticalChance) + "%"); + traitsinfo_criticalhit_skill.setText(Integer.toString(traits.criticalSkill)); } else { traitsinfo_critical_row1.setVisibility(View.GONE); } @@ -82,6 +92,12 @@ public class TraitsInfoView extends TableLayout { } else { traitsinfo_critical_row2.setVisibility(View.GONE); } + if (showEffectiveCriticalChance && traits != null && traits.hasCriticalAttacks()) { + traitsinfo_critical_row3.setVisibility(View.VISIBLE); + traitsinfo_criticalhit_effectivechance.setText(Integer.toString(traits.getEffectiveCriticalChance()) + "%"); + } else { + traitsinfo_critical_row3.setVisibility(View.GONE); + } if (traits != null && traits.hasBlockEffect()) { traitsinfo_defense_row1.setVisibility(View.VISIBLE); traitsinfo_defense_chance.setText(Integer.toString(traits.blockChance) + "%"); diff --git a/AndorsTrailEdit/editor.html b/AndorsTrailEdit/editor.html index e7633d8..854e491 100644 --- a/AndorsTrailEdit/editor.html +++ b/AndorsTrailEdit/editor.html @@ -205,7 +205,7 @@
- +
%
@@ -455,7 +455,7 @@
- +
%
@@ -904,7 +904,7 @@
- +
%