16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-22 19:49:19 +02:00

update lua api (details on wiki)

This commit is contained in:
milek7
2017-12-27 19:47:44 +01:00
parent 3a117dadb4
commit ccaf05e448
6 changed files with 43 additions and 12 deletions

View File

@@ -819,7 +819,7 @@ event_manager::FindEvent( std::string const &Name ) {
// legacy method, inserts specified event in the event query // legacy method, inserts specified event in the event query
bool bool
event_manager::AddToQuery( TEvent *Event, TDynamicObject *Owner ) { event_manager::AddToQuery( TEvent *Event, TDynamicObject *Owner, double delay ) {
if( ( false == Event->m_ignored ) && ( true == Event->bEnabled ) ) { if( ( false == Event->m_ignored ) && ( true == Event->bEnabled ) ) {
// jeśli może być dodany do kolejki (nie używany w skanowaniu) // jeśli może być dodany do kolejki (nie używany w skanowaniu)
@@ -869,7 +869,7 @@ event_manager::AddToQuery( TEvent *Event, TDynamicObject *Owner ) {
// standardowe dodanie do kolejki // standardowe dodanie do kolejki
++Event->iQueued; // zabezpieczenie przed podwójnym dodaniem do kolejki ++Event->iQueued; // zabezpieczenie przed podwójnym dodaniem do kolejki
WriteLog( "EVENT ADDED TO QUEUE" + ( Owner ? ( " by " + Owner->asName ) : "" ) + ": " + Event->asName ); WriteLog( "EVENT ADDED TO QUEUE" + ( Owner ? ( " by " + Owner->asName ) : "" ) + ": " + Event->asName );
Event->fStartTime = std::abs( Event->fDelay ) + Timer::GetTime(); // czas od uruchomienia scenerii Event->fStartTime = delay + std::abs( Event->fDelay ) + Timer::GetTime(); // czas od uruchomienia scenerii
if( Event->fRandomDelay > 0.0 ) { if( Event->fRandomDelay > 0.0 ) {
// doliczenie losowego czasu opóźnienia // doliczenie losowego czasu opóźnienia
Event->fStartTime += Event->fRandomDelay * Random( 10000 ) * 0.0001; Event->fStartTime += Event->fRandomDelay * Random( 10000 ) * 0.0001;

View File

@@ -140,7 +140,7 @@ public:
FindEvent( std::string const &Name ); FindEvent( std::string const &Name );
// legacy method, inserts specified event in the event query // legacy method, inserts specified event in the event query
bool bool
AddToQuery( TEvent *Event, TDynamicObject *Owner ); AddToQuery( TEvent *Event, TDynamicObject *Owner, double delay = 0.0 );
// legacy method, executes queued events // legacy method, executes queued events
bool bool
CheckQuery(); CheckQuery();

View File

@@ -83,7 +83,7 @@ void TIsolated::DeleteAll() {
} }
} }
TIsolated * TIsolated::Find(std::string const &n) TIsolated * TIsolated::Find(std::string const &n, bool create)
{ // znalezienie obiektu albo utworzenie nowego { // znalezienie obiektu albo utworzenie nowego
TIsolated *p = pRoot; TIsolated *p = pRoot;
while (p) while (p)
@@ -92,6 +92,8 @@ TIsolated * TIsolated::Find(std::string const &n)
return p; return p;
p = p->pNext; p = p->pNext;
} }
if (!create)
return nullptr;
pRoot = new TIsolated(n, pRoot); // BUG: source of a memory leak pRoot = new TIsolated(n, pRoot); // BUG: source of a memory leak
return pRoot; return pRoot;
}; };

View File

@@ -102,7 +102,7 @@ public:
TIsolated(const std::string &n, TIsolated *i); TIsolated(const std::string &n, TIsolated *i);
// methods // methods
static void DeleteAll(); static void DeleteAll();
static TIsolated * Find(const std::string &n); // znalezienie obiektu albo utworzenie nowego static TIsolated * Find(const std::string &n, bool create = true); // znalezienie obiektu albo utworzenie nowego
void Modify(int i, TDynamicObject *o); // dodanie lub odjęcie osi void Modify(int i, TDynamicObject *o); // dodanie lub odjęcie osi
bool Busy() { bool Busy() {
return (iAxles > 0); }; return (iAxles > 0); };

25
lua.cpp
View File

@@ -65,13 +65,14 @@ int lua::openffi(lua_State *s)
extern "C" extern "C"
{ {
EXPORT TEvent* scriptapi_event_create(const char* name, lua::eventhandler_t handler, double delay) EXPORT TEvent* scriptapi_event_create(const char* name, double delay, double randomdelay, lua::eventhandler_t handler)
{ {
TEvent *event = new TEvent(); TEvent *event = new TEvent();
event->bEnabled = true; event->bEnabled = true;
event->Type = tp_Lua; event->Type = tp_Lua;
event->asName = std::string(name); event->asName = std::string(name);
event->fDelay = delay; event->fDelay = delay;
event->fRandomDelay = randomdelay;
event->Params[0].asPointer = (void*)handler; event->Params[0].asPointer = (void*)handler;
if (simulation::Events.insert(event)) if (simulation::Events.insert(event))
return event; return event;
@@ -108,6 +109,24 @@ extern "C"
return false; return false;
} }
EXPORT TIsolated* scriptapi_isolated_find(const char* name)
{
std::string str(name);
TIsolated *isolated = TIsolated::Find(name, false);
if (isolated)
return isolated;
else
WriteLog("lua: missing isolated: " + str);
return nullptr;
}
EXPORT bool scriptapi_isolated_isoccupied(TIsolated* isolated)
{
if (isolated)
return isolated->Busy();
return false;
}
EXPORT const char* scriptapi_event_getname(TEvent *e) EXPORT const char* scriptapi_event_getname(TEvent *e)
{ {
if (e) if (e)
@@ -122,10 +141,10 @@ extern "C"
return nullptr; return nullptr;
} }
EXPORT void scriptapi_event_dispatch(TEvent *e, TDynamicObject *activator) EXPORT void scriptapi_event_dispatch(TEvent *e, TDynamicObject *activator, double delay)
{ {
if (e) if (e)
simulation::Events.AddToQuery(e, activator); simulation::Events.AddToQuery(e, activator, delay);
} }
EXPORT double scriptapi_random(double a, double b) EXPORT double scriptapi_random(double a, double b)

View File

@@ -4,18 +4,22 @@ const char lua_ffi[] = "local ffi = require(\"ffi\")\n"
"\n" "\n"
"typedef struct TEvent TEvent;\n" "typedef struct TEvent TEvent;\n"
"typedef struct TTrack TTrack;\n" "typedef struct TTrack TTrack;\n"
"typedef struct TIsolated TIsolated;\n"
"typedef struct TDynamicObject TDynamicObject;\n" "typedef struct TDynamicObject TDynamicObject;\n"
"typedef struct TMemCell TMemCell;\n" "typedef struct TMemCell TMemCell;\n"
"typedef struct memcell_values memcell_values;\n" "typedef struct memcell_values memcell_values;\n"
"\n" "\n"
"TEvent* scriptapi_event_create(const char* name, void (*handler)(TEvent*, TDynamicObject*), double delay);\n" "TEvent* scriptapi_event_create(const char* name, double delay, double randomdelay, void (*handler)(TEvent*, TDynamicObject*));\n"
"TEvent* scriptapi_event_find(const char* name);\n" "TEvent* scriptapi_event_find(const char* name);\n"
"const char* scriptapi_event_getname(TEvent *e);\n" "const char* scriptapi_event_getname(TEvent *e);\n"
"void scriptapi_event_dispatch(TEvent *e, TDynamicObject *activator);\n" "void scriptapi_event_dispatch(TEvent *e, TDynamicObject *activator, double delay);\n"
"\n" "\n"
"TTrack* scriptapi_track_find(const char* name);\n" "TTrack* scriptapi_track_find(const char* name);\n"
"bool scriptapi_track_isoccupied(TTrack *track);\n" "bool scriptapi_track_isoccupied(TTrack *track);\n"
"\n" "\n"
"TIsolated* scriptapi_isolated_find(const char* name);\n"
"bool scriptapi_isolated_isoccupied(TIsolated *isolated);\n"
"\n"
"const char* scriptapi_train_getname(TDynamicObject *dyn);\n" "const char* scriptapi_train_getname(TDynamicObject *dyn);\n"
"void scriptapi_dynobj_putvalues(TDynamicObject *dyn, const char *str, double num1, double num2);\n" "void scriptapi_dynobj_putvalues(TDynamicObject *dyn, const char *str, double num1, double num2);\n"
"\n" "\n"
@@ -37,8 +41,8 @@ const char lua_ffi[] = "local ffi = require(\"ffi\")\n"
" return ffi.string(ns.scriptapi_event_getname(a))\n" " return ffi.string(ns.scriptapi_event_getname(a))\n"
"end\n" "end\n"
"module.event_dispatch = ns.scriptapi_event_dispatch\n" "module.event_dispatch = ns.scriptapi_event_dispatch\n"
"function module.event_dispatch_n(a, b)\n" "function module.event_dispatch_n(a, b, c)\n"
" ns.scriptapi_event_dispatch(ns.scriptapi_event_find(a), b)\n" " ns.scriptapi_event_dispatch(ns.scriptapi_event_find(a), b, c)\n"
"end\n" "end\n"
"\n" "\n"
"module.track_find = ns.scriptapi_track_find\n" "module.track_find = ns.scriptapi_track_find\n"
@@ -47,6 +51,12 @@ const char lua_ffi[] = "local ffi = require(\"ffi\")\n"
" return ns.scriptapi_track_isoccupied(ns.scriptapi_track_find(a))\n" " return ns.scriptapi_track_isoccupied(ns.scriptapi_track_find(a))\n"
"end\n" "end\n"
"\n" "\n"
"module.isolated_find = ns.scriptapi_isolated_find\n"
"module.isolated_isoccupied = ns.scriptapi_isolated_isoccupied\n"
"function module.isolated_isoccupied_n(a)\n"
" return ns.scriptapi_isolated_isoccupied(ns.scriptapi_isolated_find(a))\n"
"end\n"
"\n"
"function module.train_getname(a)\n" "function module.train_getname(a)\n"
" return ffi.string(ns.scriptapi_train_getname(a))\n" " return ffi.string(ns.scriptapi_train_getname(a))\n"
"end\n" "end\n"