wearRemove requirement

wear and wearRemove behave similar and wear now also requires the value property.
adjusted dialogues with missing value property
This commit is contained in:
Gonk
2019-11-11 22:20:09 +01:00
parent 495b48cbf8
commit 3d00ae6544
6 changed files with 35 additions and 19 deletions

View File

@@ -249,7 +249,8 @@
"requires":[
{
"requireType":"wear",
"requireID":"lifetaker"
"requireID":"lifetaker",
"value":1
}
]
},
@@ -266,6 +267,7 @@
{
"requireType":"wear",
"requireID":"lifetaker",
"value":1,
"negate":true
}
]

View File

@@ -241,11 +241,11 @@ public final class ConversationController {
result.actorConditions.add(e);
}
private static void applyReplyEffect(final WorldContext world, final Reply reply) {
private static void applyReplyEffect(final WorldContext world, final Reply reply, ControllerContext controllers) {
if (!reply.hasRequirements()) return;
for (Requirement requirement : reply.requires) {
requirementFulfilled(world, requirement);
requirementFulfilled(world, requirement, controllers);
}
}
@@ -270,6 +270,7 @@ public final class ConversationController {
result = player.isLatestQuestProgress(requirement.requireID, requirement.value);
break;
case wear:
case wearRemove:
result = player.inventory.isWearing(requirement.requireID, requirement.value);
break;
case inventoryKeep:
@@ -313,7 +314,7 @@ public final class ConversationController {
return requirement.negate ? !result : result;
}
public static void requirementFulfilled(WorldContext world, Requirement requirement) {
public static void requirementFulfilled(WorldContext world, Requirement requirement, ControllerContext controllers) {
Player p = world.model.player;
switch (requirement.requireType) {
case inventoryRemove:
@@ -323,6 +324,10 @@ public final class ConversationController {
} else {
p.inventory.removeItem(requirement.requireID, requirement.value);
}
break;
case wearRemove:
controllers.itemController.removeEquippedItem(requirement.requireID, requirement.value);
break;
}
}
@@ -354,7 +359,7 @@ public final class ConversationController {
public String getCurrentPhraseID() { return currentPhraseID; }
public void playerSelectedReply(final Resources res, Reply r) {
applyReplyEffect(world, r);
applyReplyEffect(world, r, controllers);
proceedToPhrase(res, r.nextPhrase, true, true);
}
@@ -411,7 +416,7 @@ public final class ConversationController {
if (currentPhrase.message == null) {
for (Reply r : currentPhrase.replies) {
if (!canSelectReply(world, r)) continue;
applyReplyEffect(world, r);
applyReplyEffect(world, r, controllers);
proceedToPhrase(res, r.nextPhrase, applyScriptEffects, displayPhraseMessage);
return;
}

View File

@@ -383,4 +383,21 @@ public final class ItemController {
}
}
public int removeEquippedItem(String itemTypeID, int count) {
int removed = 0;
final Player player = world.model.player;
for (Inventory.WearSlot slot : Inventory.WearSlot.values()) {
ItemType type = player.inventory.getItemTypeInWearSlot(slot);
if (type != null && type.id.equals(itemTypeID)) {
player.inventory.setItemTypeInWearSlot(slot, null);
controllers.actorStatsController.removeConditionsFromUnequippedItem(player, type);
controllers.actorStatsController.recalculatePlayerStats(player);
removed++;
if (removed >= count) {
break;
}
}
}
return removed;
}
}

View File

@@ -156,7 +156,7 @@ public final class MapController {
public boolean canEnterKeyArea(MapObject area) {
if (ConversationController.canFulfillRequirement(world, area.enteringRequirement)) {
ConversationController.requirementFulfilled(world, area.enteringRequirement);
ConversationController.requirementFulfilled(world, area.enteringRequirement, controllers);
return true;
}
worldEventListeners.onPlayerSteppedOnKeyArea(area);
@@ -187,7 +187,7 @@ public final class MapController {
for(ReplaceableMapSection replacement : tileMap.replacements) {
if (replacement.isApplied) continue;
if (!satisfiesCondition(replacement)) continue;
else ConversationController.requirementFulfilled(world, replacement.requirement);
else ConversationController.requirementFulfilled(world, replacement.requirement, controllers);
tileMap.applyReplacement(replacement);
for (ReplaceableMapSection impactedReplacement : tileMap.replacements) {
if (impactedReplacement.isApplied && impactedReplacement.replacementArea.intersects(replacement.replacementArea)) {

View File

@@ -56,16 +56,7 @@ public final class Inventory extends ItemContainer {
wear[slot.ordinal()] = type;
}
public boolean isWearing(String itemTypeID) {
for(int i = 0; i < NUM_WORN_SLOTS; ++i) {
if (wear[i] == null) continue;
if (wear[i].id.equals(itemTypeID)) return true;
}
return false;
}
public boolean isWearing(String itemTypeID, int minNumber) {
if (minNumber == 0) return isWearing(itemTypeID);
for(int i = 0; i < NUM_WORN_SLOTS; ++i) {
if (wear[i] == null) continue;
if (wear[i].id.equals(itemTypeID)) minNumber--;

View File

@@ -19,6 +19,7 @@ public final class Requirement {
,hasActorCondition
,factionScore
,random
,wearRemove
}
public final RequirementType requireType;
@@ -67,6 +68,8 @@ public final class Requirement {
return requireID != null;
case inventoryKeep:
case inventoryRemove:
case wear:
case wearRemove:
case usedItem:
return requireID != null && value >= 0;
case killedMonster:
@@ -82,8 +85,6 @@ public final class Requirement {
return chance != null;
case timerElapsed:
return requireID != null && value >= 0;
case wear:
return requireID != null;
default:
return false;
}