add vctest (WIP)

This commit is contained in:
MihailRis
2024-12-07 15:49:23 +03:00
parent d9bd60f473
commit 5e8805f241
16 changed files with 439 additions and 52 deletions
+54
View File
@@ -25,6 +25,7 @@
#include "util/timeutil.hpp"
#include "voxels/Block.hpp"
#include "world/Level.hpp"
#include "interfaces/Process.hpp"
using namespace scripting;
@@ -71,6 +72,59 @@ void scripting::initialize(Engine* engine) {
load_script(fs::path("classes.lua"), true);
}
class LuaCoroutine : public Process {
lua::State* L;
int id;
bool alive = true;
public:
LuaCoroutine(lua::State* L, int id) : L(L), id(id) {
}
bool isActive() const override {
return alive;
}
void update() override {
if (lua::getglobal(L, "__vc_resume_coroutine")) {
lua::pushinteger(L, id);
if (lua::call(L, 1)) {
alive = lua::toboolean(L, -1);
lua::pop(L);
}
}
}
void waitForEnd() override {
while (isActive()) {
update();
}
}
void terminate() override {
if (lua::getglobal(L, "__vc_stop_coroutine")) {
lua::pushinteger(L, id);
lua::pop(L, lua::call(L, 1));
}
}
};
std::unique_ptr<Process> scripting::start_coroutine(
const std::filesystem::path& script
) {
auto L = lua::get_main_state();
if (lua::getglobal(L, "__vc_start_coroutine")) {
auto source = files::read_string(script);
lua::loadbuffer(L, 0, source, script.filename().u8string());
if (lua::call(L, 1)) {
int id = lua::tointeger(L, -1);
lua::pop(L, 2);
return std::make_unique<LuaCoroutine>(L, id);
}
lua::pop(L);
}
return nullptr;
}
[[nodiscard]] scriptenv scripting::get_root_environment() {
return std::make_shared<int>(0);
}
+11 -8
View File
@@ -11,8 +11,6 @@
#include "typedefs.hpp"
#include "scripting_functional.hpp"
namespace fs = std::filesystem;
class Engine;
class Content;
struct ContentPack;
@@ -34,6 +32,7 @@ class Entity;
struct EntityDef;
class GeneratorScript;
struct GeneratorDef;
class Process;
namespace scripting {
extern Engine* engine;
@@ -60,6 +59,10 @@ namespace scripting {
void process_post_runnables();
std::unique_ptr<Process> start_coroutine(
const std::filesystem::path& script
);
void on_world_load(LevelController* controller);
void on_world_tick();
void on_world_save();
@@ -136,7 +139,7 @@ namespace scripting {
void load_content_script(
const scriptenv& env,
const std::string& prefix,
const fs::path& file,
const std::filesystem::path& file,
const std::string& fileName,
block_funcs_set& funcsset
);
@@ -150,7 +153,7 @@ namespace scripting {
void load_content_script(
const scriptenv& env,
const std::string& prefix,
const fs::path& file,
const std::filesystem::path& file,
const std::string& fileName,
item_funcs_set& funcsset
);
@@ -161,13 +164,13 @@ namespace scripting {
/// @param fileName script file path using the engine format
void load_entity_component(
const std::string& name,
const fs::path& file,
const std::filesystem::path& file,
const std::string& fileName
);
std::unique_ptr<GeneratorScript> load_generator(
const GeneratorDef& def,
const fs::path& file,
const std::filesystem::path& file,
const std::string& dirPath
);
@@ -179,7 +182,7 @@ namespace scripting {
void load_world_script(
const scriptenv& env,
const std::string& packid,
const fs::path& file,
const std::filesystem::path& file,
const std::string& fileName,
world_funcs_set& funcsset
);
@@ -193,7 +196,7 @@ namespace scripting {
void load_layout_script(
const scriptenv& env,
const std::string& prefix,
const fs::path& file,
const std::filesystem::path& file,
const std::string& fileName,
uidocscript& script
);