summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/elm/battlemap/src/Battlemap/Navigator.elm106
-rw-r--r--client/elm/battlemap/src/Battlemap/Navigator/Move.elm153
-rw-r--r--client/elm/battlemap/src/Update/DirectionRequest.elm4
-rw-r--r--client/elm/battlemap/src/Util/List.elm12
4 files changed, 168 insertions, 107 deletions
diff --git a/client/elm/battlemap/src/Battlemap/Navigator.elm b/client/elm/battlemap/src/Battlemap/Navigator.elm
index 41593c5..79f1f73 100644
--- a/client/elm/battlemap/src/Battlemap/Navigator.elm
+++ b/client/elm/battlemap/src/Battlemap/Navigator.elm
@@ -2,19 +2,16 @@ module Battlemap.Navigator exposing
(
Type,
new_navigator,
- reset_navigation,
- go
+ reset_navigation
)
import Set -- exposing (Set, member, empty, insert, remove)
-import List -- exposing (head, tail)
import Battlemap
import Battlemap.Direction
import Battlemap.Location
import Battlemap.Tile
-import Character
type alias Type =
{
@@ -39,104 +36,3 @@ reset_navigation t =
{t |
nav_level = Battlemap.Direction.None
}
-
-go : (
- Battlemap.Type ->
- Type ->
- Battlemap.Direction.Type ->
- (List Character.Type) ->
- (Battlemap.Type, Type)
- )
-go battlemap nav dir char_list =
- let
- next_location = (Battlemap.Location.neighbor nav.current_location dir)
- is_occupied = (List.any (\c -> (c.location == next_location)) char_list)
- in
- if
- (
- (not is_occupied)
- && (nav.remaining_points > 0)
- && (Battlemap.has_location battlemap next_location)
- && (nav.current_location /= next_location)
- &&
- (not
- (Set.member
- (Battlemap.Location.get_ref next_location)
- nav.visited_locations
- )
- )
- )
- then
- (
- (case
- (Battlemap.apply_to_tile
- battlemap
- nav.current_location
- (Battlemap.Tile.set_direction dir)
- )
- of
- Nothing -> battlemap
- (Just bmap0) ->
- (case
- (Battlemap.apply_to_tile
- bmap0
- next_location
- (Battlemap.Tile.set_direction dir)
- )
- of
- Nothing -> battlemap
- (Just bmap1) -> bmap1
- )
- ),
- {nav |
- current_location = next_location,
- visited_locations =
- (Set.insert
- (Battlemap.Location.get_ref nav.current_location)
- nav.visited_locations
- ),
- previous_directions = (dir :: nav.previous_directions),
- remaining_points = (nav.remaining_points - 1)
- }
- )
- else if (not is_occupied)
- then
- case
- (
- (List.head nav.previous_directions),
- (List.tail nav.previous_directions)
- )
- of
- (Nothing, _) -> (battlemap, nav)
- (_ , Nothing) -> (battlemap, nav)
- ((Just prev_dir), (Just prev_dir_list)) ->
- if (dir == (Battlemap.Direction.opposite_of prev_dir))
- then
- (
- (case
- (Battlemap.apply_to_tile
- battlemap
- nav.current_location
- (Battlemap.Tile.set_direction
- Battlemap.Direction.None
- )
- )
- of
- Nothing -> battlemap
- (Just bmap) -> bmap
- ),
- {nav |
- current_location = next_location,
- visited_locations =
- (Set.remove
- (Battlemap.Location.get_ref next_location)
- nav.visited_locations
- ),
- previous_directions = prev_dir_list,
- remaining_points = (nav.remaining_points + 1)
- }
- )
- else
- (battlemap, nav)
- else
- (battlemap, nav)
diff --git a/client/elm/battlemap/src/Battlemap/Navigator/Move.elm b/client/elm/battlemap/src/Battlemap/Navigator/Move.elm
new file mode 100644
index 0000000..924f715
--- /dev/null
+++ b/client/elm/battlemap/src/Battlemap/Navigator/Move.elm
@@ -0,0 +1,153 @@
+module Battlemap.Navigator.Move exposing (to)
+
+import Set
+import List
+
+import Battlemap
+import Battlemap.Direction
+import Battlemap.Location
+import Battlemap.Tile
+import Battlemap.Navigator
+
+import Character
+
+import Util.List
+
+can_move_to_new_tile : (
+ Battlemap.Navigator.Type ->
+ Battlemap.Type ->
+ Battlemap.Location.Type ->
+ Bool
+ )
+can_move_to_new_tile nav battlemap next_location =
+ (
+ (nav.remaining_points > 0)
+ && (Battlemap.has_location battlemap next_location)
+ && (nav.current_location /= next_location)
+ &&
+ (not
+ (Set.member
+ (Battlemap.Location.get_ref next_location)
+ nav.visited_locations
+ )
+ )
+ )
+
+battlemap_move_to : (
+ Battlemap.Type ->
+ Battlemap.Location.Type ->
+ Battlemap.Direction.Type ->
+ Battlemap.Location.Type ->
+ Battlemap.Type
+ )
+battlemap_move_to battlemap current_loc dir next_loc =
+ (Battlemap.apply_to_tile_unsafe
+ (Battlemap.apply_to_tile_unsafe
+ battlemap
+ current_loc
+ (Battlemap.Tile.set_direction dir)
+ )
+ next_loc
+ (Battlemap.Tile.set_direction dir)
+ )
+
+navigator_move_to : (
+ Battlemap.Navigator.Type ->
+ Battlemap.Direction.Type ->
+ Battlemap.Location.Type ->
+ Battlemap.Navigator.Type
+ )
+navigator_move_to nav dir next_loc =
+ {nav |
+ current_location = next_loc,
+ visited_locations =
+ (Set.insert
+ (Battlemap.Location.get_ref nav.current_location)
+ nav.visited_locations
+ ),
+ previous_directions = (dir :: nav.previous_directions),
+ remaining_points = (nav.remaining_points - 1)
+ }
+
+battlemap_backtrack : (
+ Battlemap.Type ->
+ Battlemap.Location.Type ->
+ Battlemap.Type
+ )
+battlemap_backtrack battlemap current_loc =
+ (Battlemap.apply_to_tile_unsafe
+ battlemap
+ current_loc
+ (Battlemap.Tile.set_direction
+ Battlemap.Direction.None
+ )
+ )
+
+navigator_backtrack : (
+ Battlemap.Navigator.Type ->
+ Battlemap.Location.Type ->
+ (List Battlemap.Direction.Type) ->
+ Battlemap.Navigator.Type
+ )
+navigator_backtrack nav next_loc prev_dir_tail =
+ {nav |
+ current_location = next_loc,
+ visited_locations =
+ (Set.remove
+ (Battlemap.Location.get_ref next_loc)
+ nav.visited_locations
+ ),
+ previous_directions = prev_dir_tail,
+ remaining_points = (nav.remaining_points + 1)
+ }
+
+to : (
+ Battlemap.Type ->
+ Battlemap.Navigator.Type ->
+ Battlemap.Direction.Type ->
+ (List Character.Type) ->
+ (Battlemap.Type, Battlemap.Navigator.Type)
+ )
+to battlemap nav dir char_list =
+ let
+ next_location = (Battlemap.Location.neighbor nav.current_location dir)
+ is_occupied = (List.any (\c -> (c.location == next_location)) char_list)
+ in
+ if (not is_occupied)
+ then
+ if (can_move_to_new_tile nav battlemap next_location)
+ then
+ (
+ (battlemap_move_to
+ battlemap
+ nav.current_location
+ dir
+ next_location
+ ),
+ (navigator_move_to
+ nav
+ dir
+ next_location
+ )
+ )
+ else
+ case (Util.List.pop nav.previous_directions) of
+ Nothing -> (battlemap, nav)
+ (Just (head, tail)) ->
+ if (head == (Battlemap.Direction.opposite_of dir))
+ then
+ (
+ (battlemap_backtrack
+ battlemap
+ nav.current_location
+ ),
+ (navigator_backtrack
+ nav
+ next_location
+ tail
+ )
+ )
+ else
+ (battlemap, nav)
+ else
+ (battlemap, nav)
diff --git a/client/elm/battlemap/src/Update/DirectionRequest.elm b/client/elm/battlemap/src/Update/DirectionRequest.elm
index 6f30866..2d8b42c 100644
--- a/client/elm/battlemap/src/Update/DirectionRequest.elm
+++ b/client/elm/battlemap/src/Update/DirectionRequest.elm
@@ -3,7 +3,7 @@ module Update.DirectionRequest exposing (apply_to)
import Dict
import Battlemap.Direction
-import Battlemap.Navigator
+import Battlemap.Navigator.Move
import Model
@@ -15,7 +15,7 @@ apply_to model dir =
((Just char_id), (Just nav)) ->
let
(new_bmap, new_nav) =
- (Battlemap.Navigator.go
+ (Battlemap.Navigator.Move.to
model.battlemap
nav
dir
diff --git a/client/elm/battlemap/src/Util/List.elm b/client/elm/battlemap/src/Util/List.elm
new file mode 100644
index 0000000..c4db397
--- /dev/null
+++ b/client/elm/battlemap/src/Util/List.elm
@@ -0,0 +1,12 @@
+module Util.List exposing (pop)
+
+import List
+
+pop : List a -> (Maybe (a, List a))
+pop l =
+ case
+ ((List.head l), (List.tail l))
+ of
+ (Nothing, _) -> Nothing
+ (_ , Nothing) -> Nothing
+ ((Just head), (Just tail)) -> (Just (head, tail))