summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/battle/struct/btl_player_turn.erl')
-rw-r--r-- | src/battle/struct/btl_player_turn.erl | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/src/battle/struct/btl_player_turn.erl b/src/battle/struct/btl_player_turn.erl new file mode 100644 index 0000000..e0665f4 --- /dev/null +++ b/src/battle/struct/btl_player_turn.erl @@ -0,0 +1,106 @@ +-module(btl_player_turn). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-record +( + player_turn, + { + number :: non_neg_integer(), + player_ix :: non_neg_integer() + } +). + +-opaque type() :: #player_turn{}. + +-export_type([type/0]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export +( + [ + new/2, + next/2 + ] +). + +%%%% Accessors +-export +( + [ + get_number/1, + get_player_ix/1 + ] +). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +-spec next_valid_player + ( + non_neg_integer(), + array:array(btl_player:type()), + non_neg_integer(), + non_neg_integer() + ) -> non_neg_integer(). +next_valid_player (StartingPoint, _Players, _PlayersCount, StartingPoint) -> + StartingPoint; +next_valid_player (CandidateIX, Players, PlayersCount, StartingPoint) -> + Candidate = array:get(CandidateIX, Players), + + case btl_player:get_is_active(Candidate) of + true -> CandidateIX; + _ -> + next_valid_player + ( + ((CandidateIX + 1) rem PlayersCount), + Players, + PlayersCount, + StartingPoint + ) + end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% Accessors +-spec new (non_neg_integer(), non_neg_integer()) -> type(). +new (Number, PlayerIX) -> + #player_turn + { + number = Number, + player_ix = PlayerIX + }. + +-spec get_number (type()) -> non_neg_integer(). +get_number (PlayerTurn) -> PlayerTurn#player_turn.number. + +-spec get_player_ix (type()) -> non_neg_integer(). +get_player_ix (PlayerTurn) -> PlayerTurn#player_turn.player_ix. + +-spec next (array:array(btl_player:type()), type()) -> type(). +next (Players, CurrentPlayerTurn) -> + CurrentPlayerIX = CurrentPlayerTurn#player_turn.player_ix, + CurrentTurnNumber = CurrentPlayerTurn#player_turn.number, + PlayersCount = array:size(Players), + + NextPlayerIX = + next_valid_player + ( + ((CurrentPlayerIX + 1) rem PlayersCount), + Players, + PlayersCount, + CurrentPlayerIX + ), + + NextTurnNumber = + case (NextPlayerIX < CurrentPlayerIX) of + true -> (CurrentTurnNumber + 1); + _ -> CurrentTurnNumber + end, + + new(NextTurnNumber, NextPlayerIX). |