-+-+-+-+-+-+-+-+ START OF PART 58 -+-+-+-+-+-+-+-+ X else if (typ > tval) then X begin `7B Insert into list `7D X insert(item_val,wgt); X flag := true; X end; X until ((item_val >= inven_ctr) or (flag)); X if (not(flag)) then `7B Becomes last item in list `7D X begin X insert(inven_ctr+1,wgt); X item_val := inven_ctr; X end; X end; X`20 X`20 X`7B Finds range of item in inventory list `7D X`5Bpsect(misc4$code)`5D function find_range(item_val : obj_set;`20 X`09`09`09`09`09var i2,i3 : integer) : boolean; X var X i1 : integer; X flag: boolean; X BEGIN X i1 := 0; X i2 := 0; X i3 := 0; X flag := false; X while(i1 < inven_ctr) do X BEGIN X i1 := i1 + 1; X if ((inventory`5Bi1`5D.tval in item_val) and (not (flag))) then X BEGIN X flag := true; X i2 := i1; X END; X if ((not(inventory`5Bi1`5D.tval in item_val)) and (flag) and X (i3 = 0)) th Ven X i3 := i1 - 1; X END; X if ((flag) and (i3 = 0)) then X i3 := inven_ctr; X find_range := flag; X END; X X`7B Returns spell chance of failure for spell `7D X`5Bpsect(misc2$code)`5D procedure skill_chance(var spell : spl_rec); X var X adjust : integer; X begin X case py.misc.pclass of X`09 1,2,7: adjust := int_adj; X`09 3,4: adjust := wis_adj; X`09 5,6: adjust := chr_adj; X`09end; X with skill_list`5Bspell.splnum`5D do X with spell do X begin X splchn := sfail - 3*(py.misc.lev-slevel) - 3*(adjust-1); X if (smana > py.misc.cmana) then X splchn := splchn + 5*trunc(smana-py.misc.cmana); X if (splchn > 95) then X splchn := 95 X else if (splchn < 5) then X splchn := 5; X end ; X end; X`20 X`20 X`7B Print list of spells `7D X`5Bpsect(misc2$code)`5D procedure print_new_skills( X spell : spl_type; X num : integer; X var redraw : boolean); X var X i1 : integer; X out_val : vtype; X begin X redraw := true; X clear(1,1); X prt(' Name Level Rsrc %Failure',2,1); X for i1 := 1 to num do X with skill_list`5Bspell`5Bi1`5D.splnum`5D do X begin X skill_chance(spell`5Bi1`5D); X writev(out_val,chr(96+i1),') ',pad(sname,' ',30), X slevel:3,' ',smana:3,' ',spell`5Bi1`5D.splchn:2); X prt(out_val,2+i1,1); X end X end; X`20 X`20 X`7B Returns spell pointer `7D X`5Bpsect(misc2$code)`5D function get_skill( spell : spl_type; X`09`09`09`09`09num : integer; X`09`09`09`09 var sn,sc : integer;`20 X`09`09`09`09`09prompt : vtype; X`09`09`09`09 var redraw : boolean) : boolean; X var X i1 `09 : integer; X flag : boolean; X choice : char; X out_val : vtype; X begin X sn := 0; X flag := true; X writev(out_val,'(Skills a-',chr(num+96), X ', space=list, =exit) ',prompt); X while (((sn < 1) or (sn > num)) and (flag)) do X begin X prt(out_val,1,1); X inkey(choice); X sn := ord(choice); X case sn of X 0,3,25,26,27: begin X flag := false; X reset_flag := true; X end; X 32 : print_new_skills(spell,num,redraw); X otherwise sn := sn - 96; X end; X end; X msg_flag := false; X if (flag) then X begin X skill_chance(spell`5Bsn`5D); X sc := spell`5Bsn`5D.splchn; X sn := spell`5Bsn`5D.splnum; X end; X get_skill := flag; X end; X`20 X`20 X`7B Based on adjustment, determines how many new skills are learned. -RLG`7D X`5Bpsect(misc2$code)`5D function how_many_skills(adjustment: integer) : inte Vger; X var X num : integer; X begin X case adjustment of X 0 : num := 0; X 1,2,3 : num := 1; X 4 : num := randint(2); X 5 : num := 2; X 6 : num := randint(3); X 7 : num := randint(2)+1; X`098 : num := randint(3)+1; X`099 : num := randint(2)+2; X 10 : num := randint(5); X end; X how_many_skills := num; X end;`09 X X`7B Learn some magic spells (Scientist) `7D X`5Bpsect(misc2$code)`5D function learn_spell(var redraw : boolean) : boolean V; X var X i2 `09`09: unsigned; X i1,i3,sn,sc : integer; X new_spells`09: integer; X spell_flag`09: unsigned; X spell`09`09: spl_type; X begin X learn_spell := false; X`09new_spells := how_many_skills(int_adj); X i1 := 0; X spell_flag := 0; X repeat X i1 := i1 + 1; X if (inventory`5Bi1`5D.tval = 90) then X spell_flag := uor(spell_flag,inventory`5Bi1`5D.flags); X until (i1 >= inven_ctr); X while ((new_spells > 0) and (spell_flag > 0)) do X begin X i1 := 0; X i2 := spell_flag; X repeat X i3 := bit_pos(i2); X with skill_list`5Bi3`5D do X if (slevel <= py.misc.lev) then X if (not(learned)) then X begin X i1 := i1 + 1; X spell`5Bi1`5D.splnum := i3; X end; X until(i2 = 0); X if (i1 > 0) then X begin X print_new_skills(spell,i1,redraw); X if (get_skill(spell,i1,sn,sc,'Learn which skill?',redraw)) then X begin X skill_list`5Bsn`5D.learned := true; X learn_spell := true; X if (py.misc.mana = 0) then X begin X py.misc.mana := 1; X py.misc.cmana := 1; X end; X end X else X new_spells := 0; X end X else X new_spells := 0; X new_spells := new_spells - 1; X end; X end; X`20 X`7B Learn some extra spells (Con-Artist) `7D X`5Bpsect(misc2$code)`5D function learn_extra(var redraw : boolean) : boolean V; X var X i2 : unsigned; X i1,i3,sn,sc : integer; X new_spells : integer; X spell_flag : unsigned; spell : spl_type; X begin X learn_extra := false; X`09new_spells := how_many_skills(chr_adj); X i1 := 0; X spell_flag := 0; X repeat X i1 := i1 + 1; X if (inventory`5Bi1`5D.tval = 92) then X spell_flag := uor(spell_flag,inventory`5Bi1`5D.flags); X until (i1 >= inven_ctr); X while ((new_spells > 0) and (spell_flag > 0)) do X begin X i1 := 0; X i2 := spell_flag; X repeat X i3 := bit_pos(i2); X with skill_list`5Bi3`5D do X if (slevel <= py.misc.lev) then X if (not(learned)) then X begin X i1 := i1 + 1; X spell`5Bi1`5D.splnum := i3; X end; X until(i2 = 0); X if (i1 > 0) then X begin X print_new_skills(spell,i1,redraw); X if (get_skill(spell,i1,sn,sc,'Learn which trick?',redraw)) then X begin X skill_list`5Bsn`5D.learned := true; X learn_extra := true; X if (py.misc.mana = 0) then X begin X py.misc.mana := 1; X py.misc.cmana := 1; X end; X end X else X new_spells := 0; X end X else X new_spells := 0; X new_spells := new_spells - 1; X end; X end; X`20 X`20 X`7B Learn some prayers (Guru) `7D X`5Bpsect(misc2$code)`5D function learn_prayer : boolean; X var X i1,i2,i3,i4,new_spell : integer; X test_array : array `5B1..32`5D of integer; X spell_flag : unsigned; X begin X i1 := 0; X spell_flag := 0; X repeat X i1 := i1 + 1; X if (inventory`5Bi1`5D.tval = 91) then X spell_flag := uor(spell_flag,inventory`5Bi1`5D.flags); X until(i1 >= inven_ctr); X i1 := 0; X while (spell_flag > 0) do X begin X i2 := bit_pos(spell_flag); X with skill_list`5Bi2`5D do X if (slevel <= py.misc.lev) then X if (not(learned)) then X begin X i1 := i1 + 1; X test_array`5Bi1`5D := i2; X end; X end; X`09i2 := how_many_skills(wis_adj); X new_spell := 0; X while ((i1 > 0) and (i2 > 0)) do X begin X i3 := randint(i1); X skill_list`5Btest_array`5Bi3`5D`5D.learned := true; X new_spell := new_spell + 1; X for i4 := i3 to i1-1 do X test_array`5Bi4`5D := test_array`5Bi4+1`5D; X i1 := i1 - 1; `7B One less spell to learn `7D X i2 := i2 - 1; `7B Learned one `7D X end; X if (new_spell > 0) then X begin X if (new_spell > 1) then X msg_print('You learned new prayers!') X else X msg_print('You learned a new prayer!'); X if (py.misc.exp = 0) then msg_print(' '); X if (py.misc.mana = 0) then X begin X py.misc.mana := 1; X py.misc.cmana := 1; X end; X learn_prayer := true; X end X else X learn_prayer := false; X end; X`20 X`20 X`7B Gain some resources if you know at least one skill `7D X`5Bpsect(misc2$code)`5D procedure gain_mana(amount : integer); X var X i1,new_mana : integer; X knows_spell : boolean; X begin X knows_spell := false; X for i1 := 1 to max_skills do X if (skill_list`5Bi1`5D.learned) then knows_spell := true; X if (knows_spell) then X begin X if (odd(py.misc.lev)) then X case amount of X 0 : new_mana := 0; X 1 : new_mana := 1; X 2 : new_mana := 1; X 3 : new_mana := 1; X 4 : new_mana := 2; X 5 : new_mana := 2; X 6 : new_mana := 3; X 7 : new_mana := 4; X`09`098 : new_mana := 5; X`09`099 : new_mana := 5; X`09 10 : new_mana := 6; X otherwise new_mana := 0; X end X else X case amount of X 0 : new_mana := 0; X 1 : new_mana := 1; X 2 : new_mana := 1; X 3 : new_mana := 2; X 4 : new_mana := 2; X 5 : new_mana := 3; X 6 : new_mana := 3; X 7 : new_mana := 4; X`09`098 : new_mana := 5; X`09`099 : new_mana := 6; X`09 10 : new_mana := 6; X otherwise new_mana := 0; X end; X py.misc.mana := py.misc.mana + new_mana; X py.misc.cmana := py.misc.cmana + new_mana; X end; X end; X`20 X`20 X`7B Increases hit points and level `7D X`5Bpsect(misc2$code)`5D procedure gain_level; X var X nhp,dif_exp,need_exp : integer; X redraw : boolean; X out_val : vtype; X BEGIN X with py.misc do X Begin X lev := lev + 1; X`09 if (lev >40) then`20 X`09 begin X`09 mhp := trunc(mhp*1.25); X`09`09mana := trunc(mana*1.25); X`09 end; X nhp := get_hitdie; X mhp := mhp + nhp; X chp := chp + nhp; X need_exp := trunc(player_exp`5Blev`5D*expfact); X if (py.misc.exp > need_exp) then X begin X dif_exp := py.misc.exp - need_exp; X py.misc.exp := need_exp + (dif_exp div 2); X end; X title := player_title`5Bpclass,lev`5D; X writev(out_val,'Welcome to level ',lev:1,'.'); X msg_print(out_val); X msg_print(' '); X msg_flag := false; X prt_level; X prt_title; X prt_mhp; X prt_chp; X if (pskill in `5B1,2,7`5D) then X begin X redraw := false; X learn_spell(redraw); X if (redraw) then draw_cave; X gain_mana(int_adj); X`09`09 prt_mana; X end; X if (pskill in `5B3,4`5D) then X begin X learn_prayer; X gain_mana(wis_adj); X`09`09 prt_mana; X end; X if (pskill in `5B5,6`5D) then X begin X redraw := false; X learn_extra(redraw); X if (redraw) then draw_cave; X gain_mana(chr_adj); X`09`09 prt_mana; X end; X End; X END; X`20 X`20 X`7B Prints experience `7D X procedure prt_experience; X var X tmp_exp : integer; X begin X with py.misc do X begin X if (exp > player_max_exp) then exp := player_max_exp; X if (lev < max_player_level) then X begin X while (trunc(player_exp`5Blev`5D*expfact) <= exp) do gain_leve Vl; X if (exp > max_exp) then max_exp := exp; X end; X end; X prt_num('',py.misc.exp,15,stat_column+6); X end; X`20 X`20 X`7B Inserts a string into a string `7D X procedure insert_str ( X %ref object_str : varying`5Ba`5D of char; +-+-+-+-+-+-+-+- END OF PART 58 +-+-+-+-+-+-+-+-