From 0157365585c1201c53aa29cac84cd977de7434a1 Mon Sep 17 00:00:00 2001 From: Nathanael Sensfelder Date: Tue, 21 May 2019 16:39:12 +0200 Subject: Working on Attacks of Opportunity. --- .../mechanic/btl_turn_actions_management.erl | 55 +++++++++++++++++----- 1 file changed, 43 insertions(+), 12 deletions(-) (limited to 'src/battle/mechanic/btl_turn_actions_management.erl') 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), -- cgit v1.2.3-70-g09d2