Annotation of early-roguelike/rogue4/new_level.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: * new_level:
! 3: * Dig and draw a new level
! 4: *
! 5: * @(#)new_level.c 4.19 (Berkeley) 1/12/82
! 6: *
! 7: * Rogue: Exploring the Dungeons of Doom
! 8: * Copyright (C) 1980, 1981, 1982 Michael Toy, Ken Arnold and Glenn Wichman
! 9: * All rights reserved.
! 10: *
! 11: * See the file LICENSE.TXT for full copyright and licensing information.
! 12: */
! 13:
! 14: #include <stdlib.h>
! 15: #include <time.h>
! 16: #include <curses.h>
! 17: #include <string.h>
! 18: #include "rogue.h"
! 19:
! 20: #define TREAS_ROOM 20 /* one chance in TREAS_ROOM for a treasure room */
! 21: #define MAXTREAS 10 /* maximum number of treasures in a treasure room */
! 22: #define MINTREAS 2 /* minimum number of treasures in a treasure room */
! 23:
! 24: void put_things(void);
! 25: void treas_room(void);
! 26:
! 27: void
! 28: new_level(void)
! 29: {
! 30: register int rm, i;
! 31: register THING *tp;
! 32: register char *sp;
! 33: register THING **mp;
! 34: register int index;
! 35: coord stairs;
! 36:
! 37: player.t_flags &= ~ISHELD; /* unhold when you go down just in case */
! 38: if (level > max_level)
! 39: max_level = level;
! 40: /*
! 41: * Clean things off from last level
! 42: */
! 43: clear();
! 44: for (sp = _level; sp < &_level[MAXCOLS*MAXLINES]; )
! 45: *sp++ = ' ';
! 46: for (sp = _flags; sp < &_flags[MAXCOLS*MAXLINES]; )
! 47: *sp++ = F_REAL;
! 48: for (mp = _monst; mp < &_monst[MAXCOLS*MAXLINES]; )
! 49: *mp++ = NULL;
! 50: clear();
! 51: /*
! 52: * Free up the monsters on the last level
! 53: */
! 54: for (tp = mlist; tp != NULL; tp = next(tp))
! 55: free_list(tp->t_pack);
! 56: free_list(mlist);
! 57: /*
! 58: * Throw away stuff left on the previous level (if anything)
! 59: */
! 60: free_list(lvl_obj);
! 61: do_rooms(); /* Draw rooms */
! 62: do_passages(); /* Draw passages */
! 63: no_food++;
! 64: put_things(); /* Place objects (if any) */
! 65: /*
! 66: * Place the staircase down.
! 67: */
! 68: i = 0;
! 69: do {
! 70: rm = rnd_room();
! 71: rnd_pos(&rooms[rm], &stairs);
! 72: index = INDEX(stairs.y, stairs.x);
! 73: if (i++ > 100)
! 74: {
! 75: i = 0;
! 76: srand(md_random_seed());
! 77: }
! 78: } until (_level[index] == FLOOR);
! 79: _level[index] = STAIRS;
! 80: /*
! 81: * Place the traps
! 82: */
! 83: if (rnd(10) < level)
! 84: {
! 85: ntraps = rnd(level / 4) + 1;
! 86: if (ntraps > MAXTRAPS)
! 87: ntraps = MAXTRAPS;
! 88: i = ntraps;
! 89: while (i--)
! 90: {
! 91: do
! 92: {
! 93: rm = rnd_room();
! 94: rnd_pos(&rooms[rm], &stairs);
! 95: index = INDEX(stairs.y, stairs.x);
! 96: } until (_level[index] == FLOOR && (_flags[index] & F_REAL));
! 97: sp = &_flags[index];
! 98: *sp &= ~(F_REAL | F_TMASK);
! 99: *sp |= rnd(NTRAPS);
! 100: }
! 101: }
! 102: do
! 103: {
! 104: rm = rnd_room();
! 105: rnd_pos(&rooms[rm], &hero);
! 106: index = INDEX(hero.y, hero.x);
! 107: } until (_level[index] == FLOOR && (_flags[index] & F_REAL)
! 108: && _monst[index] == NULL);
! 109: enter_room(&hero);
! 110: move(hero.y, hero.x);
! 111: addch(PLAYER);
! 112: if (on(player, SEEMONST))
! 113: turn_see(FALSE);
! 114: }
! 115:
! 116: /*
! 117: * rnd_room:
! 118: * Pick a room that is really there
! 119: */
! 120: int
! 121: rnd_room(void)
! 122: {
! 123: register int rm;
! 124:
! 125: do
! 126: {
! 127: rm = rnd(MAXROOMS);
! 128: } while (rooms[rm].r_flags & ISGONE);
! 129: return rm;
! 130: }
! 131:
! 132: /*
! 133: * put_things:
! 134: * Put potions and scrolls on this level
! 135: */
! 136: void
! 137: put_things(void)
! 138: {
! 139: register int i;
! 140: register THING *cur;
! 141: register int rm;
! 142: coord tp;
! 143:
! 144: /*
! 145: * Once you have found the amulet, the only way to get new stuff is
! 146: * go down into the dungeon.
! 147: */
! 148: if (amulet && level < max_level)
! 149: return;
! 150: /*
! 151: * check for treasure rooms, and if so, put it in.
! 152: */
! 153: if (rnd(TREAS_ROOM) == 0)
! 154: treas_room();
! 155: /*
! 156: * Do MAXOBJ attempts to put things on a level
! 157: */
! 158: for (i = 0; i < MAXOBJ; i++)
! 159: if (rnd(100) < 35)
! 160: {
! 161: /*
! 162: * Pick a new object and link it in the list
! 163: */
! 164: cur = new_thing();
! 165: attach(lvl_obj, cur);
! 166: /*
! 167: * Put it somewhere
! 168: */
! 169: do {
! 170: rm = rnd_room();
! 171: rnd_pos(&rooms[rm], &tp);
! 172: } until (chat(tp.y, tp.x) == FLOOR);
! 173: chat(tp.y, tp.x) = cur->o_type;
! 174: cur->o_pos = tp;
! 175: }
! 176: /*
! 177: * If he is really deep in the dungeon and he hasn't found the
! 178: * amulet yet, put it somewhere on the ground
! 179: */
! 180: if (level >= AMULETLEVEL && !amulet)
! 181: {
! 182: cur = new_item();
! 183: attach(lvl_obj, cur);
! 184: cur->o_hplus = cur->o_dplus = 0;
! 185: strcpy(cur->o_damage,"0d0");
! 186: strcpy(cur->o_hurldmg,"0d0");
! 187: cur->o_ac = 11;
! 188: cur->o_type = AMULET;
! 189: /*
! 190: * Put it somewhere
! 191: */
! 192: do {
! 193: rm = rnd_room();
! 194: rnd_pos(&rooms[rm], &tp);
! 195: } until (winat(tp.y, tp.x) == FLOOR);
! 196: chat(tp.y, tp.x) = AMULET;
! 197: cur->o_pos = tp;
! 198: }
! 199: }
! 200:
! 201: /*
! 202: * treas_room:
! 203: * Add a treasure room
! 204: */
! 205: #define MAXTRIES 10 /* max number of tries to put down a monster */
! 206:
! 207: void
! 208: treas_room(void)
! 209: {
! 210: register int nm, index;
! 211: register THING *tp;
! 212: register struct room *rp;
! 213: register int spots, num_monst;
! 214: coord mp;
! 215:
! 216: rp = &rooms[rnd_room()];
! 217: spots = (rp->r_max.y - 2) * (rp->r_max.x - 2) - MINTREAS;
! 218: if (spots > (MAXTREAS - MINTREAS))
! 219: spots = (MAXTREAS - MINTREAS);
! 220: num_monst = nm = rnd(spots) + MINTREAS;
! 221: while (nm--)
! 222: {
! 223: do
! 224: {
! 225: rnd_pos(rp, &mp);
! 226: index = INDEX(mp.y, mp.x);
! 227: } until (_level[index] == FLOOR);
! 228: tp = new_thing();
! 229: tp->o_pos = mp;
! 230: attach(lvl_obj, tp);
! 231: _level[index] = tp->o_type;
! 232: }
! 233:
! 234: /*
! 235: * fill up room with monsters from the next level down
! 236: */
! 237:
! 238: if ((nm = rnd(spots) + MINTREAS) < num_monst + 2)
! 239: nm = num_monst + 2;
! 240: spots = (rp->r_max.y - 2) * (rp->r_max.x - 2);
! 241: if (nm > spots)
! 242: nm = spots;
! 243: level++;
! 244: while (nm--)
! 245: {
! 246: spots = 0;
! 247: do
! 248: {
! 249: rnd_pos(rp, &mp);
! 250: index = INDEX(mp.y, mp.x);
! 251: spots++;
! 252: } until (_monst[index] == NULL || spots > MAXTRIES);
! 253: if (_monst[index] == NULL)
! 254: {
! 255: tp = new_item();
! 256: new_monster(tp, randmonster(FALSE), &mp);
! 257: tp->t_flags |= ISMEAN; /* no sloughers in THIS room */
! 258: give_pack(tp);
! 259: }
! 260: }
! 261: level--;
! 262: }
CVSweb