void run_function_on_non_blocking_thread(NonBlockingScriptFunction* funcToRun) { update_script_mouse_coords(); int room_changes_was = play.room_changes; funcToRun->atLeastOneImplementationExists = false; // run modules // modules need a forkedinst for this to work for (int kk = 0; kk < numScriptModules; kk++) { funcToRun->moduleHasFunction[kk] = moduleInstFork[kk]->DoRunScriptFuncCantBlock(funcToRun, funcToRun->moduleHasFunction[kk]); if (room_changes_was != play.room_changes) return; } funcToRun->globalScriptHasFunction = gameinstFork->DoRunScriptFuncCantBlock(funcToRun, funcToRun->globalScriptHasFunction); if (room_changes_was != play.room_changes) return; funcToRun->roomHasFunction = roominstFork->DoRunScriptFuncCantBlock(funcToRun, funcToRun->roomHasFunction); }
int PrepareTextScript(ccInstance *sci, const char**tsname) { ccError = 0; // FIXME: try to make it so this function is not called with NULL sci if (sci == nullptr) return -1; if (sci->GetSymbolAddress(tsname[0]).IsNull()) { ccErrorString = "no such function in script"; return -2; } if (sci->IsBeingRun()) { ccErrorString = "script is already in execution"; return -3; } scripts[num_scripts].init(); scripts[num_scripts].inst = sci; // CHECKME: this conditional block will never run, because // function would have quit earlier (deprecated functionality?) if (sci->IsBeingRun()) { scripts[num_scripts].inst = sci->Fork(); if (scripts[num_scripts].inst == nullptr) quit("unable to fork instance for secondary script"); scripts[num_scripts].forked = 1; } curscript = &scripts[num_scripts]; num_scripts++; if (num_scripts >= MAX_SCRIPT_AT_ONCE) quit("too many nested text script instances created"); // in case script_run_another is the function name, take a backup strncpy(scfunctionname, tsname[0], MAX_FUNCTION_NAME_LEN); tsname[0] = &scfunctionname[0]; update_script_mouse_coords(); inside_script++; // aborted_ip=0; // abort_executor=0; return 0; }