summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornsensfel <SpamShield0@noot-noot.org>2017-12-08 16:53:55 +0100
committernsensfel <SpamShield0@noot-noot.org>2017-12-08 16:53:55 +0100
commitd05ffa34c39b87d080e0f1ed24bcb4ac88935d88 (patch)
treed5bdb64808be23b498a1a3286a341670c35c17ee
parent335b70e16d383298c5c06a97ecab51282395afab (diff)
Slowly getting there...
-rw-r--r--src/battlemap/src/Struct/CharacterTurn.elm51
-rw-r--r--src/battlemap/src/Struct/Navigator.elm24
-rw-r--r--src/battlemap/src/Update/SelectCharacter.elm39
-rw-r--r--src/battlemap/src/Update/SelectTile.elm171
4 files changed, 158 insertions, 127 deletions
diff --git a/src/battlemap/src/Struct/CharacterTurn.elm b/src/battlemap/src/Struct/CharacterTurn.elm
index ce50eb3..c4dcecd 100644
--- a/src/battlemap/src/Struct/CharacterTurn.elm
+++ b/src/battlemap/src/Struct/CharacterTurn.elm
@@ -7,7 +7,9 @@ module Struct.CharacterTurn exposing
set_controlled_character,
get_state,
get_path,
- set_path,
+ lock_path,
+ try_getting_navigator,
+ set_navigator,
add_target,
remove_target,
get_targets
@@ -61,27 +63,19 @@ new =
try_getting_controlled_character : Type -> (Maybe Struct.Character.Ref)
try_getting_controlled_character ct = ct.controlled_character
+
set_controlled_character : (
Type ->
Struct.Character.Type ->
- (Struct.Location.Type -> Int) ->
Type
-)
-set_controlled_character ct char mov_cost_fun =
- {
+ )
+set_controlled_character ct char =
+ {ct |
state = SelectedCharacter,
controlled_character = (Just (Struct.Character.get_ref char)),
path = [],
targets = [],
- navigator =
- (Just
- (Struct.Navigator.new
- (Struct.Character.get_location char)
- (Struct.Character.get_movement_points char)
- (Struct.Character.get_attack_range char)
- mov_cost_fun
- )
- )
+ navigator = Nothing
}
get_state : Type -> State
@@ -90,25 +84,32 @@ get_state ct = ct.state
get_path : Type -> (List Struct.Direction.Type)
get_path ct = ct.path
-try_locking_path : Type -> (Just Type)
-try_locking_path ct =
+lock_path : Type -> Type
+lock_path ct =
case ct.navigator of
(Just old_nav) ->
{ct |
state = MovedCharacter,
path = (Struct.Navigator.get_path old_nav),
targets = [],
- navigator =
- (Just
- (Struct.Navigator.new
- (Struct.Navigator.get_current_location old_nav)
- 0
- (Struct.Character.get_attack_range char)
- mov_cost_fun
- )
- )
+ navigator = (Just (Struct.Navigator.lock_path old_nav))
}
+ Nothing ->
+ ct
+
+try_getting_navigator : Type -> (Maybe Struct.Navigator.Type)
+try_getting_navigator ct = ct.navigator
+
+set_navigator : Type -> Struct.Navigator.Type -> Type
+set_navigator ct navigator =
+ {ct |
+ state = SelectedCharacter,
+ path = [],
+ targets = [],
+ navigator = (Just navigator)
+ }
+
add_target : Type -> Struct.Character.Ref -> Type
add_target ct target_ref =
{ct |
diff --git a/src/battlemap/src/Struct/Navigator.elm b/src/battlemap/src/Struct/Navigator.elm
index 56ef255..dacefbd 100644
--- a/src/battlemap/src/Struct/Navigator.elm
+++ b/src/battlemap/src/Struct/Navigator.elm
@@ -10,6 +10,7 @@ module Struct.Navigator exposing
get_path,
get_summary,
clear_path,
+ lock_path,
try_adding_step,
try_getting_path_to
)
@@ -36,7 +37,8 @@ type alias Type =
(Dict.Dict
Struct.Location.Ref
Struct.RangeIndicator.Type
- )
+ ),
+ cost_fun: (Struct.Location.Type -> Int)
}
type alias Summary =
@@ -72,7 +74,8 @@ new start_loc mov_dist atk_dist cost_fun =
mov_dist
atk_dist
(cost_fun)
- )
+ ),
+ cost_fun = cost_fun
}
get_current_location : Type -> Struct.Location.Type
@@ -128,16 +131,27 @@ clear_path navigator =
)
}
+lock_path : Type -> Type
+lock_path navigator =
+ {navigator |
+ range_indicators =
+ (Struct.RangeIndicator.generate
+ (Struct.Path.get_current_location navigator.path)
+ 0
+ navigator.attack_dist
+ (navigator.cost_fun)
+ )
+ }
+
try_adding_step : (
Type ->
Struct.Direction.Type ->
- (Struct.Location.Type -> Int) ->
(Maybe Type)
)
-try_adding_step navigator dir cost_fun =
+try_adding_step navigator dir =
case
(Struct.Path.try_following_direction
- cost_fun
+ (navigator.cost_fun)
(Just navigator.path)
dir
)
diff --git a/src/battlemap/src/Update/SelectCharacter.elm b/src/battlemap/src/Update/SelectCharacter.elm
index 5347dec..bddd12f 100644
--- a/src/battlemap/src/Update/SelectCharacter.elm
+++ b/src/battlemap/src/Update/SelectCharacter.elm
@@ -18,14 +18,6 @@ import Update.RequestDirection
--------------------------------------------------------------------------------
-- LOCAL -----------------------------------------------------------------------
--------------------------------------------------------------------------------
-autopilot : (
- Struct.Direction.Type ->
- Struct.Model.Type ->
- (Struct.Model.Type, (Cmd Struct.Event.Type))
- )
-autopilot dir model =
- (Update.RequestDirection.apply_to model dir)
-
attack_character : (
Struct.Model.Type ->
Struct.Character.Ref ->
@@ -35,7 +27,8 @@ attack_character : (
)
attack_character model main_char_id target_char_id target_char =
{model |
- targets = [target_char_id],
+ char_turn =
+ (Struct.CharacterTurn.add_target target_char_id model.char_turn),
ui = (Struct.UI.set_previous_action model.ui Nothing)
}
@@ -46,24 +39,26 @@ select_character : (
Struct.Model.Type
)
select_character model target_char_id target_char =
- if ((Struct.Character.is_enabled target_char))
+ if (Struct.Character.is_enabled target_char)
then
{model |
state = Struct.Model.Default,
char_turn =
- (Struct.CharacterTurn.set_controlled_character
- model.char_turn
- target_char_id
+ (Struct.CharacterTurn.set_navigator
+ (Struct.CharacterTurn.set_controlled_character
+ model.char_turn
+ target_char_id
+ )
+ (Struct.Character.get_location target_char)
+ (Struct.Character.get_movement_points target_char)
+ (Struct.Character.get_attack_range target_char)
+ (Struct.Battlemap.get_movement_cost_function
+ (Dict.values model.characters)
+ (Struct.Character.get_location target_char)
+ model.battlemap
+ )
),
- ui = (Struct.UI.set_previous_action model.ui Nothing),
- battlemap =
--- (Struct.Battlemap.set_navigator
--- (Struct.Character.get_location target_char)
--- (Struct.Character.get_movement_points target_char)
--- (Struct.Character.get_attack_range target_char)
--- (Dict.values model.characters)
- model.battlemap
--- )
+ ui = (Struct.UI.set_previous_action model.ui Nothing)
}
else
{model |
diff --git a/src/battlemap/src/Update/SelectTile.elm b/src/battlemap/src/Update/SelectTile.elm
index 46f212f..42f7b29 100644
--- a/src/battlemap/src/Update/SelectTile.elm
+++ b/src/battlemap/src/Update/SelectTile.elm
@@ -5,10 +5,13 @@ module Update.SelectTile exposing (apply_to)
-- Battlemap -------------------------------------------------------------------
import Struct.Battlemap
import Struct.Character
+import Struct.CharacterTurn
import Struct.Direction
+import Struct.Error
import Struct.Event
import Struct.Location
import Struct.Model
+import Struct.Navigator
import Struct.UI
import Update.EndTurn
@@ -17,85 +20,105 @@ import Update.RequestDirection
--------------------------------------------------------------------------------
-- LOCAL -----------------------------------------------------------------------
--------------------------------------------------------------------------------
-autopilot : Struct.Direction.Type -> Struct.Model.Type -> Struct.Model.Type
-autopilot dir model =
- (Update.RequestDirection.apply_to model dir)
+try_autopiloting : (
+ Struct.Direction.Type ->
+ (Maybe Struct.Navigator.Type) ->
+ (Maybe Struct.Navigator.Type)
+ )
+try_autopiloting dir maybe_nav =
+ case maybe_nav of
+ (Just navigator) ->
+ (Struct.Navigator.try_adding_step navigator dir)
+
+ Nothing -> Nothing
go_to_tile : (
Struct.Model.Type ->
- Struct.Character.Ref ->
+ Struct.Navigator.Type ->
Struct.Location.Ref ->
(Struct.Model.Type, (Cmd Struct.Event.Type))
)
-go_to_tile model char_ref loc_ref =
- case -- (Struct.Battlemap.try_getting_navigator_location model.battlemap)
- (Just {x = 0, y = 0})
- of
- (Just nav_loc) ->
- if (loc_ref == (Struct.Location.get_ref nav_loc))
- then
- -- We are already there.
- if
- (
- (Struct.UI.get_previous_action model.ui)
- ==
- (Just (Struct.UI.SelectedLocation loc_ref))
- )
- then
- -- And we just clicked on that tile.
- (Update.EndTurn.apply_to model)
- else
- -- And we didn't just click on that tile.
- (
- {model |
- ui =
- (Struct.UI.set_previous_action
- model.ui
- (Just (Struct.UI.SelectedLocation loc_ref))
- )
- },
- Cmd.none
- )
- else
- -- We have to try getting there.
- case
- (Struct.Battlemap.try_getting_navigator_path_to
- model.battlemap
- loc_ref
- )
- of
- (Just path) ->
- let
- new_model =
- (List.foldr
- (autopilot)
- {model |
- battlemap =
- (Struct.Battlemap.clear_navigator_path
- model.battlemap
- )
- }
- path
- )
- in
- (
- {new_model |
- ui =
- (Struct.UI.set_previous_action
- new_model.ui
- (Just (Struct.UI.SelectedLocation loc_ref))
- )
- },
- Cmd.none
- )
+go_to_tile model navigator loc_ref =
+ if
+ (
+ loc_ref
+ ==
+ (Struct.Location.get_ref
+ (Struct.Navigator.get_current_location navigator)
+ )
+ )
+ then
+ -- We are already there.
+ if
+ (
+ (Struct.UI.get_previous_action model.ui)
+ ==
+ (Just (Struct.UI.SelectedLocation loc_ref))
+ )
+ then
+ -- And we just clicked on that tile.
+ (
+ {model |
+ char_turn =
+ (Struct.CharacterTurn.lock_path model.char_turn)
+ },
+ Cmd.none
+ )
+ else
+ -- And we didn't just click on that tile.
+ (
+ {model |
+ ui =
+ (Struct.UI.set_previous_action
+ model.ui
+ (Just (Struct.UI.SelectedLocation loc_ref))
+ )
+ },
+ Cmd.none
+ )
+ else
+ -- We have to try getting there.
+ case
+ (Struct.Navigator.try_getting_path_to
+ navigator
+ loc_ref
+ )
+ of
+ (Just path) ->
+ case (List.foldr (try_autopiloting) (Just navigator) path) of
+ (Just new_navigator) ->
+ (
+ {model |
+ char_turn =
+ (Struct.CharacterTurn.set_navigator
+ model.char_turn
+ new_navigator
+ ),
+ ui =
+ (Struct.UI.set_previous_action
+ model.ui
+ (Just (Struct.UI.SelectedLocation loc_ref))
+ )
+ },
+ Cmd.none
+ )
- Nothing -> -- Clicked outside of the range indicator
- ((Struct.Model.reset model model.characters), Cmd.none)
+ Nothing ->
+ (
+ (Struct.Model.invalidate
+ model
+ (Struct.Error.new
+ Struct.Error.Programming
+ "SelectTile/Navigator: Could not follow own path."
+ )
+ ),
+ Cmd.none
+ )
- Nothing -> -- Clicked outside of the range indicator
- ((Struct.Model.reset model model.characters), Cmd.none)
+ Nothing -> -- Clicked outside of the range indicator
+ ((Struct.Model.reset model model.characters), Cmd.none)
---------------------------------------------------------------------------------
+------------------------------------------------ maybe_nav--------------------------------
-- EXPORTED --------------------------------------------------------------------
--------------------------------------------------------------------------------
apply_to : (
@@ -104,10 +127,8 @@ apply_to : (
(Struct.Model.Type, (Cmd Struct.Event.Type))
)
apply_to model loc_ref =
- case
- (Struct.CharacterTurn model.char_turn)
- of
- (Just char_ref) ->
- (go_to_tile model char_ref loc_ref)
+ case (Struct.CharacterTurn.try_getting_navigator model.char_turn) of
+ (Just navigator) ->
+ (go_to_tile model navigator loc_ref)
_ -> ({model | state = (Struct.Model.InspectingTile loc_ref)}, Cmd.none)