| summaryrefslogtreecommitdiff | 
diff options
| -rw-r--r-- | src/battlemap/src/query/character_turn.erl | 154 | ||||
| -rw-r--r-- | src/battlemap/src/struct/character_turn_data.erl | 99 | ||||
| -rw-r--r-- | src/battlemap/src/struct/character_turn_update.erl | 73 | 
3 files changed, 246 insertions, 80 deletions
diff --git a/src/battlemap/src/query/character_turn.erl b/src/battlemap/src/query/character_turn.erl index 6908a98..80ab9aa 100644 --- a/src/battlemap/src/query/character_turn.erl +++ b/src/battlemap/src/query/character_turn.erl @@ -6,29 +6,6 @@  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  -include("../../include/yaws_api.hrl"). - --record -( -   data, -   { -      battle :: battle:struct(), -      played_character_instance :: character_instance:struct() -   } -). - --record -( -   update, -   { -      updated_data :: data(), -      timeline_update :: list(any()), -      db_update :: list(any()) -   } -). - --type data() :: #data{}. --type update() :: #update{}. -  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -38,33 +15,11 @@  %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec finalize_and_fuse_data -   ( -      data(), -      character_turn_request:type() -   ) -   -> battle:struct(). -finalize_and_fuse_data (Data, Request) -> -   Battle = Data#data.battle, -   CharacterInstance = Data#data.played_character_instance, - -   io:format("~nNot a character instance? ~p~n", [CharacterInstance]), - -   FinalizedCharacterInstance = -      character_instance:set_is_active(false, CharacterInstance), - -   battle:set_character_instance -   ( -      Request#request.character_instance_ix, -      FinalizedCharacterInstance, -      Battle -   ). -  %-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 = Request#request.player_id, -   BattleID = Request#request.battle_id, +   PlayerID = character_turn_request:get_player_id(Request), +   BattleID = character_turn_request:get_battle_id(Request),     %% TODO: differential commit     database_shim:commit @@ -77,8 +32,8 @@ send_to_database (FinalizedBattle, Request) ->  -spec update_cache (battle:struct(), character_turn_request:type()) -> 'ok'.  update_cache (Battle, Request) -> -   PlayerID = Request#request.player_id, -   BattleID = Request#request.battle_id, +   PlayerID = character_turn_request:get_player_id(Request), +   BattleID = character_turn_request:get_battle_id(Request),     timed_cache:update     ( @@ -88,7 +43,7 @@ update_cache (Battle, Request) ->        Battle     ). --spec generate_reply ( list(any())) -> binary(). +-spec generate_reply (list(any())) -> binary().  generate_reply (EncodedClientUpdate) ->     jiffy:encode([turn_results:generate(EncodedClientUpdate)]). @@ -144,11 +99,15 @@ handle_actions (Data, Request) ->        ClientUpdates,        Data#data        { +         dirty = true,           battle = PostActionBattle,           played_character_instance = PostActionCharacterInstance        }     }. + +FinalizedCharacterInstance = +   character_instance:set_is_active(false, CharacterInstance),  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -169,7 +128,7 @@ authenticate_user (Request) ->     security:assert_identity(PlayerID, SessionToken),     security:lock_queries(PlayerID). --spec fetch_data (character_turn_request:type()) -> data(). +-spec fetch_data (character_turn_request:type()) -> character_turn_data:type().  fetch_data (Request) ->     PlayerID = character_turn_request:get_player_id(Request),     BattleID = character_turn_request:get_battle_id(Request), @@ -177,43 +136,69 @@ fetch_data (Request) ->        character_turn_request:get_character_instance_ix(Request),     Battle = timed_cache:fetch(battle_db, PlayerID, BattleID), -   CharacterInstance = -      battle:get_character_instance(CharacterInstanceIX, Battle), -   #data -   { -      battle = Battle, -      played_character_instance = CharacterInstance -   }. +   character_turn_data:new(Battle, CharacterInstanceIX). --spec assert_user_permissions (data(), character_turn_request:type()) -> true. -assert_user_permissions (Data, Request) -> +-spec assert_user_is_current_player +   ( +      character_turn_data:type(), +      character_turn_request:type() +   ) -> 'ok'. +assert_user_is_current_player (Data, Request) ->     PlayerID = character_turn_request:get_player_id(Request), -   CharacterInstance = Data#data.played_character_instance, -   Battle = Data#data.battle, -   Character = character_instance:get_character(CharacterInstance), -   CurrentPlayerIX = -      player_turn:get_player_ix -      ( -         battle:get_current_player_turn(Battle) -      ), +   Battle = character_turn_data:get_battle(Data), +   CurrentPlayerTurn = battle:get_current_player_turn(Battle), +   CurrentPlayerIX = player_turn:get_player_ix(CurrentPlayerTurn),     CurrentPlayer = battle:get_player(CurrentPlayerIX, Battle), + +   true = (PlayerID == player:get_id(CurrentPlayer)), + +   ok. + +-spec assert_user_owns_played_character +   ( +      character_turn_data:type(), +      character_turn_request:type() +   ) -> 'ok'. +assert_user_owns_played_character (Data, Request) -> +   PlayerID = character_turn_request:get_player_id(Request), +   CharacterInstance = character_turn_data:get_player_instance(Data), +   Character = character_instance:get_character(CharacterInstance),     CharacterOwnerID = character:get_owner_id(Character), -   PlayerID = player:get_id(CurrentPlayer), -   PlayerID = CharacterOwnerID, +   true = (PlayerID == CharacterOwnerID), + +   ok. + +-spec assert_character_can_be_played (character_turn_data:type()) -> 'ok'. +assert_character_can_be_played (Data) -> +   CharacterInstance = character_turn_data:get_player_instance(Data), -   true = character_instance:get_is_active(CharacterInstance). +   true = character_instance:get_is_active(CharacterInstance), --spec update_data (data(), character_turn_request:type()) -> update(). +   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), +   assert_character_can_be_played(Data), + +   ok. + +-spec update_data +   ( +      character_turn_data:type(), +      character_turn_request:type() +   ) +   -> character_turn_update:type().  update_data (Data, Request) -> -   {ActionsDiffUpdate, ClientUpdate, UpdatedData} = -      handle_actions(Data, Request), +   EmptyUpdate = character_turn_update:new(Data), +   PostActionsUpdate = handle_actions(EmptyUpdate, Request), +   NewTurnUpdate = prepare_new_turn(PostActionsUpdate),     EncodedClientUpdate = lists:map(fun turn_result:encode/1, ClientUpdate), -   UpdatedBattle = finalize_and_fuse_data(UpdatedData, Request), -     UpdatedBattle2 =        battle_turn:store_timeline(EncodedClientUpdate, UpdatedBattle), @@ -222,19 +207,28 @@ update_data (Data, Request) ->     DiffUpdate = (TurnDiffUpdate ++ ActionsDiffUpdate). --spec commit_update (update(), character_turn_request:type()) -> any(). +-spec commit_update +   ( +      character_turn_update:type(), +      character_turn_request:type() +   ) +   -> 'ok'.  commit_update (Update, Request) -> -   UpdatedData = Update#update.updated_data, +   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). +   update_cache(UpdatedData, Request), + +   ok.  -spec disconnect_user (character_turn_request:type()) -> 'ok'.  disconnect_user (Request) ->     PlayerID = character_turn_request:get_player_id(Request), -   security:unlock_queries(PlayerID). +   security:unlock_queries(PlayerID), + +   ok.  -spec handle (binary()) -> binary().  handle (EncodedRequest) -> diff --git a/src/battlemap/src/struct/character_turn_data.erl b/src/battlemap/src/struct/character_turn_data.erl new file mode 100644 index 0000000..0f8364e --- /dev/null +++ b/src/battlemap/src/struct/character_turn_data.erl @@ -0,0 +1,99 @@ +-module(character_turn_data). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-record +( +   type, +   { +      dirty :: boolean(), +      battle :: battle:struct(), +      character_instance :: character_instance:struct(), +      character_instance_ix :: non_neg_integer() +   } +). + +-opaque type() :: #type{}. + +-export_type([type/0]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export +( +   [ +      new/2, + +      get_battle_is_dirty/1, +      get_battle/1, +      get_character_instance/1, + +      set_battle/2, +      set_character_instance/2 +   ] +). + +-export +( +   [ +      clean_battle/1 +   ] +). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec new (battle:type(), non_neg_integer()) -> type(). +new (Battle, CharacterInstanceIX) -> +   CharacterInstance = +      battle:get_character_instance(CharacterInstanceIX, Battle), + +   #type +   { +      dirty = false, +      battle = Battle, +      character_instance = CharacterInstance, +      character_instance_ix = CharacterInstanceIX +   }. + +-spec get_battle_is_dirty (type()) -> boolean(). +get_battle_is_dirty (Data) -> Data#type.dirty. + +-spec get_battle (type()) -> battle:type(). +get_battle (Data) -> Data#type.battle. + +-spec get_character_instance (type()) -> character_instance:type(). +get_character_instance (Data) -> Data#type.character_instance. + +-spec set_battle (battle:type(), type()) -> type(). +set_battle (Battle, Data) -> +   Data#type{ battle = Battle }. + +-spec set_character_instance (character_instance:type(), type()) -> type(). +set_character_instance (CharacterInstance, Data) -> +   Data#type +   { +      dirty = true, +      character_instance = CharacterInstance +   }. + +-spec clean_battle (type()) -> type(). +clean_battle (Data) -> +   Data#type +   { +      dirty = false, +      battle = +         battle:set_character_instance +         ( +            Data#type.character_instance_ix, +            Data#type.character_instance, +            Data#type.battle +         ) +   }. + diff --git a/src/battlemap/src/struct/character_turn_update.erl b/src/battlemap/src/struct/character_turn_update.erl new file mode 100644 index 0000000..a6642e4 --- /dev/null +++ b/src/battlemap/src/struct/character_turn_update.erl @@ -0,0 +1,73 @@ +-module(character_turn_update). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-record +( +   type, +   { +      data :: character_turn_data:type(), +      timeline :: list(any()), +      db :: list(any()) +   } +). + +-opaque type() :: #type{}. + +-export_type([type/0]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export +( +   [ +      new/1, + +      get_data/1, +      get_timeline/1, +      get_db/1, + +      set_data/2, +      add_to_timeline/2, +      add_to_db/2 +   ] +). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec new (data:type()) -> type(). +new (Data) -> +   #type +   { +      data = Data, +      timeline = [], +      db = [] +   }. + +-spec get_data (type()) -> character_turn_data:type(). +get_data (Update) -> Update#type.data. + +-spec get_timeline (type()) -> list(any()). +get_timeline (Update) -> Update#type.timeline. + +-spec get_db (type()) -> list(any()). +get_db (Update) -> Update#type.db. + +-spec set_data (character_turn_data:type(), type()) -> type(). +set_data (Data, Update) -> +   Update#type{ data = Data}. + +-spec add_to_timeline (any(), type()) -> type(). +add_to_timeline (Item, Update) -> +   Update#type{ timeline = [Item|Update#type.timeline] }. + +-spec add_to_db (any(), type()) -> type(). +add_to_db (Item, Update) -> +   Update#type{ db = [Item|Update#type.db] }.  | 


