Mercurial > hg > early-roguelike
comparison rogue3/newlevel.c @ 0:527e2150eaf0
Import Rogue 3.6 from the Roguelike Restoration Project (r1490)
author | edwarj4 |
---|---|
date | Tue, 13 Oct 2009 13:33:34 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:527e2150eaf0 |
---|---|
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 } |