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>
<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>
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);
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;
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() {
}
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);
}
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);
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
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;
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 {
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);
// 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) {
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]);
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 ===================================================================
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;
}
}
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;
+ }
}
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
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
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
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;
@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]
, ResourceParserUtils.parseBoolean(parts[5], false)
, ResourceParserUtils.parseStatsModifierTraits(parts, 6)
, ResourceParserUtils.parseStatsModifierTraits(parts, 12)
- , ResourceParserUtils.parseAbilityModifierTraits(parts, 18)
+ , stats
));
}
}
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;
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));
}
}
}
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)
+ );
}
}
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);
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);
}
}
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;
}
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;
}
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);
}
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)));
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;
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);