summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/battle/mechanic')
-rw-r--r-- | src/battle/mechanic/btl_turn_actions_management.erl (renamed from src/battle/mechanic/btl_turn_actions.erl) | 21 | ||||
-rw-r--r-- | src/battle/mechanic/btl_turn_progression.erl | 53 | ||||
-rw-r--r-- | src/battle/mechanic/btl_victory_progression.erl (renamed from src/battle/mechanic/btl_victory.erl) | 156 |
3 files changed, 108 insertions, 122 deletions
diff --git a/src/battle/mechanic/btl_turn_actions.erl b/src/battle/mechanic/btl_turn_actions_management.erl index 489d9ac..41d9821 100644 --- a/src/battle/mechanic/btl_turn_actions.erl +++ b/src/battle/mechanic/btl_turn_actions_management.erl @@ -1,4 +1,4 @@ --module(btl_turn_actions). +-module(btl_turn_actions_management). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -9,20 +9,19 @@ -export ( [ - apply_requested_actions/2 + handle/2 ] ). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%% TODO: move this elsewhere --spec finalize_character +-spec deactivate_character ( btl_character_turn_update:type() ) -> btl_character_turn_update:type(). -finalize_character (Update) -> +deactivate_character (Update) -> Data = btl_character_turn_update:get_data(Update), Character = btl_character_turn_data:get_character(Data), @@ -50,13 +49,13 @@ finalize_character (Update) -> S1Update. --spec handle +-spec handle_action ( btl_battle_action:type(), btl_character_turn_update:type() ) -> btl_character_turn_update:type(). -handle (BattleAction, Update) -> +handle_action (BattleAction, Update) -> case btl_battle_action:get_category(BattleAction) of move -> btl_turn_actions_move:handle(BattleAction, Update); switch_weapon -> btl_turn_actions_switch_weapon:handle(Update); @@ -66,16 +65,16 @@ handle (BattleAction, Update) -> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec apply_requested_actions +-spec handle ( btl_character_turn_data:type(), btl_character_turn_request:type() ) -> btl_character_turn_update:type(). -apply_requested_actions (Data, Request) -> +handle (Data, Request) -> Actions = btl_character_turn_request:get_actions(Request), EmptyUpdate = btl_character_turn_update:new(Data), - PostActionsUpdate = lists:foldl(fun handle/2, EmptyUpdate, Actions), + PostActionsUpdate = lists:foldl(fun handle_action/2, EmptyUpdate, Actions), - finalize_character(PostActionsUpdate). + deactivate_character(PostActionsUpdate). diff --git a/src/battle/mechanic/btl_turn_progression.erl b/src/battle/mechanic/btl_turn_progression.erl index c28719e..a6443b8 100644 --- a/src/battle/mechanic/btl_turn_progression.erl +++ b/src/battle/mechanic/btl_turn_progression.erl @@ -16,52 +16,51 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec set_player_turn_to_next (btl_battle:type()) +-spec prepare_player_turn_for_next_player + ( + btl_battle:type() + ) -> {btl_battle:type(), ataxic:basic()}. -set_player_turn_to_next (Battle) -> +prepare_player_turn_for_next_player (Battle) -> Players = btl_battle:get_players(Battle), CurrentPlayerTurn = btl_battle:get_current_player_turn(Battle), - NextPlayerTurn = btl_player_turn:next(Players, CurrentPlayerTurn), - - UpdatedBattle = btl_battle:set_current_player_turn(NextPlayerTurn, Battle), + {UpdatedPlayerTurn, PlayerTurnAtaxiaUpdate} = + btl_player_turn:ataxia_next(Players, CurrentPlayerTurn), - DBQuery = - ataxic:update_field + {UpdatedBattle, BattleAtaxiaUpdate} = + btl_battle:ataxia_set_current_player_turn ( - btl_battle:get_current_player_turn_field(), - ataxic:constant(NextPlayerTurn) + UpdatedPlayerTurn, + PlayerTurnAtaxiaUpdate, + Battle ), - {UpdatedBattle, DBQuery}. + {UpdatedBattle, BattleAtaxiaUpdate}. --spec reset_next_player_timeline (btl_battle:type()) +-spec reset_next_player_timeline + ( + btl_battle:type() + ) -> {btl_battle:type(), btl_player:type(), ataxic:basic()}. reset_next_player_timeline (Battle) -> NextPlayerTurn = btl_battle:get_current_player_turn(Battle), NextPlayerIX = btl_player_turn:get_player_ix(NextPlayerTurn), NextPlayer = btl_battle:get_player(NextPlayerIX, Battle), - UpdatedNextPlayer = btl_player:reset_timeline(NextPlayer), - UpdatedBattle = - btl_battle:set_player(NextPlayerIX, UpdatedNextPlayer, Battle), + {UpdatedNextPlayer, PlayerAtaxiaUpdate} = + btl_player:ataxia_reset_timeline(NextPlayer), - DBQuery = - ataxic:update_field + {UpdatedBattle, BattleAtaxiaUpdate} = + btl_battle:ataxia_set_player ( - btl_battle:get_players_field(), - ataxic_sugar:update_orddict_element - ( - NextPlayerIX, - ataxic:update_field - ( - btl_player:get_timeline_field(), - ataxic:constant([]) - ) - ) + NextPlayerIX, + UpdatedNextPlayer, + PlayerAtaxiaUpdate, + Battle ), - {UpdatedBattle, UpdatedNextPlayer, DBQuery}. + {UpdatedBattle, UpdatedNextPlayer, BattleAtaxiaUpdate}. -spec activate_next_players_characters diff --git a/src/battle/mechanic/btl_victory.erl b/src/battle/mechanic/btl_victory_progression.erl index 089af81..f50718a 100644 --- a/src/battle/mechanic/btl_victory.erl +++ b/src/battle/mechanic/btl_victory_progression.erl @@ -1,4 +1,4 @@ --module(btl_victory). +-module(btl_victory_progression). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -16,48 +16,72 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - --spec mark_players_characters_as_defeated +-spec mark_characters_of_player_as_defeated ( non_neg_integer(), - orddict:orddict(non_neg_integer(), btl_character:type()) + btl_battle:type() ) -> { - orddict:orddict(non_neg_integer(), btl_character:type()), - list(ataxic:basic()) + btl_battle:type(), + ataxic:basic() }. -mark_players_characters_as_defeated (PlayerIX, Characters) -> - orddict:fold - ( - fun (IX, Character, {Dict, Updates}) -> - case (btl_character:get_player_index(Character) == PlayerIX) of - false -> {Dict, Updates}; - true -> - { - orddict:store - ( - IX, - btl_character:set_is_defeated(true, Character), - Dict - ), - [ - ataxic_sugar:update_orddict_element +mark_characters_of_player_as_defeated (PlayerIX, Battle) -> + AllCharacters = btl_battle:get_characters(Battle), + + {ResultingBattle, BattleAtaxiaUpdates} = + orddict:fold + ( + fun (IX, Character, {CurrentBattle, CurrentBattleAtaxiaUpdates}) -> + case (btl_character:get_player_index(Character) == PlayerIX) of + false -> {CurrentBattle, CurrentBattleAtaxiaUpdates}; + true -> + {UpdatedCharacter, CharacterAtaxiaUpdate} = + btl_character:ataxia_set_is_defeated(true, Character), + + {UpdatedBattle, NewBattleAtaxiaUpdate} = + btl_battle:ataxia_set_character ( IX, - ataxic:update_field - ( - btl_character:get_is_defeated_field(), - ataxic:constant(true) - ) - ) - ] - } - end - end, - {Characters, []}, - Characters - ). + UpdatedCharacter, + CharacterAtaxiaUpdate, + Battle + ), + + { + UpdatedBattle, + [NewBattleAtaxiaUpdate|CurrentBattleAtaxiaUpdates] + } + end + end, + {Battle, []}, + AllCharacters + ), + + {ResultingBattle, ataxic:optimize(ataxic:sequence(BattleAtaxiaUpdates))}. + +-spec mark_player_as_inactive + ( + non_neg_integer(), + btl_battle:type() + ) + -> {btl_battle:type(), ataxic:basic()}. +mark_player_as_inactive (PlayerIX, Battle) -> + Player = btl_battle:get_player(PlayerIX, Battle), + + {UpdatedPlayer, PlayerAtaxicUpdate} = + btl_player:ataxia_set_is_active(false, Player), + + {UpdateBattle, BattleAtaxicUpdate} = + btl_battle:ataxia_set_player + ( + PlayerIX, + UpdatedPlayer, + PlayerAtaxicUpdate, + Battle + ), + + {UpdateBattle, BattleAtaxicUpdate}. -spec handle_player_defeat ( @@ -68,65 +92,25 @@ mark_players_characters_as_defeated (PlayerIX, Characters) -> handle_player_defeat (PlayerIX, Update) -> Data = btl_character_turn_update:get_data(Update), Battle = btl_character_turn_data:get_battle(Data), - Characters = btl_battle:get_characters(Battle), - %% FIXME [FUNCTION: battle][MEDIUM]: The controlled character might slip - %% through. - {UpdatedCharacters, AtaxicUpdates} = - mark_players_characters_as_defeated(PlayerIX, Characters), - - S0Battle = btl_battle:set_characters(UpdatedCharacters, Battle), - S1Battle = - btl_battle:set_player - ( - PlayerIX, - btl_player:set_is_active - ( - false, - btl_battle:get_player(PlayerIX, S0Battle) - ), - S0Battle - ), + {S0Battle, BattleAtaxicUpdate0} = + mark_characters_of_player_as_defeated(PlayerIX, Battle), + {S1Battle, BattleAtaxicUpdate1} = + mark_player_as_inactive(PlayerIX, S0Battle), UpdatedData = btl_character_turn_data:set_battle(S1Battle, Data), S0Update = btl_character_turn_update:set_data(UpdatedData, Update), - DBQuery = - ataxic:sequence - ( - [ - ataxic:update_field - ( - btl_battle:get_players_field(), - ataxic_sugar:update_orddict_element - ( - PlayerIX, - ataxic:update_field - ( - btl_player:get_is_active_field(), - ataxic:constant(false) - ) - ) - ), - ataxic:update_field - ( - btl_battle:get_characters_field(), - ataxic:sequence(AtaxicUpdates) - ) - ] - ), - S1Update = btl_character_turn_update:add_to_timeline ( btl_turn_result:new_player_lost(PlayerIX), - DBQuery, + ataxia:sequence([BattleAtaxicUpdate0, BattleAtaxicUpdate1]), S0Update ), S1Update. - -spec actually_handle_character_lost_health ( non_neg_integer(), @@ -142,7 +126,10 @@ actually_handle_character_lost_health (CharIX, Update) -> case btl_character:get_rank(Character) of optional -> - %% Let's not assume there is a commander + %% Let's not assume there is a commander, meaning that we still have + %% to check if at least one character is alive, despite the fact that + %% if there is a commander, it being killed would have triggered + %% the defeat. StillHasAliveChar = lists:any ( @@ -164,7 +151,7 @@ actually_handle_character_lost_health (CharIX, Update) -> commander -> handle_player_defeat(CharacterPlayerIX, Update); target -> - StillHasAliveChar = + StillHasAliveTargetChar = lists:any ( fun ({IX, Char}) -> @@ -172,12 +159,13 @@ actually_handle_character_lost_health (CharIX, Update) -> (CharacterPlayerIX == btl_character:get_player_index(Char)) and (IX /= CharIX) and btl_character:get_is_alive(Char) + and (blt_character:get_rank(Char) == target) ) end, orddict:to_list(Characters) ), - case StillHasAliveChar of + case StillHasAliveTargetChar of true -> Update; _ -> handle_player_defeat(CharacterPlayerIX, Update) end @@ -202,7 +190,7 @@ handle_character_lost_health (CharIX, _Health, Update) -> S2Update = actually_handle_character_lost_health(CharIX, S1Update), S2Data = btl_character_turn_update:get_data(S2Update), - S3Data = btl_character_turn_data:refreshr_character(S2Data), + S3Data = btl_character_turn_data:refresh_character(S2Data), S3Update = btl_character_turn_update:set_data(S3Data, S2Update), S3Update. |