open Position
open Global 

let translate pos dir speed = 
  let x = pos.x in
  let y = pos.y in
  match dir with
  | 0 -> { x = x; 
           y = min (y+speed) (max_y-1) }
  | 1 -> { x = min (x+speed) (max_x-1); 
           y = min (y+speed) (max_y-1) }
  | 2 -> { x = min (x+speed) (max_x-1);
           y = y }
  | 3 -> { x = min (x+speed) (max_x-1); 
           y = max (y-speed) 0 }
  | 4 -> { x = x;
           y = max (y-speed) 0 }
  | 5 -> { x = max (x-speed) 0; 
           y = max (y-speed) 0 }
  | 6 -> { x = max (x-speed) 0;
           y = y }
  | 7 -> { x = max (x-speed) 0;
           y = min (y+speed) (max_y-1) }
  | _ -> pos
        

let no_move pos = pos 


let random pos = 
  translate pos (Random.int 8) speed


let same_dir dir_init =
  let dir = ref dir_init in
  fun pos ->
    begin match Random.int 100 with
    | p when (p < 80) -> ()
    | p when (80 <= p & p < 85) -> dir := (!dir + 1) mod 8
    | p when (85 <= p & p < 90) -> dir := (!dir + 7) mod 8
    | p when (90 <= p & p < 92) -> dir := (!dir + 2) mod 8
    | p when (92 <= p & p < 94) -> dir := (!dir + 6) mod 8
    | p when (94 <= p & p < 96) -> dir := (!dir + 3) mod 8
    | p when (96 <= p & p < 98) -> dir := (!dir + 5) mod 8
    | p when (98 <= p & p < 100) -> dir := (!dir + 4) mod 8
    | _ -> ()
    end;
    translate pos !dir speed



let random_pos r pos =
  let x = pos.x + Random.int (2*r) - r in
  let y = pos.y + Random.int (2*r) - r in
  { x = if x < 0 then 0 else if x >= max_x then max_x - 1 else x;
    y = if y < 0 then 0 else if y >= max_y then max_y - 1 else y }

let random_waypoint r pos_init =
  let waypoint = ref pos_init in
  fun pos ->
    if (abs (pos.x - !waypoint.x) < speed) 
        && (abs (pos.y - !waypoint.y) < speed) 
    then waypoint := random_pos r pos;
    (* move in the direction of !waypoint *)
    if pos.x < !waypoint.x then
      if pos.y < !waypoint.y then
        translate pos 1 speed
      else
        if pos.y > !waypoint.y then
          translate pos 3 speed
        else 
          translate pos 2 speed
    else 
      if pos.x > !waypoint.x then
        if pos.y < !waypoint.y then
          translate pos 7 speed
        else
          if pos.y > !waypoint.y then
            translate pos 5 speed
          else
            translate pos 6 speed
      else
        if pos.y < !waypoint.y then
          translate pos 0 speed
        else
          if pos.y > !waypoint.y then
            translate pos 4 speed
          else
            pos