]> www.infradead.org Git - users/mchehab/andors-trail.git/commitdiff
Refactored how item stats are applied. Changed item stats from re-using CombatTraits...
authorOskar Wiksten <oskar.wiksten@gmail.com>
Sun, 30 Sep 2012 21:01:22 +0000 (23:01 +0200)
committerOskar Wiksten <oskar.wiksten@gmail.com>
Sun, 7 Oct 2012 14:39:28 +0000 (16:39 +0200)
21 files changed:
AndorsTrail/res/layout/abilitymodifierview.xml
AndorsTrail/res/values/strings.xml
AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ActorConditionInfoActivity.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/HeroinfoActivity_Inventory.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/HeroinfoActivity_Stats.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ItemInfoActivity.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterInfoActivity.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ActorStatsController.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ItemController.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/CombatTraits.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/ability/traits/AbilityModifierTraits.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemTraits_OnEquip.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemType.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/ActorConditionsTypeParser.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/ItemTraitsParser.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/ItemContainerAdapter.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/ItemEffectsView.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/ShopItemContainerAdapter.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/TraitsInfoView.java

index 4456efb33d5add46facb51c76650e36339458760..7a781d20b8d24b5ac709c4fb3eabd6ebc5d8f557 100644 (file)
@@ -5,12 +5,48 @@
        android:layout_height="wrap_content"
        >
 
-       <com.gpl.rpg.AndorsTrail.view.TraitsInfoView
-               android:id="@+id/abilitymodifierinfo_traits"
+       <TextView 
+               android:text="@string/iteminfo_effect_increase_attack_cost" 
+               android:id="@+id/abilitymodifierinfo_change_attack_cost" 
+               android:layout_width="match_parent"
+               android:layout_height="wrap_content"
+               />
+       <TextView 
+               android:text="@string/iteminfo_effect_increase_attack_chance" 
+               android:id="@+id/abilitymodifierinfo_change_attack_chance" 
+               android:layout_width="match_parent"
+               android:layout_height="wrap_content"
+               />
+       <TextView 
+               android:text="@string/iteminfo_effect_increase_attack_damage" 
+               android:id="@+id/abilitymodifierinfo_change_attack_damage" 
+               android:layout_width="match_parent"
+               android:layout_height="wrap_content"
+               />
+       <TextView 
+               android:text="@string/iteminfo_effect_increase_critical_skill" 
+               android:id="@+id/abilitymodifierinfo_change_critical_skill" 
+               android:layout_width="match_parent"
+               android:layout_height="wrap_content"
+               />
+       <TextView 
+               android:text="@string/iteminfo_effect_critical_multiplier" 
+               android:id="@+id/abilitymodifierinfo_change_critical_multiplier" 
+               android:layout_width="match_parent"
+               android:layout_height="wrap_content"
+               />
+       <TextView 
+               android:text="@string/iteminfo_effect_increase_block_chance" 
+               android:id="@+id/abilitymodifierinfo_change_block_chance" 
+               android:layout_width="match_parent"
+               android:layout_height="wrap_content"
+               />
+       <TextView 
+               android:text="@string/iteminfo_effect_increase_damage_resistance" 
+               android:id="@+id/abilitymodifierinfo_change_damage_resistance" 
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                />
-
        <TextView 
                android:text="@string/iteminfo_effect_increase_max_hp" 
                android:id="@+id/abilitymodifierinfo_change_maxhp" 
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                />
-
+       <TextView 
+               android:text="@string/iteminfo_effect_increase_use_cost" 
+               android:id="@+id/abilitymodifierinfo_change_use_cost" 
+               android:layout_width="match_parent"
+               android:layout_height="wrap_content"
+               />
+       <TextView 
+               android:text="@string/iteminfo_effect_increase_reequip_cost" 
+               android:id="@+id/abilitymodifierinfo_change_reequip_cost" 
+               android:layout_width="match_parent"
+               android:layout_height="wrap_content"
+               />
+       
 </merge>
index 76a094f72bd12c7ae6b0e939ba10a679fe5b1788..570adf205aab350beeaa97ce1788ed9282efa4e7 100644 (file)
        
        <string name="inventory_equip_offhand">Equip (offhand)</string>
        
+       <string name="iteminfo_effect_weapon_attack_cost">Attack cost: %1$d AP</string>
+       <string name="iteminfo_effect_increase_attack_cost">Increases attack cost by %1$d AP</string>
+       <string name="iteminfo_effect_decrease_attack_cost">Lowers attack cost by %1$d AP</string>
+       <string name="iteminfo_effect_weapon_attack_chance">Attack chance: %1$d %%</string>
+       <string name="iteminfo_effect_increase_attack_chance">Increases attack chance by %1$d %%</string>
+       <string name="iteminfo_effect_decrease_attack_chance">Lowers attack chance by %1$d %%</string>
+       <string name="iteminfo_effect_weapon_attack_damage">Attack damage: %1$d</string>
+       <string name="iteminfo_effect_weapon_attack_damage_minmax">Attack damage: %1$d-%2$d</string>
+       <string name="iteminfo_effect_increase_attack_damage">Increases attack damage by %1$d</string>
+       <string name="iteminfo_effect_increase_attack_damage_minmax">Increases attack damage by %1$d-%2$d</string>
+       <string name="iteminfo_effect_decrease_attack_damage">Lowers attack damage by %1$d</string>
+       <string name="iteminfo_effect_decrease_attack_damage_minmax">Lowers attack damage by %1$d-%2$d</string>
+       <string name="iteminfo_effect_increase_critical_skill">Increases critical skill by %1$d</string>
+       <string name="iteminfo_effect_decrease_critical_skill">Lowers critical skill by %1$d</string>
+       <string name="iteminfo_effect_critical_multiplier">Enables critical hits with a multiplier of x%1$.1f</string>
+       <string name="iteminfo_effect_increase_block_chance">Increases block chance by %1$d %%</string>
+       <string name="iteminfo_effect_decrease_block_chance">Lowers block chance by %1$d %%</string>
+       <string name="iteminfo_effect_increase_damage_resistance">Raises damage resistance by %1$d</string>
+       <string name="iteminfo_effect_decrease_damage_resistance">Lowers damage resistance by %1$d</string>
+       <string name="iteminfo_effect_increase_use_cost">Increases AP cost of using items in combat by %1$d AP</string>
+       <string name="iteminfo_effect_decrease_use_cost">Lowers AP cost of using items in combat by %1$d AP</string>
+       <string name="iteminfo_effect_increase_reequip_cost">Increases AP cost of equipping items in combat by %1$d AP</string>
+       <string name="iteminfo_effect_decrease_reequip_cost">Lowers AP cost of equipping items in combat by %1$d AP</string>
+               
 </resources>
