Merge branch 'master' of github.com:Zukero/andors-trail into mikhail

This commit is contained in:
Carceris Magister
2017-08-18 19:41:47 -04:00
5 changed files with 86 additions and 23 deletions

View File

@@ -81,6 +81,7 @@
<array name="loadresource_conversationlists">
<item>@raw/conversationlist_mikhail</item>
<item>@raw/conversationlist_mikhail_foodpoison</item>
<item>@raw/conversationlist_crossglen</item>
<item>@raw/conversationlist_crossglen_gruil</item>
<item>@raw/conversationlist_crossglen_leonid</item>

View File

@@ -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() {

View File

@@ -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;
}

View File

@@ -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<String> 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));
}
}
}

View File

@@ -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;
}
}
}