/* returns true or false if it saved----->do something with result to show user Saves the map in XML format hmmm using standard type members as attributes using complex objects members as nodes <map attrib1="" attrib2="" attrib3=""> <tileset> <tile attribute1="blah" /> <tile attribute1="blah" /> <tile attribute1="blah" /> <tile attribute1="blah" /> </tileset> </map> */ bool Map::SaveMap() { pugi::xml_document xmlDoc; pugi::xml_node xmlMap = xmlDoc.append_child("map"); xmlMap.append_attribute("width").set_value(width_); xmlMap.append_attribute("height").set_value(height_); //objectify player soon xmlMap.append_attribute("playerplaced").set_value(playerplaced_); xmlMap.append_attribute("playerx").set_value(playerStartX_); xmlMap.append_attribute("playery").set_value(playerStartY_); pugi::xml_node xmlTileSet = xmlMap.append_child("tilevector"); for(int i = 0; i < tiles_.size(); i++) { for(int j = 0; j < tiles_[i].size(); j++) { Tile *currentTile = &tiles_[i][j]; pugi::xml_node xmlCurrentTile = xmlTileSet.append_child("tile"); xmlCurrentTile.append_attribute("tiletype").set_value(currentTile->GetTileType()); xmlCurrentTile.append_attribute("x").set_value(currentTile->GetCurrentPositionX()); xmlCurrentTile.append_attribute("y").set_value(currentTile->GetCurrentPositionY()); xmlCurrentTile.append_attribute("clickable").set_value(currentTile->GetClickable()); xmlCurrentTile.append_attribute("color_a").set_value(currentTile->GetColor().a); xmlCurrentTile.append_attribute("color_b").set_value(currentTile->GetColor().b); xmlCurrentTile.append_attribute("color_g").set_value(currentTile->GetColor().g); xmlCurrentTile.append_attribute("color_r").set_value(currentTile->GetColor().r); xmlCurrentTile.append_attribute("height").set_value(currentTile->GetHeight()); xmlCurrentTile.append_attribute("width").set_value(currentTile->GetWidth()); xmlCurrentTile.append_attribute("movespeed").set_value(currentTile->GetMoveSpeed()); if(currentTile->GetHasImage()) { pugi::xml_node xmlCurrentImage = xmlCurrentTile.append_child("image"); xmlCurrentImage.append_attribute("id").set_value(currentTile->GetObjectImage()->GetId()); } } } return xmlDoc.save_file(al_path_cstr(mapPath_,'/')); }
///===================================================== /// ///===================================================== void Game::UpdatePlayingState(OpenGLRenderer* renderer){ PROFILE_CATEGORY(Gameplay); if (s_theInputSystem->GetKeyWentDown(VK_ESCAPE)){ //go back to Quest SetState(Quest); m_titleRenderer.ClearText(); m_titleRenderer.PrintText("Quests"); DestroyCurrentGame(renderer); } else if (s_theInputSystem->GetKeyWentDown('M')){ //toggle map visibility m_forceMapVisible = !m_forceMapVisible; } else if (s_theInputSystem->IsKeyDown('P')){ //test pathfinding static IntVec2 goal; if (m_player->m_path.HasFinishedPath()){ Tile randomTile = m_map->GetRandomTile(); while (randomTile.GetTileType() != TileType::Air) randomTile = m_map->GetRandomTile(); goal = randomTile.m_position; } m_player->PathfindToDestination(goal, true, false); } else if (m_messageBar.m_isWaitingForPlayer){ if (s_theInputSystem->GetKeyWentDown(VK_SPACE)){ //read more messages in the message bar m_messageBar.m_isWaitingForPlayer = false; m_messageBar.m_text.clear(); } } else if (m_savedGame){ //return to main menu after save game SetState(MainMenu); m_player->Die(); DestroyCurrentGame(renderer); m_titleRenderer.ClearText(); m_titleRenderer.PrintText("Dagger", RGBAchars::RED); m_menuRenderer.ClearText(); m_menuRenderer.PrintText("N) New Game"); m_menuRenderer.PrintText("L) Load Game"); m_menuRenderer.PrintText("Q) Quit"); m_menuRenderer.ToggleRenderFromCenter(); m_bottomMessageRenderer.ClearText(); m_savedGame = false; } else if (s_theInputSystem->GetCurrentCharacterDown() == 'S'){ //save game HandleDeadEntities(renderer); SaveGame(); } ///========================================================================================================================================== /// GAMEPLAY ///========================================================================================================================================== else{ if (Actor::s_actorsOnMap.size() == 1){ //only have a player... the following code would crash in that case UpdatePlayer(renderer); return; } //pre-compute what each AI plans to do, so the Group AI system can make adjustments before actually making moves Actors::const_iterator actorIter = Actor::s_actorsOnMap.cbegin(); float maxSpeed = actorIter->first + 1.0f; if (!actorIter->second->IsPlayer()){ for (; actorIter != Actor::s_actorsOnMap.cend(); ++actorIter){ Actor* actor = actorIter->second; if (actor->IsPlayer()){ break; } else{ ((NPC*)actor)->PlanNextThink(); } } m_AISystem.PlanNextMove(*m_player); actorIter = Actor::s_actorsOnMap.cbegin(); } //everyone moves for (; actorIter != Actor::s_actorsOnMap.cend() && actorIter->first < maxSpeed;){ Actor* actor = actorIter->second; if (actor->IsPlayer()){ bool didMove = UpdatePlayer(renderer); if (didMove){ float turnOrder = actorIter->first; actorIter = Actor::s_actorsOnMap.erase(actorIter); Actor::s_actorsOnMap.emplace(++turnOrder, actor); } return; } else{ actor->Think(true); float turnOrder = actorIter->first; actorIter = Actor::s_actorsOnMap.erase(actorIter); Actor::s_actorsOnMap.emplace(++turnOrder, actor); } } } }