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