#include "DialogueEffects.h" DialogueEffectApplyResult ApplyDialogueEffects( Inventory& inventory, std::map* questStates, const std::vector& effects) { std::map requiredItems; for (const DialogueEffect& effect : effects) { if (effect.kind != DialogueEffectKind::RemoveItem) { continue; } requiredItems[effect.itemName] += effect.count; } for (const auto& [itemName, requiredCount] : requiredItems) { const int available = ItemCount(inventory, itemName); if (available < requiredCount) { return {false, itemName, requiredCount, available}; } } for (const DialogueEffect& effect : effects) { if (effect.kind == DialogueEffectKind::RemoveItem) { RemoveItem(inventory, effect.itemName, effect.count); } else if (effect.kind == DialogueEffectKind::AddItem) { AddItem(inventory, effect.itemName, effect.count); } else if (effect.kind == DialogueEffectKind::SetQuest && questStates) { (*questStates)[effect.questName] = effect.questState; } } return {true, {}, 0, 0}; } DialogueEffectApplyResult ApplyDialogueEffects(Inventory& inventory, const std::vector& effects) { return ApplyDialogueEffects(inventory, nullptr, effects); } DialogueEffectApplyResult ApplyDialogueEffects( Inventory& inventory, std::map& questStates, const std::vector& effects) { return ApplyDialogueEffects(inventory, &questStates, effects); } DialogueEffectApplyResult ApplyDialogueEffects( Inventory& inventory, QuestStateStore& questStates, const std::vector& effects) { std::map requiredItems; for (const DialogueEffect& effect : effects) { if (effect.kind != DialogueEffectKind::RemoveItem) { continue; } requiredItems[effect.itemName] += effect.count; } for (const auto& [itemName, requiredCount] : requiredItems) { const int available = ItemCount(inventory, itemName); if (available < requiredCount) { return {false, itemName, requiredCount, available}; } } for (const DialogueEffect& effect : effects) { if (effect.kind == DialogueEffectKind::RemoveItem) { RemoveItem(inventory, effect.itemName, effect.count); } else if (effect.kind == DialogueEffectKind::AddItem) { AddItem(inventory, effect.itemName, effect.count); } else if (effect.kind == DialogueEffectKind::SetQuest) { questStates.Set(effect.questName, effect.questState); } } return {true, {}, 0, 0}; }