Updated parsers for reading resources as JSON.

This commit is contained in:
Oskar Wiksten
2013-01-20 23:35:37 +01:00
parent 81665520c0
commit 89759f77f4
6 changed files with 213 additions and 281 deletions

View File

@@ -1,7 +1,5 @@
package com.gpl.rpg.AndorsTrail.resource.parsers;
import java.util.ArrayList;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.model.ability.ActorCondition;
import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionEffect;
@@ -10,61 +8,60 @@ 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_OnUse;
import com.gpl.rpg.AndorsTrail.resource.ResourceFileTokenizer;
import com.gpl.rpg.AndorsTrail.resource.ResourceFileTokenizer.ResourceObjectParser;
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonFieldNames;
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonParserFor;
import com.gpl.rpg.AndorsTrail.util.ConstRange;
import com.gpl.rpg.AndorsTrail.util.L;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
public final class ItemTraitsParser {
private final ResourceObjectParser<ActorConditionEffect> actorConditionEffectParser_withDuration;
private final ResourceObjectParser<ActorConditionEffect> actorConditionEffectParser_withoutDuration;
private final ResourceFileTokenizer tokenize4Fields = new ResourceFileTokenizer(4);
private final ResourceFileTokenizer tokenize2Fields = new ResourceFileTokenizer(2);
private final JsonParserFor<ActorConditionEffect> actorConditionEffectParser_withDuration;
private final JsonParserFor<ActorConditionEffect> actorConditionEffectParser_withoutDuration;
public ItemTraitsParser(final ActorConditionTypeCollection actorConditionTypes) {
this.actorConditionEffectParser_withDuration = new ResourceObjectParser<ActorConditionEffect>() {
this.actorConditionEffectParser_withDuration = new JsonParserFor<ActorConditionEffect>() {
@Override
public ActorConditionEffect parseRow(String[] parts) {
protected ActorConditionEffect parseObject(JSONObject o) throws JSONException {
return new ActorConditionEffect(
actorConditionTypes.getActorConditionType(parts[0])
, ResourceParserUtils.parseInt(parts[1], ActorCondition.MAGNITUDE_REMOVE_ALL)
, ResourceParserUtils.parseInt(parts[2], ActorCondition.DURATION_FOREVER)
, ResourceParserUtils.parseChance(parts[3])
);
actorConditionTypes.getActorConditionType(o.getString(JsonFieldNames.ActorConditionEffect.condition))
, o.optInt(JsonFieldNames.ActorConditionEffect.magnitude, ActorCondition.MAGNITUDE_REMOVE_ALL)
, o.optInt(JsonFieldNames.ActorConditionEffect.duration, ActorCondition.DURATION_FOREVER)
, ResourceParserUtils.parseChance(o.getString(JsonFieldNames.ActorConditionEffect.chance))
);
}
};
this.actorConditionEffectParser_withoutDuration = new ResourceObjectParser<ActorConditionEffect>() {
this.actorConditionEffectParser_withoutDuration = new JsonParserFor<ActorConditionEffect>() {
@Override
public ActorConditionEffect parseRow(String[] parts) {
protected ActorConditionEffect parseObject(JSONObject o) throws JSONException {
return new ActorConditionEffect(
actorConditionTypes.getActorConditionType(parts[0])
, ResourceParserUtils.parseInt(parts[1], 1)
actorConditionTypes.getActorConditionType(o.getString(JsonFieldNames.ActorConditionEffect.condition))
, o.optInt(JsonFieldNames.ActorConditionEffect.magnitude, 1)
, ActorCondition.DURATION_FOREVER
, ResourceParserUtils.always
);
);
}
};
}
public ItemTraits_OnUse parseItemTraits_OnUse(String[] parts, int startIndex, boolean parseTargetConditions) {
boolean hasEffect = ResourceParserUtils.parseBoolean(parts[startIndex], false);
if (!hasEffect) return null;
public ItemTraits_OnUse parseItemTraits_OnUse(JSONObject o) throws JSONException {
if (o == null) return null;
ConstRange boostCurrentHP = ResourceParserUtils.parseConstRange(parts[startIndex + 1], parts[startIndex + 2]);
ConstRange boostCurrentAP = ResourceParserUtils.parseConstRange(parts[startIndex + 3], parts[startIndex + 4]);
ConstRange boostCurrentHP = ResourceParserUtils.parseConstRange(o.optJSONObject(JsonFieldNames.ItemTraits_OnUse.increaseCurrentHP));
ConstRange boostCurrentAP = ResourceParserUtils.parseConstRange(o.optJSONObject(JsonFieldNames.ItemTraits_OnUse.increaseCurrentAP));
final ArrayList<ActorConditionEffect> addedConditions_source = new ArrayList<ActorConditionEffect>();
final ArrayList<ActorConditionEffect> addedConditions_target = new ArrayList<ActorConditionEffect>();
tokenize4Fields.tokenizeArray(parts[startIndex + 5], addedConditions_source, actorConditionEffectParser_withDuration);
if (parseTargetConditions) {
tokenize4Fields.tokenizeArray(parts[startIndex + 6], addedConditions_target, actorConditionEffectParser_withDuration);
}
if ( boostCurrentHP == null
actorConditionEffectParser_withDuration.parseRows(o.optJSONArray(JsonFieldNames.ItemTraits_OnUse.conditionsSource), addedConditions_source);
actorConditionEffectParser_withDuration.parseRows(o.optJSONArray(JsonFieldNames.ItemTraits_OnUse.conditionsTarget), addedConditions_target);
if ( boostCurrentHP == null
&& boostCurrentAP == null
&& addedConditions_source.isEmpty()
&& addedConditions_target.isEmpty()
) {
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
L.log("OPTIMIZE: Tried to parseItemTraits_OnUse , where hasEffect=" + parts[startIndex] + ", but all data was empty.");
L.log("OPTIMIZE: Tried to parseItemTraits_OnUse , where hasEffect=" + o.toString() + ", but all data was empty.");
}
return null;
} else {
@@ -80,17 +77,16 @@ public final class ItemTraitsParser {
}
}
public ItemTraits_OnEquip parseItemTraits_OnEquip(String[] parts, int startIndex) {
boolean hasEffect = ResourceParserUtils.parseBoolean(parts[startIndex], false);
if (!hasEffect) return null;
public ItemTraits_OnEquip parseItemTraits_OnEquip(JSONObject o) throws JSONException {
if (o == null) return null;
AbilityModifierTraits stats = ResourceParserUtils.parseAbilityModifierTraits(parts, startIndex + 1);
AbilityModifierTraits stats = ResourceParserUtils.parseAbilityModifierTraits(o);
final ArrayList<ActorConditionEffect> addedConditions = new ArrayList<ActorConditionEffect>();
tokenize2Fields.tokenizeArray(parts[startIndex + 12], addedConditions, actorConditionEffectParser_withoutDuration);
actorConditionEffectParser_withoutDuration.parseRows(o.optJSONArray(JsonFieldNames.ItemTraits_OnEquip.addedConditions), addedConditions);
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.");
L.log("OPTIMIZE: Tried to parseItemTraits_OnEquip , where hasEffect=" + o.toString() + ", but all data was empty.");
}
return null;
} else {

View File

@@ -6,41 +6,43 @@ import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnEquip;
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse;
import com.gpl.rpg.AndorsTrail.model.item.ItemType;
import com.gpl.rpg.AndorsTrail.resource.DynamicTileLoader;
import com.gpl.rpg.AndorsTrail.resource.ResourceFileTokenizer.ResourceParserFor;
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;
public final class ItemTypeParser extends ResourceParserFor<ItemType> {
public final class ItemTypeParser extends JsonCollectionParserFor<ItemType> {
private final DynamicTileLoader tileLoader;
private final ItemTraitsParser itemTraitsParser;
private final ItemCategoryCollection itemCategories;
public ItemTypeParser(DynamicTileLoader tileLoader, ActorConditionTypeCollection actorConditionsTypes, ItemCategoryCollection itemCategories) {
super(39);
this.tileLoader = tileLoader;
this.itemTraitsParser = new ItemTraitsParser(actorConditionsTypes);
this.itemCategories = itemCategories;
}
@Override
public Pair<String, ItemType> parseRow(String[] parts) {
final String itemTypeName = parts[2];
String id = parts[0];
final ItemTraits_OnEquip equipEffect = itemTraitsParser.parseItemTraits_OnEquip(parts, 7);
final ItemTraits_OnUse useEffect = itemTraitsParser.parseItemTraits_OnUse(parts, 20, false);
final ItemTraits_OnUse hitEffect = itemTraitsParser.parseItemTraits_OnUse(parts, 26, true);
final ItemTraits_OnUse killEffect = itemTraitsParser.parseItemTraits_OnUse(parts, 33, false);
public Pair<String, ItemType> parseObject(JSONObject o) throws JSONException {
final String id = o.getString(JsonFieldNames.ItemType.itemTypeID);
final String itemTypeName = o.getString(JsonFieldNames.ItemType.name);
final ItemTraits_OnEquip equipEffect = itemTraitsParser.parseItemTraits_OnEquip(o.optJSONObject(JsonFieldNames.ItemType.equipEffect));
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 int baseMarketCost = Integer.parseInt(parts[6]);
final boolean hasManualPrice = ResourceParserUtils.parseBoolean(parts[5], false);
final int baseMarketCost = o.getInt(JsonFieldNames.ItemType.baseMarketCost);
final boolean hasManualPrice = o.optInt(JsonFieldNames.ItemType.hasManualPrice, 0) > 0;
final ItemType itemType = new ItemType(
id
, ResourceParserUtils.parseImageID(tileLoader, parts[1])
, ResourceParserUtils.parseImageID(tileLoader, o.getString(JsonFieldNames.ItemType.iconID))
, itemTypeName
, itemCategories.getItemCategory(parts[3]) // category
, ResourceParserUtils.parseInt(parts[4], ItemType.DISPLAYTYPE_ORDINARY) // Displaytype
, hasManualPrice // hasManualPrice
, baseMarketCost // Base market cost
, itemCategories.getItemCategory(o.getString(JsonFieldNames.ItemType.category))
, o.optInt(JsonFieldNames.ItemType.displaytype, ItemType.DISPLAYTYPE_ORDINARY)
, hasManualPrice
, baseMarketCost
, equipEffect
, useEffect
, hitEffect

View File

@@ -1,19 +1,21 @@
package com.gpl.rpg.AndorsTrail.resource.parsers;
import android.util.FloatMath;
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_OnUse;
import com.gpl.rpg.AndorsTrail.resource.DynamicTileLoader;
import com.gpl.rpg.AndorsTrail.resource.ResourceFileTokenizer.ResourceParserFor;
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonCollectionParserFor;
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonFieldNames;
import com.gpl.rpg.AndorsTrail.util.ConstRange;
import com.gpl.rpg.AndorsTrail.util.Pair;
import com.gpl.rpg.AndorsTrail.util.Size;
import org.json.JSONException;
import org.json.JSONObject;
public final class MonsterTypeParser extends ResourceParserFor<MonsterType> {
public final class MonsterTypeParser extends JsonCollectionParserFor<MonsterType> {
private final Size size1x1 = new Size(1, 1);
private final DropListCollection droplists;
@@ -21,51 +23,51 @@ public final class MonsterTypeParser extends ResourceParserFor<MonsterType> {
private final DynamicTileLoader tileLoader;
public MonsterTypeParser(final DropListCollection droplists, final ActorConditionTypeCollection actorConditionTypes, final DynamicTileLoader tileLoader) {
super(28);
this.itemTraitsParser = new ItemTraitsParser(actorConditionTypes);
this.droplists = droplists;
this.tileLoader = tileLoader;
}
@Override
public Pair<String, MonsterType> parseRow(String[] parts) {
final ItemTraits_OnUse hitEffect = itemTraitsParser.parseItemTraits_OnUse(parts, 21, true);
int maxHP = ResourceParserUtils.parseInt(parts[8], 1);
int maxAP = ResourceParserUtils.parseInt(parts[9], 10);
int attackCost = ResourceParserUtils.parseInt(parts[11], 10);
int attackChance = ResourceParserUtils.parseInt(parts[12], 0);
ConstRange damagePotential = ResourceParserUtils.parseConstRange(parts[15], parts[16]);
int criticalSkill = ResourceParserUtils.parseInt(parts[13], 0);
float criticalMultiplier = ResourceParserUtils.parseFloat(parts[14], 0);
int blockChance = ResourceParserUtils.parseInt(parts[17], 0);
int damageResistance = ResourceParserUtils.parseInt(parts[18], 0);
protected Pair<String, MonsterType> parseObject(JSONObject o) throws JSONException {
final String monsterTypeID = o.getString(JsonFieldNames.Monster.monsterTypeID);
int maxHP = o.optInt(JsonFieldNames.Monster.maxHP, 1);
int maxAP = o.optInt(JsonFieldNames.Monster.maxAP, 10);
int attackCost = o.optInt(JsonFieldNames.Monster.attackCost, 10);
int attackChance = o.optInt(JsonFieldNames.Monster.attackChance, 0);
ConstRange damagePotential = ResourceParserUtils.parseConstRange(o.optJSONObject(JsonFieldNames.Monster.attackDamage));
int criticalSkill = o.optInt(JsonFieldNames.Monster.criticalSkill, 0);
float criticalMultiplier = (float) o.optDouble(JsonFieldNames.Monster.criticalMultiplier, 0);
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 int exp = getExpectedMonsterExperience(attackCost, attackChance, damagePotential, criticalSkill, criticalMultiplier, blockChance, damageResistance, hitEffect, maxHP, maxAP);
final String monsterTypeId = parts[0];
return new Pair<String, MonsterType>(monsterTypeId, new MonsterType(
monsterTypeId
, parts[2] // Name
, parts[3] // SpawnGroup
, exp // Exp
, droplists.getDropList(parts[19]) // Droplist
, ResourceParserUtils.parseNullableString(parts[20]) // PhraseID
, ResourceParserUtils.parseBoolean(parts[6], false) // isUnique
, ResourceParserUtils.parseNullableString(parts[7]) // Faction
, ResourceParserUtils.parseInt(parts[5], MonsterType.MONSTERCLASS_HUMANOID) // MonsterClass
, ResourceParserUtils.parseSize(parts[4], size1x1) //TODO: This could be loaded from the tileset size instead.
, ResourceParserUtils.parseImageID(tileLoader, parts[1]) // IconID
, maxAP
, maxHP
, ResourceParserUtils.parseInt(parts[10], 10) // MoveCost
, attackCost
, attackChance
, criticalSkill
, criticalMultiplier
, damagePotential
, blockChance
, damageResistance
, hitEffect == null ? null : new ItemTraits_OnUse[] { hitEffect }
return new Pair<String, MonsterType>(monsterTypeID, new MonsterType(
monsterTypeID
, o.getString(JsonFieldNames.Monster.name)
, o.getString(JsonFieldNames.Monster.spawnGroup)
, exp
, droplists.getDropList(o.optString(JsonFieldNames.Monster.droplistID))
, o.optString(JsonFieldNames.Monster.phraseID)
, o.optInt(JsonFieldNames.Monster.unique, 0) > 0
, o.optString(JsonFieldNames.Monster.faction)
, o.optInt(JsonFieldNames.Monster.monsterClass, MonsterType.MONSTERCLASS_HUMANOID)
, ResourceParserUtils.parseSize(o.optString(JsonFieldNames.Monster.size), size1x1) //TODO: This could be loaded from the tileset size instead.
, ResourceParserUtils.parseImageID(tileLoader, o.getString(JsonFieldNames.Monster.iconID))
, maxAP
, maxHP
, o.optInt(JsonFieldNames.Monster.moveCost, 10)
, attackCost
, attackChance
, criticalSkill
, criticalMultiplier
, damagePotential
, blockChance
, damageResistance
, hitEffect == null ? null : new ItemTraits_OnUse[] { hitEffect }
));
}

View File

@@ -1,28 +1,30 @@
package com.gpl.rpg.AndorsTrail.resource.parsers;
import com.gpl.rpg.AndorsTrail.model.quest.Quest;
import com.gpl.rpg.AndorsTrail.model.quest.QuestLogEntry;
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonCollectionParserFor;
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonFieldNames;
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonParserFor;
import com.gpl.rpg.AndorsTrail.util.Pair;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import com.gpl.rpg.AndorsTrail.model.quest.Quest;
import com.gpl.rpg.AndorsTrail.model.quest.QuestLogEntry;
import com.gpl.rpg.AndorsTrail.resource.ResourceFileTokenizer;
import com.gpl.rpg.AndorsTrail.resource.ResourceFileTokenizer.ResourceParserFor;
import com.gpl.rpg.AndorsTrail.util.Pair;
public final class QuestParser extends ResourceParserFor<Quest> {
public final class QuestParser extends JsonCollectionParserFor<Quest> {
private int sortOrder = 0;
private final ResourceFileTokenizer questStageResourceTokenizer = new ResourceFileTokenizer(4);
private final ResourceObjectParser<QuestLogEntry> questLogEntryParser = new ResourceObjectParser<QuestLogEntry>() {
private final JsonParserFor<QuestLogEntry> questLogEntryParser = new JsonParserFor<QuestLogEntry>() {
@Override
public QuestLogEntry parseRow(String[] parts) {
protected QuestLogEntry parseObject(JSONObject o) throws JSONException {
return new QuestLogEntry(
Integer.parseInt(parts[0]) // Progress
, parts[1] // Logtext
, ResourceParserUtils.parseInt(parts[2], 0) // RewardExperience
, ResourceParserUtils.parseBoolean(parts[3], false) // FinishesQuest
);
o.getInt(JsonFieldNames.QuestLogEntry.progress)
,o.getString(JsonFieldNames.QuestLogEntry.logText)
,o.optInt(JsonFieldNames.QuestLogEntry.rewardExperience, 0)
,o.optInt(JsonFieldNames.QuestLogEntry.finishesQuest, 0) > 0
);
}
};
private final Comparator<QuestLogEntry> sortByQuestProgress = new Comparator<QuestLogEntry>() {
@@ -31,29 +33,24 @@ public final class QuestParser extends ResourceParserFor<Quest> {
return a.progress - b.progress;
}
};
public QuestParser() {
super(4);
}
@Override
public Pair<String, Quest> parseRow(String[] parts) {
// [id|name|showInLog|stages[progress|logText|rewardExperience|finishesQuest|]|];
protected Pair<String, Quest> parseObject(JSONObject o) throws JSONException {
final String id = o.getString(JsonFieldNames.Quest.questID);
final ArrayList<QuestLogEntry> stages = new ArrayList<QuestLogEntry>();
questStageResourceTokenizer.tokenizeArray(parts[3], stages, questLogEntryParser);
Collections.sort(stages, sortByQuestProgress);
questLogEntryParser.parseRows(o.getJSONArray(JsonFieldNames.Quest.stages), stages);
Collections.sort(stages, sortByQuestProgress);
final QuestLogEntry[] stages_ = stages.toArray(new QuestLogEntry[stages.size()]);
++sortOrder;
final String questID = parts[0];
return new Pair<String, Quest>(questID, new Quest(
questID // questID
, parts[1] // name
return new Pair<String, Quest>(id, new Quest(
id
, o.getString(JsonFieldNames.Quest.name)
, stages_
, ResourceParserUtils.parseBoolean(parts[2], false) // showInLog
, o.optInt(JsonFieldNames.Quest.showInLog, 0) > 0
, sortOrder
));
));
}
}

View File

@@ -5,60 +5,19 @@ import com.gpl.rpg.AndorsTrail.model.ability.traits.AbilityModifierTraits;
import com.gpl.rpg.AndorsTrail.model.ability.traits.StatsModifierTraits;
import com.gpl.rpg.AndorsTrail.resource.DynamicTileLoader;
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonFieldNames;
import com.gpl.rpg.AndorsTrail.util.*;
import org.json.JSONArray;
import com.gpl.rpg.AndorsTrail.util.ConstRange;
import com.gpl.rpg.AndorsTrail.util.L;
import com.gpl.rpg.AndorsTrail.util.Size;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
public final class ResourceParserUtils {
public static int parseImageID(DynamicTileLoader tileLoader, String s) {
String[] parts = s.split(":");
return tileLoader.prepareTileID(parts[0], Integer.parseInt(parts[1]));
}
public static Range parseRange(String min, String max) {
if ( (max == null || max.length() <= 0)
&& (min == null || min.length() <= 0) ) {
return null;
}
if (max == null || max.length() <= 0) {
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
L.log("OPTIMIZE: Unable to parse range with min=" + min + " because max was empty.");
}
return null;
}
if (min == null || min.length() <= 0) {
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
L.log("OPTIMIZE: Unable to parse range with max=" + max + " because min was empty.");
}
return null;
}
return new Range(Integer.parseInt(max), Integer.parseInt(min));
}
public static ConstRange parseConstRange(String min, String max) {
if ( (max == null || max.length() <= 0)
&& (min == null || min.length() <= 0) ) {
return null;
}
if (max == null || max.length() <= 0) {
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
L.log("OPTIMIZE: Unable to parse range with min=" + min + " because max was empty.");
}
return null;
}
if (min == null || min.length() <= 0) {
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
L.log("OPTIMIZE: Unable to parse range with max=" + max + " because min was empty.");
}
return null;
}
return new ConstRange(Integer.parseInt(max), Integer.parseInt(min));
}
private static final Size size1x1 = new Size(1, 1);
public static Size parseSize(String s, final Size defaultSize) {
if (s == null || s.length() <= 0) return defaultSize;
@@ -68,110 +27,21 @@ public final class ResourceParserUtils {
return new Size(Integer.parseInt(parts[0]), Integer.parseInt(parts[1]));
}
public static String parseNullableString(String s) {
if (s == null || s.length() <= 0) return null;
return s;
}
public static int parseInt(String s, int defaultValue) {
if (s == null || s.length() <= 0) return defaultValue;
return Integer.parseInt(s);
}
public static float parseFloat(String s, int defaultValue) {
if (s == null || s.length() <= 0) return defaultValue;
return Float.parseFloat(s);
}
public static boolean parseBoolean(String s, boolean defaultValue) {
if (s == null || s.length() <= 0) return defaultValue;
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
if (Character.isDigit(s.charAt(0))) {
if (Integer.parseInt(s) > 1) {
L.log("WARNING: Tried to parseBoolean on \"" + s + "\".");
}
}
}
return !s.equals("0") && !s.equals("false");
}
public static StatsModifierTraits parseStatsModifierTraits(String[] parts, int startIndex) {
boolean hasEffect = parseBoolean(parts[startIndex], false);
if (!hasEffect) return null;
String visualEffectID = parts[startIndex + 1];
ConstRange boostCurrentHP = parseConstRange(parts[startIndex + 2], parts[startIndex + 3]);
ConstRange boostCurrentAP = parseConstRange(parts[startIndex + 4], parts[startIndex + 5]);
if ( boostCurrentHP == null
&& boostCurrentAP == null
) {
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
L.log("OPTIMIZE: Tried to parseStatsModifierTraits , where hasEffect=" + parts[startIndex] + ", but all data was empty.");
}
return null;
} else {
return new StatsModifierTraits(
parseInt(visualEffectID, StatsModifierTraits.VISUAL_EFFECT_NONE)
,boostCurrentHP
,boostCurrentAP
);
}
}
public static AbilityModifierTraits parseAbilityModifierTraits(String[] parts, int startIndex) {
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 ( 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
) {
return null;
} else {
return new AbilityModifierTraits(
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)
);
}
}
private static final ConstRange zero_or_one = new ConstRange(1, 0);
private static final ConstRange one = new ConstRange(1, 1);
private static final ConstRange five = new ConstRange(5, 5);
private static final ConstRange ten = new ConstRange(10, 10);
public static ConstRange parseQuantity(String min, String max) {
if (min.equals("0") && max.equals("1")) return zero_or_one;
if (min.equals("1") && max.equals("1")) return one;
if (min.equals("5") && max.equals("5")) return five;
if (min.equals("10") && max.equals("10")) return ten;
return parseConstRange(min, max);
public static ConstRange parseConstRange(JSONObject o) throws JSONException {
if (o == null) return null;
return new ConstRange(o.getInt(JsonFieldNames.Range.max), o.getInt(JsonFieldNames.Range.min));
}
public static final ConstRange always = one;
private static final ConstRange often = new ConstRange(100, 70);
private static final ConstRange animalpart = new ConstRange(100, 30);
@@ -202,16 +72,6 @@ public final class ResourceParserUtils {
else return new ConstRange(100, parseInt(v, 10));
}
public static ConstRange parseConstRange(JSONObject o) throws JSONException {
if (o == null) return null;
return new ConstRange(o.getInt(JsonFieldNames.Range.max), o.getInt(JsonFieldNames.Range.min));
}
public static StatsModifierTraits parseStatsModifierTraits(JSONObject o) throws JSONException {
if (o == null) return null;
@@ -244,8 +104,8 @@ public final class ResourceParserUtils {
,o.optInt(JsonFieldNames.AbilityModifierTraits.increaseAttackCost, 0)
,o.optInt(JsonFieldNames.AbilityModifierTraits.increaseAttackChance, 0)
,o.optInt(JsonFieldNames.AbilityModifierTraits.increaseBlockChance, 0)
,increaseAttackDamage.current
,increaseAttackDamage.max
,increaseAttackDamage != null ? increaseAttackDamage.current : 0
,increaseAttackDamage != null ? increaseAttackDamage.max : 0
,o.optInt(JsonFieldNames.AbilityModifierTraits.increaseCriticalSkill, 0)
,o.optInt(JsonFieldNames.AbilityModifierTraits.setCriticalMultiplier, 0)
,o.optInt(JsonFieldNames.AbilityModifierTraits.increaseDamageResistance, 0)

View File

@@ -1,5 +1,8 @@
package com.gpl.rpg.AndorsTrail.resource.parsers.json;
import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionEffect;
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnEquip;
public final class JsonFieldNames {
public static final class ActorCondition {
public static final String conditionTypeID = "id";
@@ -87,4 +90,76 @@ public final class JsonFieldNames {
public static final String rewardID = "rewardID";
public static final String value = "value";
}
public static final class Quest {
public static final String questID = "id";
public static final String name = "name";
public static final String showInLog = "showInLog";
public static final String stages = "stages";
}
public static final class QuestLogEntry {
public static final String progress = "progress";
public static final String logText = "logText";
public static final String rewardExperience = "rewardExperience";
public static final String finishesQuest = "finishesQuest";
}
public static final class Monster {
public static final String monsterTypeID = "id";
public static final String iconID = "iconID";
public static final String name = "name";
public static final String spawnGroup = "spawnGroup";
public static final String size = "size";
public static final String monsterClass = "monsterClass";
public static final String unique = "unique";
public static final String faction = "faction";
public static final String maxHP = "maxHP";
public static final String maxAP = "maxAP";
public static final String moveCost = "moveCost";
public static final String attackCost = "attackCost";
public static final String attackChance = "attackChance";
public static final String criticalSkill = "criticalSkill";
public static final String criticalMultiplier = "criticalMultiplier";
public static final String attackDamage = "attackDamage";
public static final String blockChance = "blockChance";
public static final String damageResistance = "damageResistance";
public static final String droplistID = "droplistID";
public static final String phraseID = "phraseID";
public static final String hitEffect = "hitEffect";
}
public static final class ItemTraits_OnUse {
public static final String increaseCurrentHP = "increaseCurrentHP";
public static final String increaseCurrentAP = "increaseCurrentAP";
public static final String conditionsSource = "conditionsSource";
public static final String conditionsTarget = "conditionsTarget";
}
public static final class ActorConditionEffect {
public static final String condition = "condition";
public static final String magnitude = "magnitude";
public static final String duration = "duration";
public static final String chance = "chance";
}
public static final class ItemTraits_OnEquip {
public static final String addedConditions = "addedConditions";
}
public static final class ItemType {
public static final String itemTypeID = "id";
public static final String iconID = "iconID";
public static final String name = "name";
public static final String category = "category";
public static final String displaytype = "displaytype";
public static final String hasManualPrice = "hasManualPrice";
public static final String baseMarketCost = "baseMarketCost";
public static final String equipEffect = "equipEffect";
public static final String useEffect = "useEffect";
public static final String hitEffect = "hitEffect";
public static final String killEffect = "killEffect";
}
}