summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/battlemap')
-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] }. |