Annotation of early-roguelike/srogue/rooms.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: * Draw the nine rooms on the screen
! 3: *
! 4: * @(#)rooms.c 9.0 (rdk) 7/17/84
! 5: *
! 6: * Super-Rogue
! 7: * Copyright (C) 1984 Robert D. Kindelberger
! 8: * All rights reserved.
! 9: *
! 10: * Based on "Rogue: Exploring the Dungeons of Doom"
! 11: * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
! 12: * All rights reserved.
! 13: *
! 14: * See the file LICENSE.TXT for full copyright and licensing information.
! 15: */
! 16:
! 17: #include "rogue.h"
! 18: #include "rogue.ext"
! 19:
! 20: void horiz(int cnt);
! 21: void vert(int cnt);
! 22:
! 23: /*
! 24: * do_rooms:
! 25: * Place the rooms in the dungeon
! 26: */
! 27: void
! 28: do_rooms(void)
! 29: {
! 30: int mloops, mchance, nummons, left_out, roomtries;
! 31: bool treas = FALSE;
! 32: reg int i;
! 33: reg struct room *rp;
! 34: reg struct linked_list *item;
! 35: reg struct thing *tp;
! 36: struct coord top, bsze, mp;
! 37:
! 38: /*
! 39: * bsze is the maximum room size
! 40: */
! 41: bsze.x = COLS / 3;
! 42: bsze.y = (LINES - 1) / 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: * Find upper left corner of box that this room goes in
! 60: */
! 61: top.x = (i%3) * bsze.x + 1;
! 62: top.y = i/3 * bsze.y;
! 63: if (rf_on(rp,ISGONE)) {
! 64: /*
! 65: * Place a gone room. Make certain that there is a
! 66: * blank line for passage drawing.
! 67: */
! 68: roomtries = 0;
! 69: do {
! 70: rp->r_pos.x = top.x + rnd(bsze.x-2) + 1;
! 71: rp->r_pos.y = top.y + rnd(bsze.y-2) + 1;
! 72: rp->r_max.x = -COLS;
! 73: rp->r_max.x = -LINES;
! 74: if (++roomtries > 250)
! 75: fatal("failed to place a gone room");
! 76: } until(rp->r_pos.y > 0 && rp->r_pos.y < LINES-2);
! 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: roomtries = 0;
! 85: do {
! 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: if (++roomtries > 250) {
! 91: fatal("failed to place a good room");
! 92: }
! 93: } until (rp->r_pos.y != 0);
! 94: if (level < max_level)
! 95: mchance = 30; /* 30% when going up (all monsters) */
! 96: else
! 97: mchance = 3; /* 3% when going down */
! 98: treas = FALSE;
! 99: if (rnd(100) < mchance && (rp->r_max.x * rp->r_max.y) >
! 100: ((bsze.x * bsze.y * 55) / 100)) {
! 101: treas = TRUE;
! 102: rp->r_flags |= ISTREAS;
! 103: rp->r_flags |= ISDARK;
! 104: }
! 105: /*
! 106: * Put the gold in
! 107: */
! 108: if ((rnd(100) < 50 || treas) && (!amulet || level >= max_level)) {
! 109: rp->r_goldval = GOLDCALC;
! 110: if (treas)
! 111: rp->r_goldval += 200 + (15 * (rnd(level) + 2));
! 112: rp->r_gold.y = rp->r_pos.y + rnd(rp->r_max.y - 2) + 1;
! 113: rp->r_gold.x = rp->r_pos.x + rnd(rp->r_max.x - 2) + 1;
! 114: }
! 115: draw_room(rp);
! 116: /*
! 117: * Put the monster in
! 118: */
! 119: if (treas) {
! 120: mloops = rnd(level / 3) + 6;
! 121: mchance = 1;
! 122: }
! 123: else {
! 124: mloops = 1;
! 125: mchance = 100;
! 126: }
! 127: for (nummons = 0; nummons < mloops; nummons++) {
! 128: if (rnd(mchance) < (rp->r_goldval > 0 ? 80 : 25))
! 129: add_mon(rp, treas);
! 130: }
! 131: }
! 132: }
! 133:
! 134: /*
! 135: * add_mon:
! 136: * Add a monster to a room
! 137: */
! 138: void
! 139: add_mon(struct room *rm, bool treas)
! 140: {
! 141: reg struct thing *tp;
! 142: reg struct linked_list *item;
! 143: struct coord mp;
! 144: int chance;
! 145:
! 146: mp = *rnd_pos(rm);
! 147: item = new_monster(rnd_mon(FALSE,FALSE), &mp, treas);
! 148: tp = THINGPTR(item);
! 149: chance = rnd(100);
! 150: if (levtype == MAZELEV)
! 151: chance = rnd(50);
! 152: /*
! 153: * See if monster has a treasure
! 154: */
! 155: if (levtype == MAZELEV && rnd(100) < 20) {
! 156: reg struct linked_list *fd;
! 157:
! 158: fd = new_thing(FALSE, FOOD, 0);
! 159: attach(tp->t_pack, fd);
! 160: }
! 161: else {
! 162: if (chance < monsters[tp->t_indx].m_carry)
! 163: attach(tp->t_pack, new_thing(FALSE, ANYTHING));
! 164: }
! 165: }
! 166:
! 167: /*
! 168: * draw_room:
! 169: * Draw a box around a room
! 170: */
! 171: void
! 172: draw_room(struct room *rp)
! 173: {
! 174: reg int j, k;
! 175:
! 176: move(rp->r_pos.y, rp->r_pos.x+1);
! 177: vert(rp->r_max.y-2); /* Draw left side */
! 178: move(rp->r_pos.y+rp->r_max.y-1, rp->r_pos.x);
! 179: horiz(rp->r_max.x); /* Draw bottom */
! 180: move(rp->r_pos.y, rp->r_pos.x);
! 181: horiz(rp->r_max.x); /* Draw top */
! 182: vert(rp->r_max.y-2); /* Draw right side */
! 183: /*
! 184: * Put the floor down
! 185: */
! 186: for (j = 1; j < rp->r_max.y - 1; j++) {
! 187: move(rp->r_pos.y + j, rp->r_pos.x + 1);
! 188: for (k = 1; k < rp->r_max.x - 1; k++) {
! 189: addch(FLOOR);
! 190: }
! 191: }
! 192: /*
! 193: * Put the gold there
! 194: */
! 195: if (rp->r_goldval > 0)
! 196: mvaddch(rp->r_gold.y, rp->r_gold.x, GOLD);
! 197: }
! 198:
! 199: /*
! 200: * horiz:
! 201: * draw a horizontal line
! 202: */
! 203: void
! 204: horiz(int cnt)
! 205: {
! 206: while (cnt-- > 0)
! 207: addch('-');
! 208: }
! 209:
! 210:
! 211: /*
! 212: * vert:
! 213: * draw a vertical line
! 214: */
! 215: void
! 216: vert(int cnt)
! 217: {
! 218: reg int x, y;
! 219:
! 220: getyx(stdscr, y, x);
! 221: x--;
! 222: while (cnt-- > 0) {
! 223: move(++y, x);
! 224: addch('|');
! 225: }
! 226: }
! 227:
! 228:
! 229: /*
! 230: * rnd_pos:
! 231: * pick a random spot in a room
! 232: */
! 233: struct coord *
! 234: rnd_pos(struct room *rp)
! 235: {
! 236: reg int y, x, i;
! 237: static struct coord spot;
! 238:
! 239: i = 0;
! 240: do {
! 241: x = rp->r_pos.x + rnd(rp->r_max.x - 2) + 1;
! 242: y = rp->r_pos.y + rnd(rp->r_max.y - 2) + 1;
! 243: i += 1;
! 244: } while(winat(y, x) != FLOOR && i < 1000);
! 245: spot.x = x;
! 246: spot.y = y;
! 247: return &spot;
! 248: }
! 249:
! 250: /*
! 251: * rf_on:
! 252: * Returns TRUE if flag is set for room stuff
! 253: */
! 254: bool
! 255: rf_on(struct room *rm, long bit)
! 256: {
! 257: return (rm->r_flags & bit);
! 258: }
CVSweb