summaryrefslogtreecommitdiff |
diff options
author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2018-05-01 13:56:31 +0200 |
---|---|---|
committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2018-05-01 13:56:31 +0200 |
commit | e5b297726860cc0f67e9cc11eab3529bc407c7ab (patch) | |
tree | b2fd3c3dc604da6bd5e95cd217b87cc5bfc94fac /src/battlemap | |
parent | c4733d234ff3c6f9f259b8be0b7c381f947b8d15 (diff) |
...
Diffstat (limited to 'src/battlemap')
-rw-r--r-- | src/battlemap/src/query/character_turn.erl | 252 |
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), |