Revenge effects & Enhanced combat log.

Apply effect when you or a NPC received a hit (effect defined on
defender).
Apply effect when a NPC dies (effect defined on NPC).
Messages in the combat log for taunt skill and actor conditions effects.
This commit is contained in:
Zukero
2017-08-28 16:55:53 +02:00
parent 93bdb8e18f
commit da76ea4542
17 changed files with 252 additions and 7 deletions

View File

@@ -68,6 +68,14 @@
<string name="combat_not_enough_ap">Not enough AP left this round.</string>
<string name="combat_hero_dies">You fall unconscious, but fortunately wake up alive, dazed and fatigued. You lost %1$d experience.</string>
<string name="combat_miss_animation_message">MISS</string>
<string name="combat_taunt_monster">You taunt %1$s!</string>
<string name="combat_condition_player_apply">You are affected by %1$s.</string>
<string name="combat_condition_player_clear">You are cleared of %1$s.</string>
<string name="combat_condition_player_immune">You are now immunized against %1$s.</string>
<string name="combat_condition_monster_apply">%1$s is affected by %2$s.</string>
<string name="combat_condition_monster_clear">%1$s is cleared of %2$s.</string>
<string name="combat_condition_monster_immune">%1$s is now immunized against %2$s.</string>
<string name="inventory_info">Info</string>
<string name="inventory_equip">Equip</string>

View File

@@ -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));
}
}
}

View File

@@ -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);

View File

@@ -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);
}
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}

View File

@@ -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<CombatActionLis
private final Function<CombatActionListener> onPlayerDoesNotHaveEnoughAP = new Function<CombatActionListener>() {
@Override public void call(CombatActionListener listener) { listener.onPlayerDoesNotHaveEnoughAP(); }
};
private final Function1<CombatActionListener, Monster> onPlayerTauntsMonster = new Function1<CombatActionListener, Monster>() {
@Override public void call(CombatActionListener listener, Monster attacker) { listener.onPlayerTauntsMonster(attacker); }
};
private final Function1<CombatActionListener, ActorConditionEffect> onPlayerReceviesActorCondition = new Function1<CombatActionListener, ActorConditionEffect>() {
@Override public void call(CombatActionListener listener, ActorConditionEffect effect) { listener.onPlayerReceviesActorCondition(effect); }
};
private final Function2<CombatActionListener, ActorConditionEffect, Monster> onMonsterReceivesActorCondition = new Function2<CombatActionListener, ActorConditionEffect, Monster>() {
@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<CombatActionLis
public void onPlayerDoesNotHaveEnoughAP() {
callAllListeners(this.onPlayerDoesNotHaveEnoughAP);
}
@Override
public void onPlayerTauntsMonster(Monster attacker) {
callAllListeners(this.onPlayerTauntsMonster, attacker);
}
@Override
public void onPlayerReceviesActorCondition(ActorConditionEffect effect) {
callAllListeners(this.onPlayerReceviesActorCondition, effect);
}
@Override
public void onMonsterReceivesActorCondition(ActorConditionEffect effect, Monster target) {
callAllListeners(this.onMonsterReceivesActorCondition, effect, target);
}
}

View File

@@ -5,6 +5,7 @@ import java.util.Arrays;
import java.util.List;
import com.gpl.rpg.AndorsTrail.model.ability.ActorCondition;
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnHitReceived;
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse;
import com.gpl.rpg.AndorsTrail.util.Coord;
import com.gpl.rpg.AndorsTrail.util.CoordRect;
@@ -34,6 +35,8 @@ public class Actor {
public int blockChance;
public int damageResistance;
public ItemTraits_OnUse[] onHitEffects;
public ItemTraits_OnHitReceived[] onHitReceivedEffects;
public ItemTraits_OnUse onDeathEffects;
public boolean hasVFXRunning = false;
public long vfxStartTime = 0;
public int vfxDuration = 0;
@@ -66,7 +69,10 @@ public class Actor {
public int getDamageResistance() { return damageResistance; }
public ItemTraits_OnUse[] getOnHitEffects() { return onHitEffects; }
public List<ItemTraits_OnUse> getOnHitEffectsAsList() { return onHitEffects == null ? null : Arrays.asList(onHitEffects); }
public ItemTraits_OnHitReceived[] getOnHitReceivedEffects() { return onHitReceivedEffects; }
public List<ItemTraits_OnHitReceived> 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(); }

View File

@@ -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; }

View File

@@ -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 {

View File

@@ -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;
}
}

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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<ItemType> {
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<ItemType> {
, useEffect
, hitEffect
, killEffect
, hitReceivedEffect
);
return new Pair<String, ItemType>(id, itemType);
}

View File

@@ -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<MonsterType
int blockChance = o.optInt(JsonFieldNames.Monster.blockChance, 0);
int damageResistance = o.optInt(JsonFieldNames.Monster.damageResistance, 0);
final ItemTraits_OnUse hitEffect = itemTraitsParser.parseItemTraits_OnUse(o.optJSONObject(JsonFieldNames.Monster.hitEffect));
final ItemTraits_OnHitReceived hitReceivedEffect = itemTraitsParser.parseItemTraits_OnHitReceived(o.optJSONObject(JsonFieldNames.Monster.hitReceivedEffect));
final ItemTraits_OnUse deathEffect = itemTraitsParser.parseItemTraits_OnUse(o.optJSONObject(JsonFieldNames.Monster.deathEffect));
final int exp = getExpectedMonsterExperience(attackCost, attackChance, damagePotential, criticalSkill, criticalMultiplier, blockChance, damageResistance, hitEffect, maxHP, maxAP);
@@ -76,6 +79,8 @@ public final class MonsterTypeParser extends JsonCollectionParserFor<MonsterType
, blockChance
, damageResistance
, hitEffect == null ? null : new ItemTraits_OnUse[] { hitEffect }
, hitReceivedEffect == null ? null : new ItemTraits_OnHitReceived[] { hitReceivedEffect }
, deathEffect
));
}

View File

@@ -122,6 +122,8 @@ public final class JsonFieldNames {
public static final String droplistID = "droplistID";
public static final String phraseID = "phraseID";
public static final String hitEffect = "hitEffect";
public static final String hitReceivedEffect = "hitReceivedEffect";
public static final String deathEffect = "deathEffect";
}
public static final class ItemTraits_OnUse {
@@ -130,6 +132,15 @@ public final class JsonFieldNames {
public static final String conditionsSource = "conditionsSource";
public static final String conditionsTarget = "conditionsTarget";
}
public static final class ItemTraits_OnHitReceived {
public static final String increaseCurrentHP = "increaseCurrentHP";
public static final String increaseCurrentAP = "increaseCurrentAP";
public static final String increaseAttackerCurrentHP = "increaseAttackerCurrentHP";
public static final String increaseAttackerCurrentAP = "increaseAttackerCurrentAP";
public static final String conditionsSource = "conditionsSource";
public static final String conditionsTarget = "conditionsTarget";
}
public static final class ActorConditionEffect {
public static final String condition = "condition";
@@ -155,6 +166,7 @@ public final class JsonFieldNames {
public static final String useEffect = "useEffect";
public static final String hitEffect = "hitEffect";
public static final String killEffect = "killEffect";
public static final String hitReceivedEffect = "hitReceivedEffect";
}