| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src/roster-editor/src/Update')
| -rw-r--r-- | src/roster-editor/src/Update/DisplayCharacterInfo.elm | 53 | ||||
| -rw-r--r-- | src/roster-editor/src/Update/GoToMainMenu.elm | 24 | ||||
| -rw-r--r-- | src/roster-editor/src/Update/HandleServerReply.elm | 174 | ||||
| -rw-r--r-- | src/roster-editor/src/Update/SelectCharacter.elm | 298 | ||||
| -rw-r--r-- | src/roster-editor/src/Update/SelectTab.elm | 32 | ||||
| -rw-r--r-- | src/roster-editor/src/Update/SendLoadRosterRequest.elm | 26 | ||||
| -rw-r--r-- | src/roster-editor/src/Update/SetRequestedHelp.elm | 22 | 
7 files changed, 629 insertions, 0 deletions
| diff --git a/src/roster-editor/src/Update/DisplayCharacterInfo.elm b/src/roster-editor/src/Update/DisplayCharacterInfo.elm new file mode 100644 index 0000000..e482e2f --- /dev/null +++ b/src/roster-editor/src/Update/DisplayCharacterInfo.elm @@ -0,0 +1,53 @@ +module Update.DisplayCharacterInfo exposing (apply_to) +-- Elm ------------------------------------------------------------------------- +import Array +import Task + +-- Map ------------------------------------------------------------------- +import Action.Scroll + +import Struct.Character +import Struct.Event +import Struct.Model +import Struct.UI + +-------------------------------------------------------------------------------- +-- LOCAL ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- +scroll_to_char : Struct.Model.Type -> Int -> (Cmd Struct.Event.Type) +scroll_to_char model char_ix = +   case (Array.get char_ix model.characters) of +      (Just char) -> +         (Task.attempt +            (Struct.Event.attempted) +            (Action.Scroll.to +               (Struct.Character.get_location char) +               model.ui +            ) +         ) + +      Nothing -> +         Cmd.none + +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- +apply_to : ( +      Struct.Model.Type -> +      Int -> +      (Struct.Model.Type, (Cmd Struct.Event.Type)) +   ) +apply_to model target_ref = +   ( +      {model | +         ui = +            (Struct.UI.set_displayed_tab +               Struct.UI.StatusTab +               (Struct.UI.set_previous_action +                  (Just (Struct.UI.SelectedCharacter target_ref)) +                  model.ui +               ) +            ) +      }, +      (scroll_to_char model target_ref) +   ) diff --git a/src/roster-editor/src/Update/GoToMainMenu.elm b/src/roster-editor/src/Update/GoToMainMenu.elm new file mode 100644 index 0000000..f2ec989 --- /dev/null +++ b/src/roster-editor/src/Update/GoToMainMenu.elm @@ -0,0 +1,24 @@ +module Update.GoToMainMenu exposing (apply_to) +-- Elm ------------------------------------------------------------------------- + +-- Battle ---------------------------------------------------------------------- +import Action.Ports + +import Constants.IO + +import Struct.Model +import Struct.Event + +-------------------------------------------------------------------------------- +-- LOCAL ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- +apply_to : Struct.Model.Type -> (Struct.Model.Type, (Cmd Struct.Event.Type)) +apply_to model = +   ( +      model, +      (Action.Ports.go_to (Constants.IO.base_url ++"/main-menu/")) +   ) diff --git a/src/roster-editor/src/Update/HandleServerReply.elm b/src/roster-editor/src/Update/HandleServerReply.elm new file mode 100644 index 0000000..22261da --- /dev/null +++ b/src/roster-editor/src/Update/HandleServerReply.elm @@ -0,0 +1,174 @@ +module Update.HandleServerReply exposing (apply_to) + +-- Elm ------------------------------------------------------------------------- +import Array + +import Delay + +import Dict + +import Http + +import Time + +-- Shared ---------------------------------------------------------------------- +import Action.Ports + +import Struct.Flags + +-- Roster Editor --------------------------------------------------------------- +import Constants.IO + +import Struct.Armor +import Struct.Character +import Struct.Error +import Struct.Event +import Struct.Model +import Struct.ServerReply +import Struct.UI +import Struct.Weapon + +-------------------------------------------------------------------------------- +-- TYPES ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------- +-- LOCAL ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- +weapon_getter : Struct.Model.Type -> Struct.Weapon.Ref -> Struct.Weapon.Type +weapon_getter model ref = +   case (Dict.get ref model.weapons) of +      (Just w) -> w +      Nothing -> Struct.Weapon.none + +armor_getter : Struct.Model.Type -> Struct.Armor.Ref -> Struct.Armor.Type +armor_getter model ref = +   case (Dict.get ref model.armors) of +      (Just w) -> w +      Nothing -> Struct.Armor.none + +----------- + +disconnected : ( +      (Struct.Model.Type, (List (Cmd Struct.Event.Type))) -> +      (Struct.Model.Type, (List (Cmd Struct.Event.Type))) +   ) +disconnected current_state = +   let (model, cmds) = current_state in +      ( +         model, +         [ +            (Action.Ports.go_to +               ( +                  Constants.IO.base_url +                  ++ "/login/?action=disconnect&goto=" +                  ++ +                  (Http.encodeUri +                     ( +                        "/roster-editor/?" +                        ++ (Struct.Flags.get_params_as_url model.flags) +                     ) +                  ) +               ) +            ) +         ] +      ) + +add_armor : ( +      Struct.Armor.Type -> +      (Struct.Model.Type, (List (Cmd Struct.Event.Type))) -> +      (Struct.Model.Type, (List (Cmd Struct.Event.Type))) +   ) +add_armor ar current_state = +   let (model, cmds) = current_state in +      ((Struct.Model.add_armor ar model), cmds) + +add_weapon : ( +      Struct.Weapon.Type -> +      (Struct.Model.Type, (List (Cmd Struct.Event.Type))) -> +      (Struct.Model.Type, (List (Cmd Struct.Event.Type))) +   ) +add_weapon wp current_state = +   let (model, cmds) = current_state in +      ((Struct.Model.add_weapon wp model), cmds) + +add_character : ( +      (Struct.Character.Type, Int, Int, Int) -> +      (Struct.Model.Type, (List (Cmd Struct.Event.Type))) -> +      (Struct.Model.Type, (List (Cmd Struct.Event.Type))) +   ) +add_character char_and_refs current_state = +   let +      (model, cmds) = current_state +      (char, awp_ref, swp_ref, ar_ref) = char_and_refs +      awp = (weapon_getter model awp_ref) +      swp = (weapon_getter model swp_ref) +      ar = (armor_getter model ar_ref) +   in +      ( +         (Struct.Model.add_character +            (Struct.Character.fill_missing_equipment_and_omnimods +               (Struct.Model.tile_omnimods_fun model) +               awp +               swp +               ar +               char +            ) +            model +         ), +         cmds +      ) + +apply_command : ( +      Struct.ServerReply.Type -> +      (Struct.Model.Type, (List (Cmd Struct.Event.Type))) -> +      (Struct.Model.Type, (List (Cmd Struct.Event.Type))) +   ) +apply_command command current_state = +   case command of +      Struct.ServerReply.Disconnected -> (disconnected current_state) + +      (Struct.ServerReply.AddWeapon wp) -> +         (add_weapon wp current_state) + +      (Struct.ServerReply.AddArmor ar) -> +         (add_armor ar current_state) + +      (Struct.ServerReply.AddCharacter char) -> +         (add_character char current_state) + +      Struct.ServerReply.Okay -> current_state + +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- +apply_to : ( +      Struct.Model.Type -> +      (Result Http.Error (List Struct.ServerReply.Type)) -> +      (Struct.Model.Type, (Cmd Struct.Event.Type)) +   ) +apply_to model query_result = +   case query_result of +      (Result.Err error) -> +         ( +            (Struct.Model.invalidate +               (Struct.Error.new Struct.Error.Networking (toString error)) +               model +            ), +            Cmd.none +         ) + +      (Result.Ok commands) -> +         let +            (new_model, elm_commands) = +               (List.foldl (apply_command) (model, [Cmd.none]) commands) +         in +            ( +               new_model, +               ( +                  case elm_commands of +                     [] -> Cmd.none +                     [cmd] -> cmd +                     _ -> (Cmd.batch elm_commands) +               ) +            ) diff --git a/src/roster-editor/src/Update/SelectCharacter.elm b/src/roster-editor/src/Update/SelectCharacter.elm new file mode 100644 index 0000000..169046c --- /dev/null +++ b/src/roster-editor/src/Update/SelectCharacter.elm @@ -0,0 +1,298 @@ +module Update.SelectCharacter exposing (apply_to) + +-- Elm ------------------------------------------------------------------------- +import Array + +import Task + +-- Map ------------------------------------------------------------------- +import Action.Scroll + +import Struct.Map +import Struct.Character +import Struct.CharacterTurn +import Struct.Error +import Struct.Event +import Struct.Location +import Struct.Model +import Struct.Navigator +import Struct.Statistics +import Struct.UI +import Struct.Weapon +import Struct.WeaponSet + +-------------------------------------------------------------------------------- +-- LOCAL ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- +get_character_navigator : ( +      Struct.Model.Type -> +      Struct.Character.Type -> +      Struct.Navigator.Type +   ) +get_character_navigator model char = +   let +      weapon = +         (Struct.WeaponSet.get_active_weapon +            (Struct.Character.get_weapons char) +         ) +   in +      (Struct.Navigator.new +         (Struct.Character.get_location char) +         (Struct.Statistics.get_movement_points +            (Struct.Character.get_statistics char) +         ) +         (Struct.Weapon.get_defense_range weapon) +         (Struct.Weapon.get_attack_range weapon) +         (Struct.Map.get_movement_cost_function +            model.map +            (Struct.Character.get_location char) +            (Array.toList model.characters) +         ) +      ) + +attack_character : ( +      Struct.Model.Type -> +      Int -> +      Struct.Character.Type -> +      Struct.Model.Type +   ) +attack_character model target_char_id target_char = +   {model | +      char_turn = +         (Struct.CharacterTurn.set_target +            (Just target_char_id) +            model.char_turn +         ), +      ui = +         (Struct.UI.reset_displayed_nav +            (Struct.UI.reset_displayed_tab +               (Struct.UI.set_previous_action Nothing model.ui) +            ) +         ) +   } + +ctrl_or_focus_character : ( +      Struct.Model.Type -> +      Int -> +      Struct.Character.Type -> +      Struct.Model.Type +   ) +ctrl_or_focus_character model target_char_id target_char = +   if (Struct.Character.is_enabled target_char) +   then +      let +         nav = +            (case (Struct.UI.try_getting_displayed_nav model.ui) of +               (Just dnav) -> dnav +               Nothing -> +                  (get_character_navigator model target_char) +            ) +      in +         {model | +            char_turn = +               (Struct.CharacterTurn.set_navigator +                  nav +                  (Struct.CharacterTurn.set_active_character +                     target_char +                     model.char_turn +                  ) +               ), +            ui = +               (Struct.UI.reset_displayed_nav +                  (Struct.UI.reset_displayed_tab +                     (Struct.UI.set_previous_action Nothing model.ui) +                  ) +               ) +         } +   else +      {model | +         ui = +            (Struct.UI.set_previous_action +               (Just (Struct.UI.SelectedCharacter target_char_id)) +               (Struct.UI.set_displayed_nav +                  (get_character_navigator model target_char) +                  model.ui +               ) +            ) +      } + +can_target_character : ( +      Struct.Model.Type -> +      Struct.Character.Type -> +      Bool +   ) +can_target_character model target = +   ( +      (Struct.CharacterTurn.can_select_target model.char_turn) +      && (Struct.Character.is_alive target) +      && +      ( +         case +            (Struct.CharacterTurn.try_getting_navigator +               model.char_turn +            ) +         of +            (Just nav) -> +               case +                  (Struct.Navigator.try_getting_path_to +                     (Struct.Location.get_ref +                        (Struct.Character.get_location target) +                     ) +                     nav +                  ) +               of +                  (Just _) -> True +                  _ -> False + +            _ -> +               False +      ) +   ) + +second_click_on : ( +      Struct.Model.Type -> +      Int -> +      (Struct.Model.Type, (Cmd Struct.Event.Type)) +   ) +second_click_on model target_char_id = +   case (Array.get target_char_id model.characters) of +      (Just target_char) -> +         case +            ( +               (Struct.CharacterTurn.try_getting_active_character +                  model.char_turn +               ), +               (Struct.CharacterTurn.try_getting_target model.char_turn) +            ) +         of +            ((Just _), (Just char_turn_target_id)) -> +               if (char_turn_target_id == target_char_id) +               then +                  ( +                     model, +                     Cmd.none +                  ) +               else +                  ( +                     (ctrl_or_focus_character model target_char_id target_char), +                     (Task.attempt +                        (Struct.Event.attempted) +                        (Action.Scroll.to +                           (Struct.Character.get_location target_char) +                           model.ui +                        ) +                     ) +                  ) + +            ((Just _), Nothing) -> +               if (can_target_character model target_char) +               then +                  ( +                     (attack_character +                        model +                        target_char_id +                        target_char +                     ), +                     Cmd.none +                  ) +               else +                  ( +                     (ctrl_or_focus_character model target_char_id target_char), +                     (Task.attempt +                        (Struct.Event.attempted) +                        (Action.Scroll.to +                           (Struct.Character.get_location target_char) +                           model.ui +                        ) +                     ) +                  ) + +            (_, _) -> +               ( +                  (ctrl_or_focus_character model target_char_id target_char), +                  (Task.attempt +                     (Struct.Event.attempted) +                     (Action.Scroll.to +                        (Struct.Character.get_location target_char) +                        model.ui +                     ) +                  ) +               ) + +      Nothing -> +         ( +            (Struct.Model.invalidate +               (Struct.Error.new +                  Struct.Error.Programming +                  "SelectCharacter: Unknown char selected." +               ) +               model +            ), +            Cmd.none +         ) + +first_click_on : ( +      Struct.Model.Type -> +      Int -> +      (Struct.Model.Type, (Cmd Struct.Event.Type)) +   ) +first_click_on model target_char_id = +   if +   ( +      (Struct.CharacterTurn.try_getting_target model.char_turn) +      == +      (Just target_char_id) +   ) +   then +      (model, Cmd.none) +   else +      case (Array.get target_char_id model.characters) of +         (Just target_char) -> +            ( +               {model | +                  ui = +                     (Struct.UI.set_previous_action +                        (Just (Struct.UI.SelectedCharacter target_char_id)) +                        (Struct.UI.set_displayed_tab +                           Struct.UI.StatusTab +                           (Struct.UI.set_displayed_nav +                              (get_character_navigator model target_char) +                              model.ui +                           ) +                        ) +                     ) +               }, +               Cmd.none +            ) + +         Nothing -> +            ( +               (Struct.Model.invalidate +                  (Struct.Error.new +                     Struct.Error.Programming +                     "SelectCharacter: Unknown char selected." +                  ) +                  model +               ), +               Cmd.none +            ) + +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- +apply_to : ( +      Struct.Model.Type -> +      Int -> +      (Struct.Model.Type, (Cmd Struct.Event.Type)) +   ) +apply_to model target_char_id = +   if +   ( +      (Struct.UI.get_previous_action model.ui) +      == +      (Just (Struct.UI.SelectedCharacter target_char_id)) +   ) +   then +      (second_click_on model target_char_id) +   else +      (first_click_on model target_char_id) diff --git a/src/roster-editor/src/Update/SelectTab.elm b/src/roster-editor/src/Update/SelectTab.elm new file mode 100644 index 0000000..d15a463 --- /dev/null +++ b/src/roster-editor/src/Update/SelectTab.elm @@ -0,0 +1,32 @@ +module Update.SelectTab exposing (apply_to) +-- Elm ------------------------------------------------------------------------- + +-- Map ------------------------------------------------------------------- +import Struct.Model +import Struct.Event +import Struct.UI + +-------------------------------------------------------------------------------- +-- LOCAL ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- +apply_to : ( +      Struct.Model.Type -> +      Struct.UI.Tab -> +      (Struct.Model.Type, (Cmd Struct.Event.Type)) +   ) +apply_to model tab = +   if ((Struct.UI.try_getting_displayed_tab model.ui) == (Just tab)) +   then +      ( +         {model | ui = (Struct.UI.reset_displayed_tab model.ui)}, +         Cmd.none +      ) +   else +      ( +         {model | ui = (Struct.UI.set_displayed_tab tab model.ui)}, +         Cmd.none +      ) diff --git a/src/roster-editor/src/Update/SendLoadRosterRequest.elm b/src/roster-editor/src/Update/SendLoadRosterRequest.elm new file mode 100644 index 0000000..2bbe9da --- /dev/null +++ b/src/roster-editor/src/Update/SendLoadRosterRequest.elm @@ -0,0 +1,26 @@ +module Update.SendLoadRosterRequest exposing (apply_to) +-- Elm ------------------------------------------------------------------------- + +-- Roster Editor --------------------------------------------------------------- +import Comm.LoadRoster + +import Struct.Event +import Struct.Model + +-------------------------------------------------------------------------------- +-- LOCAL ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- +apply_to : Struct.Model.Type -> (Struct.Model.Type, (Cmd Struct.Event.Type)) +apply_to model = +   ( +      model, +      (case (Comm.LoadRoster.try model) of +         (Just cmd) -> cmd +         Nothing -> Cmd.none +      ) +   ) + diff --git a/src/roster-editor/src/Update/SetRequestedHelp.elm b/src/roster-editor/src/Update/SetRequestedHelp.elm new file mode 100644 index 0000000..dfc58db --- /dev/null +++ b/src/roster-editor/src/Update/SetRequestedHelp.elm @@ -0,0 +1,22 @@ +module Update.SetRequestedHelp exposing (apply_to) +-- Elm ------------------------------------------------------------------------- + +-- Map ------------------------------------------------------------------- +import Struct.Event +import Struct.HelpRequest +import Struct.Model + +-------------------------------------------------------------------------------- +-- LOCAL ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- +apply_to : ( +      Struct.Model.Type -> +      Struct.HelpRequest.Type -> +      (Struct.Model.Type, (Cmd Struct.Event.Type)) +   ) +apply_to model help_request = +   ({model | help_request = help_request}, Cmd.none) | 


