-+-+-+-+-+-+-+-+ START OF PART 54 -+-+-+-+-+-+-+-+ X until (i1 = 0); X if (not(delete_any)) then cur_dis := cur_dis - 6; X until (delete_any); X if (cur_dis < 66) then prt_map; X end; X`20 X`20 X`7B Returns a pointer to next free space `7D X`5Bpsect(misc3$code)`5D procedure popm(var x : integer); X begin X if (mfptr < 1) then compact_monsters; X x := mfptr; X mfptr := m_list`5Bx`5D.nptr; X end; X`20 X`20 X`7B Pushs a record back onto free space list `7D X`5Bpsect(misc3$code)`5D procedure pushm(x : integer); X begin X m_list`5Bx`5D := blank_monster; X m_list`5Bx`5D.nptr := mfptr; X mfptr := x; X end; X`20 X`20 X`7B Gives Max hit points `7D X`5Bpsect(misc3$code)`5D function max_hp(hp_str : dtype) : integer; X var X i1,num,die : integer; X begin X for i1 := 1 to length(hp_str) do X if (hp_str`5Bi1`5D = 'd') then X hp_str`5Bi1`5D := ' '; X readv(hp_str,num,die); X max_hp := num*die; X end; X`20 X`20 X`7B Put varying monster info from creature list into monster list.`7D X`7B The procedure is called bungi because he was there...... -RLG`7D X`5Bpsect(misc3$code)`5D procedure bungi(y,x,z,cur_pos : integer); X Begin X with m_list`5Bcur_pos`5D do `20 X begin X fy := y; X fx := x; X mptr := z; X nptr := muptr; X muptr := cur_pos; X if (uand(c_list`5Bz`5D.cdefense,%X'4000') <> 0) then X hp := max_hp(c_list`5Bz`5D.hd) X else X hp := damroll(c_list`5Bz`5D.hd); X cspeed := c_list`5Bz`5D.speed + py.flags.speed; X stuned := 0; X cdis := distance(char_row,char_col,y,x); X cave`5By,x`5D.cptr := cur_pos; X`09end;`09 `20 X End; X X`7B Places a monster at given location `7D X`5Bpsect(misc3$code)`5D procedure place_monster(y,x,z : integer; slp : boole Van); X var X i1,cur_pos : integer; X begin X popm(cur_pos); X bungi(y,x,z,cur_pos); X with m_list`5Bcur_pos`5D do X begin X`09 cur_reprod := c_list`5Bz`5D.reprod; X if (slp) then X csleep := trunc(c_list`5Bz`5D.sleep/5.0) + randint(c_list`5Bz` V5D.sleep) X else X csleep := 0 X end X end; X X`7B Places a policeman on town level. `7D X`5Bpsect(misc3$code)`5D procedure place_policeman(y1,x1,cop_num: integer); X var X y,x,z,cur_pos : integer; X begin X repeat X y := y1 + randint(7)-4; X x := x1 + randint(7)-4; X until ((in_bounds(y,x)) and (cave`5By,x`5D.fval in `5B1,2,4`5D) and X (cave`5By,x`5D.cptr = 0)); X z := m_level`5B0`5D + m_level`5Bmax_mons_level`5D + cop_num; X popm(cur_pos); X bungi(y,x,z,cur_pos); X with m_list`5Bcur_pos`5D do X begin X`09 cur_reprod := c_list`5Bz`5D.reprod; X csleep := 0 X end X end; X`20 X`7B Places multiplying/reproducing monster at given location. -RLG`7D X`5Bpsect(misc3$code)`5D procedure place_mult_monster(y,x,z,repro : integer;` V20 X`09`09`09`09`09`09 slp : boolean); X var X i1,cur_pos : integer; X Begin X popm(cur_pos); X bungi(y,x,z,cur_pos); X with m_list`5Bcur_pos`5D do X begin X`09 cur_reprod := repro; X if (slp) then X csleep := trunc(c_list`5Bz`5D.sleep/5.0) + randint(c_list`5Bz` V5D.sleep) X else X csleep := 0 X end X End; X X`5Bpsect(misc3$code)`5D procedure get_random_location(var y,x : integer); X Begin X repeat X y := randint(cur_height-2)+1; X x := randint(cur_width-2)+1; X until ((cave`5By,x`5D.fval in `5B1,2,4`5D) and X (cave`5By,x`5D.cptr = 0) and X (cave`5By,x`5D.tptr = 0) and X (distance(y,x,char_row,char_col) > max_sight)); X End; X X`7B Places badguy at random location. -RLG`7D X`5Bpsect(misc3$code)`5D procedure place_badguy_monster(monster : integer); X VAR X cur_pos,y,x,z: integer; X BEGIN X`09 `7B Finds exact spot of badguy in creature list`7D X`09 get_random_location(y,x); X z := m_level`5B0`5D + m_level`5Bmax_mons_level`5D + num_of_police V + monster; X popm(cur_pos); X`09 bungi(y,x,z,cur_pos); X with m_list`5Bcur_pos`5D do X begin X`09 cur_reprod := c_list`5Bz`5D.reprod; X csleep := 10; X end; X END; X`20 X`7B Places the Boss at random location `7D X`5Bpsect(misc3$code)`5D procedure place_the_boss; X var X cur_pos,y,x,z : integer; X Begin X `09 get_random_location(y,x); X`09 z := max_creatures; X`09 popm(cur_pos); X`09 bungi(y,x,z,cur_pos); X with m_list`5Bcur_pos`5D do X begin X`09 cur_reprod := c_list`5Bz`5D.reprod; X csleep := 0; X end; X End; X`20 X`20 X`7B Allocates a random monster `7D X`5Bpsect(misc3$code)`5D procedure alloc_monster(alloc_set : obj_set; X num,dis : integer; X slp : boolean ); X var X y,x,a,b,i1,i2,i3 : integer; X begin X for i1 := 1 to num do X begin X repeat X y := randint(cur_height-2)+1; X x := randint(cur_width-2)+1; X until ((cave`5By,x`5D.fval in alloc_set) and X (cave`5By,x`5D.cptr = 0) and X (cave`5By,x`5D.fopen) and X (distance(y,x,char_row,char_col) > dis)); X if (dun_level <= 0) then X i2 := randint(m_level`5B0`5D) X else X if (dun_power > max_mons_level) then X i2 := randint(m_level`5Bmax_mons_level`5D) + m_level`5B0`5D X else X if (randint(mon_nasty) = 1) then X begin X i2 := dun_power + abs(randnor(0,4)) + 1; X if (i2 > max_mons_level) then i2 := max_mons_level; X i3 := m_level`5Bi2`5D - m_level`5Bi2-1`5D; X i2 := randint(i3) + m_level`5Bi2-1`5D X end X else X i2 := randint(m_level`5Bdun_power`5D) + m_level`5B0`5D; X place_monster(y,x,i2,slp); X end X end; X`20 X`20 X`7B Places creature adjacent to given location `7D X`5Bpsect(misc3$code)`5D function summon_monster( X var y,x : integer; X slp : boolean ) : boolean; X var X i1,i2,i3,i4,i5 : integer; X begin X summon_monster := false; X i1 := 0; X i5 := dun_power - mon$summon_adj; X if (i5 < 1) then X i4 := 1 X else if (i5 > max_mons_level) then X i4 := max_mons_level X else X i4 := i5; X if (dun_level <= 0) then X i4 := randint(m_level`5B0`5D) X else X i4 := randint(m_level`5Bi4`5D) + m_level`5B0`5D; X repeat X i2 := y - 2 + randint(3); X i3 := x - 2 + randint(3); X if (in_bounds(i2,i3)) then X with cave`5Bi2,i3`5D do X if (fval in `5B1,2,4,5`5D) then X if (cptr = 0) then X if (fopen) then X begin X place_monster(i2,i3,i4,slp); X summon_monster := true; X`09`09 i1 := 9; X y := i2; X x := i3; X end; X i1 := i1 + 1; X until (i1 > 9); X end; X`20 X`20 X`7B Places undead adjacent to given location `7D X`5Bpsect(misc3$code)`5D function summon_undead(var y,x : integer) : boolean; X var X i1,i2,i3,i4,i5,ctr : integer; X begin X i1 := 0; X summon_undead := false; X i4 := m_level`5Bmax_mons_level`5D; X repeat X i5 := randint(i4) + m_level`5B0`5D; X ctr := 0; X repeat X if (uand(c_list`5Bi5`5D.cdefense,%X'0008') <> 0) then X begin X ctr := 20; X i4 := 0; X end X else X begin X i5 := i5 + 1; X if (i5 > i4) then X ctr := 20 X else X ctr := ctr + 1; X end; X until(ctr > 19) X until(i4 = 0); X repeat X i2 := y - 2 + randint(3); X i3 := x - 2 + randint(3); X if (in_bounds(i2,i3)) then X with cave`5Bi2,i3`5D do X if (fval in `5B1,2,4,5`5D) then X if ((cptr = 0) and (fopen)) then X begin X place_monster(i2,i3,i5,false); X summon_undead := true; X i1 := 9; X y := i2; X x := i3; X end; X i1 := i1 + 1; X until (i1 > 9); X end; X`20 X`20 X`7B If too many objects on floor level, delete some of them `7D X`5Bpsect(misc2$code)`5D procedure compact_objects; X var X i1,i2,ctr,cur_dis : integer; X flag : boolean; X begin X ctr := 0; X cur_dis := 66; X repeat X for i1 := 1 to cur_height do X for i2 := 1 to cur_width do X with cave`5Bi1,i2`5D do X if (tptr > 0) then X if (distance(i1,i2,char_row,char_col) > cur_dis) then X begin X flag := false; X with t_list`5Btptr`5D do X case tval of X 102 : if (subval in `5B1,6,9`5D) then X flag := true X else if (randint(4) = 1) then X flag := true; X 103 : flag := true; X 104,105 : if (randint(4) = 1) then flag := true; X 107,108 : ; X otherwise if (randint(8) = 1) then flag := true; X end; X if (flag) then X begin X fopen := true; X t_list`5Btptr`5D := blank_treasure; X t_list`5Btptr`5D.p1 := tcptr; X tcptr := tptr; X tptr := 0; X ctr := ctr + 1; X end; X end; X if (ctr = 0) then cur_dis := cur_dis - 6; X until (ctr > 0); X if (cur_dis < 66) then prt_map; X end; X`20 X`20 X`7B Gives pointer to next free space `7D X`5Bpsect(misc4$code)`5D procedure popt(var x : integer); X var X i1 : integer; X begin X if (tcptr < 1) then compact_objects; X x := tcptr; X tcptr := t_list`5Bx`5D.p1; X end; X`20 X`20 X`7B Pushs a record back onto free space list `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`20 X`20 X`7B Order the treasure list by level `7D X`5Bpsect(setup$code)`5D procedure sort_objects; X var X i1,i2,i3,gap : integer; X tmp : treasure_type; X begin X gap := max_objects div 2; X while (gap > 0) do X begin X for i1 := gap+1 to max_objects do X begin X i2 := i1 - gap; X while (i2 > 0) do X begin X i3 := i2 + gap; X if (object_list`5Bi2`5D.level > object_list`5Bi3`5D.level) V then X begin X tmp := object_list`5Bi2`5D; X object_list`5Bi2`5D := object_list`5Bi3`5D; X object_list`5Bi3`5D := tmp; X end X else X i2 := 0; X i2 := i2 - gap; X end; X end; X gap := gap div 2; X end; X end; X`20 X`20 X`7Bplaces a trap at a given location`7D X`5Bpsect(misc4$code)`5D procedure place_trap(y,x,typ,subval : integer); X var X cur_pos : integer; X cur_trap : treasure_type; X begin X if (typ = 1) then X cur_trap := trap_lista`5Bsubval`5D X else X if (typ = 2) then X cur_trap := trap_listb`5Bsubval`5D X else X cur_trap := blk_mkt_trap; `7Btyp=3, one per level - mwk`7D X popt(cur_pos); X cave`5By,x`5D.tptr := cur_pos; X t_list`5Bcur_pos`5D := cur_trap; X end; X`20 X`20 X`7B Places rubble at location y,x `7D X`5Bpsect(misc4$code)`5D procedure place_rubble(y,x : integer); X var X cur_pos : integer; X begin X popt(cur_pos); X with cave`5By,x`5D do X begin X tptr := cur_pos; X fopen := false; X end; X t_list`5Bcur_pos`5D := rubble; X end; X`20 X`20 X`5Bpsect(misc4$code)`5D procedure place_open_door(y,x : integer); X var X cur_pos : integer; X begin X popt(cur_pos); X with cave`5By,x`5D do X begin X tptr := cur_pos; X t_list`5Bcur_pos`5D := door_list`5B1`5D; X fval := corr_floor3.ftval; X fopen := true; X end; X end; X`20 X`20 X`5Bpsect(misc4$code)`5D procedure place_broken_door(y,x : integer); X var X cur_pos : integer; X begin X popt(cur_pos); X with cave`5By,x`5D do X begin X tptr := cur_pos; X t_list`5Bcur_pos`5D := door_list`5B1`5D; X fval := corr_floor3.ftval; X fopen := true; X t_list`5Bcur_pos`5D.p1 := 1; X end; X end; X`20 X`20 X`5Bpsect(misc4$code)`5D procedure place_closed_door(y,x : integer); X var X cur_pos : integer; X begin X popt(cur_pos); X with cave`5By,x`5D do X begin X tptr := cur_pos; X t_list`5Bcur_pos`5D := door_list`5B2`5D; X fval := corr_floor3.ftval; X fopen := false; X end; X end; X`20 X`20 X`5Bpsect(misc4$code)`5D procedure place_locked_door(y,x : integer); X var X cur_pos : integer; X begin X popt(cur_pos); X with cave`5By,x`5D do X begin X tptr := cur_pos; X t_list`5Bcur_pos`5D := door_list`5B2`5D; X fval := corr_floor3.ftval; X fopen := false; X t_list`5Bcur_pos`5D.p1 := randint(10) + 10; X end; X end; X`20 X`20 +-+-+-+-+-+-+-+- END OF PART 54 +-+-+-+-+-+-+-+-