-+-+-+-+-+-+-+-+ START OF PART 38 -+-+-+-+-+-+-+-+ X`09floor_str`09`09: vtype; X`09tmp_char`09`09: char; X X X procedure find_light(y1,x1,y2,x2 : integer); X var X`09i1,i2,i3,i4`09: integer; X begin X for i1 := y1 to y2 do X`09 for i2 := x1 to x2 do X`09 if (cave`5Bi1,i2`5D.fval in `5B1,2`5D) then X`09 begin X`09 for i3 := i1-1 to i1+1 do X`09 for i4 := i2-1 to i2+1 do X`09`09 cave`5Bi3,i4`5D.pl := true; X`09`09cave`5Bi1,i2`5D.fval := 2; X`09 end; X end; X X begin X tmp1 := trunc(screen_height/2); X tmp2 := trunc(screen_width /2); X start_row := trunc(y/tmp1)*tmp1 + 1; X start_col := trunc(x/tmp2)*tmp2 + 1; X end_row := start_row + tmp1 - 1; X end_col := start_col + tmp2 - 1; X find_light(start_row,start_col,end_row,end_col); X for i1 := start_row to end_row do X`09begin X`09 floor_str := ''; X`09 ypos := i1; X`09 for i2 := start_col to end_col do X`09 with cave`5Bi1,i2`5D do X`09 begin X`09 if ((pl) or (fm)) then X`09`09 begin X`09`09 if (length(floor_str) = 0) then X`09`09 xpos := i2; X`09`09 loc_symbol(i1,i2,tmp_char); X`09 floor_str := floor_str + tmp_char X`09`09 end X`09 else X`09`09 if (length(floor_str) > 0) then X`09`09 begin X`09`09 print(floor_str,ypos,xpos); X`09`09 floor_str := '' X`09`09 end X`09 end; X`09 if (length(floor_str) > 0) then X`09 print(floor_str,ypos,xpos) X`09end; X end; X X X`09`7B Lights up given location`09`09`09`09-RAK-`09`7D X procedure lite_spot(y,x : integer); X var X`09`09spot_char`09: vtype; X`09`09temp`09`09: char; X begin X`09if (panel_contains(y,x)) then X`09 begin X`09 loc_symbol(y,x,temp); X`09 spot_char := temp; X`09 print(spot_char,y,x) X`09 end X end; X X X`09`7B Blanks out given location`09`09`09`09-RAK-`09`7D X procedure unlite_spot(y,x : integer); X begin X`09if (panel_contains(y,x)) then X`09 print(' ',y,x); X end; X X X`09`7B Package for moving the character's light about the screen`09`7D X`09`7B Three cases : Normal, Finding, and Blind`09`09-RAK-`09`7D X procedure move_light(y1,x1,y2,x2 : integer); X X`09`7B Maximum of a minimum`09`09`09`09-RAK-`09`7D X`09`7B Macro routine included in MORIALIB.MLB`09-RAK-`09`7D X function maxmin`09`09( X`09`09%immed`09x`09: integer; X`09`09%immed`09y`09: integer; X`09`09%immed`09z`09: integer X`09`09`09`09) : integer; X`09external; X X`09`7B Minimum of a maximum`09`09`09`09-RAK-`09`7D X`09`7B Macro routine included in MORIALIB.MLB`09-RAK-`09`7D X function minmax`09`09( X`09`09%immed`09x`09: integer; X`09`09%immed`09y`09: integer; X`09`09%immed`09z`09: integer X`09`09`09`09) : integer; X`09external; X X`09`7B Given two sets of points, draw the block`09`09`7D X procedure draw_block(y1,x1,y2,x2 : integer); X var X`09i1,i2,xpos`09`09`09`09: integer; X`09topp,bott,left,righ`09`09`09: integer; X`09new_topp,new_bott,new_left,new_righ`09: integer; X`09floor_str,save_str`09`09`09: vtype; X`09tmp_char`09`09`09`09: char; X`09flag`09`09`09`09`09: boolean; X begin X`09`7B From uppermost to bottom most lines player was on...`09`7D X`09`7B Points are guaranteed to be on the screen (I hope...)`09`7D X`09topp := maxmin(y1,y2,panel_row_min); X`09bott := minmax(y1,y2,panel_row_max); X`09left := maxmin(x1,x2,panel_col_min); X`09righ := minmax(x1,x2,panel_col_max); X`09new_topp := y2 - 1;`09`7B Margins for new things to appear`7D X`09new_bott := y2 + 1; X`09new_left := x2 - 1; X`09new_righ := x2 + 1; X`09for i1 := topp to bott do X`09 begin X`09 floor_str := '';`09`7B Null out print string`09`09`7D X`09 xpos := 0; X`09 save_str := ''; X`09 for i2 := left to righ do`09`7B Leftmost to rightmost do`7D X`09 begin X`09 with cave`5Bi1,i2`5D do X`09`09 begin X`09`09 if ((pl) or (fm)) then X`09`09 if (((i1=y1) and (i2=x1)) or ((i1=y2) and (i2=x2))) then X`09`09 flag := true X`09`09 else X`09`09 flag := false X`09`09 else X`09`09 begin X`09`09`09flag := true; X`09`09`09if (((i1 >= new_topp) and (i1 <= new_bott)) and X`09`09`09 ((i2 >= new_left) and (i2 <= new_righ))) then X`09`09`09 begin X`09`09`09 if (tl) then X`09`09 if (fval in pwall_set) then X`09`09 pl := true X`09`09 else if (tptr > 0) then X`09`09 if (t_list`5Btptr`5D.tval in light_set) then X`09`09`09 if (not(fm)) then X`09`09`09 fm := true; X`09`09`09 end X`09`09 end; X`09`09 if ((pl) or (tl) or (fm)) then X`09`09 loc_symbol(i1,i2,tmp_char) X`09`09 else X`09`09 tmp_char := ' '; X`09`09 if (py.flags.image > 0) then X`09`09 if (randint(12) = 1) then X`09`09`09tmp_char := chr(randint(95) + 31); X`09`09 if (flag) then X`09`09 begin X`09`09`09if (xpos = 0) then xpos := i2; X`09`09`09if (length(save_str) > 0) then X`09`09`09 begin X`09`09`09 floor_str := floor_str + save_str; X`09`09`09 save_str := ''; X`09`09`09 end; X`09`09 floor_str := floor_str + tmp_char; X`09`09 end X`09`09 else if (xpos > 0) then X`09`09 save_str := save_str + tmp_char; X`09`09 end; X`09 end; X`09 if (xpos > 0) then X`09 begin X`09`09i2 := i1;`09`7B Var for PRINT cannot be loop index`7D X`09`09print(floor_str,i2,xpos); X`09 end; X`09 end; X end; X X X`09`7B Normal movement`09`09`09`09`09`7D X procedure sub1_move_light(y1,x1,y2,x2 : integer); X var X`09i1,i2`09`09`09`09`09: integer; X begin X`09light_flag := true; X`09for i1 := y1-1 to y1+1 do`09`7B Turn off lamp light`09`7D X`09 for i2 := x1-1 to x1+1 do X`09 cave`5Bi1,i2`5D.tl := false; X`09for i1 := y2-1 to y2+1 do X`09 for i2 := x2-1 to x2+1 do X`09 cave`5Bi1,i2`5D.tl := true; X`09draw_block(y1,x1,y2,x2);`09`7B Redraw area`09`09`7D X end; X X`09`7B When FIND_FLAG, light only permanent features`09`09`7D X procedure sub2_move_light(y1,x1,y2,x2 : integer); X var X`09i1,i2,xpos`09`09`09: integer; X`09floor_str,save_str`09`09: vtype; X`09tmp_char`09`09`09: char; X`09flag`09`09`09`09: boolean; X begin X`09if (light_flag) then X`09 begin X`09 for i1 := y1-1 to y1+1 do X`09 for i2 := x1-1 to x1+1 do X`09 cave`5Bi1,i2`5D.tl := false; X`09 draw_block(y1,x1,y1,x1); X`09 light_flag := false; X`09 end; X`09for i1 := y2-1 to y2+1 do X`09 begin X`09 floor_str := ''; X`09 save_str := ''; X`09 xpos := 0; X`09 for i2 := x2-1 to x2+1 do X`09 with cave`5Bi1,i2`5D do X`09 begin X`09`09 flag := false; X`09`09 if (not((fm) or (pl))) then X`09`09 begin X`09`09 tmp_char := ' '; X`09`09 if (player_light) then X`09`09 if (fval in pwall_set) then X`09`09 begin X`09`09 pl := true;`09`7B Turn on perm light`09`7D X`09`09`09 loc_symbol(i1,i2,tmp_char); X`09`09`09 flag := true; X`09`09 end X`09`09 else X`09`09 if (tptr > 0) then X`09`09 if (t_list`5Btptr`5D.tval in light_set) then X`09`09`09 begin X`09`09`09 fm := true;`09`7B Turn on field marker`09`7D X`09`09`09 loc_symbol(i1,i2,tmp_char); X`09`09`09 flag := true; X`09`09`09 end; X`09`09 end X`09`09 else X`09`09 loc_symbol(i1,i2,tmp_char); X`09`09 if (flag) then X`09`09 begin X`09`09 if (xpos = 0) then xpos := i2; X`09`09 if (length(save_str) > 0) then X`09`09`09begin X`09`09`09 floor_str := floor_str + save_str; X`09`09`09 save_str := ''; X`09`09`09end; X`09`09 floor_str := floor_str + tmp_char; X`09`09 end X`09`09 else if (xpos > 0) then X`09`09 save_str := save_str + tmp_char; X`09 end; X`09 if (xpos > 0) then X`09 begin X`09`09i2 := i1; X`09 print(floor_str,i2,xpos); X`09 end; X`09 end; X end; X X`09`7B When blinded, move only the player symbol...`09`09`7D X procedure sub3_move_light(y1,yx1,y2,x2 : integer); X var X`09i1,i2`09`09`09: integer; X begin X`09if (light_flag) then X`09 begin X`09 for i1 := y1-1 to y1+1 do X`09 for i2 := x1-1 to x1+1 do X`09 cave`5Bi1,i2`5D.tl := false; X`09 light_flag := false; X`09 end; X`09print(' ',y1,x1); X`09print('@',y2,x2); X end; X X`09`7B With no light, movement becomes involved...`09`09`7D X procedure sub4_move_light(y1,x1,y2,x2 : integer); X var X`09i1,i2`09`09`09: integer; X begin X`09light_flag := true; X`09if (cave`5By1,x1`5D.tl) then X`09 begin X`09 for i1 := y1-1 to y1+1 do X`09 for i2 := x1-1 to x1+1 do X`09`09begin X`09 cave`5Bi1,i2`5D.tl := false; X`09`09 if (test_light(i1,i2)) then X`09`09 lite_spot(i1,i2) X`09`09 else X`09`09 unlite_spot(i1,i2); X`09`09end; X`09 end X`09else if (test_light(y1,x1)) then X`09 lite_spot(y1,x1) X`09else X`09 unlite_spot(y1,x1); X`09print('@',y2,x2); X end; X X`09`7B Begin move_light procedure`09`09`09`09`7D X begin X if (py.flags.blind > 0) then X`09sub3_move_light(y1,x1,y2,x2) X else if (find_flag) then X`09sub2_move_light(y1,x1,y2,x2) X else if (not(player_light)) then X`09sub4_move_light(y1,x1,y2,x2) X else X`09sub1_move_light(y1,x1,y2,x2); X end; X X X`09`7B Returns random co-ordinates`09`09`09`09-RAK-`09`7D X procedure new_spot(var y,x : integer); X begin X`09repeat X`09 y := randint(cur_height); X`09 x := randint(cur_width); X until (`09(cave`5By,x`5D.fopen)`09and`20 X`09`09(cave`5By,x`5D.cptr = 0)`09and X`09`09(cave`5By,x`5D.tptr = 0)); X end; X X X`09`7B Search Mode enhancement`09`09`09`09-RAK-`09`7D X procedure search_on; X begin X`09search_flag := true; X`09change_speed(+1); X`09py.flags.status := uor(py.flags.status,%X'00000100'); X`09prt_search; X`09with py.flags do X`09 food_digested := food_digested + 1; X end; X X procedure search_off; X begin X`09search_flag := false; X`09find_flag := false; X`09move_char(5); X`09change_speed(-1); X`09py.flags.status := uand(py.flags.status,%X'FFFFFEFF'); X`09prt_search; X`09with py.flags do X`09 food_digested := food_digested - 1; X end; X X X`09`7B Resting allows a player to safely restore his hp`09-RAK-`09`7D X procedure rest; X var X`09`09rest_num`09`09: integer; X`09`09rest_str`09`09: vtype; X begin X`09prt('Rest for how long? ',1,1); X`09get_string(rest_str,1,20,10); X`09rest_num := 0; X`09readv(rest_str,rest_num,error:=continue); X`09if (rest_num > 0) then X`09 begin X`09 if (search_flag) then X`09 search_off; X`09 py.flags.rest := rest_num; X`09 py.flags.status := uor(py.flags.status,%X'00000200'); X`09 prt_rest; X`09 with py.flags do X`09 food_digested := food_digested - 1; X`09 msg_print('Press any key to wake up...'); X`09 put_qio; X`09 end X`09else X`09 erase_line(msg_line,msg_line); X end; X X procedure rest_off; X begin X`09py.flags.rest := 0; X`09py.flags.status := uand(py.flags.status,%X'FFFFFDFF'); X`09erase_line(1,1); X`09prt_rest; X`09with py.flags do X`09 food_digested := food_digested + 1; X end; X X X`09`7B Attacker's level and pluses, defender's AC`09`09-RAK-`09`7D X function test_hit(bth,level,pth,ac : integer) : boolean; X var X`09`09i1`09`09`09: integer; X begin X`09if (search_flag) then X`09 search_off; X`09if (py.flags.rest > 0) then X`09 rest_off; X`09i1 := bth + level*bth_lev_adj + pth*bth_plus_adj; X`09if (randint(i1) > ac) then`09`09`7B Normal hit`09`09`7D X`09 test_hit := true X`09else if (randint(20) = 1) then`09`09`7B Always hit 1/20`09`7D X`09 test_hit := true X`09else`09`09`09`09`09`7B Missed`09`09`7D X`09 test_hit := false; X end; X X X`09`7B Decreases players hit points and sets death flag if neccessary`7D X`09`7B`09`09`09`09`09`09`09-RAK-`09`7D X procedure take_hit(damage : integer; hit_from : vtype); X begin X`09if (py.flags.invuln > 0) then damage := 0; X`09py.misc.chp := py.misc.chp - damage; X`09if (search_flag) then X`09 search_off; X`09if (py.flags.rest > 0) then X`09 rest_off; X`09flush; X`09if (py.misc.chp <= -1) then X`09 begin X`09 if (not(death)) then X`09 begin`09`09`7B Hee, hee... Ain't I mean?`09`7D X`09 death := true; X`09`09died_from := hit_from; X`09`09total_winner := false; X`09 end; X`09 moria_flag := true; X`09 end X`09else X`09 prt_chp; X end; X X X`09`7B Given speed, returns number of moves this turn.`09-RAK-`09`7D X`09`7B NOTE: Player must always move at least once per iteration,`09`7D X`09`7B a slowed player is handled by moving monsters faster`09`7D X function movement_rate(speed : integer) : integer; X begin X`09if (speed > 0) then X`09 if (py.flags.rest > 0) then X`09 movement_rate := 1 X`09 else X`09 movement_rate := speed X`09else X`09 begin X`09 if ((turn mod (abs(speed) + 2)) = 0) then X`09 movement_rate := 1 X`09 else X`09 movement_rate := 0; X`09 end; X end; X X X`09`7B Regenerate hit points`09`09`09`09`09-RAK-`09`7D X procedure regenhp(percent : real); X begin X`09with py.misc do X`09 chp := chp + mhp*percent + player$regen_hpbase; X end; X X X`09`7B Regenerate mana points`09`09`09`09-RAK-`09`7D X procedure regenmana(percent : real); X begin X`09with py.misc do X`09 cmana := cmana + mana*percent + player$regen_mnbase; X end; X X X`09`7B Change a trap from invisible to visible`09`09-RAK-`09`7D X`09`7B Note: Secret doors are handled here`09`09`09`09`7D X procedure change_trap(y,x : integer); X var X`09`09i3`09`09: integer; X begin X`09with cave`5By,x`5D do X`09 if (t_list`5Btptr`5D.tval in `5B101,109`5D) then X`09 begin X`09 i3 := tptr; X`09 place_trap(y,x,2,t_list`5Bi3`5D.subval); X`09 pusht(i3); X`09 lite_spot(y,x); X`09 end; X end; X X X`09`7B Searches for hidden things...`09`09`09`09-RAK-`09`7D X procedure search(y,x,chance : integer); X var X`09`09i1,i2`09`09: integer; X begin X`09with py.flags do X`09 if (confused+blind > 0) then X`09 chance := trunc(chance/10.0) X`09 else if (no_light) then X`09 chance := trunc(chance/5.0); X`09for i1 := (y - 1) to (y + 1) do X`09 for i2 := (x - 1) to (x + 1) do X`09 if (in_bounds(i1,i2)) then +-+-+-+-+-+-+-+- END OF PART 38 +-+-+-+-+-+-+-+-