Exemple #1
0
ALERROR WriteModuleImages (CTDBCompiler &Ctx, CXMLElement *pModule, const CString &sFolder, CDataFile &Out)
	{
	ALERROR error;
	int i;

	for (i = 0; i < pModule->GetContentElementCount(); i++)
		{
		CXMLElement *pItem = pModule->GetContentElement(i);
		if (strEquals(pItem->GetTag(), TAG_IMAGES))
			{
			CString sSubFolder = pathAddComponent(sFolder, pItem->GetAttribute(ATTRIB_FOLDER));

			if (error = WriteModuleImages(Ctx, pItem, sSubFolder, Out))
				return error;
			}
		else if (strEquals(pItem->GetTag(), TAG_IMAGE))
			{
			CString sFilename = pItem->GetAttribute(ATTRIB_BITMAP);
			if (!sFilename.IsBlank())
				{
				bool bCompress = strEquals(strToLower(pathGetExtension(sFilename)), CONSTLIT("bmp"));
				if (error = WriteResource(Ctx, sFilename, sFolder, bCompress, Out))
					continue;
				}

			sFilename = pItem->GetAttribute(ATTRIB_BITMASK);
			if (!sFilename.IsBlank())
				{
				bool bCompress = strEquals(strToLower(pathGetExtension(sFilename)), CONSTLIT("bmp"));
				if (error = WriteResource(Ctx, sFilename, sFolder, bCompress, Out))
					continue;
				}

			sFilename = pItem->GetAttribute(ATTRIB_SHADOW_MASK);
			if (!sFilename.IsBlank())
				{
				bool bCompress = strEquals(strToLower(pathGetExtension(sFilename)), CONSTLIT("bmp"));
				if (error = WriteResource(Ctx, sFilename, sFolder, bCompress, Out))
					continue;
				}

			sFilename = pItem->GetAttribute(ATTRIB_HIT_MASK);
			if (!sFilename.IsBlank())
				{
				bool bCompress = strEquals(strToLower(pathGetExtension(sFilename)), CONSTLIT("bmp"));
				if (error = WriteResource(Ctx, sFilename, sFolder, bCompress, Out))
					continue;
				}
			}
		}

	return NOERROR;
	}
Exemple #2
0
void TransCompiler (CXMLElement *pCmdLine)

//	TransCompiler
//
//	Compile the Transcendence game and resource files
//
//	<TransCompiler
//			input="{input filespec}"
//			output="{output filespec}"
//		/>

	{
	printf("TransCompiler v2.2\n");
	printf("Copyright (c) 2003-2015 by Kronosaur Productions, LLC. All Rights Reserved.\n\n");

	if (pCmdLine->GetAttributeBool(NOARGS) || pCmdLine->GetAttributeBool(SWITCH_HELP))
		{
		printf("  /input:{input filespec}\n");
		printf("  /output:{output filespec}\n");
		printf(" [/digest]\n");
		printf(" [/dump]\n");
		printf(" [/entities:{entity filespec}]\n");
		printf("\n");
		return;
		}

	//	Figure out the folder for the input filespec. All filenames will
	//	be relative to this root.

	CString sInputFilespec = pCmdLine->GetAttribute(ATTRIB_INPUT);
	if (sInputFilespec.IsBlank())
		sInputFilespec = CONSTLIT("Transcendence.xml");

	//	If we just want to dump an existing TDB then we do that

	if (pCmdLine->GetAttributeBool(ATTRIB_DUMP) || strEquals(pathGetExtension(sInputFilespec), EXTENSION_TDB))
		DumpTDB(sInputFilespec);

	//	Otherwise we are creating a new TDB

	else
		CreateTDB(sInputFilespec, pCmdLine);
	}
