Annotation of early-roguelike/rogue4/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.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