summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/battle/src/Struct/Tile.elm')
-rw-r--r-- | src/battle/src/Struct/Tile.elm | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/src/battle/src/Struct/Tile.elm b/src/battle/src/Struct/Tile.elm new file mode 100644 index 0000000..550169b --- /dev/null +++ b/src/battle/src/Struct/Tile.elm @@ -0,0 +1,203 @@ +module Struct.Tile exposing + ( + Ref, + Type, + Instance, + new, + new_instance, + error_tile_instance, + get_id, + get_name, + get_range_minimum, + get_range_maximum, + get_cost, + get_instance_cost, + get_location, + get_icon_id, + get_type_id, + get_variant_id, + solve_tile_instance, + decoder + ) + +-- Elm ------------------------------------------------------------------------- +import List + +import Json.Decode +import Json.Decode.Pipeline + +-- Map ------------------------------------------------------------------- +import Constants.UI +import Constants.Movement + +import Struct.Location + +-------------------------------------------------------------------------------- +-- TYPES ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- +type alias Ref = Int + +type alias PartiallyDecoded = + { + id : Int, + nam : String, + ct : Int, + rmi : Int, + rma : Int + } + +type alias Type = + { + id : Int, + name : String, + crossing_cost : Int, + range_minimum : Int, + range_maximum : Int + } + +type alias Instance = + { + location : Struct.Location.Type, + icon_id : Int, + crossing_cost : Int, + type_id : Int + } + +-------------------------------------------------------------------------------- +-- LOCAL ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- +noise_function : Int -> Int -> Int -> Int +noise_function a b c = + (round (radians (toFloat ((a + 1) * 2 + (b + 1) * 3 + c)))) + +finish_decoding : PartiallyDecoded -> Type +finish_decoding add_tile = + { + id = add_tile.id, + name = add_tile.nam, + crossing_cost = add_tile.ct, + range_minimum = add_tile.rmi, + range_maximum = add_tile.rma + } + +seek_tile_instance_type : Instance -> Type -> (Maybe Type) -> (Maybe Type) +seek_tile_instance_type instance candidate current_sol = + if (current_sol == Nothing) + then + let + icon_id = instance.icon_id + in + if + ( + (icon_id >= candidate.range_minimum) + && (icon_id <= candidate.range_maximum) + ) + then + (Just candidate) + else + current_sol + else + current_sol + +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- +new : Int -> String -> Int -> Int -> Int -> Type +new id name crossing_cost range_minimum range_maximum = + { + id = id, + name = name, + crossing_cost = crossing_cost, + range_minimum = range_minimum, + range_maximum = range_maximum + } + +new_instance : Int -> Int -> Int -> Int -> Int -> Instance +new_instance x y icon_id crossing_cost type_id = + { + location = {x = x, y = y}, + icon_id = icon_id, + crossing_cost = crossing_cost, + type_id = type_id + } + +error_tile_instance : Int -> Int -> Instance +error_tile_instance x y = + { + location = {x = x, y = y}, + icon_id = -1, + type_id = -1, + crossing_cost = Constants.Movement.cost_when_out_of_bounds + } + + +get_id : Type -> Int +get_id tile = tile.id + +get_cost : Type -> Int +get_cost tile = tile.crossing_cost + +get_instance_cost : Instance -> Int +get_instance_cost tile_inst = tile_inst.crossing_cost + +get_name : Type -> String +get_name tile = tile.name + +get_range_minimum : Type -> Int +get_range_minimum tile = tile.range_minimum + +get_range_maximum : Type -> Int +get_range_maximum tile = tile.range_maximum + +get_location : Instance -> Struct.Location.Type +get_location tile_inst = tile_inst.location + +get_icon_id : Instance -> String +get_icon_id tile_inst = (toString tile_inst.icon_id) + +get_type_id: Instance -> Int +get_type_id tile_inst = tile_inst.type_id + +get_variant_id : Instance -> Int +get_variant_id tile_inst = + ( + (noise_function + tile_inst.location.x + tile_inst.location.y + tile_inst.crossing_cost + ) + % Constants.UI.variants_per_tile + ) + +solve_tile_instance : (List Type) -> Instance -> Instance +solve_tile_instance tiles tile_instance = + let + maybe_type = + (List.foldr (seek_tile_instance_type tile_instance) Nothing tiles) + in + case maybe_type of + (Just tile) -> + {tile_instance | + type_id = tile.id, + crossing_cost = tile.crossing_cost + } + + Nothing -> + (error_tile_instance + tile_instance.location.x + tile_instance.location.y + ) + +decoder : (Json.Decode.Decoder Type) +decoder = + (Json.Decode.map + (finish_decoding) + (Json.Decode.Pipeline.decode + PartiallyDecoded + |> (Json.Decode.Pipeline.required "id" Json.Decode.int) + |> (Json.Decode.Pipeline.required "nam" Json.Decode.string) + |> (Json.Decode.Pipeline.required "ct" Json.Decode.int) + |> (Json.Decode.Pipeline.required "rmi" Json.Decode.int) + |> (Json.Decode.Pipeline.required "rma" Json.Decode.int) + ) + ) |