Annotation of 43BSDTahoe/games/rogue/level.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.