-+-+-+-+-+-+-+-+ START OF PART 8 -+-+-+-+-+-+-+-+ X if ( !combinable( identify( dummychar))) `7B X`09 BACKPACK`5Bschar`5D.quantity = 0; X BACKPACK`5Bschar`5D.invenchar = SPACE; X `09 sprintf(sell_msg,"Sold %s.",BACKPACK`5Bschar`5D.name);`20 X`09 quan = 1; X`09`7D X else `7B X`09 if ( BACKPACK`5Bschar`5D.quantity > 1) `7B X`09 sprintf(sell_msg,"You have %d %ss. Sell all?", X`09`09BACKPACK`5Bschar`5D.quantity, object_names`5Bidentify(dummychar)`5D); X`09 prt_msg(sell_msg); X`09 smg$read_keystroke(&kboard,&sellall); X`09 if ( sellall == 'y') `7B`20 X`09 quan = BACKPACK`5Bschar`5D.quantity; X `09 sprintf(sell_msg,"Sold %d %ss.",quan,BACKPACK`5Bschar`5D.name); X `09 BACKPACK`5Bschar`5D.quantity = 0; X`09 BACKPACK`5Bschar`5D.invenchar = SPACE; X`09 `7D X`09 else `7B X`09 BACKPACK`5Bschar`5D.quantity--; X `09 sprintf(sell_msg,"Sold %s.",BACKPACK`5Bschar`5D.name); X `09 quan = 1; X`09 `7D X`09 `7D X`09 else `7B X`09 BACKPACK`5Bschar`5D.quantity = 0;`09 X BACKPACK`5Bschar`5D.invenchar = SPACE; X `09 sprintf(sell_msg,"Sold %s.",BACKPACK`5Bschar`5D.name); X `09 quan = 1; X `7D X `7D X X PREWEIGHT = CURWEIGHT; X CURWEIGHT -= ITEM_PROPS`5Bidentify( dummychar)`5D`5BWEIGHT`5D * quan; X if ( (PREWEIGHT >= MAXWEIGHT) && (CURWEIGHT < MAXWEIGHT)) `7B X change_speed( 2.0); X prt_msg("The burden of the pack is lifted."); X `7D X if ( !combinable( identify( dummychar))) X wealth += (delwealth = ITEM_PROPS`5Bidentify( dummychar)`5D`5BCOST V`5D - X`09`09 (5 - BACKPACK`5Bschar`5D.condition) * 10); X else`20 X wealth += (delwealth = ITEM_PROPS`5Bidentify( dummychar)`5D`5BCOST V`5D*quan); X X`09prt_msg(sell_msg); X `09compress_inven(); X`7D Xelse prt_msg("You have no such object."); Xif (flag) display_store_inven(); X`7D X X X Xtake_damage( damage, killer)`09`09/* ouch */ Xint damage; Xchar *killer; X`7B Xdouble extra; Xchar owk`5B80`5D; Xchar mess`5B80`5D; X Xif ( operator) return;`09`09`09/* no damage taken */ Xif ( flags`5BIMMUNITY`5D.valid) `7B X sprintf(mess,"%s's blow deflects harmlessly away!",killer); X prt_msg(mess); X return; X`7D Xif ( WORN)`20 X health -=`20 X (damage - damage/ITEM_PROPS`5Bidentify( BACKPACK`5BWORN`5D.invenchar) V`5D`5BDAMAGE`5D`20 X + (5 - BACKPACK`5BWORN`5D.condition)); Xelse health -= damage; Xextra = damage * 0.80; /* 20% chance that your armor worsens */ Xif ( random( damage) > extra) X if ( WORN) `7B X prt_msg("Your armor's condition is worsening."); X BACKPACK`5BWORN`5D.condition -= 1; X `7D Xprt_health(); Xif ( health < 0) `7B X sprintf(owk," *** You have died - killed by %s ***",killer); X prt_msg(owk); X dead = TRUE; X `7D`20 X`7D X X X Xdo_move( direction)`09`09 `20 Xchar direction; X`7B Xint dx, dy; X Xswitch( direction) `7B X`09case UP: X`09 dely--; `20 X`09 dx = 0; dy = 1; break; X`09case DOWN: X`09 dely++; X `09 dx = 0; dy = -1; break; X`09case LEFT: X`09 delx--; X `09 dx = 1; dy = 0; break; X`09case RIGHT: X`09 delx++; X dx = -1; dy = 0; X`7D /* End switch */ Xppos.x -= dx; Xppos.y -= dy; Xif ( abs(dely) >= SCRATIOV) `7B X change_viewport(ppos.y, 0); X dely = 0; X`7D Xif ( abs(delx) >= SCRATIOH) `7B X change_viewport(0, ppos.x); X delx = 0; X`7D Xmap`5Bppos.y`5D`5Bppos.x`5D.mapchar = '@'; Xmap`5Bppos.y+dy`5D`5Bppos.x+dx`5D.mapchar = underchar; Xprt_char( map`5Bppos.y+dy`5D`5Bppos.x+dx`5D.mapchar, ppos.y+dy, ppos.x+dx); Xprt_char( map`5Bppos.y`5D`5Bppos.x`5D.mapchar, ppos.y, ppos.x); Xunderchar = SPACE; `09`09/* to reset the underchar, since you moved */ X`7D $ CALL UNPACK PLAY.C;1 1683788495 $ create 'f' X#include stdio X#include ctype X#include time X#include descrip X#include "aralu.h" X X Xint obstacle( testchar) Xchar testchar; X`7B Xswitch( testchar) `7B X`09case SPACE: X`09case BRIDGE: X`09case BRIDGE2: X`09`09return( FALSE); X`09`09break; X`09default: return( TRUE); X`7D X`7D X`09`09 X Xshort isamonster( testchar) Xchar testchar; X`7B Xif ( (testchar >= 'A' && testchar <= 'Z') `7C`7C X (testchar >= 'a' && testchar <= 'z')) return( TRUE); Xelse return( FALSE); X`7D X X Xshort combinable( number)`20 Xint number; X`7B Xreturn( ITEM_PROPS`5Bnumber`5D`5BCOMBINE`5D); X`7D X X X Xget_time() X`7B Xint i, time_val; Xchar time_msg`5B80`5D; Xchar *hour`5B2`5D = `7B"AM","PM"`7D; Xstruct tm *time_structure; X Xtime(&time_val); Xtime_structure = localtime(&time_val); X X if(time_structure->tm_hour > 12)`20 X `7B X time_structure->tm_hour = (time_structure->tm_hour) - 12; X i = 1; X `7D X else i = 0; X Xsprintf(time_msg,"Time: %2d:%02d %s",time_structure->tm_hour, X`09`09`09`09`09`09time_structure->tm_min,hour`5Bi`5D); Xprt_in_disp(dsp_status,time_msg,10,20); X`7D X X X X/* Note: since grab_num is only used with the wizard commands, there is no X `09 need to run through the do_acts() procedure during number read */ Xshort grab_num( prompt) Xchar *prompt; X`7B Xchar num`5B11`5D; X$DESCRIPTOR( prompt_d, prompt); X$DESCRIPTOR( num_d, num); X Xprompt_d.dsc$w_length = strlen( prompt); Xsmg$erase_line(&dsp_command,&10,&1); Xsmg$set_cursor_abs(&dsp_command,&10,&1); Xsmg$read_string(&kboard,&num_d,&prompt_d,0,0,0,0,0,0,&dsp_command); Xreturn( atoi( num)); X`7D X X X Xchange_speed( number)`20 Xdouble number; X`7B Xint i, j, k; Xint limit; X Xspeed *= number; X Xj = 0; Xk = 0; Xwhile( j++ < MAXMONSTERS*level) `7B X limit = monsters`5Bk`5D.max_mon; X for( i=0; i< limit; i++) `7B X if ( number < 1) monsters`5Bk`5D.speed -= 1;`20 X else monsters`5Bk`5D.speed += 1; X k++; X `7D /* End FOR loop */ X`7D /* End while */ X`7D X X`09 X Xcheck_speed() X`7B X Xif ( speed > 1) `7B X prt_msg("The effect of the potion wears off."); X prt_msg("You feel yourself slow down."); X change_speed( 0.5); X prt_speed(); X `7D Xelse if ( speed < 1) `7B X prt_msg("The effect of the potion wears off."); X prt_msg("You feel yourself speed up."); X change_speed( 2.0); X prt_speed(); X `7D Xelse if ( speed == 1 && CURWEIGHT >= MAXWEIGHT) `7B X prt_msg("The effect of the potion wears off."); X prt_msg("You feel yourself slow down."); X change_speed( 0.5); X prt_speed(); X `7D`20 Xflags`5BSPEED`5D.valid = FALSE;`20 Xflags`5BSPEED`5D.moves = 0; X`7D X Xcheck_confusion() X`7B Xprt_msg("The confusion wears off."); Xflags`5BCONFUSE`5D.valid = FALSE; Xflags`5BCONFUSE`5D.moves = 0; X`7D X Xcheck_immunity() X`7B Xprt_msg("You no longer feel invulnerable."); Xflags`5BIMMUNITY`5D.valid = FALSE; Xflags`5BIMMUNITY`5D.moves = 0; X`7D X Xcheck_mon_confuse() X`7B Xflags`5BMON_CONFUSE`5D.valid = FALSE; Xflags`5BMON_CONFUSE`5D.moves = 0; X`7D X Xcheck_blind() X`7B Xprt_msg("Your vision clears..."); Xsmg$paste_virtual_display(&dsp_main,&pb,&2,&2); Xflags`5BBLIND`5D.valid = FALSE; Xflags`5BBLIND`5D.moves = 0; X`7D X X X Xint get_name( obj_to_ident)`09`09/* gets name of object only */ Xchar obj_to_ident; X`7B Xint i = 0; X Xdo `7B X if ( ITEM_PROPS`5Bi`5D`5BITEMCHAR`5D == obj_to_ident) `7B return( i); brea Vk; `7D X`7Dwhile( MAXOBJECTS> i++); `09/* note: this includes all objects */ Xreturn( MAGIC_NUMBER); `09/* no such object - error in screen file */ X`7D X X X Xprt_status()`09`09`09`09/* Print out the stats */ X`7B Xprt_username( username); Xprt_level(); Xprt_exp(); Xprt_health(); Xprt_wealth(); Xprt_speed(); Xprt_kills(); Xprt_key_status(); Xget_time(); Xprt_str(); Xprt_int(); Xprt_dex(); Xprt_con(); Xprt_buse(); Xprt_wgt(); X`7D X X X/* Note: It's impossible right now to get to "Forget it" speed, since the X `09 flag for SPEED is just on/off. If it were made such that a specific X `09 number of times the slow/fast potion was drank, they could be X`09 accounted for in the check_speed() routine. Right now, though, I X `09 just have the slow/fast flag set for on/off with a number of moves X`09 dependent on the number of potions drank. `09 X*/ Xprt_speed() X`7B Xchar speed_msg`5B80`5D; Xchar cur_speed`5B10`5D; X Xif ( speed==1) strcpy( cur_speed," Normal"); Xelse if ( speed<1) `7B X if ( speed == .5) strcpy( cur_speed," Slow"); X else if ( speed == .25) strcpy( cur_speed,"Very Slow");`20 X else if ( speed <= .125) strcpy( cur_speed,"Forget it"); X`7D Xelse if ( speed>1) strcpy( cur_speed," Fast"); Xsprintf(speed_msg,"Speed: %s", cur_speed); Xprt_in_disp(dsp_status,speed_msg,3,20); X`7D X X Xprt_exp() X`7B Xchar exp_msg`5B80`5D; X Xsprintf(exp_msg,"Exp: %11d",experience); Xprt_in_disp( dsp_status, exp_msg, 2, 20); X`7D X X Xprt_wealth() X`7B Xchar wealth_msg`5B80`5D; X Xsprintf(wealth_msg,"Cash flow: %6d",wealth); Xprt_in_disp(dsp_status,wealth_msg,3,1); X`7D X X Xprt_username( username) Xchar *username; X`7B Xchar user_name`5B20`5D; X Xsprintf(user_name,"Player: %9s",username); Xprt_in_disp( dsp_status, user_name, 1, 1); X`7D X Xprt_level() X`7B Xchar level_msg`5B80`5D; X Xsprintf(level_msg,"Level: %9d",level); Xprt_in_disp( dsp_status, level_msg, 1, 20); X`7D X Xprt_health() X`7B Xchar health_msg`5B80`5D; X Xsprintf(health_msg,"Health: %9d",health); Xprt_in_disp(dsp_status,health_msg,2,1); X`7D X X Xprt_kills() X`7B Xchar kill_msg`5B80`5D; X Xsprintf(kill_msg,"Kills: %10d",kills); Xprt_in_disp(dsp_status,kill_msg,4,1); X`7D X Xprt_key_status() X`7B X Xif ( KEYPOSESS) X prt_in_disp(dsp_status,"Key status: Yes",4,20); Xelse`20 X prt_in_disp(dsp_status,"Key status: No",4,20); X`7D X Xprt_moves( num) Xint num; X`7B Xchar n_moves`5B10`5D; X Xsprintf(n_moves,"Moves: %9d",flags`5Bnum`5D.moves); Xprt_in_disp(dsp_status,n_moves,5,20); X`7D X Xprt_str() X`7B Xchar str_msg`5B80`5D; X `20 Xsprintf(str_msg,"Str: %5d",STR); Xprt_in_disp(dsp_status,str_msg,5,1); X`7D X X Xprt_int() X`7B Xchar int_msg`5B80`5D; X Xsprintf(int_msg,"Int: %5d",INT); Xprt_in_disp(dsp_status,int_msg,6,1); X`7D X X Xprt_dex() X`7B Xchar dex_msg`5B80`5D; X Xsprintf(dex_msg,"Dex: %5d",DEX); Xprt_in_disp(dsp_status,dex_msg,7,1); X`7D X X Xprt_con() X`7B Xchar con_msg`5B80`5D; X Xsprintf(con_msg,"Con: %5d",CON); Xprt_in_disp(dsp_status,con_msg,8,1); X`7D X X Xprt_buse() X`7B Xchar buse_msg`5B80`5D; X Xsprintf(buse_msg,"Bow: %5d",BUSE); Xprt_in_disp(dsp_status,buse_msg,9,1); X`7D X Xprt_wgt() X`7B Xchar wgt_msg`5B80`5D; X Xsprintf(wgt_msg,"Wgt: %4d/%4d",CURWEIGHT,MAXWEIGHT); Xprt_in_disp(dsp_status,wgt_msg,10,1); X`7D X X/* End stats section */ X X X X Xint check_inven( otc)`09`09`09/* returns position in inventory */ Xchar otc; X`7B Xint i; X Xfor (i=1; i< MAXINVEN; i++) X if ( BACKPACK`5Bi`5D.invenchar == otc) return( i); X/* Else if you don't have it, return false */ Xreturn( FALSE); X`7D X X Xint identify( obj_to_ident)`09/* Identifies item properties by finding # */ Xchar obj_to_ident; X`7B Xint i = 0; X Xdo `7B X if ( ITEM_PROPS`5Bi`5D`5BITEMCHAR`5D == obj_to_ident) `7B return( i); brea Vk; `7D X`7Dwhile( (MAXOBJECTS-NUMITEMS)> ++i); Xreturn( MAGIC_NUMBER); `09`09 X`7D X X Xbreak_weapon( bp_num) Xint bp_num; X`7B Xint PREWEIGHT; X XPREWEIGHT = CURWEIGHT; XCURWEIGHT -= ITEM_PROPS`5Bidentify( BACKPACK`5Bbp_num`5D.invenchar)`5D`5BWEI VGHT`5D; Xif ( (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 XWIELD = 0; XBACKPACK`5Bbp_num`5D.invenchar = SPACE; Xprt_wgt(); Xcompress_inven(); X`7D X Xping_monster( x, y, mon_num) /* ping the ghosted monster */ Xint x, y, mon_num; X`7B Xmonsters_struct *mon_ptr; Xmon_ptr = &monsters`5Bmon_num`5D; X Xif ( map`5By`5D`5Bx`5D.number == 9999) return; Xif ( mon_ptr->dead `7C`7C `09`09 `20 X ( mon_ptr->posy != y `7C`7C mon_ptr->posx != x)) `7B`09 X map`5By`5D`5Bx`5D.mapchar = SPACE; X map`5By`5D`5Bx`5D.number = 1; X prt_char(map`5By`5D`5Bx`5D.mapchar,y,x); X prt_msg("The ghost shimmers and disappears."); X return( TRUE); X`7D Xelse return( FALSE); X`7D $ CALL UNPACK PLAY2.C;1 1765644227 $ create 'f' Xint randomize() X`7B X int seed; X char dt`5B30`5D; X X $DESCRIPTOR(d_s,dt); X lib$date_time(&d_s); X random_seed=(dt`5B16`5D+dt`5B19`5D*7+dt`5B21`5D*88+dt`5B22`5D*624); X random_incl= (mth$random(&random_seed) % 50); X`7D X Xint random(max_num) X`7B X int seed; X seed=(random_seed + ++random_incl*624); X if (max_num)`20 X return(abs(mth$random(&seed) % max_num)); X else X return(max_num/2); /* Division by zero */ X`7D $ CALL UNPACK RANDOM.C;1 235865404 $ create 'f' X#include stat X#include stdio X#include "aralu.h" X Xstatic struct stat sfstat; Xstatic int i, j, k; X Xshort savegame() X`7B XFILE *outfile; Xshort ret = 0; X Xif ( (outfile = fopen( savefile,"w")) != NULL) `7B X /* write out information in the same way it was read in */ X /* create struct so people can't edit savefile */ X strcpy( player.username,username); X player.underchar = underchar; X player.level = level;`20 X player.health = health; X player.speed = speed; X player.operator = operator; X player.experience = experience; X player.wealth = wealth; X player.kills = kills; X player.monkilled = monkilled; X player.STR = STR; X player.INT = INT; X player.DEX = DEX; X player.CON = CON; X player.BUSE = BUSE; X player.delx = delx;`09`09 X player.dely = dely; X player.MAXHEALTH = MAXHEALTH; X player.MAXWEIGHT = MAXWEIGHT; X player.CURWEIGHT = CURWEIGHT; X player.WIELD = WIELD; X player.WORN = WORN; X player.ALTWEAP = ALTWEAP; X player.KEYPOSESS = KEYPOSESS; X player.DIFFICULTY = DIFFICULTY; X/* X for (i=0; i< MAXROWS; i++) `20 X for (j=0; j< MAXCOLS; j++) X maparray`5Bi`5D`5Bj`5D = map`5Bi`5D`5Bj`5D.mapchar; X*/ Xenable_control(); Xk = 0; X for (i=0; i< MAXROWS; i++) `20 X for (j=0; j< MAXCOLS; j++) X if ( map`5Bi`5D`5Bj`5D.mapchar != WALL && map`5Bi`5D`5Bj`5D.mapchar V != SPACE && X`09 !isamonster( map`5Bi`5D`5Bj`5D.mapchar) && map`5Bi`5D`5Bj`5D.mapchar V != WATER && X `09 map`5Bi`5D`5Bj`5D.mapchar != BRIDGE && map`5Bi`5D`5Bj`5D.mapchar V != BRIDGE2) `7B +-+-+-+-+-+-+-+- END OF PART 8 +-+-+-+-+-+-+-+-