/* MapEditorWindow::loadMapScripts * Loads any scripts from [map] into the script editor *******************************************************************/ void MapEditorWindow::loadMapScripts(Archive::mapdesc_t map) { // Don't bother if no scripting language specified if (theGameConfiguration->scriptLanguage().IsEmpty()) { // Hide script editor wxAuiManager* m_mgr = wxAuiManager::GetManager(this); wxAuiPaneInfo& p_inf = m_mgr->GetPane("script_editor"); p_inf.Show(false); m_mgr->Update(); return; } // Don't bother if new map if (!map.head) { panel_script_editor->openScripts(NULL, NULL); return; } // Check for pk3 map if (map.archive) { WadArchive* wad = new WadArchive(); wad->open(map.head->getMCData()); vector<Archive::mapdesc_t> maps = wad->detectMaps(); if (!maps.empty()) { loadMapScripts(maps[0]); wad->close(); delete wad; return; } } // Go through map entries ArchiveEntry* entry = map.head->nextEntry(); ArchiveEntry* scripts = NULL; ArchiveEntry* compiled = NULL; while (entry && entry != map.end->nextEntry()) { // Check for SCRIPTS/BEHAVIOR if (theGameConfiguration->scriptLanguage() == "acs_hexen" || theGameConfiguration->scriptLanguage() == "acs_zdoom") { if (S_CMPNOCASE(entry->getName(), "SCRIPTS")) scripts = entry; if (S_CMPNOCASE(entry->getName(), "BEHAVIOR")) compiled = entry; } // Next entry entry = entry->nextEntry(); } // Open scripts/compiled if found panel_script_editor->openScripts(scripts, compiled); }
/* MapEditorWindow::openMap * Opens [map] in the editor *******************************************************************/ bool MapEditorWindow::openMap(Archive::mapdesc_t map) { // If a map is currently open and modified, prompt to save changes if (editor.getMap().isModified()) { wxMessageDialog md(this, S_FMT("Save changes to map %s?", currentMapDesc().name), "Unsaved Changes", wxYES_NO | wxCANCEL); int answer = md.ShowModal(); if (answer == wxID_YES) saveMap(); else if (answer == wxID_CANCEL) return true; } // Show blank map this->Show(true); map_canvas->Refresh(); Layout(); Update(); Refresh(); // Clear current map data for (unsigned a = 0; a < map_data.size(); a++) delete map_data[a]; map_data.clear(); // Get map parent archive Archive* archive = NULL; if (map.head) { archive = map.head->getParent(); // Load map data if (map.archive) { WadArchive temp; temp.open(map.head->getMCData()); for (unsigned a = 0; a < temp.numEntries(); a++) map_data.push_back(new ArchiveEntry(*(temp.getEntry(a)))); } else { ArchiveEntry* entry = map.head; while (entry) { bool end = (entry == map.end); map_data.push_back(new ArchiveEntry(*entry)); entry = entry->nextEntry(); if (end) break; } } } // Set texture manager archive tex_man.setArchive(archive); // Clear current map closeMap(); // Attempt to open map theSplashWindow->show("Loading Map", true, this); bool ok = editor.openMap(map); theSplashWindow->hide(); // Show window if opened ok if (ok) { mdesc_current = map; // Read DECORATE definitions if any theGameConfiguration->parseDecorateDefs(theArchiveManager->baseResourceArchive()); for (int i = 0; i < theArchiveManager->numArchives(); ++i) theGameConfiguration->parseDecorateDefs(theArchiveManager->getArchive(i)); // Load scripts if any loadMapScripts(map); // Lock map entries lockMapEntries(); // Reset map checks panel panel_checks->reset(); map_canvas->viewFitToMap(true); map_canvas->Refresh(); // Set window title if (archive) SetTitle(S_FMT("SLADE - %s of %s", map.name, archive->getFilename(false))); else SetTitle(S_FMT("SLADE - %s (UNSAVED)", map.name)); // Create backup if (map.head && !backup_manager->writeBackup(map_data, map.head->getTopParent()->getFilename(false), map.head->getName(true))) LOG_MESSAGE(1, "Warning: Failed to backup map data"); } return ok; }