diff --git a/AndorsTrail/res/values/loadresources.xml b/AndorsTrail/res/values/loadresources.xml index 72b8bbfc7..f08a8ddaa 100644 --- a/AndorsTrail/res/values/loadresources.xml +++ b/AndorsTrail/res/values/loadresources.xml @@ -81,6 +81,7 @@ @raw/conversationlist_mikhail + @raw/conversationlist_mikhail_foodpoison @raw/conversationlist_crossglen @raw/conversationlist_crossglen_gruil @raw/conversationlist_crossglen_leonid diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MapController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MapController.java index 22a8196ad..2dcf06894 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MapController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MapController.java @@ -184,6 +184,7 @@ public final class MapController { for(ReplaceableMapSection replacement : tileMap.replacements) { if (replacement.isApplied) continue; if (!satisfiesCondition(replacement)) continue; + else ConversationController.requirementFulfilled(world, replacement.requirement); tileMap.applyReplacement(replacement); hasUpdated = true; } @@ -200,7 +201,7 @@ public final class MapController { } public boolean satisfiesCondition(ReplaceableMapSection replacement) { - return world.model.player.hasExactQuestProgress(replacement.requireQuestStage); + return ConversationController.canFulfillRequirement(world, replacement.requirement); } private final ConversationController.ConversationStatemachine.ConversationStateListener conversationStateListener = new ConversationController.ConversationStatemachine.ConversationStateListener() { diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/ReplaceableMapSection.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/ReplaceableMapSection.java index 2ad5c5fb3..b87b68004 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/ReplaceableMapSection.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/ReplaceableMapSection.java @@ -1,24 +1,24 @@ package com.gpl.rpg.AndorsTrail.model.map; -import com.gpl.rpg.AndorsTrail.model.quest.QuestProgress; +import com.gpl.rpg.AndorsTrail.model.script.Requirement; import com.gpl.rpg.AndorsTrail.util.CoordRect; public final class ReplaceableMapSection { public boolean isApplied = false; public final CoordRect replacementArea; public final MapSection replaceLayersWith; - public final QuestProgress requireQuestStage; + public final Requirement requirement; private final String group; public ReplaceableMapSection( CoordRect replacementArea , MapSection replaceLayersWith - , QuestProgress requireQuestStage + , Requirement requirement , String group ) { this.replacementArea = replacementArea; this.replaceLayersWith = replaceLayersWith; - this.requireQuestStage = requireQuestStage; + this.requirement = requirement; this.group = group; } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/TMXMapTranslator.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/TMXMapTranslator.java index 1ed1cd8ec..c85491380 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/TMXMapTranslator.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/TMXMapTranslator.java @@ -140,27 +140,18 @@ public final class TMXMapTranslator { ); spawnAreas.add(area); } else if (object.type.equalsIgnoreCase("key")) { - Requirement.RequirementType requireType = Requirement.RequirementType.questProgress; - String requireId = null; - int requireValue = 0; String phraseID = ""; - boolean requireNegation = false; for (TMXProperty p : object.properties) { if (p.name.equalsIgnoreCase("phrase")) { phraseID = p.value; - } else if (p.name.equalsIgnoreCase("requireType")) { - requireType = Requirement.RequirementType.valueOf(p.value); - } else if (p.name.equalsIgnoreCase("requireId")) { - requireId = p.value; - } else if (p.name.equalsIgnoreCase("requireValue")) { - requireValue = Integer.parseInt(p.value); - } else if (p.name.equalsIgnoreCase("requireNegation")) { - requireNegation = Boolean.parseBoolean(p.value); } else if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) { - L.log("OPTIMIZE: Map " + m.name + ", key " + object.name + "@" + topLeft.toString() + " has unrecognized property \"" + p.name + "\"."); + if (!requirementPropertiesNames.contains(p.name.toLowerCase())) { + L.log("OPTIMIZE: Map " + m.name + ", key " + object.name + "@" + topLeft.toString() + " has unrecognized property \"" + p.name + "\"."); + } } } - mapObjects.add(MapObject.createKeyArea(position, phraseID, new Requirement(requireType, requireId, requireValue, requireNegation), group.name)); + Requirement req = parseRequirement(object); + mapObjects.add(MapObject.createKeyArea(position, phraseID, req, group.name)); } else if (object.type.equals("rest")) { mapObjects.add(MapObject.createRestArea(position, object.name, group.name)); } else if (object.type.equals("container")) { @@ -205,6 +196,35 @@ public final class TMXMapTranslator { return result; } + + private static final List requirementPropertiesNames = Arrays.asList(new String[]{"requireType".toLowerCase(), "requireId".toLowerCase(), "requireValue".toLowerCase(), "requireNegation".toLowerCase()}); + + private static Requirement parseRequirement(TMXObject object) { + Requirement.RequirementType requireType = Requirement.RequirementType.questProgress; + String requireId = null; + int requireValue = 0; + boolean requireNegation = false; + for (TMXProperty p : object.properties) { + if (p.name.equalsIgnoreCase("requireType")) { + try { + requireType = Requirement.RequirementType.valueOf(p.value); + } catch (IllegalArgumentException e) { + requireType = null; + if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) { + L.log("OPTIMIZE: Unrecognized requirement type: "+p.value); + } + } + } else if (p.name.equalsIgnoreCase("requireId")) { + requireId = p.value; + } else if (p.name.equalsIgnoreCase("requireValue")) { + requireValue = Integer.parseInt(p.value); + } else if (p.name.equalsIgnoreCase("requireNegation")) { + requireNegation = Boolean.parseBoolean(p.value); + } + } + if (requireType == null) return null; + return new Requirement(requireType, requireId, requireValue, requireNegation); + } private static CoordRect getTMXObjectPosition(TMXObject object, TMXMap m) { final Coord topLeft = new Coord( @@ -272,14 +292,18 @@ public final class TMXMapTranslator { } } MapSection replacementSection = transformMapSection(map, tileCache, position, layersPerLayerName, usedTileIDs, layerNames); - QuestProgress requireQuestStage = QuestProgress.parseQuestProgress(obj.name); - if (requireQuestStage == null) { + Requirement req = parseRequirement(obj); + if (req == null || !req.isValid()) { + QuestProgress qp = QuestProgress.parseQuestProgress(obj.name); + if (qp != null) req = new Requirement(qp); + } + if (req == null || !req.isValid()) { if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) { - L.log("WARNING: Map " + map.name + " contains replace area that cannot be parsed as a quest stage."); + L.log("WARNING: Map " + map.name + " contains replace area "+obj.name+" with unparsable requirement"); } continue; } - replaceableSections.add(new ReplaceableMapSection(position, replacementSection, requireQuestStage, objectGroup.name)); + replaceableSections.add(new ReplaceableMapSection(position, replacementSection, req, objectGroup.name)); } } } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/script/Requirement.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/script/Requirement.java index e7d1399bd..d92add28d 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/script/Requirement.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/script/Requirement.java @@ -1,5 +1,7 @@ package com.gpl.rpg.AndorsTrail.model.script; +import com.gpl.rpg.AndorsTrail.model.quest.QuestProgress; + public final class Requirement { public static enum RequirementType { questProgress @@ -32,6 +34,13 @@ public final class Requirement { this.value = value; this.negate = negate; } + + public Requirement(QuestProgress qp) { + this.requireType = RequirementType.questProgress; + this.requireID = qp.questID; + this.value = qp.progress; + this.negate = false; + } public String toString() { StringBuilder buf = new StringBuilder(requireType.toString()); @@ -42,4 +51,32 @@ public final class Requirement { buf.append(value); return buf.toString(); } + + public boolean isValid() { + switch (this.requireType) { + case consumedBonemeals: + return value >= 0; + case hasActorCondition: + return requireID != null; + case inventoryKeep: + case inventoryRemove: + case usedItem: + return requireID != null && value >= 0; + case killedMonster: + return requireID != null && value >= 0; + case questLatestProgress: + case questProgress: + return requireID != null && value >= 0; + case skillLevel: + return requireID != null && value >= 0; + case spentGold: + return value >= 0; + case timerElapsed: + return requireID != null && value >= 0; + case wear: + return requireID != null; + default: + return false; + } + } }