summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornsensfel <SpamShield0@noot-noot.org>2018-04-27 11:20:58 +0200
committernsensfel <SpamShield0@noot-noot.org>2018-04-27 11:20:58 +0200
commitc4733d234ff3c6f9f259b8be0b7c381f947b8d15 (patch)
treec749a295dac4f19cdebff02f2b672494c384e2cd
parent72c880fcfd7f3be6d23006bfe154e2322a6e34d5 (diff)
...
-rw-r--r--src/battlemap/src/query/character_turn.erl154
-rw-r--r--src/battlemap/src/struct/character_turn_data.erl99
-rw-r--r--src/battlemap/src/struct/character_turn_update.erl73
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] }.