summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/battlemap/src/query/character_turn.erl252
1 files changed, 144 insertions, 108 deletions
diff --git a/src/battlemap/src/query/character_turn.erl b/src/battlemap/src/query/character_turn.erl
index 80ab9aa..8fdc0ac 100644
--- a/src/battlemap/src/query/character_turn.erl
+++ b/src/battlemap/src/query/character_turn.erl
@@ -16,110 +16,23 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%-spec send_to_database (list(database_diff:struct()), character_turn_request:type()) -> 'ok'.
--spec send_to_database (battle:struct(), character_turn_request:type()) -> 'ok'.
-send_to_database (FinalizedBattle, Request) ->
- PlayerID = character_turn_request:get_player_id(Request),
- BattleID = character_turn_request:get_battle_id(Request),
-
- %% TODO: differential commit
- database_shim:commit
- (
- battle_db,
- PlayerID,
- BattleID,
- FinalizedBattle
- ).
-
--spec update_cache (battle:struct(), character_turn_request:type()) -> 'ok'.
-update_cache (Battle, Request) ->
- PlayerID = character_turn_request:get_player_id(Request),
- BattleID = character_turn_request:get_battle_id(Request),
-
- timed_cache:update
- (
- battle_db,
- PlayerID,
- BattleID,
- Battle
- ).
-
--spec generate_reply (list(any())) -> binary().
-generate_reply (EncodedClientUpdate) ->
- jiffy:encode([turn_results:generate(EncodedClientUpdate)]).
-handle_actions (Data, Request) ->
- Battle = Data#data.battle,
- CharacterInstance = Data#data.played_character_instance,
- CharacterInstanceIX = Request#request.character_instance_ix,
- Actions = Request#request.actions,
+-spec generate_reply (character_turn_update:data()) -> binary().
+generate_reply (Update) ->
+ NewTimelineItems = character_turn_update:get_timeline(Update),
- {
- ActionsDiffUpdates,
- ClientUpdates,
- PostActionBattle,
- PostActionCharacterInstance
- } =
- lists:foldl
- (
- fun
- (
- Action,
- {
- CurrActionsDiffUpdates,
- CurrClientUpdates,
- CurrBattle,
- CurrCharacterInstance
- }
- ) ->
- {
- NewActionsDiffUpdates,
- NewClientUpdates,
- NewBattle,
- NewCharacterInstance
- } =
- battle_action:handle
- (
- CurrBattle,
- CurrCharacterInstance,
- CharacterInstanceIX,
- Action
- ),
- {
- (NewActionsDiffUpdates ++ CurrActionsDiffUpdates),
- (NewClientUpdates ++ CurrClientUpdates),
- NewBattle,
- NewCharacterInstance
- }
- end,
- {[], [], Battle, CharacterInstance},
- Actions
- ),
- {
- ActionsDiffUpdates,
- ClientUpdates,
- Data#data
- {
- dirty = true,
- battle = PostActionBattle,
- played_character_instance = PostActionCharacterInstance
- }
- }.
+ TurnResultReply = turn_results:generate(NewTimelineItems),
+ jiffy:encode([TurnResultReply]).
-FinalizedCharacterInstance =
- character_instance:set_is_active(false, CharacterInstance),
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
+%%%% REQUEST DECODING %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec decode_request (binary()) -> character_turn_request:type().
decode_request (BinaryRequest) ->
JSONMap = jiffy:decode(BinaryRequest, [return_maps]),
+
character_turn_request:decode(JSONMap).
+%%%% USER AUTHENTICATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec authenticate_user (character_turn_request:type()) -> 'ok'.
authenticate_user (Request) ->
PlayerID = character_turn_request:get_player_id(Request),
@@ -128,6 +41,7 @@ authenticate_user (Request) ->
security:assert_identity(PlayerID, SessionToken),
security:lock_queries(PlayerID).
+%%%% MAIN LOGIC %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec fetch_data (character_turn_request:type()) -> character_turn_data:type().
fetch_data (Request) ->
PlayerID = character_turn_request:get_player_id(Request),
@@ -139,6 +53,7 @@ fetch_data (Request) ->
character_turn_data:new(Battle, CharacterInstanceIX).
+%%%% ASSERTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec assert_user_is_current_player
(
character_turn_data:type(),
@@ -178,7 +93,11 @@ assert_character_can_be_played (Data) ->
ok.
--spec assert_user_permissions (character_turn_data:type(), character_turn_request:type()) -> 'ok'.
+-spec assert_user_permissions
+ (
+ character_turn_data:type(),
+ character_turn_request:type()
+ ) -> 'ok'.
assert_user_permissions (Data, Request) ->
assert_user_is_current_player(Data, Request),
assert_user_owns_played_character(Data, Request),
@@ -186,6 +105,86 @@ assert_user_permissions (Data, Request) ->
ok.
+%%%% QUERY LOGIC HANDLING %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec finalize_character_instance
+ (
+ character_turn_update:type()
+ )
+ -> character_turn_update:type().
+finalize_character_instance (Update) ->
+ Data = character_instance_update:get_data(Update),
+ CharacterInstance = character_instance_data:get_character_instance(Data),
+
+ DisabledCharacterInstance =
+ character_instance:set_is_active(false, CharacterInstance),
+
+ UpdatedData =
+ character_instance_data:set_character_instance
+ (
+ DisabledCharacterInstance,
+ Data
+ ),
+ FinalizedData = character_instance_data:cleanup(UpdatedData),
+
+ character_instance_update:set_data(FinalizedData, Update).
+
+-spec handle_actions
+ (
+ character_turn_data:type(),
+ character_turn_request:type()
+ )
+ -> character_turn_update:type().
+handle_actions (Data, Request) ->
+ Actions = character_turn_request:get_actions(Request),
+
+ EmptyUpdate = character_turn_update:new(Data),
+ PostActionsUpdate =
+ lists:foldl(fun battle_turn_actions:handle/2, EmptyUpdate, Actions),
+
+ finalize_character_instance(PostActionsUpdate).
+
+-spec update_timeline
+ (
+ character_turn_update:type()
+ )
+ -> character_turn_update:type().
+update_timeline (Update) ->
+ NewTimelineElements = character_turn_update:get_timeline(Update),
+ Data = character_turn_update:get_data(Update),
+ Battle = character_turn_data:get_battle(Data),
+ 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(NewTimelineElements, Player),
+ UpdatedBattle = battle:set_player(PlayerIX, UpdatedPlayer, Battle),
+ UpdatedData = character_turn_data:set_battle(UpdatedBattle, Data),
+
+ character_turn_update:set_data(UpdatedData, Update).
+
+-spec start_next_player_turn
+ (
+ character_turn_update:type()
+ )
+ -> character_turn_update:type().
+start_next_player_turn (Update) ->
+ % TODO
+ 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(),
@@ -195,17 +194,55 @@ assert_user_permissions (Data, Request) ->
update_data (Data, Request) ->
EmptyUpdate = character_turn_update:new(Data),
PostActionsUpdate = handle_actions(EmptyUpdate, Request),
- NewTurnUpdate = prepare_new_turn(PostActionsUpdate),
+ PostCharacterTurnUpdate = update_timeline(PostActionsUpdate),
+
+ check_and_update_for_new_turn(PostCharacterTurnUpdate).
+
+%%%% DATABASE UPDATES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec send_to_database
+ (
+ character_turn_update:type(),
+ character_turn_request:type()
+ )
+ -> 'ok'.
+send_to_database (Update, Request) ->
+ PlayerID = character_turn_request:get_player_id(Request),
+ BattleID = character_turn_request:get_battle_id(Request),
+ Data = character_turn_update:get_data(Update),
+ Battle = character_turn_data:get_battle(Data),
- EncodedClientUpdate = lists:map(fun turn_result:encode/1, ClientUpdate),
+ %% TODO: differential commit
+ database_shim:commit
+ (
+ battle_db,
+ PlayerID,
+ BattleID,
+ Battle
+ ),
- UpdatedBattle2 =
- battle_turn:store_timeline(EncodedClientUpdate, UpdatedBattle),
+ ok.
- {TurnDiffUpdate, FinalizedBattle} =
- battle_turn:handle_post_play(UpdatedBattle2),
+-spec send_to_cache
+ (
+ character_turn_update:type(),
+ character_turn_request:type()
+ )
+ -> 'ok'.
+send_to_cache (Update, Request) ->
+ PlayerID = character_turn_request:get_player_id(Request),
+ BattleID = character_turn_request:get_battle_id(Request),
+ Data = character_turn_update:get_data(Update),
+ Battle = character_turn_data:get_battle(Data),
- DiffUpdate = (TurnDiffUpdate ++ ActionsDiffUpdate).
+ timed_cache:update
+ (
+ battle_db,
+ PlayerID,
+ BattleID,
+ Battle
+ ),
+
+ ok.
-spec commit_update
(
@@ -214,14 +251,12 @@ update_data (Data, Request) ->
)
-> 'ok'.
commit_update (Update, Request) ->
- UpdatedData = character_turn_update:get_data(Update),
-
- % TODO: the database should get a diff update instead.
- send_to_database(UpdatedData, Request),
- update_cache(UpdatedData, Request),
+ send_to_database(Update, Request),
+ send_to_cache(Update, Request),
ok.
+%%%% USER DISCONNECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec disconnect_user (character_turn_request:type()) -> 'ok'.
disconnect_user (Request) ->
PlayerID = character_turn_request:get_player_id(Request),
@@ -230,6 +265,7 @@ disconnect_user (Request) ->
ok.
+%%%% MAIN LOGIC %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec handle (binary()) -> binary().
handle (EncodedRequest) ->
Request = decode_request(EncodedRequest),