-+-+-+-+-+-+-+-+ START OF PART 37 -+-+-+-+-+-+-+-+ X if (espell) then X begin X redraw := false; X `09`09 learn_extra(redraw); X if (redraw) then draw_cave; X gain_mana(wis_adj); X prt_mana; X end; `20 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; X %ref mtc_str : varying`5Bb`5D of char; X %ref insert_str : varying`5Bc`5D of char X ); X external; X`20 X`20 X`7B Inserts a number into a string `7D X`5Bpsect(misc1$code)`5D procedure insert_num( X var object_str : varying`5Ba`5D of char; X mtc_str : varying`5Bb`5D of char; X number : integer; X show_sign : boolean X ); X var X pos,olen,mlen : integer; X str1,str2 : vtype; X begin X pos := index(object_str,mtc_str); X if (pos > 0) then X begin `20 X olen := length(object_str); X mlen := length(mtc_str); X object_str := object_str + ' '; X str1 := substr(object_str,1,pos-1); X str2 := substr(object_str,pos+mlen,olen-(pos+mlen-1)); X if ((number >= 0) and (show_sign)) then X writev(object_str,str1,'+',number:1,str2) X else X writev(object_str,str1,number:1,str2); X end X end; X`20 X`7B Weapon weight VS strength and dexterity `7D X`5Bpsect(moria$code)`5D function attack_blows( X weight : integer; X var wtohit : integer X ) : integer; X var X adj_weight,blows : integer; X begin X blows := 1; X wtohit := 0; X with py.stat do X begin X if ((cstr*15) < weight) then X wtohit := -weight X else X begin X if (cdex < 10) then blows := 1 X else if (cdex < 19) then blows := 2 X else if (cdex < 68) then blows := 3 X else if (cdex < 108) then blows := 4 X else if (cdex < 118) then blows := 4 X else blows := 5; X adj_weight := trunc((cstr*10)/weight); X if (adj_weight < 2) then blows := 1 X else if (adj_weight < 3) then blows := trunc(blows/3.0) X else if (adj_weight < 4) then blows := trunc(blows/2.5) X else if (adj_weight < 5) then blows := trunc(blows/2.25) X else if (adj_weight < 7) then blows := trunc(blows/2.00) X else if (adj_weight < 9) then blows := trunc(blows/1.75) X else blows := trunc(blows/1.50); X end; X end; X attack_blows := blows; X end; X`20 X`20 X`7B Critical hits, Nasty way to die... `7D X`5Bpsect(moria$code)`5D function critical_blow( X weight,plus,dam : integer X ) : integer; X begin X critical_blow := dam; X`7B Weight of weapon, pluses to hit, and character level all X contribute to the chance of a critical `7D X if (randint(5000) <= (weight+5*plus+3*py.misc.lev)) then X begin X weight := weight + randint(650); X if (weight < 400) then X begin X critical_blow := 2*dam + 5; X msg_print('It was a good hit! (x2 damage)'); X end X else if (weight < 700) then X begin X critical_blow := 3*dam + 10; X msg_print('It was an excellent hit! (x3 damage)'); X end X else if (weight < 900) then X begin X critical_blow := 4*dam + 15; X msg_print('It was a superb hit! (x4 damage)'); X end X else X begin X critical_blow := 5*dam + 20; X msg_print('It was a *GREAT* hit! (x5 damage)'); X end X end; X end; X`20 X`20 X`20 X`7B Given direction 'dir', returns new row, column location `7D X`5Bpsect(misc1$code)`5D function move(dir : integer; var y,x : integer) : bo Volean; X var X new_row,new_col : integer; X begin X case dir of X 1 : begin X new_row := y + 1; X new_col := x - 1; X end; X 2 : begin X new_row := y + 1; X new_col := x; X end; X 3 : begin X new_row := y + 1; X new_col := x + 1; X end; X 4 : begin X new_row := y; X new_col := x - 1; X end; X 5 : begin X new_row := y; X new_col := x; X end; X 6 : begin X new_row := y; X new_col := x + 1; X end; X 7 : begin X new_row := y - 1; X new_col := x - 1; X end; X 8 : begin X new_row := y - 1; X new_col := x; X end; X 9 : begin X new_row := y - 1; X new_col := x + 1; X end; X end; X move := false; X if ((new_row >= 1) and (new_row <= cur_height)) then X if ((new_col >= 1) and (new_col <= cur_width)) then X begin X y := new_row; X x := new_col; X move := true; X end X end; X`20 X`20 X`7B Saving throws for player character... `7D X`5Bpsect(moria$code)`5D function player_saves(adjust : integer) : boolean; X begin X if (randint(100) <= (py.misc.save + adjust)) then X player_saves := true X else X player_saves := false; X end; X`20 X`20 X`7B Init players with some belongings `7D X`5Bpsect(setup$code)`5D procedure char_inven_init; X var X i1,i2,dummy : integer; X begin X for i1 := 1 to 5 do X begin X i2 := player_init`5Bpy.misc.pclass,i1`5D; X inventory`5Binven_max`5D := inventory_init`5Bi2`5D; X inven_carry(dummy); X end; X end; X X`7B Blanks out entire cave `7D X`5Bpsect(generate$code)`5D procedure blank_cave; X var X i1,i2 : integer; X BEGIN X for i1 := 1 to max_height do X for i2 := 1 to max_width do X begin X cave`5Bi1,i2`5D := blank_floor; X cave`5Bi1,i2`5D.fopen := true; X end; X END; X `20 X`20 X`7B Places indestructable rock around edges of dungeon `7D X`5Bpsect(generate$code)`5D procedure place_boundry; X var X i1: integer; X BEGIN X for i1 := 1 to cur_height do X BEGIN X cave`5Bi1,1`5D.fval := boundry_wall.ftval; X cave`5Bi1,1`5D.fopen := boundry_wall.ftopen; X cave`5Bi1,cur_width`5D.fval := boundry_wall.ftval; X cave`5Bi1,cur_width`5D.fopen := boundry_wall.ftopen; X END; X for i1 := 1 to cur_width do X BEGIN`20 X cave`5B1,i1`5D.fval := boundry_wall.ftval; X cave`5B1,i1`5D.fopen := boundry_wall.ftopen; X cave`5Bcur_height,i1`5D.fval := boundry_wall.ftval; X cave`5Bcur_height,i1`5D.fopen := boundry_wall.ftopen; X END; X END; X X X X X X $ CALL UNPACK [.SOURCE.INCLUDE]MISC.INC;1 226124297 $ create 'f' X`7B Moria game module `20 X The code in this section has gone through many revisions, and X some of it could stand some more hard work.`7D X`5Bpsect(moria$code)`5D procedure dungeon; X var X dir_val : integer; `7B For movement `7D X y,x,moves: integer; `7B For movement `7D X i1,i2,tmp1 : integer; `7B Temporaries `7D X old_chp,old_cmana : integer; `7B Detect change `7D X regen_amount: real; `7B Regenerate hp and mana`7D X command : char; `7B Last command `7D X out_val : vtype; `7B For messages `7D `20 X tmp_str : vtype; `7B Temporary `7D X mwkdum : boolean; X moria_flag : boolean; `7B Next level when true`7D X reset_flag : boolean; `7B Do not move creatures `7D X search_flag : boolean; `7B Player is searching `7D X teleport_flag : boolean; `7B Handle telport traps`7D X player_light: boolean; `7B Player carrying light `7D X save_msg_flag : boolean; `7B Msg flag after INKEY`7D X `20 X`20 X`7B check the Balrog's stats to see if dead or just defeated...`7D X`5Bpsect(moria$code)`5D function check_balrog(mi1,mi2 : integer) :boolean; Xvar X num : integer; XBEGIN `20 X check_balrog := false; X if (uand(c_list`5Bmi2`5D.cmove,%X'80000000') <> 0) then X if (dun_level = 1200) then X check_balrog := true X else X with c_list`5Bmi2`5D do X with m_list`5Bmi1`5D do X BEGIN X ac := ac + 5; X mexp := mexp + 200; X hp := hp + 80; X if (((dun_level - win_mon_appear)/343) = X ((dun_level - win_mon_appear)div 343 )) then X spells := spells - 1; X END XEND; X `20 X X X`7B Pre-declaration of MOVE_CHAR `7D X`5Bpsect(creature$code)`5D procedure move_char(dir : integer); X forward; X`20 X`20 X`7B Pre-declaration of CREATURES`7D X procedure creatures(attack : boolean); forward; X`20 X`20 X`7B Changes stats up or down for magic items `7D X procedure change_stat(var stat : byteint; amount,factor : integer); X var X i1,i2,i3 : integer; X BEGIN X i2 := amount * factor; X i3 := abs(amount); X for i1 := 1 to i3 do X if (i2 < 0) then X stat := de_statt(stat) X else X stat := in_statt(stat); X END; X`20 X`20 X`7B Changes speed of monsters relative to player X Note: When the player is sped up or slowed down, I simply X change the speed of all the monsters. This greatly X simplified the logic.`7D X procedure change_speed(num : integer); X var X i1 : integer; X BEGIN X py.flags.speed := py.flags.speed + num; X i1 := muptr; X while (i1 <> 0) do X BEGIN X m_list`5Bi1`5D.cspeed := m_list`5Bi1`5D.cspeed + num; X i1 := m_list`5Bi1`5D.nptr; X END; X END; `20 X`20 X`20 X`7B Player bonuses X When an item is worn or taken off, this re-adjusts the player X bonuses. Factor=1 : wear; Factor=-1 : removed `7D X procedure py_bonuses(tobj : treasure_type; factor : integer); X var X item_flags : unsigned; X i1,old_dis_ac : integer; X BEGIN X with py.flags do X BEGIN X if (slow_digest) then X food_digested := food_digested + 1; X if (regenerate) then X food_digested := food_digested - 3; X see_inv := false; X teleport := false; X free_act := false; X slow_digest := false; X aggravate:= false; X sustain_str := false; X sustain_int := false; X sustain_wis := false; X sustain_con := false; X sustain_dex := false; X sustain_chr := false; X fire_resist := false; X acid_resist := false; X cold_resist := false; X regenerate := false; X lght_resist := false; X ffall := false; X END; X`20 X if (uand(%X'00000001',tobj.flags) <> 0) then X BEGIN X change_stat(py.stat.cstr,tobj.p1,factor); X change_stat(py.stat.str,tobj.p1,factor); X print_stat := uor(%X'0001',print_stat); X END; X if (uand(%X'00000002',tobj.flags) <> 0) then X BEGIN X change_stat(py.stat.cdex,tobj.p1,factor); X change_stat(py.stat.dex,tobj.p1,factor); X print_stat := uor(%X'0002',print_stat); X END; X if (uand(%X'00000004',tobj.flags) <> 0) then X BEGIN X change_stat(py.stat.ccon,tobj.p1,factor); X change_stat(py.stat.con,tobj.p1,factor); X print_stat := uor(%X'0004',print_stat); X END; X if (uand(%X'00000008',tobj.flags) <> 0) then X BEGIN X change_stat(py.stat.cint,tobj.p1,factor); X change_stat(py.stat.int,tobj.p1,factor); X print_stat := uor(%X'0008',print_stat); X END; X if (uand(%X'00000010',tobj.flags) <> 0) then X BEGIN X change_stat(py.stat.cwis,tobj.p1,factor); X change_stat(py.stat.wis,tobj.p1,factor); X print_stat := uor(%X'0010',print_stat); X END; X if (uand(%X'00000020',tobj.flags) <> 0) then X BEGIN X change_stat(py.stat.cchr,tobj.p1,factor); X change_stat(py.stat.chr,tobj.p1,factor); X print_stat := uor(%X'0020',print_stat); X END; X if (uand(%X'00000040',tobj.flags) <> 0) then X BEGIN X py.misc.srh := py.misc.srh + (tobj.p1 * factor); X py.misc.fos := py.misc.fos - (tobj.p1 * factor); +-+-+-+-+-+-+-+- END OF PART 37 +-+-+-+-+-+-+-+-