comparison rogue4/rooms.c @ 12:9535a08ddc39

Import Rogue 5.2 from the Roguelike Restoration Project (r1490)
author edwarj4
date Sat, 24 Oct 2009 16:52:52 +0000
parents
children 1b73a8641b37
comparison
equal deleted inserted replaced
11:949d558c2162 12:9535a08ddc39
1 /*
2 * Create the layout for the new level
3 *
4 * @(#)rooms.c 4.16 (Berkeley) 1/12/82
5 *
6 * Rogue: Exploring the Dungeons of Doom
7 * Copyright (C) 1980, 1981, 1982 Michael Toy, Ken Arnold and Glenn Wichman
8 * All rights reserved.
9 *
10 * See the file LICENSE.TXT for full copyright and licensing information.
11 */
12
13 #include <ctype.h>
14 #include <curses.h>
15 #include "rogue.h"
16
17 #define GOLDGRP 1
18
19 /*
20 * do_rooms:
21 * Create rooms and corridors with a connectivity graph
22 */
23 do_rooms()
24 {
25 register int i;
26 register struct room *rp;
27 register THING *tp;
28 register int left_out;
29 coord top;
30 coord bsze;
31 coord mp;
32
33 /*
34 * bsze is the maximum room size
35 */
36 bsze.x = COLS/3;
37 bsze.y = LINES/3;
38 /*
39 * Clear things for a new level
40 */
41 for (rp = rooms; rp < &rooms[MAXROOMS]; rp++)
42 rp->r_goldval = rp->r_nexits = rp->r_flags = 0;
43 /*
44 * Put the gone rooms, if any, on the level
45 */
46 left_out = rnd(4);
47 for (i = 0; i < left_out; i++)
48 rooms[rnd_room()].r_flags |= ISGONE;
49 /*
50 * dig and populate all the rooms on the level
51 */
52 for (i = 0, rp = rooms; i < MAXROOMS; rp++, i++)
53 {
54 /*
55 * Find upper left corner of box that this room goes in
56 */
57 top.x = (i%3)*bsze.x + 1;
58 top.y = i/3*bsze.y;
59 if (rp->r_flags & ISGONE)
60 {
61 /*
62 * Place a gone room. Make certain that there is a blank line
63 * for passage drawing.
64 */
65 do
66 {
67 rp->r_pos.x = top.x + rnd(bsze.x-2) + 1;
68 rp->r_pos.y = top.y + rnd(bsze.y-2) + 1;
69 rp->r_max.x = -COLS;
70 rp->r_max.x = -LINES;
71 } until (rp->r_pos.y > 0 && rp->r_pos.y < LINES-1);
72 continue;
73 }
74 if (rnd(10) < level - 1)
75 rp->r_flags |= ISDARK;
76 /*
77 * Find a place and size for a random room
78 */
79 do
80 {
81 rp->r_max.x = rnd(bsze.x - 4) + 4;
82 rp->r_max.y = rnd(bsze.y - 4) + 4;
83 rp->r_pos.x = top.x + rnd(bsze.x - rp->r_max.x);
84 rp->r_pos.y = top.y + rnd(bsze.y - rp->r_max.y);
85 } until (rp->r_pos.y != 0);
86 /*
87 * Put the gold in
88 */
89 if (rnd(2) == 0 && (!amulet || level >= max_level))
90 {
91 register THING *gold;
92
93 gold = new_item();
94 gold->o_goldval = rp->r_goldval = GOLDCALC;
95 rnd_pos(rp, &rp->r_gold);
96 gold->o_pos = rp->r_gold;
97 gold->o_flags = ISMANY;
98 gold->o_group = GOLDGRP;
99 gold->o_type = GOLD;
100 attach(lvl_obj, gold);
101 }
102 draw_room(rp);
103 /*
104 * Put the monster in
105 */
106 if (rnd(100) < (rp->r_goldval > 0 ? 80 : 25))
107 {
108 tp = new_item();
109 do
110 {
111 rnd_pos(rp, &mp);
112 } until (winat(mp.y, mp.x) == FLOOR);
113 new_monster(tp, randmonster(FALSE), &mp);
114 give_pack(tp);
115 }
116 }
117 }
118
119 /*
120 * draw_room:
121 * Draw a box around a room and lay down the floor
122 */
123 draw_room(rp)
124 register struct room *rp;
125 {
126 register int y, x;
127
128 vert(rp, rp->r_pos.x); /* Draw left side */
129 vert(rp, rp->r_pos.x + rp->r_max.x - 1); /* Draw right side */
130 horiz(rp, rp->r_pos.y); /* Draw top */
131 horiz(rp, rp->r_pos.y + rp->r_max.y - 1); /* Draw bottom */
132 /*
133 * Put the floor down
134 */
135 for (y = rp->r_pos.y + 1; y < rp->r_pos.y + rp->r_max.y - 1; y++)
136 /*strrep(&chat(rp->r_pos.y + 1, j), FLOOR, rp->r_max.y - rp->r_pos.y - 2);*/
137 for (x = rp->r_pos.x + 1; x < rp->r_pos.x + rp->r_max.x - 1; x++)
138 chat(y, x) = FLOOR;
139 /*
140 * Put the gold there
141 */
142 if (rp->r_goldval)
143 chat(rp->r_gold.y, rp->r_gold.x) = GOLD;
144 }
145
146 /*
147 * vert:
148 * Draw a vertical line
149 */
150 vert(rp, startx)
151 register struct room *rp;
152 register int startx;
153 {
154 register int y;
155
156 for (y = rp->r_pos.y + 1; y <= rp->r_max.y + rp->r_pos.y - 1; y++)
157 chat(y, startx) = '|';
158 }
159
160 /*
161 * horiz:
162 * Draw a horizontal line
163 */
164 horiz(rp, starty)
165 register struct room *rp;
166 int starty;
167 {
168 register int x;
169
170 for (x = rp->r_pos.x; x <= rp->r_pos.x + rp->r_max.x - 1; x++)
171 chat(starty, x) = '-';
172 }
173
174 /*
175 * rnd_pos:
176 * Pick a random spot in a room
177 */
178 rnd_pos(rp, cp)
179 register struct room *rp;
180 register coord *cp;
181 {
182 cp->x = rp->r_pos.x + rnd(rp->r_max.x - 2) + 1;
183 cp->y = rp->r_pos.y + rnd(rp->r_max.y - 2) + 1;
184 }
185
186 /*
187 * enter_room:
188 * Code that is executed whenver you appear in a room
189 */
190 enter_room(cp)
191 register coord *cp;
192 {
193 register struct room *rp;
194 register int y, x;
195 register THING *tp;
196
197 rp = proom = roomin(cp);
198 if (rp->r_flags & ISGONE)
199 {
200 msg("in a gone room");
201 return;
202 }
203 door_open(rp);
204 if (!(rp->r_flags & ISDARK) && !on(player, ISBLIND))
205 for (y = rp->r_pos.y; y < rp->r_max.y + rp->r_pos.y; y++)
206 {
207 move(y, rp->r_pos.x);
208 for (x = rp->r_pos.x; x < rp->r_max.x + rp->r_pos.x; x++)
209 {
210 tp = moat(y, x);
211 if (tp == NULL || !see_monst(tp))
212 addch(chat(y, x));
213 else
214 addch(tp->t_disguise);
215 }
216 }
217 }
218
219 /*
220 * leave_room:
221 * Code for when we exit a room
222 */
223 leave_room(cp)
224 register coord *cp;
225 {
226 register int y, x;
227 register struct room *rp;
228 register char floor;
229 register char ch;
230
231 rp = proom;
232 proom = &passages[flat(cp->y, cp->x) & F_PNUM];
233 floor = ((rp->r_flags & ISDARK) && !on(player, ISBLIND)) ? ' ' : FLOOR;
234 for (y = rp->r_pos.y + 1; y < rp->r_max.y + rp->r_pos.y - 1; y++)
235 for (x = rp->r_pos.x + 1; x < rp->r_max.x + rp->r_pos.x - 1; x++)
236 switch (ch = mvinch(y, x))
237 {
238 case ' ':
239 case TRAP:
240 case STAIRS:
241 break;
242 case FLOOR:
243 if (floor == ' ')
244 addch(' ');
245 break;
246 default:
247 /*
248 * to check for monster, we have to strip out
249 * standout bit
250 */
251 if (isupper(toascii(ch)))
252 if (on(player, SEEMONST))
253 {
254 standout();
255 addch(ch);
256 standend();
257 break;
258 }
259 else
260 {
261 THING *tp = moat(y, x);
262
263 if (tp != NULL)
264 tp->t_oldch = floor;
265
266 #ifdef WIZARD
267 else
268 msg("couldn't find monster in leave_room at (%d,%d)", y, x);
269 #endif
270 }
271
272 addch(floor);
273 }
274 door_open(rp);
275 }