Exemple #1
0
ROOM_CONS(ShardRoom, bool orb)
{
	m_radius = 4;
    boost::random::uniform_int_distribution<> xDist(2+m_radius,w-2-m_radius);
    boost::random::uniform_int_distribution<> yDist(2+m_radius,h-2-m_radius);
    m_x = xDist(RAND);
    m_y = yDist(RAND);
    m_orb = orb;
}
Exemple #2
0
void
Dungeon::generate(Level *level)
{
	for(int i=0; i<m_width*m_height;i++){
		m_tiles[i] = m_tileFactory->getTile("Stone Floor");
	}
    generateCavern(0, m_height, 0, m_width,level);
    bool placedUber = false;
    for(int i=0;i<4;i++){
        for(int ii=0;ii<80;ii++){
            boost::random::uniform_int_distribution<> xDist(1,DUNGEON_WIN_W-2);
            boost::random::uniform_int_distribution<> yDist(1,DUNGEON_WIN_H-2);
            int x = xDist(RAND);
            int y = yDist(RAND);
            if(level->isWalkable(x,y)){
                std::vector<std::string> tags;
                int itemLevel = level->m_dungeonLevel;
                if(!placedUber){
                    itemLevel += 3;
                    placedUber = true;
                }
                Actor *actor = level->m_actorFactory.getItem(itemLevel,level,tags);
                if(actor != 0){
                    actor->m_x = x;
                    actor->m_y = y;
                    level->m_actors.push_back(actor);
                    ii=200;
                }
            }
        }
    }
    int numExtraEnemies = 10;
    if(level->m_dungeonLevel==15)
        numExtraEnemies = 150;
    for(int i=0;i<numExtraEnemies;i++){
        for(int ii=0;ii<80;ii++){
            boost::random::uniform_int_distribution<> xDist(1,DUNGEON_WIN_W-2);
            boost::random::uniform_int_distribution<> yDist(1,DUNGEON_WIN_H-2);
            int x = xDist(RAND);
            int y = yDist(RAND);
            if(level->isWalkable(x,y)){
                std::vector<std::string> tags;
                int hd = 1+level->m_dungeonLevel/4;
                if(level->m_dungeonLevel == 1){
                    hd = 0;
                }
                Actor *actor = level->m_actorFactory.getCreature(hd,level,tags);
                if(actor != 0){
                    actor->m_x = x;
                    actor->m_y = y;
                    level->m_actors.push_back(actor);
                    ii=200;
                }
            }
        }
    }
}
Exemple #3
0
ROOM_CONS(SquareRoom, int size)
{
    boost::random::uniform_int_distribution<> sizeDist(7,7);
    switch(size){
        case ROOM_SQUARE_SMALL:
            sizeDist = boost::random::uniform_int_distribution<>(4,7);break;
        case ROOM_SQUARE_MEDIUM:
            sizeDist = boost::random::uniform_int_distribution<>(6,9);break;
        case ROOM_SQUARE_LARGE:
            sizeDist = boost::random::uniform_int_distribution<>(10,13);break;
        case ROOM_SQUARE_HUGE:
            sizeDist = boost::random::uniform_int_distribution<>(15,20);break;
    }
    m_w = sizeDist(RAND);
    m_h = sizeDist(RAND);
    m_roomWidth  = m_w;
    m_roomHeight = m_h;
    boost::random::uniform_int_distribution<> xDist(2,w-2-m_w);
    boost::random::uniform_int_distribution<> yDist(2,h-2-m_h);
    m_x = xDist(RAND);
    m_y = yDist(RAND);

    boost::random::uniform_int_distribution<> doorWallDist(0,3);
    boost::random::uniform_int_distribution<> numDoorsDist(1,3);
    switch(size){
        case ROOM_SQUARE_SMALL:
            numDoorsDist = boost::random::uniform_int_distribution<>(1,2);break;
        case ROOM_SQUARE_MEDIUM:
            numDoorsDist = boost::random::uniform_int_distribution<>(1,2);break;
        case ROOM_SQUARE_LARGE:
            numDoorsDist = boost::random::uniform_int_distribution<>(1,3);break;
        case ROOM_SQUARE_HUGE:
            numDoorsDist = boost::random::uniform_int_distribution<>(2,5);break;
    }
    boost::random::uniform_int_distribution<> doorXDist(2,m_w-2);
    boost::random::uniform_int_distribution<> doorYDist(2,m_h-2);
    int numDoors = numDoorsDist(RAND);
    for(int i=0;i<numDoors;i++){
        CavernConnectivityPoint point;
        int doorWall = doorWallDist(RAND);
        point.x = doorXDist(RAND) + m_x;
        point.y = doorYDist(RAND) + m_y;
        switch(doorWall){
            case 0: point.x = m_x;break;
            case 1: point.x = m_x + m_w-1;break;
            case 2: point.y = m_y;break;
            case 3: point.y = m_y + m_h-1;break;
        }
        point.tag = -1;
        point.type = CON_DUN;
        m_doors.push_back(point);
    }
}
	void ParticleFilter::randomizeParticles(){
		std::uniform_real_distribution<> xDist(xMin, xMax);
		std::uniform_real_distribution<> yDist(yMin, yMax);
		std::uniform_real_distribution<> dDist(dMin, dMax);
		
		for(int i = 0; i < particleCount; i++){
			particles[i].x = xDist(rnd);
			particles[i].y = yDist(rnd);
			particles[i].d = dDist(rnd);
			particles[i].w = 0.0;
		}
	}
