diff --git a/src/island_client.ml b/src/island_client.ml index 2fcc70f..8142813 100644 --- a/src/island_client.ml +++ b/src/island_client.ml @@ -51,16 +51,11 @@ let papy_up = C2d.image_src_of_el (get_el "papy_up") let water = C2d.image_src_of_el (get_el "water") -let map = - (* TODO receive map / state *) - (* dummy map; should ask for map to server *) - ref (Map.init ()) - let draw_map = let papy_x = float_of_int (width - tile_size) /. 2. in let papy_y = (float_of_int height /. 2.) -. (float_of_int tile_size *. 1.5) in - fun () -> - let player_x, player_y = !Map.player_pos in + fun map -> + let player_x, player_y = map.Map.player_pos in for x = 0 to tiles_per_w - 1 do let map_x = x + player_x - (tiles_per_w / 2) in let tile_x = float_of_int ((x * tile_size) + orig_x) in @@ -68,7 +63,7 @@ let draw_map = let map_y = y + player_y - (tiles_per_h / 2) in let tile_y = float_of_int ((y * tile_size) + orig_y) in let tile_img = - match Map.get_tile_kind ~x:map_x ~y:map_y !map with + match Map.get_tile_kind ~x:map_x ~y:map_y map with | Grass -> grass | Water -> water | Black -> water @@ -77,7 +72,7 @@ let draw_map = done done; let papy = - match !Map.player_dir with + match map.Map.player_dir with | Left -> papy_left | Right -> papy_right | Down -> papy_down @@ -85,23 +80,8 @@ let draw_map = in C2d.draw_image context papy ~x:papy_x ~y:papy_y -let move dir = - if !Map.player_dir = dir then begin - let x, y = !Map.player_pos in - let x, y = - match dir with - | Left -> (x - 1, y) - | Right -> (x + 1, y) - | Down -> (x, y + 1) - | Up -> (x, y - 1) - in - match Map.get_tile_kind ~x ~y !map with - | Black | Water -> () - | Grass -> Map.player_pos := (x, y) - end - else Map.player_dir := dir - -let kb_handler ev = +let kb_handler state ev = + let move = Map.move !state.State.map in match ev |> Ev.as_type |> Ev.Keyboard.code |> Jstr.to_string with | "KeyW" | "ArrowUp" -> move Up | "KeyA" | "ArrowLeft" -> move Left @@ -111,7 +91,7 @@ let kb_handler ev = | _s -> () let rec game_loop state _timestamp = - draw_map (); + draw_map !state.State.map; let new_state = state in G.request_animation_frame (game_loop new_state) @@ -122,10 +102,6 @@ let () = C2d.set_fill_style context (C2d.color (Jstr.v "#FF1188")); C2d.fill_rect context ~x:0. ~y:0. ~w:(float_of_int width) ~h:(float_of_int height); - (* bind keys *) - let _e : Ev.listener = - Ev.listen Ev.keydown kb_handler (Window.as_target G.window) - in (* get state from server*) let initial_state_fut = Ev.next Message.Ev.message Ws_client.ws_target in @@ -133,6 +109,10 @@ let () = Fut.await initial_state_fut (fun msg -> let initial_state = Ws_client.to_server_msg msg in let state_ref = ref initial_state in + (* bind keys *) + let _e : Ev.listener = + Ev.listen Ev.keydown (kb_handler state_ref) (Window.as_target G.window) + in (* attach message listener to update state *) Ws_client.on_update_state_message (fun received -> state_ref := received; diff --git a/src/map.ml b/src/map.ml index ffcc2b6..36160e9 100644 --- a/src/map.ml +++ b/src/map.ml @@ -9,19 +9,39 @@ type background = | Water | Black -type t = background array array - -let width = 1000 - -let height = 1000 - -let player_pos = ref (20, 3) - -let player_dir = ref Down +type t = + { tiles : background array array + ; mutable player_pos : int * int + ; mutable player_dir : dir + ; width : int + ; height : int + } let init () = - Array.init width (fun _x -> - Array.init height (fun _y -> - if Random.int 1000 <= 42 then Water else Grass ) ) + let width = 1000 in + let height = 1000 in + let tiles = + Array.init width (fun _x -> + Array.init height (fun _y -> + if Random.int 1000 <= 42 then Water else Grass ) ) + in + { tiles; player_pos = (20, 3); player_dir = Down; width; height } -let get_tile_kind ~x ~y map = try map.(x).(y) with Invalid_argument _ -> Black +let get_tile_kind ~x ~y map = + try map.tiles.(x).(y) with Invalid_argument _ -> Black + +let move map dir = + if map.player_dir = dir then begin + let x, y = map.player_pos in + let x, y = + match dir with + | Left -> (x - 1, y) + | Right -> (x + 1, y) + | Down -> (x, y + 1) + | Up -> (x, y - 1) + in + match get_tile_kind ~x ~y map with + | Black | Water -> () + | Grass -> map.player_pos <- (x, y) + end + else map.player_dir <- dir diff --git a/src/ws.ml b/src/ws.ml index b551e89..d4a377c 100644 --- a/src/ws.ml +++ b/src/ws.ml @@ -6,7 +6,7 @@ let handle_client request client = | None -> Dream.log "User does not exists" |> Lwt.return | Some user_id -> (* TODO catch marshal failure *) - + Dream.log " SEND USER ISLAND"; (* send user island state *) let state = match User.get_state user_id with @@ -14,6 +14,7 @@ let handle_client request client = | Ok state -> state in let* () = Dream.send ~text_or_binary:`Text client (Network.marshal state) in + Dream.log " SENDED USER ISLAND"; let rec loop () = match%lwt Dream.receive client with