From 4fb024b4ee52ccbb9f25b17eaa606ce0b5e0296a Mon Sep 17 00:00:00 2001 From: nsensfel Date: Thu, 25 Apr 2019 14:19:44 +0200 Subject: Merging btl_character_turn_{data,update}... --- src/battle/mechanic/btl_turn_actions.erl | 81 -------- .../mechanic/btl_turn_actions_management.erl | 80 ++++++++ src/battle/mechanic/btl_turn_progression.erl | 53 +++--- src/battle/mechanic/btl_victory.erl | 208 --------------------- src/battle/mechanic/btl_victory_progression.erl | 196 +++++++++++++++++++ src/battle/struct/btl_character_turn_data.erl | 127 ------------- src/battle/struct/btl_character_turn_update.erl | 208 +++++++++++++++++---- 7 files changed, 472 insertions(+), 481 deletions(-) delete mode 100644 src/battle/mechanic/btl_turn_actions.erl create mode 100644 src/battle/mechanic/btl_turn_actions_management.erl delete mode 100644 src/battle/mechanic/btl_victory.erl create mode 100644 src/battle/mechanic/btl_victory_progression.erl delete mode 100644 src/battle/struct/btl_character_turn_data.erl diff --git a/src/battle/mechanic/btl_turn_actions.erl b/src/battle/mechanic/btl_turn_actions.erl deleted file mode 100644 index 489d9ac..0000000 --- a/src/battle/mechanic/btl_turn_actions.erl +++ /dev/null @@ -1,81 +0,0 @@ --module(btl_turn_actions). -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export -( - [ - apply_requested_actions/2 - ] -). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%% TODO: move this elsewhere --spec finalize_character - ( - btl_character_turn_update:type() - ) - -> btl_character_turn_update:type(). -finalize_character (Update) -> - Data = btl_character_turn_update:get_data(Update), - Character = btl_character_turn_data:get_character(Data), - - DisabledCharacter = btl_character:set_is_active(false, Character), - UpdatedData = btl_character_turn_data:set_character(DisabledCharacter, Data), - FinalizedData = btl_character_turn_data:clean_battle(UpdatedData), - - DBQuery = - ataxic:update_field - ( - btl_battle:get_characters_field(), - ataxic_sugar:update_orddict_element - ( - btl_character_turn_data:get_character_ix(Data), - ataxic:update_field - ( - btl_character:get_is_active_field(), - ataxic:constant(false) - ) - ) - ), - - S0Update = btl_character_turn_update:set_data(FinalizedData, Update), - S1Update = btl_character_turn_update:add_to_db(DBQuery, S0Update), - - S1Update. - --spec handle -( - btl_battle_action:type(), - btl_character_turn_update:type() -) --> btl_character_turn_update:type(). -handle (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); - attack -> btl_turn_actions_attack:handle(BattleAction, Update) - end. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec apply_requested_actions - ( - btl_character_turn_data:type(), - btl_character_turn_request:type() - ) - -> btl_character_turn_update:type(). -apply_requested_actions (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), - - finalize_character(PostActionsUpdate). diff --git a/src/battle/mechanic/btl_turn_actions_management.erl b/src/battle/mechanic/btl_turn_actions_management.erl new file mode 100644 index 0000000..41d9821 --- /dev/null +++ b/src/battle/mechanic/btl_turn_actions_management.erl @@ -0,0 +1,80 @@ +-module(btl_turn_actions_management). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export +( + [ + handle/2 + ] +). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec deactivate_character + ( + btl_character_turn_update:type() + ) + -> btl_character_turn_update:type(). +deactivate_character (Update) -> + Data = btl_character_turn_update:get_data(Update), + Character = btl_character_turn_data:get_character(Data), + + DisabledCharacter = btl_character:set_is_active(false, Character), + UpdatedData = btl_character_turn_data:set_character(DisabledCharacter, Data), + FinalizedData = btl_character_turn_data:clean_battle(UpdatedData), + + DBQuery = + ataxic:update_field + ( + btl_battle:get_characters_field(), + ataxic_sugar:update_orddict_element + ( + btl_character_turn_data:get_character_ix(Data), + ataxic:update_field + ( + btl_character:get_is_active_field(), + ataxic:constant(false) + ) + ) + ), + + S0Update = btl_character_turn_update:set_data(FinalizedData, Update), + S1Update = btl_character_turn_update:add_to_db(DBQuery, S0Update), + + S1Update. + +-spec handle_action +( + btl_battle_action:type(), + btl_character_turn_update:type() +) +-> btl_character_turn_update:type(). +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); + attack -> btl_turn_actions_attack:handle(BattleAction, Update) + end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec handle + ( + btl_character_turn_data:type(), + btl_character_turn_request:type() + ) + -> btl_character_turn_update:type(). +handle (Data, Request) -> + Actions = btl_character_turn_request:get_actions(Request), + + EmptyUpdate = btl_character_turn_update:new(Data), + PostActionsUpdate = lists:foldl(fun handle_action/2, EmptyUpdate, Actions), + + 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.erl deleted file mode 100644 index 089af81..0000000 --- a/src/battle/mechanic/btl_victory.erl +++ /dev/null @@ -1,208 +0,0 @@ --module(btl_victory). -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export -( - [ - handle_character_lost_health/3 - ] -). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - --spec mark_players_characters_as_defeated - ( - non_neg_integer(), - orddict:orddict(non_neg_integer(), btl_character:type()) - ) - -> - { - orddict:orddict(non_neg_integer(), btl_character:type()), - list(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 - ( - IX, - ataxic:update_field - ( - btl_character:get_is_defeated_field(), - ataxic:constant(true) - ) - ) - ] - } - end - end, - {Characters, []}, - Characters - ). - --spec handle_player_defeat - ( - non_neg_integer(), - btl_character_turn_update:type() - ) - -> btl_character_turn_update:type(). -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 - ), - - 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, - S0Update - ), - - S1Update. - - --spec actually_handle_character_lost_health - ( - non_neg_integer(), - btl_character_turn_update:type() - ) - -> btl_character_turn_update:type(). -actually_handle_character_lost_health (CharIX, Update) -> - Data = btl_character_turn_update:get_data(Update), - Battle = btl_character_turn_data:get_battle(Data), - Character = btl_battle:get_character(CharIX, Battle), - Characters = btl_battle:get_characters(Battle), - CharacterPlayerIX = btl_character:get_player_index(Character), - - case btl_character:get_rank(Character) of - optional -> - %% Let's not assume there is a commander - StillHasAliveChar = - lists:any - ( - fun ({IX, Char}) -> - ( - (CharacterPlayerIX == btl_character:get_player_index(Char)) - and (IX /= CharIX) - and btl_character:get_is_alive(Char) - ) - end, - orddict:to_list(Characters) - ), - - case StillHasAliveChar of - true -> Update; - _ -> handle_player_defeat(CharacterPlayerIX, Update) - end; - - commander -> handle_player_defeat(CharacterPlayerIX, Update); - - target -> - StillHasAliveChar = - lists:any - ( - fun ({IX, Char}) -> - ( - (CharacterPlayerIX == btl_character:get_player_index(Char)) - and (IX /= CharIX) - and btl_character:get_is_alive(Char) - ) - end, - orddict:to_list(Characters) - ), - - case StillHasAliveChar of - true -> Update; - _ -> handle_player_defeat(CharacterPlayerIX, Update) - end - end. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec handle_character_lost_health - ( - non_neg_integer(), - integer(), - btl_character_turn_update:type() - ) - -> btl_character_turn_update:type(). -handle_character_lost_health (_, Health, Update) when (Health > 0) -> Update; -handle_character_lost_health (CharIX, _Health, Update) -> - Data = btl_character_turn_update:get_data(Update), - S1Data = btl_character_turn_data:clean_battle(Data), - S1Update = btl_character_turn_update:set_data(S1Data, 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), - S3Update = btl_character_turn_update:set_data(S3Data, S2Update), - - S3Update. diff --git a/src/battle/mechanic/btl_victory_progression.erl b/src/battle/mechanic/btl_victory_progression.erl new file mode 100644 index 0000000..f50718a --- /dev/null +++ b/src/battle/mechanic/btl_victory_progression.erl @@ -0,0 +1,196 @@ +-module(btl_victory_progression). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export +( + [ + handle_character_lost_health/3 + ] +). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec mark_characters_of_player_as_defeated + ( + non_neg_integer(), + btl_battle:type() + ) + -> + { + btl_battle:type(), + ataxic:basic() + }. +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, + 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 + ( + non_neg_integer(), + btl_character_turn_update:type() + ) + -> btl_character_turn_update:type(). +handle_player_defeat (PlayerIX, Update) -> + Data = btl_character_turn_update:get_data(Update), + Battle = btl_character_turn_data:get_battle(Data), + + {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), + + S1Update = + btl_character_turn_update:add_to_timeline + ( + btl_turn_result:new_player_lost(PlayerIX), + ataxia:sequence([BattleAtaxicUpdate0, BattleAtaxicUpdate1]), + S0Update + ), + + S1Update. + +-spec actually_handle_character_lost_health + ( + non_neg_integer(), + btl_character_turn_update:type() + ) + -> btl_character_turn_update:type(). +actually_handle_character_lost_health (CharIX, Update) -> + Data = btl_character_turn_update:get_data(Update), + Battle = btl_character_turn_data:get_battle(Data), + Character = btl_battle:get_character(CharIX, Battle), + Characters = btl_battle:get_characters(Battle), + CharacterPlayerIX = btl_character:get_player_index(Character), + + case btl_character:get_rank(Character) of + optional -> + %% 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 + ( + fun ({IX, Char}) -> + ( + (CharacterPlayerIX == btl_character:get_player_index(Char)) + and (IX /= CharIX) + and btl_character:get_is_alive(Char) + ) + end, + orddict:to_list(Characters) + ), + + case StillHasAliveChar of + true -> Update; + _ -> handle_player_defeat(CharacterPlayerIX, Update) + end; + + commander -> handle_player_defeat(CharacterPlayerIX, Update); + + target -> + StillHasAliveTargetChar = + lists:any + ( + fun ({IX, Char}) -> + ( + (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 StillHasAliveTargetChar of + true -> Update; + _ -> handle_player_defeat(CharacterPlayerIX, Update) + end + end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec handle_character_lost_health + ( + non_neg_integer(), + integer(), + btl_character_turn_update:type() + ) + -> btl_character_turn_update:type(). +handle_character_lost_health (_, Health, Update) when (Health > 0) -> Update; +handle_character_lost_health (CharIX, _Health, Update) -> + Data = btl_character_turn_update:get_data(Update), + S1Data = btl_character_turn_data:clean_battle(Data), + S1Update = btl_character_turn_update:set_data(S1Data, Update), + + S2Update = actually_handle_character_lost_health(CharIX, S1Update), + + S2Data = btl_character_turn_update:get_data(S2Update), + S3Data = btl_character_turn_data:refresh_character(S2Data), + S3Update = btl_character_turn_update:set_data(S3Data, S2Update), + + S3Update. diff --git a/src/battle/struct/btl_character_turn_data.erl b/src/battle/struct/btl_character_turn_data.erl deleted file mode 100644 index bd6fcac..0000000 --- a/src/battle/struct/btl_character_turn_data.erl +++ /dev/null @@ -1,127 +0,0 @@ --module(btl_character_turn_data). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --record -( - type, - { - dirty :: boolean(), - battle :: btl_battle:type(), - character :: btl_character:type(), - character_ix :: non_neg_integer() - } -). - --opaque type() :: #type{}. - --export_type([type/0]). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export -( - [ - new/2, - - get_battle_is_dirty/1, - get_battle/1, - get_character/1, - get_character_ix/1, - - set_battle/2, - set_character/2 - ] -). - --export -( - [ - clean_battle/1, - refresh_character/1 - ] -). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec resolve_character_at - ( - btl_battle:type(), - non_neg_integer() - ) -> btl_charater:type(). -resolve_character_at (Battle, CharacterIX) -> - CharacterRef = btl_battle:get_character(CharacterIX, Battle), - Location = btl_character:get_location(CharacterRef), - Map = btl_battle:get_map(Battle), - - TileInstance = shr_map:get_tile_instance(Location, Map), - TileClassID = shr_tile_instance:get_tile_id(TileInstance), - Tile = shr_tile:from_id(TileClassID), - TileOmnimods = shr_tile:get_omnimods(Tile), - - Character = btl_character:resolve(TileOmnimods, CharacterRef), - - Character. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec new (btl_battle:type(), non_neg_integer()) -> type(). -new (Battle, CharacterIX) -> - - #type - { - dirty = false, - battle = Battle, - character = resolve_character_at(Battle, CharacterIX), - character_ix = CharacterIX - }. - --spec get_battle_is_dirty (type()) -> boolean(). -get_battle_is_dirty (Data) -> Data#type.dirty. - --spec get_battle (type()) -> btl_battle:type(). -get_battle (Data) -> Data#type.battle. - --spec get_character (type()) -> btl_character:type(). -get_character (Data) -> Data#type.character. - --spec get_character_ix (type()) -> non_neg_integer(). -get_character_ix (Data) -> Data#type.character_ix. - --spec set_battle (btl_battle:type(), type()) -> type(). -set_battle (Battle, Data) -> - Data#type{ battle = Battle }. - --spec set_character (btl_character:type(), type()) -> type(). -set_character (Character, Data) -> - Data#type - { - dirty = true, - character = Character - }. - --spec clean_battle (type()) -> type(). -clean_battle (Data) -> - Data#type - { - dirty = false, - battle = - btl_battle:set_character - ( - Data#type.character_ix, - btl_character:to_unresolved(Data#type.character), - Data#type.battle - ) - }. - --spec refresh_character (type()) -> type(). -refresh_character (Data) -> - Data#type - { - dirty = false, - character = resolve_character_at(Data#type.battle, Data#type.character_ix) - }. diff --git a/src/battle/struct/btl_character_turn_update.erl b/src/battle/struct/btl_character_turn_update.erl index 85152b0..6649eb2 100644 --- a/src/battle/struct/btl_character_turn_update.erl +++ b/src/battle/struct/btl_character_turn_update.erl @@ -7,9 +7,18 @@ ( type, { - data :: btl_character_turn_data:type(), - timeline :: list(any()), - db :: list(ataxic:basic()) + battle_is_outdated :: boolean(), + character_is_outdated :: boolean(), + + battle :: btl_battle:type(), + reversed_battle_updates :: list(ataxic:basic()), + + character :: btl_character:type(), + reversed_character_updates :: list(ataxic:basic()), + + character_ix :: non_neg_integer(), + + reversed_timeline :: list(any()) } ). @@ -23,63 +32,186 @@ -export ( [ - new/1, + new/2, + + get_battle/1, + get_character/1, - get_data/1, + get_character_ix/1, + get_battle_update/1, get_timeline/1, - get_db/1, - set_data/2, - add_to_timeline/3, - add_to_db/2 + set_battle/3, + set_character/2, + + ataxia_set_battle/4, + ataxia_set_character/3, + + add_to_timeline/2 ] ). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec resolve_character_at + ( + btl_battle:type(), + non_neg_integer() + ) -> btl_charater:type(). +resolve_character_at (Battle, CharacterIX) -> + CharacterRef = btl_battle:get_character(CharacterIX, Battle), + Location = btl_character:get_location(CharacterRef), + Map = btl_battle:get_map(Battle), + + TileInstance = shr_map:get_tile_instance(Location, Map), + TileClassID = shr_tile_instance:get_tile_id(TileInstance), + Tile = shr_tile:from_id(TileClassID), + TileOmnimods = shr_tile:get_omnimods(Tile), + + Character = btl_character:resolve(TileOmnimods, CharacterRef), + + Character. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec new (btl_character_turn_data:type()) -> type(). -new (Data) -> +-spec new (btl_battle:type(), non_neg_integer()) -> type(). +new (Battle, CharacterIX) -> + #type { - data = Data, - timeline = [], - db = [] + character_is_outdated = false, + battle_is_outdated = false, + + battle = Battle, + reversed_battle_updates = [], + + character = resolve_character_at(Battle, CharacterIX), + reversed_character_updates = [], + + character_ix = CharacterIX, + + reversed_timeline = [] }. --spec get_data (type()) -> btl_character_turn_data:type(). -get_data (Update) -> Update#type.data. +-spec get_battle (type()) -> {type(), btl_battle:type()}. +get_battle (Data) -> + case Data#type.battle_is_outdated of + false -> {Data, Data#type.battle}; + true -> + {UpdatedBattle, BattleAtaxiaUpdate} = + btl_battle:ataxia_set_character + ( + Data#type.character_ix, + Data#type.character, + ataxic:sequence + ( + lists:reverse(Data#type.reversed_character_updates) + ), + Data#type.battle + ), --spec get_timeline (type()) -> list(any()). -get_timeline (Update) -> Update#type.timeline. + { + Data#type + { + battle_is_outdated = false, + battle = UpdatedBattle, + reversed_battle_updates = + [ + BattleAtaxiaUpdate + |Data#type.reversed_battle_updates + ], + reversed_character_updates = [] + }, + UpdatedBattle + } + end. + +-spec get_character (type()) -> {type(), btl_character:type()}. +get_character (Data) -> + case Data#type.character_is_outdated of + false -> {Data, Data#type.character}; + true -> + { + Data#type + { + character_is_outdated = false, + character = + resolve_character_at + ( + Data#type.character_ix, + Data#type.battle + ), + reversed_character_updates = [] + } + } + end. --spec get_db (type()) -> list(ataxic:basic()). -get_db (Update) -> Update#type.db. +-spec get_character_ix (type()) -> non_neg_integer(). +get_character_ix (Data) -> Data#type.character_ix. --spec set_data (btl_character_turn_data:type(), type()) -> type(). -set_data (Data, Update) -> - Update#type{ data = Data}. +-spec set_battle (btl_battle:type(), boolean(), type()) -> type(). +set_battle (Battle, CouldAffectCharacter, Data) -> + Data#type + { + character_is_outdated = CouldAffectCharacter, + battle = Battle + }. --spec add_to_timeline +-spec ataxia_set_battle ( - btl_turn_result:type(), + btl_battle:type(), + boolean(), ataxic:basic(), type() - ) -> type(). -add_to_timeline (Item, DBUpdate, Update) -> - add_to_db + ) + -> type(). +ataxia_set_battle (Battle, CouldAffectCharacter, BattleUpdate, Data) -> + Data#type + { + character_is_outdated = CouldAffectCharacter, + battle = Battle, + reversed_battle_updates = [BattleUpdate|Data#type.reversed_battle_updates] + }. + +-spec set_character (btl_character:type(), type()) -> type(). +set_character (Character, Data) -> + Data#type + { + battle_is_outdated = true, + character = Character + }. + +-spec ataxia_set_character ( - DBUpdate, - Update#type - { - timeline = [btl_turn_result:encode(Item)|Update#type.timeline] - } - ). - --spec add_to_db (ataxic:basic(), type()) -> type(). -add_to_db (Item, Update) -> - Update#type{ db = [Item|Update#type.db] }. + btl_character:type(), + ataxia:basic(), + type() + ) + -> type(). +ataxia_set_character (Character, CharacterUpdate, Data) -> + Data#type + { + battle_is_outdated = true, + character = Character, + reversed_character_updates = + [CharacterUpdate|Data#type.reversed_character_updates] + }. + +-spec add_to_timeline (btl_turn_result:type(), type()) -> type(). +add_to_timeline (Item, Data) -> + Data#type + { + reversed_timeline = + [btl_turn_result:encode(Item)|Data#type.reversed_timeline] + }. + +-spec get_timeline (type()) -> list(any()). +get_timeline (Data) -> lists:reverse(Data#type.reversed_timeline). + +-spec get_battle_update (type()) -> ataxic:basic(). +get_battle_update (Data) -> + {ActualData, _Battle} = get_battle(Data), + + ataxic:sequence(lists:reverse(ActualData#type.reversed_battle_updates)). -- cgit v1.2.3-70-g09d2