/* MapEditorWindow::saveMapAs * Saves the current map to a new archive *******************************************************************/ bool MapEditorWindow::saveMapAs() { // Show dialog SFileDialog::fd_info_t info; if (!SFileDialog::saveFile(info, "Save Map As", "Wad Archives (*.wad)|*.wad", this)) return false; // Create new, empty wad WadArchive wad; ArchiveEntry* head = wad.addNewEntry(mdesc_current.name); ArchiveEntry* end = NULL; if (mdesc_current.format == MAP_UDMF) { wad.addNewEntry("TEXTMAP"); end = wad.addNewEntry("ENDMAP"); } else { wad.addNewEntry("THINGS"); wad.addNewEntry("LINEDEFS"); wad.addNewEntry("SIDEDEFS"); wad.addNewEntry("VERTEXES"); end = wad.addNewEntry("SECTORS"); } // Save map data mdesc_current.head = head; mdesc_current.archive = false; mdesc_current.end = end; saveMap(); // Write wad to file wad.save(info.filenames[0]); Archive* archive = theArchiveManager->openArchive(info.filenames[0], true, true); theArchiveManager->addRecentFile(info.filenames[0]); // Update current map description vector<Archive::mapdesc_t> maps = archive->detectMaps(); if (!maps.empty()) { mdesc_current.head = maps[0].head; mdesc_current.archive = false; mdesc_current.end = maps[0].end; } // Set window title SetTitle(S_FMT("SLADE - %s of %s", mdesc_current.name, wad.getFilename(false))); return true; }
/* MapEditorWindow::writeMap * Writes the current map as [name] to a wad archive and returns it *******************************************************************/ WadArchive* MapEditorWindow::writeMap(string name, bool nodes) { // Get map data entries vector<ArchiveEntry*> new_map_data; SLADEMap& map = editor.getMap(); if (mdesc_current.format == MAP_DOOM) map.writeDoomMap(new_map_data); else if (mdesc_current.format == MAP_HEXEN) map.writeHexenMap(new_map_data); else if (mdesc_current.format == MAP_UDMF) { ArchiveEntry* udmf = new ArchiveEntry("TEXTMAP"); map.writeUDMFMap(udmf); new_map_data.push_back(udmf); } else // TODO: doom64 return NULL; // Check script language bool acs = false; if (theGameConfiguration->scriptLanguage() == "acs_hexen" || theGameConfiguration->scriptLanguage() == "acs_zdoom") acs = true; // Force ACS on for Hexen map format, and off for Doom map format if (mdesc_current.format == MAP_DOOM) acs = false; if (mdesc_current.format == MAP_HEXEN) acs = true; bool dialogue = false; if (theGameConfiguration->scriptLanguage() == "usdf" || theGameConfiguration->scriptLanguage() == "zsdf") dialogue = true; // Add map data to temporary wad WadArchive* wad = new WadArchive(); wad->addNewEntry(name); // Handle fragglescript and similar content in the map header if (mdesc_current.head && mdesc_current.head->getSize() && !mdesc_current.archive) { wad->getEntry(name)->importMemChunk(mdesc_current.head->getMCData()); } for (unsigned a = 0; a < new_map_data.size(); a++) wad->addEntry(new_map_data[a]); if (acs) // BEHAVIOR wad->addEntry(panel_script_editor->compiledEntry(), "", true); if (acs && panel_script_editor->scriptEntry()->getSize() > 0) // SCRIPTS (if any) wad->addEntry(panel_script_editor->scriptEntry(), "", true); if (mdesc_current.format == MAP_UDMF) { // Add extra UDMF entries for (unsigned a = 0; a < map.udmfExtraEntries().size(); a++) wad->addEntry(map.udmfExtraEntries()[a], -1, NULL, true); wad->addNewEntry("ENDMAP"); } // Build nodes if (nodes) buildNodes(wad); // Clear current map data for (unsigned a = 0; a < map_data.size(); a++) delete map_data[a]; map_data.clear(); // Update map data for (unsigned a = 0; a < wad->numEntries(); a++) map_data.push_back(new ArchiveEntry(*(wad->getEntry(a)))); return wad; }