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; }
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); }
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; } }
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; }