[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     ! 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