summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2019-12-04 16:09:41 +0100
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2019-12-04 16:09:41 +0100
commita3de3f0eabf8b30e30af0b1453e54ebadb1f5a88 (patch)
tree5279764055f5fbe3294a7abc733fffb06f46c38c /src
parent4094b24940779d298a3ff97525ac40deac093cab (diff)
...
Diffstat (limited to 'src')
-rw-r--r--src/battle/src/Struct/Model.elm3
-rw-r--r--src/battle/src/Struct/Puppeteer.elm185
-rw-r--r--src/battle/src/Struct/PuppeteerAction.elm186
3 files changed, 374 insertions, 0 deletions
diff --git a/src/battle/src/Struct/Model.elm b/src/battle/src/Struct/Model.elm
index e23cd9e..f0c8695 100644
--- a/src/battle/src/Struct/Model.elm
+++ b/src/battle/src/Struct/Model.elm
@@ -20,6 +20,7 @@ import BattleMap.Struct.DataSet
import Struct.CharacterTurn
import Struct.Error
import Struct.HelpRequest
+import Struct.Puppeteer
import Struct.TurnResult
import Struct.TurnResultAnimator
import Struct.UI
@@ -32,6 +33,7 @@ type alias Type =
flags : Struct.Flags.Type,
help_request : Struct.HelpRequest.Type,
animator : (Maybe Struct.TurnResultAnimator.Type),
+ puppeteer : Struct.Puppeteer.Type,
ui : Struct.UI.Type,
char_turn : Struct.CharacterTurn.Type,
error : (Maybe Struct.Error.Type),
@@ -58,6 +60,7 @@ new flags =
flags = flags,
help_request = Struct.HelpRequest.None,
animator = Nothing,
+ puppeteer = (Struct.Puppeteer.new),
ui = (Struct.UI.default),
char_turn = (Struct.CharacterTurn.new),
error = Nothing,
diff --git a/src/battle/src/Struct/Puppeteer.elm b/src/battle/src/Struct/Puppeteer.elm
new file mode 100644
index 0000000..00f677f
--- /dev/null
+++ b/src/battle/src/Struct/Puppeteer.elm
@@ -0,0 +1,185 @@
+module Struct.Puppeteer exposing
+ (
+ Type,
+ new,
+ append,
+ is_active,
+ requires_priming,
+ )
+
+-- Elm -------------------------------------------------------------------------
+import Array
+import Set
+
+-- Battle Map ------------------------------------------------------------------
+import BattleMap.Struct.DataSet
+
+-- Local Module ----------------------------------------------------------------
+import Struct.Battle
+import Struct.TurnResult
+import Struct.PuppeteerAction
+
+--------------------------------------------------------------------------------
+-- TYPES -----------------------------------------------------------------------
+--------------------------------------------------------------------------------
+type alias Type =
+ {
+ actions : (List Struct.PuppeteerAction.Type),
+ primed : Bool
+ }
+
+--------------------------------------------------------------------------------
+-- LOCAL -----------------------------------------------------------------------
+--------------------------------------------------------------------------------
+turn_result_to_actions : Struct.TurnResult.Type -> (List Action)
+turn_result_to_actions turn_result =
+ case turn_result of
+ (Struct.TurnResult.Attacked attack) ->
+ let
+ attacker_ix = (Struct.TurnResult.get_actor_index turn_result)
+ defender_ix = (Struct.TurnResult.get_attack_defender_index attack)
+ in
+ [
+ (Focus attacker_ix),
+ (Focus defender_ix),
+ (AttackSetup (attacker_ix, defender_ix)),
+ (TurnResult turn_result),
+ (RefreshCharacter attacker_ix),
+ (RefreshCharacter defender_ix)
+ ]
+
+ _ ->
+ let actor_ix = (Struct.TurnResult.get_actor_index turn_result) in
+ [
+ (Focus actor_ix),
+ (TurnResult turn_result),
+ (RefreshCharacter actor_ix)
+ ]
+
+initialize_animator : Type -> Type
+initialize_animator model =
+ let
+ timeline_list = (Array.toList model.timeline)
+ (characters, players) =
+ (List.foldr
+ (\event (pcharacters, pplayers) ->
+ (Struct.TurnResult.apply_inverse_step
+ (tile_omnimods_fun model)
+ event
+ pcharacters
+ pplayers
+ )
+ )
+ (model.characters, model.players)
+ timeline_list
+ )
+ in
+ {model |
+ animator =
+ (Struct.TurnResultAnimator.maybe_new
+ (List.reverse timeline_list)
+ True
+ ),
+ ui = (Struct.UI.default),
+ characters = characters,
+ players = players
+ }
+
+move_animator_to_next_step : (Maybe Type) -> (Maybe Type)
+move_animator_to_next_step maybe_animator =
+ case maybe_animator of
+ Nothing -> maybe_animator
+ (Just animator) ->
+ (Struct.TurnResultAnimator.maybe_trigger_next_step animator)
+
+-- case (Struct.TurnResultAnimator.maybe_trigger_next_step animator) of
+-- Nothing ->
+-- (Set.foldl
+-- (regenerate_attack_of_opportunity_markers)
+-- {model | animator = Nothing }
+-- (Struct.TurnResultAnimator.get_animated_character_indices
+-- animator
+-- )
+-- )
+--
+-- just_next_animator -> {model | animator = just_next_animator }
+
+apply_animator_step : (
+ BattleMap.Struct.DataSet.Type ->
+ Type ->
+ Struct.Battle.Type ->
+ Struct.Battle.Type
+ )
+apply_animator_step dataset animator battle =
+ case (Struct.TurnResultAnimator.get_current_animation animator) of
+ (Struct.TurnResultAnimator.TurnResult turn_result) ->
+ let
+ (characters, players) =
+ (Struct.TurnResult.apply_step
+ (Struct.Battle.get_tile_omnimods_fun dataset battle)
+ turn_result
+ battle
+ )
+ in
+ (Struct.Battle.set_players
+ players
+ (Struct.Battle.set_characters characters battle)
+ )
+
+ _ -> battle
+
+pop : Type -> (Type, (Maybe Action))
+pop puppeteer =
+ case (Util.List.pop puppeteer.remaining_animations) of
+ Nothing -> (puppeteer, Nothing)
+ (Just (action, remaining_animations)) ->
+ (
+ {puppeteer |
+ remaining_animations = remaining_animations,
+ primed =
+ if (List.isEmpty remaining_animations)
+ then False
+ else puppeteer.primed
+ },
+ action
+ )
+
+--------------------------------------------------------------------------------
+-- EXPORTED --------------------------------------------------------------------
+--------------------------------------------------------------------------------
+new : Type
+new =
+ {
+ remaining_animations = [],
+ primed = False
+ }
+
+append : (List Struct.TurnResult.Type) -> Type -> Type
+append turn_results puppeteer =
+ {puppeteer |
+ remaining_animations =
+ (List.concat
+ puppeteer.remaining_animations
+ (List.map (turn_result_to_actions) turn_results)
+ )
+ }
+
+is_active : Type -> Bool
+is_active puppeteer = (not (List.isEmpty puppeteer.remaining_animations))
+
+requires_priming : Type -> Bool
+requires_priming puppeteer = (is_active and (not puppeteer.is_primed))
+
+forward : Struct.Battle.Type -> Type -> (Struct.Battle.Type, Type)
+forward battle puppeteer =
+ case (pop puppeteer) of
+ (next_puppeteer, Nothing) -> (battle, next_puppeteer)
+ (next_puppeteer, (Just action)) ->
+ ((apply_action action battle), next_puppeteer)
+
+forward : Struct.Battle.Type -> Type -> (Struct.Battle.Type, Type)
+forward battle puppeteer =
+ case (pop puppeteer) of
+ (next_puppeteer, Nothing) -> (battle, next_puppeteer)
+ (next_puppeteer, (Just action)) ->
+ ((apply_action action battle), next_puppeteer)
diff --git a/src/battle/src/Struct/PuppeteerAction.elm b/src/battle/src/Struct/PuppeteerAction.elm
new file mode 100644
index 0000000..197eb08
--- /dev/null
+++ b/src/battle/src/Struct/PuppeteerAction.elm
@@ -0,0 +1,186 @@
+module Struct.PuppeteerAction exposing
+ (
+ Type,
+ Action(..),
+ from_turn_result,
+ forward,
+ backward
+ )
+
+-- Elm -------------------------------------------------------------------------
+import Array
+import Set
+
+-- Battle Map ------------------------------------------------------------------
+import BattleMap.Struct.DataSet
+
+-- Local Module ----------------------------------------------------------------
+import Struct.Battle
+import Struct.TurnResult
+
+--------------------------------------------------------------------------------
+-- TYPES -----------------------------------------------------------------------
+--------------------------------------------------------------------------------
+type Type =
+ Inactive
+ | Targetting (Int, Int)
+ | Hit
+ | Focus Int
+ | TurnResult Struct.TurnResult.Type
+ | RefreshCharacter Int
+
+--------------------------------------------------------------------------------
+-- LOCAL -----------------------------------------------------------------------
+--------------------------------------------------------------------------------
+turn_result_to_actions : Struct.TurnResult.Type -> (List Action)
+turn_result_to_actions turn_result =
+ case turn_result of
+ (Struct.TurnResult.Attacked attack) ->
+ let
+ attacker_ix = (Struct.TurnResult.get_actor_index turn_result)
+ defender_ix = (Struct.TurnResult.get_attack_defender_index attack)
+ in
+ [
+ (Focus attacker_ix),
+ (Focus defender_ix),
+ (AttackSetup (attacker_ix, defender_ix)),
+ (TurnResult turn_result),
+ (RefreshCharacter attacker_ix),
+ (RefreshCharacter defender_ix)
+ ]
+
+ _ ->
+ let actor_ix = (Struct.TurnResult.get_actor_index turn_result) in
+ [
+ (Focus actor_ix),
+ (TurnResult turn_result),
+ (RefreshCharacter actor_ix)
+ ]
+
+initialize_animator : Type -> Type
+initialize_animator model =
+ let
+ timeline_list = (Array.toList model.timeline)
+ (characters, players) =
+ (List.foldr
+ (\event (pcharacters, pplayers) ->
+ (Struct.TurnResult.apply_inverse_step
+ (tile_omnimods_fun model)
+ event
+ pcharacters
+ pplayers
+ )
+ )
+ (model.characters, model.players)
+ timeline_list
+ )
+ in
+ {model |
+ animator =
+ (Struct.TurnResultAnimator.maybe_new
+ (List.reverse timeline_list)
+ True
+ ),
+ ui = (Struct.UI.default),
+ characters = characters,
+ players = players
+ }
+
+move_animator_to_next_step : (Maybe Type) -> (Maybe Type)
+move_animator_to_next_step maybe_animator =
+ case maybe_animator of
+ Nothing -> maybe_animator
+ (Just animator) ->
+ (Struct.TurnResultAnimator.maybe_trigger_next_step animator)
+
+-- case (Struct.TurnResultAnimator.maybe_trigger_next_step animator) of
+-- Nothing ->
+-- (Set.foldl
+-- (regenerate_attack_of_opportunity_markers)
+-- {model | animator = Nothing }
+-- (Struct.TurnResultAnimator.get_animated_character_indices
+-- animator
+-- )
+-- )
+--
+-- just_next_animator -> {model | animator = just_next_animator }
+
+apply_animator_step : (
+ BattleMap.Struct.DataSet.Type ->
+ Type ->
+ Struct.Battle.Type ->
+ Struct.Battle.Type
+ )
+apply_animator_step dataset animator battle =
+ case (Struct.TurnResultAnimator.get_current_animation animator) of
+ (Struct.TurnResultAnimator.TurnResult turn_result) ->
+ let
+ (characters, players) =
+ (Struct.TurnResult.apply_step
+ (Struct.Battle.get_tile_omnimods_fun dataset battle)
+ turn_result
+ battle
+ )
+ in
+ (Struct.Battle.set_players
+ players
+ (Struct.Battle.set_characters characters battle)
+ )
+
+ _ -> battle
+
+pop : Type -> (Type, (Maybe Action))
+pop puppeteer =
+ case (Util.List.pop puppeteer.remaining_animations) of
+ Nothing -> (puppeteer, Nothing)
+ (Just (action, remaining_animations)) ->
+ (
+ {puppeteer |
+ remaining_animations = remaining_animations,
+ primed =
+ if (List.isEmpty remaining_animations)
+ then False
+ else puppeteer.primed
+ },
+ action
+ )
+
+--------------------------------------------------------------------------------
+-- EXPORTED --------------------------------------------------------------------
+--------------------------------------------------------------------------------
+new : Type
+new =
+ {
+ remaining_animations = [],
+ primed = False
+ }
+
+append : (List Struct.TurnResult.Type) -> Type -> Type
+append turn_results puppeteer =
+ {puppeteer |
+ remaining_animations =
+ (List.concat
+ puppeteer.remaining_animations
+ (List.map (turn_result_to_actions) turn_results)
+ )
+ }
+
+is_active : Type -> Bool
+is_active puppeteer = (not (List.isEmpty puppeteer.remaining_animations))
+
+requires_priming : Type -> Bool
+requires_priming puppeteer = (is_active and (not puppeteer.is_primed))
+
+forward : Struct.Battle.Type -> Type -> (Struct.Battle.Type, Type)
+forward battle puppeteer =
+ case (pop puppeteer) of
+ (next_puppeteer, Nothing) -> (battle, next_puppeteer)
+ (next_puppeteer, (Just action)) ->
+ ((apply_action action battle), next_puppeteer)
+
+forward : Struct.Battle.Type -> Type -> (Struct.Battle.Type, Type)
+forward battle puppeteer =
+ case (pop puppeteer) of
+ (next_puppeteer, Nothing) -> (battle, next_puppeteer)
+ (next_puppeteer, (Just action)) ->
+ ((apply_action action battle), next_puppeteer)