| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src/battle/mechanic/btl_next_turn.erl')
| -rw-r--r-- | src/battle/mechanic/btl_next_turn.erl | 184 | 
1 files changed, 184 insertions, 0 deletions
| diff --git a/src/battle/mechanic/btl_next_turn.erl b/src/battle/mechanic/btl_next_turn.erl new file mode 100644 index 0000000..886916d --- /dev/null +++ b/src/battle/mechanic/btl_next_turn.erl @@ -0,0 +1,184 @@ +-module(btl_next_turn). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export +( +   [ +      update_if_needed/1 +   ] +). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec set_player_turn_to_next (btl_battle:type()) +   -> {btl_battle:type(), ataxic:basic()}. +set_player_turn_to_next (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), + +   DBQuery = +      ataxic:update_field +      ( +         btl_battle:get_current_player_turn_field(), +         ataxic:constant(NextPlayerTurn) +      ), + +   {UpdatedBattle, DBQuery}. + +-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), + +   DBQuery = +      ataxic:update_field +      ( +         btl_battle:get_players_field(), +         ataxic_sugar:update_orddict_element +         ( +            NextPlayerIX, +            ataxic:update_field +            ( +               btl_player:get_timeline_field(), +               ataxic:constant([]) +            ) +         ) +      ), + +   {UpdatedBattle, UpdatedNextPlayer, DBQuery}. + + +-spec activate_next_players_characters (btl_battle:type(), btl_player:type()) +   -> {btl_battle:type(), ataxic:basic()}. +activate_next_players_characters (Battle, NextPlayer) -> +   NextPlayerIX = btl_player:get_index(NextPlayer), +   Characters = btl_battle:get_characters(Battle), + +   {UpdatedCharacters, AtaxicUpdates} = +      orddict:fold +      ( +         fun (IX, Character, {Prev, Updates}) -> +            case (btl_character:get_player_index(Character) == NextPlayerIX) of +               true -> +                  { +                     orddict:store +                     ( +                        IX, +                        btl_character:set_is_active(true, Character), +                        Prev +                     ), +                     [ +                        ataxic_sugar:update_orddict_element +                        ( +                           IX, +                           ataxic:update_field +                           ( +                              btl_character:get_is_active_field(), +                              ataxic:constant(true) +                           ) +                        )|Updates +                     ] +                  }; + +               false -> {Prev, Updates} +            end +         end, +         {Characters, []}, +         Characters +      ), + +   DBQuery = +      ataxic:update_field +      ( +         btl_battle:get_characters_field(), +         ataxic:sequence(AtaxicUpdates) +      ), + +   UpdatedBattle = btl_battle:set_characters(UpdatedCharacters, Battle), + +   {UpdatedBattle, DBQuery}. + +-spec update +   ( +      btl_character_turn_update:type() +   ) +   -> btl_character_turn_update:type(). +update (Update) -> +   Data = btl_character_turn_update:get_data(Update), +   Battle = btl_character_turn_data:get_battle(Data), + +   {S0Battle, DBQuery0} = set_player_turn_to_next(Battle), +   {S1Battle, NextPlayer, DBQuery1} = reset_next_player_timeline(S0Battle), +   {S2Battle, DBQuery2} = +      activate_next_players_characters(S1Battle, NextPlayer), + +   S0Data = btl_character_turn_data:set_battle(S2Battle, Data), +   S0Update = +      btl_character_turn_update:add_to_timeline +      ( +         btl_turn_result:new_player_turn_started +         ( +            btl_player:get_index(NextPlayer) +         ), +         DBQuery0, +         Update +      ), + +   S1Update = btl_character_turn_update:set_data(S0Data, S0Update), + +   S2Update = +      lists:foldl +      ( +         fun btl_character_turn_update:add_to_db/2, +         S1Update, +         [DBQuery1,DBQuery2] +      ), + +   S2Update. + +-spec requires_update (btl_character_turn_update:type()) -> boolean(). +requires_update (Update) -> +   Data = btl_character_turn_update:get_data(Update), +   Battle = btl_character_turn_data:get_battle(Data), +   Characters = btl_battle:get_characters(Battle), + +   (not +      (lists:any +         ( +            fun ({_IX, Char}) -> +               btl_character:get_is_active(Char) +            end, +            orddict:to_list(Characters) +         ) +      ) +   ). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec update_if_needed +   ( +      btl_character_turn_update:type() +   ) +   -> btl_character_turn_update:type(). +update_if_needed (Update) -> +   case requires_update(Update) of +      true -> update(Update); +      _ -> Update +   end. | 


