Merge pull request #9 from Zukero/requirements_negation

Added requirement negation capability :
This commit is contained in:
Oskar Wiksten
2013-10-23 09:22:22 -07:00
6 changed files with 37 additions and 14 deletions

View File

@@ -149,35 +149,47 @@ public final class ConversationController {
public static boolean canFulfillRequirement(WorldContext world, Requirement requirement) {
Player player = world.model.player;
GameStatistics stats = world.model.statistics;
boolean result = false;
switch (requirement.requireType) {
case questProgress:
return player.hasExactQuestProgress(requirement.requireID, requirement.value);
result = player.hasExactQuestProgress(requirement.requireID, requirement.value);
break;
case questLatestProgress:
return player.isLatestQuestProgress(requirement.requireID, requirement.value);
result = player.isLatestQuestProgress(requirement.requireID, requirement.value);
break;
case wear:
return player.inventory.isWearing(requirement.requireID, requirement.value);
result = player.inventory.isWearing(requirement.requireID, requirement.value);
break;
case inventoryKeep:
case inventoryRemove:
if (ItemTypeCollection.isGoldItemType(requirement.requireID)) {
return player.inventory.gold >= requirement.value;
result = player.inventory.gold >= requirement.value;
} else {
return player.inventory.hasItem(requirement.requireID, requirement.value);
result = player.inventory.hasItem(requirement.requireID, requirement.value);
}
break;
case skillLevel:
return player.getSkillLevel(SkillCollection.SkillID.valueOf(requirement.requireID)) >= requirement.value;
result = player.getSkillLevel(SkillCollection.SkillID.valueOf(requirement.requireID)) >= requirement.value;
break;
case killedMonster:
return stats.getNumberOfKillsForMonsterType(requirement.requireID) >= requirement.value;
result = stats.getNumberOfKillsForMonsterType(requirement.requireID) >= requirement.value;
break;
case timerElapsed:
return world.model.worldData.hasTimerElapsed(requirement.requireID, requirement.value);
result = world.model.worldData.hasTimerElapsed(requirement.requireID, requirement.value);
break;
case usedItem:
return stats.getNumberOfTimesItemHasBeenUsed(requirement.requireID) >= requirement.value;
result = stats.getNumberOfTimesItemHasBeenUsed(requirement.requireID) >= requirement.value;
break;
case spentGold:
return stats.getSpentGold() >= requirement.value;
result = stats.getSpentGold() >= requirement.value;
break;
case consumedBonemeals:
return stats.getNumberOfUsedBonemealPotions() >= requirement.value;
result = stats.getNumberOfUsedBonemealPotions() >= requirement.value;
break;
default:
return true;
result = true;
}
return requirement.negate ? !result : result;
}
public static void requirementFulfilled(WorldContext world, Requirement requirement) {

View File

@@ -121,6 +121,7 @@ public final class TMXMapTranslator {
String requireId = null;
int requireValue = 0;
String phraseID = "";
boolean requireNegation = false;
for (TMXProperty p : object.properties) {
if (p.name.equalsIgnoreCase("phrase")) {
phraseID = p.value;
@@ -130,11 +131,13 @@ public final class TMXMapTranslator {
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 + "\".");
}
}
mapObjects.add(MapObject.createKeyArea(position, phraseID, new Requirement(requireType, requireId, requireValue), group.name));
mapObjects.add(MapObject.createKeyArea(position, phraseID, new Requirement(requireType, requireId, requireValue, requireNegation), group.name));
} else if (object.type.equals("rest")) {
mapObjects.add(MapObject.createRestArea(position, object.name, group.name));
} else if (object.type.equals("container")) {

View File

@@ -18,11 +18,13 @@ public final class Requirement {
public final RequirementType requireType;
public final String requireID;
public final int value;
public final boolean negate;
public Requirement(RequirementType requireType, String requireID, int value) {
public Requirement(RequirementType requireType, String requireID, int value, boolean negate) {
this.requireType = requireType;
this.requireID = requireID;
this.value = value;
this.negate = negate;
}
public String toString() {
@@ -30,6 +32,7 @@ public final class Requirement {
buf.append("--");
buf.append(requireID);
buf.append("--");
if (negate) buf.append("!");
buf.append(value);
return buf.toString();
}

View File

@@ -25,6 +25,7 @@ public final class ConversationListParser extends JsonCollectionParserFor<Phrase
Requirement.RequirementType.valueOf(o.getString(JsonFieldNames.ReplyRequires.requireType))
,o.getString(JsonFieldNames.ReplyRequires.requireID)
,o.optInt(JsonFieldNames.ReplyRequires.value, 0)
,o.optBoolean(JsonFieldNames.ReplyRequires.negate, false)
);
}
};

View File

@@ -76,6 +76,7 @@ public final class JsonFieldNames {
public static final String requireType = "requireType";
public static final String requireID = "requireID";
public static final String value = "value";
public static final String negate = "negate";
}
public static final class PhraseReward {

View File

@@ -198,6 +198,9 @@
<option value="consumedBonemeals">Bonemeals consumed (greater or equals)</option>
</select>
</div>
<div class="filedWithLabel">
<label class="checkbox"><input type="checkbox" id="requirenegation" ng-model="require.negate" />Negate this requirement</label>
</div>
<div ng-show="require.requireType=='questProgress'">
<div class="fieldWithLabel">
<label for="requireID" >Quest ID:</label>