/* ArchiveManager::addArchive * Adds an archive to the archive list *******************************************************************/ bool ArchiveManager::addArchive(Archive* archive) { // Only add if archive is a valid pointer if (archive) { // Add to the list archive_t n_archive; n_archive.archive = archive; n_archive.resource = true; open_archives.push_back(n_archive); // Listen to the archive listenTo(archive); // Announce the addition announce("archive_added"); // Add to resource manager theResourceManager->addArchive(archive); // ZDoom also loads any WADs found in the root of a PK3 or directory if ((archive->getType() == ARCHIVE_ZIP || archive->getType() == ARCHIVE_FOLDER) && auto_open_wads_root) { ArchiveTreeNode* root = archive->getRoot(); ArchiveEntry* entry; EntryType* type; for (unsigned a = 0; a < root->numEntries(); a++) { entry = root->getEntry(a); if (entry->getType() == EntryType::unknownType()) EntryType::detectEntryType(entry); type = entry->getType(); if (type->getId() == "wad") // First true: yes, manage this // Second true: open silently, don't open a tab for it openArchive(entry, true, true); } } return true; } else return false; }
/* EntryType::readEntryTypeDefinition * Reads in a block of entry type definitions. Returns false if there * was a parsing error, true otherwise *******************************************************************/ bool EntryType::readEntryTypeDefinition(MemChunk& mc) { // Parse the definition Parser p; p.parseText(mc); // Get entry_types tree ParseTreeNode* pt_etypes = (ParseTreeNode*)(p.parseTreeRoot()->getChild("entry_types")); // Check it exists if (!pt_etypes) return false; // Go through all parsed types for (unsigned a = 0; a < pt_etypes->nChildren(); a++) { // Get child as ParseTreeNode ParseTreeNode* typenode = (ParseTreeNode*)pt_etypes->getChild(a); // Create new entry type EntryType* ntype = new EntryType(typenode->getName().Lower()); // Copy from existing type if inherited if (!typenode->getInherit().IsEmpty()) { EntryType* parent_type = EntryType::getType(typenode->getInherit().Lower()); if (parent_type != EntryType::unknownType()) parent_type->copyToType(ntype); else wxLogMessage("Warning: Entry type %s inherits from unknown type %s", CHR(ntype->getId()), CHR(typenode->getInherit())); } // Go through all parsed fields for (unsigned b = 0; b < typenode->nChildren(); b++) { // Get child as ParseTreeNode ParseTreeNode* fieldnode = (ParseTreeNode*)typenode->getChild(b); // Process it if (S_CMPNOCASE(fieldnode->getName(), "name")) // Name field { ntype->name = fieldnode->getStringValue(); } else if (S_CMPNOCASE(fieldnode->getName(), "detectable")) // Detectable field { ntype->detectable = fieldnode->getBoolValue(); } else if (S_CMPNOCASE(fieldnode->getName(), "export_ext")) // Export Extension field { ntype->extension = fieldnode->getStringValue(); } else if (S_CMPNOCASE(fieldnode->getName(), "format")) // Format field { string format_string = fieldnode->getStringValue(); ntype->format = EntryDataFormat::getFormat(format_string); // Warn if undefined format if (ntype->format == EntryDataFormat::anyFormat()) wxLogMessage("Warning: Entry type %s requires undefined format %s", CHR(ntype->getId()), CHR(format_string)); } else if (S_CMPNOCASE(fieldnode->getName(), "icon")) // Icon field { ntype->icon = fieldnode->getStringValue(); } else if (S_CMPNOCASE(fieldnode->getName(), "editor")) // Editor field (to be removed) { ntype->editor = fieldnode->getStringValue(); } else if (S_CMPNOCASE(fieldnode->getName(), "section")) // Section field { ntype->section = fieldnode->getStringValue(); } else if (S_CMPNOCASE(fieldnode->getName(), "match_ext")) // Match Extension field { for (unsigned v = 0; v < fieldnode->nValues(); v++) ntype->match_extension.push_back(fieldnode->getStringValue(v).Lower()); } else if (S_CMPNOCASE(fieldnode->getName(), "match_name")) // Match Name field { for (unsigned v = 0; v < fieldnode->nValues(); v++) ntype->match_name.push_back(fieldnode->getStringValue(v).Lower()); } else if (S_CMPNOCASE(fieldnode->getName(), "match_extorname")) // Match name or extension { ntype->matchextorname = fieldnode->getBoolValue(); } else if (S_CMPNOCASE(fieldnode->getName(), "size")) // Size field { for (unsigned v = 0; v < fieldnode->nValues(); v++) ntype->match_size.push_back(fieldnode->getIntValue(v)); } else if (S_CMPNOCASE(fieldnode->getName(), "min_size")) // Min Size field { ntype->size_limit[0] = fieldnode->getIntValue(); } else if (S_CMPNOCASE(fieldnode->getName(), "max_size")) // Max Size field { ntype->size_limit[1] = fieldnode->getIntValue(); } else if (S_CMPNOCASE(fieldnode->getName(), "size_multiple")) // Size Multiple field { for (unsigned v = 0; v < fieldnode->nValues(); v++) ntype->size_multiple.push_back(fieldnode->getIntValue(v)); } else if (S_CMPNOCASE(fieldnode->getName(), "reliability")) // Reliability field { ntype->reliability = fieldnode->getIntValue(); } else if (S_CMPNOCASE(fieldnode->getName(), "match_archive")) // Archive field { for (unsigned v = 0; v < fieldnode->nValues(); v++) ntype->match_archive.push_back(fieldnode->getStringValue(v).Lower()); } else if (S_CMPNOCASE(fieldnode->getName(), "extra")) // Extra properties { for (unsigned v = 0; v < fieldnode->nValues(); v++) ntype->extra.addFlag(fieldnode->getStringValue(v)); } else if (S_CMPNOCASE(fieldnode->getName(), "category")) // Type category { ntype->category = fieldnode->getStringValue(); // Add to category list if needed bool exists = false; for (unsigned b = 0; b < entry_categories.size(); b++) { if (S_CMPNOCASE(entry_categories[b], ntype->category)) { exists = true; break; } } if (!exists) entry_categories.push_back(ntype->category); } else if (S_CMPNOCASE(fieldnode->getName(), "image_format")) // Image format hint ntype->extra["image_format"] = fieldnode->getStringValue(0); else if (S_CMPNOCASE(fieldnode->getName(), "colour")) // Colour { if (fieldnode->nValues() >= 3) ntype->colour = rgba_t(fieldnode->getIntValue(0), fieldnode->getIntValue(1), fieldnode->getIntValue(2)); else wxLogMessage("Not enough colour components defined for entry type %s", CHR(ntype->getId())); } else { // Unhandled properties can go into 'extra', only their first value is kept ntype->extra[fieldnode->getName()] = fieldnode->getStringValue(); } } //ntype->dump(); ntype->addToList(); } return true; }