| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src/battlemap')
| -rw-r--r-- | src/battlemap/src/game-logic/battle_turn.erl | 160 | ||||
| -rw-r--r-- | src/battlemap/src/game-logic/next_turn.erl | 120 | ||||
| -rw-r--r-- | src/battlemap/src/query/character_turn.erl | 60 | ||||
| -rw-r--r-- | src/battlemap/src/util/array_util.erl | 105 | 
4 files changed, 226 insertions, 219 deletions
diff --git a/src/battlemap/src/game-logic/battle_turn.erl b/src/battlemap/src/game-logic/battle_turn.erl deleted file mode 100644 index 8e60719..0000000 --- a/src/battlemap/src/game-logic/battle_turn.erl +++ /dev/null @@ -1,160 +0,0 @@ --module(battle_turn). -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export -( -   [ -      handle_post_play/1, -      store_timeline/2 -   ] -). -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% 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) -> -   Players = battle:get_players(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(Players))), -   NextPlayerTurn = -      player_turn:new -      ( -         case NextPlayerIX of -            0 -> (CurrentTurnNumber + 1); -            _ -> CurrentTurnNumber -         end, -         NextPlayerIX -      ), - -   NextPlayer = array:get(NextPlayerIX, Players), -   UpdatedNextPlayer = player:reset_timeline(NextPlayer), - -   {ActivatedCharacterInstanceIXs, UpdatedCharacterInstances} = -      activate_relevant_character_instances -      ( -         [], -         CharacterInstances, -         player:get_id(NextPlayer), -         (array:size(CharacterInstances) - 1) -      ), -   UpdatedBattle = -      battle:set_player -      ( -         NextPlayerIX, -         UpdatedNextPlayer, -         battle:set_character_instances -         ( -            UpdatedCharacterInstances, -            battle:set_current_player_turn -            ( -               NextPlayerTurn, -               Battle -            ) -         ) -      ), -   % TODO: have a diff operation for the player's timeline being reset.  -   {ActivatedCharacterInstanceIXs, UpdatedBattle}. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - --spec store_timeline -   ( -      list(any()), -      battle:struct() -   ) -   -> battle:struct(). -store_timeline (TurnEffects, Battle) -> -   PlayerTurn = battle:get_current_player_turn(Battle), -   PlayerIX = player_turn:get_player_ix(PlayerTurn), -   Player = battle:get_player(PlayerIX, Battle), - -   UpdatedPlayer = player:add_to_timeline(TurnEffects, Player), - -   battle:set_player(PlayerIX, UpdatedPlayer, Battle). - - --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. diff --git a/src/battlemap/src/game-logic/next_turn.erl b/src/battlemap/src/game-logic/next_turn.erl new file mode 100644 index 0000000..ee3b59f --- /dev/null +++ b/src/battlemap/src/game-logic/next_turn.erl @@ -0,0 +1,120 @@ +-module(next_turn). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export +( +   [ +      update_if_needed/1 +   ] +). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec set_player_turn_to_next (battle:type()) -> battle:type(). +set_player_turn_to_next (Battle) -> +   Players = battle:get_players(Battle), +   CurrentPlayerTurn = battle:get_current_player_turn(Battle), + +   NextPlayerTurn = player_turn:next(array:size(Players), CurrentPlayerTurn), + +   battle:set_current_player_turn(NextPlayerTurn, Battle). + +-spec reset_next_player_timeline (battle:type()) -> battle:type(). +reset_next_player_timeline (Battle) -> +   NextPlayerTurn = battle:get_current_player_turn(Battle), +   NextPlayerIX = player_turn:get_player_ix(NextPlayerTurn), +   NextPlayer = battle:get_player(NextPlayerIX, Battle), + +   UpdatedNextPlayer = player:reset_timeline(NextPlayer), +   UpdatedBattle = battle:set_player(NextPlayerIX, UpdatedNextPlayer, Battle), + +   {UpdatedBattle, UpdatedNextPlayer}. + + +-spec activate_next_players_characters +   ( +      battle:type(), +      player:type() +   ) +   -> {battle:type(), list(non_neg_integer())}. +activate_next_players_characters (Battle, NextPlayer) -> +   NextPlayerID = player:get_id(NextPlayer), +   CharacterInstances = battle:get_character_instances(Battle), + +   {UpdatedCharacterInstances, ModifiedIXs} = +      array_util:mapiff +      ( +         fun (CharacterInstance) -> +            Character = character_instance:get_character(CharacterInstance), +            (character:get_owner_id(Character) == NextPlayerID) +         end, +         fun (CharacterInstance) -> +            character_instance:set_is_active(true, CharacterInstance) +         end, +         CharacterInstances +      ), + +   UpdatedBattle = +      battle:set_character_instances(UpdatedCharacterInstances, Battle), + +   {UpdatedBattle, ModifiedIXs}. + +-spec add_activation_updates +   ( +      list(non_neg_integer()), +      character_turn_update:type() +   ) +   -> character_turn_update:type(). +add_activation_updates ([], Update) -> +   Update; +add_activation_updates ([IX|NextIXs], Update) -> +   % TODO: use DB update elements. +   add_activation_updates +   ( +      NextIXs, +      character_turn_update:add_to_db(IX, Update) +   ). + +-spec update (character_turn_update:type()) -> character_turn_update:type(). +update (Update) -> +   Data = character_turn_update:get_data(Update), +   Battle = character_turn_data:get_battle(Data), + +   S0Battle = set_player_turn_to_next(Battle), +   {S1Battle, NextPlayer} = reset_next_player_timeline(S0Battle), +   {S2Battle, ActivatedCharacterInstancesIX} = +      activate_next_players_characters(S1Battle, NextPlayer), + +   S0Update = add_activation_updates(ActivatedCharacterInstancesIX, Update), + +   UpdatedData = character_turn_data:set_battle(S2Battle, Data), + +   character_turn_update:set_data(UpdatedData, S0Update). + +-spec requires_update (character_turn_update:type()) -> boolean(). +requires_update (Update) -> +   Data = character_turn_update:get_data(Update), +   Battle = character_turn_data:get_battle(Data), +   CharacterInstances = battle:get_character_instances(Battle), + +   array_util:none(fun character_instance:get_is_active/1, CharacterInstances). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec update_if_needed +   ( +      character_turn_update:type() +   ) +   -> character_turn_update:type(). +update_if_needed (Update) -> +   case requires_update(Update) of +      true -> update(Update); +      _ -> Update +   end. diff --git a/src/battlemap/src/query/character_turn.erl b/src/battlemap/src/query/character_turn.erl index 94025e9..ece2f28 100644 --- a/src/battlemap/src/query/character_turn.erl +++ b/src/battlemap/src/query/character_turn.erl @@ -155,64 +155,6 @@ update_timeline (Update) ->     character_turn_update:set_data(UpdatedData, Update). --spec set_player_turn_to_next (battle:type()) -> battle:type(). -set_player_turn_to_next (Battle) -> -   Players = battle:get_players(Battle), -   CurrentPlayerTurn = battle:get_current_player_turn(Battle), - -   NextPlayerTurn = player_turn:next(array:size(Players), CurrentPlayerTurn), - -   battle:set_current_player_turn(NextPlayerTurn, Battle). - --spec reset_next_player_timeline (battle:type()) -> battle:type(). -reset_next_player_timeline (Battle) -> -   NextPlayerTurn = battle:get_current_player_turn(Battle), -   NextPlayerIX = player_turn:get_player_ix(NextPlayerTurn), -   NextPlayer = battle:get_player(NextPlayerIX, Battle), - -   UpdatedNextPlayer = player:reset_timeline(NextPlayer), -   UpdatedBattle = battle:set_player(NextPlayerIX, UpdatedNextPlayer, Battle), - -   {UpdatedBattle, UpdatedNextPlayer}. - --spec activate_next_players_characters (battle:type(), player:type()) -> -activate_next_players_characters (Battle, NextPlayer) -> -   NextPlayerID = player:get_id(NextPlayer), -   CharacterInstances = battle:get_character_instances(Battle), -   % TODO -   ok. - --spec start_next_player_turn -   ( -      character_turn_update:type() -   ) -   -> character_turn_update:type(). -start_next_player_turn (Update) -> -   Data = character_turn_update:get_data(Update), -   Battle = character_turn_data:get_battle(Data), - -   S0Battle = set_player_turn_to_next(Battle), -   {S1Battle, NextPlayer} = reset_next_player_timeline(S0Battle), -   S2Battle = activate_next_players_characters(S1Battle, NextPlayer), - -   UpdatedData = character_turn_data:set_battle(S2Battle, Data), - -   character_turn_update:set_data(UpdatedData, Update). - --spec check_and_update_for_new_turn -   ( -      character_turn_update:type() -   ) -   -> character_turn_update:type(). -check_and_update_for_new_turn (Update) -> -   Data = character_turn_update:get_data(Update), -   Battle = character_turn_data:get_battle(Data), - -   case battle:has_an_active_character_instance(Battle) of -      true -> Update; -      false -> start_next_player_turn(Update) -   end. -  -spec update_data     (        character_turn_data:type(), @@ -224,7 +166,7 @@ update_data (Data, Request) ->     PostActionsUpdate = handle_actions(EmptyUpdate, Request),     PostCharacterTurnUpdate = update_timeline(PostActionsUpdate), -   check_and_update_for_new_turn(PostCharacterTurnUpdate). +   next_turn:update_if_needed(PostCharacterTurnUpdate).  %%%% DATABASE UPDATES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  -spec send_to_database diff --git a/src/battlemap/src/util/array_util.erl b/src/battlemap/src/util/array_util.erl new file mode 100644 index 0000000..418d9ce --- /dev/null +++ b/src/battlemap/src/util/array_util.erl @@ -0,0 +1,105 @@ +-module(array_util). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export +( +   [ +      any/2, +      none/2, +      all/2, + +      mapiff/3 +   ] +). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec any_internals +   ( +      fun((any()) -> boolean()), +      array:array(any()), +      non_neg_integer() +   ) +   -> boolean(). +any_internals (_, _, 0) -> +   false; +any_internals (Fun, Array, PrevIX) -> +   IX = (PrevIX - 1), +   case Fun(array:get(IX, Array)) of +      true -> true; +      _ -> any_internals(Fun, Array, IX) +   end. + +-spec all_internals +   ( +      fun((any()) -> boolean()), +      array:array(any()), +      non_neg_integer() +   ) +   -> boolean(). +all_internals (_, _, 0) -> +   true; +all_internals (Fun, Array, PrevIX) -> +   IX = (PrevIX - 1), +   case Fun(array:get(IX, Array)) of +      true -> any_internals(Fun, Array, IX); +      _ -> false +   end. + +-spec mapiff_internals +   ( +      fun((any()) -> boolean()), +      fun((any()) -> any()), +      array:array(any()), +      list(non_neg_integer()), +      non_neg_integer() +   ) +   -> {array:array(any()), list(non_neg_integer())}. +mapiff_internals (_, _, Array, IXList, 0) -> +   {Array, IXList}; +mapiff_internals (Cond, Map, Array, IXList, PrevIX) -> +   IX = (PrevIX - 1), +   Elem = array:get(IX, Array), + +   case Cond(Elem) of +      false -> mapiff_internals(Cond, Map, Array, IXList, IX); +      _ -> +         mapiff_internals +         ( +            Cond, +            Map, +            array:set(IX, Map(Elem), Array), +            [IX|IXList], +            IX +         ) +   end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec any (fun((any()) -> boolean()), array:array(any())) -> boolean(). +any (Fun, Array) -> +   any_internals(Fun, Array, array:size(Array)). + +-spec all (fun((any()) -> boolean()), array:array(any())) -> boolean(). +all (Fun, Array) -> +   all_internals(Fun, Array, array:size(Array)). + +-spec none (fun((any()) -> boolean()), array:array(any())) -> boolean(). +none (Fun, Array) -> +   not any(Fun, Array). + +-spec mapiff +   ( +      fun((any()) -> boolean()), +      fun((any()) -> any()), +      array:array(any()) +   ) +   -> {array:array(any()), list(non_neg_integer())}. +mapiff (Cond, Map, Array) -> +   mapiff_internals(Cond, Map, Array, [], array:size(Array)).  | 


