]> www.infradead.org Git - users/mchehab/andors-trail.git/commitdiff
Changes to critical hits - now based on "critical skill" that defines the effective...
authoroskar.wiksten <oskar.wiksten@08aca716-68be-ccc6-4d58-36f5abd142ac>
Fri, 30 Mar 2012 16:38:19 +0000 (16:38 +0000)
committeroskar.wiksten <oskar.wiksten@08aca716-68be-ccc6-4d58-36f5abd142ac>
Fri, 30 Mar 2012 16:38:19 +0000 (16:38 +0000)
Conversation corrections (thanks ctnbeh13)

git-svn-id: https://andors-trail.googlecode.com/svn/trunk@227 08aca716-68be-ccc6-4d58-36f5abd142ac

24 files changed:
AndorsTrail/res/layout/traitsinfoview.xml
AndorsTrail/res/values-de/strings.xml
AndorsTrail/res/values-fr/strings.xml
AndorsTrail/res/values-it/strings.xml
AndorsTrail/res/values-pt/strings.xml
AndorsTrail/res/values-ru/strings.xml
AndorsTrail/res/values/content_conversationlist.xml
AndorsTrail/res/values/content_itemlist.xml
AndorsTrail/res/values/strings.xml
AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/HeroinfoActivity_Stats.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterInfoActivity.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/SkillInfoActivity.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ActorStatsController.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/SkillController.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/CombatTraits.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Player.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemType.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/MonsterTypeParser.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/ResourceParserUtils.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/AbilityModifierInfoView.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/BaseTraitsInfoView.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/TraitsInfoView.java
AndorsTrailEdit/editor.html

index 50d756fb1accfdeb271a80e9116d813a4df871b7..c9f5c6e42321cb4f4f402d42d289e848a298ab87 100644 (file)
@@ -26,8 +26,8 @@
        <TableRow
                android:id="@+id/traitsinfo_critical_row1"
                >
-               <TextView android:text="@string/traitsinfo_criticalhit_chance" android:layout_marginRight="10sp" />
-               <TextView android:id="@+id/traitsinfo_criticalhit_chance" />
+               <TextView android:text="@string/traitsinfo_criticalhit_skill" android:layout_marginRight="10sp" />
+               <TextView android:id="@+id/traitsinfo_criticalhit_skill" />
        </TableRow>
        <TableRow
                android:id="@+id/traitsinfo_critical_row2"
                <TextView android:id="@+id/traitsinfo_criticalhit_multiplier" />
        </TableRow>
        <TableRow
+               android:id="@+id/traitsinfo_critical_row3"
+               >
+               <TextView android:text="@string/traitsinfo_criticalhit_effectivechance" android:layout_marginRight="10sp" />
+               <TextView android:id="@+id/traitsinfo_criticalhit_effectivechance" />
+       </TableRow>
+               <TableRow
                android:id="@+id/traitsinfo_defense_row1"
                >
                <TextView android:text="@string/traitsinfo_defense_chance" android:layout_marginRight="10sp" />
index 29f48a6c11333051f06284c1908a8794e800b329..e4c6d02944ec18d10395c3e29f6d96f73cd918bc 100644 (file)
     <string name="traitsinfo_attack_cost">Angriffskosten (AP):</string>
     <string name="traitsinfo_attack_chance">Angriffschance:</string>
     <string name="traitsinfo_attack_damage">Schaden:</string>
-    <string name="traitsinfo_criticalhit_chance">Kritische Treffer:</string>
+    <string name="traitsinfo_criticalhit_skill">Kritische Treffer:</string>
     <string name="traitsinfo_criticalhit_multiplier">Faktor bei krit. Treffern:</string>
     <string name="traitsinfo_defense_chance">Abwehrchance:</string>
     <string name="traitsinfo_defense_damageresist">Schadensresistenz:</string>
