-+-+-+-+-+-+-+-+ START OF PART 36 -+-+-+-+-+-+-+-+ X`09item_flags`09`09`09: unsigned; X`09i1,old_dis_ac`09`09`09: integer; X begin X`09with py.flags do X`09 begin X`09 if (slow_digest) then X`09 food_digested := food_digested + 1; X`09 if (regenerate) then X`09 food_digested := food_digested - 3; X`09 see_inv`09:= false; X`09 teleport`09:= false; X`09 free_act`09:= false; X`09 slow_digest`09:= false; X`09 aggravate`09:= false; X`09 sustain_str`09:= false; X`09 sustain_int`09:= false; X`09 sustain_wis`09:= false; X`09 sustain_con`09:= false; X`09 sustain_dex`09:= false; X`09 sustain_chr`09:= false; X`09 fire_resist`09:= false; X`09 acid_resist`09:= false; X`09 cold_resist`09:= false; X`09 regenerate`09:= false; X`09 lght_resist`09:= false; X`09 ffall`09:= false; X`09 end; X X`09if (uand(%X'00000001',tobj.flags) <> 0) then X`09 begin X`09 change_stat(py.stat.cstr,tobj.p1,factor); X`09 change_stat(py.stat.str,tobj.p1,factor); X`09 print_stat := uor(%X'0001',print_stat); X`09 end; X`09if (uand(%X'00000002',tobj.flags) <> 0) then X`09 begin X`09 change_stat(py.stat.cdex,tobj.p1,factor); X`09 change_stat(py.stat.dex,tobj.p1,factor); X`09 print_stat := uor(%X'0002',print_stat); X`09 end; X`09if (uand(%X'00000004',tobj.flags) <> 0) then X`09 begin X`09 change_stat(py.stat.ccon,tobj.p1,factor); X`09 change_stat(py.stat.con,tobj.p1,factor); X`09 print_stat := uor(%X'0004',print_stat); X`09 end; X`09if (uand(%X'00000008',tobj.flags) <> 0) then X`09 begin X`09 change_stat(py.stat.cint,tobj.p1,factor); X`09 change_stat(py.stat.int,tobj.p1,factor); X`09 print_stat := uor(%X'0008',print_stat); X`09 end; X`09if (uand(%X'00000010',tobj.flags) <> 0) then X`09 begin X`09 change_stat(py.stat.cwis,tobj.p1,factor); X`09 change_stat(py.stat.wis,tobj.p1,factor); X`09 print_stat := uor(%X'0010',print_stat); X`09 end; X`09if (uand(%X'00000020',tobj.flags) <> 0) then X`09 begin X`09 change_stat(py.stat.cchr,tobj.p1,factor); X`09 change_stat(py.stat.chr,tobj.p1,factor); X`09 print_stat := uor(%X'0020',print_stat); X`09 end; X`09if (uand(%X'00000040',tobj.flags) <> 0) then X`09 begin X`09 py.misc.srh := py.misc.srh + (tobj.p1 * factor); X`09 py.misc.fos := py.misc.fos - (tobj.p1 * factor); X`09 end; X`09if (uand(%X'00000100',tobj.flags) <> 0) then X`09 py.misc.stl := py.misc.stl + 2*factor; X`09if (uand(%X'00001000',tobj.flags) <> 0) then X`09 begin X`09 i1 := tobj.p1*factor; X`09 change_speed(-i1); X`09 end; X`09if (uand(%X'08000000',tobj.flags) <> 0) then X`09 if (factor > 0) then X`09 py.flags.blind := py.flags.blind + 1000; X`09if (uand(%X'10000000',tobj.flags) <> 0) then X`09 if (factor > 0) then X`09 py.flags.afraid := py.flags.afraid + 50; X`09if (uand(%X'40000000',tobj.flags) <> 0) then X`09 py.flags.see_infra := py.flags.see_infra + (tobj.p1 * factor); X`09with py.misc do X`09 begin X`09 old_dis_ac := dis_ac; X`09 ptohit := tohit_adj;`09`7B Real To Hit`09`7D X`09 ptodam := todam_adj;`09`7B Real To Dam`09`7D X`09 ptoac := toac_adj;`09`7B Real To AC`09`7D X`09 pac := 0;`09`09`7B Real AC`09`7D X`09 dis_th := ptohit;`09`7B Display To Hit`09`7D X`09 dis_td := ptodam;`09`7B Display To Dam`09`7D X`09 dis_ac := 0;`09`7B Display To AC`09`09`7D X`09 dis_tac := ptoac;`09`7B Display AC`09`09`7D X`09 for i1 := 23 to inven_max-2 do X`09 with inventory`5Bi1`5D do X`09`09if (tval > 0) then X`09`09 begin X`09`09 if (uand(%X'80000000',flags) = 0) then X`09`09 begin X`09`09`09pac := pac + ac; X`09`09`09dis_ac := dis_ac + ac; X`09`09 end; X`09`09 ptohit := ptohit + tohit; X`09`09 ptodam := ptodam + todam; X`09`09 ptoac := ptoac + toac; X`09`09 if (index(name,'`5E') = 0) then X`09`09 begin X`09`09`09dis_th := dis_th + tohit; X`09`09`09dis_td := dis_td + todam; X`09`09`09dis_tac := dis_tac + toac; X`09`09 end; X`09`09 end; X`09 dis_ac := dis_ac + dis_tac; X X`09`09`7B Add in temporary spell increases`09`7D X`09 with py.flags do X`09 begin X`09`09if (invuln > 0) then X`09`09 begin X`09`09 pac := pac + 100; X`09`09 dis_ac := dis_ac + 100; X`09`09 end; X`09`09if (blessed > 0) then X`09`09 begin X`09`09 pac := pac + 2; X`09`09 dis_ac := dis_ac + 2; X`09`09 end; X`09`09if (detect_inv > 0) then X`09`09 see_inv := true; X`09 end; X X`09 if (old_dis_ac <> dis_ac) then X`09 print_stat := uor(%X'0040',print_stat); X X`09 item_flags := 0; X`09 for i1 := 23 to inven_max-2 do X`09 with inventory`5Bi1`5D do X`09`09item_flags := uor(item_flags,flags); X`09 if (uand(%X'00000080',item_flags) <> 0) then X`09 py.flags.slow_digest := true; X`09 if (uand(%X'00000200',item_flags) <> 0) then X`09 py.flags.aggravate := true; X`09 if (uand(%X'00000400',item_flags) <> 0) then X`09 py.flags.teleport := true; X`09 if (uand(%X'00000800',item_flags) <> 0) then X`09 py.flags.regenerate := true; X`09 if (uand(%X'00080000',item_flags) <> 0) then X`09 py.flags.fire_resist := true; X`09 if (uand(%X'00100000',item_flags) <> 0) then X`09 py.flags.acid_resist := true; X`09 if (uand(%X'00200000',item_flags) <> 0) then X`09 py.flags.cold_resist := true; X`09 if (uand(%X'00800000',item_flags) <> 0) then X`09 py.flags.free_act := true; X`09 if (uand(%X'01000000',item_flags) <> 0) then X`09 py.flags.see_inv := true; X`09 if (uand(%X'02000000',item_flags) <> 0) then X`09 py.flags.lght_resist := true; X`09 if (uand(%X'04000000',item_flags) <> 0) then X`09 py.flags.ffall := true; X X`09 for i1 := 23 to inven_max-2 do X`09 with inventory`5Bi1`5D do X`09 if (uand(%X'00400000',flags) <> 0) then X`09 case p1 of X`09`09 1 :`09py.flags.sustain_str := true; X`09`09 2 :`09py.flags.sustain_int := true; X`09`09 3 :`09py.flags.sustain_wis := true; X`09`09 4 :`09py.flags.sustain_con := true; X`09`09 5 :`09py.flags.sustain_dex := true; X`09`09 6 :`09py.flags.sustain_chr := true; X`09`09 otherwise ; X`09 end; X X`09 with py.flags do X`09 begin X`09`09if (slow_digest) then X`09`09 food_digested := food_digested - 1; X`09`09if (regenerate) then X`09`09 food_digested := food_digested + 3; X`09 end; X`09 end; X end; X X X`09`7B Returns a '*' for cursed items, a ')' for normal ones`09-RAK-`09`7D X`09`7B NOTE: '*' returned only if item has been identified...`09`7D X function cur_char1(item_val : integer) : char; X begin X`09with inventory`5Bitem_val`5D do X`09 if (uand(%X'80000000',flags) = 0) then X`09 cur_char1 := ')'`09`7B Not cursed...`09`09`09`7D X`09 else if (index(name,'`5E') > 0) then X`09 cur_char1 := ')'`09`7B Cursed, but not identified`09`7D X`09 else X`09 cur_char1 := '*';`09`7B Cursed and identified...`09`7D X end; X X X`09`7B Returns a '*' for cursed items, a ')' for normal ones`09-RAK-`09`7D X function cur_char2(item_val : integer) : char; X begin X`09with inventory`5Bitem_val`5D do X`09 if (uand(%X'80000000',flags) = 0) then X`09 cur_char2 := ')'`09`7B Not cursed...`09`7D X`09 else X`09 cur_char2 := '*';`09`7B Cursed...`09`7D X end; X X X`09`7B Comprehensive function block to handle all inventory`09-RAK-`09`7D X`09`7B and equipment routines. Five kinds of calls can take place.`09`7D X`09`7B Note that '?' is a special call for other routines to display`09`7D X`09`7B only a portion of the inventory, and take no other action.`09`7D X function inven_command(command : char; r1,r2 : integer) : boolean; X var X`09com_val,scr_state`09`09: integer; X`09exit_flag,test_flag`09`09: boolean; X X X`09`7B Displays inventory items from r1 to r2`09-RAK-`09`7D X procedure show_inven(r1,r2 : integer); X`09var X`09 i1`09`09`09`09`09: integer; X`09 tmp_val,out_val`09`09`09: vtype; X`09begin X`09 if (r1 > 0) then`09`09`09`7B R1 = 0 dummy call`09`7D X`09 begin X`09 for i1 := r1 to r2 do`09`09`7B Print the items`09`7D X`09 begin X`09 objdes(tmp_val,i1,true); X`09 writev(out_val,chr(i1+96),cur_char1(i1),' ',tmp_val); X`09 prt(out_val,i1+1,1); X`09 end; X`09 if (r2 < 22) then prt('',r2+2,1);`09`7B Clear line after`09`7D X`09 scr_state := 1;`09`09`09`7B Set state to 1`09`7D X`09 end; X`09end; X X`09`7B Displays equipment items from r1 to end`09-RAK-`09`7D X procedure show_equip(r1 : integer); X`09var X`09 i1,i2`09`09`09`09: integer; X`09 prt1,prt2,out_val`09`09: vtype; X`09begin X`09 if (r1 > equip_ctr) then`09`7B Last item gone`09`09`7D X`09 prt('',equip_ctr+3,1) X`09 else if (r1 > 0) then`09`09`7B R1 = 0 dummy call`09`09`7D X`09 begin X`09 i2 := 0; X`09 for i1 := 23 to inven_max-1 do`7B Range of equipment`09`7D X`09 begin X`09 with inventory`5Bi1`5D do X`09 if (tval > 0) then X`09`09 begin X`09`09 i2 := i2 + 1; X`09`09 if (i2 >= r1) then`7B Display only given range`09`7D X`09`09 begin X`09 `09`09 case i1 of`09`09`7B Get position`09`09`7D X`09`09`09 23 :`09prt1 := ' You are wielding : '; X`09`09`09 24 :`09prt1 := ' Worn on head : '; X`09`09`09 25 :`09prt1 := ' Worn around neck : '; X`09`09`09 26 :`09prt1 := ' Worn on body : '; X`09`09`09 27 :`09prt1 := ' Worn on arm : '; X`09`09`09 28 :`09prt1 := ' Worn on hands : '; X`09`09`09 29 :`09prt1 := ' Worn on right hand : '; X`09`09`09 30 :`09prt1 := ' Worn on left hand : '; X`09`09`09 31 :`09prt1 := ' Worn on feet : '; X`09`09`09 32 :`09prt1 := ' Worn about body : '; X`09`09`09 33 :`09prt1 := ' Light source : '; X`09`09`09 34 :`09prt1 := ' Secondary weapon : '; X`09`09`09 otherwise prt1 := ' Unknown value : '; X`09`09`09 end; X`09`09`09 objdes(prt2,i1,true); X`09`09`09 writev(out_val,chr(i2+96),cur_char2(i1), X`09`09`09`09`09`09`09`09prt1,prt2); X`09`09`09 prt(out_val,i2+2,1); X`09`09 end; X`09`09 end; X`09 end; X`09 if (wizard2) then X`09`09begin X`09`09 `7Bwritev(out_val,'Speed Factor is ',py.flags.speed(4:0)); X`09`09 prt(out_val,i2+3,1);`7D`09`7B Say what speed`09`7D X`7B`09`09 prt('',i2+4,1);`7D`09`7B Clear last line`09`7D X`09`09end X`09 else X`09 prt('',i2+4,1);`09`7B Clear last line`09`7D X`09 scr_state := 2;`09`7B Set state of screen`09`7D X`09 end; X`09end; X X`09`7B Remove item from equipment list`09`09-RAK-`09`7D X function remove(item_val : integer) : integer; X var X`09 i1,i2,typ`09`09`09`09: integer; X`09 out_val,prt1,prt2`09`09`09: vtype; X`09 flag`09`09`09`09`09: boolean; X begin X`09 i1 := 0; X`09 flag := false; X`09 typ := inventory`5Bitem_val`5D.tval; X`09 repeat X`09 i1 := i1 + 1; X`09 with inventory`5Bi1`5D do X`09 if (typ > tval) then X`09`09begin X`09`09 for i2 := inven_ctr downto i1 do X`09`09 inventory`5Bi2+1`5D := inventory`5Bi2`5D; X`09`09 inventory`5Bi1`5D := inventory`5Bitem_val`5D; X`09`09 inven_ctr := inven_ctr + 1; X`09`09 equip_ctr := equip_ctr - 1; X`09`09 flag := true; X`09`09end; X`09 until (flag); X`09 case typ of X`09 10,11,12,20,21,22,23,25 : prt1 := 'Was wielding '; X`09 15`09`09`09 : prt1 := 'Light source was '; X`09 otherwise`09`09 prt1 := 'Was wearing '; X`09 end; X`09 objdes(prt2,i1,true); X`09 out_val := prt1 + prt2 + ' (' + chr(i1+96) + ')'; X`09 msg_print(out_val); X`09 inventory`5Bitem_val`5D := blank_treasure; X`09 if (item_val <> inven_max-1) then`09`7B For secondary weapon`09`7D X`09 py_bonuses(inventory`5Bi1`5D,-1); X`09 remove := i1; X end; X X`09`7B Unwear routine, remove a piece of equipment`09-RAK-`09`7D X procedure unwear; X`09var X`09 i1,i2,com_val`09`09`09`09: integer; X`09 exit_flag,test_flag`09`09`09: boolean; X`09 command`09`09`09`09: char; X`09 out_val`09`09`09`09: vtype; X`09begin X`09 if (scr_state = 1) then X`09 begin X`09 clear(1,1); X`09 show_equip(1); X`09 end; X`09 exit_flag := false; X`09 repeat X`09 writev(out_val,'(a-',chr(equip_ctr+96),', * for equipment list,', X`09`09' `5EZ to exit) ','Take off which one ?'); X`09 test_flag := false; X`09 msg_print(out_val); X`09 repeat X`09 inkey(command); X`09 com_val := ord(command); X`09 case com_val of X`09`090,3,25,26,27 :`09begin X`09`09`09`09 test_flag := true; X`09`09`09`09 exit_flag := true; X`09`09`09`09end; X`09`0942`09 :`09begin X`09`09`09`09 clear(2,1); X`09`09`09`09 show_equip(1); X`09`09`09`09end; X`09`09otherwise`09begin X`09`09`09`09 com_val := com_val - 96; X`09`09`09`09 if ((com_val >= 1) and`20 X`09`09`09`09 (com_val <= equip_ctr)) then`20 X`09`09`09`09 test_flag := true; X`09`09`09`09end; X`09 end; X`09 until (test_flag); X`09 if (not(exit_flag)) then X`09 begin X`09`09reset_flag := false;`09`7B Player turn`09`7D X`09`09i1 := 0; X`09`09i2 := 22; X`09`09repeat X`09`09 i2 := i2 + 1; X`09`09 if (inventory`5Bi2`5D.tval > 0) then X`09`09 i1 := i1 + 1; X`09`09until (i1 = com_val); X`09`09if (uand(%X'80000000',inventory`5Bi2`5D.flags) <> 0) then X`09`09 begin X`09 msg_print('Hmmm, it seems to be cursed...'); X`09`09 com_val := 0; X`09`09 end X`09`09else X`09`09 remove(i2); X`09 end; X`09 if (scr_state = 0) then X`09 exit_flag := true X`09 else if (equip_ctr = 0) then X`09 exit_flag := true X`09 else if (inven_ctr > 21) then X`09 exit_flag := true X`09 else if (not(exit_flag)) then X`09 show_equip(com_val); X`09 until(exit_flag); X`09 if (scr_state <> 0) then X`09 if (equip_ctr = 0) then X`09 clear(1,1) X`09 else X`09 prt('You are currently using -',1,1); X`09end; X X`09`7B Wear routine, wear or wield an item`09`09-RAK-`09`7D X procedure wear; X`09var X`09 com_val,i1,i2,i3,tmp`09`09`09: integer; X`09 out_val,prt1,prt2`09`09`09: vtype; X`09 unwear_obj`09`09`09`09: treasure_type; X`09 exit_flag,test_flag`09`09`09: boolean; X`09begin X`09 if (scr_state = 2) then X`09 begin X`09 clear(1,1); X`09 show_inven(1,inven_ctr); X`09 end; X`09 exit_flag := false; X`09 repeat +-+-+-+-+-+-+-+- END OF PART 36 +-+-+-+-+-+-+-+-