/** * Load game state */ int Game_Load(const char* name) { FILE *f; char *ch, local; local = 1; for(ch=(char*)name;*ch;ch++) { if((*ch == '\\') || (*ch == '/')) { local = 0; break; } } if(local) { char token[512]; snprintf(token, 512, "save/%s", name); f = fopen(token, "rb"); if(f == NULL) { Sys_extWarn("Can not read file \"%s\"", token); return 0; } fclose(f); Engine_LuaClearTasks(); try { engine_lua.doFile(token); } catch(lua::RuntimeError& error) { Sys_DebugLog(LUA_LOG_FILENAME, "%s", error.what()); } catch(lua::LoadError& error) { Sys_DebugLog(LUA_LOG_FILENAME, "%s", error.what()); } } else { f = fopen(name, "rb"); if(f == NULL) { Sys_extWarn("Can not read file \"%s\"", name); return 0; } fclose(f); Engine_LuaClearTasks(); try { engine_lua.doFile(name); } catch(lua::RuntimeError& error) { Sys_DebugLog(LUA_LOG_FILENAME, "%s", error.what()); } catch(lua::LoadError& error) { Sys_DebugLog(LUA_LOG_FILENAME, "%s", error.what()); } } return 1; }
void World::empty() { extern EngineContainer* last_cont; last_cont = NULL; Engine_LuaClearTasks(); // De-initialize and destroy all audio objects. Audio_DeInit(); if(main_inventory_manager != NULL) { main_inventory_manager->setInventory(NULL); main_inventory_manager->setItemsType(1); // see base items } if(character) { character->m_self->room = nullptr; character->m_currentSector = nullptr; } /* entity empty must be done before rooms destroy */ entity_tree.clear(); /* Now we can delete bullet misc */ if(bt_engine_dynamicsWorld != NULL) { for(int i=bt_engine_dynamicsWorld->getNumCollisionObjects()-1;i>=0;i--) { btCollisionObject* obj = bt_engine_dynamicsWorld->getCollisionObjectArray()[i]; btRigidBody* body = btRigidBody::upcast(obj); if(body != NULL) { EngineContainer* cont = (EngineContainer*)body->getUserPointer(); body->setUserPointer(NULL); if(cont && (cont->object_type == OBJECT_BULLET_MISC)) { if(body->getMotionState()) { delete body->getMotionState(); body->setMotionState(nullptr); } body->setCollisionShape(nullptr); bt_engine_dynamicsWorld->removeRigidBody(body); cont->room = NULL; delete cont; delete body; } } } } for(auto room : rooms) { room->empty(); } rooms.clear(); flip_data.clear(); room_boxes.clear(); cameras_sinks.clear(); /*sprite empty*/ sprites.clear(); /*items empty*/ items_tree.clear(); character.reset(); skeletal_models.clear(); /*mesh empty*/ meshes.clear(); glDeleteTextures(textures.size() ,textures.data()); textures.clear(); tex_atlas.reset(); anim_sequences.clear(); }