Annotation of early-roguelike/srogue/new_leve.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: * Do anything associated with a new dungeon level
! 3: *
! 4: * @(#)new_level.c 9.0 (rdk) 7/17/84
! 5: *
! 6: * Super-Rogue
! 7: * Copyright (C) 1984 Robert D. Kindelberger
! 8: * All rights reserved.
! 9: *
! 10: * Based on "Rogue: Exploring the Dungeons of Doom"
! 11: * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
! 12: * All rights reserved.
! 13: *
! 14: * See the file LICENSE.TXT for full copyright and licensing information.
! 15: */
! 16:
! 17: #include "rogue.h"
! 18: #include "rogue.ext"
! 19:
! 20: void put_things(void);
! 21:
! 22: /*
! 23: * new_level:
! 24: * Dig and draw a new level
! 25: */
! 26: void
! 27: new_level(int ltype)
! 28: {
! 29: register int i;
! 30: register char ch;
! 31: struct coord traploc;
! 32: struct room *rp;
! 33:
! 34: if (level > max_level)
! 35: max_level = level;
! 36:
! 37: wclear(cw);
! 38: wclear(mw);
! 39: clear();
! 40:
! 41: isfight = FALSE;
! 42: levtype = ltype;
! 43:
! 44: free_list(mlist); /* free monster list */
! 45:
! 46: if (levtype == POSTLEV)
! 47: do_post();
! 48: else {
! 49: lev_mon(); /* fill in monster list */
! 50:
! 51: if (levtype == MAZELEV)
! 52: do_maze();
! 53: else { /* normal levels */
! 54: do_rooms(); /* Draw rooms */
! 55: do_passages(); /* Draw passages */
! 56: }
! 57: no_food++;
! 58: put_things(); /* Place objects (if any) */
! 59: }
! 60: /*
! 61: * Place the staircase down.
! 62: */
! 63: stairs = *rnd_pos(&rooms[rnd_room()]);
! 64: mvaddch(stairs.y, stairs.x, STAIRS);
! 65: ntraps = 0;
! 66:
! 67: if (levtype == NORMLEV)
! 68: {
! 69: struct trap *trp, *maxtrp;
! 70:
! 71: /* Place the traps for normal levels only */
! 72:
! 73: if (rnd(10) < level)
! 74: {
! 75: ntraps = rnd(level / 4) + 1;
! 76:
! 77: if (ntraps > MAXTRAPS)
! 78: ntraps = MAXTRAPS;
! 79:
! 80: maxtrp = &traps[ntraps];
! 81: for (trp = &traps[0]; trp < maxtrp; trp++)
! 82: {
! 83: again:
! 84: switch(rnd(TYPETRAPS + 1))
! 85: {
! 86: case 0:
! 87: if (rnd(100) > 25)
! 88: goto again;
! 89: else
! 90: ch = POST;
! 91:
! 92: when 1: ch = TRAPDOOR;
! 93: when 2: ch = BEARTRAP;
! 94: when 3: ch = SLEEPTRAP;
! 95: when 4: ch = ARROWTRAP;
! 96: when 5: ch = TELTRAP;
! 97: when 6: ch = DARTTRAP;
! 98: when 7: ch = MAZETRAP;
! 99: when 8:
! 100: case 9:
! 101: if (rnd(100) > 80)
! 102: goto again;
! 103: else
! 104: ch = POOL;
! 105: }
! 106: trp->tr_flags = 0;
! 107: traploc = *rnd_pos(&rooms[rnd_room()]);
! 108: mvaddch(traploc.y,traploc.x,ch);
! 109: trp->tr_type = ch;
! 110: trp->tr_pos = traploc;
! 111:
! 112: if (ch == POOL || ch == POST)
! 113: trp->tr_flags |= ISFOUND;
! 114:
! 115: if (ch==TELTRAP && rnd(100)<20 && trp<maxtrp-1)
! 116: {
! 117: struct coord newloc;
! 118:
! 119: newloc = *rnd_pos(&rooms[rnd_room()]);
! 120: trp->tr_goto = newloc;
! 121: trp++;
! 122: trp->tr_goto = traploc;
! 123: trp->tr_type = TELTRAP;
! 124: trp->tr_pos = newloc;
! 125: mvaddch(newloc.y, newloc.x, TELTRAP);
! 126: }
! 127: else
! 128: trp->tr_goto = rndspot;
! 129: }
! 130: }
! 131: }
! 132: do
! 133: {
! 134: rp = &rooms[rnd_room()];
! 135: hero = *rnd_pos(rp);
! 136: } while(levtype==MAZELEV&&DISTANCE(hero.y,hero.x,stairs.y,stairs.x)<10);
! 137:
! 138: player.t_room = rp;
! 139: player.t_oldch = mvinch(hero.y, hero.x);
! 140: light(&hero);
! 141: mvwaddch(cw,hero.y,hero.x,PLAYER);
! 142: nochange = FALSE;
! 143: }
! 144:
! 145:
! 146: /*
! 147: * rnd_room:
! 148: * Pick a room that is really there
! 149: */
! 150: int
! 151: rnd_room(void)
! 152: {
! 153: register int rm;
! 154:
! 155: if (levtype != NORMLEV)
! 156: rm = 0;
! 157: else
! 158: {
! 159: do {
! 160: rm = rnd(MAXROOMS);
! 161: } while (rf_on(&rooms[rm],ISGONE));
! 162: }
! 163: return rm;
! 164: }
! 165:
! 166:
! 167: /*
! 168: * put_things:
! 169: * put potions and scrolls on this level
! 170: */
! 171:
! 172: void
! 173: put_things(void)
! 174: {
! 175: register int i, cnt, rm;
! 176: struct linked_list *item;
! 177: struct object *cur;
! 178: struct coord tp;
! 179:
! 180: /* Throw away stuff left on the previous level (if anything) */
! 181:
! 182: free_list(lvl_obj);
! 183:
! 184: /* The only way to get new stuff is to go down into the dungeon. */
! 185:
! 186: if (goingup())
! 187: return;
! 188:
! 189: /* Do MAXOBJ attempts to put things on a level */
! 190:
! 191: for (i = 0; i < MAXOBJ; i++)
! 192: {
! 193: if (rnd(100) < 40)
! 194: {
! 195: item = new_thing(FALSE, ANYTHING);
! 196: attach(lvl_obj, item);
! 197: cur = OBJPTR(item);
! 198: cnt = 0;
! 199: do {
! 200: /* skip treasure rooms */
! 201: rm = rnd_room();
! 202: if (++cnt > 500)
! 203: break;
! 204: } while(rf_on(&rooms[rm],ISTREAS) && levtype!=MAZELEV);
! 205:
! 206: tp = *rnd_pos(&rooms[rm]);
! 207: mvaddch(tp.y, tp.x, cur->o_type);
! 208: cur->o_pos = tp;
! 209: }
! 210: }
! 211: /*
! 212: * If he is really deep in the dungeon and he hasn't found the
! 213: * amulet yet, put it somewhere on the ground
! 214: */
! 215: if (level >= AMLEVEL && !amulet && rnd(100) < 70)
! 216: {
! 217: item = new_thing(FALSE, AMULET, 0);
! 218: attach(lvl_obj, item);
! 219: cur = OBJPTR(item);
! 220: rm = rnd_room();
! 221: tp = *rnd_pos(&rooms[rm]);
! 222: mvaddch(tp.y, tp.x, cur->o_type);
! 223: cur->o_pos = tp;
! 224: }
! 225:
! 226: for (i = 0; i < MAXROOMS; i++) /* loop through all */
! 227: {
! 228: if (rf_on(&rooms[i],ISTREAS)) /* treasure rooms */
! 229: {
! 230: int numthgs, isfood;
! 231:
! 232: numthgs = rnd(level / 3) + 6;
! 233: while (numthgs-- >= 0)
! 234: {
! 235: isfood = TRUE;
! 236: do {
! 237: item = new_thing(TRUE, ANYTHING);
! 238: cur = OBJPTR(item);
! 239:
! 240: /* dont create food for */
! 241: if (cur->o_type == FOOD)
! 242: discard(item);
! 243:
! 244: /* treasure rooms */
! 245: else
! 246: isfood = FALSE;
! 247:
! 248: } while (isfood);
! 249:
! 250: attach(lvl_obj, item);
! 251: tp = *rnd_pos(&rooms[i]);
! 252: mvaddch(tp.y, tp.x, cur->o_type);
! 253: cur->o_pos = tp;
! 254: }
! 255: }
! 256: }
! 257: }
CVSweb