summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/shared')
-rw-r--r-- | src/shared/battle-characters/BattleCharacters/Struct/Character.elm | 196 | ||||
-rw-r--r-- | src/shared/battle-characters/BattleCharacters/Struct/Equipment.elm | 20 |
2 files changed, 207 insertions, 9 deletions
diff --git a/src/shared/battle-characters/BattleCharacters/Struct/Character.elm b/src/shared/battle-characters/BattleCharacters/Struct/Character.elm new file mode 100644 index 0000000..adf7ca7 --- /dev/null +++ b/src/shared/battle-characters/BattleCharacters/Struct/Character.elm @@ -0,0 +1,196 @@ +module BattleCharacters.Struct.Character exposing + ( + Type, + Unresolved, + get_name, + set_name, + get_equipment, + set_equipment, + get_omnimods, + set_extra_omnimods, + get_attributes, + get_statistics, + get_active_weapon, + get_inactive_weapon, + switch_weapons, + decoder, + encode, + resolve + ) + +-- Elm ------------------------------------------------------------------------- + +-- Battle ---------------------------------------------------------------------- +import Battle.Struct.Omnimods +import Battle.Struct.Attributes +import Battle.Struct.Statistics + +-- Battle Characters ----------------------------------------------------------- +import BattleCharacters.Struct.Armor +import BattleCharacters.Struct.Equipment +import BattleCharacters.Struct.Weapon +import BattleCharacters.Struct.GlyphBoard + +-------------------------------------------------------------------------------- +-- TYPES ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- +type alias Type = + { + name : String, + equipment : BattleCharacters.Struct.Equipment, + attributes : Battle.Struct.Attributes.Type, + statistics : Battle.Struct.Statistics.Type, + is_using_secondary : Bool, + omnimods : Battle.Struct.Omnimods.Type, + extra_omnimods : Battle.Struct.Omnimods.Type, + } + +type alias Unresolved = + { + name : String, + equipment : BattleCharacters.Struct.Unresolved, + is_using_secondary : Bool + } + +-------------------------------------------------------------------------------- +-- LOCAL ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- +refresh_omnimods : Type -> Type +refresh_omnimods char = + let + equipment = char.equipment + omnimods = + (Battle.Struct.Omnimods.merge + (Battle.Struct.Omnimods.merge + (Battle.Struct.Omnimods.merge + char.extra_omnimods + (BattleCharacters.Struct.Weapon.get_omnimods + (get_active_weapon char) + ) + ) + (BattleCharacters.Struct.Armor.get_omnimods + (BattleCharacters.Struct.Equipment.get_armor equipment) + ) + ) + (BattleCharacters.Struct.GlyphBoard.get_omnimods_with_glyphs + (BattleCharacters.Struct.Equipment.get_glyphs equipment) + (BattleCharacters.Struct.Equipment.get_glyph_board equipment) + ) + ) + attributes = + (Battle.Struct.Omnimods.apply_to_attributes + omnimods + (Battle.Struct.Attributes.default) + ) + statistics = + (Battle.Struct.Omnimods.apply_to_statistics + omnimods + (Battle.Struct.Statistics.new_raw attributes) + ) + in + {char | + attributes = attributes, + statistics = statistics, + omnimods = omnimods + } + + +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- +get_active_weapon : Type -> BattleCharacters.Struct.Weapon.Type +get_active_weapon char + if (char.is_using_secondary) + then (BattleCharacters.Struct.Equipment.get_secondary_weapon char.equipment) + else (BattleCharacters.Struct.Equipment.get_primary_weapon char.equipment) + +get_inactive_weapon : Type -> BattleCharacters.Struct.Weapon.Type +get_inactive_weapon char = + if (char.is_using_secondary) + then (BattleCharacters.Struct.Equipment.get_primary_weapon char.equipment) + then (BattleCharacters.Struct.Equipment.get_secondary_weapon char.equipment) + +get_name : Type -> String +get_name c = c.name + +set_name : String -> Type -> Type +set_name name char = {char | name = name} + +get_equipment : Type -> BattleCharacters.Struct.Equipment.Type +get_equipment c = c.equipment + +set_equipment : BattleCharacters.Struct.Equipment.Type -> Type -> Type +set_equipment equipment char = (refresh_omnimods {char | equipment = equipment}) + +get_omnimods : Type -> Battle.Struct.Omnimods.Type +get_omnimods c = c.current_omnimods + +set_extra_omnimods : Battle.Struct.Omnimods.Type -> Type -> Type +set_extra_omnimods om c = (refresh_omnimods {char | extra_omnimods = om}) + +get_attributes : Type -> Battle.Struct.Attributes.Type +get_attributes char = char.attributes + +get_statistics : Type -> Battle.Struct.Statistics.Type +get_statistics char = char.statistics + +switch_weapons : Type -> Type +switch_weapons char = + (refresh_omnimods + {char | is_using_secondary = (not char.is_using_secondary)} + ) + +decoder : (Json.Decode.Decoder Unresolved) +decoder : + (Json.Decode.succeed + Unresolved + |> (Json.Decode.Pipeline.required "nam" Json.Decode.string) + |> + (Json.Decode.Pipeline.required + "eq" + BattleCharacters.Struct.Equipment.decoder + ) + |> (Json.Decode.Pipeline.required "sec" Json.Decode.bool) + ) + +to_unresolved : Type -> Unresolved +to_unresolved char = + { + name = char.name, + equipment = + (BattleCharacters.Struct.Equipment.to_unresolved char.equipment), + is_using_secondary = char.is_using_secondary + } + +encode : Unresolved -> Json.Encode.Value +encode ref = + (Json.Encode.object + [ + ("nam", (Json.Encode.string ref.name)), + ("eq", (BattleCharacters.Struct.Equipment.encode ref.equipment)), + ("sec", (Json.Encode.bool ref.is_using_secondary)) + ] + ) + +resolve : ( + ( + BattleCharacters.Struct.Equipment.Unresolved -> + BattleCharacters.Struct.Equipment.Type + ) -> + Battle.Struct.Omnimods.Type -> + Unresolved -> + Type + ) +resolve resolve_equipment extra_omnimods ref = + let default_attributes = (Battle.Struct.Attributes.default) in + (refresh_omnimods + { + name = ref.name, + equipment = (resolve_equipment ref.equipment), + attributes = default_attributes, + statistics = (Battle.Struct.Statistics.new_raw default_attributes), + is_using_secondary = ref.is_using_secondary, + omnimods = (Battle.Struct.Omnimods.none), + extra_omnimods = extra_omnimods + } + ) diff --git a/src/shared/battle-characters/BattleCharacters/Struct/Equipment.elm b/src/shared/battle-characters/BattleCharacters/Struct/Equipment.elm index 8782397..2a3df55 100644 --- a/src/shared/battle-characters/BattleCharacters/Struct/Equipment.elm +++ b/src/shared/battle-characters/BattleCharacters/Struct/Equipment.elm @@ -1,5 +1,7 @@ module BattleCharacters.Struct.Equipment exposing ( + Type, + Unresolved, get_primary_weapon, get_secondary_weapon, get_armor, @@ -49,7 +51,7 @@ type alias Type = glyphs : (Array.Array BattleCharacters.Struct.Glyph.Type) } -type alias Ref = +type alias Unresolved = { primary : BattleCharacters.Struct.Weapon.Ref, secondary : BattleCharacters.Struct.Weapon.Ref, @@ -114,10 +116,10 @@ set_glyph : Int -> BattleCharacters.Struct.Glyph.Type -> Type -> Type set_glyph index glyph equipment = { equipment | glyphs = (Array.set index glyph equipment.glyphs) } -ref_decoder : (Json.Decode.Decoder Type) -ref_decoder = +decoder : (Json.Decode.Decoder Unresolved) +decoder = (Json.Decode.succeed - Ref + Unresolved |> (Json.Decode.Pipeline.required "pr" Json.Decode.string) |> (Json.Decode.Pipeline.required "sc" Json.Decode.string) |> (Json.Decode.Pipeline.required "ar" Json.Decode.string) @@ -130,8 +132,8 @@ ref_decoder = ) ) -ref_encoder : Ref -> Json.Encode.Value -ref_encoder ref = +encode : Unresolved -> Json.Encode.Value +encode ref = (Json.Encode.object [ ("pr", (Json.Encode.string ref.primary)), @@ -164,7 +166,7 @@ resolve : ( BattleCharacters.Struct.Glyph.Ref -> BattleCharacters.Struct.Glyph.Type ) -> - Ref -> + Unresolved -> Type ) resolve resolve_wp resolve_ar resolve_pt resolve_gb resolve_gl ref = @@ -177,8 +179,8 @@ resolve resolve_wp resolve_ar resolve_pt resolve_gb resolve_gl ref = glyphs = (Array.map (resolve_gl) ref.glyphs) } -to_ref : Type -> Ref -to_ref equipment = +to_unresolved : Type -> Unresolved +to_unresolved equipment = { primary = (BattleCharacters.Struct.Weapon.get_id equipment.primary), secondary = (BattleCharacters.Struct.Weapon.get_id equipment.secondary), |