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

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

unix.superglobalmegacorp.com

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