/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ /* * Copyright (C) 2006-2010 - Frictional Games * * This file is part of HPL1 Engine. */ #include "hpl1/engine/scene/World2D.h" #include "hpl1/engine/graphics/Graphics.h" #include "hpl1/engine/graphics/ImageEntityData.h" #include "hpl1/engine/graphics/Mesh2d.h" #include "hpl1/engine/impl/tinyXML/tinyxml.h" #include "hpl1/engine/math/Math.h" #include "hpl1/engine/math/MathTypes.h" #include "hpl1/engine/physics/Body2D.h" #include "hpl1/engine/physics/Collider2D.h" #include "hpl1/engine/resources/FileSearcher.h" #include "hpl1/engine/resources/ParticleManager.h" #include "hpl1/engine/resources/Resources.h" #include "hpl1/engine/resources/ScriptManager.h" #include "hpl1/engine/resources/TileSetManager.h" #include "hpl1/engine/scene/Area2D.h" #include "hpl1/engine/scene/Camera.h" #include "hpl1/engine/scene/GridMap2D.h" #include "hpl1/engine/scene/ImageEntity.h" #include "hpl1/engine/scene/Light2DPoint.h" #include "hpl1/engine/scene/Node2D.h" #include "hpl1/engine/scene/SoundSource.h" #include "hpl1/engine/scene/TileMap.h" #include "hpl1/engine/system/MemoryManager.h" #include "hpl1/engine/system/Script.h" #include "hpl1/engine/system/String.h" #include "hpl1/engine/system/low_level_system.h" #include "hpl1/engine/graphics/Renderer2D.h" namespace hpl { ////////////////////////////////////////////////////////////////////////// // CONSTRUCTORS ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cWorld2D::cWorld2D(tString asName, cGraphics *apGraphics, cResources *apResources, cSound *apSound, cCollider2D *apCollider) { mpGraphics = apGraphics; mpResources = apResources; mpSound = apSound; mpCollider = apCollider; mpRootNode = hplNew(cNode2D, ()); mpMapLights = NULL; mpMapImageEntities = NULL; mpMapBodies = NULL; mpTileMap = NULL; mpScript = NULL; msName = asName; mfLightZ = 10; mAmbientColor = cColor(0, 0); mlBodyIDCount = 0; } //----------------------------------------------------------------------- cWorld2D::~cWorld2D() { if (mpTileMap) hplDelete(mpTileMap); if (mpMapLights) hplDelete(mpMapLights); if (mpMapImageEntities) hplDelete(mpMapImageEntities); if (mpMapBodies) hplDelete(mpMapBodies); if (mpMapParticles) hplDelete(mpMapParticles); if (mpMapAreas) hplDelete(mpMapAreas); tSoundSourceListIt it = mlstSoundSources.begin(); while (it != mlstSoundSources.end()) { hplDelete(*it); it++; } mlstSoundSources.clear(); if (mpScript) { mpResources->GetScriptManager()->Destroy(mpScript); } } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // PUBLIC METHODS ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- void cWorld2D::Render(cCamera2D *apCamera) { mpTileMap->Render(apCamera); RenderImagesEntities(apCamera); RenderParticles(apCamera); } //----------------------------------------------------------------------- void cWorld2D::Update(float afTimeStep) { UpdateEntities(); UpdateBodies(); UpdateParticles(); UpdateSoundSources(); UpdateLights(); } //----------------------------------------------------------------------- cLight2DPoint *cWorld2D::CreateLightPoint(tString asName) { if (mpMapLights == NULL) return NULL; cLight2DPoint *pLight = hplNew(cLight2DPoint, (asName)); mpMapLights->AddEntity(pLight); // Add the light to the base node awell... return pLight; } //----------------------------------------------------------------------- void cWorld2D::DestroyLight(iLight2D *apLight) { if (mpMapLights == NULL) return; mpMapLights->RemoveEntity(apLight); hplDelete(apLight); } //----------------------------------------------------------------------- cGridMap2D *cWorld2D::GetGridMapLights() { return mpMapLights; } //----------------------------------------------------------------------- iLight2D *cWorld2D::GetLight(const tString &asName) { tGrid2DObjectMap *pGridMap = mpMapLights->GetAllMap(); tGrid2DObjectMapIt it = pGridMap->begin(); for (; it != pGridMap->end(); it++) { cGrid2DObject *pObj = it->second; if (pObj->GetEntity()->GetName() == asName) { return static_cast(pObj->GetEntity()); } } return NULL; } //----------------------------------------------------------------------- cSoundSource *cWorld2D::CreateSoundSource(const tString &asName, const tString &asSoundName, bool abVolatile) { cSoundSource *pSoundSource = hplNew(cSoundSource, (asName, asSoundName, mpSound, abVolatile)); mlstSoundSources.push_back(pSoundSource); return pSoundSource; } //----------------------------------------------------------------------- void cWorld2D::DestroySoundSource(cSoundSource *apSound) { mlstSoundSources.remove(apSound); hplDelete(apSound); } //----------------------------------------------------------------------- cImageEntity *cWorld2D::CreateImageEntity(tString asName, tString asDataName) { cImageEntity *pEntity = hplNew(cImageEntity, (asName, mpResources, mpGraphics)); if (pEntity == NULL) return NULL; if (pEntity->LoadEntityData(asDataName)) { mpMapImageEntities->AddEntity(pEntity); } else { hplDelete(pEntity); } return pEntity; } //----------------------------------------------------------------------- void cWorld2D::DestroyImageEntity(cImageEntity *apEntity) { if (mpMapImageEntities == NULL) return; mpMapImageEntities->RemoveEntity(apEntity); hplDelete(apEntity); } //----------------------------------------------------------------------- cImageEntity *cWorld2D::GetImageEntity(const tString &asName) { tGrid2DObjectMap *pGridMap = mpMapImageEntities->GetAllMap(); tGrid2DObjectMapIt it = pGridMap->begin(); for (; it != pGridMap->end(); it++) { cGrid2DObject *pObj = it->second; if (pObj->GetEntity()->GetName() == asName) { return static_cast(pObj->GetEntity()); } } return NULL; } //----------------------------------------------------------------------- iParticleSystem2D *cWorld2D::CreateParticleSystem(const tString &asName, const cVector3f &avSize) { /*iParticleSystem2D* pPS = mpResources->GetParticleManager()->CreatePS2D(asName, avSize); if(pPS == NULL){ Error("Couldn't create particle system '%s'\n",asName.c_str()); } mpMapParticles->AddEntity(pPS); return pPS;*/ return NULL; } //----------------------------------------------------------------------- void cWorld2D::DestroyParticleSystem(iParticleSystem2D *apPS) { /*if(apPS==NULL)return; mpMapParticles->RemoveEntity(apPS); hplDelete(apPS);*/ } //----------------------------------------------------------------------- cBody2D *cWorld2D::CreateBody2D(const tString &asName, cMesh2D *apMesh, cVector2f avSize) { cBody2D *pBody = hplNew(cBody2D, (asName, apMesh, avSize, mpCollider, mlBodyIDCount++)); mpMapBodies->AddEntity(pBody); return pBody; } //----------------------------------------------------------------------- cArea2D *cWorld2D::GetArea(const tString &asName, const tString &asType) { tGrid2DObjectMap *GridMap = mpMapAreas->GetAllMap(); tGrid2DObjectMapIt it = GridMap->begin(); while (it != GridMap->end()) { cArea2D *pArea = static_cast(it->second->GetEntity()); if (asName == "" || pArea->GetName() == asName) { if (asType == "" || pArea->GetType() == asType) { return pArea; } } it++; } return NULL; } //----------------------------------------------------------------------- bool cWorld2D::CreateFromFile(tString asFile) { // Load the document asFile = cString::SetFileExt(asFile, "hpl"); tString sPath = mpResources->GetFileSearcher()->GetFilePath(asFile); if (sPath == "") { error("Couldn't find map '%s'", asFile.c_str()); return false; } TiXmlDocument *pDoc = hplNew(TiXmlDocument, (sPath.c_str())); if (!pDoc->LoadFile()) { error("Couldn't load map '%s'", asFile.c_str()); return false; } // Load the script asFile = cString::SetFileExt(asFile, "hps"); mpScript = mpResources->GetScriptManager()->CreateScript(asFile); if (mpScript == NULL) { Error("Couldn't load script '%s'", asFile.c_str()); } TiXmlElement *pHplMapElem = pDoc->RootElement(); cVector2l vMapSize; msMapName = pHplMapElem->Attribute("Name"); vMapSize.x = cString::ToInt(pHplMapElem->Attribute("Width"), 0); vMapSize.y = cString::ToInt(pHplMapElem->Attribute("Height"), 0); float fTileSize = (float)cString::ToInt(pHplMapElem->Attribute("TileSize"), 0); mfLightZ = cString::ToFloat(pHplMapElem->Attribute("LightZ"), 0); mAmbientColor.r = cString::ToFloat(pHplMapElem->Attribute("AmbColR"), 0) / 255.0f; mAmbientColor.g = cString::ToFloat(pHplMapElem->Attribute("AmbColG"), 0) / 255.0f; mAmbientColor.b = cString::ToFloat(pHplMapElem->Attribute("AmbColB"), 0) / 255.0f; mAmbientColor.a = 0; // Log("Amb: %f : %f : %f : %f\n",mAmbientColor.r,mAmbientColor.g,mAmbientColor.b,mAmbientColor.a); mpGraphics->GetRenderer2D()->SetAmbientLight(mAmbientColor); mpGraphics->GetRenderer2D()->SetShadowZ(mfLightZ); // Set up data for objects. cVector2l vWorldSize = vMapSize * (int)fTileSize; mvWorldSize = cVector2f((float)vWorldSize.x, (float)vWorldSize.y); mpMapLights = hplNew(cGridMap2D, (vWorldSize, cVector2l(200, 200), cVector2l(5, 5))); mpMapImageEntities = hplNew(cGridMap2D, (vWorldSize, cVector2l(150, 150), cVector2l(5, 5))); mpMapBodies = hplNew(cGridMap2D, (vWorldSize, cVector2l(150, 150), cVector2l(5, 5))); mpMapParticles = hplNew(cGridMap2D, (vWorldSize, cVector2l(300, 300), cVector2l(3, 3))); mpMapAreas = hplNew(cGridMap2D, (vWorldSize, cVector2l(300, 300), cVector2l(3, 3))); TiXmlElement *pHplMapChildElem = pHplMapElem->FirstChildElement(); while (pHplMapChildElem) { tString sChildName = pHplMapChildElem->Value(); ///////////////// /// LIGHTS ////// ///////////////// if (sChildName == "Lights") { TiXmlElement *pLightChildElem = pHplMapChildElem->FirstChildElement(); while (pLightChildElem) { cVector3f vPos; cColor Col(0, 1); cLight2DPoint *pLight = CreateLightPoint(pLightChildElem->Attribute("Name")); vPos.x = cString::ToFloat(pLightChildElem->Attribute("X"), 0); vPos.y = cString::ToFloat(pLightChildElem->Attribute("Y"), 0); vPos.z = cString::ToFloat(pLightChildElem->Attribute("Z"), 0); pLight->SetPosition(vPos); Col.r = cString::ToFloat(pLightChildElem->Attribute("ColR"), 0) / 255.0f; Col.g = cString::ToFloat(pLightChildElem->Attribute("ColG"), 0) / 255.0f; Col.b = cString::ToFloat(pLightChildElem->Attribute("ColB"), 0) / 255.0f; Col.a = cString::ToFloat(pLightChildElem->Attribute("Specular"), 1); pLight->SetDiffuseColor(Col); pLight->SetFarAttenuation(cString::ToFloat(pLightChildElem->Attribute("Radius"), 0)); pLight->SetActive(cString::ToBool(pLightChildElem->Attribute("Active"), true)); /*LOad some more stuff*/ pLight->SetAffectMaterial(cString::ToBool(pLightChildElem->Attribute("AffectMaterial"), true)); pLight->SetCastShadows(cString::ToBool(pLightChildElem->Attribute("CastShadows"), true)); pLightChildElem = pLightChildElem->NextSiblingElement(); } } //////////////////////// /// ENTITIES /////////// //////////////////////// else if (sChildName == "Entities") { TiXmlElement *pEntityElem = pHplMapChildElem->FirstChildElement(); while (pEntityElem) { tString sRenderType = cString::ToString(pEntityElem->Attribute("RenderType"), "Image"); if (sRenderType == "Image") { cImageEntity *pEntity = hplNew(cImageEntity, (cString::ToString( pEntityElem->Attribute("Name"), "Image"), mpResources, mpGraphics)); // The the main data cVector3f vPos; vPos.x = cString::ToFloat(pEntityElem->Attribute("X"), 0); vPos.y = cString::ToFloat(pEntityElem->Attribute("Y"), 0); vPos.z = cString::ToFloat(pEntityElem->Attribute("Z"), 0); pEntity->SetPosition(vPos); pEntity->SetActive(cString::ToBool(pEntityElem->Attribute("Active"), true)); if (pEntity->LoadData(pEntityElem)) { mpMapImageEntities->AddEntity(pEntity); iEntity2DLoader *pLoader = mpResources->GetEntity2DLoader( pEntity->GetEntityData()->GetType()); if (pLoader) { pLoader->Load(pEntity); } else { /*Maybe delete entity if no type found? */ } } else { Error("Couldn't load data for entity '%s'", pEntity->GetName().c_str()); hplDelete(pEntity); } } else { error("No other Render mode for entity exist!!"); } pEntityElem = pEntityElem->NextSiblingElement(); } } ///////////////////////////// /// SOUND SOURCES /////////// ///////////////////////////// else if (sChildName == "SoundSources") { TiXmlElement *pSoundElem = pHplMapChildElem->FirstChildElement(); while (pSoundElem) { cSoundSource *pSound = hplNew(cSoundSource, ( cString::ToString(pSoundElem->Attribute("Name"), ""), cString::ToString(pSoundElem->Attribute("SoundName"), ""), mpSound, false)); pSound->LoadData(pSoundElem); mlstSoundSources.push_back(pSound); pSoundElem = pSoundElem->NextSiblingElement(); } } ///////////////////////////// /// PARTICLE SYSTEMS /////////// ///////////////////////////// /*else if(sChildName == "ParticleSystems") { TiXmlElement* pPartElem = pHplMapChildElem->FirstChildElement(); while(pPartElem) { iParticleSystem2D* pPS; tString sName = cString::ToString(pPartElem->Attribute("Name"),""); tString sPartName = cString::ToString(pPartElem->Attribute("PartName"),""); cVector3f vSize; cVector3f vPos; vSize.x = cString::ToFloat(pPartElem->Attribute("SizeX"),0); vSize.y = cString::ToFloat(pPartElem->Attribute("SizeY"),0); vSize.z = cString::ToFloat(pPartElem->Attribute("SizeZ"),0); vPos.x = cString::ToFloat(pPartElem->Attribute("X"),0); vPos.y = cString::ToFloat(pPartElem->Attribute("Y"),0); vPos.z = cString::ToFloat(pPartElem->Attribute("Z"),0); pPS = mpResources->GetParticleManager()->CreatePS2D(sPartName,vSize); if(pPS==NULL){ Error("Couldn't load particle system '%s'!\n",sPartName.c_str()); } else { pPS->SetName(sName); pPS->SetPosition(vPos); mpMapParticles->AddEntity(pPS); } pPartElem = pPartElem->NextSiblingElement(); } }*/ ///////////////////////////// /// AREAS /////////////////// ///////////////////////////// else if (sChildName == "Areas") { TiXmlElement *pAreaElem = pHplMapChildElem->FirstChildElement(); while (pAreaElem) { cArea2D *pArea; tString sName = cString::ToString(pAreaElem->Attribute("Name"), ""); tString sAreaType = cString::ToString(pAreaElem->Attribute("AreaType"), ""); cVector3f vPos; vPos.x = cString::ToFloat(pAreaElem->Attribute("X"), 0); vPos.y = cString::ToFloat(pAreaElem->Attribute("Y"), 0); vPos.z = cString::ToFloat(pAreaElem->Attribute("Z"), 0); pArea = hplNew(cArea2D, (sName, sAreaType, mpCollider)); pArea->LoadData(pAreaElem); pArea->SetName(sName); pArea->SetPosition(vPos); if (pArea->GetType() != "Script") { iArea2DLoader *pAreaLoader = mpResources->GetArea2DLoader(pArea->GetType()); if (pAreaLoader) { pAreaLoader->Load(pArea); } } mpMapAreas->AddEntity(pArea); pAreaElem = pAreaElem->NextSiblingElement(); } } ///////////////// /// TILEMAP ///// ///////////////// else if (sChildName == "TileMap") { mpTileMap = hplNew(cTileMap, (vMapSize, fTileSize, mpGraphics, mpResources)); int lShadowLayer = cString::ToInt(pHplMapChildElem->Attribute("ShadowLayer"), 0); TiXmlElement *pTileMapChildElem = pHplMapChildElem->FirstChildElement(); while (pTileMapChildElem) { tString sTileMapChildName = pTileMapChildElem->Value(); // Log("Tilemap: %s\n",sTileMapChildName.c_str()); //////////////////////// /// TILE SETS ////////// //////////////////////// if (sTileMapChildName == "TileSets") { TiXmlElement *pTileSetChildElem = pTileMapChildElem->FirstChildElement(); while (pTileSetChildElem) { tString sName = pTileSetChildElem->Attribute("Name"); cTileSet *pTileSet = mpResources->GetTileSetManager()->CreateTileSet(sName); mpTileMap->AddTileSet(pTileSet); pTileSetChildElem = pTileSetChildElem->NextSiblingElement(); } } //////////////////////// /// TILE LAYERS //////// /////////////////////// else if (sTileMapChildName == "Layers") { // Log("Layers\n"); TiXmlElement *pLayerChildElem = pTileMapChildElem->FirstChildElement(); while (pLayerChildElem) { // Log("Layer Children\n"); if (pLayerChildElem->Attribute("Width") == NULL) error("Can't Load Width"); int lW = cString::ToInt(pLayerChildElem->Attribute("Width"), 0); if (pLayerChildElem->Attribute("Height") == NULL) error("Can't Load Height"); int lH = cString::ToInt(pLayerChildElem->Attribute("Height"), 0); bool bCollide = cString::ToBool(pLayerChildElem->Attribute("Collide"), true); bool bLit = cString::ToBool(pLayerChildElem->Attribute("Lit"), true); float fZ = cString::ToFloat(pLayerChildElem->Attribute("Z"), 0); cTileLayer *pTileLayer = hplNew(cTileLayer, (lW, lH, bCollide, bLit, eTileLayerType_Normal)); pTileLayer->SetZ(fZ); mpTileMap->AddTileLayerFront(pTileLayer); //// THE TILES //////// TiXmlElement *pTileRowElem = pLayerChildElem->FirstChildElement(); int lRowCount = 0; while (pTileRowElem) { // Log("Tile Row: "); int lColCount = 0; tString sData = pTileRowElem->Attribute("Data"); int lDataCount = 0; while (lDataCount < (int)sData.size()) { cTile *pTile = hplNew(cTile, (NULL, eTileRotation_0, cVector3f((float)lColCount * fTileSize, (float)lRowCount * fTileSize, fZ), cVector2f(fTileSize, fTileSize), NULL)); lDataCount = LoadTileData(pTile, &sData, lDataCount); if (pTile->GetTileData()) { // Create the collision mesh if (pTileLayer->HasCollision()) { cCollisionMesh2D *pCollMesh = NULL; cTileDataNormal *pTData; pTData = static_cast(pTile->GetTileData()); if (pTData->GetCollideMesh()) { pCollMesh = pTData->GetCollideMesh()->CreateCollisonMesh( cVector2f(pTile->GetPosition().x, pTile->GetPosition().y), cVector2f(2), pTile->GetAngle()); } pTile->SetCollisionMesh(pCollMesh); } // Add tile to the layer pTileLayer->SetTile(lColCount, lRowCount, pTile); } else { hplDelete(pTile); } lColCount++; } // Log("\n"); lRowCount++; pTileRowElem = pTileRowElem->NextSiblingElement(); } pLayerChildElem = pLayerChildElem->NextSiblingElement(); } } pTileMapChildElem = pTileMapChildElem->NextSiblingElement(); } // Set the inverse shadow layer. mpTileMap->SetShadowLayer(mpTileMap->GetTileLayerNum() - lShadowLayer - 1); } pHplMapChildElem = pHplMapChildElem->NextSiblingElement(); } hplDelete(pDoc); return true; } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // PRIVATE METHODS ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- void cWorld2D::UpdateSoundSources() { tSoundSourceListIt it = mlstSoundSources.begin(); while (it != mlstSoundSources.end()) { (*it)->UpdateLogic(0); if ((*it)->IsDead()) { it = mlstSoundSources.erase(it); } else { it++; } } } //----------------------------------------------------------------------- void cWorld2D::UpdateParticles() { /*tGrid2DObjectMapIt it = mpMapParticles->GetAllMap()->begin(); while(it != mpMapParticles->GetAllMap()->end()) { iParticleSystem2D *pEntity = static_cast(it->second->GetEntity()); pEntity->UpdateLogic(0); it++; //Check if the system is alive, else destroy if(pEntity->IsDead()){ DestroyParticleSystem(pEntity); } }*/ } //----------------------------------------------------------------------- void cWorld2D::RenderParticles(cCamera2D *apCamera) { /*cRect2f ClipRect; apCamera->GetClipRect(ClipRect); iGridMap2DIt* pEntityIt = mpMapParticles->GetRectIterator(ClipRect); while(pEntityIt->HasNext()) { iParticleSystem2D* pEntity = static_cast(pEntityIt->Next()); pEntity->Render(); } hplDelete(pEntityIt);*/ } //----------------------------------------------------------------------- void cWorld2D::UpdateEntities() { tGrid2DObjectMapIt it = mpMapImageEntities->GetAllMap()->begin(); while (it != mpMapImageEntities->GetAllMap()->end()) { iEntity2D *pEntity = static_cast(it->second->GetEntity()); if (pEntity->IsActive()) pEntity->UpdateLogic(0); it++; } } //----------------------------------------------------------------------- void cWorld2D::UpdateBodies() { tGrid2DObjectMapIt it = mpMapBodies->GetAllMap()->begin(); while (it != mpMapBodies->GetAllMap()->end()) { cBody2D *pBody = static_cast(it->second->GetEntity()); if (pBody->IsActive()) pBody->UpdateLogic(0); it++; } } //----------------------------------------------------------------------- void cWorld2D::UpdateLights() { tGrid2DObjectMapIt it = mpMapLights->GetAllMap()->begin(); while (it != mpMapLights->GetAllMap()->end()) { iLight2D *pLight = static_cast(it->second->GetEntity()); if (pLight->IsActive()) pLight->UpdateLogic(0); it++; } } //----------------------------------------------------------------------- void cWorld2D::RenderImagesEntities(cCamera2D *apCamera) { cRect2f ClipRect; apCamera->GetClipRect(ClipRect); iGridMap2DIt *pEntityIt = mpMapImageEntities->GetRectIterator(ClipRect); while (pEntityIt->HasNext()) { cImageEntity *pEntity = static_cast(pEntityIt->Next()); if (pEntity->IsActive()) { pEntity->Render(); } } hplDelete(pEntityIt); } //----------------------------------------------------------------------- int cWorld2D::LoadTileData(cTile *apTile, tString *asData, int alStart) { int lCount = alStart; int lStart = lCount; int lValType = 0; int lSet = 0; int lNum; while (true) { if (asData->c_str()[lCount] == ':' || asData->c_str()[lCount] == '|') { if (lStart != lCount) { tString sVal = asData->substr(lStart, lCount - lStart); int lVal = cString::ToInt(sVal.c_str(), -1); cTileSet *pSet = NULL; cTileDataNormal *pData = NULL; switch (lValType) { case 0: lSet = lVal; break; case 1: lNum = lVal; if (lSet < 0) break; if (lNum < 0) break; pSet = mpTileMap->GetTileSet(lSet); if (pSet == NULL) error("Error getting tileset%d", lSet); pData = static_cast(pSet->Get(lNum)); apTile->SetTileData(pData); break; case 2: apTile->SetAngle((eTileRotation)lVal); break; case 3: apTile->SetFlags(eTileFlag_Breakable); } lValType++; } if (asData->c_str()[lCount] == '|') { /*if(apTile->GetTileData()) Log("%d,%d,%d|",lSet,lNum,apTile->GetAngle()); else Log("N|");*/ break; } lStart = lCount + 1; } lCount++; } return lCount + 1; } //----------------------------------------------------------------------- } // namespace hpl