Annotation of early-roguelike/arogue5/command.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: * Read and execute the user commands
! 3: *
! 4: * Advanced Rogue
! 5: * Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
! 6: * All rights reserved.
! 7: *
! 8: * Based on "Rogue: Exploring the Dungeons of Doom"
! 9: * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
! 10: * All rights reserved.
! 11: *
! 12: * See the file LICENSE.TXT for full copyright and licensing information.
! 13: */
! 14:
! 15: #include "curses.h"
! 16: #include <stdlib.h>
! 17: #include <string.h>
! 18: #include <limits.h>
! 19: #include <ctype.h>
! 20: #include <signal.h>
! 21: #include "rogue.h"
! 22: #include "mach_dep.h"
! 23:
! 24: void help(void);
! 25: void identify(void);
! 26: void d_level(void);
! 27: void u_level(void);
! 28: void shell(void);
! 29: void call(bool mark);
! 30:
! 31: /*
! 32: * command:
! 33: * Process the user commands
! 34: */
! 35:
! 36: void
! 37: command(void)
! 38: {
! 39: register char ch;
! 40: register int ntimes = 1; /* Number of player moves */
! 41: static char countch, direction, newcount = FALSE;
! 42: struct linked_list *item;
! 43: bool an_after = FALSE;
! 44:
! 45: if (on(player, ISHASTE)) {
! 46: ntimes++;
! 47: turns--; /* correct for later */
! 48: }
! 49: if (on(player, ISSLOW) || on(player, ISDANCE)) {
! 50: if (player.t_turn != TRUE) {
! 51: ntimes--;
! 52: turns++;
! 53: an_after = TRUE;
! 54: }
! 55: player.t_turn ^= TRUE;
! 56: }
! 57:
! 58: /*
! 59: * Let the daemons start up
! 60: */
! 61: do_daemons(BEFORE);
! 62: do_fuses(BEFORE);
! 63: while (ntimes-- > 0)
! 64: {
! 65: /* One more tick of the clock. */
! 66: if ((++turns % DAYLENGTH) == 0) {
! 67: daytime ^= TRUE;
! 68: if (levtype == OUTSIDE) {
! 69: if (daytime) msg("The sun rises above the horizon");
! 70: else msg("The sun sinks below the horizon");
! 71: }
! 72: light(&hero);
! 73: }
! 74:
! 75: look(after, FALSE);
! 76: if (!running) door_stop = FALSE;
! 77: lastscore = purse;
! 78: wmove(cw, hero.y, hero.x);
! 79: if (!((running || count) && jump)) {
! 80: status(FALSE);
! 81: wmove(cw, hero.y, hero.x);
! 82: draw(cw); /* Draw screen */
! 83: }
! 84: take = 0;
! 85: after = TRUE;
! 86: /*
! 87: * Read command or continue run
! 88: */
! 89: if (!no_command)
! 90: {
! 91: if (running) {
! 92: /* If in a corridor or maze, if we are at a turn with only one
! 93: * way to go, turn that way.
! 94: */
! 95: if ((winat(hero.y, hero.x) == PASSAGE || levtype == MAZELEV) &&
! 96: off(player, ISHUH) && (off(player, ISBLIND))) {
! 97: int y, x;
! 98: if (getdelta(runch, &y, &x) == TRUE) {
! 99: corr_move(y, x);
! 100: }
! 101: }
! 102: ch = runch;
! 103: }
! 104: else if (count) ch = countch;
! 105: else
! 106: {
! 107: ch = readchar();
! 108: if (mpos != 0 && !running) /* Erase message if its there */
! 109: msg("");
! 110: }
! 111: }
! 112: else ch = '.';
! 113: if (no_command)
! 114: {
! 115: if (--no_command == 0)
! 116: msg("You can move again.");
! 117: }
! 118: else
! 119: {
! 120: /*
! 121: * check for prefixes
! 122: */
! 123: if (isdigit(ch))
! 124: {
! 125: count = 0;
! 126: newcount = TRUE;
! 127: while (isdigit(ch))
! 128: {
! 129: count = count * 10 + (ch - '0');
! 130: if (count > 255)
! 131: count = 255;
! 132: ch = readchar();
! 133: }
! 134: countch = ch;
! 135: /*
! 136: * turn off count for commands which don't make sense
! 137: * to repeat
! 138: */
! 139: switch (ch) {
! 140: case 'h': case 'j': case 'k': case 'l':
! 141: case 'y': case 'u': case 'b': case 'n':
! 142: case 'H': case 'J': case 'K': case 'L':
! 143: case 'Y': case 'U': case 'B': case 'N':
! 144: case 'q': case 'r': case 's': case 'f':
! 145: case 't': case 'C': case 'I': case '.':
! 146: case 'z': case 'p':
! 147: break;
! 148: default:
! 149: count = 0;
! 150: }
! 151: }
! 152:
! 153: /* Save current direction */
! 154: if (!running) /* If running, it is already saved */
! 155: switch (ch) {
! 156: case 'h': case 'j': case 'k': case 'l':
! 157: case 'y': case 'u': case 'b': case 'n':
! 158: case 'H': case 'J': case 'K': case 'L':
! 159: case 'Y': case 'U': case 'B': case 'N':
! 160: runch = tolower(ch);
! 161: }
! 162:
! 163: /* Perform the action */
! 164: switch (ch) {
! 165: case 'f':
! 166: if (!on(player, ISBLIND))
! 167: {
! 168: door_stop = TRUE;
! 169: firstmove = TRUE;
! 170: }
! 171: if (count && !newcount)
! 172: ch = direction;
! 173: else
! 174: ch = readchar();
! 175: switch (ch)
! 176: {
! 177: case 'h': case 'j': case 'k': case 'l':
! 178: case 'y': case 'u': case 'b': case 'n':
! 179: ch = toupper(ch);
! 180: }
! 181: direction = ch;
! 182: }
! 183: newcount = FALSE;
! 184: /*
! 185: * execute a command
! 186: */
! 187: if (count && !running)
! 188: count--;
! 189: switch (ch)
! 190: {
! 191: case '!' : shell();
! 192: when 'h' : do_move(0, -1);
! 193: when 'j' : do_move(1, 0);
! 194: when 'k' : do_move(-1, 0);
! 195: when 'l' : do_move(0, 1);
! 196: when 'y' : do_move(-1, -1);
! 197: when 'u' : do_move(-1, 1);
! 198: when 'b' : do_move(1, -1);
! 199: when 'n' : do_move(1, 1);
! 200: when 'H' : do_run('h');
! 201: when 'J' : do_run('j');
! 202: when 'K' : do_run('k');
! 203: when 'L' : do_run('l');
! 204: when 'Y' : do_run('y');
! 205: when 'U' : do_run('u');
! 206: when 'B' : do_run('b');
! 207: when 'N' : do_run('n');
! 208: when 't':
! 209: if((item=get_item(pack,"throw", ALL)) != NULL && get_dir())
! 210: missile(delta.y, delta.x, item, &player);
! 211: else
! 212: after = FALSE;
! 213: when 'Q' : after = FALSE; quit(-1);
! 214: when 'i' : after = FALSE; inventory(pack, ALL);
! 215: when 'I' : after = FALSE; picky_inven();
! 216: when 'd' : drop(NULL);
! 217: when 'P' : grab(hero.y, hero.x);
! 218: when 'q' : quaff(-1, 0, TRUE);
! 219: when 'r' : read_scroll(-1, 0, TRUE);
! 220: when 'e' : eat();
! 221: when 'w' : wield();
! 222: when 'W' : wear();
! 223: when 'T' : take_off();
! 224: when 'o' : option();
! 225: when 'c' : call(FALSE);
! 226: when 'm' : call(TRUE);
! 227: when '>' : after = FALSE; d_level();
! 228: when '<' : after = FALSE; u_level();
! 229: when '?' : after = FALSE; help();
! 230: when '/' : after = FALSE; identify();
! 231: when CTRL('U') : use_mm(-1);
! 232: when CTRL('T') :
! 233: if (get_dir()) steal();
! 234: else after = FALSE;
! 235: when 'D' : dip_it();
! 236: when 'G' : gsense();
! 237: when '^' : set_trap(&player, hero.y, hero.x);
! 238: when 's' : search(FALSE, FALSE);
! 239: when 'z' : if (!do_zap(TRUE, 0, FALSE))
! 240: after=FALSE;
! 241: when 'p' : pray();
! 242: when 'C' : cast();
! 243: when 'a' :
! 244: if (get_dir())
! 245: affect();
! 246: else after = FALSE;
! 247: when 'v' : after = FALSE;
! 248: msg("Advanced Rogue Version %s.",
! 249: release);
! 250: when CTRL('L') : after = FALSE; clearok(curscr, TRUE);
! 251: touchwin(cw); /* MMMMMMMMMM */
! 252: when CTRL('R') : after = FALSE; msg(huh);
! 253: when 'S' :
! 254: after = FALSE;
! 255: if (save_game())
! 256: {
! 257: wclear(cw);
! 258: draw(cw);
! 259: endwin();
! 260: printf("\n");
! 261: exit(0);
! 262: }
! 263: when '.' : ; /* Rest command */
! 264: when ' ' : after = FALSE; /* Do Nothing */
! 265: #ifdef WIZARD
! 266: when CTRL('P') :
! 267: after = FALSE;
! 268: if (wizard)
! 269: {
! 270: wizard = FALSE;
! 271: trader = 0;
! 272: msg("Not wizard any more");
! 273: }
! 274: else
! 275: {
! 276: if (waswizard || passwd())
! 277: {
! 278: msg("Welcome, oh mighty wizard.");
! 279: wizard = waswizard = TRUE;
! 280: }
! 281: else
! 282: msg("Sorry");
! 283: }
! 284: #endif
! 285: when ESCAPE : /* Escape */
! 286: door_stop = FALSE;
! 287: count = 0;
! 288: after = FALSE;
! 289: when '#':
! 290: if (levtype == POSTLEV) /* buy something */
! 291: buy_it();
! 292: after = FALSE;
! 293: when '$':
! 294: if (levtype == POSTLEV) /* price something */
! 295: price_it();
! 296: after = FALSE;
! 297: when '%':
! 298: if (levtype == POSTLEV) /* sell something */
! 299: sell_it();
! 300: after = FALSE;
! 301: otherwise :
! 302: after = FALSE;
! 303: #ifdef WIZARD
! 304: if (wizard) switch (ch)
! 305: {
! 306: case 'M' : create_obj(TRUE, 0, 0);
! 307: when CTRL('W') : wanderer();
! 308: when CTRL('I') : inventory(lvl_obj, ALL);
! 309: when CTRL('Z') : whatis(NULL);
! 310: when CTRL('D') : level++; new_level(NORMLEV);
! 311: when CTRL('F') : overlay(stdscr,cw);
! 312: when CTRL('X') : overlay(mw,cw);
! 313: when CTRL('J') : teleport();
! 314: when CTRL('E') : sprintf(outstring,"food left: %d\tfood level: %d",
! 315: food_left, foodlev);
! 316: msg(outstring);
! 317: when CTRL('A') : activity();
! 318: when CTRL('C') :
! 319: {
! 320: int tlev;
! 321: prbuf[0] = '\0';
! 322: msg("Which level? ");
! 323: if(get_str(prbuf, msgw) == NORM) {
! 324: tlev = atoi(prbuf);
! 325: if(tlev < 1) {
! 326: mpos = 0;
! 327: msg("Illegal level.");
! 328: }
! 329: else if (tlev > 199) {
! 330: levtype = MAZELEV;
! 331: level = tlev - 200 + 1;
! 332: }
! 333: else if (tlev > 99) {
! 334: levtype = POSTLEV;
! 335: level = tlev - 100 + 1;
! 336: }
! 337: else {
! 338: levtype = NORMLEV;
! 339: level = tlev;
! 340: }
! 341: new_level(levtype);
! 342: }
! 343: }
! 344: when CTRL('N') :
! 345: {
! 346: if ((item=get_item(pack, "charge", STICK)) != NULL){
! 347: (OBJPTR(item))->o_charges=10000;
! 348: }
! 349: }
! 350: when CTRL('H') :
! 351: {
! 352: register int i;
! 353: register struct object *obj;
! 354:
! 355: for (i = 0; i < 9; i++)
! 356: raise_level(TRUE);
! 357: /*
! 358: * Give the rogue a sword
! 359: */
! 360: if(cur_weapon==NULL || cur_weapon->o_type!=RELIC) {
! 361: item = spec_item(WEAPON, TWOSWORD, 5, 5);
! 362: add_pack(item, TRUE, NULL);
! 363: cur_weapon = OBJPTR(item);
! 364: cur_weapon->o_flags |= (ISKNOW | ISPROT);
! 365: }
! 366: /*
! 367: * And his suit of armor
! 368: */
! 369: if (player.t_ctype == C_THIEF)
! 370: item = spec_item(ARMOR, STUDDED_LEATHER, 10, 0);
! 371: else
! 372: item = spec_item(ARMOR, PLATE_ARMOR, 7, 0);
! 373: obj = OBJPTR(item);
! 374: obj->o_flags |= (ISKNOW | ISPROT);
! 375: obj->o_weight = armors[PLATE_ARMOR].a_wght;
! 376: cur_armor = obj;
! 377: add_pack(item, TRUE, NULL);
! 378: purse += 20000;
! 379: }
! 380: otherwise :
! 381: msg("Illegal command '%s'.", unctrl(ch));
! 382: count = 0;
! 383: }
! 384: else
! 385: #endif
! 386: {
! 387: msg("Illegal command '%s'.", unctrl(ch));
! 388: count = 0;
! 389: after = FALSE;
! 390: }
! 391: }
! 392: /*
! 393: * turn off flags if no longer needed
! 394: */
! 395: if (!running)
! 396: door_stop = FALSE;
! 397: }
! 398: /*
! 399: * If he ran into something to take, let him pick it up.
! 400: * unless its a trading post
! 401: */
! 402: if (auto_pickup && take != 0 && levtype != POSTLEV)
! 403: pick_up(take);
! 404: if (!running)
! 405: door_stop = FALSE;
! 406:
! 407: /* If after is true, mark an_after as true so that if
! 408: * we are hasted, the first "after" will be noted.
! 409: * if after is FALSE then stay in this loop
! 410: */
! 411: if (after) an_after = TRUE;
! 412: else ntimes++;
! 413: }
! 414:
! 415: /*
! 416: * Kick off the rest if the daemons and fuses
! 417: */
! 418: if (an_after)
! 419: {
! 420: /*
! 421: * If player is infested, take off a hit point
! 422: */
! 423: if (on(player, HASINFEST)) {
! 424: if ((pstats.s_hpt -= infest_dam) <= 0) death(D_INFESTATION);
! 425: }
! 426: /*
! 427: * if player has body rot then take off five hits
! 428: */
! 429: if (on(player, DOROT)) {
! 430: if ((pstats.s_hpt -= 5) <= 0) death(D_ROT);
! 431: }
! 432: do_daemons(AFTER);
! 433: do_fuses(AFTER);
! 434: if (!((running || count) && jump)) look(FALSE, FALSE);
! 435:
! 436:
! 437: }
! 438: t_free_list(monst_dead);
! 439: }
! 440:
! 441: /*
! 442: * quit:
! 443: * Have player make certain, then exit.
! 444: */
! 445:
! 446: void
! 447: quit(int sig)
! 448: {
! 449: NOOP(sig);
! 450:
! 451: /*
! 452: * Reset the signal in case we got here via an interrupt
! 453: */
! 454: if (signal(SIGINT, &quit) != &quit)
! 455: mpos = 0;
! 456: msg("Really quit? ");
! 457: draw(cw);
! 458: if (readchar() == 'y')
! 459: {
! 460: clear();
! 461: move(LINES-1, 0);
! 462: draw(stdscr);
! 463: writelog(pstats.s_exp + (long) purse, CHICKEN, 0);
! 464: score(pstats.s_exp + (long) purse, CHICKEN, 0);
! 465: exit(0);
! 466: }
! 467: else
! 468: {
! 469: signal(SIGINT, quit);
! 470: wmove(cw, 0, 0);
! 471: wclrtoeol(cw);
! 472: status(FALSE);
! 473: draw(cw);
! 474: mpos = 0;
! 475: count = 0;
! 476: running = FALSE;
! 477: }
! 478: }
! 479:
! 480: /*
! 481: * bugkill:
! 482: * killed by a program bug instead of voluntarily.
! 483: */
! 484:
! 485: void
! 486: bugkill(int sig)
! 487: {
! 488: signal(sig, quit); /* If we get it again, give up */
! 489: death(D_SIGNAL); /* Killed by a bug */
! 490: }
! 491:
! 492:
! 493: /*
! 494: * search:
! 495: * Player gropes about him to find hidden things.
! 496: */
! 497:
! 498: void
! 499: search(bool is_thief, bool door_chime)
! 500: {
! 501: register int x, y;
! 502: register char ch, /* The trap or door character */
! 503: sch, /* Trap or door character (as seen on screen) */
! 504: mch; /* Monster, if a monster is on the trap or door */
! 505: register struct linked_list *item;
! 506: register struct thing *mp; /* Status on surrounding monster */
! 507:
! 508: /*
! 509: * Look all around the hero, if there is something hidden there,
! 510: * give him a chance to find it. If its found, display it.
! 511: */
! 512: if (on(player, ISBLIND))
! 513: return;
! 514: for (x = hero.x - 1; x <= hero.x + 1; x++)
! 515: for (y = hero.y - 1; y <= hero.y + 1; y++)
! 516: {
! 517: if (y==hero.y && x==hero.x)
! 518: continue;
! 519:
! 520: /* Mch and ch will be the same unless there is a monster here */
! 521: mch = CCHAR( winat(y, x) );
! 522: ch = CCHAR( mvwinch(stdscr, y, x) );
! 523: sch = CCHAR( mvwinch(cw, y, x) ); /* What's on the screen */
! 524:
! 525: if (door_chime == FALSE && isatrap(ch)) {
! 526: register struct trap *tp;
! 527:
! 528: /* Is there a monster on the trap? */
! 529: if (mch != ch && (item = find_mons(y, x)) != NULL) {
! 530: mp = THINGPTR(item);
! 531: if (sch == mch) sch = mp->t_oldch;
! 532: }
! 533: else mp = NULL;
! 534:
! 535: /*
! 536: * is this one found already?
! 537: */
! 538: if (isatrap(sch))
! 539: continue; /* give him chance for other traps */
! 540: tp = trap_at(y, x);
! 541: /*
! 542: * if the thief set it then don't display it.
! 543: * if its not a thief he has 50/50 shot
! 544: */
! 545: if((tp->tr_flags&ISTHIEFSET) || (!is_thief && rnd(100)>50))
! 546: continue; /* give him chance for other traps */
! 547: tp->tr_flags |= ISFOUND;
! 548:
! 549: /* Let's update the screen */
! 550: if (mp != NULL && CCHAR(mvwinch(cw, y, x)) == mch)
! 551: mp->t_oldch = ch; /* Will change when monst moves */
! 552: else mvwaddch(cw, y, x, ch);
! 553:
! 554: count = 0;
! 555: running = FALSE;
! 556: msg(tr_name(tp->tr_type));
! 557: }
! 558: else if (ch == SECRETDOOR) {
! 559: if (door_chime == TRUE || (!is_thief && rnd(100) < 20)) {
! 560: /* Is there a monster on the door? */
! 561: if (mch != ch && (item = find_mons(y, x)) != NULL) {
! 562: mp = THINGPTR(item);
! 563:
! 564: /* Screen will change when monster moves */
! 565: if (sch == mch) mp->t_oldch = ch;
! 566: }
! 567: mvaddch(y, x, DOOR);
! 568: count = 0;
! 569: }
! 570: }
! 571: }
! 572: }
! 573:
! 574:
! 575: /*
! 576: * help:
! 577: * Give single character help, or the whole mess if he wants it
! 578: */
! 579:
! 580: void
! 581: help(void)
! 582: {
! 583: register struct h_list *strp = helpstr;
! 584: #ifdef WIZARD
! 585: struct h_list *wizp = wiz_help;
! 586: #endif
! 587: register char helpch;
! 588: register int cnt;
! 589:
! 590: msg("Character you want help for (* for all): ");
! 591: helpch = readchar();
! 592: mpos = 0;
! 593: /*
! 594: * If its not a *, print the right help string
! 595: * or an error if he typed a funny character.
! 596: */
! 597: if (helpch != '*') {
! 598: wmove(cw, 0, 0);
! 599: while (strp->h_ch) {
! 600: if (strp->h_ch == helpch) {
! 601: sprintf(outstring,"%s%s", unctrl(strp->h_ch), strp->h_desc);
! 602: msg(outstring);
! 603: return;
! 604: }
! 605: strp++;
! 606: }
! 607: #ifdef WIZARD
! 608: if (wizard) {
! 609: while (wizp->h_ch) {
! 610: if (wizp->h_ch == helpch) {
! 611: sprintf(outstring,"%s%s", unctrl(wizp->h_ch), wizp->h_desc);
! 612: msg(outstring);
! 613: return;
! 614: }
! 615: wizp++;
! 616: }
! 617: }
! 618: #endif
! 619:
! 620: msg("Unknown character '%s'", unctrl(helpch));
! 621: return;
! 622: }
! 623: /*
! 624: * Here we print help for everything.
! 625: * Then wait before we return to command mode
! 626: */
! 627: wclear(hw);
! 628: cnt = 0;
! 629: while (strp->h_ch) {
! 630: mvwaddstr(hw, cnt % 23, cnt > 22 ? 40 : 0, unctrl(strp->h_ch));
! 631: waddstr(hw, strp->h_desc);
! 632: strp++;
! 633: if (++cnt >= 46 && strp->h_ch) {
! 634: wmove(hw, LINES-1, 0);
! 635: wprintw(hw, morestr);
! 636: draw(hw);
! 637: wait_for(hw,' ');
! 638: wclear(hw);
! 639: cnt = 0;
! 640: }
! 641: }
! 642: #ifdef WIZARD
! 643: if (wizard) {
! 644: while (wizp->h_ch) {
! 645: mvwaddstr(hw, cnt % 23, cnt > 22 ? 40 : 0, unctrl(wizp->h_ch));
! 646: waddstr(hw, wizp->h_desc);
! 647: wizp++;
! 648: if (++cnt >= 46 && wizp->h_ch) {
! 649: wmove(hw, LINES-1, 0);
! 650: wprintw(hw, morestr);
! 651: draw(hw);
! 652: wait_for(hw,' ');
! 653: wclear(hw);
! 654: cnt = 0;
! 655: }
! 656: }
! 657: }
! 658: #endif
! 659: wmove(hw, LINES-1, 0);
! 660: wprintw(hw, spacemsg);
! 661: draw(hw);
! 662: wait_for(hw,' ');
! 663: wclear(hw);
! 664: draw(hw);
! 665: wmove(cw, 0, 0);
! 666: wclrtoeol(cw);
! 667: status(FALSE);
! 668: touchwin(cw);
! 669: }
! 670: /*
! 671: * identify:
! 672: * Tell the player what a certain thing is.
! 673: */
! 674:
! 675: void
! 676: identify(void)
! 677: {
! 678: register char ch;
! 679: const char *str;
! 680:
! 681: msg("What do you want identified? ");
! 682: ch = readchar();
! 683: mpos = 0;
! 684: if (ch == ESCAPE)
! 685: {
! 686: msg("");
! 687: return;
! 688: }
! 689: if (isalpha(ch))
! 690: str = monsters[id_monst(ch)].m_name;
! 691: else switch(ch)
! 692: {
! 693: case '|':
! 694: case '-':
! 695: str = (levtype == OUTSIDE) ? "boundary of sector"
! 696: : "wall of a room";
! 697: when GOLD: str = "gold";
! 698: when STAIRS : str = (levtype == OUTSIDE) ? "entrance to a dungeon"
! 699: : "passage leading down";
! 700: when DOOR: str = "door";
! 701: when FLOOR: str = (levtype == OUTSIDE) ? "meadow" : "room floor";
! 702: when VPLAYER: str = "the hero of the game ---> you";
! 703: when IPLAYER: str = "you (but invisible)";
! 704: when PASSAGE: str = "passage";
! 705: when POST: str = "trading post";
! 706: when POOL: str = (levtype == OUTSIDE) ? "lake"
! 707: : "a shimmering pool";
! 708: when TRAPDOOR: str = "trapdoor";
! 709: when ARROWTRAP: str = "arrow trap";
! 710: when SLEEPTRAP: str = "sleeping gas trap";
! 711: when BEARTRAP: str = "bear trap";
! 712: when TELTRAP: str = "teleport trap";
! 713: when DARTTRAP: str = "dart trap";
! 714: when MAZETRAP: str = "entrance to a maze";
! 715: when FOREST: str = "forest";
! 716: when POTION: str = "potion";
! 717: when SCROLL: str = "scroll";
! 718: when FOOD: str = "food";
! 719: when WEAPON: str = "weapon";
! 720: when ' ' : str = "solid rock";
! 721: when ARMOR: str = "armor";
! 722: when MM: str = "miscellaneous magic";
! 723: when RING: str = "ring";
! 724: when STICK: str = "wand or staff";
! 725: when SECRETDOOR:str = "secret door";
! 726: when RELIC: str = "artifact";
! 727: otherwise: str = "unknown character";
! 728: }
! 729: sprintf(outstring,"'%s' : %s", unctrl(ch), str);
! 730: msg(outstring);
! 731: }
! 732:
! 733: /*
! 734: * d_level:
! 735: * He wants to go down a level
! 736: */
! 737:
! 738: void
! 739: d_level(void)
! 740: {
! 741: bool no_phase=FALSE;
! 742:
! 743:
! 744: /* If we are at a top-level trading post, we probably can't go down */
! 745: if (levtype == POSTLEV && level == 0 && rnd(100) < 80) {
! 746: msg("I see no way down.");
! 747: return;
! 748: }
! 749:
! 750: if (winat(hero.y, hero.x) != STAIRS) {
! 751: if (off(player, CANINWALL) || /* Must use stairs if can't phase */
! 752: (levtype == OUTSIDE && rnd(100) < 90)) {
! 753: msg("I see no way down.");
! 754: return;
! 755: }
! 756:
! 757: /* Is there any dungeon left below? */
! 758: if (level >= nfloors) {
! 759: msg("There is only solid rock below.");
! 760: return;
! 761: }
! 762:
! 763: extinguish(unphase); /* Using phase to go down gets rid of it */
! 764: no_phase = TRUE;
! 765: }
! 766:
! 767: /* Is this the bottom? */
! 768: if (level >= nfloors) {
! 769: msg("The stairway only goes up.");
! 770: return;
! 771: }
! 772:
! 773: level++;
! 774: new_level(NORMLEV);
! 775: if (no_phase) unphase();
! 776: }
! 777:
! 778: /*
! 779: * u_level:
! 780: * He wants to go up a level
! 781: */
! 782:
! 783: void
! 784: u_level(void)
! 785: {
! 786: bool no_phase = FALSE;
! 787: register struct linked_list *item;
! 788: struct thing *tp;
! 789: struct object *obj;
! 790:
! 791: if (winat(hero.y, hero.x) != STAIRS) {
! 792: if (off(player, CANINWALL)) { /* Must use stairs if can't phase */
! 793: msg("I see no way up.");
! 794: return;
! 795: }
! 796:
! 797: extinguish(unphase);
! 798: no_phase = TRUE;
! 799: }
! 800:
! 801: if (level == 0) {
! 802: msg("The stairway only goes down.");
! 803: return;
! 804: }
! 805:
! 806: /*
! 807: * does he have the item he was quested to get?
! 808: */
! 809: if (level == 1) {
! 810: for (item = pack; item != NULL; item = next(item)) {
! 811: obj = OBJPTR(item);
! 812: if (obj->o_type == RELIC && obj->o_which == quest_item)
! 813: total_winner();
! 814: }
! 815: }
! 816: /*
! 817: * check to see if he trapped a UNIQUE, If he did then put it back
! 818: * in the monster table for next time
! 819: */
! 820: for (item = tlist; item != NULL; item = next(item)) {
! 821: tp = THINGPTR(item);
! 822: if (on(*tp, ISUNIQUE))
! 823: monsters[tp->t_index].m_normal = TRUE;
! 824: }
! 825: t_free_list(tlist); /* Monsters that fell below are long gone! */
! 826:
! 827: if (levtype != POSTLEV) level--;
! 828: if (level > 0) new_level(NORMLEV);
! 829: else {
! 830: level = -1; /* Indicate that we are new to the outside */
! 831: new_level(OUTSIDE); /* Leaving the dungeon */
! 832: msg("You emerge into the %s", daytime ? "light" : "night");
! 833: }
! 834:
! 835: if (no_phase) unphase();
! 836: }
! 837:
! 838: /*
! 839: * Let him escape for a while
! 840: */
! 841:
! 842: void
! 843: shell(void)
! 844: {
! 845: /*
! 846: * Set the terminal back to original mode
! 847: */
! 848: wclear(hw);
! 849: wmove(hw, LINES-1, 0);
! 850: draw(hw);
! 851: endwin();
! 852: in_shell = TRUE;
! 853: fflush(stdout);
! 854:
! 855: md_shellescape();
! 856:
! 857: printf(retstr);
! 858: fflush(stdout);
! 859: nonl();
! 860: noecho();
! 861: raw();
! 862: keypad(cw,1);
! 863: in_shell = FALSE;
! 864: wait_for(hw,'\n');
! 865: clearok(cw, TRUE);
! 866: touchwin(cw);
! 867: wmove(cw,0,0);
! 868: draw(cw);
! 869: }
! 870:
! 871: /*
! 872: * allow a user to call a potion, scroll, or ring something
! 873: */
! 874: void
! 875: call(bool mark)
! 876: {
! 877: register struct object *obj;
! 878: register struct linked_list *item;
! 879: register char **guess = NULL, *elsewise = NULL;
! 880: register bool *know;
! 881:
! 882: if (mark) item = get_item(pack, "mark", ALL);
! 883: else item = get_item(pack, "call", CALLABLE);
! 884: /*
! 885: * Make certain that it is somethings that we want to wear
! 886: */
! 887: if (item == NULL)
! 888: return;
! 889: obj = OBJPTR(item);
! 890: switch (obj->o_type)
! 891: {
! 892: case RING:
! 893: guess = r_guess;
! 894: know = r_know;
! 895: elsewise = (r_guess[obj->o_which] != NULL ?
! 896: r_guess[obj->o_which] : r_stones[obj->o_which]);
! 897: when POTION:
! 898: guess = p_guess;
! 899: know = p_know;
! 900: elsewise = (p_guess[obj->o_which] != NULL ?
! 901: p_guess[obj->o_which] : p_colors[obj->o_which]);
! 902: when SCROLL:
! 903: guess = s_guess;
! 904: know = s_know;
! 905: elsewise = (s_guess[obj->o_which] != NULL ?
! 906: s_guess[obj->o_which] : s_names[obj->o_which]);
! 907: when STICK:
! 908: guess = ws_guess;
! 909: know = ws_know;
! 910: elsewise = (ws_guess[obj->o_which] != NULL ?
! 911: ws_guess[obj->o_which] : ws_made[obj->o_which]);
! 912: when MM:
! 913: guess = m_guess;
! 914: know = m_know;
! 915: elsewise = (m_guess[obj->o_which] != NULL ?
! 916: m_guess[obj->o_which] : "nothing");
! 917: otherwise:
! 918: if (!mark) {
! 919: msg("You can't call that anything.");
! 920: return;
! 921: }
! 922: else know = (bool *) 0;
! 923: }
! 924: if ((obj->o_flags & ISPOST) || (know && know[obj->o_which]) && !mark) {
! 925: msg("That has already been identified.");
! 926: return;
! 927: }
! 928: if (mark) {
! 929: if (obj->o_mark[0]) {
! 930: addmsg(terse ? "M" : "Was m");
! 931: msg("arked \"%s\"", obj->o_mark);
! 932: }
! 933: msg(terse ? "Mark it: " : "What do you want to mark it? ");
! 934: prbuf[0] = '\0';
! 935: }
! 936: else {
! 937: addmsg(terse ? "C" : "Was c");
! 938: msg("alled \"%s\"", elsewise);
! 939: msg(terse ? "Call it: " : "What do you want to call it? ");
! 940: if (guess[obj->o_which] != NULL)
! 941: free(guess[obj->o_which]);
! 942: strcpy(prbuf, elsewise);
! 943: }
! 944: if (get_str(prbuf, msgw) == NORM) {
! 945: if (mark) {
! 946: strncpy(obj->o_mark, prbuf, MARKLEN-1);
! 947: obj->o_mark[MARKLEN-1] = '\0';
! 948: }
! 949: else {
! 950: guess[obj->o_which] = new((unsigned int) strlen(prbuf) + 1);
! 951: strcpy(guess[obj->o_which], prbuf);
! 952: }
! 953: }
! 954: }
CVSweb