index d148c34679da7ea830faa8c6e5fcbc4ced8260a8..d95ae63008cb6b63cabeab6d1fda239f06f5b6cc 100644 (file)
     <string name="traitsinfo_attack_cost">Coût d\'une attaque (AP) :</string>
     <string name="traitsinfo_attack_chance">Probabilité de toucher :</string>
     <string name="traitsinfo_attack_damage">Dégâts :</string>
-    <string name="traitsinfo_criticalhit_chance">Probabilité de coup critique :</string>
+    <string name="traitsinfo_criticalhit_skill">Probabilité de coup critique :</string>
     <string name="traitsinfo_criticalhit_multiplier">Coefficient de coup critique :</string>
     <string name="traitsinfo_defense_chance">Probabilité de bloquer :</string>
     <string name="traitsinfo_defense_damageresist">Résistance aux dégâts :</string>
index c8613db465900b426b2eda4c623ea0dc933f990f..bc0a0a45e8bb10fb3c81c175d4dd05718526e03d 100644 (file)
     <string name="traitsinfo_attack_cost">Costo attacco (AP):</string>
     <string name="traitsinfo_attack_chance">Possibilità attacco:</string>
     <string name="traitsinfo_attack_damage">Possibilità danni:</string>
-    <string name="traitsinfo_criticalhit_chance">colpo critico:</string>
+    <string name="traitsinfo_criticalhit_skill">colpo critico:</string>
     <string name="traitsinfo_criticalhit_multiplier">moltiplicatore critico:</string>
     <string name="traitsinfo_defense_chance">Possibilità difesa:</string>
     <string name="traitsinfo_defense_damageresist">Resistenza ai danni:</string>
index 219dbce789c2d4e99d405b0431ae02fc78e5beae..157aca2a410f051da6b2cb0980c8614b6b276978 100644 (file)
     <string name="traitsinfo_attack_cost">Custo de ataque (AP):</string>
     <string name="traitsinfo_attack_chance">Probabilidade de ataque:</string>
     <string name="traitsinfo_attack_damage">Danos de ataque:</string>
-    <string name="traitsinfo_criticalhit_chance">Probabilidade de golpe crítico:</string>
+    <string name="traitsinfo_criticalhit_skill">Probabilidade de golpe crítico:</string>
     <string name="traitsinfo_criticalhit_multiplier">Multiplicador de golpe crítico:</string>
     <string name="traitsinfo_defense_chance">Probabilidade de bloqueio:</string>
     <string name="traitsinfo_defense_damageresist">Resistência a danos:</string>
index 76093cfc42c425f72915408e89fe81673408ac8c..cbd6478ac4f2e677d83fa6a01c00260847844a9d 100644 (file)
     <string name="traitsinfo_attack_cost">Цена атаки (AP):</string>
     <string name="traitsinfo_attack_chance">Шанс атаки:</string>
     <string name="traitsinfo_attack_damage">Сила атаки:</string>
-    <string name="traitsinfo_criticalhit_chance">Шанс критического удара:</string>
+    <string name="traitsinfo_criticalhit_skill">Шанс критического удара:</string>
     <string name="traitsinfo_criticalhit_multiplier">Критический умножитель:</string>
     <string name="traitsinfo_defense_chance">Шанс блока:</string>
     <string name="traitsinfo_defense_damageresist">Сопротивление урону:</string>
