Files
simian/src/ScriptBindings.cpp

116 lines
4.1 KiB
C++

#include "ScriptBindings.h"
#include "raylib.h"
#include <iostream>
#include <assert.h>
#include "log/log.h"
// Expose log level constants to AngelScript
static int AS_LOG_TRACE = 1;
static int AS_LOG_DEBUG = 2;
static int AS_LOG_INFO = 3;
static int AS_LOG_WARNING = 4;
static int AS_LOG_ERROR = 5;
static int AS_LOG_FATAL = 6;
void ScriptBindings::RegisterAll(asIScriptEngine* engine) {
// Register Print function with generic calling convention to access context
int r = engine->RegisterGlobalFunction("void Print(const string &in)",
asFUNCTION(Print), asCALL_GENERIC);
assert(r >= 0);
// Register log level constants so scripts can refer to LOG_INFO, LOG_ERROR, etc.
r = engine->RegisterGlobalProperty("int LOG_TRACE", (void*)&AS_LOG_TRACE);
assert(r >= 0);
r = engine->RegisterGlobalProperty("int LOG_DEBUG", (void*)&AS_LOG_DEBUG);
assert(r >= 0);
r = engine->RegisterGlobalProperty("int LOG_INFO", (void*)&AS_LOG_INFO);
assert(r >= 0);
r = engine->RegisterGlobalProperty("int LOG_WARNING", (void*)&AS_LOG_WARNING);
assert(r >= 0);
r = engine->RegisterGlobalProperty("int LOG_ERROR", (void*)&AS_LOG_ERROR);
assert(r >= 0);
r = engine->RegisterGlobalProperty("int LOG_FATAL", (void*)&AS_LOG_FATAL);
assert(r >= 0);
// Register Log(level, message) to allow scripts to log at different levels
r = engine->RegisterGlobalFunction("void Log(int, const string &in)",
asFUNCTION(Log), asCALL_GENERIC);
assert(r >= 0);
// Register DrawText function
r = engine->RegisterGlobalFunction("void DrawText(const string &in, int, int, int, uint)",
asFUNCTION(AS_DrawText), asCALL_CDECL);
assert(r >= 0);
}
void ScriptBindings::Print(asIScriptGeneric* gen) {
// Get the message parameter
std::string* msg = static_cast<std::string*>(gen->GetArgObject(0));
// Get the active context to retrieve script file and line number
asIScriptContext* ctx = asGetActiveContext();
if (ctx) {
const char* section = nullptr;
int line = 0;
// Get the current line number and script section
line = ctx->GetLineNumber(0, nullptr, &section);
if (section && line > 0) {
// Log with script file and line number
log_log(LOG_INFO, section, line, "%s", msg->c_str());
} else {
// Fallback if we can't get the info
log_info("%s", msg->c_str());
}
} else {
// No context available, just log normally
log_info("%s", msg->c_str());
}
}
void ScriptBindings::Log(asIScriptGeneric* gen) {
// arg0: int level, arg1: string message
int level = gen->GetArgDWord(0);
std::string* msg = static_cast<std::string*>(gen->GetArgObject(1));
// Obtain script context to fetch file/line
asIScriptContext* ctx = asGetActiveContext();
if (ctx) {
const char* section = nullptr;
int line = 0;
line = ctx->GetLineNumber(0, nullptr, &section);
if (section && line > 0) {
// Use the library's log_log to preserve filename/line info
log_log(level, section, line, "%s", msg ? msg->c_str() : "");
return;
}
}
// Fallback: log without script location
switch (level) {
case LOG_TRACE: log_trace("%s", msg ? msg->c_str() : ""); break;
case LOG_DEBUG: log_debug("%s", msg ? msg->c_str() : ""); break;
case LOG_WARNING: log_warn("%s", msg ? msg->c_str() : ""); break;
case LOG_ERROR: log_error("%s", msg ? msg->c_str() : ""); break;
case LOG_FATAL: log_fatal("%s", msg ? msg->c_str() : ""); break;
case LOG_INFO:
default:
log_info("%s", msg ? msg->c_str() : "");
break;
}
}
Color ColorFromUInt(unsigned int c) {
Color col;
col.r = (c >> 24) & 0xFF;
col.g = (c >> 16) & 0xFF;
col.b = (c >> 8) & 0xFF;
col.a = c & 0xFF;
return col;
}
void ScriptBindings::AS_DrawText(const std::string &text, int x, int y, int fontSize, unsigned int color) {
DrawText(text.c_str(), x, y, fontSize, ColorFromUInt(color));
}