-+-+-+-+-+-+-+-+ START OF PART 6 -+-+-+-+-+-+-+-+ X`09 if ( map`5Bay`5D`5Bax`5D.number < 2) X`09 sprintf(viewchar,"You see a %s in very poor condition.", X`09`09`09`09object_names`5Bget_name( map`5Bay`5D`5Bax`5D.mapchar)`5D); X`09 else if ( map`5Bay`5D`5Bax`5D.number < 3) X`09 sprintf(viewchar,"You see a %s in poor condition.", X object_names`5Bget_name( map`5Bay`5D`5Bax`5D V.mapchar)`5D); X`09 else if ( map`5Bay`5D`5Bax`5D.number < 4) X`09 sprintf(viewchar,"You see a %s in average condition.", X object_names`5Bget_name( map`5Bay`5D`5Bax`5D V.mapchar)`5D); X`09 else if ( map`5Bay`5D`5Bax`5D.number < 5) X`09 sprintf(viewchar,"You see a %s in good condition.", X object_names`5Bget_name( map`5Bay`5D`5Bax`5D V.mapchar)`5D); X`09 else if ( map`5Bay`5D`5Bax`5D.number < 6) X`09 sprintf(viewchar,"You see a %s in perfect condition.", X object_names`5Bget_name( map`5Bay`5D`5Bax`5D V.mapchar)`5D); X`09 else`20 X`09 sprintf(viewchar,"You see an enchanted %s!", X object_names`5Bget_name( map`5Bay`5D`5Bax`5D V.mapchar)`5D); X `7D X prt_msg(viewchar); X `7D X ax = ax + dx; ay = ay + dy; X `7D /* End while */ X`7D X X X Xdo_heal()`09`09`09`09/* heal up */ X`7B Xint bp_num, item_num; Xint PREWEIGHT; X Xitem_num = identify( HEALTH); Xif ( (bp_num = check_inven( HEALTH)) != FALSE) `7B X if ( (--BACKPACK`5Bbp_num`5D.quantity) == 0) `7B X BACKPACK`5Bbp_num`5D.invenchar = SPACE; X compress_inven(); X `7D X prt_wgt(); X PREWEIGHT = CURWEIGHT; X CURWEIGHT -= ITEM_PROPS`5Bitem_num`5D`5BWEIGHT`5D; X if ( (PREWEIGHT >= MAXWEIGHT) && (CURWEIGHT < MAXWEIGHT)) `7B X change_speed( 2.0); X prt_msg("The burden of the pack is lifted."); X prt_speed(); X `7D X if ( health < 5) prt_msg("You are still in bad shape."); X else if ( health < 20)`20 X prt_msg("Your major wounds heal, but you are still hurting."); X else if ( health < 50) prt_msg("You're in average condition."); X else prt_msg("You're ready for battle."); X if ( health > MAXHEALTH) health -= ITEM_PROPS`5Bitem_num`5D`5BDAMAGE`5D/2; X else health -= ITEM_PROPS`5Bitem_num`5D`5BDAMAGE`5D; X prt_health(); X`7D Xelse prt_msg("You have nothing to heal yourself with."); X`7D X X Xchoose_spell() X`7B Xint i, failure`5BSPELLNAMES+1`5D, sp, c_wait, yrange, xrange; Xchar spell`5B40`5D; X$DESCRIPTOR( spell_label,"Magic Spells"); X$DESCRIPTOR( invenlabel, "Inventory"); X X Xsmg$erase_display(&dsp_inven); Xsmg$label_border(&dsp_inven,&spell_label); Xfor (i=1; i<= SPELLNAMES; i++) `7B X failure`5Bi`5D = (75 + pow(i-level-1,3)) - (5*(INT-14) + 3*level) + i*2; X sprintf(spell,"%c) %20s Failure: %d%%",i+MAGIC_NUMBER,spells`5Bi-1`5D,fai Vlure`5Bi`5D); X prt_in_disp(dsp_inven,spell,i,1); X`7D Xwhile( !dead) `7B X sp = 0; X prt_msg("Which spell to use? `5B* for list and failure %`5D"); X sp = getkey(); X if ( sp == '*') smg$paste_virtual_display(&dsp_inven,&pb,&2,&43); X else break; X`7D Xif (dead) return; X Xif ( check_inven( ORB) == FALSE) `7B X prt_msg("You don't have the Magic Orb."); X smg$label_border(&dsp_inven,&invenlabel); X smg$paste_virtual_display(&dsp_status,&pb,&2,&43); X return; X`7D X`20 Xc_wait = 5 * (sp - MAGIC_NUMBER);`09 `09/* # of moves casting time */ Xif ( (sp -= MAGIC_NUMBER) <= SPELLNAMES) `7B X prt_msg("You summon your energies and attempt to cast the spell."); X while( c_wait-- > 0) X do_acts(); X if (dead) return; X`7D Xif ( sp < 5) `7B X if ( random( 100) > failure`5Bsp`5D) `7B X fire_item( sp+MAGIC_NUMBER); X if ( random( 100) < 10) `7B X prt_msg("The Orb's power is draining."); X BACKPACK`5Bcheck_inven( ORB)`5D.condition--; X `7D X `7D X else prt_msg("The spell fails."); X`7D Xelse if ( sp == 5) `7B X if ( random( 100) > failure`5Bsp`5D) `7B X if ( !flags`5BMON_CONFUSE`5D.valid) `7B X flags`5BMON_CONFUSE`5D.valid = TRUE; X flags`5BMON_CONFUSE`5D.moves += 61; X prt_msg("The monsters appear to be wandering about in a daze."); X `7D X else prt_msg("The confusion spell has no effect."); X if ( random( 100) > 10) `7B X prt_msg("The Orb's power is draining."); X BACKPACK`5Bcheck_inven( ORB)`5D.condition--; X `7D X `7D X else prt_msg("The spell fails."); X`7D Xelse if ( sp == 6) `7B X if ( random( 100) > failure`5Bsp`5D) `7B X if (in_arena) `7B X prt_msg("You cannot teleport out of the arena."); X return; X `7D X map`5Bppos.y`5D`5Bppos.x`5D.mapchar = SPACE; X map`5Bppos.y`5D`5Bppos.x`5D.number = 1; X prt_char( map`5Bppos.y`5D`5Bppos.x`5D.mapchar, ppos.y, ppos.x); X yrange = BACKPACK`5Bcheck_inven(ORB)`5D.condition*5; X xrange = BACKPACK`5Bcheck_inven(ORB)`5D.condition*10; X do `7B X ppos.y += random( yrange) - yrange/2; X ppos.x += random( xrange) - xrange/2; X `7D while( (map`5Bppos.y`5D`5Bppos.x`5D.mapchar != SPACE) `7C`7C X `09 (ppos.y < 1 `7C`7C ppos.y >= MAXROWS) `7C`7C`09/* outside scree Vn */ X `09 (ppos.x < 1 `7C`7C ppos.x >= MAXCOLS));`09/* outside screen */ X map`5Bppos.y`5D`5Bppos.x`5D.mapchar = '@'; X map`5Bppos.y`5D`5Bppos.x`5D.number = 1; X underchar = SPACE; X prt_char( map`5Bppos.y`5D`5Bppos.x`5D.mapchar, ppos.y, ppos.x); X change_viewport( ppos.y, ppos.x); X dely = delx = 0; X prt_msg("Poof!"); X if ( random( 100) > 10) `7B X prt_msg("The Orb's power is draining."); X BACKPACK`5Bcheck_inven( ORB)`5D.condition--; X `7D X `7D X else prt_msg("The spell fails."); X`7D Xelse prt_msg("No such spell exists."); Xsmg$paste_virtual_display(&dsp_status,&pb,&2,&43); Xsmg$label_border(&dsp_inven,&invenlabel); X`7D X X Xfire_item( item)`09`09`09/* fires arrows only right now */ Xchar item; X`7B Xint dx, dy, ax, ay; Xint distance = 0; Xint bp_num, dr; Xint PREWEIGHT; Xchar spell; X Xswitch( item) `7B X case 'a': X case 'b': X case 'c': X case 'd': spell = item;`20 X item = ORB; X`7D`20 X Xif ( (bp_num = check_inven( BOW)) == FALSE && item == ARROW) `7B X prt_msg("You don't have the bow."); X return; X`7D Xelse if ( BACKPACK`5BWIELD`5D.invenchar != BOW && item == ARROW) `7B X prt_msg("You are not wielding the bow."); X return; X`7D Xelse if ( (bp_num = check_inven( item)) == FALSE) `7B X if ( item == ARROW)`20 X prt_msg("You don't have any arrows to fire."); X else`20 X prt_msg("You don't have the Magic Orb."); X return; X`7D X Xprt_msg("Direction? `5B`5EZ abort`5D"); Xdo `7B X dr = 0; X dr = getkey(); X/* smg$read_keystroke( &kboard,&dr); */ X switch( dr) `7B X`09case UP: dx = 0; dy = -1; break; X`09case RIGHT: dx = 1; dy = 0; break; X`09case LEFT: dx = -1; dy = 0; break; X`09case DOWN: dx = 0; dy = 1; break; X`09case 26: return; break; X default: dr = 999; X `7D /* End switch */ X`7D while( dr==999 && !dead); Xif (dead) return; X Xif ( item == ARROW) `7B X PREWEIGHT = CURWEIGHT; X CURWEIGHT -= ITEM_PROPS`5Bidentify( ARROW)`5D`5BWEIGHT`5D; `20 X if ( (PREWEIGHT >= MAXWEIGHT) && (CURWEIGHT < MAXWEIGHT)) `7B X change_speed( 2.0); X prt_msg("The burden of the pack is lifted."); X prt_speed(); X `7D XBUSE++; Xprt_buse(); Xprt_wgt(); X Xif ( (--BACKPACK`5Bbp_num`5D.quantity) == 0) `7B X BACKPACK`5Bbp_num`5D.invenchar = SPACE; X compress_inven(); X`7D X`7D /* End arrow if */ X X ax = ppos.x+dx; ay = ppos.y+dy; X X while( ++distance < ARROWDIST) `7B X if ( map`5Bay`5D`5Bax`5D.mapchar == WALL) `7B X if ( item == ORB)`20 X if ( spell == 'b' `7C`7C spell == 'c') explode( ay, ax, spell, 1, d Vr); X break; X `7D X else if ( isamonster( map`5Bay`5D`5Bax`5D.mapchar)) `7B X if ( ping_monster( ax, ay, map`5Bay`5D`5Bax`5D.number)) return; X`09 if ( item == ORB) `7B X if ( spell == 'b' `7C`7C spell == 'c') explode( ay, ax, spell, 1 V, dr); X`09 else if ( spell == 'a' `7C`7C spell == 'd') X`09 do_attack( map`5Bay`5D`5Bax`5D.number, 99, spell, dr); X else do_attack( map`5Bay`5D`5Bax`5D.number, 999, ARROW, dr); X`09 `7D X else do_attack( map`5Bay`5D`5Bax`5D.number, 999, ARROW, dr);`09 /* V arrow */ X break; X `7D X if ( item == ORB && (spell == 'b' `7C`7C spell == 'c')) X`09prt_char('*', ay, ax); X else `7B X `09if (dr==UP `7C`7C dr==DOWN) prt_char('`7C', ay, ax);`20 X else prt_char('-', ay, ax); X `7D X prt_char( map`5Bay`5D`5Bax`5D.mapchar, ay, ax); X ax = ax + dx; ay = ay + dy; X `7D /* End while */ X X`7D X X X X Xcompress_inven()`09`09 /* takes out "used" or dropped objects */ X`7B Xint i; Xfor ( i=1; i< MAXINVEN-1; i++) X if ( BACKPACK`5Bi`5D.invenchar == SPACE) `7B X strcpy( BACKPACK`5Bi`5D.name, BACKPACK`5Bi+1`5D.name); X BACKPACK`5Bi`5D.invenchar = BACKPACK`5Bi+1`5D.invenchar; X BACKPACK`5Bi`5D.quantity = BACKPACK`5Bi+1`5D.quantity; X BACKPACK`5Bi`5D.condition = BACKPACK`5Bi+1`5D.condition; X if (i+1 == WIELD) WIELD = i; X else if (i+1 == WORN) WORN = i; X else if (i+1 == ALTWEAP) ALTWEAP = i; X BACKPACK`5Bi+1`5D.invenchar = SPACE; X `7D X`7D X X Xprt_inven() X`7B Xint i = 1; Xint item_num; Xchar item_to_ident; Xchar items`5B80`5D; X Xsmg$erase_display(&dsp_inven); Xsmg$paste_virtual_display(&dsp_inven,&pb,&2,&43); Xdo `7B X if ( BACKPACK`5Bi`5D.invenchar != SPACE) `7B X item_to_ident = BACKPACK`5Bi`5D.invenchar; X item_num = identify( item_to_ident); X if ( i == WORN)`20 X sprintf(items,"%c) %16s `5B%d`5D`5Bworn`5D %3d lb.",i+MAGIC_NUMBER,BACK VPACK`5Bi`5D.name, X BACKPACK`5Bi`5D.condition, X ITEM_PROPS`5Bitem_num`5D`5BWEIGHT`5D*BACKPACK`5Bi`5D.quant Vity); X else if ( i == WIELD) X sprintf(items,"%c) %13s `5B%d`5D`5Bwielded`5D %3d lb.",i+MAGIC_NUMBER,B VACKPACK`5Bi`5D.name, X BACKPACK`5Bi`5D.condition, X ITEM_PROPS`5Bitem_num`5D`5BWEIGHT`5D*BACKPACK`5Bi`5D.quant Vity); X else`20 X sprintf(items,"%c) %17s `5B%d`5D (%d) %4d lb.",i+MAGIC_NUMBER,BACKPACK` V5Bi`5D.name, X BACKPACK`5Bi`5D.condition,BACKPACK`5Bi`5D.quantity, X`09`09 ITEM_PROPS`5Bitem_num`5D`5BWEIGHT`5D*BACKPACK`5Bi`5D.quantity); X prt_in_disp(dsp_inven,items,i,1); X `7D X`7D while( MAXINVEN >i++); X X`7D X X Xexchange_weap()`09`09`09`09/* quick-change alternate weapon */ X`7B Xint DUMMY, bp_num, item_num; Xchar wchar; Xchar wielding`5B80`5D; X Xif ( WIELD == 0 && ALTWEAP == 0) `09/* get an initial weapon */ X wear_wield(); Xelse if ( ALTWEAP == 0) `7B X prt_msg("Make which weapon alternate? `5B* for list`5D"); X wchar = getkey(); X/* smg$read_keystroke(&kboard,&wchar); */ X wchar -= MAGIC_NUMBER; X if ( wchar+MAGIC_NUMBER == '*') `7B prt_inven(); exchange_weap(); `7D X else if ( wchar < 1 `7C`7C wchar > MAXINVEN-1) `7B`20 X prt_msg("Value out of range.");`20 X return;`20 X `7D X else if ( BACKPACK`5Bwchar`5D.invenchar != SPACE) `7B`09 /* you have it */ X item_num = identify( BACKPACK`5Bwchar`5D.invenchar); X if ( ITEM_PROPS`5Bitem_num`5D`5BWEARABLE`5D == TRUE && `20 X ITEM_PROPS`5Bitem_num`5D`5BITEMCHAR`5D != ARMOR) `7B X ALTWEAP = wchar; X `09 sprintf(wielding,"Alternate now %s.",BACKPACK`5Bwchar`5D.name); X `09 prt_msg(wielding); X `7D X else prt_msg( "You can't wield that!"); X `7D X else prt_msg("You have no such object."); X`7D /* End ALTERNATE initialization */ Xelse `7B`09`09`09`09`09/* already have an alternate */ X DUMMY = WIELD; `09`09`09/* need 3 variables to switch two */ X WIELD = ALTWEAP; X bp_num = WIELD; `20 X sprintf(wielding,"Now wielding %s.",BACKPACK`5Bbp_num`5D.name); X prt_msg(wielding); X ALTWEAP = DUMMY; X`7D `20 X`7D X `20 X `20 Xwear_wield()`09`09`09`09/* wears armor or wields weapon */ X`7B Xint bp_num, item_num; Xchar wchar; Xchar wielding`5B80`5D; X Xprt_msg("Wear/wield which item? `5B* for list`5D"); Xwchar = getkey(); X/* smg$read_keystroke(&kboard,&wchar); */ Xwchar -= MAGIC_NUMBER; Xif ( wchar+MAGIC_NUMBER == '*') `7B prt_inven(); wear_wield(); `7D Xelse if ( wchar < 1 `7C`7C wchar > MAXINVEN-1) `7B`20 X prt_msg("Value out of range.");`20 X return;`20 X`7D Xelse if ( BACKPACK`5Bwchar`5D.invenchar != SPACE) `7B`09 /* you have it */ X item_num = identify( BACKPACK`5Bwchar`5D.invenchar); X if ( ITEM_PROPS`5Bitem_num`5D`5BWEARABLE`5D == TRUE) `7B X`09 if ( ITEM_PROPS`5Bitem_num`5D`5BITEMCHAR`5D == ARMOR) `7B X WORN = wchar; X `09 sprintf(wielding,"Now wearing %s.",BACKPACK`5Bwchar`5D.name); X`09 prt_msg(wielding); X`09 `7D X else `7B X`09 WIELD = wchar; X `09 sprintf(wielding,"Now wielding %s.",BACKPACK`5Bwchar`5D.name); X`09 prt_msg(wielding); X`09 `7D X `7D X else prt_msg( "I don't see how you can use that."); X`7D Xelse prt_msg("You have no such object."); X`7D X X X Xdrop()`09`09`09`09`09/* drop, what else? */ X`7B Xint PREWEIGHT, amount; Xint dropall = 0; Xchar dchar; Xchar drop_msg`5B80`5D; X X Xif ( underchar != SPACE) `7B X prt_msg("There is no room to drop anything here."); X return; X`7D Xprt_msg("Drop which item? `5B* for list`5D"); Xdchar = getkey(); X/* smg$read_keystroke(&kboard,&dchar); */ Xdchar -= MAGIC_NUMBER; Xif ( dchar+MAGIC_NUMBER == '*') `7B prt_inven(); drop(); `7D Xelse if ( dchar < 1 `7C`7C dchar > MAXINVEN-1) `7B`20 X prt_msg("Value out of range.");`20 X return;`20 X`7D Xelse if ( BACKPACK`5Bdchar`5D.invenchar != SPACE) `7B `09/* you have it */ X underchar = BACKPACK`5Bdchar`5D.invenchar; X`09if ( WORN == dchar) WORN = 0; X else if ( WIELD == dchar) WIELD = 0; X else if ( ALTWEAP == dchar) ALTWEAP = 0; X`09if ( !combinable( identify( underchar))) `7B X map`5Bppos.y`5D`5Bppos.x`5D.number = BACKPACK`5Bdchar`5D.condition V; X BACKPACK`5Bdchar`5D.invenchar = SPACE; X`09 sprintf(drop_msg,"Dropped %s.",BACKPACK`5Bdchar`5D.name); X`09 amount = 1; X `7D X else `7B X`09 if ( BACKPACK`5Bdchar`5D.quantity > 1) `7B X`09 sprintf(drop_msg,"You have %d %ss. Drop all `5By/n`5D", X`09`09 BACKPACK`5Bdchar`5D.quantity,object_names`5Bidentify(underchar)`5D V); X`09 prt_msg(drop_msg); X strcpy(drop_msg,"\0\0\0"); X`09 dropall = getkey(); X/* `09 smg$read_keystroke(&kboard,&dropall); */ +-+-+-+-+-+-+-+- END OF PART 6 +-+-+-+-+-+-+-+-