Add more requirement types to phrase replies: "killed monster" & "skill level"

This commit is contained in:
Oskar Wiksten
2013-07-15 20:52:00 +02:00
parent 3b70013a98
commit b4f7d1fe42
4 changed files with 25 additions and 10 deletions

View File

@@ -133,28 +133,33 @@ public final class ConversationController {
}
}
private static boolean canSelectReply(final Player player, final Reply reply) {
private static boolean canSelectReply(final WorldContext world, final Reply reply) {
if (!reply.hasRequirements()) return true;
for (Requirement requirement : reply.requires) {
if (!playerSatisfiesRequirement(player, requirement)) return false;
if (!playerSatisfiesRequirement(world, requirement)) return false;
}
return true;
}
private static boolean playerSatisfiesRequirement(final Player player, final Requirement requirement) {
private static boolean playerSatisfiesRequirement(final WorldContext world, final Requirement requirement) {
Player player = world.model.player;
switch (requirement.requireType) {
case Phrase.Requirement.REQUIREMENT_TYPE_QUEST_PROGRESS:
case Requirement.REQUIREMENT_TYPE_QUEST_PROGRESS:
return player.hasExactQuestProgress(requirement.requireID, requirement.value);
case Phrase.Requirement.REQUIREMENT_TYPE_WEAR_KEEP:
case 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:
case Requirement.REQUIREMENT_TYPE_INVENTORY_KEEP:
case 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);
}
case Requirement.REQUIREMENT_TYPE_SKILL_LEVEL:
return player.getSkillLevel(Integer.parseInt(requirement.requireID)) >= requirement.value;
case Requirement.REQUIREMENT_TYPE_KILLED_MONSTER:
return world.model.statistics.getNumberOfKillsForMonsterType(requirement.requireID) >= requirement.value;
default:
return true;
}
@@ -241,7 +246,7 @@ public final class ConversationController {
if (currentPhrase.message == null) {
for (Reply r : currentPhrase.replies) {
if (!canSelectReply(player, r)) continue;
if (!canSelectReply(world, r)) continue;
applyReplyEffect(player, r);
proceedToPhrase(r.nextPhrase);
return;
@@ -273,7 +278,7 @@ public final class ConversationController {
}
for (Reply r : currentPhrase.replies) {
if (!canSelectReply(player, r)) continue;
if (!canSelectReply(world, r)) continue;
listener.onConversationHasReply(r, getDisplayMessage(r, player));
}
}
@@ -288,7 +293,7 @@ public final class ConversationController {
if (currentPhrase.replies.length != 1) return false;
final Reply singleReply = currentPhrase.replies[0];
if (!singleReply.text.equals(ConversationCollection.REPLY_NEXT)) return false;
if (!canSelectReply(player, singleReply)) return false;
if (!canSelectReply(world, singleReply)) return false;
return true;
}
}

View File

@@ -37,6 +37,8 @@ public final class Phrase {
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 static final int REQUIREMENT_TYPE_SKILL_LEVEL = 4; // Player needs to have a specific skill equal to or above a certain level
public static final int REQUIREMENT_TYPE_KILLED_MONSTER = 5;
public final int requireType;
public final String requireID;

View File

@@ -45,6 +45,12 @@ public final class GameStatistics {
return spentGold;
}
public int getNumberOfKillsForMonsterType(String monsterTypeID) {
Integer v = killedMonsters.get(monsterTypeID);
if (v == null) return 0;
return v;
}
public String getTop5MostCommonlyKilledMonsters(WorldContext world, Resources res) {
if (killedMonsters.isEmpty()) return null;
List<Entry<String, Integer>> entries = new ArrayList<Entry<String, Integer>>(killedMonsters.entrySet());

View File

@@ -143,6 +143,8 @@
<option value="1">Inventory &amp; item will be removed</option>
<option value="2">Inventory</option>
<option value="3">Worn equipment</option>
<option value="4">Skill level</option>
<option value="5">Killed monster</option>
</select>
</td>
<td><input type="text" size="30" ng-model="require.requireID" id="requireID" class="at-input-id"/></td>