示例#1
0
static void
fill_it(int rn, boolean do_rec_de)
{
    short i, tunnel_dir, door_dir, drow, dcol;
    short target_room, rooms_found = 0;
    short srow, scol, t;
    static short offsets[4] = {-1, 1, 3, -3};
    boolean did_this = 0;

    for (i = 0; i < 10; i++) {
        srow = get_rand(0, 3);
        scol = get_rand(0, 3);
        t = offsets[srow];
        offsets[srow] = offsets[scol];
        offsets[scol] = t;
    }
    for (i = 0; i < 4; i++) {

        target_room = rn + offsets[i];

        if (((target_room < 0) || (target_room >= MAXROOMS)) ||
                (!(same_row(rn,target_room) || same_col(rn,target_room))) ||
                (!(rooms[target_room].is_room & (R_ROOM | R_MAZE)))) {
            continue;
        }
        if (same_row(rn, target_room)) {
            tunnel_dir = (rooms[rn].left_col < rooms[target_room].left_col) ?
                         RIGHT : LEFT;
        } else {
            tunnel_dir = (rooms[rn].top_row < rooms[target_room].top_row) ?
                         DOWN : UPWARD;
        }
        door_dir = ((tunnel_dir + 4) % DIRS);
        if (rooms[target_room].doors[door_dir/2].oth_room != NO_ROOM) {
            continue;
        }
        if (((!do_rec_de) || did_this) ||
                (!mask_room(rn, &srow, &scol, TUNNEL))) {
            srow = (rooms[rn].top_row + rooms[rn].bottom_row) / 2;
            scol = (rooms[rn].left_col + rooms[rn].right_col) / 2;
        }
        put_door(&rooms[target_room], door_dir, &drow, &dcol);
        rooms_found++;
        draw_simple_passage(srow, scol, drow, dcol, tunnel_dir);
        rooms[rn].is_room = R_DEADEND;
        dungeon[srow][scol] = TUNNEL;

        if ((i < 3) && (!did_this)) {
            did_this = 1;
            if (coin_toss()) {
                continue;
            }
        }
        if ((rooms_found < 2) && do_rec_de) {
            recursive_deadend(rn, offsets, srow, scol);
        }
        break;
    }
}
示例#2
0
文件: arena.c 项目: linehan/barnacle
struct map_t *map_preset_arena(void)
{
        struct map_t *arena;
        struct map_t *cave;
        double **armap;
        int i;
        int j;

        armap = empty_simplex_matrix(FULLSCREEN);
       
        for (i=0; i<LINES; i++) {
        for (j=0; j<COLS; j++) {
                if (i >= ARENA_H/2 && i <= LINES-ARENA_H/2
                &&  j >= ARENA_W/2 && j <= COLS-ARENA_W/2)
                        armap[i][j] = BEACH_F;
                else if (i > ISLAND_H_LO && i < ISLAND_H_HI 
                &&       j > ISLAND_W_LO-2 && j < ISLAND_W_HI)
                {
                        if (i > ISLAND_H_LO+ISLAND_FAT+5
                        &&  i < ISLAND_H_HI-ISLAND_FAT
                        &&  j < ISLAND_W_LO+ISLAND_FAT+1) {
                                if (j > ISLAND_W_LO+ISLAND_FAT-2)
                                        armap[i][j] = BEACH_F;
                                else
                                        armap[i][j] = -0.05;
                        } else {
                                armap[i][j] = TERRA_F;
                        }
                }
                else
                        armap[i][j] = -0.05;
        }
        }
       
        arena = new_map(FULLSCREEN);
        map_gen(arena, armap, MAP_NOSMOOTH);

        /* Make a cave entrance */
        cave = new_dungeon();
        put_door(CAVE_DOOR, arena, cave, 
                 1, 1, ARENA_H/2-1, COLS/2,
                 1, 1, LINES/2-10, COLS/2);

        cave_connect_door(cave);
        map_render(arena);
        map_render(cave);

        return arena;
}
示例#3
0
static int
connect_rooms(short room1, short room2)
{
    short row1, col1, row2, col2, dir;

    if ((!(rooms[room1].is_room & (R_ROOM | R_MAZE))) ||
            (!(rooms[room2].is_room & (R_ROOM | R_MAZE)))) {
        return(0);
    }
    if (same_row(room1, room2) &&
            (rooms[room1].left_col > rooms[room2].right_col)) {
        put_door(&rooms[room1], LEFT, &row1, &col1);
        put_door(&rooms[room2], RIGHT, &row2, &col2);
        dir = LEFT;
    } else if (same_row(room1, room2) &&
               (rooms[room2].left_col > rooms[room1].right_col)) {
        put_door(&rooms[room1], RIGHT, &row1, &col1);
        put_door(&rooms[room2], LEFT, &row2, &col2);
        dir = RIGHT;
    } else if (same_col(room1, room2) &&
               (rooms[room1].top_row > rooms[room2].bottom_row)) {
        put_door(&rooms[room1], UPWARD, &row1, &col1);
        put_door(&rooms[room2], DOWN, &row2, &col2);
        dir = UPWARD;
    } else if (same_col(room1, room2) &&
               (rooms[room2].top_row > rooms[room1].bottom_row)) {
        put_door(&rooms[room1], DOWN, &row1, &col1);
        put_door(&rooms[room2], UPWARD, &row2, &col2);
        dir = DOWN;
    } else {
        return(0);
    }

    do {
        draw_simple_passage(row1, col1, row2, col2, dir);
    } while (rand_percent(4));

    rooms[room1].doors[dir/2].oth_room = room2;
    rooms[room1].doors[dir/2].oth_row = row2;
    rooms[room1].doors[dir/2].oth_col = col2;

    rooms[room2].doors[(((dir+4)%DIRS)/2)].oth_room = room1;
    rooms[room2].doors[(((dir+4)%DIRS)/2)].oth_row = row1;
    rooms[room2].doors[(((dir+4)%DIRS)/2)].oth_col = col1;
    return(1);
}