Mercurial > hg > early-roguelike
comparison srogue/new_leve.c @ 36:2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
| author | elwin |
|---|---|
| date | Thu, 25 Nov 2010 12:21:41 +0000 |
| parents | |
| children | 94a0d9dd5ce1 |
comparison
equal
deleted
inserted
replaced
| 35:05018c63a721 | 36:2128c7dc8a40 |
|---|---|
| 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 /* | |
| 21 * new_level: | |
| 22 * Dig and draw a new level | |
| 23 */ | |
| 24 new_level(ltype) | |
| 25 int ltype; | |
| 26 { | |
| 27 register i; | |
| 28 register char ch; | |
| 29 struct coord traploc; | |
| 30 struct room *rp; | |
| 31 | |
| 32 if (level > max_level) | |
| 33 max_level = level; | |
| 34 | |
| 35 wclear(cw); | |
| 36 wclear(mw); | |
| 37 clear(); | |
| 38 | |
| 39 isfight = FALSE; | |
| 40 levtype = ltype; | |
| 41 | |
| 42 free_list(mlist); /* free monster list */ | |
| 43 | |
| 44 if (levtype == POSTLEV) | |
| 45 do_post(); | |
| 46 else { | |
| 47 lev_mon(); /* fill in monster list */ | |
| 48 | |
| 49 if (levtype == MAZELEV) | |
| 50 do_maze(); | |
| 51 else { /* normal levels */ | |
| 52 do_rooms(); /* Draw rooms */ | |
| 53 do_passages(); /* Draw passages */ | |
| 54 } | |
| 55 no_food++; | |
| 56 put_things(); /* Place objects (if any) */ | |
| 57 } | |
| 58 /* | |
| 59 * Place the staircase down. | |
| 60 */ | |
| 61 stairs = *rnd_pos(&rooms[rnd_room()]); | |
| 62 mvaddch(stairs.y, stairs.x, STAIRS); | |
| 63 ntraps = 0; | |
| 64 | |
| 65 if (levtype == NORMLEV) | |
| 66 { | |
| 67 struct trap *trp, *maxtrp; | |
| 68 | |
| 69 /* Place the traps for normal levels only */ | |
| 70 | |
| 71 if (rnd(10) < level) | |
| 72 { | |
| 73 ntraps = rnd(level / 4) + 1; | |
| 74 | |
| 75 if (ntraps > MAXTRAPS) | |
| 76 ntraps = MAXTRAPS; | |
| 77 | |
| 78 maxtrp = &traps[ntraps]; | |
| 79 for (trp = &traps[0]; trp < maxtrp; trp++) | |
| 80 { | |
| 81 again: | |
| 82 switch(rnd(TYPETRAPS + 1)) | |
| 83 { | |
| 84 case 0: | |
| 85 if (rnd(100) > 25) | |
| 86 goto again; | |
| 87 else | |
| 88 ch = POST; | |
| 89 | |
| 90 when 1: ch = TRAPDOOR; | |
| 91 when 2: ch = BEARTRAP; | |
| 92 when 3: ch = SLEEPTRAP; | |
| 93 when 4: ch = ARROWTRAP; | |
| 94 when 5: ch = TELTRAP; | |
| 95 when 6: ch = DARTTRAP; | |
| 96 when 7: ch = MAZETRAP; | |
| 97 when 8: | |
| 98 case 9: | |
| 99 if (rnd(100) > 80) | |
| 100 goto again; | |
| 101 else | |
| 102 ch = POOL; | |
| 103 } | |
| 104 trp->tr_flags = 0; | |
| 105 traploc = *rnd_pos(&rooms[rnd_room()]); | |
| 106 mvaddch(traploc.y,traploc.x,ch); | |
| 107 trp->tr_type = ch; | |
| 108 trp->tr_pos = traploc; | |
| 109 | |
| 110 if (ch == POOL || ch == POST) | |
| 111 trp->tr_flags |= ISFOUND; | |
| 112 | |
| 113 if (ch==TELTRAP && rnd(100)<20 && trp<maxtrp-1) | |
| 114 { | |
| 115 struct coord newloc; | |
| 116 | |
| 117 newloc = *rnd_pos(&rooms[rnd_room()]); | |
| 118 trp->tr_goto = newloc; | |
| 119 trp++; | |
| 120 trp->tr_goto = traploc; | |
| 121 trp->tr_type = TELTRAP; | |
| 122 trp->tr_pos = newloc; | |
| 123 mvaddch(newloc.y, newloc.x, TELTRAP); | |
| 124 } | |
| 125 else | |
| 126 trp->tr_goto = rndspot; | |
| 127 } | |
| 128 } | |
| 129 } | |
| 130 do | |
| 131 { | |
| 132 rp = &rooms[rnd_room()]; | |
| 133 hero = *rnd_pos(rp); | |
| 134 } while(levtype==MAZELEV&&DISTANCE(hero.y,hero.x,stairs.y,stairs.x)<10); | |
| 135 | |
| 136 player.t_room = rp; | |
| 137 player.t_oldch = mvinch(hero.y, hero.x); | |
| 138 light(&hero); | |
| 139 mvwaddch(cw,hero.y,hero.x,PLAYER); | |
| 140 nochange = FALSE; | |
| 141 } | |
| 142 | |
| 143 | |
| 144 /* | |
| 145 * rnd_room: | |
| 146 * Pick a room that is really there | |
| 147 */ | |
| 148 rnd_room() | |
| 149 { | |
| 150 register rm; | |
| 151 | |
| 152 if (levtype != NORMLEV) | |
| 153 rm = 0; | |
| 154 else | |
| 155 { | |
| 156 do { | |
| 157 rm = rnd(MAXROOMS); | |
| 158 } while (rf_on(&rooms[rm],ISGONE)); | |
| 159 } | |
| 160 return rm; | |
| 161 } | |
| 162 | |
| 163 | |
| 164 /* | |
| 165 * put_things: | |
| 166 * put potions and scrolls on this level | |
| 167 */ | |
| 168 | |
| 169 put_things() | |
| 170 { | |
| 171 register i, cnt, rm; | |
| 172 struct linked_list *item; | |
| 173 struct object *cur; | |
| 174 struct coord tp; | |
| 175 | |
| 176 /* Throw away stuff left on the previous level (if anything) */ | |
| 177 | |
| 178 free_list(lvl_obj); | |
| 179 | |
| 180 /* The only way to get new stuff is to go down into the dungeon. */ | |
| 181 | |
| 182 if (goingup()) | |
| 183 return; | |
| 184 | |
| 185 /* Do MAXOBJ attempts to put things on a level */ | |
| 186 | |
| 187 for (i = 0; i < MAXOBJ; i++) | |
| 188 { | |
| 189 if (rnd(100) < 40) | |
| 190 { | |
| 191 item = new_thing(FALSE, ANYTHING); | |
| 192 attach(lvl_obj, item); | |
| 193 cur = OBJPTR(item); | |
| 194 cnt = 0; | |
| 195 do { | |
| 196 /* skip treasure rooms */ | |
| 197 rm = rnd_room(); | |
| 198 if (++cnt > 500) | |
| 199 break; | |
| 200 } while(rf_on(&rooms[rm],ISTREAS) && levtype!=MAZELEV); | |
| 201 | |
| 202 tp = *rnd_pos(&rooms[rm]); | |
| 203 mvaddch(tp.y, tp.x, cur->o_type); | |
| 204 cur->o_pos = tp; | |
| 205 } | |
| 206 } | |
| 207 /* | |
| 208 * If he is really deep in the dungeon and he hasn't found the | |
| 209 * amulet yet, put it somewhere on the ground | |
| 210 */ | |
| 211 if (level >= AMLEVEL && !amulet && rnd(100) < 70) | |
| 212 { | |
| 213 item = new_thing(FALSE, AMULET, 0); | |
| 214 attach(lvl_obj, item); | |
| 215 cur = OBJPTR(item); | |
| 216 rm = rnd_room(); | |
| 217 tp = *rnd_pos(&rooms[rm]); | |
| 218 mvaddch(tp.y, tp.x, cur->o_type); | |
| 219 cur->o_pos = tp; | |
| 220 } | |
| 221 | |
| 222 for (i = 0; i < MAXROOMS; i++) /* loop through all */ | |
| 223 { | |
| 224 if (rf_on(&rooms[i],ISTREAS)) /* treasure rooms */ | |
| 225 { | |
| 226 int numthgs, isfood; | |
| 227 | |
| 228 numthgs = rnd(level / 3) + 6; | |
| 229 while (numthgs-- >= 0) | |
| 230 { | |
| 231 isfood = TRUE; | |
| 232 do { | |
| 233 item = new_thing(TRUE, ANYTHING); | |
| 234 cur = OBJPTR(item); | |
| 235 | |
| 236 /* dont create food for */ | |
| 237 if (cur->o_type == FOOD) | |
| 238 discard(item); | |
| 239 | |
| 240 /* treasure rooms */ | |
| 241 else | |
| 242 isfood = FALSE; | |
| 243 | |
| 244 } while (isfood); | |
| 245 | |
| 246 attach(lvl_obj, item); | |
| 247 tp = *rnd_pos(&rooms[i]); | |
| 248 mvaddch(tp.y, tp.x, cur->o_type); | |
| 249 cur->o_pos = tp; | |
| 250 } | |
| 251 } | |
| 252 } | |
| 253 } |
