void plLoad(U32 objId) { FILE *fh = NULL; ubyte ret; if (objId == Building_Starford_Kaserne) while ((ret = plOpen(objId, PLANING_OPEN_READ_PLAN, &fh)) != PLANING_OPEN_OK); else ret = plOpen(objId, PLANING_OPEN_READ_PLAN, &fh); if (ret == PLANING_OPEN_OK) { if (GamePlayMode & GP_GUARD_DESIGN) grdDo(fh, plSys, PersonsList, BurglarsNr, PersonsNr, GUARDS_DO_LOAD); else { LIST *l = NULL; ubyte i; ubyte goon = 1; if ((l = LoadSystem(fh, plSys))) { inpTurnESC(0); Bubble(l, 0, NULL, 0L); inpTurnESC(1); RemoveList(l); goon = 0; l = NULL; } if ((l = plLoadTools(fh))) { inpTurnESC(0); Bubble(l, 0, NULL, 0L); inpTurnESC(1); RemoveList(l); goon = 0; } if (goon) { for (i = 0; i < BurglarsNr; i++) LoadHandler(fh, plSys, OL_NR(GetNthNode(PersonsList, i))); } } dskClose(fh); } else { if (ret == PLANING_OPEN_ERR_NO_PLAN) plMessage("NO_PLAN", PLANING_MSG_REFRESH | PLANING_MSG_WAIT); } }
bool CPythonHandler::Init( CPythonEngine *engine, const char *factory, const char *nameinit, const char *namedo, const char *nameterm) { if (!engine->InitMainInterp()) return false; m_nameinit = nameinit; m_namedo = namedo; m_nameterm = nameterm; m_namefactory = factory; m_engine = engine; return LoadHandler(false); }
PyObject *CPythonHandler::Callback( HANDLER_TYPE typ, const char *format /* = NULL */, ... ) { va_list va; PyObject *args; PyObject *ret = NULL; if (format && *format) { va_start(va, format); args = Py_VaBuildValue((char *)format, va); va_end(va); } else args = PyTuple_New(0); if (args == NULL) return NULL; if (!PyTuple_Check(args)) { PyObject *a; a = PyTuple_New(1); if (a == NULL) goto done; if (PyTuple_SET_ITEM(a, 0, args) < 0) { Py_DECREF(a); goto done; } // 'args' ref consumed by _SET_ITEM. args = a; } ret = DoCallback(typ, args); if (!ret) { if (m_engine->m_reload_exception && PyErr_ExceptionMatches(m_engine->m_reload_exception)) { PyErr_Clear(); // Need to call term first PyObject *temp_args = Py_BuildValue("(i)", 0); ret = DoCallback(HANDLER_TERM, temp_args); Py_XDECREF(temp_args); if (!ret) { ExtensionError(NULL, "Terminating for reload failed"); PyErr_Clear(); } Py_XDECREF(ret); // Now force the reload and refresh of all callbacks. if (!LoadHandler(true)) goto done; Py_XDECREF(m_callback_init); m_callback_init = NULL; Py_XDECREF(m_callback_do); m_callback_do = NULL; Py_XDECREF(m_callback_term); m_callback_term = NULL; // call init again temp_args = Py_BuildValue("(z)", NULL); ret = DoCallback(HANDLER_INIT, temp_args); Py_XDECREF(temp_args); if (!ret) { ExtensionError(NULL, "Reinitializing after import failed"); PyErr_Clear(); } Py_XDECREF(ret); // And make the original call again. ret = DoCallback(typ, args); } } done: Py_DECREF(args); return ret; }