summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2018-03-02 15:43:23 +0100
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2018-03-02 15:43:23 +0100
commitdc119102df0076e45ee6c484e361c3fff3e6e2dd (patch)
treeff9d0ad5787ceac83decf5066e9969ea01388a45 /src/battle/battle_turn.erl
parent45434f444962ef9c852e8122fe86ae65c9c49436 (diff)
Still working on it...
Diffstat (limited to 'src/battle/battle_turn.erl')
-rw-r--r--src/battle/battle_turn.erl135
1 files changed, 135 insertions, 0 deletions
diff --git a/src/battle/battle_turn.erl b/src/battle/battle_turn.erl
new file mode 100644
index 0000000..e295f09
--- /dev/null
+++ b/src/battle/battle_turn.erl
@@ -0,0 +1,135 @@
+-module(battle_turn).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-export
+(
+ [
+ handle_post_play/1
+ ]
+).
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec activate_relevant_character_instances
+ (
+ list(non_neg_integer()),
+ array:array(character_instance:struct()),
+ player:id(),
+ (-1 | non_neg_integer())
+ )
+ -> {list(non_neg_integer()), array:array(character_instance:struct())}.
+activate_relevant_character_instances (IXs, CharacterInstances, _Owner, -1) ->
+ {IXs, CharacterInstances};
+activate_relevant_character_instances (IXs, CharacterInstances, Owner, IX) ->
+ CharacterInstance = array:get(IX, CharacterInstances),
+ Character = character_instance:get_character(CharacterInstance),
+ case character:get_owner_id(Character) of
+ OwnerID when (OwnerID == Owner) ->
+ activate_relevant_character_instances
+ (
+ [IX|IXs],
+ array:set
+ (
+ IX,
+ character_instance:set_is_active(true, CharacterInstance),
+ CharacterInstances
+ ),
+ Owner,
+ (IX - 1)
+ );
+
+ _ ->
+ activate_relevant_character_instances
+ (
+ IXs,
+ CharacterInstances,
+ Owner,
+ (IX - 1)
+ )
+ end.
+
+-spec start_next_players_turn (battle:struct()) ->
+ {list(non_neg_integer()), battle:struct()}.
+start_next_players_turn (Battle) ->
+ PlayerIDs = battle:get_player_ids(Battle),
+ PlayerTurn = battle:get_current_player_turn(Battle),
+ CurrentPlayerIX = player_turn:get_player_ix(PlayerTurn),
+ CurrentTurnNumber = player_turn:get_number(PlayerTurn),
+ CharacterInstances = battle:get_character_instances(Battle),
+
+ NextPlayerIX = ((CurrentPlayerIX + 1) rem (array:size(PlayerIDs))),
+ NextPlayerTurn =
+ player_turn:new
+ (
+ case NextPlayerIX of
+ 0 -> (CurrentTurnNumber + 1);
+ _ -> CurrentTurnNumber
+ end,
+ NextPlayerIX
+ ),
+
+ {ActivatedCharacterInstanceIXs, UpdatedCharacterInstances} =
+ activate_relevant_character_instances
+ (
+ [],
+ CharacterInstances,
+ array:get(NextPlayerIX, PlayerIDs),
+ (array:size(CharacterInstances) - 1)
+ ),
+ UpdatedBattle =
+ battle:set_character_instances
+ (
+ UpdatedCharacterInstances,
+ battle:set_current_player_turn
+ (
+ NextPlayerTurn,
+ Battle
+ )
+ ),
+ {ActivatedCharacterInstanceIXs, UpdatedBattle}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-spec handle_post_play (battle:struct()) ->
+ {database_diff:struct(), battle:struct()}.
+handle_post_play (Battle) ->
+ CharacterInstances = battle:get_character_instances(Battle),
+
+ AnActiveCharacterInstanceRemains =
+ array:foldl
+ (
+ fun (_IX, CharacterInstance, Prev) ->
+ (Prev or character_instance:get_is_active(CharacterInstance))
+ end,
+ false,
+ CharacterInstances
+ ),
+
+ case AnActiveCharacterInstanceRemains of
+ true ->
+ io:format("~nThere are still active characters.~n"),
+ {[], Battle};
+
+ false ->
+ io:format("~nThere are no more active characters.~n"),
+ {UpdatedCharacterInstanceIXs, UpdatedBattle} =
+ start_next_players_turn(Battle),
+ {
+ lists:map
+ (
+ fun (IX) ->
+ {set, character_instance, IX, is_active, true}
+ end,
+ UpdatedCharacterInstanceIXs
+ ),
+ UpdatedBattle
+ }
+ end.