comparison rogue3/rooms.c @ 0:527e2150eaf0

Import Rogue 3.6 from the Roguelike Restoration Project (r1490)
author edwarj4
date Tue, 13 Oct 2009 13:33:34 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:527e2150eaf0
1 /*
2 * Draw the nine rooms on the screen
3 *
4 * @(#)rooms.c 3.8 (Berkeley) 6/15/81
5 *
6 * Rogue: Exploring the Dungeons of Doom
7 * Copyright (C) 1980, 1981 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 <stdlib.h>
14 #include "curses.h"
15 #include "rogue.h"
16
17 void
18 do_rooms()
19 {
20 int i;
21 struct room *rp;
22 struct linked_list *item;
23 struct thing *tp;
24 int left_out;
25 coord top;
26 coord bsze;
27 coord mp;
28
29 /*
30 * bsze is the maximum room size
31 */
32 bsze.x = COLS/3;
33 bsze.y = LINES/3;
34 /*
35 * Clear things for a new level
36 */
37 for (rp = rooms; rp <= &rooms[MAXROOMS-1]; rp++)
38 rp->r_goldval = rp->r_nexits = rp->r_flags = 0;
39 /*
40 * Put the gone rooms, if any, on the level
41 */
42 left_out = rnd(4);
43 for (i = 0; i < left_out; i++)
44 rooms[rnd_room()].r_flags |= ISGONE;
45 /*
46 * dig and populate all the rooms on the level
47 */
48 for (i = 0, rp = rooms; i < MAXROOMS; rp++, i++)
49 {
50 /*
51 * Find upper left corner of box that this room goes in
52 */
53 top.x = (i%3)*bsze.x + 1;
54 top.y = i/3*bsze.y;
55 if (rp->r_flags & ISGONE)
56 {
57 /*
58 * Place a gone room. Make certain that there is a blank line
59 * for passage drawing.
60 */
61 do
62 {
63 rp->r_pos.x = top.x + rnd(bsze.x-2) + 1;
64 rp->r_pos.y = top.y + rnd(bsze.y-2) + 1;
65 rp->r_max.x = -COLS;
66 rp->r_max.y = -LINES;
67 } until(rp->r_pos.y > 0 && rp->r_pos.y < LINES-1);
68 continue;
69 }
70 if (rnd(10) < level-1)
71 rp->r_flags |= ISDARK;
72 /*
73 * Find a place and size for a random room
74 */
75 do
76 {
77 rp->r_max.x = rnd(bsze.x - 4) + 4;
78 rp->r_max.y = rnd(bsze.y - 4) + 4;
79 rp->r_pos.x = top.x + rnd(bsze.x - rp->r_max.x);
80 rp->r_pos.y = top.y + rnd(bsze.y - rp->r_max.y);
81 } until (rp->r_pos.y != 0);
82 /*
83 * Put the gold in
84 */
85 if (rnd(100) < 50 && (!amulet || level >= max_level))
86 {
87 rp->r_goldval = GOLDCALC;
88 rnd_pos(rp, &rp->r_gold);
89 if (roomin(&rp->r_gold) != rp)
90 endwin(), abort();
91 }
92 draw_room(rp);
93 /*
94 * Put the monster in
95 */
96 if (rnd(100) < (rp->r_goldval > 0 ? 80 : 25))
97 {
98 item = new_item(sizeof *tp);
99 tp = (struct thing *) ldata(item);
100 do
101 {
102 rnd_pos(rp, &mp);
103 } until(mvwinch(stdscr, mp.y, mp.x) == FLOOR);
104 new_monster(item, randmonster(FALSE), &mp);
105 /*
106 * See if we want to give it a treasure to carry around.
107 */
108 if (rnd(100) < monsters[tp->t_type-'A'].m_carry)
109 attach(tp->t_pack, new_thing());
110 }
111 }
112 }
113
114 /*
115 * Draw a box around a room
116 */
117
118 void
119 draw_room(struct room *rp)
120 {
121 int j, k;
122
123 move(rp->r_pos.y, rp->r_pos.x+1);
124 vert(rp->r_max.y-2); /* Draw left side */
125 move(rp->r_pos.y+rp->r_max.y-1, rp->r_pos.x);
126 horiz(rp->r_max.x); /* Draw bottom */
127 move(rp->r_pos.y, rp->r_pos.x);
128 horiz(rp->r_max.x); /* Draw top */
129 vert(rp->r_max.y-2); /* Draw right side */
130 /*
131 * Put the floor down
132 */
133 for (j = 1; j < rp->r_max.y-1; j++)
134 {
135 move(rp->r_pos.y + j, rp->r_pos.x+1);
136 for (k = 1; k < rp->r_max.x-1; k++)
137 addch(FLOOR);
138 }
139 /*
140 * Put the gold there
141 */
142 if (rp->r_goldval)
143 mvaddch(rp->r_gold.y, rp->r_gold.x, GOLD);
144 }
145
146 /*
147 * horiz:
148 * draw a horizontal line
149 */
150
151 void
152 horiz(int cnt)
153 {
154 while (cnt--)
155 addch('-');
156 }
157
158 /*
159 * vert:
160 * draw a vertical line
161 */
162
163 void
164 vert(int cnt)
165 {
166 int x, y;
167
168 getyx(stdscr, y, x);
169 x--;
170 while (cnt--) {
171 move(++y, x);
172 addch('|');
173 }
174 }
175
176 /*
177 * rnd_pos:
178 * pick a random spot in a room
179 */
180
181 void
182 rnd_pos(struct room *rp, coord *cp)
183 {
184 cp->x = rp->r_pos.x + rnd(rp->r_max.x-2) + 1;
185 cp->y = rp->r_pos.y + rnd(rp->r_max.y-2) + 1;
186 }