|
|
1.1 root 1: /*
2: * Copyright (c) 1988 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * This code is derived from software contributed to Berkeley by
6: * Timothy C. Stoehr.
7: *
8: * Redistribution and use in source and binary forms are permitted
9: * provided that: (1) source distributions retain this entire copyright
10: * notice and comment, and (2) distributions including binaries display
11: * the following acknowledgement: ``This product includes software
12: * developed by the University of California, Berkeley and its contributors''
13: * in the documentation or other materials provided with the distribution
14: * and in all advertising materials mentioning features or use of this
15: * software. Neither the name of the University nor the names of its
16: * contributors may be used to endorse or promote products derived
17: * from this software without specific prior written permission.
18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
19: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
20: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
21: */
22:
23: #ifndef lint
24: static char sccsid[] = "@(#)level.c 5.3 (Berkeley) 6/1/90";
25: #endif /* not lint */
26:
27: /*
28: * level.c
29: *
30: * This source herein may be modified and/or distributed by anybody who
31: * so desires, with the following restrictions:
32: * 1.) No portion of this notice shall be removed.
33: * 2.) Credit shall not be taken for the creation of this source.
34: * 3.) This code is not to be traded, sold, or used for personal
35: * gain or profit.
36: *
37: */
38:
39: #include "rogue.h"
40:
41: #define swap(x,y) {t = x; x = y; y = t;}
42:
43: short cur_level = 0;
44: short max_level = 1;
45: short cur_room;
46: char *new_level_message = 0;
47: short party_room = NO_ROOM;
48: short r_de;
49:
50: long level_points[MAX_EXP_LEVEL] = {
51: 10L,
52: 20L,
53: 40L,
54: 80L,
55: 160L,
56: 320L,
57: 640L,
58: 1300L,
59: 2600L,
60: 5200L,
61: 10000L,
62: 20000L,
63: 40000L,
64: 80000L,
65: 160000L,
66: 320000L,
67: 1000000L,
68: 3333333L,
69: 6666666L,
70: MAX_EXP,
71: 99900000L
72: };
73:
74: short random_rooms[MAXROOMS] = {3, 7, 5, 2, 0, 6, 1, 4, 8};
75:
76: extern boolean being_held, wizard, detect_monster;
77: extern boolean see_invisible;
78: extern short bear_trap, levitate, extra_hp, less_hp, cur_room;
79:
80: make_level()
81: {
82: short i, j;
83: short must_1, must_2, must_3;
84: boolean big_room;
85:
86: if (cur_level < LAST_DUNGEON) {
87: cur_level++;
88: }
89: if (cur_level > max_level) {
90: max_level = cur_level;
91: }
92: must_1 = get_rand(0, 5);
93:
94: switch(must_1) {
95: case 0:
96: must_1 = 0;
97: must_2 = 1;
98: must_3 = 2;
99: break;
100: case 1:
101: must_1 = 3;
102: must_2 = 4;
103: must_3 = 5;
104: break;
105: case 2:
106: must_1 = 6;
107: must_2 = 7;
108: must_3 = 8;
109: break;
110: case 3:
111: must_1 = 0;
112: must_2 = 3;
113: must_3 = 6;
114: break;
115: case 4:
116: must_1 = 1;
117: must_2 = 4;
118: must_3 = 7;
119: break;
120: case 5:
121: must_1 = 2;
122: must_2 = 5;
123: must_3 = 8;
124: break;
125: }
126: if (rand_percent(8)) {
127: party_room = 0;
128: }
129: big_room = ((party_room != NO_ROOM) && rand_percent(1));
130: if (big_room) {
131: make_room(BIG_ROOM, 0, 0, 0);
132: } else {
133: for (i = 0; i < MAXROOMS; i++) {
134: make_room(i, must_1, must_2, must_3);
135: }
136: }
137: if (!big_room) {
138: add_mazes();
139:
140: mix_random_rooms();
141:
142: for (j = 0; j < MAXROOMS; j++) {
143:
144: i = random_rooms[j];
145:
146: if (i < (MAXROOMS-1)) {
147: (void) connect_rooms(i, i+1);
148: }
149: if (i < (MAXROOMS-3)) {
150: (void) connect_rooms(i, i+3);
151: }
152: if (i < (MAXROOMS-2)) {
153: if (rooms[i+1].is_room & R_NOTHING) {
154: if (connect_rooms(i, i+2)) {
155: rooms[i+1].is_room = R_CROSS;
156: }
157: }
158: }
159: if (i < (MAXROOMS-6)) {
160: if (rooms[i+3].is_room & R_NOTHING) {
161: if (connect_rooms(i, i+6)) {
162: rooms[i+3].is_room = R_CROSS;
163: }
164: }
165: }
166: if (is_all_connected()) {
167: break;
168: }
169: }
170: fill_out_level();
171: }
172: if (!has_amulet() && (cur_level >= AMULET_LEVEL)) {
173: put_amulet();
174: }
175: }
176:
177: make_room(rn, r1, r2, r3)
178: short rn, r1, r2, r3;
179: {
180: short left_col, right_col, top_row, bottom_row;
181: short width, height;
182: short row_offset, col_offset;
183: short i, j, ch;
184:
185: switch(rn) {
186: case 0:
187: left_col = 0;
188: right_col = COL1-1;
189: top_row = MIN_ROW;
190: bottom_row = ROW1-1;
191: break;
192: case 1:
193: left_col = COL1+1;
194: right_col = COL2-1;
195: top_row = MIN_ROW;
196: bottom_row = ROW1-1;
197: break;
198: case 2:
199: left_col = COL2+1;
200: right_col = DCOLS-1;
201: top_row = MIN_ROW;
202: bottom_row = ROW1-1;
203: break;
204: case 3:
205: left_col = 0;
206: right_col = COL1-1;
207: top_row = ROW1+1;
208: bottom_row = ROW2-1;
209: break;
210: case 4:
211: left_col = COL1+1;
212: right_col = COL2-1;
213: top_row = ROW1+1;
214: bottom_row = ROW2-1;
215: break;
216: case 5:
217: left_col = COL2+1;
218: right_col = DCOLS-1;
219: top_row = ROW1+1;
220: bottom_row = ROW2-1;
221: break;
222: case 6:
223: left_col = 0;
224: right_col = COL1-1;
225: top_row = ROW2+1;
226: bottom_row = DROWS - 2;
227: break;
228: case 7:
229: left_col = COL1+1;
230: right_col = COL2-1;
231: top_row = ROW2+1;
232: bottom_row = DROWS - 2;
233: break;
234: case 8:
235: left_col = COL2+1;
236: right_col = DCOLS-1;
237: top_row = ROW2+1;
238: bottom_row = DROWS - 2;
239: break;
240: case BIG_ROOM:
241: top_row = get_rand(MIN_ROW, MIN_ROW+5);
242: bottom_row = get_rand(DROWS-7, DROWS-2);
243: left_col = get_rand(0, 10);;
244: right_col = get_rand(DCOLS-11, DCOLS-1);
245: rn = 0;
246: goto B;
247: }
248: height = get_rand(4, (bottom_row - top_row + 1));
249: width = get_rand(7, (right_col - left_col - 2));
250:
251: row_offset = get_rand(0, ((bottom_row - top_row) - height + 1));
252: col_offset = get_rand(0, ((right_col - left_col) - width + 1));
253:
254: top_row += row_offset;
255: bottom_row = top_row + height - 1;
256:
257: left_col += col_offset;
258: right_col = left_col + width - 1;
259:
260: if ((rn != r1) && (rn != r2) && (rn != r3) && rand_percent(40)) {
261: goto END;
262: }
263: B:
264: rooms[rn].is_room = R_ROOM;
265:
266: for (i = top_row; i <= bottom_row; i++) {
267: for (j = left_col; j <= right_col; j++) {
268: if ((i == top_row) || (i == bottom_row)) {
269: ch = HORWALL;
270: } else if ( ((i != top_row) && (i != bottom_row)) &&
271: ((j == left_col) || (j == right_col))) {
272: ch = VERTWALL;
273: } else {
274: ch = FLOOR;
275: }
276: dungeon[i][j] = ch;
277: }
278: }
279: END:
280: rooms[rn].top_row = top_row;
281: rooms[rn].bottom_row = bottom_row;
282: rooms[rn].left_col = left_col;
283: rooms[rn].right_col = right_col;
284: }
285:
286: connect_rooms(room1, room2)
287: short room1, room2;
288: {
289: short row1, col1, row2, col2, dir;
290:
291: if ((!(rooms[room1].is_room & (R_ROOM | R_MAZE))) ||
292: (!(rooms[room2].is_room & (R_ROOM | R_MAZE)))) {
293: return(0);
294: }
295: if (same_row(room1, room2) &&
296: (rooms[room1].left_col > rooms[room2].right_col)) {
297: put_door(&rooms[room1], LEFT, &row1, &col1);
298: put_door(&rooms[room2], RIGHT, &row2, &col2);
299: dir = LEFT;
300: } else if (same_row(room1, room2) &&
301: (rooms[room2].left_col > rooms[room1].right_col)) {
302: put_door(&rooms[room1], RIGHT, &row1, &col1);
303: put_door(&rooms[room2], LEFT, &row2, &col2);
304: dir = RIGHT;
305: } else if (same_col(room1, room2) &&
306: (rooms[room1].top_row > rooms[room2].bottom_row)) {
307: put_door(&rooms[room1], UPWARD, &row1, &col1);
308: put_door(&rooms[room2], DOWN, &row2, &col2);
309: dir = UPWARD;
310: } else if (same_col(room1, room2) &&
311: (rooms[room2].top_row > rooms[room1].bottom_row)) {
312: put_door(&rooms[room1], DOWN, &row1, &col1);
313: put_door(&rooms[room2], UPWARD, &row2, &col2);
314: dir = DOWN;
315: } else {
316: return(0);
317: }
318:
319: do {
320: draw_simple_passage(row1, col1, row2, col2, dir);
321: } while (rand_percent(4));
322:
323: rooms[room1].doors[dir/2].oth_room = room2;
324: rooms[room1].doors[dir/2].oth_row = row2;
325: rooms[room1].doors[dir/2].oth_col = col2;
326:
327: rooms[room2].doors[(((dir+4)%DIRS)/2)].oth_room = room1;
328: rooms[room2].doors[(((dir+4)%DIRS)/2)].oth_row = row1;
329: rooms[room2].doors[(((dir+4)%DIRS)/2)].oth_col = col1;
330: return(1);
331: }
332:
333: clear_level()
334: {
335: short i, j;
336:
337: for (i = 0; i < MAXROOMS; i++) {
338: rooms[i].is_room = R_NOTHING;
339: for (j = 0; j < 4; j++) {
340: rooms[i].doors[j].oth_room = NO_ROOM;
341: }
342: }
343:
344: for (i = 0; i < MAX_TRAPS; i++) {
345: traps[i].trap_type = NO_TRAP;
346: }
347: for (i = 0; i < DROWS; i++) {
348: for (j = 0; j < DCOLS; j++) {
349: dungeon[i][j] = NOTHING;
350: }
351: }
352: detect_monster = see_invisible = 0;
353: being_held = bear_trap = 0;
354: party_room = NO_ROOM;
355: rogue.row = rogue.col = -1;
356: clear();
357: }
358:
359: put_door(rm, dir, row, col)
360: room *rm;
361: short dir;
362: short *row, *col;
363: {
364: short wall_width;
365:
366: wall_width = (rm->is_room & R_MAZE) ? 0 : 1;
367:
368: switch(dir) {
369: case UPWARD:
370: case DOWN:
371: *row = ((dir == UPWARD) ? rm->top_row : rm->bottom_row);
372: do {
373: *col = get_rand(rm->left_col+wall_width,
374: rm->right_col-wall_width);
375: } while (!(dungeon[*row][*col] & (HORWALL | TUNNEL)));
376: break;
377: case RIGHT:
378: case LEFT:
379: *col = (dir == LEFT) ? rm->left_col : rm->right_col;
380: do {
381: *row = get_rand(rm->top_row+wall_width,
382: rm->bottom_row-wall_width);
383: } while (!(dungeon[*row][*col] & (VERTWALL | TUNNEL)));
384: break;
385: }
386: if (rm->is_room & R_ROOM) {
387: dungeon[*row][*col] = DOOR;
388: }
389: if ((cur_level > 2) && rand_percent(HIDE_PERCENT)) {
390: dungeon[*row][*col] |= HIDDEN;
391: }
392: rm->doors[dir/2].door_row = *row;
393: rm->doors[dir/2].door_col = *col;
394: }
395:
396: draw_simple_passage(row1, col1, row2, col2, dir)
397: short row1, col1, row2, col2, dir;
398: {
399: short i, middle, t;
400:
401: if ((dir == LEFT) || (dir == RIGHT)) {
402: if (col1 > col2) {
403: swap(row1, row2);
404: swap(col1, col2);
405: }
406: middle = get_rand(col1+1, col2-1);
407: for (i = col1+1; i != middle; i++) {
408: dungeon[row1][i] = TUNNEL;
409: }
410: for (i = row1; i != row2; i += (row1 > row2) ? -1 : 1) {
411: dungeon[i][middle] = TUNNEL;
412: }
413: for (i = middle; i != col2; i++) {
414: dungeon[row2][i] = TUNNEL;
415: }
416: } else {
417: if (row1 > row2) {
418: swap(row1, row2);
419: swap(col1, col2);
420: }
421: middle = get_rand(row1+1, row2-1);
422: for (i = row1+1; i != middle; i++) {
423: dungeon[i][col1] = TUNNEL;
424: }
425: for (i = col1; i != col2; i += (col1 > col2) ? -1 : 1) {
426: dungeon[middle][i] = TUNNEL;
427: }
428: for (i = middle; i != row2; i++) {
429: dungeon[i][col2] = TUNNEL;
430: }
431: }
432: if (rand_percent(HIDE_PERCENT)) {
433: hide_boxed_passage(row1, col1, row2, col2, 1);
434: }
435: }
436:
437: same_row(room1, room2)
438: {
439: return((room1 / 3) == (room2 / 3));
440: }
441:
442: same_col(room1, room2)
443: {
444: return((room1 % 3) == (room2 % 3));
445: }
446:
447: add_mazes()
448: {
449: short i, j;
450: short start;
451: short maze_percent;
452:
453: if (cur_level > 1) {
454: start = get_rand(0, (MAXROOMS-1));
455: maze_percent = (cur_level * 5) / 4;
456:
457: if (cur_level > 15) {
458: maze_percent += cur_level;
459: }
460: for (i = 0; i < MAXROOMS; i++) {
461: j = ((start + i) % MAXROOMS);
462: if (rooms[j].is_room & R_NOTHING) {
463: if (rand_percent(maze_percent)) {
464: rooms[j].is_room = R_MAZE;
465: make_maze(get_rand(rooms[j].top_row+1, rooms[j].bottom_row-1),
466: get_rand(rooms[j].left_col+1, rooms[j].right_col-1),
467: rooms[j].top_row, rooms[j].bottom_row,
468: rooms[j].left_col, rooms[j].right_col);
469: hide_boxed_passage(rooms[j].top_row, rooms[j].left_col,
470: rooms[j].bottom_row, rooms[j].right_col,
471: get_rand(0, 2));
472: }
473: }
474: }
475: }
476: }
477:
478: fill_out_level()
479: {
480: short i, rn;
481:
482: mix_random_rooms();
483:
484: r_de = NO_ROOM;
485:
486: for (i = 0; i < MAXROOMS; i++) {
487: rn = random_rooms[i];
488: if ((rooms[rn].is_room & R_NOTHING) ||
489: ((rooms[rn].is_room & R_CROSS) && coin_toss())) {
490: fill_it(rn, 1);
491: }
492: }
493: if (r_de != NO_ROOM) {
494: fill_it(r_de, 0);
495: }
496: }
497:
498: fill_it(rn, do_rec_de)
499: int rn;
500: boolean do_rec_de;
501: {
502: short i, tunnel_dir, door_dir, drow, dcol;
503: short target_room, rooms_found = 0;
504: short srow, scol, t;
505: static short offsets[4] = {-1, 1, 3, -3};
506: boolean did_this = 0;
507:
508: for (i = 0; i < 10; i++) {
509: srow = get_rand(0, 3);
510: scol = get_rand(0, 3);
511: t = offsets[srow];
512: offsets[srow] = offsets[scol];
513: offsets[scol] = t;
514: }
515: for (i = 0; i < 4; i++) {
516:
517: target_room = rn + offsets[i];
518:
519: if (((target_room < 0) || (target_room >= MAXROOMS)) ||
520: (!(same_row(rn,target_room) || same_col(rn,target_room))) ||
521: (!(rooms[target_room].is_room & (R_ROOM | R_MAZE)))) {
522: continue;
523: }
524: if (same_row(rn, target_room)) {
525: tunnel_dir = (rooms[rn].left_col < rooms[target_room].left_col) ?
526: RIGHT : LEFT;
527: } else {
528: tunnel_dir = (rooms[rn].top_row < rooms[target_room].top_row) ?
529: DOWN : UPWARD;
530: }
531: door_dir = ((tunnel_dir + 4) % DIRS);
532: if (rooms[target_room].doors[door_dir/2].oth_room != NO_ROOM) {
533: continue;
534: }
535: if (((!do_rec_de) || did_this) ||
536: (!mask_room(rn, &srow, &scol, TUNNEL))) {
537: srow = (rooms[rn].top_row + rooms[rn].bottom_row) / 2;
538: scol = (rooms[rn].left_col + rooms[rn].right_col) / 2;
539: }
540: put_door(&rooms[target_room], door_dir, &drow, &dcol);
541: rooms_found++;
542: draw_simple_passage(srow, scol, drow, dcol, tunnel_dir);
543: rooms[rn].is_room = R_DEADEND;
544: dungeon[srow][scol] = TUNNEL;
545:
546: if ((i < 3) && (!did_this)) {
547: did_this = 1;
548: if (coin_toss()) {
549: continue;
550: }
551: }
552: if ((rooms_found < 2) && do_rec_de) {
553: recursive_deadend(rn, offsets, srow, scol);
554: }
555: break;
556: }
557: }
558:
559: recursive_deadend(rn, offsets, srow, scol)
560: short rn;
561: short *offsets;
562: short srow, scol;
563: {
564: short i, de;
565: short drow, dcol, tunnel_dir;
566:
567: rooms[rn].is_room = R_DEADEND;
568: dungeon[srow][scol] = TUNNEL;
569:
570: for (i = 0; i < 4; i++) {
571: de = rn + offsets[i];
572: if (((de < 0) || (de >= MAXROOMS)) ||
573: (!(same_row(rn, de) || same_col(rn, de)))) {
574: continue;
575: }
576: if (!(rooms[de].is_room & R_NOTHING)) {
577: continue;
578: }
579: drow = (rooms[de].top_row + rooms[de].bottom_row) / 2;
580: dcol = (rooms[de].left_col + rooms[de].right_col) / 2;
581: if (same_row(rn, de)) {
582: tunnel_dir = (rooms[rn].left_col < rooms[de].left_col) ?
583: RIGHT : LEFT;
584: } else {
585: tunnel_dir = (rooms[rn].top_row < rooms[de].top_row) ?
586: DOWN : UPWARD;
587: }
588: draw_simple_passage(srow, scol, drow, dcol, tunnel_dir);
589: r_de = de;
590: recursive_deadend(de, offsets, drow, dcol);
591: }
592: }
593:
594: boolean
595: mask_room(rn, row, col, mask)
596: short rn;
597: short *row, *col;
598: unsigned short mask;
599: {
600: short i, j;
601:
602: for (i = rooms[rn].top_row; i <= rooms[rn].bottom_row; i++) {
603: for (j = rooms[rn].left_col; j <= rooms[rn].right_col; j++) {
604: if (dungeon[i][j] & mask) {
605: *row = i;
606: *col = j;
607: return(1);
608: }
609: }
610: }
611: return(0);
612: }
613:
614: make_maze(r, c, tr, br, lc, rc)
615: short r, c, tr, br, lc, rc;
616: {
617: char dirs[4];
618: short i, t;
619:
620: dirs[0] = UPWARD;
621: dirs[1] = DOWN;
622: dirs[2] = LEFT;
623: dirs[3] = RIGHT;
624:
625: dungeon[r][c] = TUNNEL;
626:
627: if (rand_percent(20)) {
628: for (i = 0; i < 10; i++) {
629: short t1, t2;
630:
631: t1 = get_rand(0, 3);
632: t2 = get_rand(0, 3);
633:
634: swap(dirs[t1], dirs[t2]);
635: }
636: }
637: for (i = 0; i < 4; i++) {
638: switch(dirs[i]) {
639: case UPWARD:
640: if (((r-1) >= tr) &&
641: (dungeon[r-1][c] != TUNNEL) &&
642: (dungeon[r-1][c-1] != TUNNEL) &&
643: (dungeon[r-1][c+1] != TUNNEL) &&
644: (dungeon[r-2][c] != TUNNEL)) {
645: make_maze((r-1), c, tr, br, lc, rc);
646: }
647: break;
648: case DOWN:
649: if (((r+1) <= br) &&
650: (dungeon[r+1][c] != TUNNEL) &&
651: (dungeon[r+1][c-1] != TUNNEL) &&
652: (dungeon[r+1][c+1] != TUNNEL) &&
653: (dungeon[r+2][c] != TUNNEL)) {
654: make_maze((r+1), c, tr, br, lc, rc);
655: }
656: break;
657: case LEFT:
658: if (((c-1) >= lc) &&
659: (dungeon[r][c-1] != TUNNEL) &&
660: (dungeon[r-1][c-1] != TUNNEL) &&
661: (dungeon[r+1][c-1] != TUNNEL) &&
662: (dungeon[r][c-2] != TUNNEL)) {
663: make_maze(r, (c-1), tr, br, lc, rc);
664: }
665: break;
666: case RIGHT:
667: if (((c+1) <= rc) &&
668: (dungeon[r][c+1] != TUNNEL) &&
669: (dungeon[r-1][c+1] != TUNNEL) &&
670: (dungeon[r+1][c+1] != TUNNEL) &&
671: (dungeon[r][c+2] != TUNNEL)) {
672: make_maze(r, (c+1), tr, br, lc, rc);
673: }
674: break;
675: }
676: }
677: }
678:
679: hide_boxed_passage(row1, col1, row2, col2, n)
680: short row1, col1, row2, col2, n;
681: {
682: short i, j, t;
683: short row, col, row_cut, col_cut;
684: short h, w;
685:
686: if (cur_level > 2) {
687: if (row1 > row2) {
688: swap(row1, row2);
689: }
690: if (col1 > col2) {
691: swap(col1, col2);
692: }
693: h = row2 - row1;
694: w = col2 - col1;
695:
696: if ((w >= 5) || (h >= 5)) {
697: row_cut = ((h >= 2) ? 1 : 0);
698: col_cut = ((w >= 2) ? 1 : 0);
699:
700: for (i = 0; i < n; i++) {
701: for (j = 0; j < 10; j++) {
702: row = get_rand(row1 + row_cut, row2 - row_cut);
703: col = get_rand(col1 + col_cut, col2 - col_cut);
704: if (dungeon[row][col] == TUNNEL) {
705: dungeon[row][col] |= HIDDEN;
706: break;
707: }
708: }
709: }
710: }
711: }
712: }
713:
714: put_player(nr)
715: short nr; /* try not to put in this room */
716: {
717: short rn = nr, misses;
718: short row, col;
719:
720: for (misses = 0; ((misses < 2) && (rn == nr)); misses++) {
721: gr_row_col(&row, &col, (FLOOR | TUNNEL | OBJECT | STAIRS));
722: rn = get_room_number(row, col);
723: }
724: rogue.row = row;
725: rogue.col = col;
726:
727: if (dungeon[rogue.row][rogue.col] & TUNNEL) {
728: cur_room = PASSAGE;
729: } else {
730: cur_room = rn;
731: }
732: if (cur_room != PASSAGE) {
733: light_up_room(cur_room);
734: } else {
735: light_passage(rogue.row, rogue.col);
736: }
737: rn = get_room_number(rogue.row, rogue.col);
738: wake_room(rn, 1, rogue.row, rogue.col);
739: if (new_level_message) {
740: message(new_level_message, 0);
741: new_level_message = 0;
742: }
743: mvaddch(rogue.row, rogue.col, rogue.fchar);
744: }
745:
746: drop_check()
747: {
748: if (wizard) {
749: return(1);
750: }
751: if (dungeon[rogue.row][rogue.col] & STAIRS) {
752: if (levitate) {
753: message("you're floating in the air!", 0);
754: return(0);
755: }
756: return(1);
757: }
758: message("I see no way down", 0);
759: return(0);
760: }
761:
762: check_up()
763: {
764: if (!wizard) {
765: if (!(dungeon[rogue.row][rogue.col] & STAIRS)) {
766: message("I see no way up", 0);
767: return(0);
768: }
769: if (!has_amulet()) {
770: message("your way is magically blocked", 0);
771: return(0);
772: }
773: }
774: new_level_message = "you feel a wrenching sensation in your gut";
775: if (cur_level == 1) {
776: win();
777: } else {
778: cur_level -= 2;
779: return(1);
780: }
781: return(0);
782: }
783:
784: add_exp(e, promotion)
785: int e;
786: boolean promotion;
787: {
788: char mbuf[40];
789: short new_exp;
790: short i, hp;
791:
792: rogue.exp_points += e;
793:
794: if (rogue.exp_points >= level_points[rogue.exp-1]) {
795: new_exp = get_exp_level(rogue.exp_points);
796: if (rogue.exp_points > MAX_EXP) {
797: rogue.exp_points = MAX_EXP + 1;
798: }
799: for (i = rogue.exp+1; i <= new_exp; i++) {
800: sprintf(mbuf, "welcome to level %d", i);
801: message(mbuf, 0);
802: if (promotion) {
803: hp = hp_raise();
804: rogue.hp_current += hp;
805: rogue.hp_max += hp;
806: }
807: rogue.exp = i;
808: print_stats(STAT_HP | STAT_EXP);
809: }
810: } else {
811: print_stats(STAT_EXP);
812: }
813: }
814:
815: get_exp_level(e)
816: long e;
817: {
818: short i;
819:
820: for (i = 0; i < (MAX_EXP_LEVEL - 1); i++) {
821: if (level_points[i] > e) {
822: break;
823: }
824: }
825: return(i+1);
826: }
827:
828: hp_raise()
829: {
830: int hp;
831:
832: hp = (wizard ? 10 : get_rand(3, 10));
833: return(hp);
834: }
835:
836: show_average_hp()
837: {
838: char mbuf[80];
839: float real_average;
840: float effective_average;
841:
842: if (rogue.exp == 1) {
843: real_average = effective_average = 0.00;
844: } else {
845: real_average = (float)
846: ((rogue.hp_max - extra_hp - INIT_HP) + less_hp) / (rogue.exp - 1);
847: effective_average = (float) (rogue.hp_max - INIT_HP) / (rogue.exp - 1);
848:
849: }
850: sprintf(mbuf, "R-Hp: %.2f, E-Hp: %.2f (!: %d, V: %d)", real_average,
851: effective_average, extra_hp, less_hp);
852: message(mbuf, 0);
853: }
854:
855: mix_random_rooms()
856: {
857: short i, t;
858: short x, y;
859:
860: for (i = 0; i < (3 * MAXROOMS); i++) {
861: do {
862: x = get_rand(0, (MAXROOMS-1));
863: y = get_rand(0, (MAXROOMS-1));
864: } while (x == y);
865: swap(random_rooms[x], random_rooms[y]);
866: }
867: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.