diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ConversationController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ConversationController.java index 390b31479..7fbb69042 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ConversationController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ConversationController.java @@ -7,6 +7,7 @@ import com.gpl.rpg.AndorsTrail.context.WorldContext; import com.gpl.rpg.AndorsTrail.conversation.ConversationCollection; import com.gpl.rpg.AndorsTrail.conversation.Phrase; import com.gpl.rpg.AndorsTrail.conversation.Phrase.Reply; +import com.gpl.rpg.AndorsTrail.conversation.Phrase.Requirement; import com.gpl.rpg.AndorsTrail.conversation.Phrase.Reward; import com.gpl.rpg.AndorsTrail.model.ability.ActorCondition; import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionEffect; @@ -119,40 +120,46 @@ public final class ConversationController { } private static void applyReplyEffect(final Player player, final Reply reply) { - if (!reply.requiresItem()) return; - - if (reply.itemRequirementType == Reply.ITEM_REQUIREMENT_TYPE_INVENTORY_REMOVE) { - if (ItemTypeCollection.isGoldItemType(reply.requiresItemTypeID)) { - player.inventory.gold -= reply.requiresItemQuantity; - } else { - player.inventory.removeItem(reply.requiresItemTypeID, reply.requiresItemQuantity); + if (!reply.hasRequirements()) return; + + for (Requirement requirement : reply.requires) { + if (requirement.requireType == Requirement.REQUIREMENT_TYPE_INVENTORY_REMOVE) { + if (ItemTypeCollection.isGoldItemType(requirement.requireID)) { + player.inventory.gold -= requirement.value; + } else { + player.inventory.removeItem(requirement.requireID, requirement.value); + } } } } private static boolean canSelectReply(final Player player, final Reply reply) { - if (!hasRequiredQuestProgress(player, reply.requiresProgress)) return false; - if (!hasRequiredItems(player, reply)) return false; + if (!reply.hasRequirements()) return true; + + for (Requirement requirement : reply.requires) { + if (!playerSatisfiesRequirement(player, requirement)) return false; + } return true; } - private static boolean hasRequiredQuestProgress(final Player player, final QuestProgress progress) { - if (progress == null) return true; - return player.hasExactQuestProgress(progress); + private static boolean playerSatisfiesRequirement(final Player player, final Requirement requirement) { + switch (requirement.requireType) { + case Phrase.Requirement.REQUIREMENT_TYPE_QUEST_PROGRESS: + return player.hasExactQuestProgress(requirement.requireID, requirement.value); + case Phrase.Requirement.REQUIREMENT_TYPE_WEAR_KEEP: + return player.inventory.isWearing(requirement.requireID); + case Phrase.Requirement.REQUIREMENT_TYPE_INVENTORY_KEEP: + case Phrase.Requirement.REQUIREMENT_TYPE_INVENTORY_REMOVE: + if (ItemTypeCollection.isGoldItemType(requirement.requireID)) { + return player.inventory.gold >= requirement.value; + } else { + return player.inventory.hasItem(requirement.requireID, requirement.value); + } + default: + return true; + } } - private static boolean hasRequiredItems(final Player player, Reply reply) { - if (!reply.requiresItem()) return true; - - if (ItemTypeCollection.isGoldItemType(reply.requiresItemTypeID)) { - return player.inventory.gold >= reply.requiresItemQuantity; - } else if (reply.itemRequirementType == Reply.ITEM_REQUIREMENT_TYPE_WEAR_KEEP) { - return player.inventory.isWearing(reply.requiresItemTypeID); - } else { - return player.inventory.hasItem(reply.requiresItemTypeID, reply.requiresItemQuantity); - } - } - private static String getDisplayMessage(Phrase phrase, Player player) { return replacePlayerName(phrase.message, player); } private static String getDisplayMessage(Reply reply, Player player) { return replacePlayerName(reply.text, player); } private static String replacePlayerName(String s, Player player) { diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/conversation/Phrase.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/conversation/Phrase.java index edeef3604..a6fe9d3df 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/conversation/Phrase.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/conversation/Phrase.java @@ -17,30 +17,35 @@ public final class Phrase { } public static final class Reply { - public static final int ITEM_REQUIREMENT_TYPE_INVENTORY_REMOVE = 0; // Player must have item(s) in inventory. Items will be removed when selecting reply. - public static final int ITEM_REQUIREMENT_TYPE_INVENTORY_KEEP = 1; // Player must have item(s) in inventory. Items will NOT be removed when selecting reply. - public static final int ITEM_REQUIREMENT_TYPE_WEAR_KEEP = 2; // Player must be wearing item(s). Items will NOT be removed when selecting reply. - public final String text; public final String nextPhrase; - public final QuestProgress requiresProgress; - public final String requiresItemTypeID; - public final int requiresItemQuantity; - public final int itemRequirementType; - - public boolean requiresItem() { - if (requiresItemTypeID == null) return false; - if (requiresItemQuantity <= 0) return false; - return true; + public final Requirement[] requires; + + public boolean hasRequirements() { + return requires != null; } - public Reply(String text, String nextPhrase, QuestProgress requiresProgress, String requiresItemTypeID, int requiresItemQuantity, int itemRequirementType) { + public Reply(String text, String nextPhrase, Requirement[] requires) { this.text = text; this.nextPhrase = nextPhrase; - this.requiresProgress = requiresProgress; - this.requiresItemTypeID = requiresItemTypeID; - this.requiresItemQuantity = requiresItemQuantity; - this.itemRequirementType = itemRequirementType; + this.requires = requires; + } + } + + public static final class Requirement { + public static final int REQUIREMENT_TYPE_QUEST_PROGRESS = 0; + public static final int REQUIREMENT_TYPE_INVENTORY_REMOVE = 1; // Player must have item(s) in inventory. Items will be removed when selecting reply. + public static final int REQUIREMENT_TYPE_INVENTORY_KEEP = 2; // Player must have item(s) in inventory. Items will NOT be removed when selecting reply. + public static final int REQUIREMENT_TYPE_WEAR_KEEP = 3; // Player must be wearing item(s). Items will NOT be removed when selecting reply. + + public final int requireType; + public final String requireID; + public final int value; + + public Requirement(int requireType, String requireID, int value) { + this.requireType = requireType; + this.requireID = requireID; + this.value = value; } } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/ConversationListParser.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/ConversationListParser.java index 320d74fc4..87aa8e2c5 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/ConversationListParser.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/ConversationListParser.java @@ -3,8 +3,8 @@ package com.gpl.rpg.AndorsTrail.resource.parsers; import com.gpl.rpg.AndorsTrail.AndorsTrailApplication; import com.gpl.rpg.AndorsTrail.conversation.Phrase; import com.gpl.rpg.AndorsTrail.conversation.Phrase.Reply; +import com.gpl.rpg.AndorsTrail.conversation.Phrase.Requirement; 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; @@ -18,30 +18,24 @@ public final class ConversationListParser extends JsonCollectionParserFor requirementParser = new JsonArrayParserFor(Requirement.class) { + @Override + protected Requirement parseObject(JSONObject o) throws JSONException { + return new Requirement( + o.optInt(JsonFieldNames.ReplyRequires.requireType, Requirement.REQUIREMENT_TYPE_QUEST_PROGRESS) + ,o.getString(JsonFieldNames.ReplyRequires.requireID) + ,o.optInt(JsonFieldNames.ReplyRequires.value, 0) + ); + } + }; + private final JsonArrayParserFor replyParser = new JsonArrayParserFor(Reply.class) { @Override 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, null); - JSONObject requiresItem = requires.optJSONObject(JsonFieldNames.ReplyRequires.item); - if (requiresItem != null) { - requiresItemTypeID = requiresItem.getString(JsonFieldNames.ReplyRequiresItem.itemID); - requiresItemQuantity = requiresItem.getInt(JsonFieldNames.ReplyRequiresItem.quantity); - itemRequirementType = requiresItem.optInt(JsonFieldNames.ReplyRequiresItem.requireType, Reply.ITEM_REQUIREMENT_TYPE_INVENTORY_REMOVE); - } - } return new Reply( translationLoader.translateConversationReply(o.optString(JsonFieldNames.Reply.text, "")) ,o.getString(JsonFieldNames.Reply.nextPhraseID) - ,QuestProgress.parseQuestProgress(requiresProgress) - ,requiresItemTypeID - ,requiresItemQuantity - ,itemRequirementType + ,requirementParser.parseArray(o.optJSONArray(JsonFieldNames.Reply.requires)) ); } }; diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/json/JsonFieldNames.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/json/JsonFieldNames.java index 59b221282..38a3329eb 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/json/JsonFieldNames.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/json/JsonFieldNames.java @@ -72,14 +72,9 @@ public final class JsonFieldNames { } 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 String requireID = "requireID"; + public static final String value = "value"; } public static final class PhraseReward { diff --git a/AndorsTrailEdit/js/controllers/dialogue.js b/AndorsTrailEdit/js/controllers/dialogue.js index 6c63bd5d0..0594df151 100644 --- a/AndorsTrailEdit/js/controllers/dialogue.js +++ b/AndorsTrailEdit/js/controllers/dialogue.js @@ -13,6 +13,13 @@ var ATEditor = (function(ATEditor, model, defaults, importExport) { $scope.addReward = function(phrase) { phrase.rewards.push({}); }; + $scope.removeRequirement = function(reply, requirement) { + var idx = reply.requires.indexOf(requirement); + reply.requires.splice(idx, 1); + }; + $scope.addRequirement = function(reply) { + reply.requires.push({}); + }; $scope.proceedToPhrase = function(obj, prop) { var phraseId = obj[prop]; if (phraseId) { diff --git a/AndorsTrailEdit/js/defaults.js b/AndorsTrailEdit/js/defaults.js index c742f02f5..6220da272 100644 --- a/AndorsTrailEdit/js/defaults.js +++ b/AndorsTrailEdit/js/defaults.js @@ -44,7 +44,7 @@ var ATEditor = (function(ATEditor, _) { ,size: 0 } ,reply: { - requires: { item: { requireType: 0 } } + requires: [] } }; diff --git a/AndorsTrailEdit/js/importexport.js b/AndorsTrailEdit/js/importexport.js index 876753fd1..5d1768a21 100644 --- a/AndorsTrailEdit/js/importexport.js +++ b/AndorsTrailEdit/js/importexport.js @@ -28,8 +28,10 @@ var ATEditor = (function(ATEditor, _) { _.each(o.replies, function(reply) { ATEditor.defaults.addDefaults('reply', reply); if (reply.nextPhraseID && reply.nextPhraseID.length === 1) { reply.replyLeadsTo = reply.nextPhraseID; } - reply.requiresItems = ATEditor.utils.hasValues(reply.requires.item); - reply.requiresQuest = _.toBool(reply.requires.progress); + _.each(reply.requires, function(require) { + if (!require.requireType) { require.requireType = 0; } + }); + reply.hasRequirements = ATEditor.utils.hasValues(reply.requires); }); _.each(o.rewards, function(reward) { if (!reward.rewardType) { reward.rewardType = 0; } @@ -92,11 +94,8 @@ var ATEditor = (function(ATEditor, _) { _.each(o.replies, function(reply) { if (reply.replyLeadsTo) { reply.nextPhraseID = reply.replyLeadsTo; } delete reply.replyLeadsTo; - var requires = reply.requires; - if (!reply.requiresItems) { delete requires.item; } - delete reply.requiresItems; - if (!reply.requiresQuest) { delete requires.progress; } - delete reply.requiresQuest; + if (!o.hasRequirements) { delete o.requires; } + delete reply.hasRequirements; }); if (o.hasOnlyNextReply) { o.replies = [ { text: "N", nextPhraseID: o.nextPhraseID } ]; diff --git a/AndorsTrailEdit/js/legacyimport.js b/AndorsTrailEdit/js/legacyimport.js index a2cc18df7..0e5006fa8 100644 --- a/AndorsTrailEdit/js/legacyimport.js +++ b/AndorsTrailEdit/js/legacyimport.js @@ -239,14 +239,20 @@ var ATEditor = (function(ATEditor, model, FieldList, _) { nextPhraseID: obj.nextPhraseID }; - if (obj.requires_Progress) { result.requires = { progress: obj.requires_Progress }; } + if (obj.requires_Progress) { + result.requires = []; + result.requires.push({ + requireType: 0, + requireID: obj.requires_Progress + }); + } if (obj.requires_itemID) { - result.requires = result.requires || {}; - result.requires.item = { - itemID: obj.requires_itemID, - quantity: obj.requires_Quantity, - requireType: obj.requires_Type - }; + result.requires = result.requires || []; + result.requires.push({ + requireType: 1 + obj.requires_Type, + requireID: obj.requires_itemID, + value: obj.requires_Quantity + }); } return result; diff --git a/AndorsTrailEdit/partials/edit_dialogue.html b/AndorsTrailEdit/partials/edit_dialogue.html index 5382badf0..f7b8c5307 100644 --- a/AndorsTrailEdit/partials/edit_dialogue.html +++ b/AndorsTrailEdit/partials/edit_dialogue.html @@ -122,30 +122,36 @@
- +
-
- - -
-
- - -
-
- - -
-
- -
-
- - +
+ + + + + + + + + + + + + + + + +
TypeID + Value +
+ +
+