diff --git a/Event.cpp b/Event.cpp index 9a7927ef..a9f6bb43 100644 --- a/Event.cpp +++ b/Event.cpp @@ -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; diff --git a/Event.h b/Event.h index 5fa0d6b0..45b61a55 100644 --- a/Event.h +++ b/Event.h @@ -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(); diff --git a/Track.cpp b/Track.cpp index 707d820b..1ae44f9f 100644 --- a/Track.cpp +++ b/Track.cpp @@ -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; }; diff --git a/Track.h b/Track.h index 5ec9ddb6..2cb7f0a6 100644 --- a/Track.h +++ b/Track.h @@ -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); }; diff --git a/lua.cpp b/lua.cpp index ce539649..3315f07f 100644 --- a/lua.cpp +++ b/lua.cpp @@ -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) diff --git a/lua_ffi.h b/lua_ffi.h index f07c69fe..c15f3225 100644 --- a/lua_ffi.h +++ b/lua_ffi.h @@ -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"