-+-+-+-+-+-+-+-+ START OF PART 30 -+-+-+-+-+-+-+-+ X`09 with m_list`5Bcur_pos`5D do X`09 begin X`09 repeat X`09`09y := randint(cur_height-2)+1; X`09`09x := randint(cur_width-2)+1; X`09 until ((cave`5By,x`5D.fval in `5B1,2,4`5D) and X`09`09 (cave`5By,x`5D.cptr = 0) and X`09`09 (cave`5By,x`5D.tptr = 0) and X`09`09 (distance(y,x,char_row,char_col) > max_sight)); X`09 fy := y; X`09 fx := x; X`09 mptr := randint(win_mon_tot) + X`09`09`09`09m_level`5Bmax_mons_level`5D + m_level`5B0`5D; X`09 nptr := muptr; X`09 muptr := cur_pos; X`09 if (uand(c_list`5Bmptr`5D.cdefense,%X'4000') <> 0) then X`09`09hp := max_hp(c_list`5Bmptr`5D.hd) X`09 else X`09`09hp := damroll(c_list`5Bmptr`5D.hd); X`09 cspeed := c_list`5Bmptr`5D.speed + py.flags.speed; X`09 stuned := 0; X`09 cdis := distance(char_row,char_col,y,x); X`09 cave`5By,x`5D.cptr := cur_pos; X`09 csleep := 0; X`09 end; X`09end; X end; X X X`09`7B Allocates a random monster`09`09`09`09-RAK-`09`7D X`5Bpsect(misc3$code)`5D procedure alloc_monster(alloc_set : obj_set; X`09`09`09 num,dis : integer; X`09`09`09 slp : boolean ); X var X`09y,x,a,b,i1,i2,i3 : integer; X begin X for i1 := 1 to num do X`09begin X`09 repeat X`09 y := randint(cur_height-2)+1; X`09 x := randint(cur_width-2)+1; X`09 until ((cave`5By,x`5D.fval in alloc_set) and X`09`09 (cave`5By,x`5D.cptr = 0) and X`09`09 (cave`5By,x`5D.fopen) and X`09`09 (distance(y,x,char_row,char_col) > dis)); X`09 if (dun_level = 0) then X`09 i2 := randint(m_level`5B0`5D) X`09 else if (dun_level > max_mons_level) then X`09 i2 := randint(m_level`5Bmax_mons_level`5D) + m_level`5B0`5D X`09 else if (randint(mon_nasty) = 1) then X`09 begin X`09 i2 := dun_level + abs(randnor(0,4)) + 1; X`09 if (i2 > max_mons_level) then i2 := max_mons_level; X`09 i3 := m_level`5Bi2`5D - m_level`5Bi2-1`5D; X`09 i2 := randint(i3) + m_level`5Bi2-1`5D; X`09 end X`09 else X`09 i2 := randint(m_level`5Bdun_level`5D) + m_level`5B0`5D; X`09 place_monster(y,x,i2,slp); X`09end X end; X X X`09`7B Places creature adjacent to given location`09`09-RAK-`09`7D X`5Bpsect(misc3$code)`5D function summon_monster( X`09`09`09`09var y,x : integer; X`09`09`09`09slp : boolean X`09`09`09`09`09) : boolean; X var X`09i1,i2,i3,i4,i5 : integer; X begin X i1 := 0; X i5 := dun_level + mon$summon_adj; X summon_monster := false; X if (i5 > max_mons_level) then X`09i4 := max_mons_level X else X`09i4 := i5; X if (dun_level = 0) then X`09i4 := randint(m_level`5B0`5D) X else X`09i4 := randint(m_level`5Bi4`5D) + m_level`5B0`5D; X repeat X`09i2 := y - 2 + randint(3); X`09i3 := x - 2 + randint(3); X`09if (in_bounds(i2,i3)) then X`09 with cave`5Bi2,i3`5D do X`09 if (fval in `5B1,2,4,5`5D) then X`09 if (cptr = 0) then X`09`09if (fopen) then X`09`09 begin X`09`09 place_monster(i2,i3,i4,slp); X`09`09 summon_monster := true; X`09`09 i1 := 9; X`09`09 y := i2; X`09`09 x := i3; X`09`09 end; X`09i1 := i1 + 1; X until (i1 > 9); X end; X X X`09`7B Places undead adjacent to given location`09`09-RAK-`09`7D X`5Bpsect(misc3$code)`5D function summon_undead(var y,x : integer) : boolean; X var X`09i1,i2,i3,i4,i5,ctr : integer; X begin X i1 := 0; X summon_undead := false; X i4 := m_level`5Bmax_mons_level`5D + m_level`5B0`5D; X repeat X`09i5 := randint(i4); X`09ctr := 0; X`09repeat X`09 if (uand(c_list`5Bi5`5D.cdefense,%X'0008') <> 0) then X`09 begin X`09 ctr := 20; X`09 i4 := 0; X`09 end X`09 else X`09 begin X`09 i5 := i5 + 1; X`09 if (i5 > i4) then X`09`09ctr := 20 X`09 else X`09`09ctr := ctr + 1; X`09 end; X`09until(ctr > 19) X until(i4 = 0); X repeat X`09i2 := y - 2 + randint(3); X`09i3 := x - 2 + randint(3); X`09if (in_bounds(i2,i3)) then X`09 with cave`5Bi2,i3`5D do X`09 if (fval in `5B1,2,4,5`5D) then X`09 if ((cptr = 0) and (fopen)) then X`09`09begin X`09`09 place_monster(i2,i3,i5,false); X`09`09 summon_undead := true; X`09`09 i1 := 9; X`09`09 y := i2; X`09`09 x := i3; X`09`09end; X`09i1 := i1 + 1; X until (i1 > 9); X end; X X X`09`7B If too many objects on floor level, delete some of them-RAK-`09`7D X`5Bpsect(misc2$code)`5D procedure compact_objects; X var X`09i1,i2,ctr,cur_dis : integer; X`09flag : boolean; X begin X ctr := 0; X cur_dis := 66; X repeat X`09for i1 := 1 to cur_height do X`09 for i2 := 1 to cur_width do X`09 with cave`5Bi1,i2`5D do X`09 if (tptr > 0) then X`09`09if (distance(i1,i2,char_row,char_col) > cur_dis) then X`09`09 begin X`09`09 flag := false; X`09`09 with t_list`5Btptr`5D do X`09`09 case tval of X`09`09`09102 : if (subval in `5B1,6,9`5D) then X`09`09`09`09 flag := true X`09`09`09`09 else if (randint(4) = 1) then X`09`09`09`09 flag := true; X`09`09`09103 : flag := true; X`09`09`09104,105 : if (randint(4) = 1) then flag := true; X`09`09`09107,108 : ; X`09`09`09otherwise if (randint(8) = 1) then flag := true; X`09`09 end; X`09`09 if (flag) then X`09`09 begin X`09`09`09fopen := true; X`09`09`09t_list`5Btptr`5D := blank_treasure; X`09`09`09t_list`5Btptr`5D.p1 := tcptr; X`09`09`09tcptr := tptr; X`09`09`09tptr := 0; X`09`09`09ctr := ctr + 1; X`09`09 end; X`09`09 end; X`09 if (ctr = 0) then cur_dis := cur_dis - 6; X`09until (ctr > 0); X`09if (cur_dis < 66) then prt_map; X end; X X X`09`7B Gives pointer to next free space`09`09`09-RAK-`09`7D X`5Bpsect(misc4$code)`5D procedure popt(var x : integer); X var X`09i1 : integer; X begin X if (tcptr < 1) then compact_objects; X x := tcptr; X tcptr := t_list`5Bx`5D.p1; X end; X X X`09`7B Pushs a record back onto free space list`09`09-RAK-`09`7D X`5Bpsect(misc4$code)`5D procedure pusht(x : integer); X begin X t_list`5Bx`5D := blank_treasure; X t_list`5Bx`5D.p1 := tcptr; X tcptr := x; X end; X X X`09`7B Order the treasure list by level`09`09`09-RAK-`09`7D X`5Bpsect(setup$code)`5D procedure sort_objects; X var X`09i1,i2,i3,gap : integer; X`09tmp : treasure_type; X begin X gap := max_objects div 2; X while (gap > 0) do X`09begin X`09 for i1 := gap+1 to max_objects do X`09 begin X`09 i2 := i1 - gap; X`09 while (i2 > 0) do X`09`09begin X`09`09 i3 := i2 + gap; X`09`09 if (object_list`5Bi2`5D.level > object_list`5Bi3`5D.level) then X`09`09 begin X`09`09 tmp := object_list`5Bi2`5D; X`09`09 object_list`5Bi2`5D := object_list`5Bi3`5D; X`09`09 object_list`5Bi3`5D := tmp; X`09`09 end X`09`09 else X`09`09 i2 := 0; X`09`09 i2 := i2 - gap; X`09`09end; X`09 end; X`09 gap := gap div 2; X`09end; X end; X X X X`09`7B Chance of treasure having magic abilities`09`09-RAK-`09`7D X`09`7B Chance increases with each dungeon level `7D X`5Bpsect(misc4$code)`5D procedure magic_treasure(x,level : integer); X var X`09chance,special,cursed,i1 : integer; X X`09`7B Boolean : is object enchanted `09 -RAK- `7D X function magik(chance : integer) : boolean; X begin X`09if (randint(100) <= chance) then X`09 magik := true X`09else X`09 magik := false; X end; X X`09`7B Enchant a bonus based on degree desired -RAK- `7D X function m_bonus(base,max_std,level : integer) : integer; X var X`09x,stand_dev : integer; X begin X`09stand_dev := trunc(obj_std_adj*level) + obj_std_min; X`09if (stand_dev > max_std) then stand_dev := max_std; X`09x := trunc(abs(randnor(0,stand_dev))/10.0) + base; X`09if (x < base) then X`09 m_bonus := base X`09else X`09 m_bonus := x; X end; X X begin X chance := obj_base_magic + level; X if (chance > obj_base_max) then chance := obj_base_max; X special := trunc(chance/obj_div_special); X cursed := trunc(chance/obj_div_cursed); X with t_list`5Bx`5D do X`09`7B Depending on treasure type, it can have certain magical properties`7D X`09case tval of X`0934,35,36: begin `7B Armor and shields`7D X`09`09 if (magik(chance)) then X`09`09 begin X`09`09`09toac := m_bonus(1,30,level); X`09`09`09if (magik(special)) then X`09`09`09 case randint(9) of X`09`09`091 : begin X`09`09`09`09 flags := uor(flags,%X'02380000'); X`09`09`09`09 name := name + ' (R)'; X`09`09`09`09 toac := toac + 5; X`09`09`09`09 cost := cost + 2500; X`09`09`09`09end; X`09`09`092 : begin `7B Resist Acid `7D X`09`09`09`09 flags := uor(flags,%X'00100000'); X`09`09`09`09 name := name + ' (RA)'; X`09`09`09`09 cost := cost + 1000; X`09`09`09`09end; X`09`09`093,4 : begin `7B Resist Fire `7D X`09`09`09`09 flags := uor(flags,%X'00080000'); X`09`09`09`09 name := name + ' (RF)'; X`09`09`09`09 cost := cost + 600; X`09`09`09`09end; X`09`09`095,6 : begin `7B Resist Cold `7D X`09`09`09`09 flags := uor(flags,%X'00200000'); X`09`09`09`09 name := name + ' (RC)'; X`09`09`09`09 cost := cost + 600; X`09`09`09`09end; X`09`09`097,8,9 : begin `7B Resist Lightning`7D X`09`09`09`09 flags := uor(flags,%X'02000000'); X`09`09`09`09 name := name + ' (RL)'; X`09`09`09`09 cost := cost + 500; X`09`09`09`09end; X`09`09`09 end X`09`09 end X`09`09 else if (magik(cursed)) then X`09`09 begin X`09`09`09toac := -m_bonus(1,40,level); X`09`09`09cost := 0; X`09`09`09flags := uor(%X'80000000',flags); X`09`09 end X`09`09 end; X`0921,22,23: begin `7B Weapons `7D X`09`09 if (magik(chance)) then X`09`09 begin X`09`09`09tohit := m_bonus(0,40,level); X`09`09`09todam := m_bonus(0,40,level); X`09`09`09if (magik(special)) then X`09`09`09 case randint(16) of X`09`091 : begin `7B Holy Avenger `7D X`09`09`09`09 flags := uor(flags,%X'01418001'); X`09`09`09`09 tohit := tohit + 5; X`09`09`09`09 todam := todam + 5; X`09`09`09`09 toac := randint(4); X`09`09`09`09 p1 := randint(4) - 1; X`09`09`09`09 name := name + ' (HA)'; X`09`09`09`09 cost := cost + p1*500; X`09`09`09`09 cost := cost + 10000; X`09`09`09`09end; X`09`092 : begin `7B Defender `7D X`09`09`09`09 flags := uor(flags,%X'07B80900'); X`09`09`09`09 tohit := tohit + 3; X`09`09`09`09 todam := todam + 3; X`09`09`09`09 toac := 5 + randint(5); X`09`09`09`09 name := name + ' `5B%P4`5D (DF)'; X`09`09`09`09 p1 := randint(3); X`09`09`09`09 cost := cost + p1*500; X`09`09`09`09 cost := cost + 7500; X`09`09`09`09end; X`09`093,4 : begin `7B Slay Monster `7D X`09`09`09`09 flags := uor(flags,%X'01004000'); X`09`09`09`09 tohit := tohit + 3; X`09`09`09`09 todam := todam + 3; X`09`09`09`09 name := name + ' (SM)'; X`09`09`09`09 cost := cost + 5000; X`09`09`09`09end; X`09`095,6 : begin `7B Slay Dragon `7D X`09`09`09`09 flags := uor(flags,%X'00002000'); X`09`09`09`09 tohit := tohit + 3; X`09`09`09`09 todam := todam + 3; X`09`09`09`09 name := name + ' (SD)'; X`09`09`09`09 cost := cost + 4000; X`09`09`09`09end; X`09`097,8 : begin `7B Slay Evil `7D X`09`09`09`09 flags := uor(flags,%X'00008000'); X`09`09`09`09 tohit := tohit + 3; X`09`09`09`09 todam := todam + 3; X`09`09`09`09 name := name + ' (SE)'; X`09`09`09`09 cost := cost + 4000; X`09`09`09`09end; X`09`099,10 : begin `7B Slay Undead `7D X`09`09`09`09 flags := uor(flags,%X'00010000'); X`09`09`09`09 tohit := tohit + 2; X`09`09`09`09 todam := todam + 2; X`09`09`09`09 name := name + ' (SU)'; X`09`09`09`09 cost := cost + 3000; X`09`09`09`09end; X`09`0911,12,13 : begin `7B Flame Tongue `7D X`09`09`09`09 flags := uor(flags,%X'00040000'); X`09`09`09`09 tohit := tohit + 1; X`09`09`09`09 todam := todam + 3; X`09`09`09`09 name := name + ' (FT)'; X`09`09`09`09 cost := cost + 2000; X`09`09`09`09end; X`09`0914,15,16 : begin `7B Frost Brand `7D X`09`09`09`09 flags := uor(flags,%X'00020000'); X`09`09`09`09 tohit := tohit + 1; X`09`09`09`09 todam := todam + 1; X`09`09`09`09 name := name + ' (FB)'; X`09`09`09`09 cost := cost + 1200; X`09`09`09`09end; X`09`09`09 end; X`09`09 end X`09`09 else if (magik(cursed)) then X`09`09 begin X`09`09`09tohit := -m_bonus(1,55,level); X`09`09`09todam := -m_bonus(1,55,level); X`09`09`09flags := uor(%X'80000000',flags); X`09`09`09cost := 0; X`09`09 end X`09`09 end; X`09 20 : begin `7B Bows, crossbows, and slings `7D X`09`09 if (magik(chance)) then X`09`09 tohit := m_bonus(1,30,level) X`09`09 else if (magik(cursed)) then X`09`09 begin X`09`09`09tohit := -m_bonus(1,50,level); X`09`09`09flags := uor(%X'80000000',flags); X`09`09`09cost := 0; X`09`09 end; X`09`09 end; X`09 25 : begin `7B Digging tools `7D X`09`09 if (magik(chance)) then X`09`09 case randint(3) of X`09`09`091,2:begin X`09`09`09 p1 := m_bonus(2,25,level); X`09`09`09 cost := cost + p1*100; X`09`09`09 end; X`09`09`093 : begin X`09`09`09 p1 := -m_bonus(1,30,level); X`09`09`09 cost := 0; X`09`09`09 flags := uor(%X'80000000',flags); X`09`09`09 end; X`09`09 end; X`09`09 end; X`09 31 : begin `7B Gloves and Gauntlets `7D X`09`09 if (magik(chance)) then X`09`09 begin X`09`09`09toac := m_bonus(1,20,level); X`09`09`09if (magik(special)) then X`09`09`09 case randint(2) of X`09`09`09 1 :begin X`09`09`09`09 flags := uor(%X'00800000',flags); X`09`09`09`09 name := name + ' of Free Action'; X`09`09`09`09 cost := cost + 1000; X`09`09`09`09end; X`09`09`09 2 :begin X`09`09`09`09 tohit := 1 + randint(3); X`09`09`09`09 todam := 1 + randint(3); X`09`09`09`09 name := name + ' of Slaying'; X`09`09`09`09 cost := cost + (tohit+todam)*250; X`09`09`09`09end; X`09`09`09 end; X`09`09 end X`09`09 else if (magik(cursed)) then X`09`09 begin X`09`09`09if (magik(special)) then X`09`09`09 case randint(2) of X`09`09`09 1 : begin X`09`09`09`09 flags := uor(%X'80000002',flags); X`09`09`09`09 name := name + ' of Clumsiness'; X`09`09`09`09 p1 := 1; X`09`09`09`09end; X`09`09`09 2 : begin X`09`09`09`09 flags := uor(%X'80000001',flags); X`09`09`09`09 name := name + ' of Weakness'; +-+-+-+-+-+-+-+- END OF PART 30 +-+-+-+-+-+-+-+-