最终整理版
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
#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};
|
||||
}
|
||||
Reference in New Issue
Block a user