void LevelLoader::LoadLevelFromFile(std::string levelFilename) { FRAMEWORK->GetLogger()->dbglog("\nLoading level from level file: %s", levelFilename.c_str()); XmlParser* parser = new XmlParser(); parser->ParseXmlFile(FRAMEWORK->GetFileSystemUtils()->GetDeviceBaseResourcesPath() + "levels/" + levelFilename); #ifdef DEBUG parser->Print(); #endif // DEBUG XmlTree* xmlTree = parser->GetXmlTree(); ASSERT(xmlTree != nullptr, "Got valid xmlTree from parser for level file %s", levelFilename.c_str()); XmlNode* levelNode = xmlTree->GetRootNode(); ASSERT(levelNode != nullptr && levelNode->GetName() == LEVEL_TAG, "Got valid level node from xml tree for level file %s", levelFilename.c_str()); std::string bgm = levelNode->GetAttributeValueS(BGM_ATTRIBUTE); if (bgm != "") { AudioSource* bgmSource = SINGLETONS->GetMenuManager()->GetBGMSource(); bgmSource->LoadAudioClip(LEVEL_BGM, "audio/" + bgm); } XmlNode* gridNode = levelNode->GetFirstChildByNodeName(GRID_TAG); VERIFY(gridNode != nullptr, "Level definition contains <%s> node", GRID_TAG); SINGLETONS->GetGridManager()->loadGridDataFromXml(gridNode); // Create the shady camera before we load any objects because their AudioSource components will need it createCamera(); XmlNode* staticNode = levelNode->GetFirstChildByNodeName(STATIC_TAG); // The level doesn't need to have a STATIC_TAG node if (staticNode != nullptr) { loadStaticDataFromXml(staticNode); } XmlNode* otherDataNode = levelNode->GetFirstChildByNodeName(OTHER_TAG); // The level doesn't need to have an OTHER_TAG node if (otherDataNode != nullptr) { loadOtherDataFromXml(otherDataNode); } XmlNode* unitBaseNode = levelNode->GetFirstChildByNodeName(UNITS_TAG); VERIFY(unitBaseNode != nullptr, "Level definition contains <%s> node", UNITS_TAG); loadUnitDataFromXml(unitBaseNode); XmlNode* linkBaseNode = levelNode->GetFirstChildByNodeName(LINKS_TAG); VERIFY(linkBaseNode != nullptr, "Level definition contains <%s> node", LINKS_TAG); if (linkBaseNode != nullptr) { loadLinkDataFromXml(linkBaseNode); loadParentConnectionsFromXml(linkBaseNode); loadEndConditionsFromXml(linkBaseNode); } XmlNode* cameraNode = levelNode->GetFirstChildByNodeName(CAMERA_TAG); VERIFY(cameraNode != nullptr, "Level definition contains <%s> node", CAMERA_TAG); loadCameraDataFromXml(cameraNode); delete parser; SINGLETONS->GetMenuManager()->PlayBGM(LEVEL_BGM); idsFromXml.clear(); LevelLoader::adjustLighting(); LevelLoader::postLoadLevel(); }