Esempio n. 1
0
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();


}
Esempio n. 2
0
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();
        }
    }
}