Mercurial > hg > early-roguelike
comparison xrogue/outside.c @ 133:e6179860cb76
Import XRogue 8.0 from the Roguelike Restoration Project (r1490)
| author | John "Elwin" Edwards |
|---|---|
| date | Tue, 21 Apr 2015 08:55:20 -0400 |
| parents | |
| children | f54901b9c39b |
comparison
equal
deleted
inserted
replaced
| 124:d10fc4a065ac | 133:e6179860cb76 |
|---|---|
| 1 /* | |
| 2 outside.c - functions for dealing with the "outside" level | |
| 3 | |
| 4 XRogue: Expeditions into the Dungeons of Doom | |
| 5 Copyright (C) 1991 Robert Pietkivitch | |
| 6 All rights reserved. | |
| 7 | |
| 8 Based on "Advanced Rogue" | |
| 9 Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T | |
| 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 void | |
| 43 do_terrain(basey, basex, deltay, deltax, fresh) | |
| 44 int basey, basex, deltay, deltax; | |
| 45 bool fresh; | |
| 46 { | |
| 47 register int cury, curx; /* Current y and x positions */ | |
| 48 | |
| 49 /* Lay out the boundary */ | |
| 50 for (cury=1; cury<lines-2; cury++) { /* Vertical "walls" */ | |
| 51 mvaddch(cury, 0, VERTWALL); | |
| 52 mvaddch(cury, cols-1, VERTWALL); | |
| 53 } | |
| 54 for (curx=0; curx<cols; curx++) { /* Horizontal "walls" */ | |
| 55 mvaddch(1, curx, HORZWALL); | |
| 56 mvaddch(lines-3, curx, HORZWALL); | |
| 57 } | |
| 58 | |
| 59 /* If we are not continuing, let's start out with a line of terrain */ | |
| 60 if (fresh) { | |
| 61 char ch; /* Next char to add */ | |
| 62 | |
| 63 /* Move to the starting point (should be (1, 0)) */ | |
| 64 move(basey, basex); | |
| 65 curx = basex; | |
| 66 | |
| 67 /* Start with some random terrain */ | |
| 68 if (basex == 0) { | |
| 69 ch = rnd_terrain(); | |
| 70 addch(ch); | |
| 71 } | |
| 72 else ch = mvinch(basey, basex); | |
| 73 | |
| 74 curx += deltax; | |
| 75 | |
| 76 /* Fill in the rest of the line */ | |
| 77 while (curx > 0 && curx < cols-1) { | |
| 78 /* Put in the next piece */ | |
| 79 ch = get_terrain(ch, '\0', '\0', '\0'); | |
| 80 mvaddch(basey, curx, ch); | |
| 81 curx += deltax; | |
| 82 } | |
| 83 | |
| 84 basey++; /* Advance to next line */ | |
| 85 } | |
| 86 | |
| 87 /* Fill in the rest of the lines */ | |
| 88 cury = basey; | |
| 89 while (cury > 1 && cury < lines - 3) { | |
| 90 curx = basex; | |
| 91 while (curx > 0 && curx < cols-1) { | |
| 92 register char left, top_left, top, top_right; | |
| 93 register int left_pos, top_pos; | |
| 94 | |
| 95 /* Get the surrounding terrain */ | |
| 96 left_pos = curx - deltax; | |
| 97 top_pos = cury - deltay; | |
| 98 | |
| 99 left = mvinch(cury, left_pos); | |
| 100 top_left = mvinch(top_pos, left_pos); | |
| 101 top = mvinch(top_pos, curx); | |
| 102 top_right = mvinch(top_pos, curx + deltax); | |
| 103 | |
| 104 /* Put the piece of terrain on the map */ | |
| 105 mvaddch(cury, curx, get_terrain(left, top_left, top, top_right)); | |
| 106 | |
| 107 /* Get the next x coordinate */ | |
| 108 curx += deltax; | |
| 109 } | |
| 110 | |
| 111 /* Get the next y coordinate */ | |
| 112 cury += deltay; | |
| 113 } | |
| 114 /* The deeper we go.. */ | |
| 115 if (level > 40) genmonsters(20, (bool) 0); | |
| 116 else if (level > 10) genmonsters(15, (bool) 0); | |
| 117 else genmonsters(10, (bool) 0); | |
| 118 | |
| 119 /* sometimes they're real angry */ | |
| 120 if (rnd(100) < 65) { | |
| 121 /* protect good guys */ | |
| 122 if (player.t_ctype == C_PALADIN || | |
| 123 player.t_ctype == C_RANGER || player.t_ctype == C_MONK) { | |
| 124 aggravate(TRUE, FALSE); | |
| 125 } | |
| 126 else { | |
| 127 aggravate(TRUE, TRUE); | |
| 128 } | |
| 129 } | |
| 130 } | |
| 131 | |
| 132 /* | |
| 133 * do_paths: | |
| 134 * draw at least a single path-way through the terrain | |
| 135 */ | |
| 136 | |
| 137 /* | |
| 138 * rnd_terrain: | |
| 139 * return a weighted, random type of outside terrain | |
| 140 */ | |
| 141 | |
| 142 char | |
| 143 rnd_terrain() | |
| 144 { | |
| 145 int chance = rnd(100); | |
| 146 | |
| 147 /* Meadow is most likely */ | |
| 148 if (chance < 40) return(FLOOR); | |
| 149 | |
| 150 /* Next comes forest */ | |
| 151 if (chance < 65) return(FOREST); | |
| 152 | |
| 153 /* Then comes lakes */ | |
| 154 if (chance < 85) return(POOL); | |
| 155 | |
| 156 /* Finally, mountains */ | |
| 157 return(WALL); | |
| 158 } | |
| 159 | |
| 160 | |
| 161 /* | |
| 162 * get_terrain: | |
| 163 * return a terrain weighted by what is surrounding | |
| 164 */ | |
| 165 | |
| 166 char | |
| 167 get_terrain(one, two, three, four) | |
| 168 char one, two, three, four; | |
| 169 { | |
| 170 register int i; | |
| 171 int forest = 0, mountain = 0, lake = 0, meadow = 0, total = 0; | |
| 172 char surrounding[4]; | |
| 173 | |
| 174 surrounding[0] = one; | |
| 175 surrounding[1] = two; | |
| 176 surrounding[2] = three; | |
| 177 surrounding[3] = four; | |
| 178 | |
| 179 for (i=0; i<4; i++) | |
| 180 switch (surrounding[i]) { | |
| 181 case FOREST: | |
| 182 forest++; | |
| 183 total++; | |
| 184 | |
| 185 when WALL: | |
| 186 mountain++; | |
| 187 total++; | |
| 188 | |
| 189 when POOL: | |
| 190 lake++; | |
| 191 total++; | |
| 192 | |
| 193 when FLOOR: | |
| 194 meadow++; | |
| 195 total++; | |
| 196 } | |
| 197 | |
| 198 /* Should we continue mountain? */ | |
| 199 if (rnd(total+1) < mountain) return(WALL); | |
| 200 | |
| 201 /* Should we continue lakes? */ | |
| 202 if (rnd(total+1) < lake) return(POOL); | |
| 203 | |
| 204 /* Should we continue meadow? */ | |
| 205 if (rnd(total+1) < meadow) return(FLOOR); | |
| 206 | |
| 207 /* Should we continue forest? */ | |
| 208 if (rnd(total+2) < forest) return(FOREST); | |
| 209 | |
| 210 /* Return something random */ | |
| 211 return(rnd_terrain()); | |
| 212 } | |
| 213 | |
| 214 /* | |
| 215 * lake_check: | |
| 216 * Determine if the player would drown | |
| 217 */ | |
| 218 | |
| 219 /*UNUSED*/ | |
| 220 /* void | |
| 221 * lake_check(place) | |
| 222 * register coord *place; | |
| 223 * { | |
| 224 * } | |
| 225 */ | |
| 226 |
