WIP on parsing resource data as json instead of the old resource format.

This commit is contained in:
Oskar Wiksten
2013-01-20 00:19:38 +01:00
parent 4b8577e690
commit 81665520c0
8 changed files with 326 additions and 106 deletions

View File

@@ -1,39 +1,35 @@
package com.gpl.rpg.AndorsTrail.resource.parsers;
import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionType;
import com.gpl.rpg.AndorsTrail.model.ability.traits.AbilityModifierTraits;
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 ActorConditionsTypeParser extends ResourceParserFor<ActorConditionType> {
public final class ActorConditionsTypeParser extends JsonCollectionParserFor<ActorConditionType> {
private final DynamicTileLoader tileLoader;
public ActorConditionsTypeParser(final DynamicTileLoader tileLoader) {
super(30);
this.tileLoader = tileLoader;
}
@Override
public Pair<String, ActorConditionType> parseRow(String[] parts) {
final String conditionTypeID = parts[0];
AbilityModifierTraits stats = null;
if (ResourceParserUtils.parseBoolean(parts[18], false)) {
stats = ResourceParserUtils.parseAbilityModifierTraits(parts, 19);
}
return new Pair<String, ActorConditionType>(conditionTypeID, new ActorConditionType(
protected Pair<String, ActorConditionType> parseObject(JSONObject o) throws JSONException {
final String conditionTypeID = o.getString(JsonFieldNames.ActorCondition.conditionTypeID);
ActorConditionType result = new ActorConditionType(
conditionTypeID
, parts[1]
, ResourceParserUtils.parseImageID(tileLoader, parts[2])
, Integer.parseInt(parts[3])
, ResourceParserUtils.parseBoolean(parts[4], false)
, ResourceParserUtils.parseBoolean(parts[5], false)
, ResourceParserUtils.parseStatsModifierTraits(parts, 6)
, ResourceParserUtils.parseStatsModifierTraits(parts, 12)
, stats
));
,o.getString(JsonFieldNames.ActorCondition.name)
,ResourceParserUtils.parseImageID(tileLoader, o.getString(JsonFieldNames.ActorCondition.iconID))
,o.getInt(JsonFieldNames.ActorCondition.category)
,o.optInt(JsonFieldNames.ActorCondition.isStacking) > 0
,o.optInt(JsonFieldNames.ActorCondition.isPositive) > 0
,ResourceParserUtils.parseStatsModifierTraits(o.optJSONObject(JsonFieldNames.ActorCondition.roundEffect))
,ResourceParserUtils.parseStatsModifierTraits(o.optJSONObject(JsonFieldNames.ActorCondition.fullRoundEffect))
,ResourceParserUtils.parseAbilityModifierTraits(o.optJSONObject(JsonFieldNames.ActorCondition.abilityEffect))
);
return new Pair<String, ActorConditionType>(conditionTypeID, result);
}
}

View File

@@ -1,65 +1,76 @@
package com.gpl.rpg.AndorsTrail.resource.parsers;
import java.util.ArrayList;
import com.gpl.rpg.AndorsTrail.conversation.Phrase;
import com.gpl.rpg.AndorsTrail.conversation.Phrase.Reply;
import com.gpl.rpg.AndorsTrail.conversation.Phrase.Reward;
import com.gpl.rpg.AndorsTrail.model.quest.QuestProgress;
import com.gpl.rpg.AndorsTrail.resource.ResourceFileTokenizer;
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.resource.parsers.json.JsonParserFor;
import com.gpl.rpg.AndorsTrail.util.Pair;
import org.json.JSONException;
import org.json.JSONObject;
public final class ConversationListParser extends ResourceParserFor<Phrase> {
import java.util.ArrayList;
public final class ConversationListParser extends JsonCollectionParserFor<Phrase> {
public ConversationListParser() {
super(4);
}
private final ResourceFileTokenizer replyResourceTokenizer = new ResourceFileTokenizer(6);
private final ResourceObjectParser<Reply> replyParser = new ResourceObjectParser<Reply>() {
private final JsonParserFor<Reply> replyParser = new JsonParserFor<Reply>() {
@Override
public Reply parseRow(String[] parts) {
protected Reply parseObject(JSONObject o) throws JSONException {
JSONObject requires = o.optJSONObject(JsonFieldNames.Reply.requires);
String requiresProgress = null;
String requiresItemTypeID = null;
int requiresItemQuantity = 0;
int itemRequirementType = Reply.ITEM_REQUIREMENT_TYPE_INVENTORY_REMOVE;
if (requires != null) {
requiresProgress = requires.optString(JsonFieldNames.ReplyRequires.progress);
JSONObject requiresItem = o.optJSONObject(JsonFieldNames.ReplyRequires.item);
if (requiresItem != null) {
requiresItemTypeID = requiresItem.getString(JsonFieldNames.ReplyRequiresItem.itemID);
requiresItemQuantity = requiresItem.getInt(JsonFieldNames.ReplyRequiresItem.quantity);
itemRequirementType = requiresItem.getInt(JsonFieldNames.ReplyRequiresItem.requireType);
}
}
return new Reply(
parts[0] // text
, parts[1] // nextPhrase
, QuestProgress.parseQuestProgress(parts[2]) // requiresProgress
, ResourceParserUtils.parseNullableString(parts[3]) // requiresItemType
, ResourceParserUtils.parseInt(parts[4], 0) // requiresItemQuantity
, ResourceParserUtils.parseInt(parts[5], Reply.ITEM_REQUIREMENT_TYPE_INVENTORY_REMOVE) // itemRequirementType
);
o.optString(JsonFieldNames.Reply.text)
,o.optString(JsonFieldNames.Reply.nextPhraseID)
,QuestProgress.parseQuestProgress(requiresProgress)
,requiresItemTypeID
,requiresItemQuantity
,itemRequirementType
);
}
};
private final ResourceFileTokenizer rewardResourceTokenizer = new ResourceFileTokenizer(3);
private final ResourceObjectParser<Reward> rewardParser = new ResourceObjectParser<Reward>() {
private final JsonParserFor<Reward> rewardParser = new JsonParserFor<Reward>() {
@Override
public Reward parseRow(String[] parts) {
protected Reward parseObject(JSONObject o) throws JSONException {
return new Reward(
Integer.parseInt(parts[0]) // rewardType
, parts[1] // rewardID
, ResourceParserUtils.parseInt(parts[2], 0) // value
);
o.getInt(JsonFieldNames.PhraseReward.rewardType)
,o.getString(JsonFieldNames.PhraseReward.rewardID)
,o.getInt(JsonFieldNames.PhraseReward.value)
);
}
};
@Override
public Pair<String, Phrase> parseRow(String[] parts) {
// [id|message|rewards[rewardType|rewardID|value|]|replies[text|nextPhraseID|requires_Progress|requires_itemID|requires_Quantity|requires_Type|]|];
protected Pair<String, Phrase> parseObject(JSONObject o) throws JSONException {
final String id = o.getString(JsonFieldNames.Phrase.phraseID);
final ArrayList<Reply> replies = new ArrayList<Reply>();
replyResourceTokenizer.tokenizeArray(parts[3], replies, replyParser);
replyParser.parseRows(o.optJSONArray(JsonFieldNames.Phrase.replies), replies);
final Reply[] _replies = replies.toArray(new Reply[replies.size()]);
final ArrayList<Reward> rewards = new ArrayList<Reward>();
rewardResourceTokenizer.tokenizeArray(parts[2], rewards, rewardParser);
rewardParser.parseRows(o.optJSONArray(JsonFieldNames.Phrase.rewards), rewards);
Reward[] _rewards = rewards.toArray(new Reward[rewards.size()]);
if (_rewards.length == 0) _rewards = null;
return new Pair<String, Phrase>(parts[0], new Phrase(
ResourceParserUtils.parseNullableString(parts[1]) // message
, _replies // replies
, _rewards // rewards
));
return new Pair<String, Phrase>(id, new Phrase(
o.optString(JsonFieldNames.Phrase.message)
, _replies
, _rewards
));
}
}

View File

@@ -6,45 +6,46 @@ import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.model.item.DropList;
import com.gpl.rpg.AndorsTrail.model.item.ItemTypeCollection;
import com.gpl.rpg.AndorsTrail.model.item.DropList.DropItem;
import com.gpl.rpg.AndorsTrail.resource.ResourceFileTokenizer;
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.resource.parsers.json.JsonParserFor;
import com.gpl.rpg.AndorsTrail.util.L;
import com.gpl.rpg.AndorsTrail.util.Pair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public final class DropListParser extends ResourceParserFor<DropList> {
public final class DropListParser extends JsonCollectionParserFor<DropList> {
private final JsonParserFor<DropItem> dropItemParser;
private final ResourceFileTokenizer droplistItemResourceTokenizer = new ResourceFileTokenizer(4);
private final ResourceObjectParser<DropItem> dropItemParser;
public DropListParser(final ItemTypeCollection itemTypes) {
super(2);
this.dropItemParser = new ResourceObjectParser<DropItem>() {
this.dropItemParser = new JsonParserFor<DropItem>() {
@Override
public DropItem parseRow(String[] parts) {
protected DropItem parseObject(JSONObject o) throws JSONException {
return new DropItem(
itemTypes.getItemType(parts[0]) // Itemtype
, ResourceParserUtils.parseChance(parts[3]) // Chance
, ResourceParserUtils.parseQuantity(parts[1], parts[2]) // Quantity
);
itemTypes.getItemType(o.getString(JsonFieldNames.DropItem.itemID))
,ResourceParserUtils.parseChance(o.getString(JsonFieldNames.DropItem.chance))
,ResourceParserUtils.parseQuantity(o.getJSONObject(JsonFieldNames.DropItem.quantity))
);
}
};
}
@Override
public Pair<String, DropList> parseRow(String[] parts) {
// [id|items[itemID|quantity_Min|quantity_Max|chance|]|];
String droplistID = parts[0];
protected Pair<String, DropList> parseObject(JSONObject o) throws JSONException {
String droplistID = o.getString(JsonFieldNames.DropList.dropListID);
JSONArray array = o.getJSONArray(JsonFieldNames.DropList.items);
final ArrayList<DropItem> items = new ArrayList<DropItem>();
droplistItemResourceTokenizer.tokenizeArray(parts[1], items, dropItemParser);
DropItem[] items_ = items.toArray(new DropItem[items.size()]);
dropItemParser.parseRows(array, items);
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
if (items_.length <= 0) {
if (items.size() <= 0) {
L.log("OPTIMIZE: Droplist \"" + droplistID + "\" has no dropped items.");
}
}
return new Pair<String, DropList>(droplistID, new DropList(items_));
return new Pair<String, DropList>(droplistID, new DropList(items));
}
}

View File

@@ -1,25 +1,24 @@
package com.gpl.rpg.AndorsTrail.resource.parsers;
import com.gpl.rpg.AndorsTrail.model.item.ItemCategory;
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 ItemCategoryParser extends ResourceParserFor<ItemCategory> {
public ItemCategoryParser() {
super(5);
}
public final class ItemCategoryParser extends JsonCollectionParserFor<ItemCategory> {
@Override
public Pair<String, ItemCategory> parseRow(String[] parts) {
String id = parts[0];
final ItemCategory itemType = new ItemCategory(
protected Pair<String, ItemCategory> parseObject(JSONObject o) throws JSONException {
final String id = o.getString(JsonFieldNames.ItemCategory.itemCategoryID);
ItemCategory result = new ItemCategory(
id
, parts[1] // displayName
, ResourceParserUtils.parseInt(parts[2], 0) // actionType
, ResourceParserUtils.parseInt(parts[3], -1) // inventorySlot
, ResourceParserUtils.parseInt(parts[4], 0) // size
);
return new Pair<String, ItemCategory>(id, itemType);
,o.getString(JsonFieldNames.ItemCategory.name)
,o.optInt(JsonFieldNames.ItemCategory.actionType, 0)
,o.optInt(JsonFieldNames.ItemCategory.inventorySlot, -1)
,o.optInt(JsonFieldNames.ItemCategory.size, 0)
);
return new Pair<String, ItemCategory>(id, result);
}
}

View File

@@ -4,10 +4,13 @@ import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
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.util.ConstRange;
import com.gpl.rpg.AndorsTrail.util.L;
import com.gpl.rpg.AndorsTrail.util.Range;
import com.gpl.rpg.AndorsTrail.util.Size;
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonFieldNames;
import com.gpl.rpg.AndorsTrail.util.*;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
public final class ResourceParserUtils {
@@ -155,6 +158,7 @@ public final class ResourceParserUtils {
);
}
}
private static final ConstRange zero_or_one = new ConstRange(1, 0);
private static final ConstRange one = new ConstRange(1, 1);
@@ -162,9 +166,9 @@ public final class ResourceParserUtils {
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;
else if (min.equals("1") && max.equals("1")) return one;
else if (min.equals("5") && max.equals("5")) return five;
else if (min.equals("10") && max.equals("10")) return ten;
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);
}
@@ -197,4 +201,64 @@ 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;
ConstRange boostCurrentHP = parseConstRange(o.getJSONObject(JsonFieldNames.StatsModifierTraits.increaseCurrentHP));
ConstRange boostCurrentAP = parseConstRange(o.getJSONObject(JsonFieldNames.StatsModifierTraits.increaseCurrentAP));
if (boostCurrentHP == null && boostCurrentAP == null) {
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
L.log("OPTIMIZE: Tried to parseStatsModifierTraits , where hasEffect=" + o.toString() + ", but all data was empty.");
}
return null;
} else {
return new StatsModifierTraits(
o.optInt(JsonFieldNames.StatsModifierTraits.visualEffectID, StatsModifierTraits.VISUAL_EFFECT_NONE)
,boostCurrentHP
,boostCurrentAP
);
}
}
public static AbilityModifierTraits parseAbilityModifierTraits(JSONObject o) throws JSONException {
if (o == null) return null;
ConstRange increaseAttackDamage = parseConstRange(o.optJSONObject(JsonFieldNames.AbilityModifierTraits.increaseAttackDamage));
return new AbilityModifierTraits(
o.optInt(JsonFieldNames.AbilityModifierTraits.increaseMaxHP, 0)
,o.optInt(JsonFieldNames.AbilityModifierTraits.increaseMaxAP, 0)
,o.optInt(JsonFieldNames.AbilityModifierTraits.increaseMoveCost, 0)
,o.optInt(JsonFieldNames.AbilityModifierTraits.increaseUseItemCost, 0)
,o.optInt(JsonFieldNames.AbilityModifierTraits.increaseReequipCost, 0)
,o.optInt(JsonFieldNames.AbilityModifierTraits.increaseAttackCost, 0)
,o.optInt(JsonFieldNames.AbilityModifierTraits.increaseAttackChance, 0)
,o.optInt(JsonFieldNames.AbilityModifierTraits.increaseBlockChance, 0)
,increaseAttackDamage.current
,increaseAttackDamage.max
,o.optInt(JsonFieldNames.AbilityModifierTraits.increaseCriticalSkill, 0)
,o.optInt(JsonFieldNames.AbilityModifierTraits.setCriticalMultiplier, 0)
,o.optInt(JsonFieldNames.AbilityModifierTraits.increaseDamageResistance, 0)
);
}
public static ConstRange parseQuantity(JSONObject obj) throws JSONException {
final int min = obj.getInt(JsonFieldNames.Range.min);
final int max = obj.getInt(JsonFieldNames.Range.max);
if (min == 0 && max == 1) return zero_or_one;
if (min == 1 && max == 1) return one;
if (min == 5 && max == 5) return five;
if (min == 10 && max == 10) return ten;
return parseConstRange(obj);
}
}

View File

@@ -0,0 +1,39 @@
package com.gpl.rpg.AndorsTrail.resource.parsers.json;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.util.L;
import com.gpl.rpg.AndorsTrail.util.Pair;
import org.json.JSONArray;
import org.json.JSONException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
public abstract class JsonCollectionParserFor<T> extends JsonParserFor<Pair<String, T>> {
public HashSet<String> parseRows(String input, HashMap<String, T> dest) {
HashSet<String> ids = new HashSet<String>();
ArrayList<Pair<String, T>> objects = new ArrayList<Pair<String, T>>();
try {
parseRows(new JSONArray(input), objects);
} catch (JSONException e) {
L.log("ERROR loading resource data: " + e.toString());
}
for (Pair<String, T> o : objects) {
final String id = o.first;
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
if (id == null || id.length() <= 0) {
L.log("WARNING: Entity " + o.second.toString() + " has empty id.");
} else if (dest.containsKey(id)) {
L.log("WARNING: Entity " + id + " is duplicated.");
}
}
dest.put(id, o.second);
ids.add(id);
}
return ids;
}
}

View File

@@ -0,0 +1,90 @@
package com.gpl.rpg.AndorsTrail.resource.parsers.json;
public final class JsonFieldNames {
public static final class ActorCondition {
public static final String conditionTypeID = "id";
public static final String name = "name";
public static final String iconID = "iconID";
public static final String category = "category";
public static final String isStacking = "isStacking";
public static final String isPositive = "isPositive";
public static final String roundEffect = "roundEffect";
public static final String fullRoundEffect = "fullRoundEffect";
public static final String abilityEffect = "abilityEffect";
}
public static final class StatsModifierTraits {
public static final String visualEffectID = "visualEffectID";
public static final String increaseCurrentHP = "increaseCurrentHP";
public static final String increaseCurrentAP = "increaseCurrentAP";
}
public static final class AbilityModifierTraits {
public static final String increaseMaxHP = "increaseMaxHP";
public static final String increaseMaxAP = "increaseMaxAP";
public static final String increaseMoveCost = "increaseMoveCost";
public static final String increaseUseItemCost = "increaseUseItemCost";
public static final String increaseReequipCost = "increaseReequipCost";
public static final String increaseAttackCost = "increaseAttackCost";
public static final String increaseAttackChance = "increaseAttackChance";
public static final String increaseCriticalSkill = "increaseCriticalSkill";
public static final String setCriticalMultiplier = "setCriticalMultiplier";
public static final String increaseAttackDamage = "increaseAttackDamage";
public static final String increaseBlockChance = "increaseBlockChance";
public static final String increaseDamageResistance = "increaseDamageResistance";
}
public static final class ItemCategory {
public static final String itemCategoryID = "id";
public static final String name = "name";
public static final String actionType = "actionType";
public static final String inventorySlot = "inventorySlot";
public static final String size = "size";
}
public static final class DropList {
public static final String dropListID = "id";
public static final String items = "items";
}
public static final class DropItem {
public static final String itemID = "itemID";
public static final String quantity = "quantity";
public static final String chance = "chance";
}
public static final class Range {
public static final String min = "min";
public static final String max = "max";
}
public static final class Phrase {
public static final String phraseID = "id";
public static final String message = "message";
public static final String rewards = "rewards";
public static final String replies = "replies";
}
public static final class Reply {
public static final String text = "text";
public static final String nextPhraseID = "nextPhraseID";
public static final String requires = "requires";
}
public static final class ReplyRequires {
public static final String progress = "progress";
public static final String item = "item";
}
public static final class ReplyRequiresItem {
public static final String itemID = "itemID";
public static final String quantity = "quantity";
public static final String requireType = "requireType";
}
public static final class PhraseReward {
public static final String rewardType = "rewardType";
public static final String rewardID = "rewardID";
public static final String value = "value";
}
}

View File

@@ -0,0 +1,20 @@
package com.gpl.rpg.AndorsTrail.resource.parsers.json;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
public abstract class JsonParserFor<T> {
public void parseRows(JSONArray array, ArrayList<T> dest) throws JSONException {
if (array == null) return;
for (int i = 0; i < array.length(); ++i) {
JSONObject o = array.getJSONObject(i);
dest.add(parseObject(o));
}
}
protected abstract T parseObject(JSONObject o) throws JSONException;
}