Annotation of 43BSDReno/games/rogue/level.c, revision 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.