最终整理版

This commit is contained in:
2026-06-03 17:04:06 +08:00
commit 959055ce90
1240 changed files with 80570 additions and 0 deletions
+80
View File
@@ -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};
}