Annotation of early-roguelike/rogue3/rooms.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: * Draw the nine rooms on the screen
! 3: *
! 4: * @(#)rooms.c 3.8 (Berkeley) 6/15/81
! 5: *
! 6: * Rogue: Exploring the Dungeons of Doom
! 7: * Copyright (C) 1980, 1981 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 <stdlib.h>
! 14: #include "curses.h"
! 15: #include "rogue.h"
! 16:
! 17: void
! 18: do_rooms()
! 19: {
! 20: int i;
! 21: struct room *rp;
! 22: struct linked_list *item;
! 23: struct thing *tp;
! 24: int left_out;
! 25: coord top;
! 26: coord bsze;
! 27: coord mp;
! 28:
! 29: /*
! 30: * bsze is the maximum room size
! 31: */
! 32: bsze.x = COLS/3;
! 33: bsze.y = LINES/3;
! 34: /*
! 35: * Clear things for a new level
! 36: */
! 37: for (rp = rooms; rp <= &rooms[MAXROOMS-1]; rp++)
! 38: rp->r_goldval = rp->r_nexits = rp->r_flags = 0;
! 39: /*
! 40: * Put the gone rooms, if any, on the level
! 41: */
! 42: left_out = rnd(4);
! 43: for (i = 0; i < left_out; i++)
! 44: rooms[rnd_room()].r_flags |= ISGONE;
! 45: /*
! 46: * dig and populate all the rooms on the level
! 47: */
! 48: for (i = 0, rp = rooms; i < MAXROOMS; rp++, i++)
! 49: {
! 50: /*
! 51: * Find upper left corner of box that this room goes in
! 52: */
! 53: top.x = (i%3)*bsze.x + 1;
! 54: top.y = i/3*bsze.y;
! 55: if (rp->r_flags & ISGONE)
! 56: {
! 57: /*
! 58: * Place a gone room. Make certain that there is a blank line
! 59: * for passage drawing.
! 60: */
! 61: do
! 62: {
! 63: rp->r_pos.x = top.x + rnd(bsze.x-2) + 1;
! 64: rp->r_pos.y = top.y + rnd(bsze.y-2) + 1;
! 65: rp->r_max.x = -COLS;
! 66: rp->r_max.y = -LINES;
! 67: } until(rp->r_pos.y > 0 && rp->r_pos.y < LINES-1);
! 68: continue;
! 69: }
! 70: if (rnd(10) < level-1)
! 71: rp->r_flags |= ISDARK;
! 72: /*
! 73: * Find a place and size for a random room
! 74: */
! 75: do
! 76: {
! 77: rp->r_max.x = rnd(bsze.x - 4) + 4;
! 78: rp->r_max.y = rnd(bsze.y - 4) + 4;
! 79: rp->r_pos.x = top.x + rnd(bsze.x - rp->r_max.x);
! 80: rp->r_pos.y = top.y + rnd(bsze.y - rp->r_max.y);
! 81: } until (rp->r_pos.y != 0);
! 82: /*
! 83: * Put the gold in
! 84: */
! 85: if (rnd(100) < 50 && (!amulet || level >= max_level))
! 86: {
! 87: rp->r_goldval = GOLDCALC;
! 88: rnd_pos(rp, &rp->r_gold);
! 89: if (roomin(&rp->r_gold) != rp)
! 90: endwin(), abort();
! 91: }
! 92: draw_room(rp);
! 93: /*
! 94: * Put the monster in
! 95: */
! 96: if (rnd(100) < (rp->r_goldval > 0 ? 80 : 25))
! 97: {
! 98: item = new_item(sizeof *tp);
! 99: tp = (struct thing *) ldata(item);
! 100: do
! 101: {
! 102: rnd_pos(rp, &mp);
! 103: } until(mvwinch(stdscr, mp.y, mp.x) == FLOOR);
! 104: new_monster(item, randmonster(FALSE), &mp);
! 105: /*
! 106: * See if we want to give it a treasure to carry around.
! 107: */
! 108: if (rnd(100) < monsters[tp->t_type-'A'].m_carry)
! 109: attach(tp->t_pack, new_thing());
! 110: }
! 111: }
! 112: }
! 113:
! 114: /*
! 115: * Draw a box around a room
! 116: */
! 117:
! 118: void
! 119: draw_room(struct room *rp)
! 120: {
! 121: int j, k;
! 122:
! 123: move(rp->r_pos.y, rp->r_pos.x+1);
! 124: vert(rp->r_max.y-2); /* Draw left side */
! 125: move(rp->r_pos.y+rp->r_max.y-1, rp->r_pos.x);
! 126: horiz(rp->r_max.x); /* Draw bottom */
! 127: move(rp->r_pos.y, rp->r_pos.x);
! 128: horiz(rp->r_max.x); /* Draw top */
! 129: vert(rp->r_max.y-2); /* Draw right side */
! 130: /*
! 131: * Put the floor down
! 132: */
! 133: for (j = 1; j < rp->r_max.y-1; j++)
! 134: {
! 135: move(rp->r_pos.y + j, rp->r_pos.x+1);
! 136: for (k = 1; k < rp->r_max.x-1; k++)
! 137: addch(FLOOR);
! 138: }
! 139: /*
! 140: * Put the gold there
! 141: */
! 142: if (rp->r_goldval)
! 143: mvaddch(rp->r_gold.y, rp->r_gold.x, GOLD);
! 144: }
! 145:
! 146: /*
! 147: * horiz:
! 148: * draw a horizontal line
! 149: */
! 150:
! 151: void
! 152: horiz(int cnt)
! 153: {
! 154: while (cnt--)
! 155: addch('-');
! 156: }
! 157:
! 158: /*
! 159: * vert:
! 160: * draw a vertical line
! 161: */
! 162:
! 163: void
! 164: vert(int cnt)
! 165: {
! 166: int x, y;
! 167:
! 168: getyx(stdscr, y, x);
! 169: x--;
! 170: while (cnt--) {
! 171: move(++y, x);
! 172: addch('|');
! 173: }
! 174: }
! 175:
! 176: /*
! 177: * rnd_pos:
! 178: * pick a random spot in a room
! 179: */
! 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: }
CVSweb