diff --git a/AndorsTrail/res/values/strings.xml b/AndorsTrail/res/values/strings.xml index 2e580e59e..d5abd7dd3 100644 --- a/AndorsTrail/res/values/strings.xml +++ b/AndorsTrail/res/values/strings.xml @@ -68,6 +68,14 @@ Not enough AP left this round. You fall unconscious, but fortunately wake up alive, dazed and fatigued. You lost %1$d experience. MISS + You taunt %1$s! + You are affected by %1$s. + You are cleared of %1$s. + You are now immunized against %1$s. + %1$s is affected by %2$s. + %1$s is cleared of %2$s. + %1$s is now immunized against %2$s. + Info Equip diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MainActivity.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MainActivity.java index cf6306240..fa2f78671 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MainActivity.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MainActivity.java @@ -29,6 +29,8 @@ import com.gpl.rpg.AndorsTrail.controller.listeners.CombatActionListener; import com.gpl.rpg.AndorsTrail.controller.listeners.CombatTurnListener; import com.gpl.rpg.AndorsTrail.controller.listeners.PlayerMovementListener; import com.gpl.rpg.AndorsTrail.controller.listeners.WorldEventListener; +import com.gpl.rpg.AndorsTrail.model.ability.ActorCondition; +import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionEffect; import com.gpl.rpg.AndorsTrail.model.actor.Monster; import com.gpl.rpg.AndorsTrail.model.actor.Player; import com.gpl.rpg.AndorsTrail.model.item.ItemContainer.ItemEntry; @@ -198,6 +200,8 @@ public final class MainActivity controllers.mapController.worldEventListeners.add(this); controllers.combatController.combatTurnListeners.add(this); controllers.combatController.combatActionListeners.add(this); + controllers.actorStatsController.combatActionListeners.add(this); + controllers.skillController.combatActionListeners.add(this); controllers.movementController.playerMovementListeners.add(this); statusview.subscribe(); quickitemview.subscribe(); @@ -493,5 +497,68 @@ public final class MainActivity public void onPlayerDoesNotHaveEnoughAP() { message(getString(R.string.combat_not_enough_ap)); } + + @Override + public void onPlayerTauntsMonster(Monster attacker) { + message(getString(R.string.combat_taunt_monster, attacker.getName())); + } + + @Override + public void onPlayerReceviesActorCondition(ActorConditionEffect effect) { + StringBuilder sb = new StringBuilder(); + if (effect.isImmunity()) { + sb.append(effect.conditionType.name); + } else if (effect.isRemovalEffect()) { + sb.append(effect.conditionType.name); + } else { + sb.append(effect.conditionType.name); + if (effect.magnitude > 1) { + sb.append(" x"); + sb.append(effect.magnitude); + } + } + if (ActorCondition.isTemporaryEffect(effect.duration)) { + sb.append(' '); + sb.append(getString(R.string.iteminfo_effect_duration, effect.duration)); + } + String msg = sb.toString(); + + if (effect.isImmunity()) { + message(getString(R.string.combat_condition_player_immune, msg)); + } else if (effect.isRemovalEffect()) { + message(getString(R.string.combat_condition_player_clear, msg)); + } else { + message(getString(R.string.combat_condition_player_apply, msg)); + } + } + + @Override + public void onMonsterReceivesActorCondition(ActorConditionEffect effect, Monster target) { + StringBuilder sb = new StringBuilder(); + if (effect.isImmunity()) { + sb.append(effect.conditionType.name); + } else if (effect.isRemovalEffect()) { + sb.append(effect.conditionType.name); + } else { + sb.append(effect.conditionType.name); + if (effect.magnitude > 1) { + sb.append(" x"); + sb.append(effect.magnitude); + } + } + if (ActorCondition.isTemporaryEffect(effect.duration)) { + sb.append(' '); + sb.append(getString(R.string.iteminfo_effect_duration, effect.duration)); + } + String msg = sb.toString(); + + if (effect.isImmunity()) { + message(getString(R.string.combat_condition_monster_immune, target.getName(), msg)); + } else if (effect.isRemovalEffect()) { + message(getString(R.string.combat_condition_monster_clear, target.getName(), msg)); + } else { + message(getString(R.string.combat_condition_monster_apply, target.getName(), msg)); + } + } } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ActorStatsController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ActorStatsController.java index 49db85c4d..4cb075b2d 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ActorStatsController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ActorStatsController.java @@ -7,6 +7,7 @@ import com.gpl.rpg.AndorsTrail.context.ControllerContext; import com.gpl.rpg.AndorsTrail.context.WorldContext; import com.gpl.rpg.AndorsTrail.controller.listeners.ActorConditionListeners; import com.gpl.rpg.AndorsTrail.controller.listeners.ActorStatsListeners; +import com.gpl.rpg.AndorsTrail.controller.listeners.CombatActionListeners; import com.gpl.rpg.AndorsTrail.controller.listeners.PlayerStatsListeners; import com.gpl.rpg.AndorsTrail.model.ability.ActorCondition; import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionEffect; @@ -19,6 +20,7 @@ import com.gpl.rpg.AndorsTrail.model.actor.Monster; import com.gpl.rpg.AndorsTrail.model.actor.Player; import com.gpl.rpg.AndorsTrail.model.item.Inventory; import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnEquip; +import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnHitReceived; import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse; import com.gpl.rpg.AndorsTrail.model.item.ItemType; import com.gpl.rpg.AndorsTrail.model.map.MonsterSpawnArea; @@ -31,6 +33,7 @@ public final class ActorStatsController { public final ActorConditionListeners actorConditionListeners = new ActorConditionListeners(); public final ActorStatsListeners actorStatsListeners = new ActorStatsListeners(); public final PlayerStatsListeners playerStatsListeners = new PlayerStatsListeners(); + public final CombatActionListeners combatActionListeners = new CombatActionListeners(); public ActorStatsController(ControllerContext controllers, WorldContext world) { this.controllers = controllers; @@ -458,12 +461,21 @@ public final class ActorStatsController { controllers.effectController.startEnqueuedEffect(source.position); } } + + public void applyHitReceivedEffect(Actor source, Actor target, ItemTraits_OnHitReceived effect) { + applyUseEffect(source, target, effect); + if (effect.changedStats_target != null) { + applyStatsModifierEffect(target, effect.changedStats, 1); + controllers.effectController.startEnqueuedEffect(target.position); + } + } private void rollForConditionEffect(Actor actor, ActorConditionEffect conditionEffect) { int chanceRollBias = 0; if (actor.isPlayer) chanceRollBias = SkillController.getActorConditionEffectChanceRollBias(conditionEffect, (Player) actor); if (!Constants.rollResult(conditionEffect.chance, chanceRollBias)) return; + //TODO message Actor Condition applyActorCondition(actor, conditionEffect); } @@ -510,6 +522,13 @@ public final class ActorStatsController { applyUseEffect(player, null, type.effects_kill); } } + + public void applyOnDeathEffectsToPlayer(Player player, Actor monster) { + ItemTraits_OnUse onDeathEffect = monster.getOnDeathEffects(); + if (onDeathEffect == null) return; + + applyUseEffect(player, null, onDeathEffect); + } public void applySkillEffectsForNewRound(Player player, PredefinedMap currentMap) { int level = player.getSkillLevel(SkillCollection.SkillID.regeneration); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java index 516ced403..de6e01757 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java @@ -18,6 +18,7 @@ import com.gpl.rpg.AndorsTrail.model.actor.Actor; import com.gpl.rpg.AndorsTrail.model.actor.Monster; import com.gpl.rpg.AndorsTrail.model.actor.MonsterType; import com.gpl.rpg.AndorsTrail.model.actor.Player; +import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnHitReceived; import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse; import com.gpl.rpg.AndorsTrail.model.item.Loot; import com.gpl.rpg.AndorsTrail.model.map.MonsterSpawnArea; @@ -208,6 +209,7 @@ public final class CombatController implements VisualEffectCompletedCallback { totalExpThisFight += loot.exp; loot.exp = 0; controllers.actorStatsController.applyKillEffectsToPlayer(player); + controllers.actorStatsController.applyOnDeathEffectsToPlayer(player, killedMonster); if (!loot.hasItemsOrGold()) { world.model.currentMap.removeGroundLoot(loot); @@ -554,10 +556,16 @@ public final class CombatController implements VisualEffectCompletedCallback { private void applyAttackHitStatusEffects(Actor attacker, Actor target) { ItemTraits_OnUse[] onHitEffects = attacker.getOnHitEffects(); - if (onHitEffects == null) return; - - for (ItemTraits_OnUse e : onHitEffects) { - controllers.actorStatsController.applyUseEffect(attacker, target, e); + ItemTraits_OnHitReceived[] onHitReceivedEffects = target.getOnHitReceivedEffects(); + if (onHitEffects != null) { + for (ItemTraits_OnUse e : onHitEffects) { + controllers.actorStatsController.applyUseEffect(attacker, target, e); + } + } + if (onHitReceivedEffects != null) { + for (ItemTraits_OnHitReceived e : onHitReceivedEffects) { + controllers.actorStatsController.applyHitReceivedEffect(target, attacker, e); + } } } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/SkillController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/SkillController.java index b7845b2ef..a4125c231 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/SkillController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/SkillController.java @@ -2,6 +2,7 @@ package com.gpl.rpg.AndorsTrail.controller; import com.gpl.rpg.AndorsTrail.context.ControllerContext; import com.gpl.rpg.AndorsTrail.context.WorldContext; +import com.gpl.rpg.AndorsTrail.controller.listeners.CombatActionListeners; import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionEffect; import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionType; import com.gpl.rpg.AndorsTrail.model.ability.SkillCollection; @@ -20,6 +21,8 @@ import com.gpl.rpg.AndorsTrail.util.ConstRange; public final class SkillController { private final ControllerContext controllers; private final WorldContext world; + public final CombatActionListeners combatActionListeners = new CombatActionListeners(); + public SkillController(ControllerContext controllers, WorldContext world) { this.controllers = controllers; @@ -184,6 +187,7 @@ public final class SkillController { public void applySkillEffectsFromMonsterAttack(AttackResult result, Monster monster) { if (!result.isHit) { if (rollForSkillChance(world.model.player, SkillID.taunt, SkillCollection.PER_SKILLPOINT_INCREASE_TAUNT_CHANCE)) { + controllers.actorStatsController.changeActorAP(monster, -SkillCollection.TAUNT_AP_LOSS, false, false); } } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/listeners/CombatActionListener.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/listeners/CombatActionListener.java index a65ba89d5..3b8e4ac19 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/listeners/CombatActionListener.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/listeners/CombatActionListener.java @@ -1,6 +1,7 @@ package com.gpl.rpg.AndorsTrail.controller.listeners; import com.gpl.rpg.AndorsTrail.controller.AttackResult; +import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionEffect; import com.gpl.rpg.AndorsTrail.model.actor.Monster; public interface CombatActionListener { @@ -13,4 +14,8 @@ public interface CombatActionListener { void onPlayerStartedFleeing(); void onPlayerFailedFleeing(); void onPlayerDoesNotHaveEnoughAP(); + void onPlayerTauntsMonster(Monster attacker); + void onPlayerReceviesActorCondition(ActorConditionEffect conditionEffect); + void onMonsterReceivesActorCondition(ActorConditionEffect conditionEffect, Monster target); + } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/listeners/CombatActionListeners.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/listeners/CombatActionListeners.java index 0183b1d83..1a931bc27 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/listeners/CombatActionListeners.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/listeners/CombatActionListeners.java @@ -1,6 +1,7 @@ package com.gpl.rpg.AndorsTrail.controller.listeners; import com.gpl.rpg.AndorsTrail.controller.AttackResult; +import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionEffect; import com.gpl.rpg.AndorsTrail.model.actor.Monster; import com.gpl.rpg.AndorsTrail.util.ListOfListeners; @@ -41,6 +42,18 @@ public final class CombatActionListeners extends ListOfListeners onPlayerDoesNotHaveEnoughAP = new Function() { @Override public void call(CombatActionListener listener) { listener.onPlayerDoesNotHaveEnoughAP(); } }; + + private final Function1 onPlayerTauntsMonster = new Function1() { + @Override public void call(CombatActionListener listener, Monster attacker) { listener.onPlayerTauntsMonster(attacker); } + }; + + private final Function1 onPlayerReceviesActorCondition = new Function1() { + @Override public void call(CombatActionListener listener, ActorConditionEffect effect) { listener.onPlayerReceviesActorCondition(effect); } + }; + + private final Function2 onMonsterReceivesActorCondition = new Function2() { + @Override public void call(CombatActionListener listener, ActorConditionEffect effect, Monster target) { listener.onMonsterReceivesActorCondition(effect, target); } + }; @Override public void onPlayerAttackMissed(Monster target, AttackResult attackResult) { @@ -86,4 +99,20 @@ public final class CombatActionListeners extends ListOfListeners getOnHitEffectsAsList() { return onHitEffects == null ? null : Arrays.asList(onHitEffects); } - + public ItemTraits_OnHitReceived[] getOnHitReceivedEffects() { return onHitReceivedEffects; } + public List getOnHitReceivedEffectsAsList() { return onHitReceivedEffects == null ? null : Arrays.asList(onHitReceivedEffects); } + public ItemTraits_OnUse getOnDeathEffects() { return onDeathEffects; } + public boolean hasCriticalSkillEffect() { return getCriticalSkill() != 0; } public boolean hasCriticalMultiplierEffect() { float m = getCriticalMultiplier(); return m != 0 && m != 1; } public boolean hasCriticalAttacks() { return hasCriticalSkillEffect() && hasCriticalMultiplierEffect(); } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Monster.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Monster.java index 466a713cb..39d549671 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Monster.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Monster.java @@ -50,6 +50,8 @@ public final class Monster extends Actor { this.blockChance = monsterType.blockChance; this.damageResistance = monsterType.damageResistance; this.onHitEffects = monsterType.onHitEffects; + this.onHitReceivedEffects = monsterType.onHitReceivedEffects; + this.onDeathEffects = monsterType.onDeathEffects; } public DropList getDropList() { return monsterType.dropList; } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/MonsterType.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/MonsterType.java index 46b097d7f..bfad037df 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/MonsterType.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/MonsterType.java @@ -1,6 +1,7 @@ package com.gpl.rpg.AndorsTrail.model.actor; import com.gpl.rpg.AndorsTrail.model.item.DropList; +import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnHitReceived; import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse; import com.gpl.rpg.AndorsTrail.util.ConstRange; import com.gpl.rpg.AndorsTrail.util.Size; @@ -47,6 +48,8 @@ public final class MonsterType { public final int blockChance; public final int damageResistance; public final ItemTraits_OnUse[] onHitEffects; + public final ItemTraits_OnHitReceived[] onHitReceivedEffects; + public final ItemTraits_OnUse onDeathEffects; public MonsterType( String id @@ -72,6 +75,8 @@ public final class MonsterType { , int blockChance , int damageResistance , ItemTraits_OnUse[] onHitEffects + , ItemTraits_OnHitReceived[] onHitReceivedEffects + , ItemTraits_OnUse onDeathEffects ) { this.id = id; this.name = name; @@ -96,6 +101,8 @@ public final class MonsterType { this.blockChance = blockChance; this.damageResistance = damageResistance; this.onHitEffects = onHitEffects; + this.onHitReceivedEffects = onHitReceivedEffects; + this.onDeathEffects = onDeathEffects; } public static enum AggressionType { diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemTraits_OnHitReceived.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemTraits_OnHitReceived.java new file mode 100644 index 000000000..12372ed53 --- /dev/null +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemTraits_OnHitReceived.java @@ -0,0 +1,26 @@ +package com.gpl.rpg.AndorsTrail.model.item; + +import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionEffect; +import com.gpl.rpg.AndorsTrail.model.ability.traits.StatsModifierTraits; + +public class ItemTraits_OnHitReceived extends ItemTraits_OnUse { + + public final StatsModifierTraits changedStats_target; + + public ItemTraits_OnHitReceived( + StatsModifierTraits changedStats + , StatsModifierTraits changedStats_target + , ActorConditionEffect[] addedConditions_source + , ActorConditionEffect[] addedConditions_target + ) { + super(changedStats_target, addedConditions_source, addedConditions_target); + this.changedStats_target = changedStats_target; + } + + public int calculateHitReceivedCost() { + int costStats = changedStats == null ? 0 : changedStats.calculateHitCost(); + costStats += changedStats_target == null ? 0 : -changedStats_target.calculateHitCost(); + return costStats; + } + +} diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemTraits_OnUse.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemTraits_OnUse.java index 6760cb224..0b0af9699 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemTraits_OnUse.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemTraits_OnUse.java @@ -3,7 +3,7 @@ package com.gpl.rpg.AndorsTrail.model.item; import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionEffect; import com.gpl.rpg.AndorsTrail.model.ability.traits.StatsModifierTraits; -public final class ItemTraits_OnUse { +public class ItemTraits_OnUse { public final StatsModifierTraits changedStats; public final ActorConditionEffect[] addedConditions_source; public final ActorConditionEffect[] addedConditions_target; diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemType.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemType.java index cd6a82de4..9d69d1ccd 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemType.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemType.java @@ -34,6 +34,7 @@ public final class ItemType { public final ItemTraits_OnUse effects_use; public final ItemTraits_OnUse effects_hit; public final ItemTraits_OnUse effects_kill; + public final ItemTraits_OnHitReceived effects_hitReceived; public ItemType( String id @@ -48,6 +49,7 @@ public final class ItemType { , ItemTraits_OnUse effects_use , ItemTraits_OnUse effects_hit , ItemTraits_OnUse effects_kill + , ItemTraits_OnHitReceived effects_hitReceived ) { this.id = id; this.iconID = iconID; @@ -62,6 +64,7 @@ public final class ItemType { this.effects_use = effects_use; this.effects_hit = effects_hit; this.effects_kill = effects_kill; + this.effects_hitReceived = effects_hitReceived; this.hasPersonalizedName = name.contains(Constants.PLACEHOLDER_PLAYERNAME); } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/ItemTraitsParser.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/ItemTraitsParser.java index 31cc2a5aa..0cc627f3b 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/ItemTraitsParser.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/ItemTraitsParser.java @@ -7,11 +7,13 @@ import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionTypeCollection; import com.gpl.rpg.AndorsTrail.model.ability.traits.AbilityModifierTraits; import com.gpl.rpg.AndorsTrail.model.ability.traits.StatsModifierTraits; import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnEquip; +import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnHitReceived; import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse; import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonArrayParserFor; import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonFieldNames; import com.gpl.rpg.AndorsTrail.util.ConstRange; import com.gpl.rpg.AndorsTrail.util.L; + import org.json.JSONException; import org.json.JSONObject; @@ -73,6 +75,44 @@ public final class ItemTraitsParser { } } + public ItemTraits_OnHitReceived parseItemTraits_OnHitReceived(JSONObject o) throws JSONException { + if (o == null) return null; + + ConstRange boostCurrentHP = ResourceParserUtils.parseConstRange(o.optJSONObject(JsonFieldNames.ItemTraits_OnHitReceived.increaseCurrentHP)); + ConstRange boostCurrentAP = ResourceParserUtils.parseConstRange(o.optJSONObject(JsonFieldNames.ItemTraits_OnHitReceived.increaseCurrentAP)); + ConstRange boostAttackerCurrentHP = ResourceParserUtils.parseConstRange(o.optJSONObject(JsonFieldNames.ItemTraits_OnHitReceived.increaseAttackerCurrentHP)); + ConstRange boostAttackerCurrentAP = ResourceParserUtils.parseConstRange(o.optJSONObject(JsonFieldNames.ItemTraits_OnHitReceived.increaseAttackerCurrentAP)); + ActorConditionEffect[] addedConditions_source = actorConditionEffectParser_withDuration.parseArray(o.optJSONArray(JsonFieldNames.ItemTraits_OnHitReceived.conditionsSource)); + ActorConditionEffect[] addedConditions_target = actorConditionEffectParser_withDuration.parseArray(o.optJSONArray(JsonFieldNames.ItemTraits_OnHitReceived.conditionsTarget)); + if ( boostCurrentHP == null + && boostCurrentAP == null + && boostAttackerCurrentAP == null + && boostCurrentAP == null + && addedConditions_source == null + && addedConditions_target == null + ) { + if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) { + L.log("OPTIMIZE: Tried to parseItemTraits_OnHitReceived , where hasEffect=" + o.toString() + ", but all data was empty."); + } + return null; + } else { + return new ItemTraits_OnHitReceived( + new StatsModifierTraits( + null + ,boostCurrentHP + ,boostCurrentAP + ) + , new StatsModifierTraits( + null + ,boostAttackerCurrentHP + ,boostAttackerCurrentAP + ) + ,addedConditions_source + ,addedConditions_target + ); + } + } + public ItemTraits_OnEquip parseItemTraits_OnEquip(JSONObject o) throws JSONException { if (o == null) return null; diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/ItemTypeParser.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/ItemTypeParser.java index 5aa26cbc8..e3777ac19 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/ItemTypeParser.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/ItemTypeParser.java @@ -3,6 +3,7 @@ package com.gpl.rpg.AndorsTrail.resource.parsers; import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionTypeCollection; import com.gpl.rpg.AndorsTrail.model.item.ItemCategoryCollection; import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnEquip; +import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnHitReceived; import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse; import com.gpl.rpg.AndorsTrail.model.item.ItemType; import com.gpl.rpg.AndorsTrail.resource.DynamicTileLoader; @@ -10,6 +11,7 @@ import com.gpl.rpg.AndorsTrail.resource.TranslationLoader; import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonCollectionParserFor; import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonFieldNames; import com.gpl.rpg.AndorsTrail.util.Pair; + import org.json.JSONException; import org.json.JSONObject; @@ -40,7 +42,8 @@ public final class ItemTypeParser extends JsonCollectionParserFor { final ItemTraits_OnUse useEffect = itemTraitsParser.parseItemTraits_OnUse(o.optJSONObject(JsonFieldNames.ItemType.useEffect)); final ItemTraits_OnUse hitEffect = itemTraitsParser.parseItemTraits_OnUse(o.optJSONObject(JsonFieldNames.ItemType.hitEffect)); final ItemTraits_OnUse killEffect = itemTraitsParser.parseItemTraits_OnUse(o.optJSONObject(JsonFieldNames.ItemType.killEffect)); - + final ItemTraits_OnHitReceived hitReceivedEffect = itemTraitsParser.parseItemTraits_OnHitReceived(o.optJSONObject(JsonFieldNames.ItemType.hitReceivedEffect)); + final int baseMarketCost = o.optInt(JsonFieldNames.ItemType.baseMarketCost); final boolean hasManualPrice = o.optInt(JsonFieldNames.ItemType.hasManualPrice, 0) > 0; final ItemType itemType = new ItemType( @@ -56,6 +59,7 @@ public final class ItemTypeParser extends JsonCollectionParserFor { , useEffect , hitEffect , killEffect + , hitReceivedEffect ); return new Pair(id, itemType); } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/MonsterTypeParser.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/MonsterTypeParser.java index 70fa59a04..4f6f47b64 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/MonsterTypeParser.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/MonsterTypeParser.java @@ -7,6 +7,7 @@ import com.gpl.rpg.AndorsTrail.controller.Constants; import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionTypeCollection; import com.gpl.rpg.AndorsTrail.model.actor.MonsterType; import com.gpl.rpg.AndorsTrail.model.item.DropListCollection; +import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnHitReceived; import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse; import com.gpl.rpg.AndorsTrail.resource.DynamicTileLoader; import com.gpl.rpg.AndorsTrail.resource.TranslationLoader; @@ -49,6 +50,8 @@ public final class MonsterTypeParser extends JsonCollectionParserFor