-+-+-+-+-+-+-+-+ START OF PART 28 -+-+-+-+-+-+-+-+ X `7D; X `7D X `7D X X/* X subroutine to process a chest object X*/ Xochest() X `7B X lprcat("\nDo you (t) take it, (o) try to open it"); iopts(); X while (1) X `7B X switch(ttgetch()) X `7B X case 'o': X lprcat(" open it"); X act_open_chest( playerx, playery ); X return; X X case 't': X lprcat(" take"); X if (take(OCHEST,iarg`5Bplayerx`5D`5Bplayery`5D)==0) X item`5Bplayerx`5D`5Bplayery`5D=know`5Bplayerx`5D`5Bplayery`5D=0; X return; X X case 'i': X case '\33': ignore(); return; X `7D; X `7D X `7D X X/* X process a fountain object X*/ Xofountain() X `7B X cursors(); X lprcat("\nDo you (d) drink, (w) wash yourself"); iopts(); X while (1) switch(ttgetch()) X `7B X case 'd': X act_drink_fountain(); X return; X X case '\33': X case 'i': `20 X ignore(); `20 X return; X X case 'w': `20 X act_wash_fountain(); X return; X `7D X `7D X X/* X a subroutine to raise or lower character levels X if x > 0 they are raised if x < 0 they are lowered X*/ Xfntchange(how) X int how; X `7B X register long j; X lprc('\n'); X switch(rnd(9)) X `7B X case 1:`20 X lprcat("Your strength"); `20 X fch(how,&c`5BSTRENGTH`5D); break; X case 2: X lprcat("Your intelligence"); `20 X fch(how,&c`5BINTELLIGENCE`5D); break; X case 3: X lprcat("Your wisdom"); `20 X fch(how,&c`5BWISDOM`5D); break; X case 4:`20 X lprcat("Your constitution"); `20 X fch(how,&c`5BCONSTITUTION`5D); break; X case 5: X lprcat("Your dexterity"); X fch(how,&c`5BDEXTERITY`5D); break; X case 6: X lprcat("Your charm"); X fch(how,&c`5BCHARISMA`5D); break; X case 7:`20 X j=rnd(level+1); X if (how < 0) X `7B X lprintf("You lose %d hit point",(long)j); X if (j>1) lprcat("s!"); else lprc('!'); X losemhp((int)j); X `7D X else X `7B lprintf("You gain %d hit point",(long)j); if (j>1) lprc Vat("s!"); else lprc('!'); raisemhp((int)j); `7D X bottomline(); break; X X case 8: j=rnd(level+1); X if (how > 0) X `7B X lprintf("You just gained %d spell",(long)j); raisemspel Vls((int)j); X if (j>1) lprcat("s!"); else lprc('!'); X `7D X else X `7B X lprintf("You just lost %d spell",(long)j); losemspells( V(int)j); X if (j>1) lprcat("s!"); else lprc('!'); X `7D X bottomline(); break; X X case 9: j = 5*rnd((level+1)*(level+1)); X if (how < 0) X `7B X lprintf("You just lost %d experience point",(long)j); X if (j>1) lprcat("s!"); else lprc('!'); loseexperience((l Vong)j); X `7D X else X `7B X lprintf("You just gained %d experience point",(long)j); X if (j>1) lprcat("s!"); else lprc('!'); raiseexperience(( Vlong)j); X `7D X break; X `7D X cursors(); X `7D X X/* X subroutine to process an up/down of a character attribute for ofountain X*/ Xstatic fch(how,x) X int how; X long *x; X `7B X if (how < 0) `7B lprcat(" went down by one!"); --(*x); `7D X else `7B lprcat(" went up by one!"); (*x)++; `7D X bottomline(); X `7D X X/* X For command mode. Perform drinking at a fountain. X*/ Xdrink_fountain() X `7B X cursors() ; X if (item`5Bplayerx`5D`5Bplayery`5D == ODEADFOUNTAIN) X lprcat("\nThere is no water to drink!") ; X X else if (item`5Bplayerx`5D`5Bplayery`5D != OFOUNTAIN) X lprcat("\nI see no fountain to drink from here!") ; X X else`20 X act_drink_fountain(); X return; X `7D X X/* X For command mode. Perform washing (tidying up) at a fountain. X*/ Xwash_fountain() X `7B X cursors() ; X if (item`5Bplayerx`5D`5Bplayery`5D == ODEADFOUNTAIN) X lprcat("\nThere is no water to wash in!") ; X X else if (item`5Bplayerx`5D`5Bplayery`5D != OFOUNTAIN) X lprcat("\nI see no fountain to wash at here!") ; X X else X act_wash_fountain(); X return; X `7D X X/* X For command mode. Perform entering a building. X*/ Xenter() X `7B X cursors() ; X switch ( item`5Bplayerx`5D`5Bplayery`5D ) X `7B X case OSCHOOL: X oschool(); X break ; X X case OBANK: X obank() ; X break ; X X case OBANK2: X obank2() ; X break ; X X case ODNDSTORE: X dndstore() ; X break ; X X case OENTRANCE: X /* place player in front of entrance on level 1. newcavelevel() X prevents player from landing on a monster/object. X */ X playerx = 33 ; X playery = MAXY - 2 ; X newcavelevel( 1 ); X know`5B33`5D`5BMAXY - 1`5D = KNOWALL ; X mitem`5B33`5D`5BMAXY - 1`5D = 0 ; X draws( 0, MAXX, 0, MAXY ); X showcell(playerx, playery); /* to show around player */ X bot_linex() ; X break ; X X case OTRADEPOST: X otradepost(); X break; X X case OLRS: X olrs(); X break; X X case OHOME: X ohome(); X break; X X default : X lprcat("\nThere is no place to enter here!\n"); X break; X `7D X `7D X X/* X For command mode. Perform removal of gems from a jeweled throne. X*/ Xremove_gems ( ) X `7B X cursors(); X if (item`5Bplayerx`5D`5Bplayery`5D == ODEADTHRONE) X lprcat("\nThere are no gems to remove!"); X `20 X else if (item`5Bplayerx`5D`5Bplayery`5D == OTHRONE) X act_remove_gems(0); X X else if (item`5Bplayerx`5D`5Bplayery`5D == OTHRONE2) X act_remove_gems(1); X X else X lprcat("\nI see no throne here to remove gems from!"); X return; X `7D X X/* X For command mode. Perform sitting on a throne. X*/ Xsit_on_throne( ) X `7B X cursors(); X if (item`5Bplayerx`5D`5Bplayery`5D == OTHRONE) X act_sit_throne(0); X `20 X else if ((item`5Bplayerx`5D`5Bplayery`5D == OTHRONE2) `7C`7C X (item`5Bplayerx`5D`5Bplayery`5D == ODEADTHRONE)) X act_sit_throne(1); X `20 X else X lprcat("\nI see no throne to sit on here!"); X X return; X `7D X X/* X For command mode. Checks that player is actually standing at a set up X up stairs or volcanic shaft. `20 X*/ Xup_stairs() X `7B X cursors(); X if (item`5Bplayerx`5D`5Bplayery`5D == OSTAIRSDOWN) X lprcat("\nThe stairs don't go up!"); X X else if (item`5Bplayerx`5D`5Bplayery`5D == OVOLUP) X act_up_shaft(); X X else if (item`5Bplayerx`5D`5Bplayery`5D != OSTAIRSUP) X lprcat("\nI see no way to go up here!"); X X else X act_up_stairs(); X `7D X X/* X For command mode. Checks that player is actually standing at a set of X down stairs or volcanic shaft. X*/ Xdown_stairs() X `7B X cursors(); X if (item`5Bplayerx`5D`5Bplayery`5D == OSTAIRSUP) X lprcat("\nThe stairs don't go down!"); X X else if (item`5Bplayerx`5D`5Bplayery`5D == OVOLDOWN) X act_down_shaft(); X X else if (item`5Bplayerx`5D`5Bplayery`5D != OSTAIRSDOWN) X lprcat("\nI see no way to go down here!"); X X else X act_down_stairs(); X `7D X X/* X For command mode. Perform opening an object (door, chest). X*/ Xopen_something( ) X `7B X int x,y; /* direction to open */ X char tempc; /* result of prompting to open a chest */ X X cursors(); X /* check for confusion. X */ X if (c`5BCONFUSE`5D) X `7B X lprcat("You're too confused!"); X beep(); X return; X `7D X X /* check for player standing on a chest. If he is, prompt for and X let him open it. If player ESCs from prompt, quit the Open X command. X */ X if (item`5Bplayerx`5D`5Bplayery`5D == OCHEST) X `7B X lprcat("There is a chest here. Open it?"); X if ((tempc = getyn()) == 'y') X `7B X act_open_chest( playerx, playery ); X dropflag = 1; /* prevent player from picking back up if fail V */ X return; X `7D X else if (tempc != 'n' ) X return; X `7D X X /* get direction of object to open. test 'openability' of object X indicated, call common command/prompt mode routines to actually open. X */ X dirsub( &x, &y ); X switch( item`5Bx`5D`5By`5D ) X `7B X case OOPENDOOR: X lprcat("The door is already open!"); X beep(); X break; X X case OCHEST: X act_open_chest( x, y ); X break; X X case OCLOSEDDOOR: X act_open_door( x, y ); X break; X X default: X lprcat("You can't open that!"); X beep(); X break; X `7D X `7D X X/* X For command mode. Perform the action of closing something (door). X*/ Xclose_something() X `7B X int x,y; X X cursors(); X /* check for confusion. X */ X if (c`5BCONFUSE`5D) X `7B X lprcat("You're too confused!"); X beep(); X return; X `7D X X /* get direction of object to close. test 'closeability' of object X indicated. X */ X dirsub( &x, &y ); X switch( item`5Bx`5D`5By`5D ) X `7B X case OCLOSEDDOOR: X lprcat("The door is already closed!"); X beep(); X break; X X case OOPENDOOR: X if (mitem`5Bx`5D`5By`5D) X `7B X lprcat("Theres a monster in the way!"); X return; X `7D X item`5Bx`5D`5By`5D = OCLOSEDDOOR; X know`5Bx`5D`5By`5D = 0 ; X iarg`5Bx`5D`5By`5D = 0 ; X break; X X default: X lprcat("You can't close that!"); X beep(); X break; X `7D X `7D X X/* X For command mode. Perform the act of descecrating an altar. X*/ Xdesecrate_altar() X `7B X cursors(); X if (item`5Bplayerx`5D`5Bplayery`5D == OALTAR) X act_desecrate_altar(); X else X lprcat("\nI see no altar to desecrate here!"); X `7D X X/* X For command mode. Perform the act of praying at an altar. X*/ Xpray_at_altar() X `7B X extern char prayed ; X X cursors(); X if (item`5Bplayerx`5D`5Bplayery`5D != OALTAR) X lprcat("\nI see no altar to pray at here!"); X else X act_donation_pray(); X prayed = 1 ; X `7D X X/* X Identify objects for the player. X*/ Xvoid specify_object() X `7B X cursors(); X lprcat("\n\nIdentify unknown object by cursor `5Bynq`5D?"); X while (1) X `7B X switch (ttgetch()) X `7B X case '\33': X case 'q': X return; X break; X case 'y': X case 'Y': X specify_obj_cursor(); X return; X break; X case 'n': X case 'N': X specify_obj_nocurs(); X return; X break; X default: X break; X `7D X `7D X `7D X X/* perform the actions of identifying the object/monster associated with a X character typed by the user. assumes cursors(). X*/ Xstatic void specify_obj_nocurs() X `7B X register int i, j, flag; X X lprcat("\nType object character:"); X switch (i=ttgetch()) X `7B X case '\33': X case '\n': X return; X case '@': X lprintf("\n@: %s", logname ); X return; X case ' ': X lprintf("\n : An as-yet-unseen place in the dungeon" ); X return; X default: X if ( i == floorc ) X `7B X lprc('\n'); X lprc(floorc); X lprintf(": the floor of the dungeon"); X return; X `7D X flag = FALSE; X for (j=0; j < MAXMONST+8 ; j++) X if (i==monstnamelist`5Bj`5D) X `7B X lprintf("\n%c: %s", i, monster`5Bj`5D.name); X flag = TRUE; X `7D X /* check for spurious object character X */ X if (i != '_') X for (j=0; j < MAXOBJECT; j++) X if (i==objnamelist`5Bj`5D) X `7B X lprc('\n'); X if (boldobjects) X `7B X setbold(); X lprc(i); X resetbold(); X `7D X else X lprc(i); X lprintf(": %s", objectname`5Bj`5D); X flag = TRUE; X `7D X if (!flag) X lprintf("\n%c: unknown monster/object", i ); X return; X break; X `7D X `7D X Xstatic void specify_obj_cursor() X `7B X#if __STDC__ X signed char objx, objy; X#else X char objx, objy; X#endif X int i; X X lprcat("\nMove the cursor to an unknown item."); X lprcat("\n(For instructions type a ?)"); X X objx = playerx ; X objy = playery ; +-+-+-+-+-+-+-+- END OF PART 28 +-+-+-+-+-+-+-+-