| 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. | 


