From 1114c662e477f048ec22ee73bb01121aba954ba7 Mon Sep 17 00:00:00 2001 From: nsensfel Date: Thu, 21 Jun 2018 17:48:04 +0200 Subject: Starting to add attack animations... --- src/battlemap/src/ElmModule/View.elm | 4 +- src/battlemap/src/Struct/Model.elm | 1 + src/battlemap/src/Struct/TurnResult.elm | 4 + src/battlemap/src/Update/HandleAnimationEnded.elm | 21 +++ src/battlemap/src/View/Battlemap/Character.elm | 2 - src/battlemap/src/View/Help.elm | 92 ------------ src/battlemap/src/View/MessageBoard.elm | 31 ++++ src/battlemap/src/View/MessageBoard/Animator.elm | 58 ++++++++ .../src/View/MessageBoard/Animator/Attack.elm | 158 +++++++++++++++++++++ src/battlemap/src/View/MessageBoard/Error.elm | 33 +++++ src/battlemap/src/View/MessageBoard/Help.elm | 72 ++++++++++ src/battlemap/www/style.css | 4 + 12 files changed, 384 insertions(+), 96 deletions(-) delete mode 100644 src/battlemap/src/View/Help.elm create mode 100644 src/battlemap/src/View/MessageBoard.elm create mode 100644 src/battlemap/src/View/MessageBoard/Animator.elm create mode 100644 src/battlemap/src/View/MessageBoard/Animator/Attack.elm create mode 100644 src/battlemap/src/View/MessageBoard/Error.elm create mode 100644 src/battlemap/src/View/MessageBoard/Help.elm diff --git a/src/battlemap/src/ElmModule/View.elm b/src/battlemap/src/ElmModule/View.elm index 90177be..5b437b0 100644 --- a/src/battlemap/src/ElmModule/View.elm +++ b/src/battlemap/src/ElmModule/View.elm @@ -13,7 +13,7 @@ import Struct.Model import View.Battlemap import View.Controlled -import View.Help +import View.MessageBoard import View.MainMenu import View.SubMenu @@ -45,6 +45,6 @@ view model = [(View.Battlemap.get_html model)] ), (View.SubMenu.get_html model), - (View.Help.get_html model) + (View.MessageBoard.get_html model) ] ) diff --git a/src/battlemap/src/Struct/Model.elm b/src/battlemap/src/Struct/Model.elm index a79e671..9a3b054 100644 --- a/src/battlemap/src/Struct/Model.elm +++ b/src/battlemap/src/Struct/Model.elm @@ -157,6 +157,7 @@ initialize_animator model = (List.reverse timeline_list) True ), + ui = (Struct.UI.default), characters = (List.foldr (Struct.TurnResult.apply_inverse_to_characters) diff --git a/src/battlemap/src/Struct/TurnResult.elm b/src/battlemap/src/Struct/TurnResult.elm index 8a40c1c..9ee8c79 100644 --- a/src/battlemap/src/Struct/TurnResult.elm +++ b/src/battlemap/src/Struct/TurnResult.elm @@ -7,6 +7,7 @@ module Struct.TurnResult exposing get_next_movement_dir, get_actor_index, get_attack_defender_index, + maybe_get_attack_next_step, apply_to_characters, apply_inverse_to_characters, apply_step_to_characters, @@ -369,6 +370,9 @@ get_next_movement_dir movement = get_attack_defender_index : Attack -> Int get_attack_defender_index attack = attack.defender_index +maybe_get_attack_next_step : Attack -> (Maybe Struct.Attack.Type) +maybe_get_attack_next_step attack = (List.head attack.sequence) + get_actor_index : Type -> Int get_actor_index turn_result = case turn_result of diff --git a/src/battlemap/src/Update/HandleAnimationEnded.elm b/src/battlemap/src/Update/HandleAnimationEnded.elm index 59af1b7..741e9bd 100644 --- a/src/battlemap/src/Update/HandleAnimationEnded.elm +++ b/src/battlemap/src/Update/HandleAnimationEnded.elm @@ -15,6 +15,7 @@ import Action.Scroll import Struct.Character import Struct.Event import Struct.Model +import Struct.TurnResult import Struct.TurnResultAnimator import Struct.UI @@ -87,6 +88,26 @@ prepare_next_animation model animator = (Struct.TurnResultAnimator.Focus char_index) -> (handle_char_focus model animator char_index) + (Struct.TurnResultAnimator.AttackSetup _) -> + ( + model, + (Delay.after 1.0 Time.second Struct.Event.AnimationEnded) + ) + + (Struct.TurnResultAnimator.TurnResult turn_result) -> + case turn_result of + (Struct.TurnResult.Attacked _) -> + ( + model, + (Delay.after 3.0 Time.second Struct.Event.AnimationEnded) + ) + + _ -> + ( + model, + (Delay.after 0.1 Time.second Struct.Event.AnimationEnded) + ) + _ -> ( model, diff --git a/src/battlemap/src/View/Battlemap/Character.elm b/src/battlemap/src/View/Battlemap/Character.elm index a9004ea..4ff6c73 100644 --- a/src/battlemap/src/View/Battlemap/Character.elm +++ b/src/battlemap/src/View/Battlemap/Character.elm @@ -4,7 +4,6 @@ module View.Battlemap.Character exposing (get_html) import Html import Html.Attributes import Html.Events -import Html.Lazy -- Battlemap ------------------------------------------------------------------ import Constants.UI @@ -13,7 +12,6 @@ import Util.Html import Struct.Character import Struct.CharacterTurn -import Struct.Direction import Struct.Event import Struct.Model import Struct.TurnResult diff --git a/src/battlemap/src/View/Help.elm b/src/battlemap/src/View/Help.elm deleted file mode 100644 index 7f031e9..0000000 --- a/src/battlemap/src/View/Help.elm +++ /dev/null @@ -1,92 +0,0 @@ -module View.Help exposing (get_html) - --- Elm ------------------------------------------------------------------------- -import Html -import Html.Attributes - --- Struct.Battlemap ------------------------------------------------------------------- -import Struct.CharacterTurn -import Struct.Error -import Struct.Event -import Struct.Model - --------------------------------------------------------------------------------- --- LOCAL ----------------------------------------------------------------------- --------------------------------------------------------------------------------- -get_error_message : ( - Struct.Model.Type -> - Struct.Error.Type -> - (List (Html.Html Struct.Event.Type)) - ) -get_error_message model error = - [(Html.text (Struct.Error.to_string error))] - -get_help_message : Struct.Model.Type -> (List (Html.Html Struct.Event.Type)) -get_help_message model = - case (Struct.CharacterTurn.get_state model.char_turn) of - Struct.CharacterTurn.SelectedCharacter -> - [ - (Html.text - ( - "Click on a target tile to select a path or use the manual" - ++ " controls to make your own. Click on the destination tile" - ++ " again to confirm." - ) - ) - ] - - Struct.CharacterTurn.MovedCharacter -> - [ - (Html.text - ( - "You can now choose a target in range. Dashed tiles indicate" - ++ " where your character will not be able to defend against" - ++ " counter attacks." - ) - ) - ] - - Struct.CharacterTurn.ChoseTarget -> - [ - (Html.text - ( - "If you are satisfied with your choices, end the turn to" - ++ " confirm them." - ) - ) - ] - - _ -> - [ - (Html.text - ( - "Click once on a character to focus them. This will show you" - ++ " their stats, equipment, and other infos. If they are in" - ++ " your team and active (the pulsating characters)," - ++ " clicking on them again will let you take control." - ) - ) - ] - --------------------------------------------------------------------------------- --- EXPORTED -------------------------------------------------------------------- --------------------------------------------------------------------------------- -get_html : Struct.Model.Type -> (Html.Html Struct.Event.Type) -get_html model = - case (model.error) of - (Just error) -> - (Html.div - [ - (Html.Attributes.class "battlemap-help"), - (Html.Attributes.class "battlemap-error") - ] - (get_error_message model error) - ) - - Nothing -> - (Html.div - [ - (Html.Attributes.class "battlemap-help") - ] - (get_help_message model) - ) diff --git a/src/battlemap/src/View/MessageBoard.elm b/src/battlemap/src/View/MessageBoard.elm new file mode 100644 index 0000000..308a534 --- /dev/null +++ b/src/battlemap/src/View/MessageBoard.elm @@ -0,0 +1,31 @@ +module View.MessageBoard exposing (get_html) + +-- Elm ------------------------------------------------------------------------- +import Html +import Html.Attributes + +-- Struct.Battlemap ------------------------------------------------------------------- +import Struct.Event +import Struct.Model + +import View.MessageBoard.Animator +import View.MessageBoard.Error +import View.MessageBoard.Help + +-------------------------------------------------------------------------------- +-- LOCAL ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- +get_html : Struct.Model.Type -> (Html.Html Struct.Event.Type) +get_html model = + case (model.error) of + (Just error) -> (View.MessageBoard.Error.get_html model error) + Nothing -> + case model.animator of + (Just animator) -> + (View.MessageBoard.Animator.get_html model animator) + + Nothing -> (View.MessageBoard.Help.get_html model) diff --git a/src/battlemap/src/View/MessageBoard/Animator.elm b/src/battlemap/src/View/MessageBoard/Animator.elm new file mode 100644 index 0000000..7899d4f --- /dev/null +++ b/src/battlemap/src/View/MessageBoard/Animator.elm @@ -0,0 +1,58 @@ +module View.MessageBoard.Animator exposing (get_html) + +-- Elm ------------------------------------------------------------------------- +import Html +import Html.Attributes + +-- Battlemap ------------------------------------------------------------------- +import Struct.Event +import Struct.Model +import Struct.TurnResult +import Struct.TurnResultAnimator + +import Util.Html + +import View.MessageBoard.Animator.Attack + +-------------------------------------------------------------------------------- +-- LOCAL ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- +get_turn_result_html : ( + Struct.Model.Type -> + Struct.TurnResult.Type -> + (Html.Html Struct.Event.Type) + ) +get_turn_result_html model turn_result = + case turn_result of + (Struct.TurnResult.Attacked attack) -> + (View.MessageBoard.Animator.Attack.get_html + model + (Struct.TurnResult.get_actor_index turn_result) + (Struct.TurnResult.get_attack_defender_index attack) + (Struct.TurnResult.maybe_get_attack_next_step attack) + ) + + _ -> (Util.Html.nothing) + +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- +get_html : ( + Struct.Model.Type -> + Struct.TurnResultAnimator.Type -> + (Html.Html Struct.Event.Type) + ) +get_html model animator = + case (Struct.TurnResultAnimator.get_current_animation animator) of + (Struct.TurnResultAnimator.TurnResult turn_result) -> + (get_turn_result_html model turn_result) + + (Struct.TurnResultAnimator.AttackSetup (attacker_id, defender_id)) -> + (View.MessageBoard.Animator.Attack.get_html + model + attacker_id + defender_id + Nothing + ) + + _ -> (Util.Html.nothing) diff --git a/src/battlemap/src/View/MessageBoard/Animator/Attack.elm b/src/battlemap/src/View/MessageBoard/Animator/Attack.elm new file mode 100644 index 0000000..1557ae2 --- /dev/null +++ b/src/battlemap/src/View/MessageBoard/Animator/Attack.elm @@ -0,0 +1,158 @@ +module View.MessageBoard.Animator.Attack exposing (get_html) + +-- Elm ------------------------------------------------------------------------- +import Array + +import Html +import Html.Attributes + +-- Battlemap ------------------------------------------------------------------- +import Struct.Attack +import Struct.Character +import Struct.Event +import Struct.Model + +import Util.Html + +import View.Controlled.CharacterCard +-------------------------------------------------------------------------------- +-- LOCAL ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- +get_effect_text : Struct.Attack.Type -> String +get_effect_text attack = + ( + ( + case attack.precision of + Struct.Attack.Hit -> " hit for " + Struct.Attack.Graze -> " grazed for " + Struct.Attack.Miss -> " missed." + ) + ++ + ( + if (attack.precision == Struct.Attack.Miss) + then + "" + else + ( + ((toString attack.damage) ++ " damage") + ++ + ( + if (attack.critical) + then " (Critical Hit)." + else "." + ) + ) + ) + ) + +get_attack_html : ( + Struct.Character.Type -> + Struct.Character.Type -> + Struct.Attack.Type -> + (Html.Html Struct.Event.Type) + ) +get_attack_html attacker defender attack = + let + attacker_name = (Struct.Character.get_name attacker) + defender_name = (Struct.Character.get_name defender) + in + (Html.div + [] + [ + (Html.text + ( + case (attack.order, attack.parried) of + (Struct.Attack.Counter, True) -> + ( + defender_name + ++ " attempted to strike back, but " + ++ attacker_name + ++ " parried, and " + ++ (get_effect_text attack) + ) + + (Struct.Attack.Counter, _) -> + ( + defender_name + ++ " striked back, and " + ++ (get_effect_text attack) + ) + + (_, True) -> + ( + attacker_name + ++ " attempted a hit, but " + ++ defender_name + ++ " parried, and " + ++ (get_effect_text attack) + ) + + (_, _) -> + (attacker_name ++ " " ++ (get_effect_text attack)) + ) + ) + ] + ) + +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- +get_placeholder_html : ( + (Array.Array Struct.Character.Type) -> + Int -> + Int -> + (Maybe Struct.Attack.Type) -> + (Html.Html Struct.Event.Type) + ) +get_placeholder_html characters attacker_ix defender_ix maybe_attack = + case + ( + (Array.get attacker_ix characters), + (Array.get defender_ix characters) + ) + of + ((Just atkchar), (Just defchar)) -> + (Html.div + [ + (Html.Attributes.class "battlemap-help") + ] + ( + [ + (View.Controlled.CharacterCard.get_minimal_html + (Struct.Character.get_player_id atkchar) + atkchar + ), + ( + case maybe_attack of + (Just attack) -> + (get_attack_html atkchar defchar attack) + + Nothing -> + (Util.Html.nothing) + ), + (View.Controlled.CharacterCard.get_minimal_html "" defchar) + ] + ) + ) + + _ -> + (Html.div + [ + ] + [ + (Html.text "Error: Attack with unknown characters") + ] + ) + +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- +get_html : ( + Struct.Model.Type -> + Int -> + Int -> + (Maybe Struct.Attack.Type) -> + (Html.Html Struct.Event.Type) + ) +get_html model attacker_ix defender_ix maybe_attack = + (get_placeholder_html model.characters attacker_ix defender_ix maybe_attack) diff --git a/src/battlemap/src/View/MessageBoard/Error.elm b/src/battlemap/src/View/MessageBoard/Error.elm new file mode 100644 index 0000000..d1d9072 --- /dev/null +++ b/src/battlemap/src/View/MessageBoard/Error.elm @@ -0,0 +1,33 @@ +module View.MessageBoard.Error exposing (get_html) + +-- Elm ------------------------------------------------------------------------- +import Html +import Html.Attributes + +-- Battlemap ------------------------------------------------------------------- +import Struct.Error +import Struct.Event +import Struct.Model + +-------------------------------------------------------------------------------- +-- LOCAL ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- +get_html : ( + Struct.Model.Type -> + Struct.Error.Type -> + (Html.Html Struct.Event.Type) + ) +get_html model error = + (Html.div + [ + (Html.Attributes.class "battlemap-help"), + (Html.Attributes.class "battlemap-error") + ] + [ + (Html.text (Struct.Error.to_string error)) + ] + ) diff --git a/src/battlemap/src/View/MessageBoard/Help.elm b/src/battlemap/src/View/MessageBoard/Help.elm new file mode 100644 index 0000000..8b6ff41 --- /dev/null +++ b/src/battlemap/src/View/MessageBoard/Help.elm @@ -0,0 +1,72 @@ +module View.MessageBoard.Help exposing (get_html) + +-- Elm ------------------------------------------------------------------------- +import Html +import Html.Attributes + +-- Battlemap ------------------------------------------------------------------- +import Struct.CharacterTurn +import Struct.Event +import Struct.Model + +-------------------------------------------------------------------------------- +-- LOCAL ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- +get_help_message : Struct.Model.Type -> (List (Html.Html Struct.Event.Type)) +get_help_message model = + case (Struct.CharacterTurn.get_state model.char_turn) of + Struct.CharacterTurn.SelectedCharacter -> + [ + (Html.text + ( + "Click on a target tile to select a path or use the manual" + ++ " controls to make your own. Click on the destination tile" + ++ " again to confirm." + ) + ) + ] + + Struct.CharacterTurn.MovedCharacter -> + [ + (Html.text + ( + "You can now choose a target in range. Dashed tiles indicate" + ++ " where your character will not be able to defend against" + ++ " counter attacks." + ) + ) + ] + + Struct.CharacterTurn.ChoseTarget -> + [ + (Html.text + ( + "If you are satisfied with your choices, end the turn to" + ++ " confirm them." + ) + ) + ] + + _ -> + [ + (Html.text + ( + "Click once on a character to focus them. This will show you" + ++ " their stats, equipment, and other infos. If they are in" + ++ " your team and active (the pulsating characters)," + ++ " clicking on them again will let you take control." + ) + ) + ] + +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- +get_html : Struct.Model.Type -> (Html.Html Struct.Event.Type) +get_html model = + (Html.div + [ + (Html.Attributes.class "battlemap-help") + ] + (get_help_message model) + ) diff --git a/src/battlemap/www/style.css b/src/battlemap/www/style.css index 21ba3d4..09e1edd 100644 --- a/src/battlemap/www/style.css +++ b/src/battlemap/www/style.css @@ -44,6 +44,10 @@ margin: 0 1em 0 1em; background-color: #917C6F; + + display: flex; + flex-flow: row; + justify-content: space-between; } -- cgit v1.2.3-70-g09d2