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;
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