Annotation of early-roguelike/arogue5/rooms.c, Revision 1.1.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