summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battlemap/src/game-logic/battle_turn.erl160
-rw-r--r--src/battlemap/src/game-logic/next_turn.erl120
-rw-r--r--src/battlemap/src/query/character_turn.erl60
-rw-r--r--src/battlemap/src/util/array_util.erl105
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)).