-+-+-+-+-+-+-+-+ START OF PART 35 -+-+-+-+-+-+-+-+ X`09`09 py.misc.mana := 1; X`09`09`09py.misc.cmana := 1; X`09`09 end; X`09`09 end X`09 else 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 prayers (Priest)`09`09`09`09-RAK-`09`7D X`5Bpsect(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`09`09`09: unsigned; X begin X`09i1 := 0; X`09spell_flag := 0; X`09repeat X`09 i1 := i1 + 1; X`09 if (inventory`5Bi1`5D.tval = 91) then X`09 spell_flag := uor(spell_flag,inventory`5Bi1`5D.flags); X`09until(i1 >= inven_ctr); X`09i1 := 0; X`09while (spell_flag > 0) do X`09 begin X`09 i2 := bit_pos(spell_flag); 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`09case wis_adj of X`09 0 : i2 := 0; X`09 1 : i2 := 1; X`09 2 : i2 := 1; X`09 3 : i2 := 1; X`09 4 : i2 := randint(2); X`09 5 : i2 := randint(2); X`09 6 : i2 := randint(3); X`09 7 : i2 := randint(2)+1; X`09end; 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 := 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 Gain some mana if you knows at least one spell`09-RAK-`09`7D X`5Bpsect(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 31 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 0 : new_mana := 0; X`09 1 : new_mana := 1; X`09 2 : new_mana := 1; X`09 3 : new_mana := 1; X`09 4 : new_mana := 2; X`09 5 : new_mana := 2; X`09 6 : new_mana := 3; X`09 7 : new_mana := 4; X`09`09otherwise new_mana := 0; X`09 end X`09 else X`09 case amount of X`09 0 : new_mana := 0; X`09 1 : new_mana := 1; X`09 2 : new_mana := 1; X`09 3 : new_mana := 2; X`09 4 : new_mana := 2; X`09 5 : new_mana := 3; X`09 6 : new_mana := 3; X`09 7 : 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`5Bpsect(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 if (lev < max_player_level) then X`09 begin X`09 nhp := get_hitdie; X`09 mhp := mhp + nhp; X`09 chp := chp + nhp; X`09 lev := lev + 1; X`09 need_exp := trunc(player_exp`5Blev`5D*expfact); X 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 + round(dif_exp/2.0); 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_mhp; X`09 prt_chp; X`09 prt_level; X`09 prt_title; X`09 with class`5Bpclass`5D do X`09 begin X`09 if (mspell) then X`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(int_adj); X`09`09 prt_cmana; X`09 end X`09 else if (pspell) then X`09`09 begin X`09 learn_prayer; X`09`09 gain_mana(wis_adj); X`09`09 prt_cmana; X`09`09 end; X`09 end; X`09 end; X end; X X X`09`7B Prints experience`09`09`09`09`09-RAK-`09`7D X procedure prt_experience; X var X`09out_val`09`09`09: vtype; X begin X if (py.misc.lev < max_player_level) then X`09begin X`09 with py.misc do X while (trunc(player_exp`5Blev`5D*py.misc.expfact) <= py.misc.exp V) do X`09 gain_level; X`09end; X if (py.misc.lev = max_player_level) then X`09py.misc.exp := trunc(player_exp`5Bmax_player_level`5D*py.misc.expfact); X if (py.misc.exp > py.misc.max_exp) then`20 X`09py.misc.max_exp := py.misc.exp; X prt_num('',py.misc.exp,15,stat_column+6); X end; X X X`09`7B Inserts a string into a string`09`09`09`09`7D X procedure insert_str`09`09`09( X`09`09`09%ref object_str`09: varying`5Ba`5D of char; X`09`09`09%ref mtc_str`09: varying`5Bb`5D of char; X`09`09`09%ref insert_str`09: varying`5Bc`5D of char X`09`09`09`09`09); X`09external; X X X`09`7B Inserts a number into a string`09`09`09`09`7D X`5Bpsect(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`5Bpsect(wizard$code)`5D function check_pswd : 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 begin X`09check_pswd := false; X`09i1 := 0; X`09tpw := ' '; X`09prt('Password : ',1,1); X`09repeat X`09 inkey(x); X`09 case ord(x) of X`09 13`09:`09; X`09 otherwise`09begin X`09`09`09 i1 := i1 + 1; X`09`09`09 tpw`5Bi1`5D := x; X`09`09`09end X`09 end; X`09until ((i1 = 12) or (ord(x) = 13)); X`09if (tpw = 'wizard789012') then X`09 begin X`09 wizard1 := true; X`09 check_pswd := true; X`09 end X`09else if (tpw = 'god456789012') then X`09 begin X`09 wizard1 := true; X`09 wizard2 := true; X`09 check_pswd := true; X`09 end; X`09msg_flag := false; X`09erase_line(msg_line,msg_line); X end; X X X`09`7B Weapon weight VS strength and dexterity`09`09-RAK-`09`7D X`5Bpsect(moria$code)`5D function attack_blows( X`09`09`09weight`09`09:`09integer; X`09`09`09var wtohit`09:`09integer X`09`09`09`09`09) : integer; X var X`09adj_weight,blows`09`09: integer; X begin X`09blows := 1; X`09wtohit := 0; X`09with py.stat do X`09 begin X`09 if ((cstr*15) < weight) then X`09 wtohit := -weight X`09 else X`09 begin X`09 if (cdex < 10) then blows := 1 X`09 else if (cdex < 19) then blows := 2 X`09 else if (cdex < 68) then blows := 3 X`09 else if (cdex < 108) then blows := 4 X`09 else if (cdex < 118) then blows := 4 X`09 else`09`09`09 blows := 5; X`09`09adj_weight := trunc((cstr*10)/weight); X`09 if (adj_weight < 2) then blows := 1 X`09`09else if (adj_weight < 3) then blows := trunc(blows/3.0) X`09`09else if (adj_weight < 4) then blows := trunc(blows/2.5) X`09`09else if (adj_weight < 5) then blows := trunc(blows/2.25) X`09`09else if (adj_weight < 7) then blows := trunc(blows/2.00) X`09`09else if (adj_weight < 9) then blows := trunc(blows/1.75) X`09`09else `09`09`09 blows := trunc(blows/1.50); X`09 end; X`09 end; X`09attack_blows := blows; X end; X X X`09`7B Critical hits, Nasty way to die...`09`09`09-RAK-`09`7D X`5Bpsect(moria$code)`5D function critical_blow( X`09`09`09weight,plus,dam`09:`09integer X`09`09`09`09`09 ) : integer; X begin X`09critical_blow := dam; X`09`7B Weight of weapon, pluses to hit, and character level all`09`7D X`09`7B contirbute to the chance of a critical`09`09`09`7D X`09if (randint(5000) <= (weight+5*plus+3*py.misc.lev)) then X`09 begin X`09 weight := weight + randint(650); X`09 if (weight < 400) then X`09 begin X`09`09critical_blow := 2*dam + 5; X`09`09msg_print('It was a good hit! (x2 damage)'); X`09 end X`09 else if (weight < 700) then X`09 begin X`09`09critical_blow := 3*dam + 10; X`09`09msg_print('It was an excellent hit! (x3 damage)'); X`09 end X`09 else if (weight < 900) then X`09 begin X`09`09critical_blow := 4*dam + 15; X`09`09msg_print('It was a superb hit! (x4 damage)'); X`09 end X`09 else X`09 begin X`09`09critical_blow := 5*dam + 20; X`09`09msg_print('It was a *GREAT* hit! (x5 damage)'); X`09 end X`09 end; X end; X X X X`09`7B Given direction 'dir', returns new row, column location -RAK-`09`7D X`5Bpsect(misc1$code)`5D function move(dir : integer; var y,x : integer) : bo Volean; X var X`09`09new_row,new_col`09`09: integer; X begin X`09case dir of X`09 1 : begin X`09`09new_row := y + 1; X`09`09new_col := x - 1; X`09 end; X`09 2 : begin X`09`09new_row := y + 1; X`09`09new_col := x; X`09 end; X`09 3 : begin X`09`09new_row := y + 1; X`09`09new_col := x + 1; X`09 end; X`09 4 : begin X`09`09new_row := y; X`09`09new_col := x - 1; X`09 end; X`09 5 : begin X`09`09new_row := y; X`09`09new_col := x; X`09 end; X`09 6 : begin X`09`09new_row := y; X`09`09new_col := x + 1; X`09 end; X`09 7 : begin X`09`09new_row := y - 1; X`09`09new_col := x - 1; X`09 end; X`09 8 : begin X`09`09new_row := y - 1; X`09`09new_col := x; X`09 end; X`09 9 : begin X`09`09new_row := y - 1; X`09`09new_col := x + 1; X`09 end; X`09end; X`09move := false; X`09if ((new_row >= 1) and (new_row <= cur_height)) then X`09 if ((new_col >= 1) and (new_col <= cur_width)) then X`09 begin X`09 y := new_row; X`09 x := new_col; X`09 move := true; X`09 end X end; X X X`09`7B Saving throws for player character...`09`09`09-RAK-`09`7D X`5Bpsect(moria$code)`5D function player_saves(adjust : integer) : boolean; X`09begin X`09 if (randint(100) <= (py.misc.save + adjust)) then X`09 player_saves := true X`09 else X`09 player_saves := false; X`09end; X X X`09`7B Init players with some belongings`09`09`09-RAK-`09`7D X`5Bpsect(setup$code)`5D procedure char_inven_init; X var X`09i1,i2,dummy`09`09: integer; X begin X`09for i1 := 1 to 5 do X`09 begin X`09 i2 := player_init`5Bpy.misc.pclass,i1`5D; X`09 inventory`5Binven_max`5D := inventory_init`5Bi2`5D; X`09 inven_carry(dummy); X`09 end; X end; $ CALL UNPACK [.SOURCE.INCLUDE]MISC.INC;1 1861675281 $ create 'f' X`09`7B Moria game module`09`09`09`09`09-RAK-`09`7D X`09`7B The code in this section has gone through many revisions, and`09`7D X`09`7B some of it could stand some more hard work... -RAK-`09`09`7D X`5Bpsect(moria$code)`5D procedure dungeon; X var X`09dir_val`09`09`09: integer;`09`7B For movement`09`09`7D X`09y,x,moves`09`09: integer;`09`7B For movement`09`09`7D X`09i1,i2,tmp1`09`09: integer;`09`7B Temporaries`09`09`7D X`09old_chp,old_cmana`09: integer;`09`7B Detect change`09`09`7D X`09regen_amount`09`09: real;`09`09`7B Regenerate hp and mana`7D X`09command`09`09`09: char;`09`09`7B Last command`09`09`7D X`09out_val`09`09`09: vtype;`09`7B For messages`09`09`7D X`09tmp_str`09`09`09: vtype;`09`7B Temporary`09`09`7D X`09moria_flag`09`09: boolean;`09`7B Next level when true`09`7D X`09reset_flag`09`09: boolean;`09`7B Do not move creatures`09`7D X`09search_flag`09`09: boolean;`09`7B Player is searching`09`7D X`09teleport_flag`09`09: boolean;`09`7B Handle telport traps`09`7D X`09player_light`09`09: boolean;`09`7B Player carrying light`09`7D X`09save_msg_flag`09`09: boolean;`09`7B Msg flag after INKEY`09`7D X X X`09`7B Pre-declaration of MOVE_CHAR`09`09`09`09-RAK-`09`7D X`5Bpsect(creature$code)`5D procedure move_char(dir : integer); X`09forward; X X X`09`7B Pre-declaration of CREATURES`09`09`09`09-RAK-`09`7D X procedure creatures(attack : boolean); X`09forward; X X X`09`7B Changes stats up or down for magic items`09`09-RAK-`09`7D X procedure change_stat(var stat : byteint; amount,factor : integer); X var X`09`09i1,i2,i3`09: integer; X begin X`09i2 := amount * factor; X`09i3 := abs(amount); X`09for i1 := 1 to i3 do X`09 if (i2 < 0) then X`09 stat := de_statt(stat) X`09 else X`09 stat := in_statt(stat); X end; X X X`09`7B Changes speed of monsters relative to player`09`09-RAK-`09`7D X`09`7B Note: When the player is sped up or slowed down, I simply`09`7D X`09`7B change the speed of all the monsters. This greatly`09`7D X`09`7B simplified the logic...`09`09`09`09`09`7D X procedure change_speed(num : integer); X var X`09`09i1`09`09`09: integer; X begin X`09py.flags.speed := py.flags.speed + num; X`09i1 := muptr; X`09while (i1 <> 0) do X`09 begin X`09 m_list`5Bi1`5D.cspeed := m_list`5Bi1`5D.cspeed + num; X`09 i1 := m_list`5Bi1`5D.nptr; X`09 end; X end; X X X`09`7B Player bonuses`09`09`09`09`09-RAK-`09`7D X`09`7B When an item is worn or taken off, this re-adjusts the player`09`7D X`09`7B bonuses. Factor=1 : wear; Factor=-1 : removed`09`09`7D X procedure py_bonuses(tobj : treasure_type; factor : integer); X var +-+-+-+-+-+-+-+- END OF PART 35 +-+-+-+-+-+-+-+-