-+-+-+-+-+-+-+-+ START OF PART 36 -+-+-+-+-+-+-+-+ X splchn := splchn + 5*trunc(smana-py.misc.cmana); X if (splchn > 95) then X splchn := 95 X else if (splchn < 0) then X splchn := 0; X end ; X X if (class`5Bpy.misc.pclass`5D.pspell) then X with priest_spell`5Bpy.misc.pclass,spell.splnum`5D do X with spell do X begin X splchn := sfail - 3*(py.misc.lev-slevel); X if (class`5Bpy.misc.pclass`5D.mspell) then X splchn := splchn - 3*(int_adj-1) X else X splchn := splchn - 3*(wis_adj-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 < 0) then X splchn := 0; X end; X if (class`5Bpy.misc.pclass`5D.espell) then X with extra_spell`5Bpy.misc.pclass,spell.splnum`5D do X with spell do X begin X splchn := sfail - 3*(py.misc.lev-slevel); X if (class`5Bpy.misc.pclass`5D.mspell) then X splchn := splchn - 3*(int_adj-1) X else X splchn := splchn - 3*(wis_adj-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 < 0) then X splchn := 0; X end X end; X `20 X`20 X`7B Print list of spells `7D X`5Bpsect(misc2$code)`5D procedure print_new_spells( X spell : spl_type; X num : integer; X var redraw : boolean X ); X var X i1 : integer; X out_val : vtype; X begin X redraw := true; `20 X clear(1,1); X prt(' Name Level Mana %Failure',2,1); X for i1 := 1 to num do X if (class`5Bpy.misc.pclass`5D.mspell) then X with mage_spell`5Bpy.misc.pclass,spell`5Bi1`5D.splnum`5D do X begin X spell_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`09else X if (class`5Bpy.misc.pclass`5D.pspell) then X with priest_spell`5Bpy.misc.pclass,spell`5Bi1`5D.splnum`5D do X begin X spell_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`09else X if (class`5Bpy.misc.pclass`5D.espell) then X with extra_spell`5Bpy.misc.pclass,spell`5Bi1`5D.splnum`5D do X begin X spell_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`20 X`7B Returns spell pointer `7D X`5Bpsect(misc2$code)`5D function get_spell(spell : spl_type; num : integer; X var sn,sc : integer; prompt : vtype; X var redraw : boolean) : boolean; X var X i1 : integer; X flag : boolean; X choice : char; X out_val1,out_val2 : vtype; X begin X sn := 0; X flag := true; X writev(out_val1,'(Spells a-',chr(num+96), X ', *=List, =exit) ',prompt); X while (((sn < 1) or (sn > num)) and (flag)) do X begin X prt(out_val1,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 42 : print_new_spells(spell,num,redraw); X otherwise sn := sn - 96; X end; X end; X msg_flag := false; X if (flag) then X begin X spell_chance(spell`5Bsn`5D); X sc := spell`5Bsn`5D.splchn; X sn := spell`5Bsn`5D.splnum; X end; X get_spell := flag; X end; X`20 X`20 X`7B Learn some magic spells (Mage) `7D X`5Bpsect(misc2$code)`5D function learn_spell(var redraw : boolean) : boolean V; X var X i2 : unsigned; X i1,i3,sn,sc : integer; X new_spells : integer; X spell_flag : unsigned; X spell : spl_type; X begin X learn_spell := false; X case int_adj of X 0 : new_spells := 0; X 1 : new_spells := 1; X 2 : new_spells := 1; X 3 : new_spells := 1; X 4 : new_spells := randint(2); X 5 : new_spells := randint(2); X 6 : new_spells := randint(3); X 7 : new_spells := randint(2)+1; X otherwise new_spells := 0; X end; 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 mage_spell`5Bpy.misc.pclass,i3`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 X until(i2 = 0); X if (i1 > 0) then X begin X print_new_spells(spell,i1,redraw); X if (get_spell(spell,i1,sn,sc,'Learn which spell?',redraw)) t Vhen X begin X mage_spell`5Bpy.misc.pclass,sn`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 `20 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 (Consult) `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; X spell : spl_type; X begin X learn_extra := false; X case int_adj of X 0 : new_spells := 0; X 1 : new_spells := 1; X 2 : new_spells := 1; X 3 : new_spells := 1; X 4 : new_spells := randint(2); X 5 : new_spells := randint(2); X 6 : new_spells := randint(3); X 7 : new_spells := randint(2)+1; X otherwise new_spells := 0; X end; 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 extra_spell`5Bpy.misc.pclass,i3`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_spells(spell,i1,redraw); X if (get_spell(spell,i1,sn,sc,'Learn which spell?',redraw)) t Vhen X begin `20 X extra_spell`5Bpy.misc.pclass,sn`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; `20 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 (Priest) `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 priest_spell`5Bpy.misc.pclass,i2`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 case wis_adj of X 0 : i2 := 0; X 1 : i2 := 1; X 2 : i2 := 1; X 3 : i2 := 1; X 4 : i2 := randint(2); X 5 : i2 := randint(2); X 6 : i2 := randint(3); X 7 : i2 := randint(2)+1; X end; X new_spell := 0; X while ((i1 > 0) and (i2 > 0)) do X begin X i3 := randint(i1); X priest_spell`5Bpy.misc.pclass,test_array`5Bi3`5D`5D.learned := t Vrue; 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 mana if you know at least one spell `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 31 do X if (mage_spell`5Bpy.misc.pclass,i1`5D.learned) then X knows_spell := true; X for i1 := 1 to 31 do X if (priest_spell`5Bpy.misc.pclass,i1`5D.learned) then X knows_spell := true; X for i1 := 1 to 31 do X if (extra_spell`5Bpy.misc.pclass,i1`5D.learned) then X 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 otherwise new_mana := 0; X end X else `20 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 otherwise new_mana := 0; X end; `20 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 nhp := get_hitdie; X mhp := mhp + nhp; X chp := chp + nhp; X lev := lev + 1; 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_mhp; X prt_chp; X prt_level; X prt_title; X with class`5Bpclass`5D do X begin X if (mspell) then X begin X redraw := false; X learn_spell(redraw); X if (redraw) then draw_cave; X gain_mana(int_adj); X prt_mana; X end X else if (pspell) then X begin X learn_prayer; X gain_mana(wis_adj); X prt_mana; X end; `20 +-+-+-+-+-+-+-+- END OF PART 36 +-+-+-+-+-+-+-+-