diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xrogue/outside.c	Tue Apr 21 08:55:20 2015 -0400
@@ -0,0 +1,226 @@
+/*
+    outside.c  -  functions for dealing with the "outside" level
+
+    XRogue: Expeditions into the Dungeons of Doom
+    Copyright (C) 1991 Robert Pietkivitch
+    All rights reserved.
+    
+    Based on "Advanced Rogue"
+    Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
+    All rights reserved.
+
+    See the file LICENSE.TXT for full copyright and licensing information.
+*/
+
+#include <curses.h>
+#include "rogue.h"
+
+extern char rnd_terrain(), get_terrain();
+
+/*
+ * init_terrain:
+ *      Get the single "outside room" set up correctly
+ */
+
+void
+init_terrain()
+{
+    register struct room *rp;
+
+    for (rp = rooms; rp < &rooms[MAXROOMS]; rp++) {
+            rp->r_flags = ISGONE;       /* kill all rooms */
+            rp->r_fires = NULL;         /* no fires */
+    }
+    rp = &rooms[0];                     /* point to only room */
+    rp->r_flags = ISDARK;               /* outside is always dark */
+    rp->r_pos.x = 0;                    /* room fills whole screen */
+    rp->r_pos.y = 1;
+    rp->r_max.x = cols;
+    rp->r_max.y = lines - 3;
+}
+
+void
+do_terrain(basey, basex, deltay, deltax, fresh)
+int basey, basex, deltay, deltax;
+bool fresh;
+{
+    register int cury, curx;        /* Current y and x positions */
+
+    /* Lay out the boundary */
+    for (cury=1; cury<lines-2; cury++) {        /* Vertical "walls" */
+        mvaddch(cury, 0, VERTWALL);
+        mvaddch(cury, cols-1, VERTWALL);
+    }
+    for (curx=0; curx<cols; curx++) {           /* Horizontal "walls" */
+        mvaddch(1, curx, HORZWALL);
+        mvaddch(lines-3, curx, HORZWALL);
+    }
+
+    /* If we are not continuing, let's start out with a line of terrain */
+    if (fresh) {
+        char ch;        /* Next char to add */
+
+        /* Move to the starting point (should be (1, 0)) */
+        move(basey, basex);
+        curx = basex;
+
+        /* Start with some random terrain */
+        if (basex == 0) {
+            ch = rnd_terrain();
+            addch(ch);
+        }
+        else ch = mvinch(basey, basex);
+
+        curx += deltax;
+
+        /* Fill in the rest of the line */
+        while (curx > 0 && curx < cols-1) {
+            /* Put in the next piece */
+            ch = get_terrain(ch, '\0', '\0', '\0');
+            mvaddch(basey, curx, ch);
+            curx += deltax;
+        }
+
+        basey++;        /* Advance to next line */
+    }
+
+    /* Fill in the rest of the lines */
+    cury = basey;
+    while (cury > 1 && cury < lines - 3) {
+        curx = basex;
+        while (curx > 0 && curx < cols-1) {
+            register char left, top_left, top, top_right;
+            register int left_pos, top_pos;
+
+            /* Get the surrounding terrain */
+            left_pos = curx - deltax;
+            top_pos = cury - deltay;
+
+            left = mvinch(cury, left_pos);
+            top_left = mvinch(top_pos, left_pos);
+            top = mvinch(top_pos, curx);
+            top_right = mvinch(top_pos, curx + deltax);
+
+            /* Put the piece of terrain on the map */
+            mvaddch(cury, curx, get_terrain(left, top_left, top, top_right));
+
+            /* Get the next x coordinate */
+            curx += deltax;
+        }
+
+        /* Get the next y coordinate */
+        cury += deltay;
+    }
+        /* The deeper we go.. */
+        if (level > 40)         genmonsters(20, (bool) 0);
+        else if (level > 10)    genmonsters(15, (bool) 0);
+        else                    genmonsters(10, (bool) 0);
+
+        /* sometimes they're real angry */
+        if (rnd(100) < 65) {
+            /* protect good guys */
+            if (player.t_ctype == C_PALADIN ||
+                player.t_ctype == C_RANGER  || player.t_ctype == C_MONK) {
+                    aggravate(TRUE, FALSE);
+            }
+            else {
+                aggravate(TRUE, TRUE);
+            }
+        }
+}
+
+/*
+ * do_paths:
+ *      draw at least a single path-way through the terrain
+ */
+
+/*
+ * rnd_terrain:
+ *      return a weighted, random type of outside terrain
+ */
+
+char
+rnd_terrain()
+{
+    int chance = rnd(100);
+
+    /* Meadow is most likely */
+    if (chance < 40) return(FLOOR);
+
+    /* Next comes forest */
+    if (chance < 65) return(FOREST);
+
+    /* Then comes lakes */
+    if (chance < 85) return(POOL);
+
+    /* Finally, mountains */
+    return(WALL);
+}
+
+
+/*
+ * get_terrain:
+ *      return a terrain weighted by what is surrounding
+ */
+
+char
+get_terrain(one, two, three, four)
+char one, two, three, four;
+{
+    register int i;
+    int forest = 0, mountain = 0, lake = 0, meadow = 0, total = 0;
+    char surrounding[4];
+
+    surrounding[0] = one;
+    surrounding[1] = two;
+    surrounding[2] = three;
+    surrounding[3] = four;
+
+    for (i=0; i<4; i++) 
+        switch (surrounding[i]) {
+            case FOREST:
+                forest++;
+                total++;
+            
+            when WALL:
+                mountain++;
+                total++;
+
+            when POOL:
+                lake++;
+                total++;
+
+            when FLOOR:
+                meadow++;
+                total++;
+        }
+
+    /* Should we continue mountain? */
+    if (rnd(total+1) < mountain) return(WALL);
+
+    /* Should we continue lakes? */
+    if (rnd(total+1) < lake) return(POOL);
+
+    /* Should we continue meadow? */
+    if (rnd(total+1) < meadow) return(FLOOR);
+
+    /* Should we continue forest? */
+    if (rnd(total+2) < forest) return(FOREST);
+
+    /* Return something random */
+    return(rnd_terrain());
+}
+
+/*
+ * lake_check:
+ *      Determine if the player would drown
+ */
+
+/*UNUSED*/
+/* void
+ * lake_check(place)
+ * register coord *place;
+ * {
+ * }
+ */
+