mirror of
https://github.com/OMGeeky/andors-trail.git
synced 2026-02-23 15:38:29 +01:00
Refactor JSON array parser to not create as many "new ArrayList<>" instances
This commit is contained in:
@@ -13,9 +13,6 @@ public final class DropList {
|
||||
public DropList(DropItem[] items) {
|
||||
this.items = items;
|
||||
}
|
||||
public DropList(Collection<DropItem> items) {
|
||||
this.items = items.toArray(new DropItem[items.size()]);
|
||||
}
|
||||
public void createRandomLoot(Loot loot, Player player) {
|
||||
for (DropItem item : items) {
|
||||
|
||||
|
||||
@@ -6,21 +6,19 @@ 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.TranslationLoader;
|
||||
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonArrayParserFor;
|
||||
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.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public final class ConversationListParser extends JsonCollectionParserFor<Phrase> {
|
||||
|
||||
private final TranslationLoader translationLoader;
|
||||
|
||||
private final JsonParserFor<Reply> replyParser = new JsonParserFor<Reply>() {
|
||||
private final JsonArrayParserFor<Reply> replyParser = new JsonArrayParserFor<Reply>(Reply.class) {
|
||||
@Override
|
||||
protected Reply parseObject(JSONObject o) throws JSONException {
|
||||
JSONObject requires = o.optJSONObject(JsonFieldNames.Reply.requires);
|
||||
@@ -48,7 +46,7 @@ public final class ConversationListParser extends JsonCollectionParserFor<Phrase
|
||||
}
|
||||
};
|
||||
|
||||
private final JsonParserFor<Reward> rewardParser = new JsonParserFor<Reward>() {
|
||||
private final JsonArrayParserFor<Reward> rewardParser = new JsonArrayParserFor<Reward>(Reward.class) {
|
||||
@Override
|
||||
protected Reward parseObject(JSONObject o) throws JSONException {
|
||||
return new Reward(
|
||||
@@ -67,21 +65,17 @@ public final class ConversationListParser extends JsonCollectionParserFor<Phrase
|
||||
protected Pair<String, Phrase> parseObject(JSONObject o) throws JSONException {
|
||||
final String id = o.getString(JsonFieldNames.Phrase.phraseID);
|
||||
|
||||
final ArrayList<Reply> replies = new ArrayList<Reply>();
|
||||
final ArrayList<Reward> rewards = new ArrayList<Reward>();
|
||||
Reply[] _replies = null;
|
||||
Reward[] _rewards = null;
|
||||
try {
|
||||
replyParser.parseRows(o.optJSONArray(JsonFieldNames.Phrase.replies), replies);
|
||||
rewardParser.parseRows(o.optJSONArray(JsonFieldNames.Phrase.rewards), rewards);
|
||||
_replies = replyParser.parseArray(o.optJSONArray(JsonFieldNames.Phrase.replies));
|
||||
_rewards = rewardParser.parseArray(o.optJSONArray(JsonFieldNames.Phrase.rewards));
|
||||
} catch (JSONException e) {
|
||||
if (AndorsTrailApplication.DEVELOPMENT_DEBUGMESSAGES) {
|
||||
L.log("ERROR: parsing phrase " + id + " : " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
final Reply[] _replies = replies.toArray(new Reply[replies.size()]);
|
||||
Reward[] _rewards = rewards.toArray(new Reward[rewards.size()]);
|
||||
if (_rewards.length == 0) _rewards = null;
|
||||
|
||||
return new Pair<String, Phrase>(id, new Phrase(
|
||||
translationLoader.translateConversationPhrase(o.optString(JsonFieldNames.Phrase.message, null))
|
||||
, _replies
|
||||
|
||||
@@ -1,26 +1,23 @@
|
||||
package com.gpl.rpg.AndorsTrail.resource.parsers;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
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.model.item.ItemTypeCollection;
|
||||
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonArrayParserFor;
|
||||
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 JsonCollectionParserFor<DropList> {
|
||||
|
||||
private final JsonParserFor<DropItem> dropItemParser;
|
||||
private final JsonArrayParserFor<DropItem> dropItemParser;
|
||||
|
||||
public DropListParser(final ItemTypeCollection itemTypes) {
|
||||
this.dropItemParser = new JsonParserFor<DropItem>() {
|
||||
this.dropItemParser = new JsonArrayParserFor<DropItem>(DropItem.class) {
|
||||
@Override
|
||||
protected DropItem parseObject(JSONObject o) throws JSONException {
|
||||
return new DropItem(
|
||||
@@ -35,13 +32,10 @@ public final class DropListParser extends JsonCollectionParserFor<DropList> {
|
||||
@Override
|
||||
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>();
|
||||
dropItemParser.parseRows(array, items);
|
||||
DropItem[] items = dropItemParser.parseArray(o.getJSONArray(JsonFieldNames.DropList.items));
|
||||
|
||||
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
|
||||
if (items.size() <= 0) {
|
||||
if (items == null) {
|
||||
L.log("OPTIMIZE: Droplist \"" + droplistID + "\" has no dropped items.");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,21 +8,19 @@ 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.parsers.json.JsonArrayParserFor;
|
||||
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 JsonParserFor<ActorConditionEffect> actorConditionEffectParser_withDuration;
|
||||
private final JsonParserFor<ActorConditionEffect> actorConditionEffectParser_withoutDuration;
|
||||
private final JsonArrayParserFor<ActorConditionEffect> actorConditionEffectParser_withDuration;
|
||||
private final JsonArrayParserFor<ActorConditionEffect> actorConditionEffectParser_withoutDuration;
|
||||
|
||||
public ItemTraitsParser(final ActorConditionTypeCollection actorConditionTypes) {
|
||||
this.actorConditionEffectParser_withDuration = new JsonParserFor<ActorConditionEffect>() {
|
||||
this.actorConditionEffectParser_withDuration = new JsonArrayParserFor<ActorConditionEffect>(ActorConditionEffect.class) {
|
||||
@Override
|
||||
protected ActorConditionEffect parseObject(JSONObject o) throws JSONException {
|
||||
return new ActorConditionEffect(
|
||||
@@ -33,7 +31,7 @@ public final class ItemTraitsParser {
|
||||
);
|
||||
}
|
||||
};
|
||||
this.actorConditionEffectParser_withoutDuration = new JsonParserFor<ActorConditionEffect>() {
|
||||
this.actorConditionEffectParser_withoutDuration = new JsonArrayParserFor<ActorConditionEffect>(ActorConditionEffect.class) {
|
||||
@Override
|
||||
protected ActorConditionEffect parseObject(JSONObject o) throws JSONException {
|
||||
return new ActorConditionEffect(
|
||||
@@ -51,14 +49,12 @@ public final class ItemTraitsParser {
|
||||
|
||||
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>();
|
||||
actorConditionEffectParser_withDuration.parseRows(o.optJSONArray(JsonFieldNames.ItemTraits_OnUse.conditionsSource), addedConditions_source);
|
||||
actorConditionEffectParser_withDuration.parseRows(o.optJSONArray(JsonFieldNames.ItemTraits_OnUse.conditionsTarget), addedConditions_target);
|
||||
ActorConditionEffect[] addedConditions_source = actorConditionEffectParser_withDuration.parseArray(o.optJSONArray(JsonFieldNames.ItemTraits_OnUse.conditionsSource));
|
||||
ActorConditionEffect[] addedConditions_target = actorConditionEffectParser_withDuration.parseArray(o.optJSONArray(JsonFieldNames.ItemTraits_OnUse.conditionsTarget));
|
||||
if ( boostCurrentHP == null
|
||||
&& boostCurrentAP == null
|
||||
&& addedConditions_source.isEmpty()
|
||||
&& addedConditions_target.isEmpty()
|
||||
&& addedConditions_source == null
|
||||
&& addedConditions_target == null
|
||||
) {
|
||||
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
|
||||
L.log("OPTIMIZE: Tried to parseItemTraits_OnUse , where hasEffect=" + o.toString() + ", but all data was empty.");
|
||||
@@ -71,8 +67,8 @@ public final class ItemTraitsParser {
|
||||
,boostCurrentHP
|
||||
,boostCurrentAP
|
||||
)
|
||||
,listToArray(addedConditions_source)
|
||||
,listToArray(addedConditions_target)
|
||||
,addedConditions_source
|
||||
,addedConditions_target
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -81,21 +77,15 @@ public final class ItemTraitsParser {
|
||||
if (o == null) return null;
|
||||
|
||||
AbilityModifierTraits stats = ResourceParserUtils.parseAbilityModifierTraits(o);
|
||||
final ArrayList<ActorConditionEffect> addedConditions = new ArrayList<ActorConditionEffect>();
|
||||
actorConditionEffectParser_withoutDuration.parseRows(o.optJSONArray(JsonFieldNames.ItemTraits_OnEquip.addedConditions), addedConditions);
|
||||
|
||||
if (stats == null && addedConditions.isEmpty()) {
|
||||
ActorConditionEffect[] addedConditions = actorConditionEffectParser_withoutDuration.parseArray(o.optJSONArray(JsonFieldNames.ItemTraits_OnEquip.addedConditions));
|
||||
|
||||
if (stats == null && addedConditions == null) {
|
||||
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
|
||||
L.log("OPTIMIZE: Tried to parseItemTraits_OnEquip , where hasEffect=" + o.toString() + ", but all data was empty.");
|
||||
}
|
||||
return null;
|
||||
} else {
|
||||
return new ItemTraits_OnEquip(stats, listToArray(addedConditions));
|
||||
return new ItemTraits_OnEquip(stats, addedConditions);
|
||||
}
|
||||
}
|
||||
|
||||
private static ActorConditionEffect[] listToArray(ArrayList<ActorConditionEffect> list) {
|
||||
if (list.isEmpty()) return null;
|
||||
return list.toArray(new ActorConditionEffect[list.size()]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,22 +3,21 @@ 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.TranslationLoader;
|
||||
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonArrayParserFor;
|
||||
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.Arrays;
|
||||
import java.util.Comparator;
|
||||
|
||||
public final class QuestParser extends JsonCollectionParserFor<Quest> {
|
||||
private final TranslationLoader translationLoader;
|
||||
private int sortOrder = 0;
|
||||
|
||||
private final JsonParserFor<QuestLogEntry> questLogEntryParser = new JsonParserFor<QuestLogEntry>() {
|
||||
private final JsonArrayParserFor<QuestLogEntry> questLogEntryParser = new JsonArrayParserFor<QuestLogEntry>(QuestLogEntry.class) {
|
||||
@Override
|
||||
protected QuestLogEntry parseObject(JSONObject o) throws JSONException {
|
||||
return new QuestLogEntry(
|
||||
@@ -44,17 +43,15 @@ public final class QuestParser extends JsonCollectionParserFor<Quest> {
|
||||
protected Pair<String, Quest> parseObject(JSONObject o) throws JSONException {
|
||||
final String id = o.getString(JsonFieldNames.Quest.questID);
|
||||
|
||||
final ArrayList<QuestLogEntry> stages = new ArrayList<QuestLogEntry>();
|
||||
questLogEntryParser.parseRows(o.getJSONArray(JsonFieldNames.Quest.stages), stages);
|
||||
Collections.sort(stages, sortByQuestProgress);
|
||||
final QuestLogEntry[] stages_ = stages.toArray(new QuestLogEntry[stages.size()]);
|
||||
QuestLogEntry[] stages = questLogEntryParser.parseArray(o.getJSONArray(JsonFieldNames.Quest.stages));
|
||||
Arrays.sort(stages, sortByQuestProgress);
|
||||
|
||||
++sortOrder;
|
||||
|
||||
return new Pair<String, Quest>(id, new Quest(
|
||||
id
|
||||
, translationLoader.translateQuestName(o.getString(JsonFieldNames.Quest.name))
|
||||
, stages_
|
||||
, stages
|
||||
, o.optInt(JsonFieldNames.Quest.showInLog, 0) > 0
|
||||
, sortOrder
|
||||
));
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
package com.gpl.rpg.AndorsTrail.resource.parsers.json;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.lang.reflect.Array;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public abstract class JsonArrayParserFor<T> extends JsonParserFor<T> {
|
||||
private final Class<T> classType;
|
||||
|
||||
public JsonArrayParserFor(Class<T> classType) {
|
||||
if (classType == null) throw new IllegalArgumentException("classType for parseArray must not be null");
|
||||
this.classType = classType;
|
||||
}
|
||||
|
||||
public T[] parseArray(JSONArray array) throws JSONException {
|
||||
if (array == null) return null;
|
||||
final ArrayList<T> arrayList = new ArrayList<T>(array.length());
|
||||
parseRows(array, arrayList);
|
||||
if (arrayList.isEmpty()) return null;
|
||||
return arrayList.toArray((T[]) Array.newInstance(classType, arrayList.size()));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user