summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/battle/mechanic/btl_next_turn.erl')
-rw-r--r--src/battle/mechanic/btl_next_turn.erl184
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.