|
|
1.1 ! root 1: /* ! 2: * level.c ! 3: * ! 4: * This source herein may be modified and/or distributed by anybody who ! 5: * so desires, with the following restrictions: ! 6: * 1.) No portion of this notice shall be removed. ! 7: * 2.) Credit shall not be taken for the creation of this source. ! 8: * 3.) This code is not to be traded, sold, or used for personal ! 9: * gain or profit. ! 10: * ! 11: */ ! 12: ! 13: #ifndef lint ! 14: static char sccsid[] = "@(#)level.c 5.1 (Berkeley) 11/25/87"; ! 15: #endif /* not lint */ ! 16: ! 17: #include "rogue.h" ! 18: ! 19: #define swap(x,y) {t = x; x = y; y = t;} ! 20: ! 21: short cur_level = 0; ! 22: short max_level = 1; ! 23: short cur_room; ! 24: char *new_level_message = 0; ! 25: short party_room = NO_ROOM; ! 26: short r_de; ! 27: ! 28: long level_points[MAX_EXP_LEVEL] = { ! 29: 10L, ! 30: 20L, ! 31: 40L, ! 32: 80L, ! 33: 160L, ! 34: 320L, ! 35: 640L, ! 36: 1300L, ! 37: 2600L, ! 38: 5200L, ! 39: 10000L, ! 40: 20000L, ! 41: 40000L, ! 42: 80000L, ! 43: 160000L, ! 44: 320000L, ! 45: 1000000L, ! 46: 3333333L, ! 47: 6666666L, ! 48: MAX_EXP, ! 49: 99900000L ! 50: }; ! 51: ! 52: short random_rooms[MAXROOMS] = {3, 7, 5, 2, 0, 6, 1, 4, 8}; ! 53: ! 54: extern boolean being_held, wizard, detect_monster; ! 55: extern boolean see_invisible; ! 56: extern short bear_trap, levitate, extra_hp, less_hp, cur_room; ! 57: ! 58: make_level() ! 59: { ! 60: short i, j; ! 61: short must_1, must_2, must_3; ! 62: boolean big_room; ! 63: ! 64: if (cur_level < LAST_DUNGEON) { ! 65: cur_level++; ! 66: } ! 67: if (cur_level > max_level) { ! 68: max_level = cur_level; ! 69: } ! 70: must_1 = get_rand(0, 5); ! 71: ! 72: switch(must_1) { ! 73: case 0: ! 74: must_1 = 0; ! 75: must_2 = 1; ! 76: must_3 = 2; ! 77: break; ! 78: case 1: ! 79: must_1 = 3; ! 80: must_2 = 4; ! 81: must_3 = 5; ! 82: break; ! 83: case 2: ! 84: must_1 = 6; ! 85: must_2 = 7; ! 86: must_3 = 8; ! 87: break; ! 88: case 3: ! 89: must_1 = 0; ! 90: must_2 = 3; ! 91: must_3 = 6; ! 92: break; ! 93: case 4: ! 94: must_1 = 1; ! 95: must_2 = 4; ! 96: must_3 = 7; ! 97: break; ! 98: case 5: ! 99: must_1 = 2; ! 100: must_2 = 5; ! 101: must_3 = 8; ! 102: break; ! 103: } ! 104: if (rand_percent(8)) { ! 105: party_room = 0; ! 106: } ! 107: big_room = ((party_room != NO_ROOM) && rand_percent(1)); ! 108: if (big_room) { ! 109: make_room(BIG_ROOM, 0, 0, 0); ! 110: } else { ! 111: for (i = 0; i < MAXROOMS; i++) { ! 112: make_room(i, must_1, must_2, must_3); ! 113: } ! 114: } ! 115: if (!big_room) { ! 116: add_mazes(); ! 117: ! 118: mix_random_rooms(); ! 119: ! 120: for (j = 0; j < MAXROOMS; j++) { ! 121: ! 122: i = random_rooms[j]; ! 123: ! 124: if (i < (MAXROOMS-1)) { ! 125: (void) connect_rooms(i, i+1); ! 126: } ! 127: if (i < (MAXROOMS-3)) { ! 128: (void) connect_rooms(i, i+3); ! 129: } ! 130: if (i < (MAXROOMS-2)) { ! 131: if (rooms[i+1].is_room & R_NOTHING) { ! 132: if (connect_rooms(i, i+2)) { ! 133: rooms[i+1].is_room = R_CROSS; ! 134: } ! 135: } ! 136: } ! 137: if (i < (MAXROOMS-6)) { ! 138: if (rooms[i+3].is_room & R_NOTHING) { ! 139: if (connect_rooms(i, i+6)) { ! 140: rooms[i+3].is_room = R_CROSS; ! 141: } ! 142: } ! 143: } ! 144: if (is_all_connected()) { ! 145: break; ! 146: } ! 147: } ! 148: fill_out_level(); ! 149: } ! 150: if (!has_amulet() && (cur_level >= AMULET_LEVEL)) { ! 151: put_amulet(); ! 152: } ! 153: } ! 154: ! 155: make_room(rn, r1, r2, r3) ! 156: short rn, r1, r2, r3; ! 157: { ! 158: short left_col, right_col, top_row, bottom_row; ! 159: short width, height; ! 160: short row_offset, col_offset; ! 161: short i, j, ch; ! 162: ! 163: switch(rn) { ! 164: case 0: ! 165: left_col = 0; ! 166: right_col = COL1-1; ! 167: top_row = MIN_ROW; ! 168: bottom_row = ROW1-1; ! 169: break; ! 170: case 1: ! 171: left_col = COL1+1; ! 172: right_col = COL2-1; ! 173: top_row = MIN_ROW; ! 174: bottom_row = ROW1-1; ! 175: break; ! 176: case 2: ! 177: left_col = COL2+1; ! 178: right_col = DCOLS-1; ! 179: top_row = MIN_ROW; ! 180: bottom_row = ROW1-1; ! 181: break; ! 182: case 3: ! 183: left_col = 0; ! 184: right_col = COL1-1; ! 185: top_row = ROW1+1; ! 186: bottom_row = ROW2-1; ! 187: break; ! 188: case 4: ! 189: left_col = COL1+1; ! 190: right_col = COL2-1; ! 191: top_row = ROW1+1; ! 192: bottom_row = ROW2-1; ! 193: break; ! 194: case 5: ! 195: left_col = COL2+1; ! 196: right_col = DCOLS-1; ! 197: top_row = ROW1+1; ! 198: bottom_row = ROW2-1; ! 199: break; ! 200: case 6: ! 201: left_col = 0; ! 202: right_col = COL1-1; ! 203: top_row = ROW2+1; ! 204: bottom_row = DROWS - 2; ! 205: break; ! 206: case 7: ! 207: left_col = COL1+1; ! 208: right_col = COL2-1; ! 209: top_row = ROW2+1; ! 210: bottom_row = DROWS - 2; ! 211: break; ! 212: case 8: ! 213: left_col = COL2+1; ! 214: right_col = DCOLS-1; ! 215: top_row = ROW2+1; ! 216: bottom_row = DROWS - 2; ! 217: break; ! 218: case BIG_ROOM: ! 219: top_row = get_rand(MIN_ROW, MIN_ROW+5); ! 220: bottom_row = get_rand(DROWS-7, DROWS-2); ! 221: left_col = get_rand(0, 10);; ! 222: right_col = get_rand(DCOLS-11, DCOLS-1); ! 223: rn = 0; ! 224: goto B; ! 225: } ! 226: height = get_rand(4, (bottom_row - top_row + 1)); ! 227: width = get_rand(7, (right_col - left_col - 2)); ! 228: ! 229: row_offset = get_rand(0, ((bottom_row - top_row) - height + 1)); ! 230: col_offset = get_rand(0, ((right_col - left_col) - width + 1)); ! 231: ! 232: top_row += row_offset; ! 233: bottom_row = top_row + height - 1; ! 234: ! 235: left_col += col_offset; ! 236: right_col = left_col + width - 1; ! 237: ! 238: if ((rn != r1) && (rn != r2) && (rn != r3) && rand_percent(40)) { ! 239: goto END; ! 240: } ! 241: B: ! 242: rooms[rn].is_room = R_ROOM; ! 243: ! 244: for (i = top_row; i <= bottom_row; i++) { ! 245: for (j = left_col; j <= right_col; j++) { ! 246: if ((i == top_row) || (i == bottom_row)) { ! 247: ch = HORWALL; ! 248: } else if ( ((i != top_row) && (i != bottom_row)) && ! 249: ((j == left_col) || (j == right_col))) { ! 250: ch = VERTWALL; ! 251: } else { ! 252: ch = FLOOR; ! 253: } ! 254: dungeon[i][j] = ch; ! 255: } ! 256: } ! 257: END: ! 258: rooms[rn].top_row = top_row; ! 259: rooms[rn].bottom_row = bottom_row; ! 260: rooms[rn].left_col = left_col; ! 261: rooms[rn].right_col = right_col; ! 262: } ! 263: ! 264: connect_rooms(room1, room2) ! 265: short room1, room2; ! 266: { ! 267: short row1, col1, row2, col2, dir; ! 268: ! 269: if ((!(rooms[room1].is_room & (R_ROOM | R_MAZE))) || ! 270: (!(rooms[room2].is_room & (R_ROOM | R_MAZE)))) { ! 271: return(0); ! 272: } ! 273: if (same_row(room1, room2) && ! 274: (rooms[room1].left_col > rooms[room2].right_col)) { ! 275: put_door(&rooms[room1], LEFT, &row1, &col1); ! 276: put_door(&rooms[room2], RIGHT, &row2, &col2); ! 277: dir = LEFT; ! 278: } else if (same_row(room1, room2) && ! 279: (rooms[room2].left_col > rooms[room1].right_col)) { ! 280: put_door(&rooms[room1], RIGHT, &row1, &col1); ! 281: put_door(&rooms[room2], LEFT, &row2, &col2); ! 282: dir = RIGHT; ! 283: } else if (same_col(room1, room2) && ! 284: (rooms[room1].top_row > rooms[room2].bottom_row)) { ! 285: put_door(&rooms[room1], UPWARD, &row1, &col1); ! 286: put_door(&rooms[room2], DOWN, &row2, &col2); ! 287: dir = UPWARD; ! 288: } else if (same_col(room1, room2) && ! 289: (rooms[room2].top_row > rooms[room1].bottom_row)) { ! 290: put_door(&rooms[room1], DOWN, &row1, &col1); ! 291: put_door(&rooms[room2], UPWARD, &row2, &col2); ! 292: dir = DOWN; ! 293: } else { ! 294: return(0); ! 295: } ! 296: ! 297: do { ! 298: draw_simple_passage(row1, col1, row2, col2, dir); ! 299: } while (rand_percent(4)); ! 300: ! 301: rooms[room1].doors[dir/2].oth_room = room2; ! 302: rooms[room1].doors[dir/2].oth_row = row2; ! 303: rooms[room1].doors[dir/2].oth_col = col2; ! 304: ! 305: rooms[room2].doors[(((dir+4)%DIRS)/2)].oth_room = room1; ! 306: rooms[room2].doors[(((dir+4)%DIRS)/2)].oth_row = row1; ! 307: rooms[room2].doors[(((dir+4)%DIRS)/2)].oth_col = col1; ! 308: return(1); ! 309: } ! 310: ! 311: clear_level() ! 312: { ! 313: short i, j; ! 314: ! 315: for (i = 0; i < MAXROOMS; i++) { ! 316: rooms[i].is_room = R_NOTHING; ! 317: for (j = 0; j < 4; j++) { ! 318: rooms[i].doors[j].oth_room = NO_ROOM; ! 319: } ! 320: } ! 321: ! 322: for (i = 0; i < MAX_TRAPS; i++) { ! 323: traps[i].trap_type = NO_TRAP; ! 324: } ! 325: for (i = 0; i < DROWS; i++) { ! 326: for (j = 0; j < DCOLS; j++) { ! 327: dungeon[i][j] = NOTHING; ! 328: } ! 329: } ! 330: detect_monster = see_invisible = 0; ! 331: being_held = bear_trap = 0; ! 332: party_room = NO_ROOM; ! 333: rogue.row = rogue.col = -1; ! 334: clear(); ! 335: } ! 336: ! 337: put_door(rm, dir, row, col) ! 338: room *rm; ! 339: short dir; ! 340: short *row, *col; ! 341: { ! 342: short wall_width; ! 343: ! 344: wall_width = (rm->is_room & R_MAZE) ? 0 : 1; ! 345: ! 346: switch(dir) { ! 347: case UPWARD: ! 348: case DOWN: ! 349: *row = ((dir == UPWARD) ? rm->top_row : rm->bottom_row); ! 350: do { ! 351: *col = get_rand(rm->left_col+wall_width, ! 352: rm->right_col-wall_width); ! 353: } while (!(dungeon[*row][*col] & (HORWALL | TUNNEL))); ! 354: break; ! 355: case RIGHT: ! 356: case LEFT: ! 357: *col = (dir == LEFT) ? rm->left_col : rm->right_col; ! 358: do { ! 359: *row = get_rand(rm->top_row+wall_width, ! 360: rm->bottom_row-wall_width); ! 361: } while (!(dungeon[*row][*col] & (VERTWALL | TUNNEL))); ! 362: break; ! 363: } ! 364: if (rm->is_room & R_ROOM) { ! 365: dungeon[*row][*col] = DOOR; ! 366: } ! 367: if ((cur_level > 2) && rand_percent(HIDE_PERCENT)) { ! 368: dungeon[*row][*col] |= HIDDEN; ! 369: } ! 370: rm->doors[dir/2].door_row = *row; ! 371: rm->doors[dir/2].door_col = *col; ! 372: } ! 373: ! 374: draw_simple_passage(row1, col1, row2, col2, dir) ! 375: short row1, col1, row2, col2, dir; ! 376: { ! 377: short i, middle, t; ! 378: ! 379: if ((dir == LEFT) || (dir == RIGHT)) { ! 380: if (col1 > col2) { ! 381: swap(row1, row2); ! 382: swap(col1, col2); ! 383: } ! 384: middle = get_rand(col1+1, col2-1); ! 385: for (i = col1+1; i != middle; i++) { ! 386: dungeon[row1][i] = TUNNEL; ! 387: } ! 388: for (i = row1; i != row2; i += (row1 > row2) ? -1 : 1) { ! 389: dungeon[i][middle] = TUNNEL; ! 390: } ! 391: for (i = middle; i != col2; i++) { ! 392: dungeon[row2][i] = TUNNEL; ! 393: } ! 394: } else { ! 395: if (row1 > row2) { ! 396: swap(row1, row2); ! 397: swap(col1, col2); ! 398: } ! 399: middle = get_rand(row1+1, row2-1); ! 400: for (i = row1+1; i != middle; i++) { ! 401: dungeon[i][col1] = TUNNEL; ! 402: } ! 403: for (i = col1; i != col2; i += (col1 > col2) ? -1 : 1) { ! 404: dungeon[middle][i] = TUNNEL; ! 405: } ! 406: for (i = middle; i != row2; i++) { ! 407: dungeon[i][col2] = TUNNEL; ! 408: } ! 409: } ! 410: if (rand_percent(HIDE_PERCENT)) { ! 411: hide_boxed_passage(row1, col1, row2, col2, 1); ! 412: } ! 413: } ! 414: ! 415: same_row(room1, room2) ! 416: { ! 417: return((room1 / 3) == (room2 / 3)); ! 418: } ! 419: ! 420: same_col(room1, room2) ! 421: { ! 422: return((room1 % 3) == (room2 % 3)); ! 423: } ! 424: ! 425: add_mazes() ! 426: { ! 427: short i, j; ! 428: short start; ! 429: short maze_percent; ! 430: ! 431: if (cur_level > 1) { ! 432: start = get_rand(0, (MAXROOMS-1)); ! 433: maze_percent = (cur_level * 5) / 4; ! 434: ! 435: if (cur_level > 15) { ! 436: maze_percent += cur_level; ! 437: } ! 438: for (i = 0; i < MAXROOMS; i++) { ! 439: j = ((start + i) % MAXROOMS); ! 440: if (rooms[j].is_room & R_NOTHING) { ! 441: if (rand_percent(maze_percent)) { ! 442: rooms[j].is_room = R_MAZE; ! 443: make_maze(get_rand(rooms[j].top_row+1, rooms[j].bottom_row-1), ! 444: get_rand(rooms[j].left_col+1, rooms[j].right_col-1), ! 445: rooms[j].top_row, rooms[j].bottom_row, ! 446: rooms[j].left_col, rooms[j].right_col); ! 447: hide_boxed_passage(rooms[j].top_row, rooms[j].left_col, ! 448: rooms[j].bottom_row, rooms[j].right_col, ! 449: get_rand(0, 2)); ! 450: } ! 451: } ! 452: } ! 453: } ! 454: } ! 455: ! 456: fill_out_level() ! 457: { ! 458: short i, rn; ! 459: ! 460: mix_random_rooms(); ! 461: ! 462: r_de = NO_ROOM; ! 463: ! 464: for (i = 0; i < MAXROOMS; i++) { ! 465: rn = random_rooms[i]; ! 466: if ((rooms[rn].is_room & R_NOTHING) || ! 467: ((rooms[rn].is_room & R_CROSS) && coin_toss())) { ! 468: fill_it(rn, 1); ! 469: } ! 470: } ! 471: if (r_de != NO_ROOM) { ! 472: fill_it(r_de, 0); ! 473: } ! 474: } ! 475: ! 476: fill_it(rn, do_rec_de) ! 477: int rn; ! 478: boolean do_rec_de; ! 479: { ! 480: short i, tunnel_dir, door_dir, drow, dcol; ! 481: short target_room, rooms_found = 0; ! 482: short srow, scol, t; ! 483: static short offsets[4] = {-1, 1, 3, -3}; ! 484: boolean did_this = 0; ! 485: ! 486: for (i = 0; i < 10; i++) { ! 487: srow = get_rand(0, 3); ! 488: scol = get_rand(0, 3); ! 489: t = offsets[srow]; ! 490: offsets[srow] = offsets[scol]; ! 491: offsets[scol] = t; ! 492: } ! 493: for (i = 0; i < 4; i++) { ! 494: ! 495: target_room = rn + offsets[i]; ! 496: ! 497: if (((target_room < 0) || (target_room >= MAXROOMS)) || ! 498: (!(same_row(rn,target_room) || same_col(rn,target_room))) || ! 499: (!(rooms[target_room].is_room & (R_ROOM | R_MAZE)))) { ! 500: continue; ! 501: } ! 502: if (same_row(rn, target_room)) { ! 503: tunnel_dir = (rooms[rn].left_col < rooms[target_room].left_col) ? ! 504: RIGHT : LEFT; ! 505: } else { ! 506: tunnel_dir = (rooms[rn].top_row < rooms[target_room].top_row) ? ! 507: DOWN : UPWARD; ! 508: } ! 509: door_dir = ((tunnel_dir + 4) % DIRS); ! 510: if (rooms[target_room].doors[door_dir/2].oth_room != NO_ROOM) { ! 511: continue; ! 512: } ! 513: if (((!do_rec_de) || did_this) || ! 514: (!mask_room(rn, &srow, &scol, TUNNEL))) { ! 515: srow = (rooms[rn].top_row + rooms[rn].bottom_row) / 2; ! 516: scol = (rooms[rn].left_col + rooms[rn].right_col) / 2; ! 517: } ! 518: put_door(&rooms[target_room], door_dir, &drow, &dcol); ! 519: rooms_found++; ! 520: draw_simple_passage(srow, scol, drow, dcol, tunnel_dir); ! 521: rooms[rn].is_room = R_DEADEND; ! 522: dungeon[srow][scol] = TUNNEL; ! 523: ! 524: if ((i < 3) && (!did_this)) { ! 525: did_this = 1; ! 526: if (coin_toss()) { ! 527: continue; ! 528: } ! 529: } ! 530: if ((rooms_found < 2) && do_rec_de) { ! 531: recursive_deadend(rn, offsets, srow, scol); ! 532: } ! 533: break; ! 534: } ! 535: } ! 536: ! 537: recursive_deadend(rn, offsets, srow, scol) ! 538: short rn; ! 539: short *offsets; ! 540: short srow, scol; ! 541: { ! 542: short i, de; ! 543: short drow, dcol, tunnel_dir; ! 544: ! 545: rooms[rn].is_room = R_DEADEND; ! 546: dungeon[srow][scol] = TUNNEL; ! 547: ! 548: for (i = 0; i < 4; i++) { ! 549: de = rn + offsets[i]; ! 550: if (((de < 0) || (de >= MAXROOMS)) || ! 551: (!(same_row(rn, de) || same_col(rn, de)))) { ! 552: continue; ! 553: } ! 554: if (!(rooms[de].is_room & R_NOTHING)) { ! 555: continue; ! 556: } ! 557: drow = (rooms[de].top_row + rooms[de].bottom_row) / 2; ! 558: dcol = (rooms[de].left_col + rooms[de].right_col) / 2; ! 559: if (same_row(rn, de)) { ! 560: tunnel_dir = (rooms[rn].left_col < rooms[de].left_col) ? ! 561: RIGHT : LEFT; ! 562: } else { ! 563: tunnel_dir = (rooms[rn].top_row < rooms[de].top_row) ? ! 564: DOWN : UPWARD; ! 565: } ! 566: draw_simple_passage(srow, scol, drow, dcol, tunnel_dir); ! 567: r_de = de; ! 568: recursive_deadend(de, offsets, drow, dcol); ! 569: } ! 570: } ! 571: ! 572: boolean ! 573: mask_room(rn, row, col, mask) ! 574: short rn; ! 575: short *row, *col; ! 576: unsigned short mask; ! 577: { ! 578: short i, j; ! 579: ! 580: for (i = rooms[rn].top_row; i <= rooms[rn].bottom_row; i++) { ! 581: for (j = rooms[rn].left_col; j <= rooms[rn].right_col; j++) { ! 582: if (dungeon[i][j] & mask) { ! 583: *row = i; ! 584: *col = j; ! 585: return(1); ! 586: } ! 587: } ! 588: } ! 589: return(0); ! 590: } ! 591: ! 592: make_maze(r, c, tr, br, lc, rc) ! 593: short r, c, tr, br, lc, rc; ! 594: { ! 595: char dirs[4]; ! 596: short i, t; ! 597: ! 598: dirs[0] = UPWARD; ! 599: dirs[1] = DOWN; ! 600: dirs[2] = LEFT; ! 601: dirs[3] = RIGHT; ! 602: ! 603: dungeon[r][c] = TUNNEL; ! 604: ! 605: if (rand_percent(20)) { ! 606: for (i = 0; i < 10; i++) { ! 607: short t1, t2; ! 608: ! 609: t1 = get_rand(0, 3); ! 610: t2 = get_rand(0, 3); ! 611: ! 612: swap(dirs[t1], dirs[t2]); ! 613: } ! 614: } ! 615: for (i = 0; i < 4; i++) { ! 616: switch(dirs[i]) { ! 617: case UPWARD: ! 618: if (((r-1) >= tr) && ! 619: (dungeon[r-1][c] != TUNNEL) && ! 620: (dungeon[r-1][c-1] != TUNNEL) && ! 621: (dungeon[r-1][c+1] != TUNNEL) && ! 622: (dungeon[r-2][c] != TUNNEL)) { ! 623: make_maze((r-1), c, tr, br, lc, rc); ! 624: } ! 625: break; ! 626: case DOWN: ! 627: if (((r+1) <= br) && ! 628: (dungeon[r+1][c] != TUNNEL) && ! 629: (dungeon[r+1][c-1] != TUNNEL) && ! 630: (dungeon[r+1][c+1] != TUNNEL) && ! 631: (dungeon[r+2][c] != TUNNEL)) { ! 632: make_maze((r+1), c, tr, br, lc, rc); ! 633: } ! 634: break; ! 635: case LEFT: ! 636: if (((c-1) >= lc) && ! 637: (dungeon[r][c-1] != TUNNEL) && ! 638: (dungeon[r-1][c-1] != TUNNEL) && ! 639: (dungeon[r+1][c-1] != TUNNEL) && ! 640: (dungeon[r][c-2] != TUNNEL)) { ! 641: make_maze(r, (c-1), tr, br, lc, rc); ! 642: } ! 643: break; ! 644: case RIGHT: ! 645: if (((c+1) <= rc) && ! 646: (dungeon[r][c+1] != TUNNEL) && ! 647: (dungeon[r-1][c+1] != TUNNEL) && ! 648: (dungeon[r+1][c+1] != TUNNEL) && ! 649: (dungeon[r][c+2] != TUNNEL)) { ! 650: make_maze(r, (c+1), tr, br, lc, rc); ! 651: } ! 652: break; ! 653: } ! 654: } ! 655: } ! 656: ! 657: hide_boxed_passage(row1, col1, row2, col2, n) ! 658: short row1, col1, row2, col2, n; ! 659: { ! 660: short i, j, t; ! 661: short row, col, row_cut, col_cut; ! 662: short h, w; ! 663: ! 664: if (cur_level > 2) { ! 665: if (row1 > row2) { ! 666: swap(row1, row2); ! 667: } ! 668: if (col1 > col2) { ! 669: swap(col1, col2); ! 670: } ! 671: h = row2 - row1; ! 672: w = col2 - col1; ! 673: ! 674: if ((w >= 5) || (h >= 5)) { ! 675: row_cut = ((h >= 2) ? 1 : 0); ! 676: col_cut = ((w >= 2) ? 1 : 0); ! 677: ! 678: for (i = 0; i < n; i++) { ! 679: for (j = 0; j < 10; j++) { ! 680: row = get_rand(row1 + row_cut, row2 - row_cut); ! 681: col = get_rand(col1 + col_cut, col2 - col_cut); ! 682: if (dungeon[row][col] == TUNNEL) { ! 683: dungeon[row][col] |= HIDDEN; ! 684: break; ! 685: } ! 686: } ! 687: } ! 688: } ! 689: } ! 690: } ! 691: ! 692: put_player(nr) ! 693: short nr; /* try not to put in this room */ ! 694: { ! 695: short rn = nr, misses; ! 696: short row, col; ! 697: ! 698: for (misses = 0; ((misses < 2) && (rn == nr)); misses++) { ! 699: gr_row_col(&row, &col, (FLOOR | TUNNEL | OBJECT | STAIRS)); ! 700: rn = get_room_number(row, col); ! 701: } ! 702: rogue.row = row; ! 703: rogue.col = col; ! 704: ! 705: if (dungeon[rogue.row][rogue.col] & TUNNEL) { ! 706: cur_room = PASSAGE; ! 707: } else { ! 708: cur_room = rn; ! 709: } ! 710: if (cur_room != PASSAGE) { ! 711: light_up_room(cur_room); ! 712: } else { ! 713: light_passage(rogue.row, rogue.col); ! 714: } ! 715: rn = get_room_number(rogue.row, rogue.col); ! 716: wake_room(rn, 1, rogue.row, rogue.col); ! 717: if (new_level_message) { ! 718: message(new_level_message, 0); ! 719: new_level_message = 0; ! 720: } ! 721: mvaddch(rogue.row, rogue.col, rogue.fchar); ! 722: } ! 723: ! 724: drop_check() ! 725: { ! 726: if (wizard) { ! 727: return(1); ! 728: } ! 729: if (dungeon[rogue.row][rogue.col] & STAIRS) { ! 730: if (levitate) { ! 731: message("you're floating in the air!", 0); ! 732: return(0); ! 733: } ! 734: return(1); ! 735: } ! 736: message("I see no way down", 0); ! 737: return(0); ! 738: } ! 739: ! 740: check_up() ! 741: { ! 742: if (!wizard) { ! 743: if (!(dungeon[rogue.row][rogue.col] & STAIRS)) { ! 744: message("I see no way up", 0); ! 745: return(0); ! 746: } ! 747: if (!has_amulet()) { ! 748: message("your way is magically blocked", 0); ! 749: return(0); ! 750: } ! 751: } ! 752: new_level_message = "you feel a wrenching sensation in your gut"; ! 753: if (cur_level == 1) { ! 754: win(); ! 755: } else { ! 756: cur_level -= 2; ! 757: return(1); ! 758: } ! 759: return(0); ! 760: } ! 761: ! 762: add_exp(e, promotion) ! 763: int e; ! 764: boolean promotion; ! 765: { ! 766: char mbuf[40]; ! 767: short new_exp; ! 768: short i, hp; ! 769: ! 770: rogue.exp_points += e; ! 771: ! 772: if (rogue.exp_points >= level_points[rogue.exp-1]) { ! 773: new_exp = get_exp_level(rogue.exp_points); ! 774: if (rogue.exp_points > MAX_EXP) { ! 775: rogue.exp_points = MAX_EXP + 1; ! 776: } ! 777: for (i = rogue.exp+1; i <= new_exp; i++) { ! 778: sprintf(mbuf, "welcome to level %d", i); ! 779: message(mbuf, 0); ! 780: if (promotion) { ! 781: hp = hp_raise(); ! 782: rogue.hp_current += hp; ! 783: rogue.hp_max += hp; ! 784: } ! 785: rogue.exp = i; ! 786: print_stats(STAT_HP | STAT_EXP); ! 787: } ! 788: } else { ! 789: print_stats(STAT_EXP); ! 790: } ! 791: } ! 792: ! 793: get_exp_level(e) ! 794: long e; ! 795: { ! 796: short i; ! 797: ! 798: for (i = 0; i < (MAX_EXP_LEVEL - 1); i++) { ! 799: if (level_points[i] > e) { ! 800: break; ! 801: } ! 802: } ! 803: return(i+1); ! 804: } ! 805: ! 806: hp_raise() ! 807: { ! 808: int hp; ! 809: ! 810: hp = (wizard ? 10 : get_rand(3, 10)); ! 811: return(hp); ! 812: } ! 813: ! 814: show_average_hp() ! 815: { ! 816: char mbuf[80]; ! 817: float real_average; ! 818: float effective_average; ! 819: ! 820: if (rogue.exp == 1) { ! 821: real_average = effective_average = 0.00; ! 822: } else { ! 823: real_average = (float) ! 824: ((rogue.hp_max - extra_hp - INIT_HP) + less_hp) / (rogue.exp - 1); ! 825: effective_average = (float) (rogue.hp_max - INIT_HP) / (rogue.exp - 1); ! 826: ! 827: } ! 828: sprintf(mbuf, "R-Hp: %.2f, E-Hp: %.2f (!: %d, V: %d)", real_average, ! 829: effective_average, extra_hp, less_hp); ! 830: message(mbuf, 0); ! 831: } ! 832: ! 833: mix_random_rooms() ! 834: { ! 835: short i, t; ! 836: short x, y; ! 837: ! 838: for (i = 0; i < (3 * MAXROOMS); i++) { ! 839: do { ! 840: x = get_rand(0, (MAXROOMS-1)); ! 841: y = get_rand(0, (MAXROOMS-1)); ! 842: } while (x == y); ! 843: swap(random_rooms[x], random_rooms[y]); ! 844: } ! 845: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.