summaryrefslogtreecommitdiff |
diff options
author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2018-03-02 15:43:23 +0100 |
---|---|---|
committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2018-03-02 15:43:23 +0100 |
commit | dc119102df0076e45ee6c484e361c3fff3e6e2dd (patch) | |
tree | ff9d0ad5787ceac83decf5066e9969ea01388a45 /src/battle/battle_turn.erl | |
parent | 45434f444962ef9c852e8122fe86ae65c9c49436 (diff) |
Still working on it...
Diffstat (limited to 'src/battle/battle_turn.erl')
-rw-r--r-- | src/battle/battle_turn.erl | 135 |
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. |