"""Execute the production profession parser with real Lua and saved profiles.""" from pathlib import Path import subprocess import tempfile root = Path(__file__).resolve().parents[2] source = (root/'src/server/game/World/ClientlessLuaEngine.cpp').read_text() a = source.index(' lua_getfield(_state,rootTable,"professions");') b = source.index(' // All autonomous level60+', a) code = r''' #include #include "AdventureProfessionPolicy.h" #include #define TC_LOG_WARN(...) ((void)0) struct Profile { AdventureProfessionPolicy::Professions PrimaryProfessions; }; Profile parse(lua_State* _state) { Profile profile;int rootTable=lua_gettop(_state); '''+source[a:b]+r''' assert(lua_gettop(_state)==rootTable);return profile; } void check(Profile const& p,bool mining,bool herbs) { using namespace AdventureProfessionPolicy; assert(Allowed("work_mining",p.PrimaryProfessions)==mining); assert(Allowed("ore_inspect",p.PrimaryProfessions)==mining); assert(Allowed("work_smelting",p.PrimaryProfessions)==mining); assert(Allowed("work_blacksmithing",p.PrimaryProfessions)==mining); assert(Allowed("work_herbalism",p.PrimaryProfessions)==herbs); assert(Allowed("work_alchemy",p.PrimaryProfessions)==herbs); for(auto kind:{"work_first_aid","work_cooking","work_wood","profession_tools"})assert(Allowed(kind,p.PrimaryProfessions)); assert(SkillAllowed(356,p.PrimaryProfessions));assert(!SkillAllowed(99999,p.PrimaryProfessions)); } int main(int argc,char** argv) { lua_State* L=luaL_newstate();luaL_openlibs(L); assert(luaL_dofile(L,argv[1])==LUA_OK);check(parse(L),true,false);lua_settop(L,0); assert(luaL_dofile(L,argv[2])==LUA_OK);check(parse(L),false,false);lua_settop(L,0); for(auto text:{"return {}","return {professions={primary={}}}", "return {professions={primary={'Mining','unknown',17,false,{}}}}", "return {professions={primary='mining'}}","return {professions=false}"}) { assert(luaL_dostring(L,text)==LUA_OK);check(parse(L),false,false);lua_settop(L,0); } assert(luaL_dostring(L,"return {professions={primary={'herbalism','alchemy','alchemy'}}}")==LUA_OK); auto herbs=parse(L);check(herbs,false,true);assert(herbs.PrimaryProfessions.size()==2); using namespace AdventureProfessionPolicy; assert(Legacy("ore")=="work_mining"&&Legacy("forge")=="work_blacksmithing"&&Legacy("unknown").empty()); assert(!Allowed(Legacy("ore"),herbs.PrimaryProfessions)); lua_close(L); } ''' with tempfile.TemporaryDirectory(prefix='vcore-profession-profile-') as folder: cpp=Path(folder)/'test.cpp'; binary=Path(folder)/'test';cpp.write_text(code) flags=subprocess.check_output(['pkg-config','--cflags','--libs','lua5.4'],text=True).split() subprocess.run(['c++','-std=c++17','-I',str(root/'src/server/game/World'),str(cpp),'-o',str(binary),*flags],check=True) profiles=root/'src/server/scripts/Custom/clientless/adventure/profiles' subprocess.run([str(binary),str(profiles/'arthoran.lua'),str(profiles/'generic.lua')],check=True) print('Production profession parser, real Lua profiles, primary restrictions and secondary permissions passed.')