index 8b8ba5fa3d7e78f69288c70113ec30f7648b276f..402e953709e8a6393bddd8901491663cfa5a19a1 100644 (file)
        }|};
 
 {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|||||}}|};
        {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|||||}}|};
 {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|||||}
        }|};
 {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|||||}}|};
 {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.||{
        {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|||||}
index 27c0ac4c7b60ee9715b5f5794e785765d0f8d0bf..dad7dc2f3ee472cdf6f49b96a3edc47118c44315 100644 (file)
 {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||||||||||||||||||||||};
index 95ab0d070de87886b55fc821397429e8ea5c04b6..2f51e038ee511a6428543f22f0ebb244aab7e5d3 100644 (file)
     <string name="traitsinfo_attack_cost">Attack cost (AP):</string>
     <string name="traitsinfo_attack_chance">Attack chance:</string>
     <string name="traitsinfo_attack_damage">Attack damage:</string>
-    <string name="traitsinfo_criticalhit_chance">Critical hit chance:</string>
+    <string name="traitsinfo_criticalhit_skill">Critical hit skill:</string>
     <string name="traitsinfo_criticalhit_multiplier">Critical multiplier:</string>
     <string name="traitsinfo_defense_chance">Block chance:</string>
     <string name="traitsinfo_defense_damageresist">Damage resistance:</string>
     <string name="skill_shortdescription_barter">Better shop prices</string>
     <string name="skill_shortdescription_dodge">Increased block chance</string>
     <string name="skill_shortdescription_barkskin">Damage resistance</string>
-    <string name="skill_shortdescription_more_criticals">Increased critical chance</string>
+    <string name="skill_shortdescription_more_criticals">Increased critical skill</string>
     <string name="skill_shortdescription_better_criticals">Increased critical damage</string>
     <string name="skill_shortdescription_speed">Increased maximum action points</string>
     <string name="skill_shortdescription_coinfinder">Higher chance of finding gold</string>
     <string name="skill_longdescription_barter">For every skill level, decreases the buying and selling gold penalty by %1$d percentage points.</string>
     <string name="skill_longdescription_dodge">Increases block chance by %1$d for each skill level.</string>
     <string name="skill_longdescription_barkskin">Increases damage resistance by %1$d for each skill level.</string>
-    <string name="skill_longdescription_more_criticals">Increases any existing critical chance given by equipment by %1$d %% for each skill level (percentage of existing critical chance value, not percentage points).</string>
+    <string name="skill_longdescription_more_criticals">Increases any existing critical skill given by equipment by %1$d %% for each skill level (percentage of existing critical skill value, not percentage points).</string>
     <string name="skill_longdescription_better_criticals">Increases any existing critical multiplier given by equipment by %1$d %% for each skill level.</string>
     <string name="skill_longdescription_speed">Increases maximum action points (AP) by %1$d for each skill level.</string>
     <string name="skill_longdescription_coinfinder">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).</string>
     <string name="inventory_movetop">Move to top</string>
     <string name="inventory_movebottom">Move to bottom</string>
     <string name="actorinfo_immune_criticals">Immune to critical hits</string>
-        
+    <string name="traitsinfo_criticalhit_effectivechance">Effective critical chance:</string>
+            
 </resources>
index 72e6a9c11e0ae9200c41e63d5e83dabc7daf8cf5..3d3ab5b7d642049457841e21c680ab8aa119d5cc 100644 (file)
@@ -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<ItemTraits_OnUse> effects_hit = new ArrayList<ItemTraits_OnUse>();
                ArrayList<ItemTraits_OnUse> effects_kill = new ArrayList<ItemTraits_OnUse>();
                for (int i = 0; i < Inventory.NUM_WORN_SLOTS; ++i) {
index 7953f82921f89c23d0095b5cf85d316df4ee60d4..0fb7fc18408042e82a79121af4e1edb03dd93339 100644 (file)
@@ -85,7 +85,7 @@ public final class MonsterInfoActivity extends Activity {
        }\r
 \r
        private void updateTraits(Monster monster) {\r
-               monsterinfo_currenttraits.update(monster.combatTraits);\r
+               monsterinfo_currenttraits.update(monster);\r
                monsterinfo_onhiteffects.update(\r
                        null, \r
                        null, \r
index ac40ac24a3b7e1df9e33e210e6055b103e7d2704..9c4a7fb352fe317aabc296156799f7b2286c71a9 100644 (file)
@@ -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;
index cf266badddbb455899d5b49ef2dd087c2acf197e..3808a2cf0abe40cbef906f81f2b237acbb2c857f 100644 (file)
@@ -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);
index 1c1e3468c4fdd477432e09e263e3af826acb5958..2ed275d7a25f6aeac5e7f51ea3740831015ad6c5 100644 (file)
@@ -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;
                        }
index 73f3b33929eda5c4ba46ad647778e76a2289f869..bf8195bd893db31c653f7c1616cfacf1698afa8c 100644 (file)
@@ -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;
index f384a28a1aa863add0cd9989ef5dcb8e88837148..224139aab50151f6893132373bab26c1ebdcfba6 100644 (file)
@@ -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);
index 7a8449344b55e95e77d9e49761da9f6cec4cc3f4..00d205038eb2f7ca23926e606244876e64819bba 100644 (file)
@@ -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;
index f723cd327694497a2e0c3da5d3cd274152fef2fe..7abe13560038a254fa2e4e17943677a53e1909af 100644 (file)
@@ -116,11 +116,13 @@ public final class ItemType {
                        sb.append(attackEffect.damagePotential.toMinMaxString());\r
                        addSpace = true;\r
                }\r
-               if (attackEffect.hasCriticalChanceEffect()) {\r
+               if (attackEffect.hasCriticalSkillEffect()) {\r
                        sb.append(" +");\r
-                       sb.append(attackEffect.criticalChance);\r
-                       sb.append("%x");\r
-                       sb.append(attackEffect.criticalMultiplier);     \r
+                       sb.append(attackEffect.criticalSkill);\r
+                       sb.append("x");\r
+                       if (attackEffect.hasCriticalMultiplierEffect()) {\r
+                               sb.append(attackEffect.criticalMultiplier);                             \r
+                       }       \r
                }\r
        }\r
        public static String describeAttackEffect(CombatTraits attackEffect) {\r
index f9b29cd8345223321096a9c8bca48a79aa7389ec..5c819d2182d486227d144c844776a8b60677a1bc 100644 (file)
@@ -60,7 +60,7 @@ public final class MonsterTypeParser extends ResourceParserFor<MonsterType> {
        }
        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) {
index cc0416b50695d5747f2b7e7bf189495381104431..3c47b3b8e241fe263d86979aca679af446af52c7 100644 (file)
@@ -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);
index f59eb4642ad2662d36a115993eadcfd0cd859fa6..df59cb26b2a03bd9056b1cc9dcb6dc8dc90307ff 100644 (file)
@@ -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);
index 0691bad819fc5843c0dc0c46dc100584e8ffb2e1..ae391e7cd3ada56162d4f9ff82cc72bc9c5842b1 100644 (file)
@@ -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));
index 041c7d78e3912fb1459b64abb26c3dd47b306154..a076bcc289f7c85c92b405278921d0946b250b84 100644 (file)
@@ -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) + "%");
index e7633d80a5cf17f428b682cf297b3b69766a3202..854e491d8691cba9544cf29476dfcf51d890ab13 100644 (file)
                        </div>\r
                        <div id="hasCriticalDisplay">\r
                                <div class="fieldWithLabel">\r
-                                       <label for="criticalChance" class="label">Critical chance:</label>\r
+                                       <label for="criticalChance" class="label">Critical skill:</label>\r
                                        <div class="field"><input type="text" size="5" id="criticalChance" class="fieldInput integer" />%</div>\r
                                </div>\r
                                <div class="fieldWithLabel">\r
                        </div>\r
                        <div id="equip_hasCriticalDisplay">\r
                                <div class="fieldWithLabel">\r
-                                       <label for="equip_criticalChance" class="label">Critical chance:</label>\r
+                                       <label for="equip_criticalChance" class="label">Critical skill:</label>\r
                                        <div class="field"><input type="text" size="5" id="equip_criticalChance" class="fieldInput integer" />%</div>\r
                                </div>\r
                                <div class="fieldWithLabel">\r
                        </div>\r
                        <div id="hasCriticalDisplay">\r
                                <div class="fieldWithLabel">\r
-                                       <label for="criticalChance" class="label">Critical chance:</label>\r
+                                       <label for="criticalChance" class="label">Critical skill:</label>\r
                                        <div class="field"><input type="text" size="5" id="criticalChance" class="fieldInput integer" />%</div>\r
                                </div>\r
                                <div class="fieldWithLabel">\r