-+-+-+-+-+-+-+-+ START OF PART 39 -+-+-+-+-+-+-+-+ X`09 if ((i1 <> y) or (i2 <> x)) then X`09 if (randint(100) < chance) then X`09 with cave`5Bi1,i2`5D do X`09`7B Search for hidden objects`09`09`7D X`09`09 if (tptr > 0) then X`09`09 with t_list`5Btptr`5D do X`09`09`7B Trap on floor?`09`09`7D X`09`09 if (tval = 101) then X`09`09 begin X`09`09`09 msg_print('You have found ' + name + '.'); X`09`09`09 change_trap(i1,i2); X`09`09`09 find_flag := false; X`09`09 end X`09`09`7B Secret door?`09`09`09`7D X`09`09`09else if (tval = 109) then X`09`09`09 begin X`09`09`09 msg_print('You have found a secret door.'); X`09`09`09 fval := corr_floor2.ftval; X`09`09`09 change_trap(i1,i2); X`09`09`09 find_flag := false; X`09`09`09 end X`09`09`7B Chest is trapped?`09`09`7D X`09`09 else if (tval = 2) then X`09`09`09 begin X`09`09`09 if (flags > 1) then X`09`09`09 if (index(name,'`5E') > 0) then X`09`09`09`09begin X`09`09`09`09 known2(name); X`09`09msg_print('You have discovered a trap on the chest!'); X`09`09`09`09end; X`09`09`09 end; X end; X X X`09`7B Turns off Find_flag if something interesting appears`09-RAK-`09`7D X`09`7B BUG: Does not handle corridor/room corners, but I didn't want`09`7D X`09`7B to add a lot of checking for such a minor detail`09`09`7D X procedure area_affect(dir,y,x : integer); X var X`09`09z`09`09: array `5B1..3`5D of integer; X`09`09i1,row,col`09: integer; X begin X`09if (cave`5By,x`5D.fval = 4) then X`09 begin X`09 i1 := 0; X`09 if (next_to4(y,x,`5B4,5,6`5D) > 2) then X`09 find_flag := false; X`09 end; X`09if ((find_flag) and (py.flags.blind < 1)) then X`09 begin X`09 case dir of X`09`091 :`09begin X`09`09`09 z`5B1`5D := 4; X`09`09`09 z`5B2`5D := 1; X`09`09`09 z`5B3`5D := 3; X`09`09`09end; X`09`092 :`09begin X`09`09`09 z`5B1`5D := 4; X`09`09`09 z`5B2`5D := 2; X`09`09`09 z`5B3`5D := 6; X`09`09`09end; X`09`093 :`09begin X`09`09`09 z`5B1`5D := 2; X`09`09`09 z`5B2`5D := 3; X`09`09`09 z`5B3`5D := 6; X`09`09`09end; X`09`094 :`09begin X`09`09`09 z`5B1`5D := 8; X`09`09`09 z`5B2`5D := 4; X`09`09`09 z`5B3`5D := 2; X`09`09`09end; X`09`096 :`09begin X`09`09`09 z`5B1`5D := 2; X`09`09`09 z`5B2`5D := 6; X`09`09`09 z`5B3`5D := 8; X`09`09`09end; X`09`097 :`09begin X`09`09`09 z`5B1`5D := 8; X`09`09`09 z`5B2`5D := 7; X`09`09`09 z`5B3`5D := 4; X`09`09`09end; X`09`098 :`09begin X`09`09`09 z`5B1`5D := 4; X`09`09`09 z`5B2`5D := 8; X`09`09`09 z`5B3`5D := 6; X`09`09`09end; X`09`099 :`09begin X`09`09`09 z`5B1`5D := 8; X`09`09`09 z`5B2`5D := 9; X`09`09`09 z`5B3`5D := 6; X`09`09`09end; X`09 end; X`09 for i1 := 1 to 3 do X`09 begin X`09 row := y; X`09 col := x; X`09 if (move(z`5Bi1`5D,row,col)) then X`09 with cave`5Brow,col`5D do X`09`09 begin X`09`09`09`7B Empty doorways`09`7D X`09`09 if (fval = 5) then X`09`09 find_flag := false; X`09`09`09`7B Objects player can see`7D X`09`09`09`7B Including doors`09`7D X`09`09 if (find_flag) then X`09`09`09if (player_light) then X`09`09`09 begin X`09`09`09 if (tptr > 0) then X`09`09`09 if (not(t_list`5Btptr`5D.tval in `5B101,109`5D)) then X`09`09`09 find_flag := false; X`09`09`09 end X`09`09`09else if ((tl) or (pl) or (fm)) then X`09`09 if (tptr > 0) then X`09`09 if (not(t_list`5Btptr`5D.tval in `5B101,109`5D)) then X`09`09 find_flag := false; X`09`09`09`7B Creatures`09`09`7D X`09`09 if (find_flag) then X`09`09 if ((tl) or (pl) or (player_light)) then X`09`09 if (cptr > 1) then X`09`09`09 with m_list`5Bcptr`5D do X`09`09`09 if (ml) then X`09`09 find_flag := false; X`09`09 end X`09 end X`09 end; X end; X X X`09`7B Picks new direction when in find mode`09`09`09-RAK-`09`7D X function pick_dir(dir : integer) : boolean; X var X`09`09z`09`09: array `5B1..2`5D of integer; X`09`09i1,y,x`09`09: integer; X begin X`09if ((find_flag) and (next_to4(char_row,char_col,corr_set) = 2)) then X`09 begin X`09 case dir of X`09`091 :`09begin X`09`09`09 z`5B1`5D := 2; X`09`09`09 z`5B2`5D := 4; X`09`09`09end; X`09`092 :`09begin X`09`09`09 z`5B1`5D := 4; X`09`09`09 z`5B2`5D := 6; X`09`09`09end; X`09`093 :`09begin X`09`09`09 z`5B1`5D := 2; X`09`09`09 z`5B2`5D := 6; X`09`09`09end; X`09`094 :`09begin X`09`09`09 z`5B1`5D := 2; X`09`09`09 z`5B2`5D := 8; X`09`09`09end; X`09`096 :`09begin X`09`09`09 z`5B1`5D := 2; X`09`09`09 z`5B2`5D := 8; X`09`09`09end; X`09`097 :`09begin X`09`09`09 z`5B1`5D := 4; X`09`09`09 z`5B2`5D := 8; X`09`09`09end; X`09`098 :`09begin X`09`09`09 z`5B1`5D := 4; X`09`09`09 z`5B2`5D := 6; X`09`09`09end; X`09`099 :`09begin X`09`09`09 z`5B1`5D := 6; X`09`09`09 z`5B2`5D := 8; X`09`09`09end; X`09 end; X`09 pick_dir := false; X`09 for i1 := 1 to 2 do X`09 begin X`09`09y := char_row; X`09`09x := char_col; X`09`09if (move(z`5Bi1`5D,y,x)) then X`09`09 if (cave`5By,x`5D.fopen) then X`09`09 begin X`09`09 pick_dir := true; X`09`09 com_val := z`5Bi1`5D + 48 X`09`09 end X`09 end X`09 end X`09else X`09 begin X`09 pick_dir := false; X`09 end; X end; X X X`09`7B AC gets worse`09`09`09`09`09`09-RAK-`09`7D X`09`7B Note: This routine affects magical AC bonuse so that stores`09`7D X`09`7B can detect the damage.`09`09`09`09`09`7D X function minus_ac(typ_dam : integer) : boolean; X var X`09i1,i2`09`09`09: integer; X`09tmp`09`09`09: array `5B1..5`5D of integer; X begin X`09i1 := 0; X`09if (inventory`5B26`5D.tval > 0) then X`09 begin X`09 i1 := i1 + 1; X`09 tmp`5Bi1`5D := 26; X`09 end; X`09if (inventory`5B27`5D.tval > 0) then X`09 begin X`09 i1 := i1 + 1; X`09 tmp`5Bi1`5D := 27; X`09 end; X`09if (inventory`5B32`5D.tval > 0) then X`09 begin X`09 i1 := i1 + 1; X`09 tmp`5Bi1`5D := 32; X`09 end; X`09if (inventory`5B28`5D.tval > 0) then X`09 begin X`09 i1 := i1 + 1; X`09 tmp`5Bi1`5D := 28; X`09 end; X`09if (inventory`5B24`5D.tval > 0) then X`09 begin X`09 i1 := i1 + 1; X`09 tmp`5Bi1`5D := 24; X`09 end; X`09minus_ac := false; X`09if (i1 > 0) then X`09 begin X`09 i2 := tmp`5Brandint(i1)`5D; X`09 with inventory`5Bi2`5D do X`09 if (uand(flags,typ_dam) <> 0) then X`09`09begin X`09`09 objdes(out_val,i2,false); X`09`09 msg_print('Your ' + out_val + ' resists damage!'); X`09`09 minus_ac := true; X`09`09end X`09 else if ((ac+toac) > 0) then X`09 begin X`09`09 objdes(out_val,i2,false); X`09`09 msg_print('Your ' + out_val + ' is damaged!'); X`09`09 toac := toac - 1; X`09`09 py_bonuses(blank_treasure,0); X`09`09 minus_ac := true; X`09 end X`09 end X end; X X X`09`7B Corrode the unsuspecting person's armor`09`09-RAK-`09`7D X procedure corrode_gas(kb_str : vtype); X begin X`09if (not (minus_ac(%X'00100000'))) then X`09 take_hit(randint(8),kb_str); X`09print_stat := uor(%X'0040',print_stat); X`09if (inven_damage(`5B23,33,34,35,65`5D,5) > 0) then X`09 msg_print('There is an acrid smell coming from your pack.'); X end; X X X`09`7B Poison gas the idiot...`09`09`09`09-RAK-`09`7D X procedure poison_gas(dam : integer; kb_str : vtype); X begin X`09take_hit(dam,kb_str); X`09print_stat := uor(%X'0040',print_stat); X`09py.flags.poisoned := py.flags.poisoned + 12 + randint(dam); X end; X X X`09`7B Burn the fool up...`09`09`09`09`09-RAK-`09`7D X procedure fire_dam(dam : integer; kb_str : vtype); X begin X`09if (py.flags.fire_resist)then X`09 dam := trunc(dam*0.5); X`09if (py.flags.resist_heat > 0) then X`09 dam := trunc(dam*0.5); X`09take_hit(dam,kb_str); X`09print_stat := uor(%X'0080',print_stat); X`09if (inven_damage(`5B12,20,21,22,30,31,32,36,55,70,71`5D,3) > 0) then X`09 msg_print('There is smoke coming from your pack!'); X end; X X X`09`7B Freeze him to death...`09`09`09`09-RAK-`09`7D X procedure cold_dam(dam : integer; kb_str : vtype); X begin X`09if (py.flags.cold_resist)then X`09 dam := trunc(dam*0.5); X`09if (py.flags.resist_cold > 0) then X`09 dam := trunc(dam*0.5); X`09take_hit(dam,kb_str); X`09print_stat := uor(%X'0080',print_stat); X`09if (inven_damage(`5B75,76`5D,5) > 0) then X`09 msg_print('Something shatters inside your pack!'); X end; X X X`09`7B Lightning bolt the sucker away...`09`09`09-RAK-`09`7D X procedure light_dam(dam : integer; kb_str : vtype); X begin X`09if (py.flags.lght_resist) then X`09 take_hit(trunc(dam*0.5),kb_str) X`09else X`09 take_hit(dam,kb_str); X`09print_stat := uor(%X'0080',print_stat); X end; X X X`09`7B Throw acid on the hapless victim`09`09`09-RAK-`09`7D X procedure acid_dam(dam : integer; kb_str : vtype); X var X`09`09flag`09`09: integer; X begin X`09flag := 0; X`09if (minus_ac(%X'00100000')) then X`09 flag := 1; X`09if (py.flags.acid_resist) then X`09 flag := flag + 2; X`09case flag of X`09 0 : take_hit(dam,kb_str); X`09 1 : take_hit(trunc(dam*0.75),kb_str); X`09 2 : take_hit(trunc(dam*0.5),kb_str); X`09 3 : take_hit(trunc(dam*0.25),kb_str); X`09end; X`09print_stat := uor(%X'00C0',print_stat); X`09if (inven_damage(`5B1,2,11,12,20,21,22,30,31,32,36`5D,3) > 0) then X`09 msg_print('There is an acrid smell coming from your pack!'); X end; X X X`09`7B Teleport the player to a new location`09`09`09-RAK-`09`7D X procedure teleport(dis : integer); X var X`09`09y,x`09: integer; X begin X`09repeat X`09 y := randint(cur_height); X`09 x := randint(cur_width); X`09 while (distance(y,x,char_row,char_col) > dis) do X`09 begin X`09 y := y + trunc((char_row-y)/2); X`09 x := x + trunc((char_col-x)/2); X`09 end; X until ((cave`5By,x`5D.fopen) and (cave`5By,x`5D.cptr < 2)); X`09move_rec(char_row,char_col,y,x); X`09for i1 := char_row-1 to char_row+1 do X`09 for i2 := char_col-1 to char_col+1 do X`09 with cave`5Bi1,i2`5D do X`09 begin X`09`09tl := false; X`09`09if (not(test_light(i1,i2))) then X`09`09 unlite_spot(i1,i2); X`09 end; X`09if (test_light(char_row,char_col)) then`20 X`09 lite_spot(char_row,char_col); X`09char_row := y; X`09char_col := x; X`09move_char(5); X`09creatures(false); X`09teleport_flag := false; X end; X X X`09`7B Player hit a trap...`09(Chuckle)`09`09`09-RAK-`09`7D X procedure hit_trap(var y,x : integer); X var X`09`09i1,i2,ty,tx`09`09: integer; X`09`09dam`09`09`09: integer; X begin X`09change_trap(y,x); X`09lite_spot(char_row,char_col); X`09find_flag := false; X`09with cave`5By,x`5D do X`09with py.misc do X`09 begin X`09 dam := damroll(t_list`5Btptr`5D.damage); X`09 case t_list`5Btptr`5D.subval of X`7B Open pit`7D 1`09: begin X`09`09 msg_print('You fell into a pit!'); X`09`09 if (py.flags.ffall) then X`09`09 msg_print('You gently float down.') X`09`09 else X`09`09 take_hit(dam,'an open pit.'); X`09`09 end; X`7B Arrow trap`7D 2`09: begin X`09`09 if (test_hit(125,0,0,pac+ptoac)) then X`09`09 begin X`09`09`09take_hit(dam,'an arrow trap.'); X`09`09`09msg_print('An arrow hits you.'); X`09`09 end X`09`09 else X`09`09 msg_print('An arrow barely misses you.'); X`09`09 end; X`7B Covered pit`7D3`09: begin X`09`09 msg_print('You fell into a covered pit.'); X`09`09 if (py.flags.ffall) then X`09`09 msg_print('You gently float down.') X`09`09 else X`09`09 take_hit(dam,'a covered pit.'); X`09`09 place_trap(y,x,2,1); X`09`09 end; X`7B Trap door`7D 4`09: begin X`09`09 msg_print('You fell through a trap door!'); X`09`09 msg_print(' '); X`09`09 moria_flag := true; X`09`09 dun_level := dun_level + 1; X`09`09 if (py.flags.ffall) then X`09`09 msg_print('You gently float down.') X`09`09 else X`09`09 take_hit(dam,'a trap door.'); X`09`09 end; X`7B Sleep gas`7D 5`09: if (py.flags.paralysis = 0) then X`09`09 begin X`09`09 msg_print('A strange white mist surrounds you!'); X`09`09 if (py.flags.free_act) then X`09`09`09msg_print('You are unaffected.') X`09`09 else X`09`09`09begin X`09`09`09 msg_print('You fall asleep.'); X`09`09`09 py.flags.paralysis := py.flags.paralysis +`20 X`09`09`09`09`09`09`09randint(10) + 4; X`09`09`09end X`09`09 end; X`7B Hid Obj`7D 6`09: begin X`09`09 fm := false; X`09`09 pusht(tptr); X`09`09 place_object(y,x); X`09`09 msg_print('Hmmm, there was something under this rock.'); X`09`09 end; X `7B STR Dart`7D 7`09: begin X`09`09 if (test_hit(125,0,0,pac+ptoac)) then X`09`09 begin X`09`09`09if (not py.flags.sustain_str) then X`09`09`09 begin X`09`09`09 py.stat.cstr := de_statp(py.stat.cstr); X`09`09`09 take_hit(dam,'a dart trap.'); X`09`09`09 print_stat := uor(%X'0001',print_stat); X`09`09`09 msg_print('A small dart weakens you!'); X`09`09`09 end X`09`09`09else X`09`09`09 msg_print('A small dart hits you.'); X`09`09 end X`09`09 else X`09`09 msg_print('A small dart barely misses you.'); X`09`09 end; X`7B Teleport`7D 8`09: begin X`09`09 teleport_flag := true; X`09`09 msg_print('You hit a teleport trap!'); X`09`09 end; X`7B Rockfall`7D 9`09: begin X`09`09 take_hit(dam,'falling rock.'); X`09`09 pusht(tptr); X`09`09 place_rubble(y,x); X`09`09 msg_print('You are hit by falling rock'); X`09`09 end; X`7B Corrode gas`7D10: begin X`09`09 corrode_gas('corrosion gas.'); X`09`09 msg_print('A strange red gas surrounds you.'); X`09`09 end; X`7B Summon mon`7D 11: begin X`09`09 fm := false;`09`7B Rune disappears...`09`7D X`09`09 pusht(tptr); X`09`09 tptr := 0; X`09`09 for i1 := 1 to (2+randint(3)) do X`09`09 begin X`09`09 ty := char_row; X`09`09 tx := char_col; X`09`09 summon_monster(ty,tx,false); X`09`09 end; X`09`09 end; X`7B Fire trap`7D 12: begin X`09`09 fire_dam(dam,'a fire trap.'); X`09`09 msg_print('You are enveloped in flames!'); X`09`09 end; X`7B Acid trap`7D 13: begin X`09`09 acid_dam(dam,'an acid trap.'); X`09`09 msg_print('You are splashed with acid!'); X`09`09 end; X`7B Poison gas`7D 14: begin X`09`09 poison_gas(dam,'a poison gas trap.'); X`09`09 msg_print('A pungent green gas surrounds you!'); X`09`09 end; X`7B Blind Gas `7D 15: begin +-+-+-+-+-+-+-+- END OF PART 39 +-+-+-+-+-+-+-+-