55 lines
3.0 KiB
Python
55 lines
3.0 KiB
Python
"""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 <lua.hpp>
|
|
#include "AdventureProfessionPolicy.h"
|
|
#include <cassert>
|
|
#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.')
|