| 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), | 


