81 lines
2.7 KiB
C++
81 lines
2.7 KiB
C++
#include "DialogueEffects.h"
|
|
|
|
DialogueEffectApplyResult ApplyDialogueEffects(
|
|
Inventory& inventory,
|
|
std::map<std::string, std::string>* questStates,
|
|
const std::vector<DialogueEffect>& effects)
|
|
{
|
|
std::map<std::string, int> 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<DialogueEffect>& effects)
|
|
{
|
|
return ApplyDialogueEffects(inventory, nullptr, effects);
|
|
}
|
|
|
|
DialogueEffectApplyResult ApplyDialogueEffects(
|
|
Inventory& inventory,
|
|
std::map<std::string, std::string>& questStates,
|
|
const std::vector<DialogueEffect>& effects)
|
|
{
|
|
return ApplyDialogueEffects(inventory, &questStates, effects);
|
|
}
|
|
|
|
DialogueEffectApplyResult ApplyDialogueEffects(
|
|
Inventory& inventory,
|
|
QuestStateStore& questStates,
|
|
const std::vector<DialogueEffect>& effects)
|
|
{
|
|
std::map<std::string, int> 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};
|
|
}
|