[BACK]Return to rooms.c CVS log [TXT][DIR] Up to [contributed] / early-roguelike / rogue4

Annotation of early-roguelike/rogue4/rooms.c, Revision 1.1.1.1

1.1       rubenllo    1: /*
                      2:  * Create the layout for the new level
                      3:  *
                      4:  * @(#)rooms.c 4.16 (Berkeley) 1/12/82
                      5:  *
                      6:  * Rogue: Exploring the Dungeons of Doom
                      7:  * Copyright (C) 1980, 1981, 1982 Michael Toy, Ken Arnold and Glenn Wichman
                      8:  * All rights reserved.
                      9:  *
                     10:  * See the file LICENSE.TXT for full copyright and licensing information.
                     11:  */
                     12:
                     13: #include <ctype.h>
                     14: #include <curses.h>
                     15: #include "rogue.h"
                     16:
                     17: #define GOLDGRP 1
                     18:
                     19: void draw_room(struct room *rp);
                     20: void vert(struct room *rp, int startx);
                     21: void horiz(struct room *rp, int starty);
                     22:
                     23: /*
                     24:  * do_rooms:
                     25:  *     Create rooms and corridors with a connectivity graph
                     26:  */
                     27: void
                     28: do_rooms(void)
                     29: {
                     30:     register int i;
                     31:     register struct room *rp;
                     32:     register THING *tp;
                     33:     register int left_out;
                     34:     coord top;
                     35:     coord bsze;
                     36:     coord mp;
                     37:
                     38:     /*
                     39:      * bsze is the maximum room size
                     40:      */
                     41:     bsze.x = COLS/3;
                     42:     bsze.y = LINES/3;
                     43:     /*
                     44:      * Clear things for a new level
                     45:      */
                     46:     for (rp = rooms; rp < &rooms[MAXROOMS]; rp++)
                     47:        rp->r_goldval = rp->r_nexits = rp->r_flags = 0;
                     48:     /*
                     49:      * Put the gone rooms, if any, on the level
                     50:      */
                     51:     left_out = rnd(4);
                     52:     for (i = 0; i < left_out; i++)
                     53:        rooms[rnd_room()].r_flags |= ISGONE;
                     54:     /*
                     55:      * dig and populate all the rooms on the level
                     56:      */
                     57:     for (i = 0, rp = rooms; i < MAXROOMS; rp++, i++)
                     58:     {
                     59:        /*
                     60:         * Find upper left corner of box that this room goes in
                     61:         */
                     62:        top.x = (i%3)*bsze.x + 1;
                     63:        top.y = i/3*bsze.y;
                     64:        if (rp->r_flags & ISGONE)
                     65:        {
                     66:            /*
                     67:             * Place a gone room.  Make certain that there is a blank line
                     68:             * for passage drawing.
                     69:             */
                     70:            do
                     71:            {
                     72:                rp->r_pos.x = top.x + rnd(bsze.x-2) + 1;
                     73:                rp->r_pos.y = top.y + rnd(bsze.y-2) + 1;
                     74:                rp->r_max.x = -COLS;
                     75:                rp->r_max.x = -LINES;
                     76:            } until (rp->r_pos.y > 0 && rp->r_pos.y < LINES-1);
                     77:            continue;
                     78:        }
                     79:        if (rnd(10) < level - 1)
                     80:            rp->r_flags |= ISDARK;
                     81:        /*
                     82:         * Find a place and size for a random room
                     83:         */
                     84:        do
                     85:        {
                     86:            rp->r_max.x = rnd(bsze.x - 4) + 4;
                     87:            rp->r_max.y = rnd(bsze.y - 4) + 4;
                     88:            rp->r_pos.x = top.x + rnd(bsze.x - rp->r_max.x);
                     89:            rp->r_pos.y = top.y + rnd(bsze.y - rp->r_max.y);
                     90:        } until (rp->r_pos.y != 0);
                     91:        /*
                     92:         * Put the gold in
                     93:         */
                     94:        if (rnd(2) == 0 && (!amulet || level >= max_level))
                     95:        {
                     96:            register THING *gold;
                     97:
                     98:            gold = new_item();
                     99:            gold->o_goldval = rp->r_goldval = GOLDCALC;
                    100:            rnd_pos(rp, &rp->r_gold);
                    101:            gold->o_pos = rp->r_gold;
                    102:            gold->o_flags = ISMANY;
                    103:            gold->o_group = GOLDGRP;
                    104:            gold->o_type = GOLD;
                    105:            attach(lvl_obj, gold);
                    106:        }
                    107:        draw_room(rp);
                    108:        /*
                    109:         * Put the monster in
                    110:         */
                    111:        if (rnd(100) < (rp->r_goldval > 0 ? 80 : 25))
                    112:        {
                    113:            tp = new_item();
                    114:            do
                    115:            {
                    116:                rnd_pos(rp, &mp);
                    117:            } until (winat(mp.y, mp.x) == FLOOR);
                    118:            new_monster(tp, randmonster(FALSE), &mp);
                    119:            give_pack(tp);
                    120:        }
                    121:     }
                    122: }
                    123:
                    124: /*
                    125:  * draw_room:
                    126:  *     Draw a box around a room and lay down the floor
                    127:  */
                    128: void
                    129: draw_room(struct room *rp)
                    130: {
                    131:     register int y, x;
                    132:
                    133:     vert(rp, rp->r_pos.x);                             /* Draw left side */
                    134:     vert(rp, rp->r_pos.x + rp->r_max.x - 1);           /* Draw right side */
                    135:     horiz(rp, rp->r_pos.y);                            /* Draw top */
                    136:     horiz(rp, rp->r_pos.y + rp->r_max.y - 1);          /* Draw bottom */
                    137:     /*
                    138:      * Put the floor down
                    139:      */
                    140:     for (y = rp->r_pos.y + 1; y < rp->r_pos.y + rp->r_max.y - 1; y++)
                    141:        /*strrep(&chat(rp->r_pos.y + 1, j), FLOOR, rp->r_max.y - rp->r_pos.y - 2);*/
                    142:        for (x = rp->r_pos.x + 1; x < rp->r_pos.x + rp->r_max.x - 1; x++)
                    143:            chat(y, x) = FLOOR;
                    144:     /*
                    145:      * Put the gold there
                    146:      */
                    147:     if (rp->r_goldval)
                    148:        chat(rp->r_gold.y, rp->r_gold.x) = GOLD;
                    149: }
                    150:
                    151: /*
                    152:  * vert:
                    153:  *     Draw a vertical line
                    154:  */
                    155: void
                    156: vert(struct room *rp, int startx)
                    157: {
                    158:     register int y;
                    159:
                    160:     for (y = rp->r_pos.y + 1; y <= rp->r_max.y + rp->r_pos.y - 1; y++)
                    161:        chat(y, startx) = '|';
                    162: }
                    163:
                    164: /*
                    165:  * horiz:
                    166:  *     Draw a horizontal line
                    167:  */
                    168: void
                    169: horiz(struct room *rp, int starty)
                    170: {
                    171:     register int x;
                    172:
                    173:     for (x = rp->r_pos.x; x <= rp->r_pos.x + rp->r_max.x - 1; x++)
                    174:        chat(starty, x) = '-';
                    175: }
                    176:
                    177: /*
                    178:  * rnd_pos:
                    179:  *     Pick a random spot in a room
                    180:  */
                    181: void
                    182: rnd_pos(struct room *rp, coord *cp)
                    183: {
                    184:     cp->x = rp->r_pos.x + rnd(rp->r_max.x - 2) + 1;
                    185:     cp->y = rp->r_pos.y + rnd(rp->r_max.y - 2) + 1;
                    186: }
                    187:
                    188: /*
                    189:  * enter_room:
                    190:  *     Code that is executed whenver you appear in a room
                    191:  */
                    192: void
                    193: enter_room(coord *cp)
                    194: {
                    195:     register struct room *rp;
                    196:     register int y, x;
                    197:     register THING *tp;
                    198:
                    199:     rp = proom = roomin(cp);
                    200:     if (rp->r_flags & ISGONE)
                    201:     {
                    202:        msg("in a gone room");
                    203:        return;
                    204:     }
                    205:     door_open(rp);
                    206:     if (!(rp->r_flags & ISDARK) && !on(player, ISBLIND))
                    207:        for (y = rp->r_pos.y; y < rp->r_max.y + rp->r_pos.y; y++)
                    208:        {
                    209:            move(y, rp->r_pos.x);
                    210:            for (x = rp->r_pos.x; x < rp->r_max.x + rp->r_pos.x; x++)
                    211:            {
                    212:                tp = moat(y, x);
                    213:                if (tp == NULL || !see_monst(tp))
                    214:                    addch(chat(y, x));
                    215:                else
                    216:                    addch(tp->t_disguise);
                    217:            }
                    218:        }
                    219: }
                    220:
                    221: /*
                    222:  * leave_room:
                    223:  *     Code for when we exit a room
                    224:  */
                    225: void
                    226: leave_room(coord *cp)
                    227: {
                    228:     register int y, x;
                    229:     register struct room *rp;
                    230:     register char floor;
                    231:     register char ch;
                    232:
                    233:     rp = proom;
                    234:     proom = &passages[flat(cp->y, cp->x) & F_PNUM];
                    235:     floor = ((rp->r_flags & ISDARK) && !on(player, ISBLIND)) ? ' ' : FLOOR;
                    236:     for (y = rp->r_pos.y + 1; y < rp->r_max.y + rp->r_pos.y - 1; y++)
                    237:        for (x = rp->r_pos.x + 1; x < rp->r_max.x + rp->r_pos.x - 1; x++)
                    238:            switch (ch = mvinch(y, x))
                    239:            {
                    240:                case ' ':
                    241:                case TRAP:
                    242:                case STAIRS:
                    243:                    break;
                    244:                case FLOOR:
                    245:                    if (floor == ' ')
                    246:                        addch(' ');
                    247:                    break;
                    248:                default:
                    249:                    /*
                    250:                     * to check for monster, we have to strip out
                    251:                     * standout bit
                    252:                     */
                    253:                    if (isupper(toascii(ch)))
                    254:                        if (on(player, SEEMONST))
                    255:                        {
                    256:                            standout();
                    257:                            addch(ch);
                    258:                            standend();
                    259:                            break;
                    260:                        }
                    261:                        else
                    262:                         {
                    263:                             THING *tp = moat(y, x);
                    264:
                    265:                             if (tp != NULL)
                    266:                                 tp->t_oldch = floor;
                    267:
                    268: #ifdef WIZARD
                    269:                             else
                    270:                                 msg("couldn't find monster in leave_room at (%d,%d)", y, x);
                    271: #endif
                    272:                         }
                    273:
                    274:                    addch(floor);
                    275:            }
                    276:     door_open(rp);
                    277: }

CVSweb