📄 level.c
字号:
for (i = middle; i != row2; i++) { dungeon[i][col2] = TUNNEL; } } if (rand_percent(HIDE_PERCENT)) { hide_boxed_passage(row1, col1, row2, col2, 1); }}same_row(room1, room2){ return((room1 / 3) == (room2 / 3));}same_col(room1, room2){ return((room1 % 3) == (room2 % 3));}add_mazes(){ short i, j; short start; short maze_percent; if (cur_level > 1) { start = get_rand(0, (MAXROOMS-1)); maze_percent = (cur_level * 5) / 4; if (cur_level > 15) { maze_percent += cur_level; } for (i = 0; i < MAXROOMS; i++) { j = ((start + i) % MAXROOMS); if (rooms[j].is_room & R_NOTHING) { if (rand_percent(maze_percent)) { rooms[j].is_room = R_MAZE; make_maze(get_rand(rooms[j].top_row+1, rooms[j].bottom_row-1), get_rand(rooms[j].left_col+1, rooms[j].right_col-1), rooms[j].top_row, rooms[j].bottom_row, rooms[j].left_col, rooms[j].right_col); hide_boxed_passage(rooms[j].top_row, rooms[j].left_col, rooms[j].bottom_row, rooms[j].right_col, get_rand(0, 2)); } } } }}fill_out_level(){ short i, rn; mix_random_rooms(); r_de = NO_ROOM; for (i = 0; i < MAXROOMS; i++) { rn = random_rooms[i]; if ((rooms[rn].is_room & R_NOTHING) || ((rooms[rn].is_room & R_CROSS) && coin_toss())) { fill_it(rn, 1); } } if (r_de != NO_ROOM) { fill_it(r_de, 0); }}fill_it(rn, do_rec_de)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; }}recursive_deadend(rn, offsets, srow, scol)short rn;short *offsets;short srow, scol;{ short i, de; short drow, dcol, tunnel_dir; rooms[rn].is_room = R_DEADEND; dungeon[srow][scol] = TUNNEL; for (i = 0; i < 4; i++) { de = rn + offsets[i]; if (((de < 0) || (de >= MAXROOMS)) || (!(same_row(rn, de) || same_col(rn, de)))) { continue; } if (!(rooms[de].is_room & R_NOTHING)) { continue; } drow = (rooms[de].top_row + rooms[de].bottom_row) / 2; dcol = (rooms[de].left_col + rooms[de].right_col) / 2; if (same_row(rn, de)) { tunnel_dir = (rooms[rn].left_col < rooms[de].left_col) ? RIGHT : LEFT; } else { tunnel_dir = (rooms[rn].top_row < rooms[de].top_row) ? DOWN : UPWARD; } draw_simple_passage(srow, scol, drow, dcol, tunnel_dir); r_de = de; recursive_deadend(de, offsets, drow, dcol); }}booleanmask_room(rn, row, col, mask)short rn;short *row, *col;unsigned short mask;{ short i, j; for (i = rooms[rn].top_row; i <= rooms[rn].bottom_row; i++) { for (j = rooms[rn].left_col; j <= rooms[rn].right_col; j++) { if (dungeon[i][j] & mask) { *row = i; *col = j; return(1); } } } return(0);}make_maze(r, c, tr, br, lc, rc)short r, c, tr, br, lc, rc;{ char dirs[4]; short i, t; dirs[0] = UPWARD; dirs[1] = DOWN; dirs[2] = LEFT; dirs[3] = RIGHT; dungeon[r][c] = TUNNEL; if (rand_percent(20)) { for (i = 0; i < 10; i++) { short t1, t2; t1 = get_rand(0, 3); t2 = get_rand(0, 3); swap(dirs[t1], dirs[t2]); } } for (i = 0; i < 4; i++) { switch(dirs[i]) { case UPWARD: if (((r-1) >= tr) && (dungeon[r-1][c] != TUNNEL) && (dungeon[r-1][c-1] != TUNNEL) && (dungeon[r-1][c+1] != TUNNEL) && (dungeon[r-2][c] != TUNNEL)) { make_maze((r-1), c, tr, br, lc, rc); } break; case DOWN: if (((r+1) <= br) && (dungeon[r+1][c] != TUNNEL) && (dungeon[r+1][c-1] != TUNNEL) && (dungeon[r+1][c+1] != TUNNEL) && (dungeon[r+2][c] != TUNNEL)) { make_maze((r+1), c, tr, br, lc, rc); } break; case LEFT: if (((c-1) >= lc) && (dungeon[r][c-1] != TUNNEL) && (dungeon[r-1][c-1] != TUNNEL) && (dungeon[r+1][c-1] != TUNNEL) && (dungeon[r][c-2] != TUNNEL)) { make_maze(r, (c-1), tr, br, lc, rc); } break; case RIGHT: if (((c+1) <= rc) && (dungeon[r][c+1] != TUNNEL) && (dungeon[r-1][c+1] != TUNNEL) && (dungeon[r+1][c+1] != TUNNEL) && (dungeon[r][c+2] != TUNNEL)) { make_maze(r, (c+1), tr, br, lc, rc); } break; } }}hide_boxed_passage(row1, col1, row2, col2, n)short row1, col1, row2, col2, n;{ short i, j, t; short row, col, row_cut, col_cut; short h, w; if (cur_level > 2) { if (row1 > row2) { swap(row1, row2); } if (col1 > col2) { swap(col1, col2); } h = row2 - row1; w = col2 - col1; if ((w >= 5) || (h >= 5)) { row_cut = ((h >= 2) ? 1 : 0); col_cut = ((w >= 2) ? 1 : 0); for (i = 0; i < n; i++) { for (j = 0; j < 10; j++) { row = get_rand(row1 + row_cut, row2 - row_cut); col = get_rand(col1 + col_cut, col2 - col_cut); if (dungeon[row][col] == TUNNEL) { dungeon[row][col] |= HIDDEN; break; } } } } }}put_player(nr)short nr; /* try not to put in this room */{ short rn = nr, misses; short row, col; for (misses = 0; ((misses < 2) && (rn == nr)); misses++) { gr_row_col(&row, &col, (FLOOR | TUNNEL | OBJECT | STAIRS)); rn = get_room_number(row, col); } rogue.row = row; rogue.col = col; if (dungeon[rogue.row][rogue.col] & TUNNEL) { cur_room = PASSAGE; } else { cur_room = rn; } if (cur_room != PASSAGE) { light_up_room(cur_room); } else { light_passage(rogue.row, rogue.col); } rn = get_room_number(rogue.row, rogue.col); wake_room(rn, 1, rogue.row, rogue.col); if (new_level_message) { message(new_level_message, 0); new_level_message = 0; } mvaddch(rogue.row, rogue.col, rogue.fchar);}drop_check(){ if (wizard) { return(1); } if (dungeon[rogue.row][rogue.col] & STAIRS) { if (levitate) { message("you're floating in the air!", 0); return(0); } return(1); } message("I see no way down", 0); return(0);}check_up(){ if (!wizard) { if (!(dungeon[rogue.row][rogue.col] & STAIRS)) { message("I see no way up", 0); return(0); } if (!has_amulet()) { message("your way is magically blocked", 0); return(0); } } new_level_message = "you feel a wrenching sensation in your gut"; if (cur_level == 1) { win(); } else { cur_level -= 2; return(1); } return(0);}add_exp(e, promotion)int e;boolean promotion;{ char mbuf[40]; short new_exp; short i, hp; rogue.exp_points += e; if (rogue.exp_points >= level_points[rogue.exp-1]) { new_exp = get_exp_level(rogue.exp_points); if (rogue.exp_points > MAX_EXP) { rogue.exp_points = MAX_EXP + 1; } for (i = rogue.exp+1; i <= new_exp; i++) { sprintf(mbuf, "welcome to level %d", i); message(mbuf, 0); if (promotion) { hp = hp_raise(); rogue.hp_current += hp; rogue.hp_max += hp; } rogue.exp = i; print_stats(STAT_HP | STAT_EXP); } } else { print_stats(STAT_EXP); }}get_exp_level(e)long e;{ short i; for (i = 0; i < (MAX_EXP_LEVEL - 1); i++) { if (level_points[i] > e) { break; } } return(i+1);}hp_raise(){ int hp; hp = (wizard ? 10 : get_rand(3, 10)); return(hp);}show_average_hp(){ char mbuf[80]; float real_average; float effective_average; if (rogue.exp == 1) { real_average = effective_average = 0.00; } else { real_average = (float) ((rogue.hp_max - extra_hp - INIT_HP) + less_hp) / (rogue.exp - 1); effective_average = (float) (rogue.hp_max - INIT_HP) / (rogue.exp - 1); } sprintf(mbuf, "R-Hp: %.2f, E-Hp: %.2f (!: %d, V: %d)", real_average, effective_average, extra_hp, less_hp); message(mbuf, 0);}mix_random_rooms(){ short i, t; short x, y; for (i = 0; i < (3 * MAXROOMS); i++) { do { x = get_rand(0, (MAXROOMS-1)); y = get_rand(0, (MAXROOMS-1)); } while (x == y); swap(random_rooms[x], random_rooms[y]); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -