⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 level.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -