@@ -280,6 +280,46 @@ namespace pg
280280 return vm->retainValue (args[0 ]);
281281 });
282282
283+ // onProcessEvent(eventName, scriptPath) - sets a script for a specific event
284+ vm->addNativeMethod (klass, " onProcessEvent" , [](VM* vm, int argCount, Value* args) -> Value {
285+ if (argCount < 3 )
286+ {
287+ throw std::runtime_error (" onEvent expects 2 arguments (eventName, scriptPath)" );
288+ }
289+
290+ ObjInstance* self = vm->asInstance (args[0 ]);
291+
292+ if (not IS_STRING (args[1 ]))
293+ {
294+ throw std::runtime_error (" onEvent expects event name to be a string" );
295+ }
296+
297+ if (not IS_STRING (args[2 ]))
298+ {
299+ throw std::runtime_error (" onEvent expects a string script path" );
300+ }
301+
302+ auto eventName = vm->asString (args[1 ]);
303+ auto scriptPath = vm->asString (args[2 ]);
304+
305+ // Get or create the event scripts vector
306+ Value eventScriptsVec = self->getField (" __eventDeferedScripts" );
307+ ObjVector* eventScripts = vm->asVector (eventScriptsVec);
308+
309+ // Store as a pair: [eventName, scriptPath]
310+ Value pair = vm->createVector ();
311+ ObjVector* pairVec = vm->asVector (pair);
312+ pairVec->fields .push_back (vm->createString (eventName));
313+ pairVec->fields .push_back (vm->createString (scriptPath));
314+
315+ eventScripts->fields .push_back (pair);
316+
317+ LOG_MILE (" StandardSysClass" , " Set event script for '" << eventName << " ': " << scriptPath);
318+
319+ // Return self for chaining
320+ return vm->retainValue (args[0 ]);
321+ });
322+
283323 // build() - finalizes and registers the system with the ECS
284324 vm->addNativeMethod (klass, " build" , [ecsRefCopy](VM* vm, int argCount, Value* args) -> Value {
285325 if (argCount < 1 )
@@ -320,6 +360,19 @@ namespace pg
320360 eventScriptMap[eventName] = scriptPath;
321361 }
322362
363+ // Build event script map
364+ _S_EventScriptMap eventDeferedScriptMap;
365+ ObjVector* eventDeferedScripts = vm->asVector (self->getField (" __eventDeferedScripts" ));
366+
367+ for (Value pairVal : eventDeferedScripts->fields )
368+ {
369+ ObjVector* pair = vm->asVector (pairVal);
370+ std::string eventName = vm->asString (pair->fields [0 ]);
371+ std::string scriptPath = vm->asString (pair->fields [1 ]);
372+
373+ eventDeferedScriptMap[eventName] = scriptPath;
374+ }
375+
323376 // Create the StandardSystemImpl
324377 auto * systemImpl = new StandardSystemImpl (
325378 systemName,
@@ -330,6 +383,7 @@ namespace pg
330383 initScript, // initScriptPath
331384 {}, // eventCallbackMap - empty, using scripts instead
332385 eventScriptMap, // eventScriptMap
386+ eventDeferedScriptMap, // deferredEventScriptMap
333387 nullptr , // executeCallback
334388 executeScript, // executeScriptPath
335389 nullptr , // saveCallback
@@ -682,6 +736,7 @@ namespace pg
682736 systemInstance->setField (" __executeScript" , vm->createString (" " ));
683737 systemInstance->setField (" __deltaScript" , vm->createString (" " ));
684738 systemInstance->setField (" __eventScripts" , vm->createVector ()); // Vector of [eventName, scriptPath] pairs
739+ systemInstance->setField (" __eventDeferedScripts" , vm->createVector ()); // Vector of [eventName, scriptPath] pairs
685740
686741 LOG_MILE (" Ecs Compiled Module" , " Created system builder for '" << systemName << " '" );
687742
0 commit comments