Exemple #3
0
void RunFile (const CString &sFilespec, bool bNoLogo)
	{
	ALERROR error;
	CCodeChain &CC = g_pUniverse->GetCC();
	CCodeChainCtx Ctx;

	//	Verify the file

	CString sRunFile = sFilespec;
	if (!strEndsWith(sRunFile, CONSTLIT("."))
			&& pathGetExtension(sRunFile).IsBlank())
		sRunFile.Append(CONSTLIT(".tlisp"));

	//	Open the file

	CFileReadBlock InputFile(sRunFile);
	if (error = InputFile.Open())
		{
		printf("error : Unable to open file '%s'.\n", sRunFile.GetASCIIZPointer());
		return;
		}

	if (!bNoLogo)
		printf("%s\n", sRunFile.GetASCIIZPointer());

	//	Parse

	CString sInputFile(InputFile.GetPointer(0), InputFile.GetLength(), TRUE);
	CString sOutput;
	int iOffset = 0;

	while (true)
		{
		int iCharCount;
		ICCItem *pCode = Ctx.Link(sInputFile, iOffset, &iCharCount);
		if (pCode->IsNil())
			break;
		else if (pCode->IsError())
			{
			printf("error : %s\n", pCode->GetStringValue().GetASCIIZPointer());
			Ctx.Discard(pCode);
			return;
			}

		iOffset += iCharCount;

		//	Execute

		ICCItem *pResult = Ctx.Run(pCode);

		//	Compose output

		if (pResult->IsIdentifier())
			sOutput = pResult->Print(&CC, PRFLAG_NO_QUOTES | PRFLAG_ENCODE_FOR_DISPLAY);
		else
			sOutput = CC.Unlink(pResult);

		//	Free

		Ctx.Discard(pResult);
		Ctx.Discard(pCode);
		}

	//	Output result

	printf("%s\n", sOutput.GetASCIIZPointer());
	}
CResourceDb::CResourceDb (const CString &sFilespec, CResourceDb *pMainDb, bool bExtension) : 
		m_iVersion(TDB_VERSION),
		m_pDb(NULL),
		m_pResourceMap(NULL),
		m_pMainDb(NULL)

//	CResourceDb constructor
//
//	sFilespec = "Extensions/MyExtension"
//
//	If Extensions/MyExtension.tdb exists, then look for the definitions
//	and the resources in the .tdb file.
//
//	Otherwise, use Extensions/MyExtension.xml for the definitions and
//	Look for resource files in the Extensions folder.

	{
	if (pMainDb || bExtension)
		{
		//	We assume this is an extension

		CString sTDB = sFilespec;
		sTDB.Append(CONSTLIT("."));
		sTDB.Append(FILE_TYPE_TDB);

		if (pathExists(sTDB))
			{
			m_pDb = new CDataFile(sTDB);

			m_sRoot = pathGetPath(sTDB);
			m_sGameFile = pathGetFilename(sTDB);
			m_bGameFileInDb = true;
			m_bResourcesInDb = true;
			}
		else
			{
			CString sXML = sFilespec;
			sXML.Append(CONSTLIT("."));
			sXML.Append(FILE_TYPE_XML);

			m_pDb = NULL;

			m_sRoot = pathGetPath(sFilespec);
			m_sGameFile = pathGetFilename(sXML);
			m_bGameFileInDb = false;
			m_bResourcesInDb = false;
			}

		m_pMainDb = pMainDb;
		}
	else
		{
		CString sType = pathGetExtension(sFilespec);
		if (sType.IsBlank())
			{
			CString sXML = sFilespec;
			sXML.Append(CONSTLIT("."));
			sXML.Append(FILE_TYPE_XML);

			//	If Transcendence.xml exists, then use the file and load
			//	the resources from the same location.

			if (pathExists(sXML))
				{
				m_sRoot = pathGetPath(sXML);
				m_sGameFile = pathGetFilename(sXML);
				m_bGameFileInDb = false;

				//	If a resources path exists, then use the resources in the
				//	folder. Otherwise, use resources in the tdb

				CString sResourcesPath = pathAddComponent(m_sRoot, RESOURCES_FOLDER);
				if (pathExists(sResourcesPath))
					{
					m_pDb = NULL;
					m_bResourcesInDb = false;
					}

				//	Otherwise, use the tdb file

				else
					{
					CString sTDB = sFilespec;
					sTDB.Append(CONSTLIT("."));
					sTDB.Append(FILE_TYPE_TDB);
					m_pDb = new CDataFile(sTDB);
					m_bResourcesInDb = true;
					}
				}

			//	Otherwise, use the .tdb file for both

			else
				{
				CString sTDB = sFilespec;
				sTDB.Append(CONSTLIT("."));
				sTDB.Append(FILE_TYPE_TDB);
				m_pDb = new CDataFile(sTDB);

				m_bGameFileInDb = true;
				m_bResourcesInDb = true;
				}
			}
		else if (strEquals(sType, FILE_TYPE_XML))
			{
			m_sRoot = pathGetPath(sFilespec);
			m_sGameFile = pathGetFilename(sFilespec);
			m_pDb = NULL;

			m_bGameFileInDb = false;
			m_bResourcesInDb = false;
			}
		else
			{
			m_pDb = new CDataFile(sFilespec);
			m_bGameFileInDb = true;
			m_bResourcesInDb = true;
			}

		//	This is the main file

		m_pMainDb = NULL;
		}
	}
