void Editor::reload_level() { reload_request = false; enabled = true; tileselect.input_type = EditorInputGui::IP_NONE; // Re/load level level = NULL; levelloaded = true; ReaderMapping::translations_enabled = false; level = LevelParser::from_file(world ? (world->get_basedir() + "/" + levelfile) : levelfile); ReaderMapping::translations_enabled = true; tileset = TileManager::current()->get_tileset(level->get_tileset()); load_sector("main"); currentsector->activate("main"); currentsector->camera->mode = Camera::MANUAL; layerselect.refresh_sector_text(); }
// initialise storage bool AP_FlashStorage::init(void) { debug("running init()\n"); // start with empty memory buffer memset(mem_buffer, 0, storage_size); // find state of sectors struct sector_header header[2]; // read headers and possibly initialise if bad signature for (uint8_t i=0; i<2; i++) { if (!flash_read(i, 0, (uint8_t *)&header[i], sizeof(header[i]))) { return false; } bool bad_header = (header[i].signature != signature); enum SectorState state = (enum SectorState)header[i].state; if (state != SECTOR_STATE_AVAILABLE && state != SECTOR_STATE_IN_USE && state != SECTOR_STATE_FULL) { bad_header = true; } // initialise if bad header if (bad_header) { return erase_all(); } } // work out the first sector to read from using sector states enum SectorState states[2] {(enum SectorState)header[0].state, (enum SectorState)header[1].state}; uint8_t first_sector; if (states[0] == states[1]) { if (states[0] != SECTOR_STATE_AVAILABLE) { return erase_all(); } first_sector = 0; } else if (states[0] == SECTOR_STATE_FULL) { first_sector = 0; } else if (states[1] == SECTOR_STATE_FULL) { first_sector = 1; } else if (states[0] == SECTOR_STATE_IN_USE) { first_sector = 0; } else if (states[1] == SECTOR_STATE_IN_USE) { first_sector = 1; } else { // doesn't matter which is first first_sector = 0; } // load data from any current sectors for (uint8_t i=0; i<2; i++) { uint8_t sector = (first_sector + i) & 1; if (states[sector] == SECTOR_STATE_IN_USE || states[sector] == SECTOR_STATE_FULL) { if (!load_sector(sector)) { return erase_all(); } } } // clear any write error write_error = false; reserved_space = 0; // if the first sector is full then write out all data so we can erase it if (states[first_sector] == SECTOR_STATE_FULL) { current_sector = first_sector ^ 1; if (!write_all()) { return erase_all(); } } // erase any sectors marked full for (uint8_t i=0; i<2; i++) { if (states[i] == SECTOR_STATE_FULL) { if (!erase_sector(i)) { return false; } } } reserved_space = 0; // ready to use return true; }