-+-+-+-+-+-+-+-+ START OF PART 51 -+-+-+-+-+-+-+-+ X`09 if (test_light(i1,i2)) then X`09`09 lite_spot(i1,i2) X`09`09 else if (cptr = 1) then X`09`09 lite_spot(i1,i2) X`09`09 else if (cptr > 1) then X`09`09`09if (m_list`5Bcptr`5D.ml) then X`09`09 lite_spot(i1,i2) X`09`09`09else X`09`09 unlite_spot(i1,i2) X`09`09 else X`09`09 unlite_spot(i1,i2); X`09`09 end; X`09`7B End explosion...`09`09`09`7D X if (thit = 1) then X`09msg_print('The ' + descrip + ' envelopes a creature!') X else if (thit > 1) then X`09msg_print('The ' + descrip +`20 X`09`09`09`09' envelopes several creatures!'); X if (tkill = 1) then X`09msg_print('There is a scream of agony!') X else if (tkill > 1) then X`09msg_print('There are several screams of agony!'); X`09`7B End ball hitting...`09`09`09`7D X`09`09end X`09 else if (panel_contains(y,x)) then X`09`09print('*',y,x); X end; X`09 oldy := y; X`09 oldx := x; X`09until (flag); X end; X X X`09`7B Breath weapon works like a fire_ball, but affects the player.`09`7D X`09`7B Note the area affect....`09`09`09`09-RAK-`09`7D X`5Bpsect(misc6$code)`5D function breath`09`09( X`09`09`09typ,y,x,dam_hp`09`09:`09integer; X`09`09`09ddesc`09`09`09:`09vtype X`09`09`09`09`09`09) : boolean; X var X`09i1,i2,i3`09`09`09: integer; X`09dam,max_dis`09`09`09: integer; X`09weapon_type,harm_type`09`09: integer; X`09flag`09`09`09`09: boolean; X`09destroy`09`09`09`09: 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 delete_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 print('*',i1,i2); X`09`09 if (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 dam := dam_hp; X`09`09`09 if (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 :`09light_dam(dam,ddesc); X`09`09`09`092 :`09poison_gas(dam,ddesc); X`09`09`09`093 :`09acid_dam(dam,ddesc); X`09`09`09`094 :`09cold_dam(dam,ddesc); X`09`09`09`095 :`09fire_dam(dam,ddesc); X`09`09`09 end; X`09`09`09 end; X`09`09 end; X`09`09 end; X for 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 if (distance(y,x,i1,i2) <= max_dis) then X`09`09 begin X`09`09 with cave`5Bi1,i2`5D do X`09 if (test_light(i1,i2)) then X`09`09 lite_spot(i1,i2) X`09`09 else if (cptr = 1) then X`09`09 lite_spot(i1,i2) X`09`09 else if (cptr > 1) then X`09`09`09if (m_list`5Bcptr`5D.ml) then X`09`09 lite_spot(i1,i2) X`09`09`09else X`09`09 unlite_spot(i1,i2) X`09`09 else X`09`09 unlite_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`09: integer; X`09`09redraw`09`09: 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(10) = 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 begin X`09`09 recharge := true; X`09`09 num := trunc(num/(level+2)); X`09`09 p1 := p1 + 2 + randint(num); X`09`09 insert_str(name,'(%P4','`5E(%P4'); X`09 end; 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`09`09`09: integer; X`09`09flag`09`09`09: 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 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 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`09`09`09: integer; X`09`09flag`09`09`09: 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 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 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)`09`09`09`7D X`5Bpsect(misc6$code)`5D function speed_monster(dir,y,x,spd : integer) : bool Vean; X var X`09`09flag`09`09`09: 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 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`09`09`09: 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 if (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 confuse_monster := true; X`09`09 flag := true; X`09`09 if ((randint(max_mons_level) < level) or X`09`09`09 (uand(%X'1000',cdefense) <> 0)) then X`09`09 msg_print('The ' + name + ' is unaffected.') X`09`09 else X`09`09 begin X`09`09 confused := true; X`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`09`09`09: 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 if (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 sleep_monster := true; X`09`09 flag := true; X`09`09 if ((randint(max_mons_level) < level) or X`09`09`09 (uand(%X'1000',cdefense) <> 0)) then X`09`09 msg_print('The ' + name + ' is unaffected.') X`09`09 else X`09`09 begin X`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`09`09`09: integer; X`09`09out_val`09`09`09: vtype; X`09`09flag`09`09`09: 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 if (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 msg_print('The wall turns into mud.'); X`09`09 wall_to_mud := true; X`09`09 end; X`09`09 end X`09 else if ((tptr > 0) and (not(fopen))) then X`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 begin X`09`09 inventory`5Binven_max`5D := t_list`5Btptr`5D; X`09`09 objdes(out_val,inven_max,false); X`09`09 msg_print('The ' + out_val + ' turns into mud.'); X`09`09 wall_to_mud := true; X`09`09 end; X`09`09 delete_object(y,x); X`09`09 end; X`09 if (cptr > 1) then X`09 with m_list`5Bcptr`5D do X`09`09 with c_list`5Bmptr`5D do X`09 if (uand(%X'0200',cdefense) <> 0) then X`09`09 begin X`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`09 msg_print('The ' + name + ' wails out in pain!') X`09`09`09 else X`09`09`09msg_print('The ' + name + ' dies in a fit of agony.'); X`09`09 end; 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 if (tval in `5B2,101,102,105,109`5D) then X`09 begin X`09`09 if (delete_object(y,x)) then X`09`09 begin X`09 msg_print('There is a bright flash of light!'); X`09`09 fopen := true; X`09`09 td_destroy2 := true; X`09 end; X`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)`09`09`7D X`5Bpsect(misc6$code)`5D function poly_monster(dir,y,x : integer) : boolean; X var X`09`09flag`09`09`09: boolean; X begin X`09poly_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 with c_list`5Bm_list`5Bcptr`5D.mptr`5D do X`09`09 if (randint(max_mons_level) > level) then X`09`09 begin X`09`09 flag := true; X`09`09 delete_monster(cptr); X`09`09 place_monster(y,x,randint(m_level`5Bmax_mons_level`5D) X`09`09`09`09`09`09`09+ m_level`5B0`5D,false); X`09`09 if (panel_contains(y,x)) then X`09`09`09 if (test_light(y,x)) then X`09`09 poly_monster := true; X`09`09 end X`09`09 else X`09`09`09msg_print('The ' + name + ' is unaffected.'); X`09`09end X`09 else X`09`09flag := true; X end; X`09until (flag); X end; X X`09`7B Create a wall...`09`09`09`09`09-RAK-`09`7D X`5Bpsect(misc6$code)`5D function build_wall(dir,y,x : integer) : boolean; X var X`09`09i1`09`09: integer; X begin X`09build_wall := false; X`09i1 := 0; X`09move(dir,y,x); X`09while ((cave`5By,x`5D.fopen) and (i1 < 10)) do X`09 with cave`5By,x`5D do X`09 begin X`09 if (tptr > 0) then X`09`09delete_object(y,x); X`09 if (cptr > 1) then X`09`09mon_take_hit(cptr,damroll('2d8')); X`09 fval := rock_wall2.ftval; X`09 fopen := rock_wall2.ftopen; X`09 fm := false; X`09 if (test_light(y,x)) then X`09`09lite_spot(y,x); X`09 i1 := i1 + 1; X`09 build_wall := true; X`09 move(dir,y,x); X`09 end; X end; X X`09`7B Replicate a creature`09`09`09`09`09-RAK-`09`7D X`5Bpsect(misc6$code)`5D function clone_monster(dir,y,x : integer) : boolean; X var X`09`09flag`09`09`09: boolean; X begin X`09flag := false; X`09clone_monster := false; X`09repeat X`09 move(dir,y,x); X`09 with cave`5By,x`5D do X`09 if (cptr > 1) then X`09 begin X`09`09multiply_monster(y,x,m_list`5Bcptr`5D.mptr,false); X`09`09if (panel_contains(y,x)) then +-+-+-+-+-+-+-+- END OF PART 51 +-+-+-+-+-+-+-+-