diff --git a/AndorsTrail/res/layout/abilitymodifierview.xml b/AndorsTrail/res/layout/abilitymodifierview.xml index 0c1b665f6..69c65c5a5 100644 --- a/AndorsTrail/res/layout/abilitymodifierview.xml +++ b/AndorsTrail/res/layout/abilitymodifierview.xml @@ -23,6 +23,12 @@ android:layout_width="match_parent" android:layout_height="wrap_content" /> + Attack damage: %1$d Attack damage: %1$d-%2$d Increases attack damage by %1$d + Damage modifier: %1$d %% Increases attack damage by %1$d-%2$d Lowers attack damage by %1$d Lowers attack damage by %1$d-%2$d diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ActorStatsController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ActorStatsController.java index 0f128c0aa..b6a488c02 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ActorStatsController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ActorStatsController.java @@ -272,27 +272,39 @@ public final class ActorStatsController { actor.damagePotential.addToMax(effects.increaseMaxDamage * multiplier); actor.blockChance += effects.increaseBlockChance * multiplier; actor.damageResistance += effects.increaseDamageResistance * multiplier; - - if (actor.attackChance < 0) actor.attackChance = 0; - if (actor.damagePotential.max < 0) actor.damagePotential.set(0, 0); } public void recalculatePlayerStats(Player player) { + player.weaponDamage.set(0,0); player.resetStatsToBaseTraits(); player.recalculateLevelExperience(); controllers.itemController.applyInventoryEffects(player); controllers.skillController.applySkillEffects(player); applyEffectsFromCurrentConditions(player); ItemController.recalculateHitEffectsFromWornItems(player); + ItemController.applyDamageModifier(player); capActorHealthAtMax(player); capActorAPAtMax(player); + lowCapActorAttackChance(player); + lowCapActorDamagePotential(player); } public void recalculateMonsterCombatTraits(Monster monster) { monster.resetStatsToBaseTraits(); applyEffectsFromCurrentConditions(monster); capActorHealthAtMax(monster); capActorAPAtMax(monster); + lowCapActorAttackChance(monster); + lowCapActorDamagePotential(monster); } + + private void lowCapActorAttackChance(Actor actor) { + if (actor.attackChance < 0) actor.attackChance = 0; + } + + private void lowCapActorDamagePotential(Actor actor) { + if (actor.damagePotential.max < 0) actor.damagePotential.set(0, 0); + } + private void recalculateActorCombatTraits(Actor actor) { if (actor.isPlayer) recalculatePlayerStats((Player) actor); else recalculateMonsterCombatTraits((Monster) actor); @@ -545,6 +557,11 @@ public final class ActorStatsController { } } + public void addPlayerWeaponDamage(Player player, int increaseMinDamage, int increaseMaxDamage) { + player.weaponDamage.add(increaseMinDamage, true); + player.weaponDamage.addToMax(increaseMaxDamage); + } + public static enum LevelUpSelection { health ,attackChance diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ItemController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ItemController.java index 77090476c..917661f5c 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ItemController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ItemController.java @@ -19,6 +19,8 @@ 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 static java.lang.Math.min; + public final class ItemController { private final ControllerContext controllers; @@ -175,8 +177,12 @@ public final class ItemController { // The stats for off-hand weapons will be added later in SkillController.applySkillEffectsFromFightingStyles if (SkillController.isDualWielding(mainHandItem, type)) return; } - if (type.effects_equip != null && type.effects_equip.stats != null) - controllers.actorStatsController.applyAbilityEffects(player, type.effects_equip.stats, 1); + if (type.effects_equip != null && type.effects_equip.stats != null) { + controllers.actorStatsController.applyAbilityEffects(player, type.effects_equip.stats, 1); + if (type.isWeapon()) { + controllers.actorStatsController.addPlayerWeaponDamage(player, type.effects_equip.stats.increaseMinDamage, type.effects_equip.stats.increaseMaxDamage); + } + } } public static void recalculateHitEffectsFromWornItems(Player player) { @@ -383,4 +389,24 @@ public final class ItemController { } } + public static void applyDamageModifier(Player player) { + ItemType itemType = player.inventory.getItemTypeInWearSlot(Inventory.WearSlot.weapon); + int modifier1 = -1; + int modifier2 = -1; + if (itemType != null) modifier1 = itemType.effects_equip.stats.setNonWeaponDamageModifier; + itemType = player.inventory.getItemTypeInWearSlot(Inventory.WearSlot.shield); + if (itemType != null && itemType.isWeapon()) modifier2 = itemType.effects_equip.stats.setNonWeaponDamageModifier; + + int modifier = 100; + if (modifier1 >= 0 && modifier2 >= 0) modifier = Math.min(modifier1, modifier2); + else if (modifier1 <= 0 && modifier2 >= 0) modifier = modifier2; + else if (modifier2 <= 0 && modifier1 >= 0) modifier = modifier1; + + if (modifier != 100) { + final int minBaseDamage = player.damagePotential.current - player.weaponDamage.current; + final int maxBaseDamage = player.damagePotential.max - player.weaponDamage.max; + player.damagePotential.add(Math.round(minBaseDamage * ((modifier - 100)/100f)), true); + player.damagePotential.addToMax(Math.round(maxBaseDamage * ((modifier - 100)/100f))); + } + } } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/SkillController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/SkillController.java index cd749e999..49348a4fb 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/SkillController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/SkillController.java @@ -386,6 +386,11 @@ public final class SkillController { if (itemType.effects_equip == null) return; player.damagePotential.addToMax(getPercentage(itemType.effects_equip.stats.increaseMaxDamage, percentForPositiveValues, percentForNegativeValues)); player.damagePotential.add(getPercentage(itemType.effects_equip.stats.increaseMinDamage, percentForPositiveValues, percentForNegativeValues), false); + + if (itemType.isWeapon()) { + player.weaponDamage.addToMax(getPercentage(itemType.effects_equip.stats.increaseMaxDamage, percentForPositiveValues, percentForNegativeValues)); + player.weaponDamage.add(getPercentage(itemType.effects_equip.stats.increaseMinDamage, percentForPositiveValues, percentForNegativeValues), false); + } } private static void addPercentCriticalSkill(Player player, ItemType itemType, int percentForPositiveValues, int percentForNegativeValues) { diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/ability/traits/AbilityModifierTraits.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/ability/traits/AbilityModifierTraits.java index 845adfafa..7d7fdedd6 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/ability/traits/AbilityModifierTraits.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/ability/traits/AbilityModifierTraits.java @@ -12,6 +12,7 @@ public final class AbilityModifierTraits { public final int increaseBlockChance; public final int increaseMinDamage; public final int increaseMaxDamage; + public final int setNonWeaponDamageModifier; public final int increaseCriticalSkill; public final float setCriticalMultiplier; public final int increaseDamageResistance; @@ -27,6 +28,7 @@ public final class AbilityModifierTraits { , int increaseBlockChance , int increaseMinDamage , int increaseMaxDamage + , int setNonWeaponDamageModifier , int increaseCriticalSkill , float setCriticalMultiplier , int increaseDamageResistance @@ -41,6 +43,7 @@ public final class AbilityModifierTraits { this.increaseBlockChance = increaseBlockChance; this.increaseMinDamage = increaseMinDamage; this.increaseMaxDamage = increaseMaxDamage; + this.setNonWeaponDamageModifier = setNonWeaponDamageModifier; this.increaseCriticalSkill = increaseCriticalSkill; this.setCriticalMultiplier = setCriticalMultiplier; this.increaseDamageResistance = increaseDamageResistance; diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Player.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Player.java index c7224ce39..b798322d6 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Player.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Player.java @@ -40,6 +40,7 @@ public final class Player extends Actor { public int useItemCost; public int reequipCost; public int totalExperience; + public final Range weaponDamage = new Range(); private final HashMap > questProgress = new HashMap >(); private String spawnMap; @@ -117,6 +118,7 @@ public final class Player extends Actor { this.ap.set(baseTraits.maxAP, baseTraits.maxAP); this.health.set(baseTraits.maxHP, baseTraits.maxHP); this.conditions.clear(); + this.weaponDamage.set(0, 0); Loot startItems = new Loot(); dropLists.getDropList(DropListCollection.DROPLIST_STARTITEMS).createRandomLoot(startItems, this); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/ResourceParserUtils.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/ResourceParserUtils.java index 8456c7578..3619b43ff 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/ResourceParserUtils.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/ResourceParserUtils.java @@ -125,6 +125,7 @@ public final class ResourceParserUtils { ,o.optInt(JsonFieldNames.AbilityModifierTraits.increaseBlockChance, 0) ,increaseAttackDamage != null ? increaseAttackDamage.current : 0 ,increaseAttackDamage != null ? increaseAttackDamage.max : 0 + , o.optInt(JsonFieldNames.AbilityModifierTraits.setNonWeaponDamageModifier, 100) ,o.optInt(JsonFieldNames.AbilityModifierTraits.increaseCriticalSkill, 0) ,(float)o.optDouble(JsonFieldNames.AbilityModifierTraits.setCriticalMultiplier, 0) ,o.optInt(JsonFieldNames.AbilityModifierTraits.increaseDamageResistance, 0) diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/json/JsonFieldNames.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/json/JsonFieldNames.java index 97e983a7e..7f784b84a 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/json/JsonFieldNames.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/json/JsonFieldNames.java @@ -30,6 +30,7 @@ public final class JsonFieldNames { public static final String increaseCriticalSkill = "increaseCriticalSkill"; public static final String setCriticalMultiplier = "setCriticalMultiplier"; public static final String increaseAttackDamage = "increaseAttackDamage"; + public static final String setNonWeaponDamageModifier = "setNonWeaponDamageModifier"; public static final String increaseBlockChance = "increaseBlockChance"; public static final String increaseDamageResistance = "increaseDamageResistance"; } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/AbilityModifierInfoView.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/AbilityModifierInfoView.java index 6d1daf839..4bb7cc351 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/AbilityModifierInfoView.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/AbilityModifierInfoView.java @@ -19,6 +19,7 @@ public final class AbilityModifierInfoView extends LinearLayout { 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_set_damage_modifier; private final TextView abilitymodifierinfo_change_critical_skill; private final TextView abilitymodifierinfo_change_critical_multiplier; private final TextView abilitymodifierinfo_change_block_chance; @@ -38,6 +39,7 @@ public final class AbilityModifierInfoView extends LinearLayout { 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_set_damage_modifier = (TextView) findViewById(R.id.abilitymodifierinfo_set_damage_modifier); 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); @@ -89,6 +91,11 @@ public final class AbilityModifierInfoView extends LinearLayout { } abilitymodifierinfo_change_attack_damage.setVisibility(View.VISIBLE); } + + if (traits.setNonWeaponDamageModifier > 0 && traits.setNonWeaponDamageModifier != 100) { + abilitymodifierinfo_set_damage_modifier.setText(res.getString(R.string.iteminfo_effect_set_damage_modifier, traits.setNonWeaponDamageModifier)); + abilitymodifierinfo_set_damage_modifier.setVisibility(View.VISIBLE); + } } private void displayIfNonZero(int statChange, TextView textView, int stringresource_increase, int stringresource_decrease) {