void DunGen::Generate(int xCap,int yCap,int difficulty) { srand(time(NULL)); //blankTexture.loadFromFile("sprites/dungeon_sprites/emptytile.png"); //lvlTexture.loadFromFile("sprites/dungeon_sprites/room.png"); //stairTexture.loadFromFile("sprites/dungeon_sprites/dstair.png"); ResetLevel(); Tunnels(xCap,yCap,difficulty,3); Rooms(xCap,yCap,difficulty,4); PlaceChest(difficulty); SpriteGenerate(); }
void SceneManagerDungeon::Generate(int tileWidth, int tileHeight, Enums::GenerationType type, bool loadSaved) { int nrLayers = 5; m_minimapColor.resize(MapFillDungeon::TILE_TYPE_END); m_minimapColor[MapFillDungeon::Wall] = sf::Color::White; m_minimapColor[MapFillDungeon::Space] = sf::Color::Black; m_minimapColor[MapFillDungeon::InteractableWall] = sf::Color::White; m_minimapColor[MapFillDungeon::BlockingItem] = sf::Color::Black; m_minimapColor[MapFillDungeon::WalkthroughItem] = sf::Color::Black; m_minimapColor[MapFillDungeon::Stairs] = sf::Color::Red; //Define Tile Maps SetMemberStats(); #ifdef DEBUG_FLAG m_map.init(nrLayers + 1); #else m_map.init(nrLayers); #endif // DEBUG_FLAG //Generate Map switch(type) { case Enums::Cave: if(tileHeight > 200 || tileWidth > 200) m_generator.FasterCellularAutomata(0.45f); else m_generator.CellularAutomata(0.45f); break; case Enums::Dungeon: m_generator.ConnectedRooms(10,8, tileHeight * tileWidth / 160); } m_generator.NumberRooms(); //Fill Base Layer with walkable Tile m_mapFill->FillLayer(MapFill::Ground, 0); if(m_wallAbove) { //Fill Wall m_mapFill->FillLayer(MapFill::Wall, 0,3); //Fill Wall Topping m_mapFill->FillLayer(MapFill::WallTopping, 3); } else { //Fill Wall m_mapFill->FillLayer(MapFill::WallBelow, 3); } #ifdef DEBUG_FLAG for(int x = 0; x < m_map.GetWidth(); x++) { for(int y = 0; y < m_map.GetHeight(); y++) m_map.SetTileId(x,y,m_map.GetRoomNr(x,y), 5); } m_map.writeToTileMap(*m_tileMapRoomNumber,nrLayers); #endif // DEBUG_FLAG m_generator.PlaceStartingAndEndPosition(); sf::Transform heroTransform; //Place Hero at Startposition if(m_newHeroPos) { heroTransform.translate(m_heroX, m_heroY); } else { heroTransform.translate(m_map.m_startX * TileMap::GetTileWidth(), m_map.m_startY * TileMap::GetTileWidth() - 14); } m_hero->setTransform(heroTransform); UpdateCamPosition(); //Add random Items m_mapFill->FillLayer(MapFill::AdditionalItems, 1,2,4); //Place Stairs m_mapFill->PlaceItemAt(1,2,4,MapFillDungeon::TileStairsUp,m_map.m_startX, m_map.m_startY, false); m_mapFill->PlaceItemAt(1,2,4,MapFillDungeon::TileStairsDown,m_map.m_endX, m_map.m_endY, false); //Place Chests PlaceChest(loadSaved); if(!loadSaved) { m_events.push_back(std::unique_ptr<MapEvent>(new MapEventStairs(false, m_map.m_startX, m_map.m_startY))); m_events.push_back(std::unique_ptr<MapEvent>(new MapEventStairs(true, m_map.m_endX, m_map.m_endY))); //Place additional heroes with a chance of 2% if(rand() % 50 == 0) PlaceHero(); } m_map.writeToTileMap(*m_tileMap,0); m_map.writeToTileMap(*m_tileMapItems,1); m_map.writeToTileMap(*m_tileMapAboveHero,2); if(m_wallAbove) { sf::Color halfTransparent(255,255,255,Configuration::GetInstance()->GetWallTransparency() * 255); m_map.writeToTileMap(*m_tileMapAboveWall,3, halfTransparent); m_map.writeToTileMap(*m_tileMapWallDecoration,4); } else { m_map.writeToTileMap(*m_tileMapBelowGround,3); m_map.writeToTileMap(*m_tileMapBelowGroundDecoration,4); } if(!loadSaved) { //Place Boss at Stairs MapEventEnemy* mapEvent = new MapEventEnemy(0.0f, Enums::EnemyBoss); SpawnEnemy(mapEvent, Enums::EnemyBoss, m_map.m_endX * TileMap::GetTileWidth(), m_map.m_endY * TileMap::GetTileWidth()); m_events.push_back(std::unique_ptr<MapEvent>(mapEvent)); int nrEnemies = m_map.GetWidth() * m_map.GetHeight() / 300; for(int i = 0; i < nrEnemies; i++) { SpawnEnemy(); } } }