From 08fab636c981574a703baffad9ebb52ff4308f17 Mon Sep 17 00:00:00 2001 From: Nathanael Sensfelder Date: Sun, 20 Oct 2019 20:59:34 +0200 Subject: ... --- src/battle/mechanic/action/btl_action_attack.erl | 1 + src/battle/mechanic/action/btl_action_move.erl | 3 +- .../mechanic/action/btl_action_switch_weapon.erl | 1 + src/battle/mechanic/btl_actions_management.erl | 64 +++++----------------- src/battle/mechanic/condition/btl_cond_heal.erl | 22 +++----- src/battle/query/btl_character_turn.erl | 24 ++++---- src/battle/struct/btl_character_turn_update.erl | 32 ++++++++++- 7 files changed, 70 insertions(+), 77 deletions(-) diff --git a/src/battle/mechanic/action/btl_action_attack.erl b/src/battle/mechanic/action/btl_action_attack.erl index 91c886b..d155197 100644 --- a/src/battle/mechanic/action/btl_action_attack.erl +++ b/src/battle/mechanic/action/btl_action_attack.erl @@ -1129,6 +1129,7 @@ handle_attack_sequence ([AttackCategory|S0NextElements], Action, S0Update) -> ) -> btl_character_turn_update:type(). handle (Action, S0Update) -> + % TODO: assert target & actor are alive. S0Sequence = [first, counter, second], {S1Sequence, S1Update} = diff --git a/src/battle/mechanic/action/btl_action_move.erl b/src/battle/mechanic/action/btl_action_move.erl index 897525f..756ebca 100644 --- a/src/battle/mechanic/action/btl_action_move.erl +++ b/src/battle/mechanic/action/btl_action_move.erl @@ -450,6 +450,7 @@ commit_move (CharacterIX, Character, S0Update, Path, NewLocation) -> ) -> btl_character_turn_update:type(). handle (Action, S0Update) -> + % TODO: assert actor is alive. ActorIX = btl_action:get_actor_index(Action), S0Battle = btl_character_turn_update:get_battle(S0Update), @@ -526,7 +527,7 @@ handle (Action, S0Update) -> _ -> btl_character_turn_update:add_actions ( - false, + true, ( Interruptions ++ diff --git a/src/battle/mechanic/action/btl_action_switch_weapon.erl b/src/battle/mechanic/action/btl_action_switch_weapon.erl index 354c328..10348bc 100644 --- a/src/battle/mechanic/action/btl_action_switch_weapon.erl +++ b/src/battle/mechanic/action/btl_action_switch_weapon.erl @@ -28,6 +28,7 @@ ) -> btl_character_turn_update:type(). handle (Action, S0Update) -> + % TODO: assert actor is alive. ActorIX = btl_action:get_actor_index(Action), S0PerformSwitch = true, diff --git a/src/battle/mechanic/btl_actions_management.erl b/src/battle/mechanic/btl_actions_management.erl index 050ab4e..d7b85c5 100644 --- a/src/battle/mechanic/btl_actions_management.erl +++ b/src/battle/mechanic/btl_actions_management.erl @@ -9,65 +9,31 @@ -export ( [ - handle/2 + handle/1 ] ). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec perform_action - ( - btl_action:type(), - btl_character:type(), - btl_character_turn_update:type() - ) - -> - ( - {ok, btl_character_turn_update:type()} - | {events, list(btl_action:type()), btl_character_turn_update:type()} - ). -perform_action (Action, Character, Update) -> - case btl_action:get_category(Action) of - move -> btl_action_move:handle(Action, Character, Update); - attack -> btl_action_attack:handle(Action, Character, Update); - switch_weapon -> - btl_action_switch_weapon:handle(Action, Character, Update) - end. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec handle - ( - list(btl_action:type()), - btl_character_turn_update:type() - ) - -> btl_character_turn_update:type(). -handle ([], Update) -> Update; -handle ([BattleAction|FutureBattleActions], S0Update) -> - case btl_action:get_actor_index(BattleAction) of - -1 -> handle(FutureBattleActions, S0Update); - CharacterIX -> - S0Battle = btl_character_turn_update:get_battle(S0Update), - {Character, S1Battle} = - btl_battle:get_resolved_character(CharacterIX, S0Battle), - - S1Update = btl_character_turn_update:set_battle(S1Battle, S0Update), +-spec handle (btl_character_turn_update:type()) -> +btl_character_turn_update:type(). +handle (S0Update) -> + case btl_character_turn_update:pop_next_action(S0Update) of + none -> S0Update; + {ok, S1Update, Action} -> + S2Update = + case btl_action:get_category(Action) of + move -> btl_action_move:handle(Action, S1Update); + attack -> btl_action_attack:handle(Action, S1Update); + switch_weapon -> + btl_action_switch_weapon:handle(Action, S1Update) + end, - case btl_character:get_is_alive(Character) of - false -> handle(FutureBattleActions, S1Update); - true -> - case perform_action(BattleAction, Character, S1Update) of - {ok, S2Update} -> - handle(FutureBattleActions, S2Update); - {events, NewEvents, S2Update} -> - handle - ( - (NewEvents ++ FutureBattleActions), - S2Update - ) - end - end + handle(S2Update) end. diff --git a/src/battle/mechanic/condition/btl_cond_heal.erl b/src/battle/mechanic/condition/btl_cond_heal.erl index bbbbc96..897768a 100644 --- a/src/battle/mechanic/condition/btl_cond_heal.erl +++ b/src/battle/mechanic/condition/btl_cond_heal.erl @@ -62,18 +62,12 @@ apply_to_character (Condition, S0Character) -> (RemainingUses == 1) -> { - btl_condition:set_remaining_uses - ( - UpdatedRemainingUses, - Condition - ), remove, [{S1Character, CharacterUpdate}] }; (RemainingUses == 0) -> { - Condition, remove, [{S1Character, CharacterUpdate}] }; @@ -108,18 +102,16 @@ handle_context ({Trigger, ReadOnly, VolatileData}, Condition) -> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -spec apply ( - shr_condition:context(), - btl_condition:type(), - btl_character_turn_update:type() + shr_condition:context(any(), VolatileDataType), + btl_character_turn_update:type(), + btl_condition:type() ) -> { - shr_condition:context(), + VolatileDataType, btl_character_turn_update:type(), btl_condition:update_action() }. -apply (S0Context, S0Condition, S0Update) -> - S1Context = handle_context(S0Context, S0Condition), - - {TargetIX, Amount} = btl_condition:get_parameters(S0Condition), +apply (S0Context, S0Update, _S0Condition) -> + {_Trigger, _ReadOnlyData, VolatileData} = S0Context, - {S1Context, S0Update, none}. + {VolatileData, S0Update, none}. diff --git a/src/battle/query/btl_character_turn.erl b/src/battle/query/btl_character_turn.erl index 9534945..d0046b2 100644 --- a/src/battle/query/btl_character_turn.erl +++ b/src/battle/query/btl_character_turn.erl @@ -263,20 +263,24 @@ handle (Query) -> S0Update = fetch_data(Request), assert_user_permissions(S0Update, Request), - S1Update = btl_actions_management:handle - ( - btl_character_turn_request:get_actions(Request), - S0Update - ), - S2Update = deactivate_character(S1Update), - S3Update = update_timeline(S2Update), - S4Update = btl_turn_progression:handle(S3Update), + S1Update = + btl_character_turn_update:add_actions + ( + true, + btl_character_turn_request:get_actions(Request), + S0Update + ), + + S2Update = btl_actions_management:handle(S1Update), + S3Update = deactivate_character(S2Update), + S4Update = update_timeline(S3Update), + S5Update = btl_turn_progression:handle(S4Update), - commit_update(S4Update, Request), + commit_update(S5Update, Request), shr_security:unlock_queries(PlayerID), - generate_reply(S4Update); + generate_reply(S5Update); error -> jiffy:encode([shr_disconnected:generate()]) end. diff --git a/src/battle/struct/btl_character_turn_update.erl b/src/battle/struct/btl_character_turn_update.erl index 304f19d..e0d94f1 100644 --- a/src/battle/struct/btl_character_turn_update.erl +++ b/src/battle/struct/btl_character_turn_update.erl @@ -10,7 +10,8 @@ battle :: btl_battle:type(), character_ix :: non_neg_integer(), reversed_battle_updates :: list(ataxic:basic()), - timeline :: list(any()) + timeline :: list(any()), + actions :: list(btl_action:type()) } ). @@ -31,10 +32,13 @@ get_character_ix/1, get_battle_update/1, get_timeline/1, + pop_next_action/1, set_battle/2, ataxia_set_battle/3, + add_actions/3, + add_to_timeline/2 ] ). @@ -53,7 +57,8 @@ new (Battle, CharacterIX) -> battle = Battle, character_ix = CharacterIX, reversed_battle_updates = [], - timeline = [] + timeline = [], + actions = [] }. -spec get_battle (type()) -> btl_battle:type(). @@ -62,6 +67,18 @@ get_battle (Data) -> Data#type.battle. -spec get_character_ix (type()) -> non_neg_integer(). get_character_ix (Data) -> Data#type.character_ix. +-spec pop_next_action (type()) -> ({ok, type(), btl_action:type()} | none). +pop_next_action (Data) -> + case Data#type.actions of + [] -> none; + [Result|NextActions] -> + { + ok, + Data#type { actions = NextActions }, + Result + } + end. + -spec set_battle (btl_battle:type(), type()) -> type(). set_battle (Battle, Data) -> Data#type { battle = Battle }. @@ -79,6 +96,17 @@ ataxia_set_battle (Battle, BattleUpdate, Data) -> reversed_battle_updates = [BattleUpdate|Data#type.reversed_battle_updates] }. +-spec add_actions (boolean(), list(btl_action:type()), type()) -> type(). +add_actions (IsPrefix, Actions, Data) -> + Data#type + { + actions = + case IsPrefix of + true -> (Actions ++ Data#type.actions); + false -> (Data#type.actions ++ Actions) + end + }. + -spec add_to_timeline (btl_turn_result:type(), type()) -> type(). add_to_timeline (Item, Data) -> Data#type -- cgit v1.2.3-70-g09d2