summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/battle/game-logic/btl_victory.erl')
-rw-r--r-- | src/battle/game-logic/btl_victory.erl | 136 |
1 files changed, 73 insertions, 63 deletions
diff --git a/src/battle/game-logic/btl_victory.erl b/src/battle/game-logic/btl_victory.erl index 42a5594..089af81 100644 --- a/src/battle/game-logic/btl_victory.erl +++ b/src/battle/game-logic/btl_victory.erl @@ -20,45 +20,45 @@ -spec mark_players_characters_as_defeated ( non_neg_integer(), - array:array(btl_character:type()) - ) -> {array:array(btl_character:type()), list(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) -> - shr_array_util:mapiff + orddict:fold ( - fun (Character) -> - (btl_character:get_player_index(Character) == PlayerIX) - end, - fun (Character) -> - btl_character:set_is_defeated(true, Character) + 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 add_db_query_to_mark_character_as_defeated - ( - non_neg_integer(), - btl_character_turn_update:type() - ) - -> btl_character_turn_update:type(). -add_db_query_to_mark_character_as_defeated (IX, Update) -> - btl_character_turn_update:add_to_db - ( - ataxic:update_field - ( - btl_battle:get_characters_field(), - ataxic_sugar:update_array_cell - ( - IX, - ataxic:update_field - ( - btl_character:get_is_defeated_field(), - ataxic:constant(true) - ) - ) - ), - Update - ). - -spec handle_player_defeat ( non_neg_integer(), @@ -72,48 +72,59 @@ handle_player_defeat (PlayerIX, Update) -> %% FIXME [FUNCTION: battle][MEDIUM]: The controlled character might slip %% through. - {UpdatedCharacters, ModifiedIXs} = + {UpdatedCharacters, AtaxicUpdates} = mark_players_characters_as_defeated(PlayerIX, Characters), - S1Update = - lists:foldl + S0Battle = btl_battle:set_characters(UpdatedCharacters, Battle), + S1Battle = + btl_battle:set_player ( - fun add_db_query_to_mark_character_as_defeated/2, - Update, - ModifiedIXs + PlayerIX, + btl_player:set_is_active + ( + false, + btl_battle:get_player(PlayerIX, S0Battle) + ), + S0Battle ), - %% TODO [FUNCTION: battle][MEDIUM]: Battle.player[PlayerIX].is_active <- - %% false - - UpdatedBattle = btl_battle:set_characters(UpdatedCharacters, Battle), - UpdatedData = btl_character_turn_data:set_battle(UpdatedBattle, Data), - S2Update = btl_character_turn_update:set_data(UpdatedData, S1Update), + UpdatedData = btl_character_turn_data:set_battle(S1Battle, Data), + S0Update = btl_character_turn_update:set_data(UpdatedData, Update), DBQuery = - ataxic:update_field + ataxic:sequence ( - btl_battle:get_players_field(), - ataxic_sugar:update_array_cell - ( - PlayerIX, + [ ataxic:update_field ( - btl_player:get_is_active_field(), - ataxic:constant(false) + 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) ) - ) + ] ), - S3Update = + S1Update = btl_character_turn_update:add_to_timeline ( btl_turn_result:new_player_lost(PlayerIX), DBQuery, - S2Update + S0Update ), - S3Update. + S1Update. -spec actually_handle_character_lost_health @@ -133,16 +144,16 @@ actually_handle_character_lost_health (CharIX, Update) -> optional -> %% Let's not assume there is a commander StillHasAliveChar = - shr_array_util:any_indexed + lists:any ( - fun (IX, Char) -> + fun ({IX, Char}) -> ( (CharacterPlayerIX == btl_character:get_player_index(Char)) and (IX /= CharIX) and btl_character:get_is_alive(Char) ) end, - Characters + orddict:to_list(Characters) ), case StillHasAliveChar of @@ -154,17 +165,16 @@ actually_handle_character_lost_health (CharIX, Update) -> target -> StillHasAliveChar = - shr_array_util:any_indexed + lists:any ( - fun (IX, Char) -> + fun ({IX, Char}) -> ( (CharacterPlayerIX == btl_character:get_player_index(Char)) and (IX /= CharIX) and btl_character:get_is_alive(Char) - and (btl_character:get_rank(Char) == target) ) end, - Characters + orddict:to_list(Characters) ), case StillHasAliveChar of |