summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornsensfel <SpamShield0@noot-noot.org>2018-03-13 18:11:58 +0100
committernsensfel <SpamShield0@noot-noot.org>2018-03-13 18:11:58 +0100
commit6e588a905c00c52455b7b9f5630d040bf8e38c3b (patch)
treeb32dac48c35603c6633849839f435418d245e037
parentd365b3f4ac1ede75677d584810f102cf941f5722 (diff)
Applies the effect of the timeline update.
-rw-r--r--src/battlemap/src/Comm/Send.elm4
-rw-r--r--src/battlemap/src/Comm/SetTimeline.elm27
-rw-r--r--src/battlemap/src/Struct/Attack.elm49
-rw-r--r--src/battlemap/src/Struct/Character.elm4
-rw-r--r--src/battlemap/src/Struct/ServerReply.elm1
-rw-r--r--src/battlemap/src/Struct/TurnResult.elm75
-rw-r--r--src/battlemap/src/Update/HandleServerReply.elm49
7 files changed, 197 insertions, 12 deletions
diff --git a/src/battlemap/src/Comm/Send.elm b/src/battlemap/src/Comm/Send.elm
index fbdd26d..485b9b9 100644
--- a/src/battlemap/src/Comm/Send.elm
+++ b/src/battlemap/src/Comm/Send.elm
@@ -7,8 +7,9 @@ import Json.Decode
import Json.Encode
-- Battlemap -------------------------------------------------------------------
-import Comm.SetMap
import Comm.AddChar
+import Comm.SetMap
+import Comm.SetTimeline
import Comm.TurnResults
import Struct.Event
@@ -32,6 +33,7 @@ internal_decoder model reply_type =
"add_char" -> (Comm.AddChar.decode model)
"set_map" -> (Comm.SetMap.decode model)
"turn_results" -> (Comm.TurnResults.decode)
+ "set_timeline" -> (Comm.SetTimeline.decode)
other ->
(Json.Decode.fail
(
diff --git a/src/battlemap/src/Comm/SetTimeline.elm b/src/battlemap/src/Comm/SetTimeline.elm
new file mode 100644
index 0000000..a432f3a
--- /dev/null
+++ b/src/battlemap/src/Comm/SetTimeline.elm
@@ -0,0 +1,27 @@
+module Comm.SetTimeline exposing (decode)
+
+-- Elm -------------------------------------------------------------------------
+import Json.Decode
+
+-- Battlemap -------------------------------------------------------------------
+import Struct.ServerReply
+import Struct.TurnResult
+
+--------------------------------------------------------------------------------
+-- TYPES -----------------------------------------------------------------------
+--------------------------------------------------------------------------------
+--------------------------------------------------------------------------------
+-- LOCAL -----------------------------------------------------------------------
+--------------------------------------------------------------------------------
+internal_decoder : (List Struct.TurnResult.Type) -> Struct.ServerReply.Type
+internal_decoder trl = (Struct.ServerReply.SetTimeline trl)
+
+--------------------------------------------------------------------------------
+-- EXPORTED --------------------------------------------------------------------
+--------------------------------------------------------------------------------
+decode : (Json.Decode.Decoder Struct.ServerReply.Type)
+decode =
+ (Json.Decode.map
+ (internal_decoder)
+ (Json.Decode.field "cnt" (Json.Decode.list Struct.TurnResult.decoder))
+ )
diff --git a/src/battlemap/src/Struct/Attack.elm b/src/battlemap/src/Struct/Attack.elm
index cb7acf8..16df73f 100644
--- a/src/battlemap/src/Struct/Attack.elm
+++ b/src/battlemap/src/Struct/Attack.elm
@@ -1,9 +1,19 @@
-module Struct.Attack exposing (Type, Order, Precision, decoder)
+module Struct.Attack exposing
+ (
+ Type,
+ Order,
+ Precision,
+ apply_to_characters,
+ decoder
+ )
-- Elm -------------------------------------------------------------------------
+import Dict
+
import Json.Decode
-- Battlemap -------------------------------------------------------------------
+import Struct.Character
--------------------------------------------------------------------------------
-- TYPES -----------------------------------------------------------------------
@@ -62,7 +72,44 @@ decoder =
(Json.Decode.field "dmg" (Json.Decode.int))
)
+apply_damage_to_character : (
+ Int ->
+ (Maybe Struct.Character.Type) ->
+ (Maybe Struct.Character.Type)
+ )
+apply_damage_to_character damage maybe_character =
+ case maybe_character of
+ Nothing -> Nothing
+
+ (Just char) ->
+ (Just
+ (Struct.Character.set_current_health
+ ((Struct.Character.get_current_health char) - damage)
+ char
+ )
+ )
--------------------------------------------------------------------------------
-- EXPORTED --------------------------------------------------------------------
--------------------------------------------------------------------------------
+apply_to_characters : (
+ Struct.Character.Ref ->
+ Struct.Character.Ref ->
+ Type ->
+ (Dict.Dict Struct.Character.Ref Struct.Character.Type) ->
+ (Dict.Dict Struct.Character.Ref Struct.Character.Type)
+ )
+apply_to_characters attacker_ref defender_ref attack characters =
+ if ((attack.order == Counter) == attack.parried)
+ then
+ (Dict.update
+ defender_ref
+ (apply_damage_to_character attack.damage)
+ characters
+ )
+ else
+ (Dict.update
+ attacker_ref
+ (apply_damage_to_character attack.damage)
+ characters
+ )
diff --git a/src/battlemap/src/Struct/Character.elm b/src/battlemap/src/Struct/Character.elm
index a55d8f7..d4f65f7 100644
--- a/src/battlemap/src/Struct/Character.elm
+++ b/src/battlemap/src/Struct/Character.elm
@@ -8,6 +8,7 @@ module Struct.Character exposing
get_icon_id,
get_portrait_id,
get_current_health,
+ set_current_health,
get_location,
set_location,
get_attributes,
@@ -114,6 +115,9 @@ get_portrait_id c = c.portrait
get_current_health : Type -> Int
get_current_health c = c.health
+set_current_health : Int -> Type -> Type
+set_current_health health c = {c | health = health}
+
get_location : Type -> Struct.Location.Type
get_location t = t.location
diff --git a/src/battlemap/src/Struct/ServerReply.elm b/src/battlemap/src/Struct/ServerReply.elm
index dcbd043..b986abe 100644
--- a/src/battlemap/src/Struct/ServerReply.elm
+++ b/src/battlemap/src/Struct/ServerReply.elm
@@ -16,6 +16,7 @@ type Type =
| AddCharacter Struct.Character.Type
| SetMap Struct.Battlemap.Type
| TurnResults (List Struct.TurnResult.Type)
+ | SetTimeline (List Struct.TurnResult.Type)
--------------------------------------------------------------------------------
-- LOCAL -----------------------------------------------------------------------
diff --git a/src/battlemap/src/Struct/TurnResult.elm b/src/battlemap/src/Struct/TurnResult.elm
index a7ca4a4..18a8dbd 100644
--- a/src/battlemap/src/Struct/TurnResult.elm
+++ b/src/battlemap/src/Struct/TurnResult.elm
@@ -4,16 +4,21 @@ module Struct.TurnResult exposing
Attack,
Movement,
WeaponSwitch,
+ apply_to_characters,
decoder
)
-- Elm -------------------------------------------------------------------------
+import Dict
+
import Json.Decode
-- Battlemap -------------------------------------------------------------------
+import Struct.Attack
+import Struct.Character
import Struct.Direction
import Struct.Location
-import Struct.Attack
+import Struct.WeaponSet
--------------------------------------------------------------------------------
-- TYPES -----------------------------------------------------------------------
@@ -45,6 +50,50 @@ type Type =
--------------------------------------------------------------------------------
-- LOCAL -----------------------------------------------------------------------
--------------------------------------------------------------------------------
+apply_movement_to_character : (
+ Movement ->
+ (Maybe Struct.Character.Type) ->
+ (Maybe Struct.Character.Type)
+ )
+apply_movement_to_character movement maybe_char =
+ case maybe_char of
+ Nothing -> Nothing
+
+ (Just char) ->
+ (Just (Struct.Character.set_location movement.destination char))
+
+apply_weapon_switch_to_character : (
+ (Maybe Struct.Character.Type) ->
+ (Maybe Struct.Character.Type)
+ )
+apply_weapon_switch_to_character maybe_char =
+ case maybe_char of
+ Nothing -> Nothing
+
+ (Just char) ->
+ (Just
+ (Struct.Character.set_weapons
+ (Struct.WeaponSet.switch_weapons
+ (Struct.Character.get_weapons char)
+ )
+ char
+ )
+ )
+
+apply_attack_to_characters : (
+ Attack ->
+ (Dict.Dict Struct.Character.Ref Struct.Character.Type) ->
+ (Dict.Dict Struct.Character.Ref Struct.Character.Type)
+ )
+apply_attack_to_characters attack characters =
+ (List.foldl
+ (Struct.Attack.apply_to_characters
+ (toString attack.attacker_index)
+ (toString attack.defender_index)
+ )
+ characters
+ attack.sequence
+ )
movement_decoder : (Json.Decode.Decoder Movement)
movement_decoder =
@@ -114,6 +163,30 @@ internal_decoder kind =
--------------------------------------------------------------------------------
-- EXPORTED --------------------------------------------------------------------
--------------------------------------------------------------------------------
+apply_to_characters : (
+ Type ->
+ (Dict.Dict Struct.Character.Ref Struct.Character.Type) ->
+ (Dict.Dict Struct.Character.Ref Struct.Character.Type)
+ )
+apply_to_characters turn_result characters =
+ case turn_result of
+ (Moved movement) ->
+ (Dict.update
+ (toString movement.character_index)
+ (apply_movement_to_character movement)
+ characters
+ )
+
+ (SwitchedWeapon weapon_switch) ->
+ (Dict.update
+ (toString weapon_switch.character_index)
+ (apply_weapon_switch_to_character)
+ characters
+ )
+
+ (Attacked attack) ->
+ (apply_attack_to_characters attack characters)
+
decoder : (Json.Decode.Decoder Type)
decoder =
(Json.Decode.field "t" Json.Decode.string)
diff --git a/src/battlemap/src/Update/HandleServerReply.elm b/src/battlemap/src/Update/HandleServerReply.elm
index 9319b38..85a3cc8 100644
--- a/src/battlemap/src/Update/HandleServerReply.elm
+++ b/src/battlemap/src/Update/HandleServerReply.elm
@@ -22,7 +22,6 @@ import Struct.UI
--------------------------------------------------------------------------------
-- LOCAL -----------------------------------------------------------------------
--------------------------------------------------------------------------------
-
add_character : (
Struct.Character.Type ->
(Struct.Model.Type, (Maybe Struct.Error.Type)) ->
@@ -62,16 +61,45 @@ add_to_timeline : (
add_to_timeline turn_results current_state =
case current_state of
(_, (Just _)) -> current_state
+
+ (model, _) ->
+ let
+ updated_characters =
+ (List.foldl
+ (Struct.TurnResult.apply_to_characters)
+ model.characters
+ turn_results
+ )
+ in
+ (
+ {model |
+ timeline =
+ (Array.append
+ model.timeline
+ (Array.fromList turn_results)
+ ),
+ ui =
+ (Struct.UI.set_displayed_tab
+ model.ui
+ Struct.UI.TimelineTab
+ ),
+ characters = updated_characters
+ },
+ Nothing
+ )
+
+set_timeline : (
+ (List Struct.TurnResult.Type) ->
+ (Struct.Model.Type, (Maybe Struct.Error.Type)) ->
+ (Struct.Model.Type, (Maybe Struct.Error.Type))
+ )
+set_timeline turn_results current_state =
+ case current_state of
+ (_, (Just _)) -> current_state
+
(model, _) ->
(
- {model |
- timeline =
- (Array.append
- model.timeline
- (Array.fromList turn_results)
- ),
- ui = (Struct.UI.set_displayed_tab model.ui Struct.UI.TimelineTab)
- },
+ {model | timeline = (Array.fromList turn_results)},
Nothing
)
@@ -91,6 +119,9 @@ apply_command command current_state =
(Struct.ServerReply.TurnResults results) ->
(add_to_timeline results current_state)
+ (Struct.ServerReply.SetTimeline timeline) ->
+ (set_timeline timeline current_state)
+
Struct.ServerReply.Okay -> current_state
--------------------------------------------------------------------------------