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

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

1.1       rubenllo    1: /*
                      2:     rooms.c - Draw the nine rooms on the screen
                      3:
                      4:     UltraRogue: The Ultimate Adventure in the Dungeons of Doom
                      5:     Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
                      6:     All rights reserved.
                      7:
                      8:     Based on "Advanced Rogue"
                      9:     Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
                     10:     All rights reserved.
                     11:
                     12:     Based on "Rogue: Exploring the Dungeons of Doom"
                     13:     Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
                     14:     All rights reserved.
                     15:
                     16:     See the file LICENSE.TXT for full copyright and licensing information.
                     17: */
                     18:
                     19: #include <stdlib.h>
                     20: #include "rogue.h"
                     21:
                     22: void
                     23: do_rooms(void)
                     24: {
                     25:     int i;
                     26:     struct room *rp;
                     27:     struct linked_list  *item;
                     28:     struct thing    *tp;
                     29:     int left_out;
                     30:     coord   top;
                     31:     coord   bsze;
                     32:     coord   mp;
                     33:
                     34:     /* bsze is the maximum room size */
                     35:
                     36:     bsze.x = COLS / 3;
                     37:     bsze.y = (LINES - 2) / 3;
                     38:
                     39:     /* Clear things for a new level */
                     40:
                     41:     for (rp = rooms; rp < &rooms[MAXROOMS]; rp++)
                     42:         rp->r_nexits = rp->r_flags = rp->r_fires = 0;
                     43:
                     44:     /* Put the gone rooms, if any, on the level */
                     45:
                     46:     left_out = rnd(3);
                     47:
                     48:     for (i = 0; i < left_out; i++)
                     49:         rooms[rnd_room()].r_flags |= ISGONE;
                     50:
                     51:     /* dig and populate all the rooms on the level */
                     52:
                     53:     for (i = 0, rp = rooms; i < MAXROOMS; rp++, i++)
                     54:     {
                     55:         int has_gold = FALSE;
                     56:
                     57:         /* Find upper left corner of box that this room goes in */
                     58:
                     59:         top.x = (i % 3) * bsze.x;
                     60:         top.y = i / 3 * bsze.y + 1;
                     61:
                     62:         if (rp->r_flags & ISGONE)
                     63:         {
                     64:             /*
                     65:              * Place a gone room.  Make certain that there is a
                     66:              * blank line for passage drawing.
                     67:              */
                     68:
                     69:             do
                     70:             {
                     71:                 rp->r_pos.x = top.x + rnd(bsze.x - 2) + 1;
                     72:                 rp->r_pos.y = top.y + rnd(bsze.y - 2) + 1;
                     73:                 rp->r_max.x = -COLS;
                     74:                 rp->r_max.x = -LINES;
                     75:             }
                     76:             while (rp->r_pos.y < 1 || rp->r_pos.y > LINES - 3);
                     77:
                     78:             continue;
                     79:         }
                     80:
                     81:         if (rnd(40) < level - 5)
                     82:             rp->r_flags |= ISDARK;
                     83:
                     84:         /* Find a place and size for a random room */
                     85:
                     86:         do
                     87:         {
                     88:             rp->r_max.x = rnd(bsze.x - 4) + 4;
                     89:             rp->r_max.y = rnd(bsze.y - 4) + 4;
                     90:             rp->r_pos.x = top.x + rnd(bsze.x - rp->r_max.x);
                     91:             rp->r_pos.y = top.y + rnd(bsze.y - rp->r_max.y);
                     92:         }
                     93:         while (rp->r_pos.y == 0);
                     94:
                     95:         /* Draw the room */
                     96:
                     97:         draw_room(rp);
                     98:
                     99:         /* Put the gold in */
                    100:
                    101:         if (rnd(10) < 3 && (!has_artifact || level >= max_level))
                    102:         {
                    103:             struct linked_list *itm;
                    104:             struct object   *cur;
                    105:             coord   tpos;
                    106:
                    107:             has_gold = TRUE;    /* This room has gold in it */
                    108:
                    109:             itm = spec_item(GOLD, 0, 0, 0);
                    110:             cur = OBJPTR(itm);
                    111:
                    112:             /* Put it somewhere */
                    113:
                    114:             rnd_pos(rp, &tpos);
                    115:             cur->o_pos = tpos;
                    116:
                    117:             /* Put the gold into the level list of items */
                    118:
                    119:             add_obj(itm, tpos.y, tpos.x);
                    120:
                    121:             if (roomin(tpos) != rp)
                    122:             {
                    123:                 endwin();
                    124:                 abort();
                    125:             }
                    126:         }
                    127:
                    128:         /* Put the monster in */
                    129:
                    130:         if (rnd(100) < (has_gold ? 80 : 40))
                    131:         {
                    132:             int   which;
                    133:             int n, cnt;
                    134:
                    135:             item = new_item(sizeof *tp);
                    136:             tp = THINGPTR(item);
                    137:
                    138:             do
                    139:                 rnd_pos(rp, &mp);
                    140:             while (mvwinch(stdscr, mp.y, mp.x) != FLOOR);
                    141:
                    142:             which = randmonster(NOWANDER, NOGRAB);
                    143:             new_monster(item, which, &mp, NOMAXSTATS);
                    144:
                    145:             /* See if we want to give it a treasure to carry around. */
                    146:
                    147:             if (rnd(100) < monsters[tp->t_index].m_carry)
                    148:                 attach(tp->t_pack, new_thing());
                    149:
                    150:             /* If it has a fire, mark it */
                    151:
                    152:             if (on(*tp, HASFIRE))
                    153:             {
                    154:                 rp->r_flags |= HASFIRE;
                    155:                 rp->r_fires++;
                    156:             }
                    157:
                    158:             /* If it carries gold, give it some */
                    159:
                    160:             if (on(*tp, CARRYGOLD))
                    161:             {
                    162:                 struct object   *cur;
                    163:
                    164:                 item = spec_item(GOLD, 0, 0, 0);
                    165:                 cur = OBJPTR(item);
                    166:                 cur->o_count = GOLDCALC + GOLDCALC + GOLDCALC;
                    167:                 cur->o_pos = tp->t_pos;
                    168:                 attach(tp->t_pack, item);
                    169:             }
                    170:
                    171:             n = rnd(7);
                    172:
                    173:             if (on(*tp, ISSWARM) && n < 5)
                    174:                 cnt = roll(2, 4);
                    175:             else if (on(*tp, ISFLOCK) && n < 5)
                    176:                 cnt = roll(1, 4);
                    177:             else
                    178:                 cnt = 0;
                    179:
                    180:             for (n = 1; n <= cnt; n++)
                    181:             {
                    182:                 coord   pos;
                    183:
                    184:                 if (place_mons(mp.y, mp.x, &pos)!= FALSE)
                    185:                 {
                    186:                     struct linked_list  *nitem;
                    187:
                    188:                     nitem = new_item(sizeof(struct thing));
                    189:                     new_monster(nitem, which, &pos, NOMAXSTATS);
                    190:
                    191:                     /* If the monster is on a trap, trap it */
                    192:
                    193:                     if (isatrap(mvinch(pos.y, pos.x)))
                    194:                         be_trapped(THINGPTR(nitem), mp);
                    195:
                    196:                     if (on(*tp, ISFRIENDLY))
                    197:                         turn_on(*(THINGPTR(nitem)), ISFRIENDLY);
                    198:                     else
                    199:                         turn_off(*(THINGPTR(nitem)), ISFRIENDLY);
                    200:                 }
                    201:             }
                    202:
                    203:             if (cnt > 0)
                    204:             {
                    205:                 int boost = rnd(3) + 1;
                    206:
                    207:                 if (on(*tp, LOWCAST) || on(*tp, MEDCAST) || on(*tp, HIGHCAST))
                    208:                     turn_on(*tp, CANCAST);
                    209:
                    210:                 tp->t_stats.s_hpt += 3 * boost;
                    211:                 tp->t_stats.s_arm -= 2 * boost;
                    212:                 tp->t_stats.s_lvl += 2 * boost;
                    213:                 tp->t_stats.s_str += 2 * boost;
                    214:                 tp->t_stats.s_intel += 2 * boost;
                    215:                 tp->t_stats.s_exp += 4 * boost * monsters[which].m_add_exp;
                    216:             }
                    217:         }
                    218:     }
                    219: }
                    220:
                    221: /*
                    222:     draw_room()
                    223:         Draw a box around a room
                    224: */
                    225:
                    226: void
                    227: draw_room(struct room *rp)
                    228: {
                    229:     int j, k;
                    230:
                    231:     move(rp->r_pos.y, rp->r_pos.x + 1);
                    232:     vert(rp->r_max.y - 2);  /* Draw left side */
                    233:     move(rp->r_pos.y + rp->r_max.y - 1, rp->r_pos.x);
                    234:     horiz(rp->r_max.x); /* Draw bottom */
                    235:     move(rp->r_pos.y, rp->r_pos.x);
                    236:     horiz(rp->r_max.x); /* Draw top */
                    237:     vert(rp->r_max.y - 2);  /* Draw right side */
                    238:
                    239:     /* Put the floor down */
                    240:
                    241:     for (j = 1; j < rp->r_max.y - 1; j++)
                    242:     {
                    243:         move(rp->r_pos.y + j, rp->r_pos.x + 1);
                    244:
                    245:         for (k = 1; k < rp->r_max.x - 1; k++)
                    246:             addch(FLOOR);
                    247:     }
                    248: }
                    249:
                    250: /*
                    251:     horiz()
                    252:         draw a horizontal line
                    253: */
                    254:
                    255: void
                    256: horiz(int cnt)
                    257: {
                    258:     while(cnt--)
                    259:         addch('-');
                    260: }
                    261:
                    262: /*
                    263:     vert()
                    264:         draw a vertical line
                    265: */
                    266:
                    267: void
                    268: vert(int cnt)
                    269: {
                    270:     int x, y;
                    271:
                    272:     getyx(stdscr, y, x);
                    273:
                    274:     x--;
                    275:
                    276:     while(cnt--)
                    277:     {
                    278:         move(++y, x);
                    279:         addch('|');
                    280:     }
                    281: }
                    282:
                    283: /*
                    284:     rnd_pos()
                    285:         pick a random spot in a room
                    286: */
                    287:
                    288: void
                    289: rnd_pos(struct room *rp, coord *cp)
                    290: {
                    291:     cp->x = rp->r_pos.x + rnd(rp->r_max.x - 2) + 1;
                    292:     cp->y = rp->r_pos.y + rnd(rp->r_max.y - 2) + 1;
                    293: }
                    294:
                    295: /*
                    296:     rnd_room()
                    297:         Pick a room that is really there
                    298: */
                    299:
                    300: int
                    301: rnd_room(void)
                    302: {
                    303:     int rm;
                    304:
                    305:     if (levtype != NORMLEV)
                    306:         rm = 0;
                    307:     else
                    308:         do
                    309:         {
                    310:             rm = rnd(MAXROOMS);
                    311:         }
                    312:         while (rooms[rm].r_flags & ISGONE);
                    313:
                    314:     return(rm);
                    315: }

CVSweb