示例#1
0
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;
	}
示例#2
0
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;
	}
示例#3
0
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;
	}
示例#4
0
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;
		}
	}