Exemple #5
0
void
Dungeon::connectCaverns(int miny, int maxy, int minx, int maxx, char *tiles, std::vector<CavernConnectivityPoint> &points)
{
    int width = maxx-minx;
    int height = maxy-miny;
    int numSteps = 500;
    boost::random::uniform_int_distribution<> yDist(miny,maxy-1);
    boost::random::uniform_int_distribution<> xDist(minx,maxx-1);
    for(int i=0;i<numSteps;i++){
        CavernConnectivityPoint point;
        point.y = yDist(RAND);
        point.x = xDist(RAND);
        point.tag = -1;
        point.type = CON_CAV;
        if(tiles[point.x+point.y*width] == 0){
            tiles[point.x+point.y*width] = 4;
            points.push_back(point);
        }
    }
    if(points.size() > 0){
        CavernConnectivityPoint *point = &(points[0]);
        point->tag = 1;
        bool done = false;
        while(!done){
            recursiveConnectCaverns(width,height,point->y,point->x,tiles,&points);
            float closestDist = FLT_MAX;
            int   closestPoint = -1;
            int   originPoint;
            for(unsigned int i=0;i<points.size();i++){
                if(points[i].tag == 1){
                    for(unsigned int ii=0;ii<points.size();ii++){
                        CavernConnectivityPoint &tmpPoint = points[ii];
                        if(tmpPoint.tag == -1 && (tmpPoint.roomID != points[i].roomID || tmpPoint.type != CON_DUN)){
                            float y = tmpPoint.y - points[i].y;
                            float x = tmpPoint.x - points[i].x;
                            float dist = y*y + x*x;
                            if(dist < closestDist){
                                closestDist  = dist;
                                closestPoint = ii;
                                originPoint  = i;
                            }
                        }
                    }
                }
            }
            if(closestPoint != -1){
                CavernConnectivityPoint &cp = points[closestPoint];
                CavernConnectivityPoint &op = points[originPoint];
                drawPath(op.y,cp.y,op.x,cp.x,width,tiles,setFloor);
                cp.tag = 1;
                point = &cp;
            }
            else{
                done = true;
            }
        }
        for(int i=0;i<width*height;i++){
            if(tiles[i] < 126){
                if(tiles[i]>1){
                    tiles[i] = 0;
                }
                else{
                    tiles[i] = 1;
                }
            }
        }
    }
}
Exemple #6
0
void
SquareRoom::decorateRoom(Tile *tiles, TileFactory *tileFactory, std::vector<DecorationPlacement> &places)
{
    boost::random::uniform_int_distribution<> xDist(1,m_w-2);
    boost::random::uniform_int_distribution<> yDist(1,m_h-2);
    double weights[] = {
		0.20f,
        1.00f,
        1.00f,
        1.00f,
        1.50f,
        0.30f,
    };
    boost::random::discrete_distribution<> patternDist(weights);
    int pattern = patternDist(RAND) -1;
    if(pattern >=0){
        if(m_w < 4 || m_h < 4){
            addDecoration(xDist(RAND),yDist(RAND),DEC_RANDOM,places);
        }
        else{
            switch(pattern){
                case 0: // corners
                    addDecoration(  1  ,  1  ,DEC_PATTERN,places);
                    addDecoration(  1  ,m_h-2,DEC_PATTERN,places);
                    addDecoration(m_w-2,  1  ,DEC_PATTERN,places);
                    addDecoration(m_w-2,m_h-2,DEC_PATTERN,places);
                    break;
                case 1: // corners, one in from walls
                    addDecoration(  2  ,  2  ,DEC_PATTERN,places);
                    addDecoration(  2  ,m_h-3,DEC_PATTERN,places);
                    addDecoration(m_w-3,  2  ,DEC_PATTERN,places);
                    addDecoration(m_w-3,m_h-3,DEC_PATTERN,places);
                    break;
                case 2: // one random
                    addDecoration(xDist(RAND),yDist(RAND),DEC_RANDOM,places);
                    break;
                case 3: // few random
                    {
                        boost::random::uniform_int_distribution<> numDist(1,3);
                        //int numRand = numDist(RAND);
                        for(int i=0;i<m_w;i++){
                            addDecoration(xDist(RAND),yDist(RAND),DEC_RANDOM,places);
                        }
                    }
                    break;
                case 4: // many random
                    {
                        boost::random::uniform_int_distribution<> numDist(4,7);
                        //int numRand = numDist(RAND);
                        for(int i=0;i<m_w;i++){
                            addDecoration(xDist(RAND),yDist(RAND),DEC_RANDOM,places);
                        }
                    }
                    break;
            }
        }
    }
    for(unsigned int i=0;i<m_doors.size();i++){
        CavernConnectivityPoint &point = m_doors[i];
        addDecoration(point.x-m_x,point.y-m_y,DEC_DOOR,places);
    }
}
Exemple #7
0
void
Room::decorate(char *charTiles, Tile *tiles, TileFactory *tileFactory, Level *level)
{
    std::vector<std::string> creatureTags;
    std::vector<DecorationPlacement> decorationPlacements;
    std::vector<Decoration *> decorations;
    decorateRoom(tiles, tileFactory, decorationPlacements);
    int patternId = -1;
    int randomId  = -1;
    int doorId    = -1;
    for(unsigned int i=0;i<decorationPlacements.size();i++){
        DecorationPlacement &place = decorationPlacements[i];
        Decoration *dec;
        if(place.m_type == DEC_PATTERN)
            dec = getPatternDecoration(patternId,place, creatureTags);
        if(place.m_type == DEC_RANDOM)
            dec = getRandomDecoration(randomId, place, creatureTags);
        if(place.m_type == DEC_DOOR)
            dec = getDoorDecoration(doorId, place, creatureTags,-1);
        if(place.m_type == DEC_DOOR_CLOSED)
            dec = getDoorDecoration(doorId, place, creatureTags, 1);
        if(place.m_type == DEC_STAIRS_DOWN){
            if(level->m_dungeonLevel < 15){
                dec = getStairsDecoration(doorId, place, creatureTags, true);
            }
            else{
                dec = getRandomDecoration(randomId, place, creatureTags);
            }
        }
        if(place.m_type == DEC_STAIRS_UP)
            dec = getStairsDecoration(doorId, place, creatureTags, false);
        if(place.m_type == DEC_SHARD)
            dec = getShardDecoration(doorId, place, creatureTags);
        if(dec != 0){
            if(dec->validate(charTiles)){
                dec->reserve(charTiles);
                decorations.push_back(dec);
            }
            else{
                delete dec;
            }
        }
    }
    for(unsigned int i=0;i<decorations.size();i++){
        decorations[i]->render(tiles, tileFactory, level);
        delete decorations[i];
    }
    if(m_roomWidth > 0 && m_roomHeight > 0){
        boost::random::uniform_int_distribution<> creatureNumDist(3,5);
        boost::random::uniform_int_distribution<> xDist(0,m_roomWidth-1);
        boost::random::uniform_int_distribution<> yDist(0,m_roomHeight-1);
        int numCreatures = creatureNumDist(RAND);
        for(int i=0;i<numCreatures;i++){
            int x = xDist(RAND);
            int y = yDist(RAND);
            Tile *tile = getTile(x,y,tiles);
            if(tile != 0 && tile->m_walkable){
                int hd = 1+level->m_dungeonLevel/4;
                Actor *actor = level->m_actorFactory.getCreature(hd,level,creatureTags);
                if(actor != 0){
                    actor->m_x = m_x+x;
                    actor->m_y = m_y+y;
                    level->m_actors.push_back(actor);
                }
            }
        }
    }
}