Example #1
0
void CNamedIndexes::TestGetPotentialContainingBlocks(char* szName, CArrayNamedIndexesBlockPtr* pcDest)
{
	int						i;
	CNamedIndexesBlocks*	pcBlock;
	int						iNameLength;
	CChars	szFake;

	if (!szName)
	{
		return;
	}

	szFake.Fake(szName);
	if (szFake.Empty())
	{
		return;
	}
	
	iNameLength = (int)strlen(szName);
	for (i = 0; i < macBlocks.NumElements(); i++)
	{
		pcBlock = macBlocks.Get(i);
		if (pcBlock->FitsLength(iNameLength))
		{
			pcBlock->GetPotentialContainingBlocks(&szFake, pcDest);
		}
	}
}
//////////////////////////////////////////////////////////////////////////
//																		//
//																		//
//////////////////////////////////////////////////////////////////////////
BOOL CArrayString::Split(char* szString, char cSplitter)
{
	CChars			szTemp;

	szTemp.Init(szString);
	if (!szTemp.Empty())
	{
		szTemp.Split(this, cSplitter);
		szTemp.Kill();
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}
BOOL CImageCelsSourceXML::ImportCelSource(CMarkupTag* pcBrushSourceTag, char* szTexturePath)
{
	CMarkupTag*			pcFileName;
	CChars				szFileName;
	CChars				szShortFileName;
	BOOL				bResult;
	CMarkupTag*			pcCels;
	CFileUtil			cFileUtil;

	pcFileName = CMarkupTextParser::GetTag(pcBrushSourceTag, "FileName");
	if (!pcFileName)
	{
		return FALSE;
	}

	szShortFileName.Init();
	pcFileName->GetText(&szShortFileName);
	if (szFileName.Empty())
	{
		szShortFileName.Kill();
		CMarkupTextParser::LogErrorTagWasEmpty(pcBrushSourceTag);
		return FALSE;
	}
	
	pcCels = CMarkupTextParser::GetTag(pcBrushSourceTag, "Cels");
	if (!pcCels)
	{
		szShortFileName.Kill();
		return FALSE;
	}

	szFileName.Init(szTexturePath);
	cFileUtil.AppendToPath(&szFileName, szShortFileName.Text());

	bResult = ImportCels(pcCels, szFileName.Text());
	return bResult;
}
BOOL CObjectSourcesXML::ImportImage(CTileType* pcType, CMarkupTag* pcTag)
{
	CMarkupTag*					pcName;
	CMarkupTag*					pcCelIndex;
	CMarkupTag*					pcBrushID;
	CMarkupTag*					pcSourceName;
	CMarkupTag*					pcProperties;
	CChars						szName;
	int							iCelIndex;
	int							iBrushID;
	CChars						szSourceName;
	CTileImageCel*				pcTile;
	Ptr<CImageCelGroup>	pcGroup;
	CImageCel*					pcCel;

	pcName = CMarkupTextParser::GetTag(pcTag, "Name");
	if (!pcName)
	{
		return FALSE;
	}
	pcCelIndex = CMarkupTextParser::GetTag(pcTag, "CelIndex");
	if (!pcCelIndex)
	{
		return FALSE;
	}
	pcBrushID = CMarkupTextParser::GetTag(pcTag, "BrushID");
	if (!pcBrushID)
	{
		return FALSE;
	}
	pcSourceName = CMarkupTextParser::GetTag(pcTag, "SourceName");
	if (!pcSourceName)
	{
		return FALSE;
	}
	pcProperties = CMarkupTextParser::GetTag(pcTag, "Properties");

	szName.Init();
	pcName->GetText(&szName);
	if (!CMarkupTextParser::ReadInteger(pcCelIndex, &iCelIndex))
	{
		szName.Kill();
		return FALSE;
	}
	if (!CMarkupTextParser::ReadInteger(pcBrushID, &iBrushID))
	{
		szName.Kill();
		return FALSE;
	}
	szSourceName.Init();
	pcSourceName->GetText(&szSourceName);
	if (szSourceName.Empty())
	{
		CMarkupTextParser::LogErrorTagWasEmpty(pcSourceName);
		szName.Kill();
		szSourceName.Kill();
		return FALSE;
	}


	pcGroup = mpcWorld->GetGroup(szSourceName.Text());
	if (!pcGroup)
	{
		szName.Kill();
		szSourceName.Kill();
		gcLogger.Error("Couldn't find Cel Group.");
		return FALSE;
	}

	pcCel = pcGroup->GetCel(iCelIndex);
	if (!pcCel)
	{
		szName.Kill();
		szSourceName.Kill();
		gcLogger.Error("Couldn't find Cel.");
		return FALSE;
	}

	pcTile = UMalloc(CTileImageCel);
	pcTile->Init(pcCel, pcType, szName.Text());
	pcType->AddTile(pcTile);

	return TRUE;
}
BOOL CTileMapXML::ImportTiles(CMarkupTag* pcTag, CTileLayer* pcLayer)
{
	CChars				szCSV;
	CCSVFileImmutable	cCSVFile;
	CMemoryFile			cMemoryFile;
	int					iRow;
	SCSVRowImmutable*	psRow;
	int					i;
	char*				szCelIndex;
	CTextParser			cTextParser;
	TRISTATE			tResult;
	int					iCelIndex;
	CChars				szError;
	CTile*				pcTile;

	szCSV.Init(128);
	pcTag->GetText(&szCSV);
	if (szCSV.Empty())
	{
		szCSV.Kill();
		CMarkupTextParser::LogErrorTagWasEmpty(pcTag);
		return FALSE;
	}

	szCSV.StripWhiteSpace(TRUE);
	//szCSV.Replace(" ", "");  //Write a test for this, why does it not work?

	cMemoryFile.Init(szCSV.Text(), szCSV.Length());

	cCSVFile.Init(',');
	cCSVFile.Open(&cMemoryFile);
	cCSVFile.ReadAllLines();

	for (iRow = 0; iRow < cCSVFile.NumRows(); iRow++)
	{
		psRow = cCSVFile.Get(iRow);

		for (i = 0; i < psRow->iNumFields; i++)
		{
			szCelIndex = psRow->Get(i);
			cTextParser.Init(szCelIndex);
			tResult = cTextParser.GetInteger(&iCelIndex);
			if (tResult != TRITRUE)
			{
				szError.Init("CSV cell [");
				szError.Append(i);
				szError.Append(", ");
				szError.Append(iRow);
				szError.Append("] could not be parsed as an integer.");
				CMarkupTextParser::LogError(pcTag, szError.Text());
				szError.Kill();
				cCSVFile.Close();
				cMemoryFile.Kill();
				szCSV.Kill();
				return FALSE;
			}
			
			pcTile = pcLayer->mpcTileType->Get(iCelIndex);
			if (pcTile)
			{
				pcLayer->Set(i, iRow, pcTile);
			}
		}
	}

	cCSVFile.Close();
	cMemoryFile.Kill();
	szCSV.Kill();
	return TRUE;
}
BOOL CTileMapXML::ImportLayer(CMarkupTag* pcTag, CTileMap* pcMap)
{
	CMarkupTag*		pcName;
	CMarkupTag*		pcObjectClass;
	CMarkupTag*		pcTiles;
	CChars			szName;
	CChars			szObjectClass;
	BOOL			bResult;
	CTileType*		pcType;
	CTileLayer*		pcLayer;

	pcName = CMarkupTextParser::GetTag(pcTag, "Name");
	if (!pcName)
	{
		return FALSE;
	}
	pcObjectClass = CMarkupTextParser::GetTag(pcTag, "ObjectClass");
	if (!pcObjectClass)
	{
		return FALSE;
	}
	pcTiles = CMarkupTextParser::GetTag(pcTag, "Tiles");
	if (!pcTiles)
	{
		return FALSE;
	}

	szName.Init();
	pcName->GetText(&szName);
	if (szName.Empty())
	{
		szName.Kill();
		CMarkupTextParser::LogErrorTagWasEmpty(pcName);
		return FALSE;
	}

	szObjectClass.Init();
	pcObjectClass->GetText(&szObjectClass);
	if (szObjectClass.Empty())
	{
		szName.Kill();
		szObjectClass.Kill();
		CMarkupTextParser::LogErrorTagWasEmpty(pcObjectClass);
		return FALSE;
	}

	pcType = mpcWorld->GetType(szObjectClass.Text());
	if (!pcType)
	{
		CMarkupTextParser::LogError(pcObjectClass, "Could not find a TileType for Tag.");
		return FALSE;
	}

	pcLayer = pcMap->AddLayer(szName.Text(), pcType);

	bResult = ImportTiles(pcTiles, pcLayer);

	szObjectClass.Kill();
	szName.Kill();
	return bResult;
}
BOOL CTileMapXML::ImportMap(CMarkupTag* pcTag)
{
	CMarkupTag*		pcTileMap;
	CMarkupTag*		pcName;
	CMarkupTag*		pcCelWidth;
	CMarkupTag*		pcCelHeight;
	BOOL			bResult;
	CChars			szName;
	int				iCelWidth;
	int				iCelHeight;
	CTileMap*		pcMap;

	pcTileMap = CMarkupTextParser::GetTag(pcTag, "TileMap");
	if (!pcTileMap)
	{
		return FALSE;
	}

	pcName = CMarkupTextParser::GetTag(pcTag, "Name");
	if (!pcName)
	{
		return FALSE;
	}

	pcCelWidth = CMarkupTextParser::GetTag(pcTag, "CelWidth");
	if (!pcCelWidth)
	{
		return FALSE;
	}

	pcCelHeight = CMarkupTextParser::GetTag(pcTag, "CelHeight");
	if (!pcCelHeight)
	{
		return FALSE;
	}

	if (!CMarkupTextParser::ReadInteger(pcCelWidth, &iCelWidth))
	{
		return FALSE;
	}
	if (!CMarkupTextParser::ReadInteger(pcCelHeight, &iCelHeight))
	{
		return FALSE;
	}

	szName.Init();
	pcName->GetText(&szName);
	if (szName.Empty())
	{
		szName.Kill();
		CMarkupTextParser::LogErrorTagWasEmpty(pcName);
		return FALSE;
	}

	pcMap = mpcWorld->AddMap(szName.Text(), iCelWidth, iCelHeight);

	bResult = ImportMap2(pcTileMap, pcMap);
	if (!bResult)
	{
		return FALSE;
	}

	szName.Kill();
	return TRUE;
}