Annotation of early-roguelike/srogue/new_leve.c, Revision 1.1.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