Exemple #5
0
ALERROR CExtension::LoadModuleElement (SDesignLoadCtx &Ctx, CXMLElement *pDesc)

//	LoadModuleElement
//
//	Loads <Module>

	{
	ALERROR error;

	CString sFilename = pDesc->GetAttribute(FILENAME_ATTRIB);

	//	Load the module XML

	CXMLElement *pModuleXML;
	if (error = Ctx.pResDb->LoadModule(Ctx.sFolder, sFilename, &pModuleXML, &Ctx.sError))
		{
		if (error == ERR_NOTFOUND)
			Ctx.sError = strPatternSubst(CONSTLIT("%s: %s"), Ctx.pResDb->GetFilespec(), Ctx.sError);
		return error;
		}

	if (!strEquals(pModuleXML->GetTag(), TRANSCENDENCE_MODULE_TAG))
		{
		delete pModuleXML;
		Ctx.sError = strPatternSubst(CONSTLIT("Module must have <TranscendenceModule> root element: %s"), sFilename);
		return ERR_FAIL;
		}

	//	We are loading a module

	bool bOldLoadModule = Ctx.bLoadModule;
	Ctx.bLoadModule = true;

	//	Look for resources relative to the module path

	CString sOldFolder = Ctx.sFolder;
	CString sFolder = pathGetPath(sFilename);
	if (!sFolder.IsBlank() && Ctx.GetAPIVersion() >= 26)
		Ctx.sFolder = pathAddComponent(Ctx.sFolder, sFolder);

	//	Errors credited to this file.

	CString sOldErrorFilespec = Ctx.sErrorFilespec;
	if (strEquals(pathGetExtension(sOldErrorFilespec), FILESPEC_TDB_EXTENSION))
		Ctx.sErrorFilespec = strPatternSubst(CONSTLIT("%s#%s"), sOldErrorFilespec, sFilename);
	else
		Ctx.sErrorFilespec = sFilename;

	//	Process each design element in the module

	if (error = LoadModuleContent(Ctx, pModuleXML))
		return error;

	//	Clean up

	Ctx.sFolder = sOldFolder;
	Ctx.sErrorFilespec = sOldErrorFilespec;
	Ctx.bLoadModule = bOldLoadModule;

	//	If we're keeping the XML, then add it to our table

	if (Ctx.bKeepXML && !m_ModuleXML.Find(sFilename))
		m_ModuleXML.Insert(sFilename, pModuleXML);
	else
		delete pModuleXML;

	return NOERROR;
	}