ALERROR CUniverse::LoadModule (SDesignLoadCtx &Ctx, CXMLElement *pModule) // LoadModule // // Loads the module { ALERROR error; int i; // Load all the design elements for (i = 0; i < pModule->GetContentElementCount(); i++) { CXMLElement *pElement = pModule->GetContentElement(i); if (error = LoadDesignElement(Ctx, pElement)) return error; } return NOERROR; }
ALERROR CExtension::LoadModuleContent (SDesignLoadCtx &Ctx, CXMLElement *pDesc) // LoadModulesContent // // Loads <Module> content { ALERROR error; int i; // Load all the design elements for (i = 0; i < pDesc->GetContentElementCount(); i++) { CXMLElement *pItem = pDesc->GetContentElement(i); if (error = LoadDesignElement(Ctx, pItem)) return error; } return NOERROR; }
ALERROR CUniverse::InitFromXML (SDesignLoadCtx &Ctx, CXMLElement *pElement, CResourceDb &Resources) // InitFromXML // // Initializes the universe from an XML database { ALERROR error; int i; CIDTable UNIDMap(FALSE, FALSE); m_bNoImages = Ctx.bNoResources; // Initialize code chain if (error = m_CC.Boot()) return error; if (error = InitCodeChainPrimitives()) return error; // Create some fonts m_MapLabelFont.Create(MAP_LABEL_TYPEFACE, 12); m_SignFont.Create(SIGN_TYPEFACE, 11, true); // Make sure we have the right version if (!Ctx.bNoVersionCheck) { DWORD dwVersion; // Make sure we have the latest version of the .XML dwVersion = (DWORD)pElement->GetAttributeInteger(VERSION_ATTRIB); if (fileGetProductVersion() > dwVersion) { if (Resources.IsUsingExternalGameFile()) Ctx.sError = CONSTLIT("External definitions file (Transcendence.xml) is obsolete.\nPlease remove 'Transcendence.xml' file from game folder."); else Ctx.sError = CONSTLIT("Source definitions file (Transcendence.xml) is obsolete.\nPlease download the latest version at http://www.neurohack.com/transcendence/Downloads.html."); return ERR_FAIL; } // Make sure we have the latest version of the .EXE dwVersion = (DWORD)pElement->GetAttributeInteger(MIN_VERSION_ATTRIB); if (fileGetProductVersion() < dwVersion) { Ctx.sError = CONSTLIT("Source definitions file (Transcendence.xml) requires a newer version of Transcendence.exe.\nPlease download the latest version at http://www.neurohack.com/transcendence/Downloads.html."); return ERR_FAIL; } } // Load the Main XML file for (i = 0; i < pElement->GetContentElementCount(); i++) { CXMLElement *pDesc = pElement->GetContentElement(i); if (strEquals(pDesc->GetTag(), IMAGES_TAG)) error = InitImages(Ctx, pDesc, Resources); else if (strEquals(pDesc->GetTag(), SOUNDS_TAG)) error = InitSounds(Ctx, pDesc, Resources); else if (strEquals(pDesc->GetTag(), STATION_TYPE_RESOURCES_TAG)) error = InitStationTypeResources(Ctx, pDesc); else if (strEquals(pDesc->GetTag(), STAR_SYSTEM_TYPES_TAG)) error = InitStarSystemTypes(Ctx, pDesc); else if (strEquals(pDesc->GetTag(), MODULES_TAG)) error = LoadModules(Ctx, pDesc); else error = LoadDesignElement(Ctx, pDesc); // Check for error if (error) return error; } return NOERROR; }
ALERROR CExtension::Load (ELoadStates iDesiredState, IXMLParserController *pResolver, bool bNoResources, bool bKeepXML, CString *retsError) // Load // // Makes sure that the extension is fully loaded. { ALERROR error; int i; switch (m_iLoadState) { case loadNone: { *retsError = CONSTLIT("Unable to load."); return ERR_FAIL; } case loadEntities: case loadAdventureDesc: { if (iDesiredState == loadNone || iDesiredState == loadEntities) return NOERROR; else if (iDesiredState == loadAdventureDesc && m_iLoadState == loadAdventureDesc) return NOERROR; // Open the file CResourceDb ExtDb(m_sFilespec, true); if (error = ExtDb.Open(DFOPEN_FLAG_READ_ONLY, retsError)) return ERR_FAIL; // Setup SDesignLoadCtx Ctx; Ctx.sResDb = m_sFilespec; Ctx.pResDb = &ExtDb; Ctx.bNoVersionCheck = true; // Obsolete now Ctx.bNoResources = bNoResources; Ctx.bKeepXML = bKeepXML; Ctx.bLoadAdventureDesc = (iDesiredState == loadAdventureDesc && m_iType == extAdventure); Ctx.sErrorFilespec = m_sFilespec; // If this is a registered extension then compute a digest for the // file (so that we can compare against the cloud's digest). // // We need to do this even if we fail later because we don't want to // have to recalc it later. if (m_Digest.IsEmpty() && GetFolderType() == folderCollection && IsRegistered()) { if (error = fileCreateDigest(m_sFilespec, &m_Digest)) { *retsError = strPatternSubst(CONSTLIT("Unable to compute digest for: %s."), m_sFilespec); return error; } } // If we've already loaded a root element, then we need to clean up if (m_pRootXML) CleanUpXML(); // Parse the XML file into a structure if (error = ExtDb.LoadGameFile(&m_pRootXML, pResolver, retsError)) { // If we're in debug mode then this is a real error. if (g_pUniverse->InDebugMode() && !ExtDb.IsTDB()) { if (retsError) *retsError = strPatternSubst(CONSTLIT("Error parsing %s: %s"), m_sFilespec, *retsError); return ERR_FAIL; } // Otherwise, we try to continue as if nothing bad had happened, but we // disable the extension. else { SetDisabled((retsError ? *retsError : CONSTLIT("Unable to load"))); return NOERROR; } } // Set up context Ctx.pExtension = this; // Load all the design elements for (i = 0; i < m_pRootXML->GetContentElementCount(); i++) { CXMLElement *pItem = m_pRootXML->GetContentElement(i); if (error = LoadDesignElement(Ctx, pItem)) { if (!bKeepXML) { delete m_pRootXML; m_pRootXML = NULL; } if (g_pUniverse->InDebugMode() && !ExtDb.IsTDB()) return ComposeLoadError(Ctx, retsError); SetDisabled(Ctx.sError); return NOERROR; } } // Restore Ctx.pExtension = NULL; // Done m_iLoadState = (m_iType == extAdventure ? iDesiredState : loadComplete); if (!bKeepXML) { delete m_pRootXML; m_pRootXML = NULL; } // If we get this far and we have no libraries, then include the // compatibility library. if (m_iLoadState == loadComplete) AddDefaultLibraryReferences(Ctx); // Debug output switch (m_iType) { case extAdventure: if (m_iLoadState == loadAdventureDesc) kernelDebugLogMessage("Loaded adventure desc: %s", m_sFilespec); else kernelDebugLogMessage("Loaded adventure: %s", m_sFilespec); break; case extExtension: kernelDebugLogMessage("Loaded extension: %s", m_sFilespec); break; case extLibrary: kernelDebugLogMessage("Loaded library: %s", m_sFilespec); break; } return NOERROR; } case loadComplete: return NOERROR; default: ASSERT(false); return ERR_FAIL; } }