-+-+-+-+-+-+-+-+ START OF PART 51 -+-+-+-+-+-+-+-+ X`09 i2 := bit_pos64(spell_flag2,spell_flag); X`09 if (i2 > 31) then i2 := i2 - 1; X`09 with magic_spell`5Bpy.misc.pclass,i2`5D do X`09 if (slevel <= py.misc.lev) then X`09`09if (not(learned)) then X`09`09 begin X`09`09 i1 := i1 + 1; X`09`09 test_array`5Bi1`5D := i2; X`09`09 end; X`09 end; X`09i2 := num_new_spells(spell_adj(ws)); X`09new_spell := 0; X`09while ((i1 > 0) and (i2 > 0)) do X`09 begin X`09 i3 := randint(i1); X`09 magic_spell`5Bpy.misc.pclass,test_array`5Bi3`5D`5D.learned := true; X`09 new_spell := new_spell + 1; X`09 for i4 := i3 to i1-1 do X`09 test_array`5Bi4`5D := test_array`5Bi4+1`5D; X`09 i1 := i1 - 1;`09`7B One less spell to learn`09`7D X`09 i2 := i2 - 1;`09`7B Learned one`09`09`09`7D X`09 end; X`09 if (new_spell > 0) then X`09 begin X`09 if (new_spell > 1) then X`09`09msg_print('You learned new prayers!') X`09 else X`09`09msg_print('You learned a new prayer!'); X`09 if (py.misc.exp = 0) then msg_print(' '); X`09 if (py.misc.mana = 0) then X`09`09begin X`09`09 py.misc.mana`09:= 1; X`09`09 py.misc.cmana := 1; X`09`09end; X`09 learn_prayer := true; X`09 end X`09 else X`09 learn_prayer := false; X end; X X X`09`7B Learn some disciplines (Monk)`09`09`09`09-RAK-`09`7D X`5Bglobal,psect(misc2$code)`5D function learn_discipline : 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 begin X`09i1 := 0; X`09spell_flag := %X'00003FFF'; X`09spell_flag2 := %X'00000000'; X`09i1 := 0; X`09while ((spell_flag > 0) or (spell_flag2 > 0)) do X`09 begin X`09 i2 := bit_pos64(spell_flag2,spell_flag); X`09 if (i2 > 31) then i2 := i2 - 1; X`09 with magic_spell`5Bpy.misc.pclass,i2`5D do X`09 if (slevel <= py.misc.lev) then X`09`09if (not(learned)) then X`09`09 begin X`09`09 i1 := i1 + 1; X`09`09 test_array`5Bi1`5D := i2; X`09`09 end; X`09 end; X`09i2 := num_new_spells(monk_adj); X`09new_spell := 0; X`09while ((i1 > 0) and (i2 > 0)) do X`09 begin X`09 i3 := randint(i1); X`09 magic_spell`5Bpy.misc.pclass,test_array`5Bi3`5D`5D.learned := true; X`09 new_spell := new_spell + 1; X`09 for i4 := i3 to i1-1 do X`09 test_array`5Bi4`5D := test_array`5Bi4+1`5D; X`09 i1 := i1 - 1;`09`7B One less spell to learn`09`7D X`09 i2 := i2 - 1;`09`7B Learned one`09`09`09`7D X`09 end; X`09 if (new_spell > 0) then X`09 begin X`09 if (new_spell > 1) then X`09`09msg_print('You learned new disciplines!') X`09 else X`09`09msg_print('You learned a new discipline!'); X`09 if (py.misc.exp = 0) then msg_print(' '); X`09 if (py.misc.mana = 0) then X`09`09begin X`09`09 py.misc.mana`09:= 1; X`09`09 py.misc.cmana := 1; X`09`09end; X`09 learn_discipline := true; X`09 end X`09 else X`09 learn_discipline := false; X end; X X`09`7B Learn some druid spells (Druid)`09`09`09-Cap'n-`09`7D X`5Bglobal,psect(misc2$code)`5D function learn_druid : 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 = Instrument) 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 X`09 i2 := bit_pos64(spell_flag2,spell_flag); X`09 if (i2 > 31) then i2 := i2 - 1; X`09 with magic_spell`5Bpy.misc.pclass,i2`5D do X`09 if (slevel <= py.misc.lev) then X`09`09if (not(learned)) then X`09`09 begin X`09`09 i1 := i1 + 1; X`09`09 test_array`5Bi1`5D := i2; X`09`09 end; X`09 end; X`09i2 := num_new_spells(druid_adj); X`09new_spell := 0; X`09while ((i1 > 0) and (i2 > 0)) do X`09 begin X`09 i3 := randint(i1); X`09 magic_spell`5Bpy.misc.pclass,test_array`5Bi3`5D`5D.learned := true; X`09 new_spell := new_spell + 1; X`09 for i4 := i3 to i1-1 do X`09 test_array`5Bi4`5D := test_array`5Bi4+1`5D; X`09 i1 := i1 - 1;`09`7B One less spell to learn`09`7D X`09 i2 := i2 - 1;`09`7B Learned one`09`09`09`7D X`09 end; X`09 if (new_spell > 0) then X`09 begin X`09 if (new_spell > 1) then X`09`09msg_print('You learned new songs!') X`09 else X`09`09msg_print('You learned a new song!'); X`09 if (py.misc.exp = 0) then msg_print(' '); X`09 if (py.misc.mana = 0) then X`09`09begin X`09`09 py.misc.mana`09:= 1; X`09`09 py.misc.cmana := 1; X`09`09end; X`09 learn_druid := true; X`09 end X`09 else X`09 learn_druid := false; X end; X`09`09`09 `20 X`09`7B Gain some mana if you know at least one spell `09-RAK-`09`7D X`5Bglobal,psect(misc2$code)`5D procedure gain_mana(amount : integer); X var X`09i1,new_mana`09`09`09: integer; X`09knows_spell`09`09`09: boolean; X begin X`09knows_spell := false; X`09for i1 := 1 to max_spells do X`09 if (magic_spell`5Bpy.misc.pclass,i1`5D.learned) then X`09 knows_spell := true; X`09if (knows_spell) then X`09 begin X`09 if (odd(py.misc.lev)) then X`09 case amount of X`09`090 : new_mana := 0; X`09`091 : new_mana := 1; X`09`092 : new_mana := 1; X`09`093 : new_mana := 1; X`09`094 : new_mana := 2; X`09`095 : new_mana := 2; X`09`096 : new_mana := 3; X`09`097 : new_mana := 4; X`09`09otherwise new_mana := 0; X`09 end X`09 else X`09 case amount of X`09`090 : new_mana := 0; X`09`091 : new_mana := 1; X`09`092 : new_mana := 1; X`09`093 : new_mana := 2; X`09`094 : new_mana := 2; X`09`095 : new_mana := 3; X`09`096 : new_mana := 3; X`09`097 : new_mana := 4; X`09`09otherwise new_mana := 0; X`09 end; X`09 py.misc.mana := py.misc.mana + new_mana; X`09 py.misc.cmana := py.misc.cmana + new_mana; X`09 end; X end; X X X`09`7B Increases hit points and level`09`09`09-RAK-`09`7D X`5Bglobal,psect(misc2$code)`5D procedure gain_level; X var X`09nhp,dif_exp,need_exp`09`09: integer; X`09redraw`09`09`09`09: boolean; X`09out_val`09`09`09`09: vtype; X begin X with py.misc do X`09 begin X`09 nhp := get_hitdie; X`09 mhp := mhp + nhp; X`09 chp := chp + nhp; X`09 if (mhp < 1) then X`09 begin X`09`09mhp := 1; X`09`09chp := 1; X`09 end; X`09 lev := lev + 1; X`09 need_exp := trunc(player_exp`5Blev`5D*expfact); X`09 if (py.misc.exp > need_exp) then X`09 begin X`09`09dif_exp := py.misc.exp - need_exp; X`09`09py.misc.exp := need_exp + (dif_exp div 2); X`09 end; X`09 title := player_title`5Bpclass,lev`5D; X`09 writev(out_val,'Welcome to level ',lev:1,'.'); X`09 msg_print(out_val); X`09 msg_print(' '); X`09 msg_flag := false; X`09 prt_hp; X`09 prt_level; X`09 prt_title; X`09 with class`5Bpclass`5D do X`09 begin X`09`09if (mspell) then X`09`09 begin X`09`09 redraw := false; X`09`09 learn_spell(redraw); X`09`09 if (redraw) then draw_cave; X`09`09 gain_mana(spell_adj(iq)); X`09`09 prt_mana; X`09`09 end X`09`09else if (dspell) then X`09`09 begin X`09`09 learn_druid; X`09`09 gain_mana(druid_adj); X`09`09 prt_mana; X`09`09 end X`09`09else if (bspell) then X`09`09 begin X`09`09 redraw := false; X`09`09 learn_song(redraw); X`09`09 if (redraw) then draw_cave; X`09`09 gain_mana(bard_adj); X`09`09 prt_mana; X`09`09 end X`09`09else if (pspell) then X`09`09 begin X`09`09 learn_prayer; X`09`09 gain_mana(spell_adj(ws)); X`09`09 prt_mana; X`09`09 end X`09`09else if (mental) then X`09`09 begin X`09`09 learn_discipline; X`09`09 gain_mana(monk_adj); X`09`09 prt_mana; X`09`09 end; X`09 end; X`09 end; X end; X X X `5Bglobal,psect(misc1$code)`5D procedure insert_num( X`09`09`09var object_str`09: varying`5Ba`5D of char; X`09`09`09mtc_str`09`09: varying`5Bb`5D of char; X`09`09`09number`09`09: integer; X`09`09`09show_sign`09: boolean X`09`09`09`09`09); X var X`09pos,olen,mlen`09: integer; X`09str1,str2`09: vtype; X begin X pos := index(object_str,mtc_str); X if (pos > 0) then X`09begin X`09 olen := length(object_str); X`09 mlen := length(mtc_str); X`09 object_str := object_str + ' '; X`09 str1 := substr(object_str,1,pos-1); X`09 str2 := substr(object_str,pos+mlen,olen-(pos+mlen-1)); X`09 if ((number >= 0) and (show_sign)) then X`09 writev(object_str,str1,'+',number:1,str2) X`09 else X`09 writev(object_str,str1,number:1,str2); X`09end X end; X X X`09`7B Checks to see if user is a wizard`09`09`09-RAK-`09`7D X`5Bglobal,psect(wizard$code)`5D function check_pswd`09( X`09`09passw`09`09: string; X`09`09present`09`09: boolean X`09`09`09`09`09`09) : boolean; X var X`09`09i1`09`09: integer; X`09`09x`09`09: char; X`09`09tpw`09`09: packed array `5B1..12`5D of char; X`09`09account`09`09: account_type; X`09`09checked_out`09: boolean; X begin X`09checked_out := false; X`09if (present) then X`09 tpw := passw X`09else begin X`09 i1 := 0; X`09 tpw := ' '; X`09 prt('Password : ',1,1); X`09 repeat X`09 inkey(x); X`09 case ord(x) of X`09 13 : ; X`09 otherwise begin X`09`09`09 i1 := i1 + 1; X`09`09`09 tpw`5Bi1`5D := x; X`09`09`09 end X`09 end; X`09 until ((i1 = 12) or (ord(x) = 13)); X`09end; X`09if (tpw = password1) then X`09 begin X`09 wizard1 := true; X`09 checked_out := true; X`09 end X`09else if (tpw = password2) then X`09 begin X`09 wizard1 := true; X`09 wizard2 := true; X`09 checked_out := true; X`09 end; X`09if ( uw$id ) then X`09 begin X`09 get_account(account.body); X`09 account.length := index( account.body, ' ' )-1; X`09 if index( wizards, ':'+account+':' ) = 0 then X`09 begin X`09`09 wizard1 := false; X`09`09 wizard2 := false; X`09`09 checked_out := false; X`09 end; X`09 end; X`09msg_flag := false; X`09if not present then erase_line(msg_line,msg_line); X`09py.misc.cheated := py.misc.cheated or checked_out; X`09check_pswd := checked_out; X end; X X X`09`7B Weapon weight VS strength and dexterity`09`09-RAK-`09`7D X`5Bglobal,psect(moria$code)`5D function attack_blows( X`09`09`09weight : integer; X`09`09`09var wtohit : integer) : integer; X var X`09max_wield,adj_weight,blows,lev_skill : integer; X begin X`09blows := 1; X`09wtohit := 0; X`09with py.stat do X`09 begin X`09 max_wield := weight_limit div 10;`09`09 X `09 if (max_wield < (weight div 100)) then X`7B`09make to-hit drop off gradually instead of being so abrupt`09-DCJ-`7D X`09 wtohit := max_wield - (weight div 100) X`09 else X`09 begin X`09`09if (c`5Bdx`5D < 70) then blows := 3 X`09`09else if (c`5Bdx`5D < 150) then blows := 4 X`09`09else if (c`5Bdx`5D < 151) then blows := 5 X`09`09else if (c`5Bdx`5D < 200) then blows := 6 X`09`09else if (c`5Bdx`5D < 220) then blows := 7 X`09`09`09else if (c`5Bdx`5D < 240) then blows := 8 X`09`09else if (c`5Bdx`5D < 250) then blows := 10 X`09`09else `09`09`09 blows := 12; X`09`09lev_skill := class`5Bpy.misc.pclass`5D.mbth*(py.misc.lev+10); X`7Bwarriors 100-500, paladin 80-400, priest 60-300, mage 40-200`7D X`09`09blows := trunc(0.8 + blows/3 + lev_skill/350); X`7Busually 3 for 18+ dex, 5 max except 6 for high level warriors`7D X`09`09adj_weight := trunc(c`5Bsr`5D/(weight div 100)*2.5); X`09`09if (adj_weight < 1) then blows := 1 X`09`09else if (adj_weight < 2) then blows := trunc(blows/3.0) X`09`09else if (adj_weight <3) then blows := trunc(blows/2.5) X`09`09else if (adj_weight <5) then blows := trunc(blows/2.00) X`09`09else if (adj_weight <10) then blows := trunc(blows/1.66) X`09`09else blows := trunc(blows/1.50); X`09 end; X`09 end; X`09attack_blows := blows; X end; X X`09`7B Critical hits, Nasty way to die...`09`09`09-RAK-`09`7D X`5Bglobal,psect(moria$code)`5D function critical_blow(weight,plus : in Vteger; X`09`09`09`09cs_sharp,is_fired : boolean) : integer; X var randomthing, py_crit : integer; X begin X`09weight := weight div 100; X`09critical_blow := 0; X`09`7B Weight of weapon, pluses to hit, and character level all `7D X`09`7B contribute to the chance of a critical `7D X`09if cs_sharp then X`09 weight := weight + 600; X`09with py.misc do X`09 begin X`09 if is_fired then X`09 py_crit := class`5Bpclass`5D.mbthb X`09 else X`09 begin X`09`09py_crit := class`5Bpclass`5D.mbth; X`09`09if (pclass = 10) then`09`7B monks are crit specialists `7D X`09`09 py_crit := py_crit*2 X`09 end; X`09 if (randint(5000) <= (weight+6*plus+py_crit*(lev+10))) then X`09 begin X`09`09randomthing := randint(300 + randint(weight)); X`09`09if (randomthing <= 150) then X`09`09 begin X`09`09 critical_blow := 1; X`09`09 msg_print('It was a good hit! (x2 damage)'); X`09 end X`09`09else if (randomthing <= 250) then X`09`09 begin X`09`09 critical_blow := 2; X`09`09 msg_print('It was an excellent hit! (x3 damage)'); X`09`09 end X`09`09else if (randomthing <= 375) then X`09`09 begin X`09`09 critical_blow := 3; X`09`09 msg_print('It was a superb hit! (x4 damage)'); X`09`09 end X`09`09else if (randomthing <= 550) then X`09`09 begin X`09`09 critical_blow := 4; X`09`09 msg_print('It was a *GREAT* hit! (x5 damage)'); X`09`09 end X`09`09else if (randomthing < 700) then X`09`09 begin X`09`09 critical_blow := 6; X`09`09 msg_print('It was an *INCREDIBLE* hit! (x7 damage)'); X`09`09 end X`09`09else if (randomthing < 875) then X`09`09 begin X`09`09 critical_blow := 9; X`09`09 msg_print('It was an *AMAZING* hit! (x10 damage)'); X`09 end X`09`09else X`09`09 begin X`09`09 critical_blow := 14; X`09`09 msg_print('It was a **PERFECT** hit! (x15 damage)'); X`09 end; X`09 end; X`09 end X end; X X X X`09`7B Given direction 'dir', returns new row, column location -RAK- `7D X`5Bglobal,psect(misc1$code)`5D function move(dir : integer; var y,x : intege Vr) : boolean; X var +-+-+-+-+-+-+-+- END OF PART 51 +-+-+-+-+-+-+-+-