diff --git a/apps/openmw/mwlua/types/levelledlist.cpp b/apps/openmw/mwlua/types/levelledlist.cpp index 3eab8b9f86..cb3bd7a6bc 100644 --- a/apps/openmw/mwlua/types/levelledlist.cpp +++ b/apps/openmw/mwlua/types/levelledlist.cpp @@ -22,27 +22,36 @@ namespace MWLua { void addLevelledCreatureBindings(sol::table list, const Context& context) { - auto item = context.mLua->sol().new_usertype("ESM3_LevelledListItem"); + auto& state = context.mLua->sol(); + auto item = state.new_usertype("ESM3_LevelledListItem"); item["id"] = sol::readonly_property( - [](const ESM::LevelledListBase::LevelItem& rec) { return rec.mId.serializeText(); }); - item["level"] = sol::readonly_property([](const ESM::LevelledListBase::LevelItem& rec) { return rec.mLevel; }); - item[sol::meta_function::to_string] = [](const ESM::LevelledListBase::LevelItem& rec) { + [](const ESM::LevelledListBase::LevelItem& rec) -> std::string { return rec.mId.serializeText(); }); + item["level"] + = sol::readonly_property([](const ESM::LevelledListBase::LevelItem& rec) -> int { return rec.mLevel; }); + item[sol::meta_function::to_string] = [](const ESM::LevelledListBase::LevelItem& rec) -> std::string { return "ESM3_LevelledListItem[" + rec.mId.toDebugString() + ", " + std::to_string(rec.mLevel) + "]"; }; addRecordFunctionBinding(list, context); - auto record = context.mLua->sol().new_usertype("ESM3_CreatureLevelledList"); - record[sol::meta_function::to_string] = [](const ESM::CreatureLevList& rec) { + auto record = state.new_usertype("ESM3_CreatureLevelledList"); + record[sol::meta_function::to_string] = [](const ESM::CreatureLevList& rec) -> std::string { return "ESM3_CreatureLevelledList[" + rec.mId.toDebugString() + "]"; }; - record["id"] = sol::readonly_property([](const ESM::CreatureLevList& rec) { return rec.mId.serializeText(); }); - record["chanceNone"] = sol::readonly_property([](const ESM::CreatureLevList& rec) { return rec.mChanceNone; }); - record["creatures"] = sol::readonly_property([](const ESM::CreatureLevList& rec) { return rec.mList; }); + record["id"] = sol::readonly_property( + [](const ESM::CreatureLevList& rec) -> std::string { return rec.mId.serializeText(); }); + record["chanceNone"] = sol::readonly_property( + [](const ESM::CreatureLevList& rec) -> float { return std::clamp(rec.mChanceNone / 100.f, 0.f, 1.f); }); + record["creatures"] = sol::readonly_property([&](const ESM::CreatureLevList& rec) -> sol::table { + sol::table res(state, sol::create); + for (size_t i = 0; i < rec.mList.size(); ++i) + res[i + 1] = rec.mList[i]; + return res; + }); record["calculateFromAllLevels"] = sol::readonly_property( [](const ESM::CreatureLevList& rec) -> bool { return rec.mFlags & ESM::CreatureLevList::AllLevels; }); - record["getRandomId"] = [](const ESM::CreatureLevList& rec, int level) { + record["getRandomId"] = [](const ESM::CreatureLevList& rec, int level) -> std::string { auto& prng = MWBase::Environment::get().getWorld()->getPrng(); return MWMechanics::getLevelledItem(&rec, true, prng, level).serializeText(); }; diff --git a/files/lua_api/openmw/types.lua b/files/lua_api/openmw/types.lua index 95cd7acd42..8b86e7f816 100644 --- a/files/lua_api/openmw/types.lua +++ b/files/lua_api/openmw/types.lua @@ -1405,7 +1405,7 @@ --- -- @type CreatureLevelledListRecord -- @field #string id Record id --- @field #number chanceNone Chance this list won't spawn anything [0-100] +-- @field #number chanceNone Chance this list won't spawn anything [0-1] -- @field #boolean calculateFromAllLevels Calculate from all levels <= player level, not just the closest below player -- @field #list<#LevelledListItem> creatures