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

Annotation of early-roguelike/rogue3/newlevel.c, Revision 1.1

1.1     ! rubenllo    1: /*
        !             2:  * new_level:
        !             3:  *     Dig and draw a new level
        !             4:  *
        !             5:  * @(#)new_level.c     3.7 (Berkeley) 6/2/81
        !             6:  *
        !             7:  * Rogue: Exploring the Dungeons of Doom
        !             8:  * Copyright (C) 1980, 1981 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 "curses.h"
        !            15: #include "rogue.h"
        !            16:
        !            17: #include <string.h>
        !            18:
        !            19: void
        !            20: new_level()
        !            21: {
        !            22:     int rm, i;
        !            23:     int ch = 0;
        !            24:     coord stairs;
        !            25:
        !            26:     if (level > max_level)
        !            27:        max_level = level;
        !            28:     wclear(cw);
        !            29:     wclear(mw);
        !            30:     clear();
        !            31:     status();
        !            32:     /*
        !            33:      * Free up the monsters on the last level
        !            34:      */
        !            35:     free_list(mlist);
        !            36:     do_rooms();                                /* Draw rooms */
        !            37:     do_passages();                     /* Draw passages */
        !            38:     no_food++;
        !            39:     put_things();                      /* Place objects (if any) */
        !            40:     /*
        !            41:      * Place the staircase down.
        !            42:      */
        !            43:     do {
        !            44:         rm = rnd_room();
        !            45:        rnd_pos(&rooms[rm], &stairs);
        !            46:     } until (winat(stairs.y, stairs.x) == FLOOR);
        !            47:     addch(STAIRS);
        !            48:     /*
        !            49:      * Place the traps
        !            50:      */
        !            51:     if (rnd(10) < level)
        !            52:     {
        !            53:        ntraps = rnd(level/4)+1;
        !            54:        if (ntraps > MAXTRAPS)
        !            55:            ntraps = MAXTRAPS;
        !            56:        i = ntraps;
        !            57:        while (i--)
        !            58:        {
        !            59:            do
        !            60:            {
        !            61:                rm = rnd_room();
        !            62:                rnd_pos(&rooms[rm], &stairs);
        !            63:            } until (winat(stairs.y, stairs.x) == FLOOR);
        !            64:            switch(rnd(6))
        !            65:            {
        !            66:                case 0: ch = TRAPDOOR;
        !            67:                when 1: ch = BEARTRAP;
        !            68:                when 2: ch = SLEEPTRAP;
        !            69:                when 3: ch = ARROWTRAP;
        !            70:                when 4: ch = TELTRAP;
        !            71:                when 5: ch = DARTTRAP;
        !            72:            }
        !            73:            addch(TRAP);
        !            74:            traps[i].tr_type = ch;
        !            75:            traps[i].tr_flags = 0;
        !            76:            traps[i].tr_pos = stairs;
        !            77:        }
        !            78:     }
        !            79:     do
        !            80:     {
        !            81:        rm = rnd_room();
        !            82:        rnd_pos(&rooms[rm], &hero);
        !            83:     }
        !            84:     until(winat(hero.y, hero.x) == FLOOR);
        !            85:     light(&hero);
        !            86:     wmove(cw, hero.y, hero.x);
        !            87:     waddch(cw, PLAYER);
        !            88: }
        !            89:
        !            90: /*
        !            91:  * Pick a room that is really there
        !            92:  */
        !            93:
        !            94: int
        !            95: rnd_room()
        !            96: {
        !            97:     int rm;
        !            98:
        !            99:     do
        !           100:     {
        !           101:        rm = rnd(MAXROOMS);
        !           102:     } while (rooms[rm].r_flags & ISGONE);
        !           103:     return rm;
        !           104: }
        !           105:
        !           106: /*
        !           107:  * put_things:
        !           108:  *     put potions and scrolls on this level
        !           109:  */
        !           110:
        !           111: void
        !           112: put_things()
        !           113: {
        !           114:     int i;
        !           115:     struct linked_list *item;
        !           116:     struct object *cur;
        !           117:     int rm;
        !           118:     coord tp;
        !           119:
        !           120:     /*
        !           121:      * Throw away stuff left on the previous level (if anything)
        !           122:      */
        !           123:     free_list(lvl_obj);
        !           124:     /*
        !           125:      * Once you have found the amulet, the only way to get new stuff is
        !           126:      * go down into the dungeon.
        !           127:      */
        !           128:     if (amulet && level < max_level)
        !           129:        return;
        !           130:     /*
        !           131:      * Do MAXOBJ attempts to put things on a level
        !           132:      */
        !           133:     for (i = 0; i < MAXOBJ; i++)
        !           134:        if (rnd(100) < 35)
        !           135:        {
        !           136:            /*
        !           137:             * Pick a new object and link it in the list
        !           138:             */
        !           139:            item = new_thing();
        !           140:            attach(lvl_obj, item);
        !           141:            cur = (struct object *) ldata(item);
        !           142:            /*
        !           143:             * Put it somewhere
        !           144:             */
        !           145:            do {
        !           146:                rm = rnd_room();
        !           147:                rnd_pos(&rooms[rm], &tp);
        !           148:            } until (winat(tp.y, tp.x) == FLOOR);
        !           149:            mvaddch(tp.y, tp.x, cur->o_type);
        !           150:            cur->o_pos = tp;
        !           151:        }
        !           152:     /*
        !           153:      * If he is really deep in the dungeon and he hasn't found the
        !           154:      * amulet yet, put it somewhere on the ground
        !           155:      */
        !           156:     if (level > 25 && !amulet)
        !           157:     {
        !           158:        item = new_item(sizeof *cur);
        !           159:        attach(lvl_obj, item);
        !           160:        cur = (struct object *) ldata(item);
        !           161:        cur->o_hplus = cur->o_dplus = 0;
        !           162:        strcpy(cur->o_damage, "0d0");
        !           163:        strcpy(cur->o_hurldmg, "0d0");
        !           164:        cur->o_ac = 11;
        !           165:        cur->o_type = AMULET;
        !           166:        /*
        !           167:         * Put it somewhere
        !           168:         */
        !           169:        do {
        !           170:            rm = rnd_room();
        !           171:            rnd_pos(&rooms[rm], &tp);
        !           172:        } until (winat(tp.y, tp.x) == FLOOR);
        !           173:        mvaddch(tp.y, tp.x, cur->o_type);
        !           174:        cur->o_pos = tp;
        !           175:     }
        !           176: }

CVSweb