Annotation of early-roguelike/xrogue/rooms.c, Revision 1.1.1.1
1.1 rubenllo 1: /*
2: rooms.c - Draw the nine rooms on the screen
3:
4: XRogue: Expeditions into the Dungeons of Doom
5: Copyright (C) 1991 Robert Pietkivitch
6: All rights reserved.
7:
8: Based on "Advanced Rogue"
9: Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
10: All rights reserved.
11:
12: Based on "Rogue: Exploring the Dungeons of Doom"
13: Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
14: All rights reserved.
15:
16: See the file LICENSE.TXT for full copyright and licensing information.
17: */
18:
19: #include <stdlib.h>
20: #include <curses.h>
21: #include "rogue.h"
22:
23: void horiz(int cnt);
24: void vert(int cnt);
25:
26: void
27: do_rooms(void)
28: {
29: register int i;
30: register struct room *rp;
31: register struct linked_list *item;
32: register struct thing *tp;
33: int left_out;
34: int num_monsters;
35: int which_monster;
36: int j;
37: coord top;
38: coord bsze;
39: coord mp;
40: coord *np;
41:
42: /*
43: * bsze is the maximum room size
44: */
45: bsze.x = cols/3;
46: bsze.y = (lines-2)/3;
47: /*
48: * Clear things for a new level
49: */
50: for (rp = rooms; rp < &rooms[MAXROOMS]; rp++) {
51: rp->r_flags = 0;
52: _r_free_fire_list(&rp->r_fires);
53: }
54: /*
55: * Put the gone rooms, if any, on the level
56: */
57: left_out = rnd(4);
58: for (i = 0; i < left_out; i++)
59: rooms[rnd_room()].r_flags |= ISGONE;
60: /*
61: * dig and populate all the rooms on the level
62: */
63: for (i = 0, rp = rooms; i < MAXROOMS; rp++, i++)
64: {
65: bool has_gold=FALSE;
66:
67: /*
68: * Find upper left corner of box that this room goes in
69: */
70: top.x = (i%3)*bsze.x;
71: top.y = i/3*bsze.y + 1;
72: if (rp->r_flags & ISGONE)
73: {
74: /*
75: * Place a gone room. Make certain that there is a blank line
76: * for passage drawing.
77: */
78: do
79: {
80: rp->r_pos.x = top.x + rnd(bsze.x-2) + 1;
81: rp->r_pos.y = top.y + rnd(bsze.y-2) + 1;
82: rp->r_max.x = -cols;
83: rp->r_max.y = -lines;
84: } until(rp->r_pos.y > 0 && rp->r_pos.y < lines-2);
85: continue;
86: }
87: if (rnd(10) < level-1)
88: rp->r_flags |= ISDARK;
89: /*
90: * Find a place and size for a random room
91: */
92: do
93: {
94: rp->r_max.x = rnd(bsze.x - 4) + 4;
95: rp->r_max.y = rnd(bsze.y - 4) + 4;
96: rp->r_pos.x = top.x + rnd(bsze.x - rp->r_max.x);
97: rp->r_pos.y = top.y + rnd(bsze.y - rp->r_max.y);
98: } until (rp->r_pos.y != 0);
99:
100: /* Draw the room */
101: draw_room(rp);
102:
103: /*
104: * Put the gold in
105: */
106: if (rnd(100) < 55 && level >= cur_max)
107: {
108: register struct linked_list *item;
109: register struct object *cur;
110: coord tp;
111:
112: has_gold = TRUE; /* This room has gold in it */
113:
114: item = spec_item(GOLD, 0, 0, 0);
115: cur = OBJPTR(item);
116:
117: /* Put the gold into the level list of items */
118: attach(lvl_obj, item);
119:
120: /* Put it somewhere */
121: rnd_pos(rp, &tp);
122: mvaddch(tp.y, tp.x, GOLD);
123: cur->o_pos = tp;
124: if (roomin(&tp) != rp) {
125: endwin();
126: abort();
127: }
128: }
129:
130: /*
131: * Put the monster in
132: */
133: if (rnd(100) < (has_gold ? 80 : 25) + vlevel/2)
134: {
135: do
136: {
137: rnd_pos(rp, &mp);
138: } until(mvwinch(stdscr, mp.y, mp.x) == FLOOR);
139: which_monster = randmonster(FALSE, FALSE);
140: num_monsters = 1;
141: /*
142: * see if we should make a whole bunch
143: */
144: for (j=0; j<MAXFLAGS; j++) {
145: if (monsters[which_monster].m_flags[j] == AREMANY)
146: num_monsters = roll(7,2);
147: }
148: for (j=0; j<num_monsters; j++) {
149: if ((np = fallpos(&mp, FALSE, 2)) != NULL &&
150: mvwinch(stdscr, np->y, np->x) == FLOOR) {
151: item = new_item(sizeof *tp);
152: tp = THINGPTR(item);
153: new_monster(item, which_monster, np, FALSE);
154: /*
155: * See if we want to give it a treasure to
156: * carry around.
157: */
158: carry_obj(tp, monsters[tp->t_index].m_carry);
159: tp->t_no_move = movement(tp);
160:
161: /*
162: * If it has a fire, mark it
163: */
164: if (on(*tp, HASFIRE)) {
165: register struct linked_list *fire_item;
166:
167: fire_item = creat_item();
168: ldata(fire_item) = (char *) tp;
169: attach(rp->r_fires, fire_item);
170: rp->r_flags |= HASFIRE;
171: }
172: }
173: }
174: }
175: }
176: }
177:
178: /*
179: * Given a room pointer and a pointer to a door, supposedly in that room,
180: * return the coordinates of the entrance to the doorway.
181: */
182:
183: coord *
184: doorway(struct room *rp, coord *door)
185: {
186: register int misses = 0;
187: static coord answer;
188:
189: /* Do we have decent parameters? */
190: if (rp == NULL || door == NULL) return(NULL);
191:
192: /* Initialize the answer to be the door, then calculate the offset */
193: answer = *door;
194:
195: /* Calculate the x-offset */
196: if (door->x == rp->r_pos.x) answer.x++;
197: else if (door->x == rp->r_pos.x + rp->r_max.x - 1) answer.x--;
198: else misses++;
199:
200: /* Calculate the y-offset */
201: if (door->y == rp->r_pos.y) answer.y++;
202: else if (door->y == rp->r_pos.y + rp->r_max.y - 1) answer.y--;
203: else misses++;
204:
205: if (misses <= 1) return(&answer);
206: else return(NULL);
207: }
208:
209: /*
210: * Draw a box around a room
211: */
212:
213: void
214: draw_room(struct room *rp)
215: {
216: register int j, k;
217:
218: move(rp->r_pos.y, rp->r_pos.x+1);
219: vert(rp->r_max.y-2); /* Draw left side */
220: move(rp->r_pos.y+rp->r_max.y-1, rp->r_pos.x);
221: horiz(rp->r_max.x); /* Draw bottom */
222: move(rp->r_pos.y, rp->r_pos.x);
223: horiz(rp->r_max.x); /* Draw top */
224: vert(rp->r_max.y-2); /* Draw right side */
225: /*
226: * Put the floor down
227: */
228: for (j = 1; j < rp->r_max.y-1; j++)
229: {
230: move(rp->r_pos.y + j, rp->r_pos.x+1);
231: for (k = 1; k < rp->r_max.x-1; k++)
232: addch(FLOOR);
233: }
234: }
235:
236: /*
237: * horiz:
238: * draw a horizontal line
239: */
240:
241: void
242: horiz(int cnt)
243: {
244: while (cnt--)
245: addch(HORZWALL);
246: }
247:
248: /*
249: * rnd_pos:
250: * pick a random spot in a room
251: */
252:
253: void
254: rnd_pos(struct room *rp, coord *cp)
255: {
256: cp->x = rp->r_pos.x + rnd(rp->r_max.x-2) + 1;
257: cp->y = rp->r_pos.y + rnd(rp->r_max.y-2) + 1;
258: }
259:
260:
261:
262: /*
263: * roomin:
264: * Find what room some coordinates are in. NULL means they aren't
265: * in any room.
266: */
267:
268: struct room *
269: roomin(coord *cp)
270: {
271: register struct room *rp;
272:
273: for (rp = rooms; rp < &rooms[MAXROOMS]; rp++)
274: if (inroom(rp, cp))
275: return rp;
276: return NULL;
277: }
278:
279: /*
280: * vert:
281: * draw a vertical line
282: */
283:
284: void
285: vert(int cnt)
286: {
287: register int x, y;
288:
289: getyx(stdscr, y, x);
290: x--;
291: while (cnt--) {
292: move(++y, x);
293: addch(VERTWALL);
294: }
295: }
296:
CVSweb