You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

62 lines
1.7 KiB

#include "lua/modules/towners.hpp"
#include <optional>
#include <unordered_map>
#include <utility>
#include <sol/sol.hpp>
#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<std::pair<int, int>> {
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