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

Annotation of early-roguelike/xrogue/n_level.c, Revision 1.1

1.1     ! rubenllo    1: /*
        !             2:     n_level.c - Dig and draw a new 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:     Based on "Rogue: Exploring the Dungeons of Doom"
        !            13:     Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
        !            14:     All rights reserved.
        !            15:
        !            16:     See the file LICENSE.TXT for full copyright and licensing information.
        !            17: */
        !            18:
        !            19: #include <curses.h>
        !            20: #include "rogue.h"
        !            21: #define TERRASAVE 3
        !            22:
        !            23: void put_things(LEVTYPE ltype);
        !            24:
        !            25: /*
        !            26:  * new_level:
        !            27:  *      Dig and draw a new level
        !            28:  *     ltype: designates type of level to create
        !            29:  */
        !            30:
        !            31: void
        !            32: new_level(LEVTYPE ltype)
        !            33: {
        !            34:     register int rm = 0, i, cnt;
        !            35:     register unsigned char ch;
        !            36:     register struct linked_list *item;
        !            37:     register struct thing *tp;
        !            38:     register struct object *obj;
        !            39:     int waslit = 0;     /* Was the previous outside level lit? */
        !            40:     int starty = 0, startx = 0, deltay = 0, deltax = 0;
        !            41:     bool fresh=TRUE, vert = 0, top;
        !            42:     struct room *rp;
        !            43:     struct linked_list *nitem, *savmonst=NULL, *savitems=NULL;
        !            44:        coord stairs = {0,0};
        !            45:
        !            46:     if (wizard) {
        !            47:         msg("Turns: %ld", turns);       /* Number of turns for last level */
        !            48:         mpos = 0;
        !            49:     }
        !            50:
        !            51:     /* Start player off right */
        !            52:     turn_off(player, ISHELD);
        !            53:     turn_off(player, ISFLEE);
        !            54:     extinguish(suffocate);
        !            55:     hold_count = 0;
        !            56:     trap_tries = 0;
        !            57:
        !            58:     /* Are we just entering a dungeon?  If so, how big is it? */
        !            59:     if (ltype != OUTSIDE && nfloors < 0) nfloors = HARDER+20 + rnd(51);
        !            60:
        !            61:     if (level > max_level)
        !            62:         max_level = level;
        !            63:
        !            64:     /* Are we starting a new outside level? */
        !            65:     if (ltype == OUTSIDE) {
        !            66:         register int i, j;
        !            67:
        !            68:         /* Save some information prior to clearing the screen */
        !            69:         if (level == -1 || mvinch(hero.y, hero.x) == HORZWALL) vert = TRUE;
        !            70:         else vert = FALSE;
        !            71:
        !            72:         if (level < 1) {
        !            73:                 fresh = TRUE;
        !            74:                 starty = 2;
        !            75:                 startx = 1;
        !            76:                 deltay = deltax = 1;
        !            77:                 level = max_level;      /* Restore level to deepest attempt */
        !            78:                 prev_max = level;   /* reset for boundary crossings below */
        !            79:         }
        !            80:         else if (level >= 1 && prev_max == 1000) {
        !            81:                 fresh = TRUE;
        !            82:                 starty = 2;
        !            83:                 startx = 1;
        !            84:                 deltay = deltax = 1;
        !            85:                 prev_max = level;   /* reset for boundary crossings below */
        !            86:         }
        !            87:         else {  /* Copy several lines of the terrain to the other end */
        !            88:
        !            89:             unsigned char cch;   /* Copy character */
        !            90:
        !            91:             if (wizard) msg("Crossing sector boundary ");
        !            92:
        !            93:             /* Was the area dark (not magically lit)? */
        !            94:             if (!(rooms[0].r_flags & ISDARK)) waslit = 1;
        !            95:
        !            96:             fresh = FALSE;
        !            97:             if ((vert && hero.y == 1) || (!vert && hero.x == 0)) top = TRUE;
        !            98:             else top = FALSE;
        !            99:             for (i=0; i<TERRASAVE; i++) {
        !           100:                 if (vert)
        !           101:                     for (j=1; j<cols-1; j++) {
        !           102:                         if (top) {
        !           103:                             cch = mvinch(i+2, j);
        !           104:                             mvaddch(lines-6+i, j, cch);
        !           105:                         }
        !           106:                         else {
        !           107:                             cch = mvinch(lines-4-i, j);
        !           108:                             mvaddch(4-i, j, cch);
        !           109:                         }
        !           110:                     }
        !           111:                 else
        !           112:                     for (j=2; j<lines-3; j++) {
        !           113:                         if (top) {
        !           114:                             cch = mvinch(j, i+1);
        !           115:                             mvaddch(j, cols-4+i, cch);
        !           116:                         }
        !           117:                         else {
        !           118:                             cch = mvinch(j, cols-2-i);
        !           119:                             mvaddch(j, 3-i, cch);
        !           120:                         }
        !           121:                     }
        !           122:             }
        !           123:
        !           124:             if (vert) {
        !           125:                 startx = deltax = 1;
        !           126:                 if (top) {
        !           127:                     starty = lines-4-TERRASAVE;
        !           128:                     deltay = -1;
        !           129:                 }
        !           130:                 else {
        !           131:                     starty = TERRASAVE + 2;
        !           132:                     deltay = 1;
        !           133:                 }
        !           134:             }
        !           135:             else {
        !           136:                 starty = 2;
        !           137:                 deltay = 1;
        !           138:                 if (top) {
        !           139:                     startx = cols-2-TERRASAVE;
        !           140:                     deltax = -1;
        !           141:                 }
        !           142:                 else {
        !           143:                     deltax = 1;
        !           144:                     startx = TERRASAVE + 1;
        !           145:                 }
        !           146:             }
        !           147:
        !           148:             /* Check if any monsters should be saved */
        !           149:             for (item = mlist; item != NULL; item = nitem) {
        !           150:                 nitem = next(item);
        !           151:                 tp = THINGPTR(item);
        !           152:                 if (vert) {
        !           153:                     if (top) {
        !           154:                         if (tp->t_pos.y < TERRASAVE + 2)
        !           155:                             tp->t_pos.y += lines - 5 - TERRASAVE;
        !           156:                         else continue;
        !           157:                     }
        !           158:                     else {
        !           159:                         if (tp->t_pos.y > lines - 4 - TERRASAVE)
        !           160:                             tp->t_pos.y += 5 + TERRASAVE - lines;
        !           161:                         else continue;
        !           162:                     }
        !           163:                 }
        !           164:                 else {
        !           165:                     if (top) {
        !           166:                         if (tp->t_pos.x < TERRASAVE + 1)
        !           167:                             tp->t_pos.x += cols - 2 - TERRASAVE;
        !           168:                         else continue;
        !           169:                     }
        !           170:                     else {
        !           171:                         if (tp->t_pos.x > cols - 2 - TERRASAVE)
        !           172:                             tp->t_pos.x += 2 + TERRASAVE - cols;
        !           173:                         else continue;
        !           174:                     }
        !           175:                 }
        !           176:
        !           177:                 /*
        !           178:                  * If the monster is busy chasing another monster, don't save
        !           179:                  * it
        !           180:                  */
        !           181:                 if (tp->t_dest && tp->t_dest != &hero) continue;
        !           182:
        !           183:                 /* Outside has plenty of monsters, don't need these.
        !           184:                  * detach(mlist, item);
        !           185:                  * attach(savmonst, item);
        !           186:                  */
        !           187:             }
        !           188:
        !           189:             /* Check if any treasure should be saved */
        !           190:             for (item = lvl_obj; item != NULL; item = nitem) {
        !           191:                 nitem = next(item);
        !           192:                 obj = OBJPTR(item);
        !           193:                 if (vert) {
        !           194:                     if (top) {
        !           195:                         if (obj->o_pos.y < TERRASAVE + 2)
        !           196:                             obj->o_pos.y += lines - 5 - TERRASAVE;
        !           197:                         else continue;
        !           198:                     }
        !           199:                     else {
        !           200:                         if (obj->o_pos.y > lines - 4 - TERRASAVE)
        !           201:                             obj->o_pos.y += 5 + TERRASAVE - lines;
        !           202:                         else continue;
        !           203:                     }
        !           204:                 }
        !           205:                 else {
        !           206:                     if (top) {
        !           207:                         if (obj->o_pos.x < TERRASAVE + 1)
        !           208:                             obj->o_pos.x += cols - 2 - TERRASAVE;
        !           209:                         else continue;
        !           210:                     }
        !           211:                     else {
        !           212:                         if (obj->o_pos.x > cols - 2 - TERRASAVE)
        !           213:                             obj->o_pos.x += 2 + TERRASAVE - cols;
        !           214:                         else continue;
        !           215:                     }
        !           216:                 }
        !           217:                 detach(lvl_obj, item);
        !           218:                 attach(savitems, item);
        !           219:             }
        !           220:         }
        !           221:     }
        !           222:
        !           223:     wclear(cw);
        !           224:     wclear(mw);
        !           225:     if (fresh || levtype != OUTSIDE) clear();
        !           226:     /*
        !           227:      * check to see if he missed a UNIQUE, If he did then put it back
        !           228:      * in the monster table for next time
        !           229:      */
        !           230:      for (item = mlist; item != NULL; item = next(item)) {
        !           231:         tp = THINGPTR(item);
        !           232:         if (on(*tp, ISUNIQUE))
        !           233:             monsters[tp->t_index].m_normal = TRUE;
        !           234:      }
        !           235:     /*
        !           236:      * Free up the monsters on the last level
        !           237:      */
        !           238:     t_free_list(mlist);
        !           239:     o_free_list(lvl_obj);               /* Free up previous objects (if any) */
        !           240:     for (rp = rooms; rp < &rooms[MAXROOMS]; rp++)
        !           241:         r_free_list(rp->r_exit);        /* Free up the exit lists */
        !           242:
        !           243:     levtype = ltype;
        !           244:     foods_this_level = 0;               /* food for hero this level */
        !           245:
        !           246:     /* What kind of level are we on? */
        !           247:     if (ltype == POSTLEV || ltype == STARTLEV) {
        !           248:         if (ltype == POSTLEV)
        !           249:         do_post(FALSE);  /* Trading post */
        !           250:         else
        !           251:         do_post(TRUE);  /* Equipage */
        !           252:
        !           253:         levtype = ltype = POSTLEV;
        !           254:     }
        !           255:     else if (ltype == MAZELEV) {
        !           256:         do_maze();
        !           257:         no_food++;
        !           258:         put_things(ltype);              /* Place objects (if any) */
        !           259:     }
        !           260:     else if (ltype == OUTSIDE) {
        !           261:         /* Move the cursor back onto the hero */
        !           262:         wmove(cw, hero.y, hero.x);
        !           263:         init_terrain();
        !           264:         do_terrain(starty, startx, deltay, deltax, (bool) (fresh || !vert));
        !           265:         no_food++;
        !           266:         put_things(ltype);
        !           267:
        !           268:         /* Should we magically light this area? */
        !           269:         if (waslit) rooms[0].r_flags &= ~ISDARK;
        !           270:     }
        !           271:     else {
        !           272:         do_rooms();                     /* Draw rooms */
        !           273:         do_passages();                  /* Draw passages */
        !           274:         no_food++;
        !           275:         put_things(ltype);              /* Place objects (if any) */
        !           276:     }
        !           277:     /*
        !           278:      * Place the staircase down.  Only a small chance for an outside stairway.
        !           279:      */
        !           280:     if (ltype != OUTSIDE || roll(1, 5) == 5) {
        !           281:         cnt = 0;
        !           282:         do {
        !           283:             rm = rnd_room();
        !           284:             rnd_pos(&rooms[rm], &stairs);
        !           285:         } until (mvinch(stairs.y, stairs.x) == FLOOR || cnt++ > 2500);
        !           286:         addch(STAIRS);
        !           287:     }
        !           288:     /*
        !           289:      * maybe add a trading post
        !           290:      */
        !           291:     if (level > 5 && rnd(10) == 7 && ltype == NORMLEV) {
        !           292:         cnt = 0;
        !           293:         do {
        !           294:             rm = rnd_room();
        !           295:             if (rooms[rm].r_flags & ISTREAS)
        !           296:                 continue;
        !           297:             rnd_pos(&rooms[rm], &stairs);
        !           298:         } until (winat(stairs.y, stairs.x) == FLOOR || cnt++ > 2500);
        !           299:         addch(POST);
        !           300:     }
        !           301:     if (ltype != POSTLEV) {     /* Add monsters that fell through */
        !           302:         nitem = tlist;
        !           303:         while (nitem != NULL) {
        !           304:             item = nitem;
        !           305:             nitem = next(item); /* because detach and attach mess up ptrs */
        !           306:             tp = THINGPTR(item);
        !           307:             cnt = 0;
        !           308:             do {
        !           309:                 rm = rnd_room();
        !           310:                 rnd_pos(&rooms[rm], &tp->t_pos);
        !           311:             } until (cnt++ > 2500 || winat(tp->t_pos.y, tp->t_pos.x) == FLOOR);
        !           312:             mvwaddch(mw, tp->t_pos.y, tp->t_pos.x, tp->t_type);
        !           313:             tp->t_oldch = mvwinch(cw, tp->t_pos.y, tp->t_pos.x);
        !           314:
        !           315:             /*
        !           316:              * If it has a fire, mark it
        !           317:              */
        !           318:             if (on(*tp, HASFIRE)) {
        !           319:                 register struct linked_list *fire_item;
        !           320:
        !           321:                 fire_item = creat_item();
        !           322:                 ldata(fire_item) = (char *) tp;
        !           323:                 attach(rooms[rm].r_fires, fire_item);
        !           324:                 rooms[rm].r_flags |= HASFIRE;
        !           325:             }
        !           326:
        !           327:             detach(tlist, item);
        !           328:             turn_off(*tp,ISELSEWHERE);
        !           329:             attach(mlist, item);
        !           330:         }
        !           331:     }
        !           332:
        !           333:     /* Restore any saved monsters */
        !           334:     for (item = savmonst; item != NULL; item = nitem) {
        !           335:         nitem = next(item);
        !           336:         tp = THINGPTR(item);
        !           337:         mvwaddch(mw, tp->t_pos.y, tp->t_pos.x, tp->t_type);
        !           338:         tp->t_oldch = mvwinch(cw, tp->t_pos.y, tp->t_pos.x);
        !           339:
        !           340:         /*
        !           341:          * If it has a fire, mark it
        !           342:          */
        !           343:         if (on(*tp, HASFIRE)) {
        !           344:             register struct linked_list *fire_item;
        !           345:
        !           346:             fire_item = creat_item();
        !           347:             ldata(fire_item) = (char *) tp;
        !           348:             attach(rooms[rm].r_fires, fire_item);
        !           349:             rooms[rm].r_flags |= HASFIRE;
        !           350:         }
        !           351:
        !           352:         detach(savmonst, item);
        !           353:         attach(mlist, item);
        !           354:     }
        !           355:
        !           356:     /* Restore any saved objects */
        !           357:         for(item = savitems; item != NULL; item = nitem) {
        !           358:             nitem = next(item);
        !           359:             obj = OBJPTR(item);
        !           360:             mvaddch(obj->o_pos.y, obj->o_pos.x, obj->o_type);
        !           361:             detach(savitems, item);
        !           362:             attach(lvl_obj, item);
        !           363:         }
        !           364:
        !           365:     /*
        !           366:      * Place the traps (except for trading post)
        !           367:      */
        !           368:     ntraps = 0; /* No traps yet */
        !           369:     if (levtype == NORMLEV) {
        !           370:         if (rnd(10) < vlevel) {
        !           371:             ntraps = rnd(vlevel/4)+2;
        !           372:             if (ntraps > MAXTRAPS)
        !           373:                 ntraps = MAXTRAPS;
        !           374:             i = ntraps;
        !           375:             while (i--)
        !           376:             {
        !           377:                 cnt = 0;
        !           378:                 do {
        !           379:                     rm = rnd_room();
        !           380:                     if (rooms[rm].r_flags & ISTREAS)
        !           381:                         continue;
        !           382:                     rnd_pos(&rooms[rm], &stairs);
        !           383:                 } until (winat(stairs.y, stairs.x) == FLOOR || cnt++ > 2500);
        !           384:
        !           385:                 traps[i].tr_flags = 0;
        !           386:
        !           387:                 /* If we are at the bottom, we can't set a trap door */
        !           388:                 if (level >= nfloors) ch = (unsigned char) rnd(8) + 1;
        !           389:                 else ch = (unsigned char) rnd(9);
        !           390:
        !           391:                 switch((int) ch) {
        !           392:                     case 0: ch = TRAPDOOR;
        !           393:                     when 1: ch = BEARTRAP;
        !           394:                     when 2: ch = SLEEPTRAP;
        !           395:                     when 3: ch = ARROWTRAP;
        !           396:                     when 4: ch = TELTRAP;
        !           397:                     when 5: ch = DARTTRAP;
        !           398:                     when 6: ch = POOL;
        !           399:                             traps[i].tr_flags = ISFOUND;
        !           400:                     when 7: ch = MAZETRAP;
        !           401:                     when 8: ch = WORMHOLE;
        !           402:                 }
        !           403:                 addch(ch);
        !           404:                 traps[i].tr_type = ch;
        !           405:                 traps[i].tr_show = FLOOR;
        !           406:                 traps[i].tr_pos = stairs;
        !           407:             }
        !           408:         }
        !           409:     }
        !           410:     if (fresh) {        /* A whole new picture */
        !           411:         /*
        !           412:          * try to find a room for the hero. The objective here is to:
        !           413:          * --> don't put him in a treasure room
        !           414:          * --> don't put him on an object
        !           415:          * --> try not to put him next to the stairs
        !           416:          */
        !           417:         cnt = 2500;
        !           418:         do {
        !           419:             if (ltype != OUTSIDE) rm = rnd_room();
        !           420:             else continue;
        !           421:
        !           422:             if (rooms[rm].r_flags & ISTREAS)
        !           423:                 continue;
        !           424:
        !           425:             rnd_pos(&rooms[rm], &hero);
        !           426:         } until(    cnt-- == 0  ||
        !           427:                     (winat(hero.y, hero.x) == FLOOR &&
        !           428:                      DISTANCE(hero.y, hero.x, stairs.y, stairs.x) > cnt/10));
        !           429:     }
        !           430:     else {              /* We're extending into an adjacent outside plane */
        !           431:         rm = 0;
        !           432:         if (vert) {
        !           433:             if (hero.y == 1) hero.y = lines - 3 - TERRASAVE; /* Top to bottom */
        !           434:             else hero.y = TERRASAVE + 1;        /* Bottom to top */
        !           435:         }
        !           436:         else {
        !           437:             if (hero.x == 0) hero.x = cols - 1 - TERRASAVE; /* Right to left */
        !           438:             else hero.x = TERRASAVE;    /* Left to right */
        !           439:         }
        !           440:     }
        !           441:     oldrp = &rooms[rm];         /* Set the current room */
        !           442:     player.t_oldpos = player.t_pos;     /* Set the current position */
        !           443:
        !           444:     if (ISWEARING(R_AGGR) ||
        !           445:         (cur_misc[WEAR_JEWEL] != NULL &&
        !           446:          cur_misc[WEAR_JEWEL]->o_which == MM_JEWEL))
        !           447:         aggravate(TRUE, TRUE);  /* affect all charactors */
        !           448:
        !           449:     /*
        !           450:      * If player is moving up or above his deepest point, wake up any
        !           451:      * non-uniques
        !           452:      */
        !           453:     else if (level < cur_max) {
        !           454:             aggravate(FALSE, FALSE);
        !           455:     }
        !           456:
        !           457:     light(&hero);
        !           458:     wmove(cw, hero.y, hero.x);
        !           459:     waddch(cw, PLAYER);
        !           460:
        !           461:     if (level > cur_max)
        !           462:         cur_max = level;
        !           463:
        !           464:     draw(cw);
        !           465:
        !           466:     status(TRUE);
        !           467:
        !           468:     /* Do we sense any food on this level? */
        !           469:     if (cur_relic[SURTUR_RING])
        !           470:         quaff(P_FFIND, 0, 0, FALSE);
        !           471: }
        !           472:
        !           473: /*
        !           474:  * Pick a room that is really there
        !           475:  */
        !           476:
        !           477: int
        !           478: rnd_room(void)
        !           479: {
        !           480:     register int rm;
        !           481:
        !           482:     if (levtype != NORMLEV)
        !           483:         rm = 0;
        !           484:     else do
        !           485:         {
        !           486:             rm = rnd(MAXROOMS);
        !           487:         } while (rooms[rm].r_flags & ISGONE);
        !           488:     return rm;
        !           489: }
        !           490:
        !           491: /*
        !           492:  * put_things:
        !           493:  *      put potions and scrolls on this level
        !           494:  *     ltype: designates type of level to create
        !           495:  */
        !           496:
        !           497: void
        !           498: put_things(LEVTYPE ltype)
        !           499: {
        !           500:     register int i, rm, cnt;
        !           501:     register struct object *cur;
        !           502:     register struct linked_list *item, *nextitem, *exitptr;
        !           503:     int length, width;
        !           504:     int ITEMS = 0;      /* number of items to place */
        !           505:     coord tp, *exit;
        !           506:
        !           507:     /*
        !           508:      * The only way to get new stuff is to go down into the dungeon.
        !           509:      */
        !           510:     if (level < cur_max) {
        !           511:         if (ltype == NORMLEV)
        !           512:         return;
        !           513:     }
        !           514:
        !           515:     if (ltype == OUTSIDE) goto jmp_here;  /* a jump for outside */
        !           516:
        !           517:     /*
        !           518:      * There is a chance that there is a Treasure Room on this level
        !           519:      */
        !           520:     if (ltype == NORMLEV && rnd(150) < level) {
        !           521:         register int j;
        !           522:         register struct room *rp;
        !           523:
        !           524:         /* Count the number of free spaces */
        !           525:         i = 0;  /* 0 tries */
        !           526:         do {
        !           527:             rp = &rooms[rnd_room()];
        !           528:             width = rp->r_max.y - 2;
        !           529:             length = rp->r_max.x - 2;
        !           530:         } until ((width*length >= MAXTREAS) || (i++ > MAXROOMS*4));
        !           531:
        !           532:         /* Mark the room as a treasure room */
        !           533:         rp->r_flags |= ISTREAS;
        !           534:
        !           535:         /* Make all the doors secret doors */
        !           536:         for (exitptr = rp->r_exit; exitptr; exitptr = next(exitptr)) {
        !           537:             exit = DOORPTR(exitptr);
        !           538:             move(exit->y, exit->x);
        !           539:             addch(SECRETDOOR);
        !           540:         }
        !           541:
        !           542:         /*
        !           543:          * check to see if there are any monsters in room already
        !           544:          */
        !           545:         for (item = mlist; item != NULL; item = nextitem) {
        !           546:             register struct thing *tp;
        !           547:
        !           548:             tp = THINGPTR(item);
        !           549:             nextitem = next(item);
        !           550:             if (rp == roomin(&tp->t_pos)) {
        !           551:                 /*
        !           552:                  * Don't let nice creatures be generated in a treasure
        !           553:                  * room.
        !           554:                  */
        !           555:                 if ((player.t_ctype==C_PALADIN || player.t_ctype==C_RANGER ||
        !           556:                      player.t_ctype==C_MONK) && off(*tp, ISMEAN)) {
        !           557:                     int index;
        !           558:
        !           559:                     if (on(*tp, ISUNIQUE)) index = tp->t_index;
        !           560:                     else index = -1;
        !           561:
        !           562:                     /* Get rid of the monster */
        !           563:                     killed(item, FALSE, FALSE, FALSE);
        !           564:
        !           565:                     /* Restore uniques back in the table */
        !           566:                     if (index != -1) monsters[index].m_normal = TRUE;
        !           567:
        !           568:                     continue;
        !           569:                 }
        !           570:                 turn_on(*tp, ISMEAN);
        !           571:                 turn_on(*tp, ISGUARDIAN);
        !           572:             }
        !           573:         }
        !           574:
        !           575:         /* Put in the monsters and treasures */
        !           576:         for (j=1; j<rp->r_max.y-1; j++)
        !           577:             for (i=1; i<rp->r_max.x-1; i++) {
        !           578:                 coord trp;
        !           579:
        !           580:                 trp.y = rp->r_pos.y+j;
        !           581:                 trp.x = rp->r_pos.x+i;
        !           582:
        !           583:                 /* Monsters */
        !           584:                 if ((rnd(100) < (MAXTREAS*100)/(width*length)) &&
        !           585:                     (mvwinch(mw, rp->r_pos.y+j, rp->r_pos.x+i) == ' ')) {
        !           586:                     register struct thing *tp;
        !           587:
        !           588:                     /*
        !           589:                      * Put it there and leave it asleep. Wake the monsters
        !           590:                      * when the player enters the room. Hopefully, all bases
        !           591:                      * are covered as far as the ways to get in. This way
        !           592:                      * cpu time is not wasted on the awake monsters that
        !           593:                      * can't get to the player anyway.
        !           594:                      * try not to put any UNIQUEs in a treasure room.
        !           595:                      * note that they may have put put in already by the
        !           596:                      * non-treasure room code.
        !           597:                      * also, try not to put ISMEAN monsters in a treasure
        !           598:                      * room as these are supposed to be non-hostile until
        !           599:                      * attacked. It also makes life simpler for the ranger,
        !           600:                      * paladin, and monk.
        !           601:                      */
        !           602:                     for(;;) {
        !           603:                         item = new_item(sizeof *tp); /* Make a monster */
        !           604:                         tp = THINGPTR(item);
        !           605:                         new_monster(item,randmonster(FALSE, TRUE),&trp,TRUE);
        !           606:                         if (on(*tp, HASFIRE)) {
        !           607:                             register struct linked_list *fire_item;
        !           608:
        !           609:                             fire_item = creat_item();
        !           610:                             ldata(fire_item) = (char *) tp;
        !           611:                             attach(rp->r_fires, fire_item);
        !           612:                             rp->r_flags |= HASFIRE;
        !           613:                         }
        !           614:                         /*
        !           615:                          * only picky for these classes
        !           616:                          */
        !           617:                         if (player.t_ctype != C_RANGER  &&
        !           618:                             player.t_ctype != C_PALADIN &&
        !           619:                             player.t_ctype != C_MONK)
        !           620:                             break;
        !           621:                         if (on(*tp, ISMEAN))
        !           622:                             break;
        !           623:                         killed (item, FALSE, FALSE, FALSE);
        !           624:                     }
        !           625:                     if (on(*tp, ISUNIQUE)) { /* just in case */
        !           626:                         carry_obj(tp, monsters[tp->t_index].m_carry);
        !           627:                         tp->t_no_move = movement(tp);
        !           628:                     }
        !           629:                     turn_on(*tp, ISGUARDIAN);
        !           630:
        !           631:                 }
        !           632:
        !           633:                 /* Treasures */
        !           634:                 if ((rnd(100) < (MAXTREAS*100)/(width*length)) &&
        !           635:                     (mvinch(rp->r_pos.y+j, rp->r_pos.x+i) == FLOOR)) {
        !           636:                     item = new_thing(ALL, TRUE);
        !           637:                     attach(lvl_obj, item);
        !           638:                     cur = OBJPTR(item);
        !           639:
        !           640:                     mvaddch(trp.y, trp.x, cur->o_type);
        !           641:                     cur->o_pos = trp;
        !           642:                 }
        !           643:             }
        !           644:     }
        !           645:
        !           646:     jmp_here:   /* outside jumper for equippage */
        !           647:
        !           648:     /*
        !           649:      * Do ITEMS attempts to put things in dungeon, maze, or outside
        !           650:      */
        !           651:
        !           652:     if (ltype == OUTSIDE) ITEMS = rnd(15)+1;
        !           653:     else if (ltype == MAZELEV) ITEMS = rnd(20)+1;
        !           654:     else ITEMS = MAXOBJ + rnd(4);
        !           655:
        !           656:     for (i = 0; i < ITEMS; i++)
        !           657:         if (rnd(100) < 65) {
        !           658:             /*
        !           659:              * Pick a new object and link it in the list
        !           660:              */
        !           661:             item = new_thing(ALL, TRUE);
        !           662:             attach(lvl_obj, item);
        !           663:             cur = OBJPTR(item);
        !           664:             /*
        !           665:              * Put it somewhere
        !           666:              */
        !           667:             cnt = 0;
        !           668:             do {
        !           669:                 if (ltype == OUTSIDE) rm = 0;
        !           670:                 else rm = rnd_room();
        !           671:                 rnd_pos(&rooms[rm], &tp);
        !           672:             } until (winat(tp.y, tp.x) == FLOOR || cnt++ > 2500);
        !           673:             mvaddch(tp.y, tp.x, cur->o_type);
        !           674:             cur->o_pos = tp;
        !           675:         }
        !           676: }
        !           677:

CVSweb