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