mirror of
https://github.com/AndorsTrailRelease/andors-trail.git
synced 2026-02-13 21:28:10 +01:00
Merge branch 'master' of github.com:Zukero/andors-trail into mikhail
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user