Annotation of early-roguelike/rogue5/new_level.c, Revision 1.1.1.1
1.1 rubenllo 1: /*
2: * new_level:
3: * Dig and draw a new level
4: *
5: * @(#)new_level.c 4.38 (Berkeley) 02/05/99
6: *
7: * Rogue: Exploring the Dungeons of Doom
8: * Copyright (C) 1980-1983, 1985, 1999 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 <string.h>
16: #include "rogue.h"
17:
18: #define TREAS_ROOM 20 /* one chance in TREAS_ROOM for a treasure room */
19: #define MAXTREAS 10 /* maximum number of treasures in a treasure room */
20: #define MINTREAS 2 /* minimum number of treasures in a treasure room */
21:
22: void
23: new_level(void)
24: {
25: THING *tp;
26: PLACE *pp;
27: int *sp;
28: int i;
29:
30: player.t_flags &= ~ISHELD; /* unhold when you go down just in case */
31: if (level > max_level)
32: max_level = level;
33: /*
34: * Clean things off from last level
35: */
36: for (pp = places; pp < &places[MAXCOLS*MAXLINES]; pp++)
37: {
38: pp->p_ch = ' ';
39: pp->p_flags = F_REAL;
40: pp->p_monst = NULL;
41: }
42: clear();
43: /*
44: * Free up the monsters on the last level
45: */
46: for (tp = mlist; tp != NULL; tp = next(tp))
47: free_list(tp->t_pack);
48: free_list(mlist);
49: /*
50: * Throw away stuff left on the previous level (if anything)
51: */
52: free_list(lvl_obj);
53: do_rooms(); /* Draw rooms */
54: do_passages(); /* Draw passages */
55: no_food++;
56: put_things(); /* Place objects (if any) */
57: /*
58: * Place the traps
59: */
60: if (rnd(10) < level)
61: {
62: ntraps = rnd(level / 4) + 1;
63: if (ntraps > MAXTRAPS)
64: ntraps = MAXTRAPS;
65: i = ntraps;
66: while (i--)
67: {
68: /*
69: * not only wouldn't it be NICE to have traps in mazes
70: * (not that we care about being nice), since the trap
71: * number is stored where the passage number is, we
72: * can't actually do it.
73: */
74: do
75: {
76: find_floor(NULL, &stairs, FALSE, FALSE);
77: } while ( (chat(stairs.y, stairs.x) != FLOOR) &&
78: (flat(stairs.y, stairs.x) & F_REAL) );
79: sp = &flat(stairs.y, stairs.x);
80: *sp &= ~(F_REAL | F_TMASK);
81: *sp |= rnd(NTRAPS);
82: }
83: }
84: /*
85: * Place the staircase down.
86: */
87: find_floor(NULL, &stairs, FALSE, FALSE);
88: chat(stairs.y, stairs.x) = STAIRS;
89: seenstairs = FALSE;
90:
91: for (tp = mlist; tp != NULL; tp = next(tp))
92: tp->t_room = roomin(&tp->t_pos);
93:
94: find_floor(NULL, &hero, FALSE, TRUE);
95: enter_room(&hero);
96: mvaddch(hero.y, hero.x, PLAYER);
97: if (on(player, SEEMONST))
98: turn_see(FALSE);
99: if (on(player, ISHALU))
100: visuals();
101: }
102:
103: /*
104: * rnd_room:
105: * Pick a room that is really there
106: */
107: int
108: rnd_room(void)
109: {
110: int rm;
111:
112: do
113: {
114: rm = rnd(MAXROOMS);
115: } while (rooms[rm].r_flags & ISGONE);
116: return rm;
117: }
118:
119: /*
120: * put_things:
121: * Put potions and scrolls on this level
122: */
123:
124: void
125: put_things(void)
126: {
127: int i;
128: THING *obj;
129:
130: /*
131: * Once you have found the amulet, the only way to get new stuff is
132: * go down into the dungeon.
133: */
134: if (amulet && level < max_level)
135: return;
136: /*
137: * check for treasure rooms, and if so, put it in.
138: */
139: if (rnd(TREAS_ROOM) == 0)
140: treas_room();
141: /*
142: * Do MAXOBJ attempts to put things on a level
143: */
144: for (i = 0; i < MAXOBJ; i++)
145: if (rnd(100) < 36)
146: {
147: /*
148: * Pick a new object and link it in the list
149: */
150: obj = new_thing();
151: attach(lvl_obj, obj);
152: /*
153: * Put it somewhere
154: */
155: find_floor(NULL, &obj->o_pos, FALSE, FALSE);
156: chat(obj->o_pos.y, obj->o_pos.x) = obj->o_type;
157: }
158: /*
159: * If he is really deep in the dungeon and he hasn't found the
160: * amulet yet, put it somewhere on the ground
161: */
162: if (level >= AMULETLEVEL && !amulet)
163: {
164: obj = new_item();
165: attach(lvl_obj, obj);
166: obj->o_hplus = 0;
167: obj->o_dplus = 0;
168: strncpy(obj->o_damage,"0x0",sizeof(obj->o_damage));
169: strncpy(obj->o_hurldmg,"0x0",sizeof(obj->o_hurldmg));
170: obj->o_arm = 11;
171: obj->o_type = AMULET;
172: /*
173: * Put it somewhere
174: */
175: find_floor(NULL, &obj->o_pos, FALSE, FALSE);
176: chat(obj->o_pos.y, obj->o_pos.x) = AMULET;
177: }
178: }
179:
180: /*
181: * treas_room:
182: * Add a treasure room
183: */
184: #define MAXTRIES 10 /* max number of tries to put down a monster */
185:
186:
187: void
188: treas_room(void)
189: {
190: int nm;
191: THING *tp;
192: struct room *rp;
193: int spots, num_monst;
194: coord mp;
195:
196: rp = &rooms[rnd_room()];
197: spots = (rp->r_max.y - 2) * (rp->r_max.x - 2) - MINTREAS;
198: if (spots > (MAXTREAS - MINTREAS))
199: spots = (MAXTREAS - MINTREAS);
200: num_monst = nm = rnd(spots) + MINTREAS;
201: while (nm--)
202: {
203: find_floor(rp, &mp, 2 * MAXTRIES, FALSE);
204: tp = new_thing();
205: tp->o_pos = mp;
206: attach(lvl_obj, tp);
207: chat(mp.y, mp.x) = tp->o_type;
208: }
209:
210: /*
211: * fill up room with monsters from the next level down
212: */
213:
214: if ((nm = rnd(spots) + MINTREAS) < num_monst + 2)
215: nm = num_monst + 2;
216: spots = (rp->r_max.y - 2) * (rp->r_max.x - 2);
217: if (nm > spots)
218: nm = spots;
219: level++;
220: while (nm--)
221: {
222: spots = 0;
223: if (find_floor(rp, &mp, MAXTRIES, TRUE))
224: {
225: tp = new_item();
226: new_monster(tp, randmonster(FALSE), &mp);
227: tp->t_flags |= ISMEAN; /* no sloughers in THIS room */
228: give_pack(tp);
229: }
230: }
231: level--;
232: }
CVSweb