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