[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     ! 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