-+-+-+-+-+-+-+-+ START OF PART 51 -+-+-+-+-+-+-+-+ X`09`09 if ((not(fopen)) or (cptr > 1)) then X`09`09 begin X`09`09 flag := true; X`09`09 if (not(fopen)) then X`09`09`09begin X`09`09`09 y := oldy; X`09`09`09 x := oldx; X`09`09`09end; X`09`7B The ball hits and explodes... `7D X`09`7B The explosion... `7D X`09for i1 := y-max_dis to y+max_dis do X`09 for i2 := x-max_dis to x+max_dis do X`09 if (in_bounds(i1,i2)) then X`09 if (distance(y,x,i1,i2) <= max_dis) then X`09 if (los(y,x,i1,i2)) then `7B FIXED BUG V4.5 `7D X`09`09with cave`5Bi1,i2`5D do X`09`09 begin X`09`09 if (tptr > 0) then X`09`09 if (t_list`5Btptr`5D.tval in destroy) then X`09`09`09delete_object(i1,i2); X`09`09 if (fopen) then X`09`09 begin X`09`09`09if (panel_contains(i1,i2)) then print('*',i1,i2); X`09`09`09if (cptr > 1) then X`09`09`09 with m_list`5Bcptr`5D do X`09`09`09 with c_list`5Bmptr`5D do X`09`09`09 begin X`09`09`09`09thit := thit + 1; X`09`09`09`09dam := dam_hp; X`09`09`09`09if (uand(harm_type,cdefense) <> 0) then X`09`09`09`09 dam := dam*2 X`09`09`09`09else if (uand(weapon_type,spells) <> 0) then X`09`09`09`09 dam := dam div 4; X`09`09`09`09dam := trunc(dam/(distance(i1,i2,y,x)+1)); X`09`09`09`09i3 := mon_take_hit(cptr,dam); X`09`09`09`09if (i3 > 0) then X`09`09`09`09 tkill := tkill + 1 X`09`09`09`09else X`09`09`09`09 begin X`09`09`09`09 if (panel_contains(i1,i2)) then X`09`09`09`09 begin X`09`09`09`09`09print(cchar,i1,i2); X`09`09`09`09`09ml := true; X`09`09`09`09 end X`09`09`09`09 end; X`09`09`09 end; X`09`09 end; X`09`09 end; X`09for i1 := (y - 2) to (y + 2) do X`09 for i2 := (x - 2) to (x + 2) do X`09 if (in_bounds(i1,i2)) then X`09 if (panel_contains(i1,i2)) then X`09`09if (distance(y,x,i1,i2) <= max_dis) then X`09`09 begin X`09`09 with cave`5Bi1,i2`5D do X`09`09 if (test_light(i1,i2)) then X`09`09`09lite_spot(i1,i2) X`09`09 else if (cptr = 1) then X`09`09`09lite_spot(i1,i2) X`09`09 else if (cptr > 1) then X`09`09`09if (m_list`5Bcptr`5D.ml) then X`09`09`09 lite_spot(i1,i2) X`09`09`09else X`09`09`09 unlite_spot(i1,i2) X`09`09 else X`09`09`09unlite_spot(i1,i2); X`09`09 end; X`09`7B End explosion... `7D X`09 if (thit = 1) then X`09 msg_print('The ' + descrip + ' envelopes a creature!') X`09 else if (thit > 1) then X`09 msg_print('The ' + descrip + X`09`09`09`09' envelopes several creatures!'); X`09 if (tkill = 1) then X`09 msg_print('There is a scream of agony!') X`09 else if (tkill > 1) then X`09 msg_print('There are several screams of agony!'); X`09`7B End ball hitting... `7D X`09`09 end X`09`09 else if (panel_contains(y,x)) then X`09`09 print('*',y,x); X`09`09end; X`09 oldy := y; X`09 oldx := x; X`09 end; X`09until (flag); X end; X X X`09`7B Breath weapon works like a fire_ball, but affects the player. `7D X`09`7B Note the area affect.... -RAK- `7D X`5Bpsect(misc6$code)`5D function breath ( X`09`09`09typ,y,x,dam_hp : integer; X`09`09`09ddesc : vtype X`09`09`09`09`09`09) : boolean; X var X`09i1,i2,i3 : integer; X`09dam,max_dis : integer; X`09weapon_type,harm_type : integer; X`09flag : boolean; X`09destroy : obj_set; X begin X`09breath := true; X`09max_dis := 2; X`09get_flags(typ,weapon_type,harm_type,destroy); X`09for i1 := y-2 to y+2 do X`09 for i2 := x-2 to x+2 do X`09 if (in_bounds(i1,i2)) then X`09 if (distance(y,x,i1,i2) <= max_dis) then X`09`09with cave`5Bi1,i2`5D do X`09`09 begin X`09`09 if (tptr > 0) then X`09`09 if (t_list`5Btptr`5D.tval in destroy) then X`09`09`09delete_object(i1,i2); X`09`09 if (fopen) then X`09`09 begin X`09`09`09if (panel_contains(i1,i2)) then X`09`09`09 print('*',i1,i2); X`09`09`09if (cptr > 1) then X`09`09`09 with m_list`5Bcptr`5D do X`09`09`09 with c_list`5Bmptr`5D do X`09`09`09 begin X`09`09`09`09dam := dam_hp; X`09`09`09`09if (uand(harm_type,cdefense) <> 0) then X`09`09`09`09 dam := dam*2 X`09`09`09`09else if (uand(weapon_type,spells) <> 0) then X`09`09`09`09 dam := trunc(dam/4.0); X`09`09`09`09dam := trunc(dam/(distance(i1,i2,y,x)+1)); X`09`09`09`09hp := hp - dam; X`09`09`09`09csleep := 0; X`09`09`09`09if (hp < 0) then X`09`09`09`09 begin X`09`09`09`09 monster_death(fy,fx,cmove); X`09`09`09`09 delete_monster(cptr); X`09`09`09`09 end; X`09`09`09 end X`09`09`09else if (cptr = 1) then X`09`09`09 begin X`09`09`09 dam := trunc(dam_hp/(distance(i1,i2,y,x)+1)); X`09`09`09 case typ of X`09`09`09`091 : light_dam(dam,ddesc); X`09`09`09`092 : poison_gas(dam,ddesc); X`09`09`09`093 : acid_dam(dam,ddesc); X`09`09`09`094 : cold_dam(dam,ddesc); X`09`09`09`095 : fire_dam(dam,ddesc); X`09`09`09 end; X`09`09`09 end; X`09`09 end; X`09`09 end; X`09for i1 := (y - 2) to (y + 2) do X`09 for i2 := (x - 2) to (x + 2) do X`09 if (in_bounds(i1,i2)) then X`09 if (panel_contains(i1,i2)) then X`09`09if (distance(y,x,i1,i2) <= max_dis) then X`09`09 begin X`09`09 with cave`5Bi1,i2`5D do X`09`09 if (test_light(i1,i2)) then X`09`09`09lite_spot(i1,i2) X`09`09 else if (cptr = 1) then X`09`09`09lite_spot(i1,i2) X`09`09 else if (cptr > 1) then X`09`09`09if (m_list`5Bcptr`5D.ml) then X`09`09`09 lite_spot(i1,i2) X`09`09`09else X`09`09`09 unlite_spot(i1,i2) X`09`09 else X`09`09`09unlite_spot(i1,i2); X`09`09 end; X end; X X X`09`7B Recharge a wand, staff, or rod. Sometimes the item breaks. -RAK-`7D X`5Bpsect(misc6$code)`5D function recharge(num : integer) : boolean; X var X`09`09item_val : integer; X`09`09redraw : boolean; X begin X`09recharge := false; X`09redraw := false; X`09if (get_item(item_val,'Recharge which item?',redraw,1,inven_ctr)) then X`09 with inventory`5Bitem_val`5D do X`09 if (tval in `5B55,60,65`5D) then X`09 if (randint(8) = 1) then X`09`09begin X`09`09 recharge := true; X`09`09 msg_print('There is a bright flash of light...'); X`09`09 inven_destroy(item_val); X`09`09end X`09 else X`09`09begin X`09`09 recharge := true; X`09`09 num := trunc(num/(level+2)); X`09`09 p1 := p1 + 2 + randint(num); X`09`09 if (index(name,'`5E') = 0) then X`09`09 insert_str(name,' (%P1','`5E (%P1'); X`09`09end; X`09if (redraw) then X`09 begin X`09 msg_print(' '); X`09 draw_cave; X`09 end; X end; X X`09`7B Increase or decrease a creatures hit points`09`09-RAK-`09`7D X`5Bpsect(misc6$code)`5D function hp_monster(dir,y,x,dam : integer) : boolean V; X var X`09`09i1 : integer; X`09`09flag : boolean; X begin X`09hp_monster := false; X`09flag := false; X`09repeat X`09 move(dir,y,x); X`09 with cave`5By,x`5D do X`09 begin X`09 if (fopen) then X`09`09begin X`09`09 if (cptr > 1) then X`09`09 begin X`09`09 flag := true; X`09`09 with m_list`5Bcptr`5D do X`09`09`09with c_list`5Bmptr`5D do X`09`09`09 begin X`09`09`09 hp_monster := true; X`09`09`09 i1 := mon_take_hit(cptr,dam); X`09`09`09 if (i1 > 0) then X`09msg_print('The ' + c_list`5Bi1`5D.name + ' dies in a fit of agony.') X`09`09`09 else X`09`09`09 msg_print('The ' + name + ' screams in agony.'); X`09`09`09 end X`09`09 end X`09`09end X`09 else X`09`09flag := true; X`09 end; X`09until (flag); X end; X X`09`7B Drains life; note it must be living...`09`09-RAK-`09`7D X`5Bpsect(misc6$code)`5D function drain_life(dir,y,x : integer) : boolean; X var X`09`09i1 : integer; X`09`09flag : boolean; X begin X`09drain_life := false; X`09flag := false; X`09repeat X`09 move(dir,y,x); X`09 with cave`5By,x`5D do X`09 begin X`09 if (fopen) then X`09`09begin X`09`09 if (cptr > 1) then X`09`09 begin X`09`09 flag := true; X`09`09 with m_list`5Bcptr`5D do X`09`09`09with c_list`5Bmptr`5D do X`09`09`09 if (uand(cdefense,%X'0008') = 0) then X`09`09`09 begin X`09`09`09 drain_life := true; X`09`09`09 i1 := mon_take_hit(cptr,50); X`09`09`09 if (i1 > 0) then X`09msg_print('The ' + c_list`5Bi1`5D.name + ' dies in a fit of agony.') X`09`09`09 else X`09msg_print('The ' + name + ' screams in agony.'); X`09`09`09 end X`09`09 end X`09`09end X`09 else X`09`09flag := true; X`09 end; X`09until (flag); X end; X X`09`7B Increase or decrease a creatures speed`09`09-RAK-`09`7D X`09`7B NOTE: cannot slow a winning creature (BALROG) `7D X`5Bpsect(misc6$code)`5D function speed_monster(dir,y,x,spd : integer) : bool Vean; X var X`09`09flag : boolean; X begin X`09speed_monster := false; X`09flag := false; X`09repeat X`09 move(dir,y,x); X`09 with cave`5By,x`5D do X`09 begin X`09 if (fopen) then X`09`09begin X`09`09 if (cptr > 1) then X`09`09 begin X`09`09 flag := true; X`09`09 with m_list`5Bcptr`5D do X`09`09`09with c_list`5Bmptr`5D do X`09`09`09 if (spd > 0) then X`09`09`09 begin X`09`09`09 cspeed := cspeed + spd; X`09`09`09 csleep := 0; X`09`09`09 end X`09`09`09 else if (randint(max_mons_level) > level) then X`09`09`09 begin X`09`09`09 cspeed := cspeed + spd; X`09`09`09 csleep := 0; X`09`09`09 end X`09`09`09 else X`09`09`09 msg_print('The ' + name + ' is unaffected.'); X`09`09 speed_monster := true; X`09`09 end X`09`09end X`09 else X`09`09flag := true; X`09 end; X`09until (flag); X end; X X`09`7B Confuse a creature`09`09`09`09`09-RAK-`09`7D X`5Bpsect(misc6$code)`5D function confuse_monster(dir,y,x : integer) : boolea Vn; X var X`09`09flag : boolean; X begin X`09confuse_monster := false; X`09flag := false; X`09repeat X`09 move(dir,y,x); X`09 with cave`5By,x`5D do X`09 if (fopen) then X`09 begin X`09`09if (cptr > 1) then X`09`09 with m_list`5Bcptr`5D do X`09`09 with c_list`5Bmptr`5D do X`09`09 begin X`09`09`09confuse_monster := true; X`09`09`09flag := true; X`09`09`09if ((randint(max_mons_level) < level) or X`09`09`09 (uand(%X'1000',cdefense) <> 0)) then X`09`09`09 msg_print('The ' + name + ' is unaffected.') X`09`09`09else X`09`09`09 begin X`09`09`09 confused := true; X`09`09`09 csleep := 0; X`09`09`09 msg_print('The ' + name + ' appears confused.'); X`09`09`09 end; X`09`09 end; X`09 end X`09 else X`09 flag := true; X`09until (flag); X end; X X`09`7B Sleep a creature...`09`09`09`09`09-RAK-`09`7D X`5Bpsect(misc6$code)`5D function sleep_monster(dir,y,x : integer) : boolean; X var X`09`09flag : boolean; X begin X`09sleep_monster := false; X`09flag := false; X`09repeat X`09 move(dir,y,x); X`09 with cave`5By,x`5D do X`09 if (fopen) then X`09 begin X`09`09if (cptr > 1) then X`09`09 with m_list`5Bcptr`5D do X`09`09 with c_list`5Bmptr`5D do X`09`09 begin X`09`09`09sleep_monster := true; X`09`09`09flag := true; X`09`09`09if ((randint(max_mons_level) < level) or X`09`09`09 (uand(%X'1000',cdefense) <> 0)) then X`09`09`09 msg_print('The ' + name + ' is unaffected.') X`09`09`09else X`09`09`09 begin X`09`09`09 csleep := 500; X`09`09`09 msg_print('The ' + name + ' falls asleep.'); X`09`09`09 end; X`09`09 end; X`09 end X`09 else X`09 flag := true; X`09until (flag); X end; X X`09`7B Turn stone to mud, delete wall....`09`09`09-RAK-`09`7D X`5Bpsect(misc6$code)`5D function wall_to_mud(dir,y,x : integer) : boolean; X var X`09`09i1 : integer; X`09`09out_val : vtype; X`09`09flag : boolean; X begin X`09wall_to_mud := false; X`09flag := false; X`09repeat X`09 move(dir,y,x); X`09 with cave`5By,x`5D do X`09 if (in_bounds(y,x)) then X`09 begin X`09`09if (fval in wall_set) then X`09`09 begin X`09`09 flag := true; X`09`09 twall(y,x,1,0); X`09`09 if (test_light(y,x)) then X`09`09 begin X`09`09`09msg_print('The wall turns into mud.'); X`09`09`09wall_to_mud := true; X`09`09 end; X`09`09 end X`09`09else if ((tptr > 0) and (not(fopen))) then X`09`09 begin X`09`09 flag := true; X`09`09 if (panel_contains(y,x)) then X`09`09 if (test_light(y,x)) then X`09`09`09begin X`09`09`09 inventory`5Binven_max`5D := t_list`5Btptr`5D; X`09`09`09 objdes(out_val,inven_max,false); X`09`09`09 msg_print('The ' + out_val + ' turns into mud.'); X`09`09`09 wall_to_mud := true; X`09`09`09end; X`09`09 delete_object(y,x); X`09`09 end; X`09`09if (cptr > 1) then X`09`09 with m_list`5Bcptr`5D do X`09`09 with c_list`5Bmptr`5D do X`09`09 if (uand(%X'0200',cdefense) <> 0) then X`09`09`09begin X`09`09`09 i1 := mon_take_hit(cptr,100); X`09`09`09 flag := true; X`09`09`09 if (ml) then X`09`09`09 if (i1 > 0) then X`09`09`09msg_print('The ' + name + ' dies in a fit of agony.') X`09`09`09 else X`09`09`09 msg_print('The ' + name + ' wails out in pain!'); X`09`09`09end; X`09 end X`09 else X`09 flag := true; X`09until (flag); X end; X X X`09`7B Destroy all traps and doors in a given direction`09-RAK-`09`7D X`5Bpsect(misc6$code)`5D function td_destroy2(dir,y,x : integer) : boolean; X begin X`09td_destroy2 := false; X`09repeat X`09 move(dir,y,x); X`09 with cave`5By,x`5D do X`09 if (tptr > 0) then X`09 with t_list`5Btptr`5D do X`09`09if (tval in `5B2,101,102,105,109`5D) then X`09`09 begin X`09`09 if (delete_object(y,x)) then X`09`09 begin X`09`09`09msg_print('There is a bright flash of light!'); X`09`09`09fopen := true; X`09`09`09td_destroy2 := true; X`09`09 end; X`09`09 end; X`09until (not(cave`5By,x`5D.fopen)); X end; X X`09`7B Polymorph a monster`09`09`09`09`09-RAK-`09`7D X`09`7B NOTE: cannot polymorph a winning creature (BALROG) `7D X`5Bpsect(misc6$code)`5D function poly_monster(dir,y,x : integer) : boolean; X var X`09`09dist : integer; X`09`09flag : boolean; X begin X`09poly_monster := false; X`09flag := false; X`09dist := 0; X`09repeat X`09 move(dir,y,x); +-+-+-+-+-+-+-+- END OF PART 51 +-+-+-+-+-+-+-+-