Mercurial > hg > early-roguelike
comparison arogue7/outside.c @ 125:adfa37e67084
Import Advanced Rogue 7.7 from the Roguelike Restoration Project (r1490)
author | John "Elwin" Edwards |
---|---|
date | Fri, 08 May 2015 15:24:40 -0400 |
parents | |
children | f9ef86cf22b2 |
comparison
equal
deleted
inserted
replaced
124:d10fc4a065ac | 125:adfa37e67084 |
---|---|
1 /* | |
2 * outside.c - functions for dealing with the "outside" level | |
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 #include "curses.h" | |
16 #include "rogue.h" | |
17 | |
18 extern char rnd_terrain(), get_terrain(); | |
19 | |
20 /* | |
21 * init_terrain: | |
22 * Get the single "outside room" set up correctly | |
23 */ | |
24 | |
25 void | |
26 init_terrain() | |
27 { | |
28 register struct room *rp; | |
29 | |
30 for (rp = rooms; rp < &rooms[MAXROOMS]; rp++) { | |
31 rp->r_flags = ISGONE; /* kill all rooms */ | |
32 rp->r_fires = NULL; /* no fires */ | |
33 } | |
34 rp = &rooms[0]; /* point to only room */ | |
35 rp->r_flags = ISDARK; /* outside is always dark */ | |
36 rp->r_pos.x = 0; /* room fills whole screen */ | |
37 rp->r_pos.y = 1; | |
38 rp->r_max.x = cols; | |
39 rp->r_max.y = lines - 3; | |
40 } | |
41 | |
42 | |
43 | |
44 void | |
45 do_terrain(basey, basex, deltay, deltax, fresh) | |
46 int basey, basex, deltay, deltax; | |
47 bool fresh; | |
48 { | |
49 register cury, curx; /* Current y and x positions */ | |
50 | |
51 /* Lay out the boundary */ | |
52 for (cury=1; cury<lines-2; cury++) { /* Vertical "walls" */ | |
53 mvaddch(cury, 0, '|'); | |
54 mvaddch(cury, cols-1, '|'); | |
55 } | |
56 for (curx=0; curx<cols; curx++) { /* Horizontal "walls" */ | |
57 mvaddch(1, curx, '-'); | |
58 mvaddch(lines-3, curx, '-'); | |
59 } | |
60 | |
61 /* If we are not continuing, let's start out with a line of terrain */ | |
62 if (fresh) { | |
63 char ch; /* Next char to add */ | |
64 | |
65 /* Move to the starting point (should be (1, 0)) */ | |
66 move(basey, basex); | |
67 curx = basex; | |
68 | |
69 /* Start with some random terrain */ | |
70 if (basex == 0) { | |
71 ch = rnd_terrain(); | |
72 addch(ch); | |
73 } | |
74 else ch = CCHAR( mvinch(basey, basex) ); | |
75 | |
76 curx += deltax; | |
77 | |
78 /* Fill in the rest of the line */ | |
79 while (curx > 0 && curx < cols-1) { | |
80 /* Put in the next piece */ | |
81 ch = get_terrain(ch, '\0', '\0', '\0'); | |
82 mvaddch(basey, curx, ch); | |
83 curx += deltax; | |
84 } | |
85 | |
86 basey++; /* Advance to next line */ | |
87 } | |
88 | |
89 /* Fill in the rest of the lines */ | |
90 cury = basey; | |
91 while (cury > 1 && cury < lines - 3) { | |
92 curx = basex; | |
93 while (curx > 0 && curx < cols-1) { | |
94 register char left, top_left, top, top_right; | |
95 register int left_pos, top_pos; | |
96 | |
97 /* Get the surrounding terrain */ | |
98 left_pos = curx - deltax; | |
99 top_pos = cury - deltay; | |
100 | |
101 left = CCHAR( mvinch(cury, left_pos) ); | |
102 top_left = CCHAR( mvinch(top_pos, left_pos) ); | |
103 top = CCHAR( mvinch(top_pos, curx) ); | |
104 top_right = CCHAR( mvinch(top_pos, curx + deltax) ); | |
105 | |
106 /* Put the piece of terrain on the map */ | |
107 mvaddch(cury, curx, get_terrain(left, top_left, top, top_right)); | |
108 | |
109 /* Get the next x coordinate */ | |
110 curx += deltax; | |
111 } | |
112 | |
113 /* Get the next y coordinate */ | |
114 cury += deltay; | |
115 } | |
116 genmonsters(5, (bool) 0); | |
117 } | |
118 | |
119 | |
120 /* | |
121 * do_paths: | |
122 * draw at least a single path-way through the terrain | |
123 */ | |
124 | |
125 | |
126 /* | |
127 * rnd_terrain: | |
128 * return a weighted, random type of outside terrain | |
129 */ | |
130 | |
131 char | |
132 rnd_terrain() | |
133 { | |
134 int chance = rnd(100); | |
135 | |
136 /* Forest is most likely */ | |
137 if (chance < 60) return(FOREST); | |
138 | |
139 /* Next comes meadow */ | |
140 if (chance < 90) return(FLOOR); | |
141 | |
142 /* Then comes lakes */ | |
143 if (chance < 97) return(POOL); | |
144 | |
145 /* Finally, mountains */ | |
146 return(WALL); | |
147 } | |
148 | |
149 | |
150 /* | |
151 * get_terrain: | |
152 * return a terrain weighted by what is surrounding | |
153 */ | |
154 | |
155 char | |
156 get_terrain(one, two, three, four) | |
157 char one, two, three, four; | |
158 { | |
159 register int i; | |
160 int forest = 0, mountain = 0, lake = 0, meadow = 0, total = 0; | |
161 char surrounding[4]; | |
162 | |
163 surrounding[0] = one; | |
164 surrounding[1] = two; | |
165 surrounding[2] = three; | |
166 surrounding[3] = four; | |
167 | |
168 for (i=0; i<4; i++) | |
169 switch (surrounding[i]) { | |
170 case FOREST: | |
171 forest++; | |
172 total++; | |
173 | |
174 when WALL: | |
175 mountain++; | |
176 total++; | |
177 | |
178 when POOL: | |
179 lake++; | |
180 total++; | |
181 | |
182 when FLOOR: | |
183 meadow++; | |
184 total++; | |
185 } | |
186 | |
187 /* Should we continue mountain? */ | |
188 if (rnd(total+1) < mountain) return(WALL); | |
189 | |
190 /* Should we continue lakes? */ | |
191 if (rnd(total+1) < lake) return(POOL); | |
192 | |
193 /* Should we continue meadow? */ | |
194 if (rnd(total+1) < meadow) return(FLOOR); | |
195 | |
196 /* Should we continue forest? */ | |
197 if (rnd(total+2) < forest) return(FOREST); | |
198 | |
199 /* Return something random */ | |
200 return(rnd_terrain()); | |
201 } | |
202 | |
203 | |
204 /* | |
205 * lake_check: | |
206 * Determine if the player would drown | |
207 */ | |
208 | |
209 void | |
210 lake_check(place) | |
211 coord *place; | |
212 { | |
213 } |