summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/roster-editor/src/Update')
-rw-r--r--src/roster-editor/src/Update/DisplayCharacterInfo.elm53
-rw-r--r--src/roster-editor/src/Update/GoToMainMenu.elm24
-rw-r--r--src/roster-editor/src/Update/HandleServerReply.elm174
-rw-r--r--src/roster-editor/src/Update/SelectCharacter.elm298
-rw-r--r--src/roster-editor/src/Update/SelectTab.elm32
-rw-r--r--src/roster-editor/src/Update/SendLoadRosterRequest.elm26
-rw-r--r--src/roster-editor/src/Update/SetRequestedHelp.elm22
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)