Annotation of early-roguelike/urogue/rooms.c, Revision 1.1.1.1
1.1 rubenllo 1: /*
2: rooms.c - Draw the nine rooms on the screen
3:
4: UltraRogue: The Ultimate Adventure in the Dungeons of Doom
5: Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
6: All rights reserved.
7:
8: Based on "Advanced Rogue"
9: Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
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 "rogue.h"
21:
22: void
23: do_rooms(void)
24: {
25: int i;
26: struct room *rp;
27: struct linked_list *item;
28: struct thing *tp;
29: int left_out;
30: coord top;
31: coord bsze;
32: coord mp;
33:
34: /* bsze is the maximum room size */
35:
36: bsze.x = COLS / 3;
37: bsze.y = (LINES - 2) / 3;
38:
39: /* Clear things for a new level */
40:
41: for (rp = rooms; rp < &rooms[MAXROOMS]; rp++)
42: rp->r_nexits = rp->r_flags = rp->r_fires = 0;
43:
44: /* Put the gone rooms, if any, on the level */
45:
46: left_out = rnd(3);
47:
48: for (i = 0; i < left_out; i++)
49: rooms[rnd_room()].r_flags |= ISGONE;
50:
51: /* dig and populate all the rooms on the level */
52:
53: for (i = 0, rp = rooms; i < MAXROOMS; rp++, i++)
54: {
55: int has_gold = FALSE;
56:
57: /* Find upper left corner of box that this room goes in */
58:
59: top.x = (i % 3) * bsze.x;
60: top.y = i / 3 * bsze.y + 1;
61:
62: if (rp->r_flags & ISGONE)
63: {
64: /*
65: * Place a gone room. Make certain that there is a
66: * blank line for passage drawing.
67: */
68:
69: do
70: {
71: rp->r_pos.x = top.x + rnd(bsze.x - 2) + 1;
72: rp->r_pos.y = top.y + rnd(bsze.y - 2) + 1;
73: rp->r_max.x = -COLS;
74: rp->r_max.x = -LINES;
75: }
76: while (rp->r_pos.y < 1 || rp->r_pos.y > LINES - 3);
77:
78: continue;
79: }
80:
81: if (rnd(40) < level - 5)
82: rp->r_flags |= ISDARK;
83:
84: /* Find a place and size for a random room */
85:
86: do
87: {
88: rp->r_max.x = rnd(bsze.x - 4) + 4;
89: rp->r_max.y = rnd(bsze.y - 4) + 4;
90: rp->r_pos.x = top.x + rnd(bsze.x - rp->r_max.x);
91: rp->r_pos.y = top.y + rnd(bsze.y - rp->r_max.y);
92: }
93: while (rp->r_pos.y == 0);
94:
95: /* Draw the room */
96:
97: draw_room(rp);
98:
99: /* Put the gold in */
100:
101: if (rnd(10) < 3 && (!has_artifact || level >= max_level))
102: {
103: struct linked_list *itm;
104: struct object *cur;
105: coord tpos;
106:
107: has_gold = TRUE; /* This room has gold in it */
108:
109: itm = spec_item(GOLD, 0, 0, 0);
110: cur = OBJPTR(itm);
111:
112: /* Put it somewhere */
113:
114: rnd_pos(rp, &tpos);
115: cur->o_pos = tpos;
116:
117: /* Put the gold into the level list of items */
118:
119: add_obj(itm, tpos.y, tpos.x);
120:
121: if (roomin(tpos) != rp)
122: {
123: endwin();
124: abort();
125: }
126: }
127:
128: /* Put the monster in */
129:
130: if (rnd(100) < (has_gold ? 80 : 40))
131: {
132: int which;
133: int n, cnt;
134:
135: item = new_item(sizeof *tp);
136: tp = THINGPTR(item);
137:
138: do
139: rnd_pos(rp, &mp);
140: while (mvwinch(stdscr, mp.y, mp.x) != FLOOR);
141:
142: which = randmonster(NOWANDER, NOGRAB);
143: new_monster(item, which, &mp, NOMAXSTATS);
144:
145: /* See if we want to give it a treasure to carry around. */
146:
147: if (rnd(100) < monsters[tp->t_index].m_carry)
148: attach(tp->t_pack, new_thing());
149:
150: /* If it has a fire, mark it */
151:
152: if (on(*tp, HASFIRE))
153: {
154: rp->r_flags |= HASFIRE;
155: rp->r_fires++;
156: }
157:
158: /* If it carries gold, give it some */
159:
160: if (on(*tp, CARRYGOLD))
161: {
162: struct object *cur;
163:
164: item = spec_item(GOLD, 0, 0, 0);
165: cur = OBJPTR(item);
166: cur->o_count = GOLDCALC + GOLDCALC + GOLDCALC;
167: cur->o_pos = tp->t_pos;
168: attach(tp->t_pack, item);
169: }
170:
171: n = rnd(7);
172:
173: if (on(*tp, ISSWARM) && n < 5)
174: cnt = roll(2, 4);
175: else if (on(*tp, ISFLOCK) && n < 5)
176: cnt = roll(1, 4);
177: else
178: cnt = 0;
179:
180: for (n = 1; n <= cnt; n++)
181: {
182: coord pos;
183:
184: if (place_mons(mp.y, mp.x, &pos)!= FALSE)
185: {
186: struct linked_list *nitem;
187:
188: nitem = new_item(sizeof(struct thing));
189: new_monster(nitem, which, &pos, NOMAXSTATS);
190:
191: /* If the monster is on a trap, trap it */
192:
193: if (isatrap(mvinch(pos.y, pos.x)))
194: be_trapped(THINGPTR(nitem), mp);
195:
196: if (on(*tp, ISFRIENDLY))
197: turn_on(*(THINGPTR(nitem)), ISFRIENDLY);
198: else
199: turn_off(*(THINGPTR(nitem)), ISFRIENDLY);
200: }
201: }
202:
203: if (cnt > 0)
204: {
205: int boost = rnd(3) + 1;
206:
207: if (on(*tp, LOWCAST) || on(*tp, MEDCAST) || on(*tp, HIGHCAST))
208: turn_on(*tp, CANCAST);
209:
210: tp->t_stats.s_hpt += 3 * boost;
211: tp->t_stats.s_arm -= 2 * boost;
212: tp->t_stats.s_lvl += 2 * boost;
213: tp->t_stats.s_str += 2 * boost;
214: tp->t_stats.s_intel += 2 * boost;
215: tp->t_stats.s_exp += 4 * boost * monsters[which].m_add_exp;
216: }
217: }
218: }
219: }
220:
221: /*
222: draw_room()
223: Draw a box around a room
224: */
225:
226: void
227: draw_room(struct room *rp)
228: {
229: int j, k;
230:
231: move(rp->r_pos.y, rp->r_pos.x + 1);
232: vert(rp->r_max.y - 2); /* Draw left side */
233: move(rp->r_pos.y + rp->r_max.y - 1, rp->r_pos.x);
234: horiz(rp->r_max.x); /* Draw bottom */
235: move(rp->r_pos.y, rp->r_pos.x);
236: horiz(rp->r_max.x); /* Draw top */
237: vert(rp->r_max.y - 2); /* Draw right side */
238:
239: /* Put the floor down */
240:
241: for (j = 1; j < rp->r_max.y - 1; j++)
242: {
243: move(rp->r_pos.y + j, rp->r_pos.x + 1);
244:
245: for (k = 1; k < rp->r_max.x - 1; k++)
246: addch(FLOOR);
247: }
248: }
249:
250: /*
251: horiz()
252: draw a horizontal line
253: */
254:
255: void
256: horiz(int cnt)
257: {
258: while(cnt--)
259: addch('-');
260: }
261:
262: /*
263: vert()
264: draw a vertical line
265: */
266:
267: void
268: vert(int cnt)
269: {
270: int x, y;
271:
272: getyx(stdscr, y, x);
273:
274: x--;
275:
276: while(cnt--)
277: {
278: move(++y, x);
279: addch('|');
280: }
281: }
282:
283: /*
284: rnd_pos()
285: pick a random spot in a room
286: */
287:
288: void
289: rnd_pos(struct room *rp, coord *cp)
290: {
291: cp->x = rp->r_pos.x + rnd(rp->r_max.x - 2) + 1;
292: cp->y = rp->r_pos.y + rnd(rp->r_max.y - 2) + 1;
293: }
294:
295: /*
296: rnd_room()
297: Pick a room that is really there
298: */
299:
300: int
301: rnd_room(void)
302: {
303: int rm;
304:
305: if (levtype != NORMLEV)
306: rm = 0;
307: else
308: do
309: {
310: rm = rnd(MAXROOMS);
311: }
312: while (rooms[rm].r_flags & ISGONE);
313:
314: return(rm);
315: }
CVSweb