summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2019-05-21 16:39:12 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2019-05-21 16:39:12 +0200
commit0157365585c1201c53aa29cac84cd977de7434a1 (patch)
tree44c301187f2809be974dbe8afcbc1032002ec1e8 /src/battle/mechanic/btl_turn_actions_management.erl
parentfb4159dbfb49f71d23c2616e7b8c9be453953883 (diff)
Working on Attacks of Opportunity.
Diffstat (limited to 'src/battle/mechanic/btl_turn_actions_management.erl')
-rw-r--r--src/battle/mechanic/btl_turn_actions_management.erl55
1 files changed, 43 insertions, 12 deletions
diff --git a/src/battle/mechanic/btl_turn_actions_management.erl b/src/battle/mechanic/btl_turn_actions_management.erl
index d33fbad..eefe812 100644
--- a/src/battle/mechanic/btl_turn_actions_management.erl
+++ b/src/battle/mechanic/btl_turn_actions_management.erl
@@ -37,17 +37,48 @@ deactivate_character (Update) ->
S1Update.
--spec handle_action
-(
- btl_action:type(),
- btl_character_turn_update:type()
-)
--> btl_character_turn_update:type().
-handle_action (BattleAction, Update) ->
- case btl_action:get_category(BattleAction) of
- move -> btl_turn_actions_move:handle(BattleAction, Update);
- switch_weapon -> btl_turn_actions_switch_weapon:handle(Update);
- attack -> btl_turn_actions_attack:handle(BattleAction, Update)
+-spec main_character_is_alive
+ (
+ btl_character_turn_update:type()
+ )
+ -> {boolean(), btl_character_turn_update:type()}.
+main_character_is_alive (Update) ->
+ {S0Update, MainCharacter} = btl_character_turn_update:get_character(Update),
+ {btl_character:get_is_alive(MainCharacter), S0Update}.
+
+-spec handle_actions
+ (
+ list(btl_action:type()),
+ btl_character_turn_update:type()
+ )
+ -> btl_character_turn_update:type().
+handle_actions ([], Update) -> Update;
+handle_actions ([BattleAction|FutureBattleActions], Update) ->
+ {MainCharacterIsAlive, S0Update} = main_character_is_alive(Update),
+
+ ActionResult =
+ case {MainCharacterIsAlive, btl_action:get_category(BattleAction)} of
+ {false, _} -> {ok, S0Update};
+ {true, move} -> btl_turn_actions_move:handle(BattleAction, S0Update);
+ {true, switch_weapon} ->
+ btl_turn_actions_switch_weapon:handle(S0Update);
+ {true, attack} ->
+ btl_turn_actions_attack:handle(BattleAction, S0Update);
+ {true, interrupted_move} ->
+ btl_turn_actions_move:handle(BattleAction, S0Update);
+ {true, defend} ->
+ % TODO: Attack of Opportunity
+ Update
+ end,
+
+ case ActionResult of
+ {ok, NewUpdate} -> handle_actions(FutureBattleActions, NewUpdate);
+ {events, NewEvents, NewUpdate} ->
+ handle_actions
+ (
+ (NewEvents ++ FutureBattleActions),
+ NewUpdate
+ )
end.
-spec update_timeline
@@ -98,7 +129,7 @@ update_timeline (Update) ->
handle (Update, Request) ->
Actions = btl_character_turn_request:get_actions(Request),
- S0Update = lists:foldl(fun handle_action/2, Update, Actions),
+ S0Update = handle_actions(Actions, Update),
S1Update = deactivate_character(S0Update),
S2Update = update_timeline(S1Update),
S3Update = btl_turn_progression:handle(S2Update),