From 3bb7bf1a4a1f8f2c533d1b05037fafd7c3fb48e0 Mon Sep 17 00:00:00 2001 From: trav5 Date: Sat, 20 Apr 2024 15:47:34 +0200 Subject: [PATCH] ESM::Dialogue Lua bindings 4 --- apps/openmw/mwlua/dialoguebindings.cpp | 323 ++++++++++++------------- 1 file changed, 155 insertions(+), 168 deletions(-) diff --git a/apps/openmw/mwlua/dialoguebindings.cpp b/apps/openmw/mwlua/dialoguebindings.cpp index f9c60d8ba6..c1d26f1831 100644 --- a/apps/openmw/mwlua/dialoguebindings.cpp +++ b/apps/openmw/mwlua/dialoguebindings.cpp @@ -1,10 +1,10 @@ #include "dialoguebindings.hpp" -#include #include "apps/openmw/mwbase/environment.hpp" #include "apps/openmw/mwworld/esmstore.hpp" #include "apps/openmw/mwworld/store.hpp" #include "context.hpp" #include "object.hpp" +#include #include #include #include @@ -25,19 +25,23 @@ namespace } return nullptr; } + public: FilteredDialogueStore() - : mDialogueStore{MWBase::Environment::get().getESMStore()->get()} - {} + : mDialogueStore{ MWBase::Environment::get().getESMStore()->get() } + { + } class FilteredDialogueIterator { using DecoratedIterator = MWWorld::Store::iterator; DecoratedIterator mIter; + public: FilteredDialogueIterator(const DecoratedIterator& decoratedIterator) - : mIter{decoratedIterator} - {} + : mIter{ decoratedIterator } + { + } FilteredDialogueIterator& operator++() { @@ -60,7 +64,7 @@ namespace bool operator==(const FilteredDialogueIterator& x) const { return mIter == x.mIter; } - bool operator!=(const FilteredDialogueIterator& x) const { return not (*this == x); } + bool operator!=(const FilteredDialogueIterator& x) const { return not(*this == x); } const ESM::Dialogue& operator*() const { return *mIter; } @@ -88,12 +92,13 @@ namespace size_t getSize() const { - return std::count_if(mDialogueStore.begin(), mDialogueStore.end(), [this](const auto& d) { return d.mType == filter; }); + return std::count_if( + mDialogueStore.begin(), mDialogueStore.end(), [this](const auto& d) { return d.mType == filter; }); } iterator begin() const { - iterator result{mDialogueStore.begin()}; + iterator result{ mDialogueStore.begin() }; while (result != end() and result->mType != filter) { std::advance(result, 1); @@ -101,10 +106,7 @@ namespace return result; } - iterator end() const - { - return iterator{mDialogueStore.end()}; - } + iterator end() const { return iterator{ mDialogueStore.end() }; } }; template @@ -114,29 +116,26 @@ namespace table["record"] = sol::overload( [](const MWLua::Object& obj) -> const ESM::Dialogue* { return obj.ptr().get()->mBase; }, - [](std::string_view id) -> const ESM::Dialogue* - { + [](std::string_view id) -> const ESM::Dialogue* { return StoreT{}.search(ESM::RefId::deserializeText(Misc::StringUtils::lowerCase(id))); }); sol::state_view& lua = context.mLua->sol(); - sol::usertype storeBindingsClass = lua.new_usertype("ESM3_Dialogue_Type" + std::to_string(filter) + " Store"); - storeBindingsClass[sol::meta_function::to_string] = [](const StoreT& store) - { + sol::usertype storeBindingsClass + = lua.new_usertype("ESM3_Dialogue_Type" + std::to_string(filter) + " Store"); + storeBindingsClass[sol::meta_function::to_string] = [](const StoreT& store) { return "{" + std::to_string(store.getSize()) + " ESM3_Dialogue_Type" + std::to_string(filter) + " records}"; }; storeBindingsClass[sol::meta_function::length] = [](const StoreT& store) { return store.getSize(); }; storeBindingsClass[sol::meta_function::index] = sol::overload( - [](const StoreT& store, size_t index) -> const ESM::Dialogue* - { + [](const StoreT& store, size_t index) -> const ESM::Dialogue* { if (index == 0 or index > store.getSize()) { return nullptr; } return store.at(index - 1); }, - [](const StoreT& store, std::string_view id) -> const ESM::Dialogue* - { + [](const StoreT& store, std::string_view id) -> const ESM::Dialogue* { return store.search(ESM::RefId::deserializeText(Misc::StringUtils::lowerCase(id))); }); storeBindingsClass[sol::meta_function::ipairs] = lua["ipairsForArray"].template get(); @@ -151,7 +150,7 @@ namespace const ESM::Dialogue* getDialogueRecord() const { - const auto& dialogueStore{MWBase::Environment::get().getESMStore()->get()}; + const auto& dialogueStore{ MWBase::Environment::get().getESMStore()->get() }; return dialogueStore.search(mDialogueRecordId); } }; @@ -159,20 +158,14 @@ namespace void prepareBindingsForDialogueRecord(sol::state_view& lua) { auto recordBindingsClass = lua.new_usertype("ESM3_Dialogue"); - recordBindingsClass[sol::meta_function::to_string] = [lua](const ESM::Dialogue& rec) -> sol::object - { + recordBindingsClass[sol::meta_function::to_string] = [lua](const ESM::Dialogue& rec) -> sol::object { return sol::make_object(lua, "ESM3_Dialogue[" + rec.mId.toDebugString() + "]"); }; - recordBindingsClass["id"] = sol::readonly_property([lua](const ESM::Dialogue& rec) - { - return sol::make_object(lua, rec.mId.serializeText()); - }); - recordBindingsClass["name"] = sol::readonly_property([lua](const ESM::Dialogue& rec) - { - return sol::make_object(lua, rec.mStringId); - }); - recordBindingsClass["questName"] = sol::readonly_property([lua](const ESM::Dialogue& rec) -> sol::object - { + recordBindingsClass["id"] = sol::readonly_property( + [lua](const ESM::Dialogue& rec) { return sol::make_object(lua, rec.mId.serializeText()); }); + recordBindingsClass["name"] + = sol::readonly_property([lua](const ESM::Dialogue& rec) { return sol::make_object(lua, rec.mStringId); }); + recordBindingsClass["questName"] = sol::readonly_property([lua](const ESM::Dialogue& rec) -> sol::object { if (rec.mType != ESM::Dialogue::Type::Journal) { return sol::nil; @@ -186,36 +179,34 @@ namespace } return sol::nil; }); - recordBindingsClass["infos"] = sol::readonly_property([lua](const ESM::Dialogue& rec) - { - return DialogueInfos{rec.mId}; - }); + recordBindingsClass["infos"] + = sol::readonly_property([lua](const ESM::Dialogue& rec) { return DialogueInfos{ rec.mId }; }); } void prepareBindingsForDialogueRecordInfoList(sol::state_view& lua) { auto recordInfosBindingsClass = lua.new_usertype("ESM3_Dialogue_Infos"); - recordInfosBindingsClass[sol::meta_function::to_string] = [lua](const DialogueInfos& store) -> sol::object - { + recordInfosBindingsClass[sol::meta_function::to_string] = [lua](const DialogueInfos& store) -> sol::object { if (const ESM::Dialogue* dialogueRecord = store.getDialogueRecord()) { - return sol::make_object(lua, "{" + std::to_string(dialogueRecord->mInfo.size()) + " ESM3_Dialogue[" + dialogueRecord->mId.toDebugString() + "] info elements}"); + return sol::make_object(lua, + "{" + std::to_string(dialogueRecord->mInfo.size()) + " ESM3_Dialogue[" + + dialogueRecord->mId.toDebugString() + "] info elements}"); } return sol::nil; }; - recordInfosBindingsClass[sol::meta_function::length] = [](const DialogueInfos& store) - { + recordInfosBindingsClass[sol::meta_function::length] = [](const DialogueInfos& store) { const ESM::Dialogue* dialogueRecord = store.getDialogueRecord(); return dialogueRecord ? dialogueRecord->mInfo.size() : 0; }; - recordInfosBindingsClass[sol::meta_function::index] = [](const DialogueInfos& store, size_t index) -> const ESM::DialInfo* - { + recordInfosBindingsClass[sol::meta_function::index] + = [](const DialogueInfos& store, size_t index) -> const ESM::DialInfo* { const ESM::Dialogue* dialogueRecord = store.getDialogueRecord(); if (not dialogueRecord or index == 0 or index > dialogueRecord->mInfo.size()) { return nullptr; } - ESM::Dialogue::InfoContainer::const_iterator iter{dialogueRecord->mInfo.cbegin()}; + ESM::Dialogue::InfoContainer::const_iterator iter{ dialogueRecord->mInfo.cbegin() }; std::advance(iter, index - 1); return &(*iter); }; @@ -227,141 +218,137 @@ namespace { auto recordInfoBindingsClass = lua.new_usertype("ESM3_Dialogue_Info"); - recordInfoBindingsClass[sol::meta_function::to_string] = [lua](const ESM::DialInfo& rec) - { + recordInfoBindingsClass[sol::meta_function::to_string] = [lua](const ESM::DialInfo& rec) { return sol::make_object(lua, "ESM3_Dialogue_Info[" + rec.mId.toDebugString() + "]"); }; - recordInfoBindingsClass["id"] = sol::readonly_property([lua](const ESM::DialInfo& rec) - { - return sol::make_object(lua, rec.mId.serializeText()); - }); - recordInfoBindingsClass["text"] = sol::readonly_property([lua](const ESM::DialInfo& rec) - { - return sol::make_object(lua, rec.mResponse); - }); - recordInfoBindingsClass["questStage"] = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object - { + recordInfoBindingsClass["id"] = sol::readonly_property( + [lua](const ESM::DialInfo& rec) { return sol::make_object(lua, rec.mId.serializeText()); }); + recordInfoBindingsClass["text"] + = sol::readonly_property([lua](const ESM::DialInfo& rec) { return sol::make_object(lua, rec.mResponse); }); + recordInfoBindingsClass["questStage"] = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object { if (rec.mData.mType != ESM::Dialogue::Type::Journal) { return sol::nil; } return sol::make_object(lua, rec.mData.mJournalIndex); }); - recordInfoBindingsClass["questFinished"] = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object - { - if (rec.mData.mType != ESM::Dialogue::Type::Journal) - { - return sol::nil; - } - return sol::make_object(lua, rec.mQuestStatus == ESM::DialInfo::QuestStatus::QS_Finished); - }); - recordInfoBindingsClass["questRestart"] = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object - { - if (rec.mData.mType != ESM::Dialogue::Type::Journal) - { - return sol::nil; - } - return sol::make_object(lua, rec.mQuestStatus == ESM::DialInfo::QuestStatus::QS_Restart); - }); - recordInfoBindingsClass["filterActorId"] = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object - { - if (rec.mData.mType == ESM::Dialogue::Type::Journal) - { - return sol::nil; - } - const auto result = rec.mActor.serializeText(); - return result.empty() ? sol::nil : sol::make_object(lua, result); - }); - recordInfoBindingsClass["filterActorRace"] = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object - { - if (rec.mData.mType == ESM::Dialogue::Type::Journal) - { - return sol::nil; - } - const auto result = rec.mRace.serializeText(); - return result.empty() ? sol::nil : sol::make_object(lua, result); - }); - recordInfoBindingsClass["filterActorClass"] = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object - { - if (rec.mData.mType == ESM::Dialogue::Type::Journal) - { - return sol::nil; - } - const auto result = rec.mClass.serializeText(); - return result.empty() ? sol::nil : sol::make_object(lua, result); - }); - recordInfoBindingsClass["filterActorFaction"] = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object - { - if (rec.mData.mType == ESM::Dialogue::Type::Journal) - { - return sol::nil; - } - const auto result = rec.mFaction.serializeText(); - return result.empty() ? sol::nil : sol::make_object(lua, result); - }); - recordInfoBindingsClass["filterActorFactionRank"] = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object - { - if (rec.mData.mType == ESM::Dialogue::Type::Journal) - { - return sol::nil; - } - const auto result = rec.mData.mRank; - return result == -1 ? sol::nil : sol::make_object(lua, result); - }); - recordInfoBindingsClass["filterActorCell"] = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object - { - if (rec.mData.mType == ESM::Dialogue::Type::Journal) - { - return sol::nil; - } - const auto result = rec.mCell.serializeText(); - return result.empty() ? sol::nil : sol::make_object(lua, result); - }); - recordInfoBindingsClass["filterActorDisposition"] = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object - { - if (rec.mData.mType == ESM::Dialogue::Type::Journal) - { - return sol::nil; - } - return sol::make_object(lua, rec.mData.mDisposition); - }); - recordInfoBindingsClass["filterActorGender"] = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object - { - if (rec.mData.mType == ESM::Dialogue::Type::Journal) - { - return sol::nil; - } - const auto result = rec.mData.mGender; - return result == -1 ? sol::nil : sol::make_object(lua, result); - }); - recordInfoBindingsClass["filterPlayerFaction"] = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object - { - if (rec.mData.mType == ESM::Dialogue::Type::Journal) - { - return sol::nil; - } - const auto result = rec.mPcFaction.serializeText(); - return result.empty() ? sol::nil : sol::make_object(lua, result); - }); - recordInfoBindingsClass["filterPlayerFactionRank"] = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object - { - if (rec.mData.mType == ESM::Dialogue::Type::Journal) - { - return sol::nil; - } - const auto result = rec.mData.mPCrank; - return result == -1 ? sol::nil : sol::make_object(lua, result); - }); - recordInfoBindingsClass["sound"] = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object - { + recordInfoBindingsClass["questFinished"] + = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object { + if (rec.mData.mType != ESM::Dialogue::Type::Journal) + { + return sol::nil; + } + return sol::make_object(lua, rec.mQuestStatus == ESM::DialInfo::QuestStatus::QS_Finished); + }); + recordInfoBindingsClass["questRestart"] + = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object { + if (rec.mData.mType != ESM::Dialogue::Type::Journal) + { + return sol::nil; + } + return sol::make_object(lua, rec.mQuestStatus == ESM::DialInfo::QuestStatus::QS_Restart); + }); + recordInfoBindingsClass["filterActorId"] + = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object { + if (rec.mData.mType == ESM::Dialogue::Type::Journal) + { + return sol::nil; + } + const auto result = rec.mActor.serializeText(); + return result.empty() ? sol::nil : sol::make_object(lua, result); + }); + recordInfoBindingsClass["filterActorRace"] + = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object { + if (rec.mData.mType == ESM::Dialogue::Type::Journal) + { + return sol::nil; + } + const auto result = rec.mRace.serializeText(); + return result.empty() ? sol::nil : sol::make_object(lua, result); + }); + recordInfoBindingsClass["filterActorClass"] + = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object { + if (rec.mData.mType == ESM::Dialogue::Type::Journal) + { + return sol::nil; + } + const auto result = rec.mClass.serializeText(); + return result.empty() ? sol::nil : sol::make_object(lua, result); + }); + recordInfoBindingsClass["filterActorFaction"] + = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object { + if (rec.mData.mType == ESM::Dialogue::Type::Journal) + { + return sol::nil; + } + const auto result = rec.mFaction.serializeText(); + return result.empty() ? sol::nil : sol::make_object(lua, result); + }); + recordInfoBindingsClass["filterActorFactionRank"] + = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object { + if (rec.mData.mType == ESM::Dialogue::Type::Journal) + { + return sol::nil; + } + const auto result = rec.mData.mRank; + return result == -1 ? sol::nil : sol::make_object(lua, result); + }); + recordInfoBindingsClass["filterActorCell"] + = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object { + if (rec.mData.mType == ESM::Dialogue::Type::Journal) + { + return sol::nil; + } + const auto result = rec.mCell.serializeText(); + return result.empty() ? sol::nil : sol::make_object(lua, result); + }); + recordInfoBindingsClass["filterActorDisposition"] + = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object { + if (rec.mData.mType == ESM::Dialogue::Type::Journal) + { + return sol::nil; + } + return sol::make_object(lua, rec.mData.mDisposition); + }); + recordInfoBindingsClass["filterActorGender"] + = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object { + if (rec.mData.mType == ESM::Dialogue::Type::Journal) + { + return sol::nil; + } + const auto result = rec.mData.mGender; + return result == -1 ? sol::nil : sol::make_object(lua, result); + }); + recordInfoBindingsClass["filterPlayerFaction"] + = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object { + if (rec.mData.mType == ESM::Dialogue::Type::Journal) + { + return sol::nil; + } + const auto result = rec.mPcFaction.serializeText(); + return result.empty() ? sol::nil : sol::make_object(lua, result); + }); + recordInfoBindingsClass["filterPlayerFactionRank"] + = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object { + if (rec.mData.mType == ESM::Dialogue::Type::Journal) + { + return sol::nil; + } + const auto result = rec.mData.mPCrank; + return result == -1 ? sol::nil : sol::make_object(lua, result); + }); + recordInfoBindingsClass["sound"] = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object { if (rec.mData.mType == ESM::Dialogue::Type::Journal or rec.mSound == "") { return sol::nil; } - return sol::make_object(lua, Misc::ResourceHelpers::correctSoundPath(VFS::Path::Normalized(rec.mSound)).value()); + return sol::make_object( + lua, Misc::ResourceHelpers::correctSoundPath(VFS::Path::Normalized(rec.mSound)).value()); }); - // // mResultScript TODO - // // mSelects TODO + recordInfoBindingsClass["resultScript"] + = sol::readonly_property([lua](const ESM::DialInfo& rec) -> sol::object { + return rec.mResultScript.empty() ? sol::nil : sol::make_object(lua, rec.mResultScript); + }); } void prepareBindingsForDialogueRecords(sol::state_view& lua)