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