summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared/battle-map/BattleMap/Struct/Map.elm')
-rw-r--r--src/shared/battle-map/BattleMap/Struct/Map.elm206
1 files changed, 206 insertions, 0 deletions
diff --git a/src/shared/battle-map/BattleMap/Struct/Map.elm b/src/shared/battle-map/BattleMap/Struct/Map.elm
new file mode 100644
index 0000000..aa166d4
--- /dev/null
+++ b/src/shared/battle-map/BattleMap/Struct/Map.elm
@@ -0,0 +1,206 @@
+module BattleMap.Struct.Map exposing
+ (
+ Type,
+ decoder,
+ empty,
+ get_height,
+ get_markers,
+ get_movement_cost_function,
+ get_omnimods_at,
+ get_tiles,
+ get_width,
+ new,
+ set_tile_to,
+ solve_tiles,
+ try_getting_tile_at
+ )
+
+-- Elm -------------------------------------------------------------------------
+import Array
+
+import Dict
+
+import Json.Decode
+
+-- Battle ----------------------------------------------------------------------
+import Battle.Struct.Omnimods
+
+-- Battle Map ------------------------------------------------------------------
+import BattleMap.Struct.Location
+import BattleMap.Struct.MapMarker
+import BattleMap.Struct.Tile
+import BattleMap.Struct.TileInstance
+
+--------------------------------------------------------------------------------
+-- TYPES -----------------------------------------------------------------------
+--------------------------------------------------------------------------------
+type alias Type =
+ {
+ width : Int,
+ height : Int,
+ content : (Array.Array BattleMap.Struct.TileInstance.Type),
+ markers : (Dict.Dict String BattleMap.Struct.MapMarker.Type)
+ }
+
+--------------------------------------------------------------------------------
+-- LOCAL -----------------------------------------------------------------------
+--------------------------------------------------------------------------------
+location_to_index : BattleMap.Struct.Location.Type -> Type -> Int
+location_to_index loc map =
+ ((loc.y * map.width) + loc.x)
+
+has_location : BattleMap.Struct.Location.Type -> Type -> Bool
+has_location loc map =
+ (
+ (loc.x >= 0)
+ && (loc.y >= 0)
+ && (loc.x < map.width)
+ && (loc.y < map.height)
+ )
+
+--------------------------------------------------------------------------------
+-- EXPORTED --------------------------------------------------------------------
+--------------------------------------------------------------------------------
+get_width : Type -> Int
+get_width map = map.width
+
+get_height : Type -> Int
+get_height map = map.height
+
+get_tiles : Type -> (Array.Array BattleMap.Struct.TileInstance.Type)
+get_tiles map = map.content
+
+get_markers : Type -> (Dict.Dict String BattleMap.Struct.MapMarker.Type)
+get_markers map = map.markers
+
+set_tile_to : BattleMap.Struct.Location.Type -> BattleMap.Struct.TileInstance.Type -> Type -> Type
+set_tile_to loc tile_inst map =
+ {map |
+ content = (Array.set (location_to_index loc map) tile_inst map.content)
+ }
+
+empty : Type
+empty =
+ {
+ width = 0,
+ height = 0,
+ content = (Array.empty),
+ markers = (Dict.empty)
+ }
+
+new : Int -> Int -> (List BattleMap.Struct.TileInstance.Type) -> Type
+new width height tiles =
+ {
+ width = width,
+ height = height,
+ content = (Array.fromList tiles),
+ markers = (Dict.empty)
+ }
+
+try_getting_tile_at : (
+ BattleMap.Struct.Location.Type ->
+ Type ->
+ (Maybe BattleMap.Struct.TileInstance.Type)
+ )
+try_getting_tile_at loc map =
+ if (has_location loc map)
+ then (Array.get (location_to_index loc map) map.content)
+ else Nothing
+
+solve_tiles : (
+ (Dict.Dict BattleMap.Struct.Tile.Ref BattleMap.Struct.Tile.Type) ->
+ Type ->
+ Type
+ )
+solve_tiles tiles map =
+ {map |
+ content =
+ (Array.map
+ (BattleMap.Struct.TileInstance.solve tiles) map.content
+ )
+ }
+
+get_omnimods_at : (
+ BattleMap.Struct.Location.Type ->
+ (Dict.Dict BattleMap.Struct.Tile.Ref BattleMap.Struct.Tile.Type) ->
+ Type ->
+ Battle.Struct.Omnimods.Type
+ )
+get_omnimods_at loc tiles_solver map =
+ case (try_getting_tile_at loc map) of
+ Nothing -> (Battle.Struct.Omnimods.none)
+ (Just tile_inst) ->
+ case
+ (Dict.get
+ (BattleMap.Struct.TileInstance.get_class_id tile_inst)
+ tiles_solver
+ )
+ of
+ Nothing -> (Battle.Struct.Omnimods.none)
+ (Just tile) -> (BattleMap.Struct.Tile.get_omnimods tile)
+
+decoder : (Json.Decode.Decoder Type)
+decoder =
+ (Json.Decode.andThen
+ (\width ->
+ (Json.Decode.map4
+ Type
+ (Json.Decode.field "w" Json.Decode.int)
+ (Json.Decode.field "h" Json.Decode.int)
+ (Json.Decode.field
+ "t"
+ (Json.Decode.map
+ (Array.indexedMap
+ (BattleMap.Struct.TileInstance.set_location_from_index
+ width
+ )
+ )
+ (Json.Decode.array (BattleMap.Struct.TileInstance.decoder))
+ )
+ )
+ (Json.Decode.field
+ "m"
+ (Json.Decode.map
+ (Dict.fromList)
+ (Json.Decode.keyValuePairs
+ (BattleMap.Struct.MapMarker.decoder)
+ )
+ )
+ )
+ )
+ )
+ (Json.Decode.field "w" Json.Decode.int)
+ )
+
+get_movement_cost_function : (
+ Type ->
+ BattleMap.Struct.Location.Type ->
+ (List BattleMap.Struct.Character.Type) ->
+ BattleMap.Struct.Location.Type ->
+ Int
+ )
+get_movement_cost_function bmap start_loc char_list loc =
+ if (has_location loc bmap)
+ then
+ case (Array.get (location_to_index loc bmap) bmap.content) of
+ (Just tile) ->
+ if
+ (List.any
+ (
+ \c ->
+ (
+ ((BattleMap.Struct.Character.get_location c) == loc)
+ && (loc /= start_loc)
+ && (BattleMap.Struct.Character.is_alive c)
+ )
+ )
+ char_list
+ )
+ then
+ Constants.Movement.cost_when_occupied_tile
+ else
+ (BattleMap.Struct.TileInstance.get_cost tile)
+
+ Nothing -> Constants.Movement.cost_when_out_of_bounds
+ else
+ Constants.Movement.cost_when_out_of_bounds