#include "lua/modules/towners.hpp" #include #include #include #include #include "engine/point.hpp" #include "lua/metadoc.hpp" #include "player.h" #include "towners.h" namespace devilution { namespace { // Map from towner type enum to Lua table name const std::unordered_map<_talker_id, const char *> TownerTableNames = { { TOWN_SMITH, "griswold" }, { TOWN_HEALER, "pepin" }, { TOWN_DEADGUY, "deadguy" }, { TOWN_TAVERN, "ogden" }, { TOWN_STORY, "cain" }, { TOWN_DRUNK, "farnham" }, { TOWN_WITCH, "adria" }, { TOWN_BMAID, "gillian" }, { TOWN_PEGBOY, "wirt" }, { TOWN_COW, "cow" }, { TOWN_FARMER, "lester" }, { TOWN_GIRL, "celia" }, { TOWN_COWFARM, "nut" }, }; void PopulateTownerTable(_talker_id townerId, sol::table &out) { LuaSetDocFn(out, "position", "()", "Returns towner coordinates", [townerId]() -> std::optional> { const Towner *towner = GetTowner(townerId); if (towner == nullptr) return std::nullopt; return std::make_pair(towner->position.x, towner->position.y); }); } } // namespace sol::table LuaTownersModule(sol::state_view &lua) { sol::table table = lua.create_table(); // Iterate over all towner types found in TSV data for (const auto &[townerId, name] : TownerLongNames) { auto tableNameIt = TownerTableNames.find(townerId); if (tableNameIt == TownerTableNames.end()) continue; // Skip if no table name mapping sol::table townerTable = lua.create_table(); PopulateTownerTable(townerId, townerTable); LuaSetDoc(table, tableNameIt->second, /*signature=*/"", name.c_str(), std::move(townerTable)); } return table; } } // namespace devilution