-+-+-+-+-+-+-+-+ START OF PART 50 -+-+-+-+-+-+-+-+ X end; X X X`09`7B Return string describing how much the amount is worth`09-DMF-`09`7D X`5Bglobal,psect(misc4$code)`5D function cost_str(amount : integer) : string; X var X`09out_val`09`09: string; X begin X if (amount >= mithril$value) then X`09writev(out_val,(amount div mithril$value):1,' mithril') X else if (amount >= platinum$value) then X`09writev(out_val,(amount div platinum$value):1,' platinum') X else if (amount >= gold$value) then X`09writev(out_val,(amount div gold$value):1,' gold') X else if (amount >= silver$value) then X`09writev(out_val,(amount div silver$value):1,' silver') X else if (amount >= copper$value) then X`09writev(out_val,(amount div copper$value):1,' copper') X else X`09writev(out_val,amount:1,' iron'); X cost_str := out_val; X end; X X`5Bglobal,psect(misc4$code)`5D procedure reset_total_cash; X var i1 : integer; X begin X`09with py.misc do X`09 begin X`09 money`5Btotal$`5D := 0; X`09 for i1 := 1 to 6 do X`09 money`5Btotal$`5D:=money`5Btotal$`5D+money`5Bi1`5D*coin$value`5Bi1` V5D; X`09 money`5Btotal$`5D := money`5Btotal$`5D div gold$value; X`09 end; X end; X X X`09`7B Add money in the lightest possible amounts.`09`09-DMF-/DY`7D X`5Bglobal,psect(misc4$code)`5D procedure add_money(amount`09: integer); X var X`09temp,to_bank,wl,i1`09: integer; X`09out_val`09`09`09: string; X`09type_num`09`09: integer; X`09coin_num`09`09: integer; X procedure add_munny(type_num : integer); X`09var trans,w_max : integer; X`09begin X`09 coin_num := py.misc.money`5Btype_num`5D; X`09 trans := amount div coin$value`5Btype_num`5D; X`09 w_max := (wl*100-inven_weight) div coin$weight; X`09 if (w_max < - coin_num) then X`09 w_max := - coin_num; X`09 if (w_max < trans) then X`09 begin X`09 to_bank := to_bank + (trans - w_max) * coin$value`5Btype_num`5D; X`09 trans := w_max; X`09 end; X`09 inven_weight := inven_weight+coin$weight*trans; X`09 py.misc.money`5Btype_num`5D := coin_num + trans; X`09 amount := amount mod coin$value`5Btype_num`5D; X`09end; X X begin X`09to_bank := 0; X`09wl := weight_limit; X`09with py.misc do X`09 begin X`09 for type_num := mithril downto iron do X`09 add_munny(type_num); X`09 reset_total_cash; X`09 if (to_bank > 0) then X`09 begin X`09 msg_print('You cannot carry '+cost_str(to_bank)+ X`09`09`09' of the money'); X`09 if (get_yes_no('Do you wish to send a page to the bank with the exc Vess money?')) then X`09`09begin X`09`09 i1 := (((95 * to_bank) div 100) div gold$value); X`09`09 if (i1 < 5) then X`09`09 msg_print('The page cannot be moved by such paltry sums of gold.') X`09`09 else X`09`09 if (randint(mugging_chance) = 1) then X`09`09 begin X`09`09 msg_print('The page is mugged!'); X`09`09 msg_print('The '+cost_str(to_bank)+' is lost!'); X`09`09 end X`09`09 else X`09`09 begin X`09`09 bank`5Bgold`5D := bank`5Bgold`5D + i1; X`09`09`09py.misc.account := py.misc.account + i1; X`09`09`09bank`5Btotal$`5D := (bank`5Bmithril`5D*coin$value`5Bmithril`5D+ Xbank`5Bplatinum`5D*coin$value`5Bplatinum`5D) div gold$value + bank`5Bgold`5D V; X`09`09`09writev(out_val,i1:1); X`09`09`09msg_print('The page deposits '+out_val+' gold at the bank for you.' V); X`09`09 end; X`09`09end X`09 else `20 X`09`09msg_print('You cannot carry the change, so it is lost.'); X`09 end; X`09end; X end; X X X`09`7B Give money to store, but can give back change`09`09-DMF-/DY`7D X`5Bglobal,psect(misc4$code)`5D procedure subtract_money( X`09`09`09amount`09`09: integer; X`09`09`09make_change`09: boolean); X var X`09amt,trans,temp`09: integer; X`09typ`09`09: char; X`09type_num : integer; X X`09function sub_munny(type_num : integer) : boolean; X`09 var trans,coin_num : integer; X`09 begin X`09 coin_num := py.misc.money`5Btype_num`5D; X`09 trans := (amt+coin$value`5Btype_num`5D-1) div coin$value`5Btype_num`5 VD; X`09 if (coin_num < trans) then trans := coin_num; X`09 temp := temp + coin$weight*trans; X`09 py.misc.money`5Btype_num`5D := coin_num - trans; X`09 amt := amt - trans*coin$value`5Btype_num`5D; X`09 sub_munny := amt > 0; X`09 end; X X begin X`09temp := 0; X`09amt := amount; X`09type_num := 1; X`09while (sub_munny(type_num) and (type_num < mithril)) do X`09 type_num := type_num + 1; X`09inven_weight := inven_weight - temp; X`09reset_total_cash; X`09if (make_change) then add_money(-amt); X end; X X X`09`7B Send a page to the bank to fetch money`09`09-DMF-`09`7D X`5Bglobal,psect(misc2$code)`5D function send_page(to_bank : integer) : boole Van; X var X`09back`09`09: boolean; X`09from_bank`09: integer; X`09out_val`09`09: string; X X procedure takey_munny(coin_value : integer; var bank_assets : integer); X var trans : integer; X begin X`09trans := (to_bank*gold$value) div coin_value; X`09if (bank_assets < trans) then trans := bank_assets; X`09bank_assets := bank_assets - trans; X`09from_bank := from_bank + (trans * coin_value) div gold$value; X`09to_bank := to_bank - (trans * coin_value) div gold$value; X`09py.misc.account := py.misc.account-(trans*coin_value) div gold$value; X end; X X begin X`09back := false; X`09if (get_yes_no('Do you wish to send a page to the bank for money?')) then X`09 begin X`09 from_bank := 0; X`09 if (py.misc.account < to_bank) then X`09 msg_print('The page returns and says that your balance is too low.' V) X`09 else if (bank`5Btotal$`5D < to_bank) then X`09 msg_print('The page returns and says that the bank is out of money. V') X`09 else X`09 begin X`09`09takey_munny(coin$value`5Bmithril`5D,bank`5Bmithril`5D); X`09`09takey_munny(coin$value`5Bplatinum`5D,bank`5Bplatinum`5D); X`09`09takey_munny(gold$value,bank`5Bgold`5D); X`09`09if (randint(mugging_chance) = 1) then X`09`09 begin X`09`09 msg_print('The page was mugged while returning from the bank!'); X`09`09 writev(out_val,from_bank:1); X`09`09 msg_print('You have lost '+out_val+' gold pieces!'); X`09`09 end X`09`09else X`09`09 begin X`09`09 writev(out_val,from_bank:1); X`09`09 msg_print('The page returns with '+out_val+' gold pieces.'); X`09`09 subtract_money(py.misc.money`5Btotal$`5D * gold$value,false); X`09`09 back := true; X`09`09 end; X`09 end; X`09 msg_print(' '); X`09 end X`09else X`09 msg_print('You cannot buy that with the money you are carrying.'); X`09send_page := back; X end; X X X`09`7B Returns spell chance of failure for spell`09`09-RAK-`09`7D X`5Bglobal,psect(misc2$code)`5D procedure spell_chance(var spell : spl_rec); X begin X`09with magic_spell`5Bpy.misc.pclass,spell.splnum`5D do X`09 with spell do X`09 begin X`09 splchn := sfail - 3*(py.misc.lev-slevel); X`09 if (class`5Bpy.misc.pclass`5D.mspell) then X`09`09splchn := splchn - 3*(spell_adj(iq)-1) X`09 else if (class`5Bpy.misc.pclass`5D.bspell) then X`09`09splchn := splchn - 3*(bard_adj-1) X`09 else if (class`5Bpy.misc.pclass`5D.dspell) then X`09`09splchn := splchn - 3*(druid_adj-1) X`09 else X`09`09splchn := splchn - 3*(spell_adj(ws)-1); `20 X`09 if (smana > py.misc.cmana) then X`09`09splchn := splchn + 5*trunc(smana-py.misc.cmana); X`09 if (splchn > 95) then X`09`09splchn := 95 X`09 else if (splchn < 5) then X`09`09splchn := 5; X`09 end X end; X X X`09`7B Print list of spells`09`09`09`09`09-RAK-`09`7D X`5Bglobal,psect(misc2$code)`5D procedure print_new_spells( X`09`09`09spell`09`09:`09spl_type; X`09`09`09num`09`09:`09integer; X`09`09`09var redraw`09:`09boolean X`09`09`09`09`09); X var X`09i1`09`09`09`09: integer; X`09out_val`09`09`09`09: vtype; X X begin X redraw := true; X clear(1,1); X prt(' Name Level Mana %Failure',2,1); X for i1 := 1 to num do X`09with magic_spell`5Bpy.misc.pclass,spell`5Bi1`5D.splnum`5D do X`09 if (i1 < 23) then X`09 begin X`09 spell_chance(spell`5Bi1`5D); X`09 writev(out_val,chr(96+i1),') ',pad(sname,' ',30), X`09`09slevel:3,' ',smana:3,' ',spell`5Bi1`5D.splchn:2); X`09 prt(out_val,2+i1,1); X`09 end; X end; X X X X`09`7B Returns spell pointer`09`09`09`09`09-RAK-`09`7D X`5Bglobal,psect(misc2$code)`5D function get_spell(spell : spl_type; num : in Vteger; X`09`09 var sn,sc : integer; prompt : vtype; X`09`09 var redraw : boolean) : boolean; X var X`09i1`09`09`09`09: integer; X`09flag`09`09`09`09: boolean; X`09choice`09`09`09`09: char; X`09out_val1,out_val2`09`09: vtype; X begin X sn := 0; X flag := true; X writev(out_val1,'(Spells a-',chr(num+96), X`09`09`09`09', *,=List, =exit) ',prompt); X while (((sn < 1) or (sn > num)) and (flag)) do X`09begin X`09 prt(out_val1,1,1); X`09 inkey(choice); X`09 sn := ord(choice); X`09 case sn of X`09 0,3,25,26,27:`09begin X`09`09`09 flag := false; X`7B`09`09`09 reset_flag := true;`7D X`09`09`09end; X`09 42,32 : print_new_spells(spell,num,redraw); X`09 otherwise`09sn := sn - 96; X`09 end; X`09end; X msg_flag := false; X if (flag) then X`09begin X`09 spell_chance(spell`5Bsn`5D); X`09 sc := spell`5Bsn`5D.splchn; X`09 sn := spell`5Bsn`5D.splnum; X`09end; X get_spell := flag; X end; X X`5Bglobal,psect(misc2$code)`5D function num_new_spells(smarts : integer) : i Vnteger; X begin X`09case (smarts) of X`09 1..3`09: num_new_spells := 1; X`09 4,5`09: num_new_spells := randint(2); X`09 6`09: num_new_spells := randint(3); X`09 7`09: num_new_spells := randint(2)+1; X`09 otherwise num_new_spells := 0; X`09end; X end; X X`09`7B Learn some magic spells (Mage)`09`09`09-RAK-`09`7D X`5Bglobal,psect(misc2$code)`5D function learn_spell(var redraw : boolean) : V boolean; X var X`09i2,i4`09`09`09`09: unsigned; X`09i1,i3,sn,sc`09`09`09: integer; X`09new_spells`09`09`09: integer; X`09spell_flag,spell_flag2`09`09: unsigned; X`09spell`09`09`09`09: spl_type; X`09curse`09`09`09`09: treas_ptr; X begin X`09learn_spell := false; X`09new_spells := num_new_spells(spell_adj(iq)); X`09i1 := 0; X`09spell_flag := 0; X`09spell_flag2 := 0; X`09curse := inventory_list; X`09while (curse <> nil) do X`09 begin X`09 if (curse`5E.data.tval = Magic_book) then X`09 begin X`09 spell_flag := uor(spell_flag,curse`5E.data.flags); X`09 spell_flag2 := uor(spell_flag2,curse`5E.data.flags2); X`09 end; X`09 curse := curse`5E.next; X`09 end; X`09while ((new_spells > 0) and ((spell_flag > 0) or (spell_flag2 > 0))) do X`09 begin X`09 i1 := 0; X`09 i2 := spell_flag; X`09 i4 := spell_flag2; X`09 repeat X`09 i3 := bit_pos64(i4,i2); X`09 if (i3 > 31) then i3 := i3 - 1; X`09 with magic_spell`5Bpy.misc.pclass,i3`5D do X`09`09if (slevel <= py.misc.lev) then X`09`09 if (not(learned)) then X`09`09 begin X`09`09 i1 := i1 + 1; X`09`09 spell`5Bi1`5D.splnum := i3; X`09`09 end; X`09 until((i2 = 0) and (i4 = 0)); X`09 if (i1 > 0) then X`09 begin X`09`09print_new_spells(spell,i1,redraw); X`09`09if (get_spell(spell,i1,sn,sc,'Learn which spell?',redraw)) then X`09`09 begin X`09`09 magic_spell`5Bpy.misc.pclass,sn`5D.learned := true; X`09`09 learn_spell := true; X`09`09 if (py.misc.mana = 0) then X`09`09 begin X`09`09`09py.misc.mana := 1; X`09`09`09py.misc.cmana := 1; X`09`09 end; X`09`09 end X`09`09else X`09`09 new_spells := 0; X`09 end X`09 else X`09 new_spells := 0; X`09 new_spells := new_spells - 1; X`09 end; X end; X X X`09`7B Learn some magic songs (Bard)`09`09`09-Cap'n-`09`7D X`5Bglobal,psect(misc2$code)`5D function learn_song(var redraw : boolean) : b Voolean; X var X`09i2,i4`09`09`09`09: unsigned; X`09i1,i3,sn,sc`09`09`09: integer; X`09new_spells`09`09`09: integer; X`09spell_flag,spell_flag2`09`09: unsigned; X`09spell`09`09`09`09: spl_type; X`09curse`09`09`09`09: treas_ptr; X begin X`09learn_song := false; X`09new_spells := num_new_spells(bard_adj); X`09i1 := 0; X`09spell_flag := 0; X`09spell_flag2 := 0; X`09curse := inventory_list; X`09while (curse <> nil) do X`09 begin X`09 if (curse`5E.data.tval = Song_book) then X`09 begin X`09 spell_flag := uor(spell_flag,curse`5E.data.flags); X`09 spell_flag2 := uor(spell_flag2,curse`5E.data.flags2); X`09 end; X`09 curse := curse`5E.next; X`09 end; X`09while ((new_spells > 0) and ((spell_flag > 0) or (spell_flag2 > 0))) do X`09 begin X`09 i1 := 0; X`09 i2 := spell_flag; X`09 i4 := spell_flag2; X`09 repeat X`09 i3 := bit_pos64(i4,i2); X`09 if (i3 > 31) then i3 := i3 - 1; X`09 with magic_spell`5Bpy.misc.pclass,i3`5D do X`09`09if (slevel <= py.misc.lev) then X`09`09 if (not(learned)) then X`09`09 begin X`09`09 i1 := i1 + 1; X`09`09 spell`5Bi1`5D.splnum := i3; X`09`09 end; X`09 until((i2 = 0) and (i4 = 0)); X`09 if (i1 > 0) then X`09 begin X`09`09print_new_spells(spell,i1,redraw); X`09`09if (get_spell(spell,i1,sn,sc,'Learn which spell?',redraw)) then X`09`09 begin X`09`09 magic_spell`5Bpy.misc.pclass,sn`5D.learned := true; X`09`09 learn_song := true; X`09`09 if (py.misc.mana = 0) then X`09`09 begin X`09`09`09py.misc.mana := 1; X`09`09`09py.misc.cmana := 1; X`09`09 end; X`09`09 end X`09`09else X`09`09 new_spells := 0; X`09 end X`09 else X`09 new_spells := 0; X`09 new_spells := new_spells - 1; X`09 end; X end; X X`09`7B Learn some prayers (Priest)`09`09`09`09-RAK-`09`7D X`5Bglobal,psect(misc2$code)`5D function learn_prayer : Boolean; X var X`09i1,i2,i3,i4,new_spell`09`09: integer; X`09test_array`09`09`09: array `5B1..32`5D of integer; X`09spell_flag,spell_flag2`09`09: unsigned; X`09curse`09`09`09`09: treas_ptr; X begin X`09i1 := 0; X`09spell_flag := 0; X`09spell_flag2 := 0; X`09curse := inventory_list; X`09while (curse <> nil) do X`09 begin X`09 if (curse`5E.data.tval = Prayer_book) then X`09 begin X`09 spell_flag := uor(spell_flag,curse`5E.data.flags); X`09 spell_flag2 := uor(spell_flag2,curse`5E.data.flags2); X`09 end; X`09 curse := curse`5E.next; X`09 end; X`09i1 := 0; X`09while ((spell_flag > 0) or (spell_flag2 > 0)) do X`09 begin +-+-+-+-+-+-+-+- END OF PART 50 +-+-+-+-+-+-+-+-