16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-19 09:59:18 +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
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 ) ) {
// 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
++Event->iQueued; // zabezpieczenie przed podwójnym dodaniem do kolejki
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 ) {
// doliczenie losowego czasu opóźnienia
Event->fStartTime += Event->fRandomDelay * Random( 10000 ) * 0.0001;

View File

@@ -140,7 +140,7 @@ public:
FindEvent( std::string const &Name );
// legacy method, inserts specified event in the event query
bool
AddToQuery( TEvent *Event, TDynamicObject *Owner );
AddToQuery( TEvent *Event, TDynamicObject *Owner, double delay = 0.0 );
// legacy method, executes queued events
bool
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
TIsolated *p = pRoot;
while (p)
@@ -92,6 +92,8 @@ TIsolated * TIsolated::Find(std::string const &n)
return p;
p = p->pNext;
}
if (!create)
return nullptr;
pRoot = new TIsolated(n, pRoot); // BUG: source of a memory leak
return pRoot;
};

View File

@@ -102,7 +102,7 @@ public:
TIsolated(const std::string &n, TIsolated *i);
// methods
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
bool Busy() {
return (iAxles > 0); };

25
lua.cpp
View File

@@ -65,13 +65,14 @@ int lua::openffi(lua_State *s)
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();
event->bEnabled = true;
event->Type = tp_Lua;
event->asName = std::string(name);
event->fDelay = delay;
event->fRandomDelay = randomdelay;
event->Params[0].asPointer = (void*)handler;
if (simulation::Events.insert(event))
return event;
@@ -108,6 +109,24 @@ extern "C"
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)
{
if (e)
@@ -122,10 +141,10 @@ extern "C"
return nullptr;
}
EXPORT void scriptapi_event_dispatch(TEvent *e, TDynamicObject *activator)
EXPORT void scriptapi_event_dispatch(TEvent *e, TDynamicObject *activator, double delay)
{
if (e)
simulation::Events.AddToQuery(e, activator);
simulation::Events.AddToQuery(e, activator, delay);
}
EXPORT double scriptapi_random(double a, double b)

View File

@@ -4,18 +4,22 @@ const char lua_ffi[] = "local ffi = require(\"ffi\")\n"
"\n"
"typedef struct TEvent TEvent;\n"
"typedef struct TTrack TTrack;\n"
"typedef struct TIsolated TIsolated;\n"
"typedef struct TDynamicObject TDynamicObject;\n"
"typedef struct TMemCell TMemCell;\n"
"typedef struct memcell_values memcell_values;\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"
"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"
"TTrack* scriptapi_track_find(const char* name);\n"
"bool scriptapi_track_isoccupied(TTrack *track);\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"
"void scriptapi_dynobj_putvalues(TDynamicObject *dyn, const char *str, double num1, double num2);\n"
"\n"
@@ -37,8 +41,8 @@ const char lua_ffi[] = "local ffi = require(\"ffi\")\n"
" return ffi.string(ns.scriptapi_event_getname(a))\n"
"end\n"
"module.event_dispatch = ns.scriptapi_event_dispatch\n"
"function module.event_dispatch_n(a, b)\n"
" ns.scriptapi_event_dispatch(ns.scriptapi_event_find(a), b)\n"
"function module.event_dispatch_n(a, b, c)\n"
" ns.scriptapi_event_dispatch(ns.scriptapi_event_find(a), b, c)\n"
"end\n"
"\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"
"end\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"
" return ffi.string(ns.scriptapi_train_getname(a))\n"
"end\n"