mirror of
https://github.com/OMGeeky/andors-trail.git
synced 2026-01-23 20:05:29 +01:00
Updated parsers for reading resources as JSON.
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 }
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
));
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user