[BACK]Return to maze.c CVS log [TXT][DIR] Up to [contributed] / early-roguelike / urogue

Annotation of early-roguelike/urogue/maze.c, Revision 1.1.1.1

1.1       rubenllo    1: /*
                      2:     maze.c  -  functions for dealing with armor
                      3:
                      4:     UltraRogue: The Ultimate Adventure in the Dungeons of Doom
                      5:     Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
                      6:     All rights reserved.
                      7:
                      8:     Based on "Advanced Rogue"
                      9:     Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
                     10:     All rights reserved.
                     11:
                     12:     See the file LICENSE.TXT for full copyright and licensing information.
                     13: */
                     14:
                     15: #include <stdlib.h>
                     16: #include "rogue.h"
                     17:
                     18: static char *frontier;
                     19: static char *bits;
                     20: static int urlines;
                     21: static int urcols;
                     22:
                     23: /*
                     24:     domaze()
                     25:         Draw the maze on this level.
                     26: */
                     27:
                     28: void
                     29: do_maze(void)
                     30: {
                     31:     int     i, least;
                     32:     struct room *rp;
                     33:     struct linked_list  *item;
                     34:     struct object   *obj;
                     35:     struct thing    *mp;
                     36:     int    treas;
                     37:     coord  tp;
                     38:
                     39:     for (rp = rooms; rp < &rooms[MAXROOMS]; rp++)
                     40:     {
                     41:         rp->r_nexits = 0;       /* no exits         */
                     42:         rp->r_flags = ISGONE;   /* kill all rooms   */
                     43:         rp->r_fires = 0;        /* no fires         */
                     44:     }
                     45:
                     46:     rp = &rooms[0];         /* point to only room */
                     47:     rp->r_flags = ISDARK;   /* mazes always dark */
                     48:     rp->r_pos.x = 0;        /* room fills whole screen */
                     49:     rp->r_pos.y = 1;
                     50:     rp->r_max.x = COLS - 1;
                     51:     rp->r_max.y = LINES - 3;
                     52:     draw_maze();            /* put maze into window */
                     53:
                     54:     /* add some gold to make it worth looking for */
                     55:
                     56:     item = spec_item(GOLD, 0, 0, 0);
                     57:     obj  = OBJPTR(item);
                     58:     obj->o_count *= (rnd(10) + 5);  /* add in one large hunk */
                     59:
                     60:        do
                     61:        {
                     62:            rnd_pos(rp, &tp);
                     63:        }
                     64:        while( mvwinch(stdscr, tp.y, tp.x) != FLOOR);
                     65:
                     66:     obj->o_pos = tp;
                     67:     add_obj(item, tp.y, tp.x);
                     68:
                     69:     /* add in some food to make sure he has enough */
                     70:
                     71:     item = spec_item(FOOD, 0, 0, 0);
                     72:     obj  = OBJPTR(item);
                     73:
                     74:        do
                     75:        {
                     76:            rnd_pos(rp, &tp);
                     77:        }
                     78:        while( mvwinch(stdscr, tp.y, tp.x) != FLOOR);
                     79:
                     80:     obj->o_pos = tp;
                     81:     add_obj(item, tp.y, tp.x);
                     82:
                     83:     if (rnd(100) < 5)  /* 5% for treasure maze level */
                     84:     {
                     85:         treas = TRUE;
                     86:         least = 20;
                     87:         debug("Treasure maze.");
                     88:     }
                     89:     else           /* normal maze level */
                     90:     {
                     91:         least = 1;
                     92:         treas = FALSE;
                     93:     }
                     94:
                     95:     for (i = 0; i < level + least; i++)
                     96:     {
                     97:         if (!treas && rnd(100) < 50)    /* put in some little buggers */
                     98:             continue;
                     99:
                    100:         /* Put the monster in */
                    101:
                    102:         item = new_item(sizeof *mp);
                    103:
                    104:         mp = THINGPTR(item);
                    105:
                    106:         do
                    107:         {
                    108:             rnd_pos(rp, &tp);
                    109:         }
                    110:         while(mvwinch(stdscr, tp.y, tp.x) != FLOOR);
                    111:
                    112:         new_monster(item, randmonster(NOWANDER, NOGRAB), &tp, NOMAXSTATS);
                    113:
                    114:         /* See if we want to give it a treasure to carry around. */
                    115:
                    116:         if (rnd(100) < monsters[mp->t_index].m_carry)
                    117:             attach(mp->t_pack, new_thing());
                    118:
                    119:         /* If it carries gold, give it some */
                    120:
                    121:         if (on(*mp, CARRYGOLD))
                    122:         {
                    123:             item = spec_item(GOLD, 0, 0, 0);
                    124:             obj = OBJPTR(item);
                    125:             obj->o_count = GOLDCALC + GOLDCALC + GOLDCALC;
                    126:             obj->o_pos = mp->t_pos;
                    127:             attach(mp->t_pack, item);
                    128:         }
                    129:
                    130:     }
                    131: }
                    132:
                    133: /*
                    134:     draw_maze()
                    135:         Generate and draw the maze on the screen
                    136: */
                    137:
                    138: void
                    139: draw_maze(void)
                    140: {
                    141:     int i, j, more;
                    142:     char    *ptr;
                    143:
                    144:     urlines = (LINES - 3) / 2;
                    145:     urcols = (COLS - 1) / 2;
                    146:
                    147:     bits     = ur_alloc((unsigned int) ((LINES - 3) * (COLS - 1)));
                    148:     frontier = ur_alloc((unsigned int) (urlines * urcols));
                    149:     ptr      = frontier;
                    150:
                    151:     while (ptr < (frontier + (urlines * urcols)))
                    152:         *ptr++ = TRUE;
                    153:
                    154:     for (i = 0; i < LINES - 3; i++)
                    155:     {
                    156:         for (j = 0; j < COLS - 1; j++)
                    157:         {
                    158:             if (i % 2 == 1 && j % 2 == 1)
                    159:                 *moffset(i, j) = FALSE; /* floor */
                    160:             else
                    161:                 *moffset(i, j) = TRUE;  /* wall */
                    162:         }
                    163:     }
                    164:
                    165:     for (i = 0; i < urlines; i++)
                    166:     {
                    167:         for (j = 0; j < urcols; j++)
                    168:         {
                    169:             do
                    170:                 more = findcells(i, j);
                    171:             while (more != 0);
                    172:         }
                    173:     }
                    174:
                    175:     crankout();
                    176:     ur_free(frontier);
                    177:     ur_free(bits);
                    178: }
                    179:
                    180: /*
                    181:     moffset()
                    182:         Calculate memory address for bits
                    183: */
                    184:
                    185: char *
                    186: moffset(int y, int x)
                    187: {
                    188:     return (bits + (y * (COLS - 1)) + x);
                    189: }
                    190:
                    191: /*
                    192:     foffset()
                    193:         Calculate memory address for frontier
                    194: */
                    195:
                    196: char    *
                    197: foffset(int y, int x)
                    198: {
                    199:     return (frontier + (y * urcols) + x);
                    200: }
                    201:
                    202: /*
                    203:     findcells()
                    204:         Figure out cells to open up
                    205: */
                    206:
                    207: int
                    208: findcells(int y, int x)
                    209: {
                    210:     int rtpos, i;
                    211:
                    212:     struct
                    213:     {
                    214:        int    num_pos;        /* number of frontier cells next to you */
                    215:
                    216:        struct
                    217:        {
                    218:            int y_pos;
                    219:            int x_pos;
                    220:        } conn[4];              /* the y,x position of above cell       */
                    221:     } mborder;
                    222:
                    223:     *foffset(y, x) = FALSE;
                    224:     mborder.num_pos = 0;
                    225:
                    226:     if (y < urlines - 1) {    /* look below */
                    227:         if (*foffset(y + 1, x))
                    228:         {
                    229:             mborder.conn[mborder.num_pos].y_pos = y + 1;
                    230:             mborder.conn[mborder.num_pos].x_pos = x;
                    231:             mborder.num_pos += 1;
                    232:         }
                    233:     }
                    234:
                    235:     if (y > 0)         /* look above */
                    236:     {
                    237:         if (*foffset(y - 1, x))
                    238:         {
                    239:             mborder.conn[mborder.num_pos].y_pos = y - 1;
                    240:             mborder.conn[mborder.num_pos].x_pos = x;
                    241:             mborder.num_pos += 1;
                    242:         }
                    243:     }
                    244:
                    245:     if (x < urcols - 1)  /* look right */
                    246:     {
                    247:         if (*foffset(y, x + 1))
                    248:         {
                    249:             mborder.conn[mborder.num_pos].y_pos = y;
                    250:             mborder.conn[mborder.num_pos].x_pos = x + 1;
                    251:             mborder.num_pos += 1;
                    252:         }
                    253:     }
                    254:
                    255:     if (x > 0)        /* look left */
                    256:     {
                    257:         if (*foffset(y, x - 1))
                    258:         {
                    259:             mborder.conn[mborder.num_pos].y_pos = y;
                    260:             mborder.conn[mborder.num_pos].x_pos = x - 1;
                    261:             mborder.num_pos += 1;
                    262:         }
                    263:     }
                    264:
                    265:     if (mborder.num_pos == 0)/* no neighbors available */
                    266:         return(0);
                    267:     else
                    268:     {
                    269:         i = rnd(mborder.num_pos);
                    270:         rtpos = mborder.num_pos - 1;
                    271:         rmwall(mborder.conn[i].y_pos, mborder.conn[i].x_pos, y, x);
                    272:         return(rtpos);
                    273:     }
                    274: }
                    275:
                    276: /*
                    277:     rmwall()
                    278:         Removes appropriate walls from the maze
                    279: */
                    280:
                    281: void
                    282: rmwall(int newy, int newx, int oldy, int oldx)
                    283: {
                    284:     int xdif, ydif;
                    285:
                    286:     xdif = newx - oldx;
                    287:     ydif = newy - oldy;
                    288:
                    289:     *moffset((oldy * 2) + ydif + 1, (oldx * 2) + xdif + 1) = FALSE;
                    290:
                    291:     findcells(newy, newx);
                    292: }
                    293:
                    294:
                    295: /*
                    296:     crankout()
                    297:         Does actual drawing of maze to window
                    298: */
                    299:
                    300: void
                    301: crankout(void)
                    302: {
                    303:     int x, y;
                    304:
                    305:     for (y = 0; y < LINES - 3; y++)
                    306:     {
                    307:         move(y + 1, 0);
                    308:
                    309:         for (x = 0; x < COLS - 1; x++)
                    310:         {
                    311:             if (*moffset(y, x))    /* here is a wall */
                    312:             {
                    313:                 if (y == 0 || y == LINES - 4)       /* top or bottom line */
                    314:                     addch('-');
                    315:                 else if (x == 0 || x == COLS - 2)   /* left | right side */
                    316:                     addch('|');
                    317:                 else if (y % 2 == 0 && x % 2 == 0)
                    318:                 {
                    319:                     if (*moffset(y, x - 1) || *moffset(y, x + 1))
                    320:                         addch('-');
                    321:                     else
                    322:                         addch('|');
                    323:                 }
                    324:                 else if (y % 2 == 0)
                    325:                     addch('-');
                    326:                 else
                    327:                     addch('|');
                    328:             }
                    329:             else
                    330:                 addch(FLOOR);
                    331:         }
                    332:     }
                    333: }

CVSweb