Annotation of early-roguelike/arogue5/rooms.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: * Draw the nine rooms on the screen
! 3: *
! 4: * Advanced Rogue
! 5: * Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
! 6: * All rights reserved.
! 7: *
! 8: * Based on "Rogue: Exploring the Dungeons of Doom"
! 9: * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
! 10: * All rights reserved.
! 11: *
! 12: * See the file LICENSE.TXT for full copyright and licensing information.
! 13: */
! 14:
! 15: #include "curses.h"
! 16: #include "rogue.h"
! 17: #include <stdlib.h>
! 18:
! 19: void horiz(int cnt);
! 20: void vert(int cnt);
! 21:
! 22: void
! 23: do_rooms(void)
! 24: {
! 25: register int i;
! 26: register struct room *rp;
! 27: register struct linked_list *item;
! 28: register struct thing *tp;
! 29: register int left_out;
! 30: coord top;
! 31: coord bsze;
! 32: coord mp;
! 33:
! 34: /*
! 35: * bsze is the maximum room size
! 36: */
! 37: bsze.x = COLS/3;
! 38: bsze.y = (LINES-2)/3;
! 39: /*
! 40: * Clear things for a new level
! 41: */
! 42: for (rp = rooms; rp < &rooms[MAXROOMS]; rp++) {
! 43: rp->r_flags = 0;
! 44: rp->r_fires = NULL;
! 45: }
! 46: /*
! 47: * Put the gone rooms, if any, on the level
! 48: */
! 49: left_out = rnd(4);
! 50: for (i = 0; i < left_out; i++)
! 51: rooms[rnd_room()].r_flags |= ISGONE;
! 52: /*
! 53: * dig and populate all the rooms on the level
! 54: */
! 55: for (i = 0, rp = rooms; i < MAXROOMS; rp++, i++)
! 56: {
! 57: bool has_gold=FALSE;
! 58:
! 59: /*
! 60: * Find upper left corner of box that this room goes in
! 61: */
! 62: top.x = (i%3)*bsze.x;
! 63: top.y = i/3*bsze.y + 1;
! 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-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: 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: /* Draw the room */
! 93: draw_room(rp);
! 94:
! 95: /*
! 96: * Put the gold in
! 97: */
! 98: if (rnd(100) < 50 && level >= cur_max)
! 99: {
! 100: register struct linked_list *item;
! 101: register struct object *cur;
! 102: coord tp;
! 103:
! 104: has_gold = TRUE; /* This room has gold in it */
! 105:
! 106: item = spec_item(GOLD, 0, 0, 0);
! 107: cur = OBJPTR(item);
! 108:
! 109: /* Put the gold into the level list of items */
! 110: attach(lvl_obj, item);
! 111:
! 112: /* Put it somewhere */
! 113: rnd_pos(rp, &tp);
! 114: mvaddch(tp.y, tp.x, GOLD);
! 115: cur->o_pos = tp;
! 116: if (roomin(&tp) != rp) {
! 117: endwin();
! 118: printf("\n");
! 119: abort();
! 120: }
! 121: }
! 122:
! 123: /*
! 124: * Put the monster in
! 125: */
! 126: if (rnd(100) < (has_gold ? 80 : 25) + vlevel/2)
! 127: {
! 128: item = new_item(sizeof *tp);
! 129: tp = THINGPTR(item);
! 130: do
! 131: {
! 132: rnd_pos(rp, &mp);
! 133: } until(mvwinch(stdscr, mp.y, mp.x) == FLOOR);
! 134: new_monster(item, randmonster(FALSE, FALSE), &mp, FALSE);
! 135: /*
! 136: * See if we want to give it a treasure to carry around.
! 137: */
! 138: carry_obj(tp, monsters[tp->t_index].m_carry);
! 139:
! 140: /*
! 141: * If it has a fire, mark it
! 142: */
! 143: if (on(*tp, HASFIRE)) {
! 144: register struct linked_list *fire_item;
! 145:
! 146: fire_item = creat_item();
! 147: ldata(fire_item) = (char *) tp;
! 148: attach(rp->r_fires, fire_item);
! 149: rp->r_flags |= HASFIRE;
! 150: }
! 151: }
! 152: }
! 153: }
! 154:
! 155:
! 156: /*
! 157: * Draw a box around a room
! 158: */
! 159:
! 160: void
! 161: draw_room(struct room *rp)
! 162: {
! 163: register int j, k;
! 164:
! 165: move(rp->r_pos.y, rp->r_pos.x+1);
! 166: vert(rp->r_max.y-2); /* Draw left side */
! 167: move(rp->r_pos.y+rp->r_max.y-1, rp->r_pos.x);
! 168: horiz(rp->r_max.x); /* Draw bottom */
! 169: move(rp->r_pos.y, rp->r_pos.x);
! 170: horiz(rp->r_max.x); /* Draw top */
! 171: vert(rp->r_max.y-2); /* Draw right side */
! 172: /*
! 173: * Put the floor down
! 174: */
! 175: for (j = 1; j < rp->r_max.y-1; j++)
! 176: {
! 177: move(rp->r_pos.y + j, rp->r_pos.x+1);
! 178: for (k = 1; k < rp->r_max.x-1; k++)
! 179: addch(FLOOR);
! 180: }
! 181: }
! 182:
! 183: /*
! 184: * horiz:
! 185: * draw a horizontal line
! 186: */
! 187:
! 188: void
! 189: horiz(int cnt)
! 190: {
! 191: while (cnt--)
! 192: addch('-');
! 193: }
! 194:
! 195: /*
! 196: * rnd_pos:
! 197: * pick a random spot in a room
! 198: */
! 199:
! 200: void
! 201: rnd_pos(struct room *rp, coord *cp)
! 202: {
! 203: cp->x = rp->r_pos.x + rnd(rp->r_max.x-2) + 1;
! 204: cp->y = rp->r_pos.y + rnd(rp->r_max.y-2) + 1;
! 205: }
! 206:
! 207:
! 208:
! 209: /*
! 210: * roomin:
! 211: * Find what room some coordinates are in. NULL means they aren't
! 212: * in any room.
! 213: */
! 214:
! 215: struct room *
! 216: roomin(coord *cp)
! 217: {
! 218: register struct room *rp;
! 219:
! 220: for (rp = rooms; rp < &rooms[MAXROOMS]; rp++)
! 221: if (inroom(rp, cp))
! 222: return rp;
! 223: return NULL;
! 224: }
! 225:
! 226: /*
! 227: * vert:
! 228: * draw a vertical line
! 229: */
! 230:
! 231: void
! 232: vert(int cnt)
! 233: {
! 234: register int x, y;
! 235:
! 236: getyx(stdscr, y, x);
! 237: x--;
! 238: while (cnt--) {
! 239: move(++y, x);
! 240: addch('|');
! 241: }
! 242: }
CVSweb