summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/battlemap/game-logic/bm_next_turn.erl')
-rw-r--r--src/battlemap/game-logic/bm_next_turn.erl135
1 files changed, 135 insertions, 0 deletions
diff --git a/src/battlemap/game-logic/bm_next_turn.erl b/src/battlemap/game-logic/bm_next_turn.erl
new file mode 100644
index 0000000..3628111
--- /dev/null
+++ b/src/battlemap/game-logic/bm_next_turn.erl
@@ -0,0 +1,135 @@
+-module(bm_next_turn).
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-export
+(
+ [
+ update_if_needed/1
+ ]
+).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec set_player_turn_to_next (bm_battle:type()) -> bm_battle:type().
+set_player_turn_to_next (Battle) ->
+ Players = bm_battle:get_players(Battle),
+ CurrentPlayerTurn = bm_battle:get_current_player_turn(Battle),
+
+ NextPlayerTurn = bm_player_turn:next(array:size(Players), CurrentPlayerTurn),
+
+ bm_battle:set_current_player_turn(NextPlayerTurn, Battle).
+
+-spec reset_next_player_timeline
+ (
+ bm_battle:type()
+ )
+ -> {bm_battle:type(), bm_player:type()}.
+reset_next_player_timeline (Battle) ->
+ NextPlayerTurn = bm_battle:get_current_player_turn(Battle),
+ NextPlayerIX = bm_player_turn:get_player_ix(NextPlayerTurn),
+ NextPlayer = bm_battle:get_player(NextPlayerIX, Battle),
+
+ UpdatedNextPlayer = bm_player:reset_timeline(NextPlayer),
+ UpdatedBattle =
+ bm_battle:set_player(NextPlayerIX, UpdatedNextPlayer, Battle),
+
+ {UpdatedBattle, UpdatedNextPlayer}.
+
+
+-spec activate_next_players_characters
+ (
+ bm_battle:type(),
+ bm_player:type()
+ )
+ -> {bm_battle:type(), list(non_neg_integer())}.
+activate_next_players_characters (Battle, NextPlayer) ->
+ NextPlayerID = bm_player:get_id(NextPlayer),
+ Characters = bm_battle:get_characters(Battle),
+
+ {UpdatedCharacters, ModifiedIXs} =
+ array_util:mapiff
+ (
+ fun (Character) ->
+ (bm_character:get_owner_id(Character) == NextPlayerID)
+ end,
+ fun (Character) ->
+ bm_character:set_is_active(true, Character)
+ end,
+ Characters
+ ),
+
+ UpdatedBattle = bm_battle:set_characters(UpdatedCharacters, Battle),
+
+ {UpdatedBattle, ModifiedIXs}.
+
+-spec add_activation_updates
+ (
+ list(non_neg_integer()),
+ bm_character_turn_update:type()
+ )
+ -> bm_character_turn_update:type().
+add_activation_updates ([], Update) ->
+ Update;
+add_activation_updates ([IX|NextIXs], Update) ->
+ add_activation_updates
+ (
+ NextIXs,
+ bm_character_turn_update:add_to_db
+ (
+ sh_db_query:update_indexed
+ (
+ bm_battle:get_characters_field(),
+ IX,
+ [sh_db_query:set_field(bm_character:get_active_field(), true)]
+ ),
+ Update
+ )
+ ).
+
+-spec update
+ (
+ bm_character_turn_update:type()
+ )
+ -> bm_character_turn_update:type().
+update (Update) ->
+ Data = bm_character_turn_update:get_data(Update),
+ Battle = bm_character_turn_data:get_battle(Data),
+
+ S0Battle = set_player_turn_to_next(Battle),
+ {S1Battle, NextPlayer} = reset_next_player_timeline(S0Battle),
+ {S2Battle, ActivatedCharactersIX} =
+ activate_next_players_characters(S1Battle, NextPlayer),
+
+ S0Update = add_activation_updates(ActivatedCharactersIX, Update),
+
+ UpdatedData = bm_character_turn_data:set_battle(S2Battle, Data),
+
+ bm_character_turn_update:set_data(UpdatedData, S0Update).
+
+-spec requires_update (bm_character_turn_update:type()) -> boolean().
+requires_update (Update) ->
+ Data = bm_character_turn_update:get_data(Update),
+ Battle = bm_character_turn_data:get_battle(Data),
+ Characters = bm_battle:get_characters(Battle),
+
+ array_util:none(fun bm_character:get_is_active/1, Characters).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec update_if_needed
+ (
+ bm_character_turn_update:type()
+ )
+ -> character_turn_update:type().
+update_if_needed (Update) ->
+ case requires_update(Update) of
+ true -> update(Update);
+ _ -> Update
+ end.