index 9309319ddc9abfaa008a05f975d993969de74201..f47dfe8603e4f703dc5a2e4b152fc49f07377345 100644 (file)
@@ -57,7 +57,8 @@ public class ActorConditionInfoActivity extends Activity {
         final String categoryName = res.getStringArray(R.array.actorcondition_categories)[conditionType.conditionCategory];
         tv.setText(res.getString(R.string.actorconditioninfo_category, categoryName));
         
-        ((AbilityModifierInfoView) findViewById(R.id.actorconditioninfo_constant_effect_abilitymodifierinfo)).update(conditionType.abilityEffect);
+        ((AbilityModifierInfoView) findViewById(R.id.actorconditioninfo_constant_effect_abilitymodifierinfo)).update(conditionType.abilityEffect, false);
+                
         tv = (TextView) findViewById(R.id.actorconditioninfo_constant_effect_title);
         if (conditionType.abilityEffect != null) {
                tv.setVisibility(View.VISIBLE);
index 735cadce52b828f38d6a998764e024da12864905..27987f667a1d9c90c9b074df214229495a2957af 100644 (file)
@@ -5,6 +5,8 @@ import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
 import com.gpl.rpg.AndorsTrail.R;
 import com.gpl.rpg.AndorsTrail.context.ViewContext;
 import com.gpl.rpg.AndorsTrail.context.WorldContext;
+import com.gpl.rpg.AndorsTrail.controller.ItemController;
+import com.gpl.rpg.AndorsTrail.model.CombatTraits;
 import com.gpl.rpg.AndorsTrail.model.actor.Player;
 import com.gpl.rpg.AndorsTrail.model.item.Inventory;
 import com.gpl.rpg.AndorsTrail.model.item.ItemContainer;
@@ -162,8 +164,15 @@ public final class HeroinfoActivity_Inventory extends Activity {
 
        private void updateTraits() {
         heroinfo_stats_gold.setText(getResources().getString(R.string.heroinfo_gold, player.inventory.gold));
-        heroinfo_stats_attack.setText(ItemType.describeAttackEffect(player.combatTraits));
-        heroinfo_stats_defense.setText(ItemType.describeBlockEffect(player.combatTraits));
+        CombatTraits c = player.combatTraits;
+        
+        StringBuilder sb = new StringBuilder();
+        ItemController.describeAttackEffect(c.attackChance, c.damagePotential.current, c.damagePotential.max, c.criticalSkill, c.criticalMultiplier, sb);
+        heroinfo_stats_attack.setText(sb.toString());
+        
+        sb = new StringBuilder();
+        ItemController.describeBlockEffect(c.blockChance, c.damageResistance, sb);
+        heroinfo_stats_defense.setText(sb.toString());
     }
 
     private void updateWorn() {
index 3d3ab5b7d642049457841e21c680ab8aa119d5cc..fa47dc598dcc9cc19ec374a26f21c2a1343d4195 100644 (file)
@@ -125,7 +125,7 @@ public final class HeroinfoActivity_Stats extends Activity {
                }
                if (effects_hit.isEmpty()) effects_hit = null;
                if (effects_kill.isEmpty()) effects_kill = null;
-               heroinfo_itemeffects.update(null, null, effects_hit, effects_kill);
+               heroinfo_itemeffects.update(null, null, effects_hit, effects_kill, false);
                heroinfo_basetraits.update(player.actorTraits);
     }
 
index 753816be478256e334b22feea99dd965703fe71e..12b770eeea5daf4291e848f60e792699f3dea12b 100644 (file)
@@ -57,7 +57,8 @@ public final class ItemInfoActivity extends Activity {
                        itemType.effects_equip,
                        itemType.effects_use == null ? null : Arrays.asList(itemType.effects_use),
                                itemType.effects_hit == null ? null : Arrays.asList(itemType.effects_hit),
-                               itemType.effects_kill == null ? null : Arrays.asList(itemType.effects_kill)
+                               itemType.effects_kill == null ? null : Arrays.asList(itemType.effects_kill),
+                               itemType.isWeapon()
                );
         
         Button b = (Button) findViewById(R.id.iteminfo_close);
index 0fb7fc18408042e82a79121af4e1edb03dd93339..3fa7c1569cfab00c14221b2adb52436d250a1462 100644 (file)
@@ -90,7 +90,8 @@ public final class MonsterInfoActivity extends Activity {
                        null, \r
                        null, \r
                        monster.actorTraits.onHitEffects == null ? null : Arrays.asList(monster.actorTraits.onHitEffects), \r
-                       null);\r
+                       null,\r
+                       false);\r
         hp.update(monster.health);\r
         monsterinfo_immune_criticals.setVisibility(monster.isImmuneToCriticalHits ? View.VISIBLE : View.GONE);\r
     }\r
index 48c0a7a59f090e499e85757cb30fadcee1a75688..f556f9464ef2c99e30ba197f4d3e3ce2b35532c2 100644 (file)
@@ -155,21 +155,18 @@ public class ActorStatsController {
                
                CombatTraits actorCombatTraits = actor.combatTraits;
                
-               actor.health.addToMax(effects.maxHPBoost * multiplier);
-               actor.ap.addToMax(effects.maxAPBoost * multiplier);
-               actor.actorTraits.moveCost += effects.moveCostPenalty * multiplier;
+               actor.health.addToMax(effects.increaseMaxHP * multiplier);
+               actor.ap.addToMax(effects.increaseMaxAP * multiplier);
+               actor.actorTraits.moveCost += effects.increaseMoveCost * multiplier;
                
-               CombatTraits combatTraits = effects.combatProficiency;
-               if (combatTraits != null) {
-                       actorCombatTraits.attackCost += combatTraits.attackCost * multiplier;
-                       //criticalMultiplier should not be increased. It is always defined by the weapon in use.
-                       actorCombatTraits.attackChance += combatTraits.attackChance * multiplier;
-                       actorCombatTraits.criticalSkill += combatTraits.criticalSkill * multiplier;
-                       actorCombatTraits.damagePotential.add(combatTraits.damagePotential.current * multiplier, true);
-                       actorCombatTraits.damagePotential.addToMax(combatTraits.damagePotential.max * multiplier);
-                       actorCombatTraits.blockChance += combatTraits.blockChance * multiplier;
-                       actorCombatTraits.damageResistance += combatTraits.damageResistance * multiplier;
-               }
+               actorCombatTraits.attackCost += effects.increaseAttackCost * multiplier;
+               //criticalMultiplier should not be increased. It is always defined by the weapon in use.
+               actorCombatTraits.attackChance += effects.increaseAttackChance * multiplier;
+               actorCombatTraits.criticalSkill += effects.increaseCriticalSkill * multiplier;
+               actorCombatTraits.damagePotential.add(effects.increaseMinDamage * multiplier, true);
+               actorCombatTraits.damagePotential.addToMax(effects.increaseMaxDamage * multiplier);
+               actorCombatTraits.blockChance += effects.increaseBlockChance * multiplier;
+               actorCombatTraits.damageResistance += effects.increaseDamageResistance * multiplier;
                
                if (actorCombatTraits.attackCost <= 0) actorCombatTraits.attackCost = 1;
                if (actorCombatTraits.attackChance < 0) actorCombatTraits.attackChance = 0;
index 706193cf7276c9bd89525709df1195204c17aa81..7f5ff7918c3da2568cbb9eb8b673f5234dbb11fc 100644 (file)
@@ -10,12 +10,14 @@ import com.gpl.rpg.AndorsTrail.context.WorldContext;
 import com.gpl.rpg.AndorsTrail.model.ModelContainer;
 import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionEffect;
 import com.gpl.rpg.AndorsTrail.model.ability.SkillCollection;
+import com.gpl.rpg.AndorsTrail.model.ability.traits.AbilityModifierTraits;
 import com.gpl.rpg.AndorsTrail.model.actor.Player;
 import com.gpl.rpg.AndorsTrail.model.item.Inventory;
 import com.gpl.rpg.AndorsTrail.model.item.ItemContainer;
 import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse;
 import com.gpl.rpg.AndorsTrail.model.item.ItemType;
 import com.gpl.rpg.AndorsTrail.model.item.Loot;
+import com.gpl.rpg.AndorsTrail.model.item.ItemContainer.ItemEntry;
 import com.gpl.rpg.AndorsTrail.view.MainView;
 
 public final class ItemController {
@@ -103,7 +105,7 @@ public final class ItemController {
                ItemType weapon = getMainWeapon(player);
                if (weapon != null) {
                        player.combatTraits.attackCost = 0;
-                       player.combatTraits.criticalMultiplier = weapon.effects_equip.combatProficiency.criticalMultiplier;
+                       player.combatTraits.criticalMultiplier = weapon.effects_equip.stats.setCriticalMultiplier;
                }
                
                applyInventoryEffects(player, Inventory.WEARSLOT_WEAPON);
@@ -135,7 +137,8 @@ public final class ItemController {
                        // The stats for off-hand weapons will be added later in SkillController.applySkillEffectsFromFightingStyles
                        if (SkillController.isDualWielding(mainHandItem, type)) return;
                }
-               ActorStatsController.applyAbilityEffects(player, type.effects_equip, 1);
+               if (type.effects_equip != null && type.effects_equip.stats != null)
+               ActorStatsController.applyAbilityEffects(player, type.effects_equip.stats, 1);
        }
        
        public static void recalculateHitEffectsFromWornItems(Player player) {
@@ -241,6 +244,79 @@ public final class ItemController {
                        model.statistics.addGoldSpent(price);
                }
        }
+       
+
+       public static String describeItemForListView(ItemEntry item) {
+               StringBuilder sb = new StringBuilder(item.itemType.name);
+               if (item.quantity > 1) {
+                       sb.append(" (");
+                       sb.append(item.quantity);
+                       sb.append(')'); 
+               }
+               if (item.itemType.effects_equip != null) {
+                       AbilityModifierTraits t = item.itemType.effects_equip.stats;
+                       if (t != null) {
+                               if (t.increaseAttackChance != 0
+                                       || t.increaseMinDamage != 0
+                                       || t.increaseMaxDamage != 0
+                                       || t.increaseCriticalSkill != 0
+                                       || t.setCriticalMultiplier != 0) {
+                                       sb.append(" [");
+                                       describeAttackEffect(t.increaseAttackChance, t.increaseMinDamage, t.increaseMaxDamage, t.increaseCriticalSkill, t.setCriticalMultiplier, sb);
+                                       sb.append(']');
+                               }
+                               if (t.increaseBlockChance != 0
+                                       || t.increaseDamageResistance != 0) {
+                                       sb.append(" [");
+                                       describeBlockEffect(t.increaseBlockChance, t.increaseDamageResistance, sb);
+                                       sb.append(']');
+                               }
+                       }
+               }
+               return sb.toString();
+       }
+
+       public static void describeAttackEffect(int attackChance, int minDamage, int maxDamage, int criticalSkill, float criticalMultiplier, StringBuilder sb) {
+               boolean addSpace = false;
+               if (attackChance != 0) {
+                       sb.append(attackChance);
+                       sb.append('%');
+                       addSpace = true;
+               }
+               if (minDamage != 0 || maxDamage != 0) {
+                       if (addSpace) sb.append(' ');
+                       sb.append(minDamage);
+                       if (minDamage != maxDamage) {
+                               sb.append('-');
+                               sb.append(maxDamage);
+                       }
+                       addSpace = true;
+               }
+               if (criticalSkill != 0) {
+                       if (addSpace) sb.append(' ');
+                       if (criticalSkill >= 0) {
+                               sb.append('+');
+                       }
+                       sb.append(criticalSkill);
+                       addSpace = true;
+               }
+               if (criticalMultiplier != 0 && criticalMultiplier != 1) {
+                       sb.append('x');
+                       sb.append(criticalMultiplier);
+                       addSpace = true;
+               }
+       }
+       
+       public static void describeBlockEffect(int blockChance, int damageResistance, StringBuilder sb) {
+               if (blockChance != 0) {
+                       sb.append(blockChance);
+                       sb.append('%');
+               }
+               if (damageResistance != 0) {
+                       sb.append('/');
+                       sb.append(damageResistance);    
+               }
+       }
 
        public void quickitemUse(int quickSlotId) {
                useItem(model.player.inventory.quickitem[quickSlotId]);
index 224139aab50151f6893132373bab26c1ebdcfba6..ad4fa02cb4b047c9db8c762e804d865de089e17b 100644 (file)
@@ -102,24 +102,6 @@ public class CombatTraits {
                return 0;
        }
        
-       public int calculateCost(boolean isWeapon) {
-               final int costBC = (int) (3*Math.pow(Math.max(0, blockChance), 2.5) + 28*blockChance);
-               final int costAC = (int) (0.4*Math.pow(Math.max(0,attackChance), 2.5) - 6*Math.pow(Math.abs(Math.min(0,attackChance)),2.7));
-               final int costAP = isWeapon ?
-                               (int) (0.2*Math.pow(10.0f/attackCost, 8) - 25*attackCost)
-                               : -3125 * attackCost;
-               final int costDR = 1325*damageResistance;
-               final int costDMG_Min = isWeapon ?
-                               (int) (10*Math.pow(Math.max(0, damagePotential.current), 2.5))
-                               :(int) (10*Math.pow(Math.max(0, damagePotential.current), 3) + damagePotential.current*80);
-               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 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 + costCS + costCM;
-       }
 
        
        // ====== PARCELABLE ===================================================================
index 271461755ac2973bd9b5643d2c198955d8f296b1..354c19e942291ac56852b7fac618402625a5e8e8 100644 (file)
@@ -1,25 +1,77 @@
 package com.gpl.rpg.AndorsTrail.model.ability.traits;
 
-import com.gpl.rpg.AndorsTrail.model.CombatTraits;
+public final class AbilityModifierTraits {
+       public final int increaseMaxHP;
+       public final int increaseMaxAP;
+       public final int increaseMoveCost;
+       public final int increaseUseItemCost;
+       public final int increaseReequipCost;
+       public final int increaseAttackCost;
 
-public class AbilityModifierTraits {
-       public final int maxHPBoost;
-       public final int maxAPBoost;
-       public final int moveCostPenalty;
-       public final CombatTraits combatProficiency;
+       public final int increaseAttackChance;
+       public final int increaseBlockChance;
+       public final int increaseMinDamage;
+       public final int increaseMaxDamage;
+       public final int increaseCriticalSkill;
+       public final float setCriticalMultiplier;
+       public final int increaseDamageResistance;
        
-       public AbilityModifierTraits(int maxHPBoost, int maxAPBoost, int moveCostPenalty, CombatTraits combatProficiency) {
-               this.maxHPBoost = maxHPBoost;
-               this.maxAPBoost = maxAPBoost;
-               this.moveCostPenalty = moveCostPenalty;
-               this.combatProficiency = combatProficiency;
+       public AbilityModifierTraits(
+                       int increaseMaxHP, 
+                       int increaseMaxAP, 
+                       int increaseMoveCost,
+                       int increaseUseItemCost,
+                       int increaseReequipCost,
+                       int increaseAttackCost,
+                       int increaseAttackChance,
+                       int increaseBlockChance,
+                       int increaseMinDamage,
+                       int increaseMaxDamage,
+                       int increaseCriticalSkill,
+                       float setCriticalMultiplier,
+                       int increaseDamageResistance
+                       ) {
+               this.increaseMaxHP = increaseMaxHP;
+               this.increaseMaxAP = increaseMaxAP;
+               this.increaseMoveCost = increaseMoveCost;
+               this.increaseUseItemCost = increaseUseItemCost;
+               this.increaseReequipCost = increaseReequipCost;
+               this.increaseAttackCost = increaseAttackCost;
+               this.increaseAttackChance = increaseAttackChance;
+               this.increaseBlockChance = increaseBlockChance;
+               this.increaseMinDamage = increaseMinDamage;
+               this.increaseMaxDamage = increaseMaxDamage;
+               this.increaseCriticalSkill = increaseCriticalSkill;
+               this.setCriticalMultiplier = setCriticalMultiplier;
+               this.increaseDamageResistance = increaseDamageResistance;
        }
        
+       public boolean hasAttackChanceEffect() { return increaseAttackChance != 0; }
+       public boolean hasAttackDamageEffect() { return increaseMinDamage != 0 || increaseMaxDamage != 0; }
+       public boolean hasBlockEffect() { return increaseBlockChance != 0; }
+       public boolean hasCriticalSkillEffect() { return increaseCriticalSkill != 0; }
+       public boolean hasCriticalMultiplierEffect() { return setCriticalMultiplier != 0 && setCriticalMultiplier != 1; }
+               
        public int calculateCost(boolean isWeapon) {
-               final int costCombat = combatProficiency == null ? 0 : combatProficiency.calculateCost(isWeapon);
-               final int costMaxHP = (int) (30*Math.pow(Math.max(0,maxHPBoost), 1.2) + 70*maxHPBoost);
-               final int costMaxAP = (int) (50*Math.pow(Math.max(0,maxAPBoost), 3) + 750*maxAPBoost);
-               final int costMovement = (int) (510*Math.pow(Math.max(0,-moveCostPenalty), 2.5) - 350*moveCostPenalty);
-               return costCombat + costMaxHP + costMaxAP + costMovement;
+               final int costBC = (int) (3*Math.pow(Math.max(0, increaseBlockChance), 2.5) + 28*increaseBlockChance);
+               final int costAC = (int) (0.4*Math.pow(Math.max(0,increaseAttackChance), 2.5) - 6*Math.pow(Math.abs(Math.min(0,increaseAttackChance)),2.7));
+               final int costAP = isWeapon ?
+                               (int) (0.2*Math.pow(10.0f/increaseAttackCost, 8) - 25*increaseAttackCost)
+                               :-3125 * increaseAttackCost;
+               final int costDR = 1325 * increaseDamageResistance;
+               final int costDMG_Min = isWeapon ?
+                               (int) (10*Math.pow(Math.max(0, increaseMinDamage), 2.5))
+                               :(int) (10*Math.pow(Math.max(0, increaseMinDamage), 3) + increaseMinDamage*80);
+               final int costDMG_Max = isWeapon ?
+                               (int) (2*Math.pow(Math.max(0, increaseMaxDamage), 2.1))
+                               :(int) (2*Math.pow(Math.max(0, increaseMaxDamage), 3) + increaseMaxDamage*20);
+               final int costCS = (int) (2.2*Math.pow(increaseCriticalSkill, 3));
+               final int costCM = (int) (50*Math.pow(Math.max(0, setCriticalMultiplier), 2));
+                               
+               final int costMaxHP = (int) (30*Math.pow(Math.max(0,increaseMaxHP), 1.2) + 70*increaseMaxHP);
+               final int costMaxAP = (int) (50*Math.pow(Math.max(0,increaseMaxAP), 3) + 750*increaseMaxAP);
+               final int costMovement = (int) (510*Math.pow(Math.max(0,-increaseMoveCost), 2.5) - 350*increaseMoveCost);
+               
+               return costBC + costAC + costAP + costDR + costDMG_Min + costDMG_Max + costCS + costCM + costMaxHP + costMaxAP + costMovement;
        }
 }
index c7cac147431937e56e9a3d75fdf80a17ca1e8ee2..b6ada67ccfde1b1c2ff25ac6fd4da997f2346fdb 100644 (file)
@@ -1,14 +1,21 @@
 package com.gpl.rpg.AndorsTrail.model.item;
 
-import com.gpl.rpg.AndorsTrail.model.CombatTraits;
 import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionEffect;
 import com.gpl.rpg.AndorsTrail.model.ability.traits.AbilityModifierTraits;
 
-public final class ItemTraits_OnEquip extends AbilityModifierTraits {
+public final class ItemTraits_OnEquip {
+       public final AbilityModifierTraits stats;
        public final ActorConditionEffect[] addedConditions;
        
-       public ItemTraits_OnEquip(int maxHPBoost, int maxAPBoost, int moveCostPenalty, CombatTraits combatProficiency, ActorConditionEffect[] addedConditions) {
-               super(maxHPBoost, maxAPBoost, moveCostPenalty, combatProficiency);
+       public ItemTraits_OnEquip(
+                       AbilityModifierTraits stats, 
+                       ActorConditionEffect[] addedConditions) {
+               this.stats = stats;
                this.addedConditions = addedConditions;
        }
+
+       public int calculateCost(boolean isWeapon) {
+               final int costStats = stats == null ? 0 : stats.calculateCost(isWeapon);
+               return costStats;
+       }
 }
index 6ccd3d643eb5fb961ce2f3a9fe88e1faccb2d76a..d1a98bfeed721a6bb8ef8d3d1e039b0a1f7aecc0 100644 (file)
@@ -1,6 +1,5 @@
 package com.gpl.rpg.AndorsTrail.model.item;\r
 \r
-import com.gpl.rpg.AndorsTrail.model.CombatTraits;\r
 import com.gpl.rpg.AndorsTrail.resource.tiles.TileManager;\r
 \r
 public final class ItemType {\r
@@ -25,7 +24,18 @@ public final class ItemType {
        public final ItemTraits_OnUse effects_hit;\r
        public final ItemTraits_OnUse effects_kill;\r
 \r
-       public ItemType(String id, int iconID, String name, ItemCategory category, int displayType, boolean hasManualPrice, int fixedBaseMarketCost, ItemTraits_OnEquip effects_equip, ItemTraits_OnUse effects_use, ItemTraits_OnUse effects_hit, ItemTraits_OnUse effects_kill) {\r
+       public ItemType(\r
+                       String id, \r
+                       int iconID, \r
+                       String name, \r
+                       ItemCategory category, \r
+                       int displayType, \r
+                       boolean hasManualPrice, \r
+                       int fixedBaseMarketCost, \r
+                       ItemTraits_OnEquip effects_equip, \r
+                       ItemTraits_OnUse effects_use, \r
+                       ItemTraits_OnUse effects_hit, \r
+                       ItemTraits_OnUse effects_kill) {\r
                this.id = id;\r
                this.iconID = iconID;\r
                this.name = name;\r
@@ -55,76 +65,6 @@ public final class ItemType {
                return true;\r
        }\r
        \r
-       \r
-       public String describeWearEffect(int quantity) {\r
-               StringBuilder sb = new StringBuilder(name);\r
-               if (quantity > 1) {\r
-                       sb.append(" (");\r
-                       sb.append(quantity);\r
-                       sb.append(')'); \r
-               }\r
-               if (effects_equip != null) {\r
-                       if (effects_equip.combatProficiency != null) {\r
-                               if (effects_equip.combatProficiency.hasAttackChanceEffect() || effects_equip.combatProficiency.hasAttackDamageEffect()) {\r
-                                       sb.append(" [");\r
-                                       describeAttackEffect(effects_equip.combatProficiency, sb);\r
-                                       sb.append(']');\r
-                               }\r
-                               if (effects_equip.combatProficiency.hasBlockEffect()) {\r
-                                       sb.append(" [");\r
-                                       describeBlockEffect(effects_equip.combatProficiency, sb);\r
-                                       sb.append(']');\r
-                               }\r
-                       }\r
-               }\r
-               return sb.toString();\r
-       }\r
-       \r
-       public static void describeAttackEffect(CombatTraits attackEffect, StringBuilder sb) {\r
-               boolean addSpace = false;\r
-               if (attackEffect.hasAttackChanceEffect()) {\r
-                       sb.append(attackEffect.attackChance);\r
-                       sb.append('%');\r
-                       addSpace = true;\r
-               }\r
-               if (attackEffect.hasAttackDamageEffect()) {\r
-                       if (addSpace) sb.append(' ');\r
-                       sb.append(attackEffect.damagePotential.toMinMaxString());\r
-                       addSpace = true;\r
-               }\r
-               if (attackEffect.hasCriticalSkillEffect()) {\r
-                       if (addSpace) sb.append(' ');\r
-                       if (attackEffect.criticalSkill >= 0) {\r
-                               sb.append('+');\r
-                       }\r
-                       sb.append(attackEffect.criticalSkill);\r
-                       sb.append("x");\r
-                       if (attackEffect.hasCriticalMultiplierEffect()) {\r
-                               sb.append(attackEffect.criticalMultiplier);                             \r
-                       }\r
-                       addSpace = true;\r
-               }\r
-       }\r
-       public static String describeAttackEffect(CombatTraits attackEffect) {\r
-               StringBuilder sb = new StringBuilder();\r
-               describeAttackEffect(attackEffect, sb);\r
-               return sb.toString();\r
-       }\r
-       \r
-       public static void describeBlockEffect(CombatTraits defenseEffect, StringBuilder sb) {\r
-               sb.append(defenseEffect.blockChance);\r
-               sb.append('%');\r
-               if (defenseEffect.damageResistance != 0) {\r
-                       sb.append('/');\r
-                       sb.append(defenseEffect.damageResistance);      \r
-               }\r
-       }\r
-       public static String describeBlockEffect(CombatTraits defenseEffect) {\r
-               StringBuilder sb = new StringBuilder();\r
-               describeBlockEffect(defenseEffect, sb);\r
-               return sb.toString();\r
-       }\r
-       \r
        public int getOverlayTileID() {\r
                switch (displayType) {\r
                case ItemType.DISPLAYTYPE_QUEST:\r
index a82d6d8fe0f393e0020070732d4b3ab9062a83c5..17af2a1781be6dfa3927b1ae7456b84ce1c3744b 100644 (file)
@@ -1,6 +1,7 @@
 package com.gpl.rpg.AndorsTrail.resource.parsers;
 
 import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionType;
+import com.gpl.rpg.AndorsTrail.model.ability.traits.AbilityModifierTraits;
 import com.gpl.rpg.AndorsTrail.resource.DynamicTileLoader;
 import com.gpl.rpg.AndorsTrail.resource.ResourceFileTokenizer.ResourceParserFor;
 import com.gpl.rpg.AndorsTrail.util.Pair;
@@ -17,6 +18,12 @@ public final class ActorConditionsTypeParser extends ResourceParserFor<ActorCond
        @Override
        public Pair<String, ActorConditionType> parseRow(String[] parts) {
                final String conditionTypeID = parts[0];
+               
+               AbilityModifierTraits stats = null;
+               if (ResourceParserUtils.parseBoolean(parts[18], false)) {
+                       stats = ResourceParserUtils.parseAbilityModifierTraits(parts, 19);
+               } 
+               
                return new Pair<String, ActorConditionType>(conditionTypeID, new ActorConditionType(
                                conditionTypeID
                                , parts[1]
@@ -26,7 +33,7 @@ public final class ActorConditionsTypeParser extends ResourceParserFor<ActorCond
                                , ResourceParserUtils.parseBoolean(parts[5], false)
                                , ResourceParserUtils.parseStatsModifierTraits(parts, 6)
                        , ResourceParserUtils.parseStatsModifierTraits(parts, 12)
-                       , ResourceParserUtils.parseAbilityModifierTraits(parts, 18)
+                       , stats
                        ));
        }
 }
index 66ad2ef26cd4ebf034db9424e34d129593523b7d..29234b475d7e8151bfdd5ed2ca181c3a17a3d924 100644 (file)
@@ -3,10 +3,10 @@ package com.gpl.rpg.AndorsTrail.resource.parsers;
 import java.util.ArrayList;
 
 import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
-import com.gpl.rpg.AndorsTrail.model.CombatTraits;
 import com.gpl.rpg.AndorsTrail.model.ability.ActorCondition;
 import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionEffect;
 import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionTypeCollection;
+import com.gpl.rpg.AndorsTrail.model.ability.traits.AbilityModifierTraits;
 import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnEquip;
 import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse;
 import com.gpl.rpg.AndorsTrail.resource.ResourceFileTokenizer;
@@ -81,31 +81,17 @@ public final class ItemTraitsParser {
                boolean hasEffect = ResourceParserUtils.parseBoolean(parts[startIndex], false);
                if (!hasEffect) return null;
                
-               String boostMaxHP = parts[startIndex + 1];
-               String boostMaxAP = parts[startIndex + 2];
-               String moveCostPenalty = parts[startIndex + 3];
-               CombatTraits combatTraits = ResourceParserUtils.parseCombatTraits(parts, startIndex + 4);
+               AbilityModifierTraits stats = ResourceParserUtils.parseAbilityModifierTraits(parts, startIndex + 1);
                final ArrayList<ActorConditionEffect> addedConditions = new ArrayList<ActorConditionEffect>();
                tokenize2Fields.tokenizeArray(parts[startIndex + 12], addedConditions, actorConditionEffectParser_withoutDuration);
                
-               if (       boostMaxHP.length() <= 0 
-                               && boostMaxAP.length() <= 0
-                               && moveCostPenalty.length() <= 0
-                               && combatTraits == null
-                               && addedConditions.isEmpty()
-                       ) {
+               if (stats == null && addedConditions.isEmpty()) {
                        if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
                                L.log("OPTIMIZE: Tried to parseItemTraits_OnEquip , where hasEffect=" + parts[startIndex] + ", but all data was empty.");
                        }
                        return null;
                } else {
-                       return new ItemTraits_OnEquip(
-                                       ResourceParserUtils.parseInt(boostMaxHP, 0)
-                                       ,ResourceParserUtils.parseInt(boostMaxAP, 0)
-                                       ,ResourceParserUtils.parseInt(moveCostPenalty, 0)
-                                       ,combatTraits
-                                       ,listToArray(addedConditions)
-                                       );
+                       return new ItemTraits_OnEquip(stats, listToArray(addedConditions));
                }
        }
        
index 3c47b3b8e241fe263d86979aca679af446af52c7..322349bfad1869b695e0ff84faceba6b64c0f7c1 100644 (file)
@@ -121,30 +121,47 @@ public final class ResourceParserUtils {
        }
        
        public static AbilityModifierTraits parseAbilityModifierTraits(String[] parts, int startIndex) {
-               boolean hasEffect = parseBoolean(parts[startIndex], false);
-               if (!hasEffect) return null;
-               
-               String boostMaxHP = parts[startIndex + 1];
-               String boostMaxAP = parts[startIndex + 2];
-               String moveCostPenalty = parts[startIndex + 3];
-               CombatTraits combatTraits = parseCombatTraits(parts, startIndex + 4);
+               String increaseMaxHP = parts[startIndex + 0];
+               String increaseMaxAP = parts[startIndex + 1];
+               String increaseMoveCost = parts[startIndex + 2];
+               String increaseAttackCost = parts[startIndex + 3];
+               String increaseAttackChance = parts[startIndex + 4];
+               String increaseBlockChance = parts[startIndex + 9];
+               String increaseMinDamage = parts[startIndex + 7];
+               String increaseMaxDamage = parts[startIndex + 8];
+               String increaseCriticalSkill = parts[startIndex + 5];
+               String setCriticalMultiplier = parts[startIndex + 6];
+               String increaseDamageResistance = parts[startIndex + 10];
                
-               if (       boostMaxHP.length() <= 0 
-                               && boostMaxAP.length() <= 0 
-                               && moveCostPenalty.length() <= 0
-                               && combatTraits == null
+               if (       increaseMaxHP.length() <= 0 
+                               && increaseMaxAP.length() <= 0 
+                               && increaseMoveCost.length() <= 0
+                               && increaseAttackCost.length() <= 0 
+                               && increaseAttackChance.length() <= 0
+                               && increaseBlockChance.length() <= 0
+                               && increaseMinDamage.length() <= 0
+                               && increaseMaxDamage.length() <= 0
+                               && increaseCriticalSkill.length() <= 0
+                               && setCriticalMultiplier.length() <= 0
+                               && increaseDamageResistance.length() <= 0
                        ) {
-                       if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
-                               L.log("OPTIMIZE: Tried to parseAbilityModifierTraits , where hasEffect=" + parts[startIndex] + ", but all data was empty.");
-                       }
                        return null;
                } else {
                        return new AbilityModifierTraits(
-                                       parseInt(boostMaxHP, 0)
-                                       ,parseInt(boostMaxAP, 0)
-                                       ,parseInt(moveCostPenalty, 0)
-                                       ,combatTraits
-                                       );
+                                       parseInt(increaseMaxHP, 0)
+                                       ,parseInt(increaseMaxAP, 0)
+                                       ,parseInt(increaseMoveCost, 0)
+                                       ,0 // increaseUseItemCost
+                                       ,0 // increaseReequipCost
+                                       ,parseInt(increaseAttackCost, 0)
+                                       ,parseInt(increaseAttackChance, 0)
+                                       ,parseInt(increaseBlockChance, 0)
+                                       ,parseInt(increaseMinDamage, 0)
+                                       ,parseInt(increaseMaxDamage, 0)
+                                       ,parseInt(increaseCriticalSkill, 0)
+                                       ,parseFloat(setCriticalMultiplier, 0)
+                                       ,parseInt(increaseDamageResistance, 0)
+                               );
                }
        }
        
index df59cb26b2a03bd9056b1cc9dcb6dc8dc90307ff..ae3734b910fc29625d89ae25d9cd2d9559cda424 100644 (file)
@@ -11,10 +11,18 @@ import android.widget.LinearLayout;
 import android.widget.TextView;
 
 public final class AbilityModifierInfoView extends LinearLayout {
-       private final TraitsInfoView abilitymodifierinfo_traits;
        private final TextView abilitymodifierinfo_change_maxap;
        private final TextView abilitymodifierinfo_change_maxhp;
        private final TextView abilitymodifierinfo_change_movecost;
+       private final TextView abilitymodifierinfo_change_use_cost;
+       private final TextView abilitymodifierinfo_change_reequip_cost;
+       private final TextView abilitymodifierinfo_change_attack_cost;
+       private final TextView abilitymodifierinfo_change_attack_chance;
+       private final TextView abilitymodifierinfo_change_attack_damage;
+       private final TextView abilitymodifierinfo_change_critical_skill;
+       private final TextView abilitymodifierinfo_change_critical_multiplier;
+       private final TextView abilitymodifierinfo_change_block_chance;
+       private final TextView abilitymodifierinfo_change_damage_resistance;
        
        public AbilityModifierInfoView(Context context, AttributeSet attr) {
                super(context, attr);
@@ -22,44 +30,72 @@ public final class AbilityModifierInfoView extends LinearLayout {
         setOrientation(LinearLayout.VERTICAL);
         inflate(context, R.layout.abilitymodifierview, this);
         
-        abilitymodifierinfo_traits = (TraitsInfoView) findViewById(R.id.abilitymodifierinfo_traits);
         abilitymodifierinfo_change_maxap = (TextView) findViewById(R.id.abilitymodifierinfo_change_maxap);
         abilitymodifierinfo_change_maxhp = (TextView) findViewById(R.id.abilitymodifierinfo_change_maxhp);
         abilitymodifierinfo_change_movecost = (TextView) findViewById(R.id.abilitymodifierinfo_change_movecost);
+        abilitymodifierinfo_change_use_cost = (TextView) findViewById(R.id.abilitymodifierinfo_change_use_cost);
+        abilitymodifierinfo_change_reequip_cost = (TextView) findViewById(R.id.abilitymodifierinfo_change_reequip_cost);
+        abilitymodifierinfo_change_attack_cost = (TextView) findViewById(R.id.abilitymodifierinfo_change_attack_cost);
+        abilitymodifierinfo_change_attack_chance = (TextView) findViewById(R.id.abilitymodifierinfo_change_attack_chance);
+        abilitymodifierinfo_change_attack_damage = (TextView) findViewById(R.id.abilitymodifierinfo_change_attack_damage);
+        abilitymodifierinfo_change_critical_skill = (TextView) findViewById(R.id.abilitymodifierinfo_change_critical_skill);
+        abilitymodifierinfo_change_critical_multiplier = (TextView) findViewById(R.id.abilitymodifierinfo_change_critical_multiplier);
+        abilitymodifierinfo_change_block_chance = (TextView) findViewById(R.id.abilitymodifierinfo_change_block_chance);
+        abilitymodifierinfo_change_damage_resistance = (TextView) findViewById(R.id.abilitymodifierinfo_change_damage_resistance);
     }
 
-       public void update(AbilityModifierTraits traits) {
+       public void update(AbilityModifierTraits traits, boolean isWeapon) {
+               for(int i = 0; i < getChildCount(); ++i) {
+                       getChildAt(i).setVisibility(View.GONE);
+               }
+               if (traits == null) return;
+               
                final Resources res = getResources();
                
-               if (traits != null && traits.combatProficiency != null) {
-                       abilitymodifierinfo_traits.update(traits);
-                       abilitymodifierinfo_traits.setVisibility(View.VISIBLE);
-               } else {
-                       abilitymodifierinfo_traits.setVisibility(View.GONE);
-               }
+               displayIfNonZero(traits.increaseMaxHP, abilitymodifierinfo_change_maxhp, R.string.iteminfo_effect_increase_max_hp, R.string.iteminfo_effect_decrease_max_hp);
+               displayIfNonZero(traits.increaseMaxAP, abilitymodifierinfo_change_maxap, R.string.iteminfo_effect_increase_max_ap, R.string.iteminfo_effect_decrease_max_ap);
+               displayIfNonZero(traits.increaseMoveCost, abilitymodifierinfo_change_movecost, R.string.iteminfo_effect_increase_movecost, R.string.iteminfo_effect_decrease_movecost);
+               displayIfNonZero(traits.increaseUseItemCost, abilitymodifierinfo_change_use_cost, R.string.iteminfo_effect_increase_use_cost, R.string.iteminfo_effect_decrease_use_cost);
+               displayIfNonZero(traits.increaseReequipCost, abilitymodifierinfo_change_reequip_cost, R.string.iteminfo_effect_increase_reequip_cost, R.string.iteminfo_effect_decrease_reequip_cost);
+               displayIfNonZero(traits.increaseCriticalSkill, abilitymodifierinfo_change_critical_skill, R.string.iteminfo_effect_increase_critical_skill, R.string.iteminfo_effect_decrease_critical_skill);
+               displayIfNonZero(traits.increaseBlockChance, abilitymodifierinfo_change_block_chance, R.string.iteminfo_effect_increase_block_chance, R.string.iteminfo_effect_decrease_block_chance);
+               displayIfNonZero(traits.increaseDamageResistance, abilitymodifierinfo_change_damage_resistance, R.string.iteminfo_effect_increase_damage_resistance, R.string.iteminfo_effect_decrease_damage_resistance);
                
-               if (traits != null && traits.maxAPBoost != 0) {
-                       final int label = traits.maxAPBoost > 0 ? R.string.iteminfo_effect_increase_max_ap : R.string.iteminfo_effect_decrease_max_ap;
-                       abilitymodifierinfo_change_maxap.setText(res.getString(label, Math.abs(traits.maxAPBoost)));
-                       abilitymodifierinfo_change_maxap.setVisibility(View.VISIBLE);
+               if (isWeapon) {
+                       abilitymodifierinfo_change_attack_cost.setText(res.getString(R.string.iteminfo_effect_weapon_attack_cost, traits.increaseAttackCost));
+                       abilitymodifierinfo_change_attack_cost.setVisibility(View.VISIBLE);
+                       displayIfNonZero(traits.increaseAttackChance, abilitymodifierinfo_change_attack_chance, R.string.iteminfo_effect_weapon_attack_chance, R.string.iteminfo_effect_decrease_attack_chance);
+                       
+                       if (traits.setCriticalMultiplier != 0) {
+                               abilitymodifierinfo_change_critical_multiplier.setText(res.getString(R.string.iteminfo_effect_critical_multiplier, Math.abs(traits.setCriticalMultiplier)));
+                               abilitymodifierinfo_change_critical_multiplier.setVisibility(View.VISIBLE);
+                       }
                } else {
-                       abilitymodifierinfo_change_maxap.setVisibility(View.GONE);
+                       displayIfNonZero(traits.increaseAttackCost, abilitymodifierinfo_change_attack_cost, R.string.iteminfo_effect_increase_attack_cost, R.string.iteminfo_effect_decrease_attack_cost);
+                       displayIfNonZero(traits.increaseAttackChance, abilitymodifierinfo_change_attack_chance, R.string.iteminfo_effect_increase_attack_chance, R.string.iteminfo_effect_decrease_attack_chance);
                }
                
-               if (traits != null && traits.maxHPBoost != 0) {
-                       final int label = traits.maxHPBoost > 0 ? R.string.iteminfo_effect_increase_max_hp : R.string.iteminfo_effect_decrease_max_hp;
-                       abilitymodifierinfo_change_maxhp.setText(res.getString(label, Math.abs(traits.maxHPBoost)));
-                       abilitymodifierinfo_change_maxhp.setVisibility(View.VISIBLE);
-               } else {
-                       abilitymodifierinfo_change_maxhp.setVisibility(View.GONE);
+               if (traits.increaseMinDamage != 0 || traits.increaseMaxDamage != 0) {
+                       if (traits.increaseMinDamage == traits.increaseMaxDamage) {
+                               int label = R.string.iteminfo_effect_increase_attack_damage;
+                               if (traits.increaseMinDamage < 0) label = R.string.iteminfo_effect_decrease_attack_damage;
+                               else if (isWeapon) label = R.string.iteminfo_effect_weapon_attack_damage;
+                               abilitymodifierinfo_change_attack_damage.setText(res.getString(label, Math.abs(traits.increaseMinDamage)));
+                       } else {
+                               int label = R.string.iteminfo_effect_increase_attack_damage_minmax;
+                               if (traits.increaseMinDamage < 0) label = R.string.iteminfo_effect_decrease_attack_damage_minmax;
+                               else if (isWeapon) label = R.string.iteminfo_effect_weapon_attack_damage_minmax;
+                               abilitymodifierinfo_change_attack_damage.setText(res.getString(label, Math.abs(traits.increaseMinDamage), Math.abs(traits.increaseMaxDamage)));
+                       }
+                       abilitymodifierinfo_change_attack_damage.setVisibility(View.VISIBLE);
                }
+       }
+
+       private void displayIfNonZero(int statChange, TextView textView, int stringresource_increase, int stringresource_decrease) {
+               if (statChange == 0) return;
                
-               if (traits != null && traits.moveCostPenalty != 0) {
-                       final int label = traits.moveCostPenalty > 0 ? R.string.iteminfo_effect_increase_movecost : R.string.iteminfo_effect_decrease_movecost;
-                       abilitymodifierinfo_change_movecost.setText(res.getString(label, Math.abs(traits.moveCostPenalty)));
-                       abilitymodifierinfo_change_movecost.setVisibility(View.VISIBLE);
-               } else {
-                       abilitymodifierinfo_change_movecost.setVisibility(View.GONE);
-               }
+               final int label = statChange > 0 ? stringresource_increase : stringresource_decrease;
+               textView.setText(getResources().getString(label, Math.abs(statChange)));
+               textView.setVisibility(View.VISIBLE);
        }
 }
index 2e3eba4256538ef5aed9a2936f9133ca19344af4..9467fb4953b633b7910cf0226cf9ce8882d0f532 100644 (file)
@@ -8,6 +8,7 @@ import android.widget.ImageView;
 import android.widget.TextView;
 
 import com.gpl.rpg.AndorsTrail.R;
+import com.gpl.rpg.AndorsTrail.controller.ItemController;
 import com.gpl.rpg.AndorsTrail.model.item.ItemContainer;
 import com.gpl.rpg.AndorsTrail.model.item.ItemContainer.ItemEntry;
 import com.gpl.rpg.AndorsTrail.resource.tiles.TileCollection;
@@ -36,7 +37,7 @@ public final class ItemContainerAdapter extends ArrayAdapter<ItemEntry> {
                }
                
                tileManager.setImageViewTile((ImageView) result.findViewById(R.id.inv_image), item.itemType, tileCollection);
-               ((TextView) result.findViewById(R.id.inv_text)).setText(item.itemType.describeWearEffect(item.quantity));
+               ((TextView) result.findViewById(R.id.inv_text)).setText(ItemController.describeItemForListView(item));
                return result;
        }
        
index f97e981c49e8da0db2691f1147ef9653ae524a1a..28319481c50726fe3948ea1c2f164e2d85341129 100644 (file)
@@ -46,23 +46,26 @@ public final class ItemEffectsView extends LinearLayout {
                        ItemTraits_OnEquip effects_equip, 
                        Collection<ItemTraits_OnUse> effects_use,
                        Collection<ItemTraits_OnUse> effects_hit,
-                       Collection<ItemTraits_OnUse> effects_kill
+                       Collection<ItemTraits_OnUse> effects_kill,
+                       boolean isWeapon
                        ) {
                
+               itemeffect_onequip_title.setVisibility(View.GONE);
+               itemeffect_onequip_abilitymodifierinfo.setVisibility(View.GONE);
+               itemeffect_onequip_conditions.update(null);
                if (effects_equip != null) {
                        itemeffect_onequip_title.setVisibility(View.VISIBLE);
-               } else {
-                       itemeffect_onequip_title.setVisibility(View.GONE);
-               }
-
-               itemeffect_onequip_abilitymodifierinfo.update(effects_equip);
+                       
+                       if (effects_equip.stats != null) {
+                               itemeffect_onequip_abilitymodifierinfo.update(effects_equip.stats, isWeapon);
+                               itemeffect_onequip_abilitymodifierinfo.setVisibility(View.VISIBLE);
+                       }
 
-               if (effects_equip != null && effects_equip.addedConditions != null) {
-                       itemeffect_onequip_conditions.update(Arrays.asList(effects_equip.addedConditions));
-               } else {
-                       itemeffect_onequip_conditions.update(null);
+                       if (effects_equip.addedConditions != null) {
+                               itemeffect_onequip_conditions.update(Arrays.asList(effects_equip.addedConditions));
+                       }
                }
-               
+
                itemeffect_onuse.update(effects_use);
                if (effects_use != null) {
                        itemeffect_onuse_title.setVisibility(View.VISIBLE);
index d1fb9de9bdcf41f859ded3acedd8ffb55e64b5de..f4817d4a89f817aacfe9a89441cd91970f352d62 100644 (file)
@@ -48,7 +48,7 @@ public final class ShopItemContainerAdapter extends ArrayAdapter<ItemEntry> {
                }
                
                tileManager.setImageViewTile((ImageView) result.findViewById(R.id.shopitem_image), itemType, tileCollection);
-               ((TextView) result.findViewById(R.id.shopitem_text)).setText(itemType.describeWearEffect(item.quantity));
+               ((TextView) result.findViewById(R.id.shopitem_text)).setText(ItemController.describeItemForListView(item));
                Button b = (Button) result.findViewById(R.id.shopitem_shopbutton);
                if (isSelling) {
                        b.setText(r.getString(R.string.shop_sellitem, ItemController.getSellingPrice(player, itemType)));
index a076bcc289f7c85c92b405278921d0946b250b84..a69bf7f4d3b52c8becaa057eef47ca4e127aed40 100644 (file)
@@ -2,7 +2,6 @@ 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;
 
@@ -60,7 +59,6 @@ public class TraitsInfoView extends TableLayout {
 
        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);