summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src')
-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)). |