You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lunarium_OLD/src/world/world_api.cpp

97 lines
3.4 KiB
C++

/******************************************************************************
* File - world_api.cpp
* Author - Joey Pollack
* Date - 2022/11/21 (y/m/d)
* Mod Date - 2022/11/21 (y/m/d)
* Description - The scripting api for the world interface
******************************************************************************/
#include "world_api.h"
#include "world.h"
#include <utils/logger.h>
#include <utils/helpers.h>
#include <cstdarg>
namespace lunarium
{
WrenState WorldAPI::mScriptState;
World* WorldAPI::mpWorld = nullptr;
WorldAPI::ScriptEventHandles WorldAPI::mEventHandles;
OpRes WorldAPI::Initialize(World* pWorld)
{
mpWorld = pWorld;
mScriptState.Initialize().LogIfFailed(LogCategory::GAME_SYSTEM, "Failed to initialize the world script state");
// Register foreign methods
mScriptState.RegisterForeignMethod({"WorldInterface", "WorldInterface", true, "GetComponent(_,_)", (WrenForeignMethodFn)&WorldAPI::GetVelocityComponent});
// Load the world interface script
WrenScript world_interface;
world_interface.SetModuleName("WorldInterface");
std::string code = File::ReadTextFile("world_interface.wren"); // This will eventually move to internal data
world_interface.SetScriptCode(code);
mScriptState.RunScript(&world_interface);
// Get class and method handles
mEventHandles.mWIHandle = mScriptState.GetWrenClassHandle("WorldInterface", "WorldInterface");
mEventHandles.mWIInitMethod = mScriptState.GetWrenMethodHandle("Init()");
mEventHandles.mWIDoOnLoadMethod = mScriptState.GetWrenMethodHandle("DoOnLoad()");
mEventHandles.mWIDoOnUnloadMethod = mScriptState.GetWrenMethodHandle("DoOnUnload()");
mEventHandles.mWIUpdateMethod = mScriptState.GetWrenMethodHandle("Update(_)");
// Init the interface
mScriptState.CallWrenMethod(mEventHandles.mWIInitMethod, mEventHandles.mWIHandle, {}, "WorldInterface.Init()");
return OpRes::OK();
}
void WorldAPI::Shutdown()
{
mpWorld = nullptr;
}
void WorldAPI::RunScript(WrenScript& script)
{
mScriptState.RunScript(&script);
}
void WorldAPI::InvokeEvent(Event e, ...)
{
switch (e)
{
case Event::ON_LOAD: mScriptState.CallWrenMethod(mEventHandles.mWIDoOnLoadMethod, mEventHandles.mWIHandle, {}, "WorldInterface.DoOnLoad()"); break;
case Event::ON_UNLOAD: mScriptState.CallWrenMethod(mEventHandles.mWIDoOnUnloadMethod, mEventHandles.mWIHandle, {}, "WorldInterface.DoOnUnload()"); break;
case Event::ON_UPDATE:
{
va_list args;
va_start(args, e);
double dt = va_arg(args, double);
mScriptState.CallWrenMethod(mEventHandles.mWIUpdateMethod, mEventHandles.mWIHandle, { {WrenParamType::WPT_DOUBLE, (double)dt} }, "WorldInterface.Update(dt)" );
va_end(args);
}
break;
}
}
/////////////////////////////////////////////////////////////////////
// SCRIPT API
/////////////////////////////////////////////////////////////////////
void WorldAPI::GetVelocityComponent(WrenVM* vm)
{
std::string str_entity_id = wrenGetSlotString(vm, 1);
LUUID entity_id = std::stoull(str_entity_id);
// More examples of creating foreign class instances
// https://github.com/wren-lang/wren/issues/1062
}
}