summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/battlemap/game-logic/bm_next_turn.erl108
-rw-r--r--src/battlemap/game-logic/bm_turn_actions.erl96
-rw-r--r--src/battlemap/query/bm_character_turn.erl36
-rw-r--r--src/battlemap/struct/bm_character_turn_update.erl20
-rw-r--r--src/battlemap/struct/bm_player.erl6
-rw-r--r--src/db/logic/db_access.erl16
-rw-r--r--src/db/struct/db_model.erl5
-rw-r--r--src/shared/io/sh_database.erl7
-rw-r--r--src/shared/util/sh_array_util.erl (renamed from src/battlemap/util/array_util.erl)2
9 files changed, 182 insertions, 114 deletions
diff --git a/src/battlemap/game-logic/bm_next_turn.erl b/src/battlemap/game-logic/bm_next_turn.erl
index abe286e..79cea14 100644
--- a/src/battlemap/game-logic/bm_next_turn.erl
+++ b/src/battlemap/game-logic/bm_next_turn.erl
@@ -16,20 +16,27 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec set_player_turn_to_next (bm_battle:type()) -> bm_battle:type().
+-spec set_player_turn_to_next (bm_battle:type())
+ -> {bm_battle:type(), sh_db_query:op()}.
set_player_turn_to_next (Battle) ->
Players = bm_battle:get_players(Battle),
CurrentPlayerTurn = bm_battle:get_current_player_turn(Battle),
NextPlayerTurn = bm_player_turn:next(array:size(Players), CurrentPlayerTurn),
- bm_battle:set_current_player_turn(NextPlayerTurn, Battle).
+ UpdatedBattle = bm_battle:set_current_player_turn(NextPlayerTurn, Battle),
--spec reset_next_player_timeline
- (
- bm_battle:type()
- )
- -> {bm_battle:type(), bm_player:type()}.
+ DBQuery =
+ sh_db_query:set_field
+ (
+ bm_battle:get_current_player_turn_field(),
+ NextPlayerTurn
+ ),
+
+ {UpdatedBattle, DBQuery}.
+
+-spec reset_next_player_timeline (bm_battle:type())
+ -> {bm_battle:type(), bm_player:type(), sh_db_query:op()}.
reset_next_player_timeline (Battle) ->
NextPlayerTurn = bm_battle:get_current_player_turn(Battle),
NextPlayerIX = bm_player_turn:get_player_ix(NextPlayerTurn),
@@ -39,21 +46,25 @@ reset_next_player_timeline (Battle) ->
UpdatedBattle =
bm_battle:set_player(NextPlayerIX, UpdatedNextPlayer, Battle),
- {UpdatedBattle, UpdatedNextPlayer}.
+ DBQuery =
+ sh_db_query:update_indexed
+ (
+ bm_battle:get_players_field(),
+ NextPlayerIX,
+ [ sh_db_query:set_field(bm_player:get_timeline_field(), []) ]
+ ),
+ {UpdatedBattle, UpdatedNextPlayer, DBQuery}.
--spec activate_next_players_characters
- (
- bm_battle:type(),
- bm_player:type()
- )
- -> {bm_battle:type(), list(non_neg_integer())}.
+
+-spec activate_next_players_characters (bm_battle:type(), bm_player:type())
+ -> {bm_battle:type(), list(sh_db_query:op())}.
activate_next_players_characters (Battle, NextPlayer) ->
NextPlayerID = bm_player:get_id(NextPlayer),
Characters = bm_battle:get_characters(Battle),
{UpdatedCharacters, ModifiedIXs} =
- array_util:mapiff
+ sh_array_util:mapiff
(
fun (Character) ->
(bm_character:get_owner_id(Character) == NextPlayerID)
@@ -64,33 +75,29 @@ activate_next_players_characters (Battle, NextPlayer) ->
Characters
),
- UpdatedBattle = bm_battle:set_characters(UpdatedCharacters, Battle),
+ DBQueries =
+ lists:map
+ (
+ fun (IX) ->
+ sh_db_query:update_indexed
+ (
+ bm_battle:get_characters_field(),
+ IX,
+ [
+ sh_db_query:set_field
+ (
+ bm_character:get_active_field(),
+ true
+ )
+ ]
+ )
+ end,
+ ModifiedIXs
+ ),
- {UpdatedBattle, ModifiedIXs}.
+ UpdatedBattle = bm_battle:set_characters(UpdatedCharacters, Battle),
--spec add_activation_updates
- (
- list(non_neg_integer()),
- bm_character_turn_update:type()
- )
- -> bm_character_turn_update:type().
-add_activation_updates ([], Update) ->
- Update;
-add_activation_updates ([IX|NextIXs], Update) ->
- add_activation_updates
- (
- NextIXs,
- bm_character_turn_update:add_to_db
- (
- sh_db_query:update_indexed
- (
- bm_battle:get_characters_field(),
- IX,
- [sh_db_query:set_field(bm_character:get_active_field(), true)]
- ),
- Update
- )
- ).
+ {UpdatedBattle, DBQueries}.
-spec update
(
@@ -101,16 +108,23 @@ update (Update) ->
Data = bm_character_turn_update:get_data(Update),
Battle = bm_character_turn_data:get_battle(Data),
- S0Battle = set_player_turn_to_next(Battle),
- {S1Battle, NextPlayer} = reset_next_player_timeline(S0Battle),
- {S2Battle, ActivatedCharactersIX} =
+ {S0Battle, DBQuery0} = set_player_turn_to_next(Battle),
+ {S1Battle, NextPlayer, DBQuery1} = reset_next_player_timeline(S0Battle),
+ {S2Battle, DBQueries} =
activate_next_players_characters(S1Battle, NextPlayer),
- S0Update = add_activation_updates(ActivatedCharactersIX, Update),
+ S0Data = bm_character_turn_data:set_battle(S2Battle, Data),
+ S0Update = bm_character_turn_update:set_data(S0Data, Update),
- UpdatedData = bm_character_turn_data:set_battle(S2Battle, Data),
+ S1Update =
+ lists:foldl
+ (
+ fun bm_character_turn_update:add_to_db/2,
+ S0Update,
+ [DBQuery0|[DBQuery1|DBQueries]]
+ ),
- bm_character_turn_update:set_data(UpdatedData, S0Update).
+ S1Update.
-spec requires_update (bm_character_turn_update:type()) -> boolean().
requires_update (Update) ->
@@ -118,7 +132,7 @@ requires_update (Update) ->
Battle = bm_character_turn_data:get_battle(Data),
Characters = bm_battle:get_characters(Battle),
- array_util:none(fun bm_character:get_is_active/1, Characters).
+ sh_array_util:none(fun bm_character:get_is_active/1, Characters).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/src/battlemap/game-logic/bm_turn_actions.erl b/src/battlemap/game-logic/bm_turn_actions.erl
index bf4075f..e94d36a 100644
--- a/src/battlemap/game-logic/bm_turn_actions.erl
+++ b/src/battlemap/game-logic/bm_turn_actions.erl
@@ -40,6 +40,8 @@ handle_switch_weapon (Update) ->
bm_character:set_weapon_ids(UpdatedWeaponIDs, Character)
),
+ TimelineItem = bm_turn_result:new_character_switched_weapons(CharacterIX),
+
DBQuery =
sh_db_query:update_indexed
(
@@ -57,14 +59,8 @@ handle_switch_weapon (Update) ->
UpdatedData = bm_character_turn_data:set_character(UpdatedCharacter, Data),
S0Update = bm_character_turn_update:set_data(UpdatedData, Update),
- S1Update =
- bm_character_turn_update:add_to_timeline
- (
- bm_turn_result:new_character_switched_weapons(CharacterIX),
- S0Update
- ),
- bm_character_turn_update:add_to_db(DBQuery, S1Update).
+ bm_character_turn_update:add_to_timeline(TimelineItem, DBQuery, S0Update).
%%%% MOVING %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec get_path_cost_and_destination
@@ -137,32 +133,32 @@ commit_move (Update, Path, NewLocation) ->
UpdatedData = bm_character_turn_data:set_character(UpdatedCharacter, Data),
- S0Update =
- bm_character_turn_update:add_to_timeline
+ TimelineItem =
+ bm_turn_result:new_character_moved(CharacterIX, Path, NewLocation),
+
+ DBQuery =
+ sh_db_query:update_indexed
(
- bm_turn_result:new_character_moved(CharacterIX, Path, NewLocation),
- Update
+ bm_battle:get_characters_field(),
+ CharacterIX,
+ [
+ sh_db_query:set_field
+ (
+ bm_character:get_location_field(),
+ NewLocation
+ )
+ ]
),
- S1Update =
- bm_character_turn_update:add_to_db
+ S0Update =
+ bm_character_turn_update:add_to_timeline
(
- sh_db_query:update_indexed
- (
- bm_battle:get_characters_field(),
- CharacterIX,
- [
- sh_db_query:set_field
- (
- bm_character:get_location_field(),
- NewLocation
- )
- ]
- ),
- S0Update
+ TimelineItem,
+ DBQuery,
+ Update
),
- bm_character_turn_update:set_data(UpdatedData, S1Update).
+ bm_character_turn_update:set_data(UpdatedData, S0Update).
-spec handle_move
(
@@ -282,19 +278,10 @@ handle_attack (BattleAction, Update) ->
AttackSequence = get_attack_sequence(Character, TargetCharacter),
{AttackEffects, RemainingAttackerHealth, RemainingDefenderHealth} =
- handle_attack_sequence
- (
- Character,
- TargetCharacter,
- AttackSequence
- ),
+ handle_attack_sequence(Character, TargetCharacter, AttackSequence),
UpdatedCharacter =
- bm_character:set_current_health
- (
- RemainingAttackerHealth,
- Character
- ),
+ bm_character:set_current_health(RemainingAttackerHealth, Character),
UpdatedBattle =
bm_battle:set_character
@@ -310,26 +297,15 @@ handle_attack (BattleAction, Update) ->
S0Data = bm_character_turn_data:set_battle(UpdatedBattle, Data),
- S1Data =
- bm_character_turn_data:set_character
- (
- UpdatedCharacter,
- S0Data
- ),
-
+ S1Data = bm_character_turn_data:set_character(UpdatedCharacter, S0Data),
- S0Update =
- bm_character_turn_update:add_to_timeline
+ TimelineItem =
+ bm_turn_result:new_character_attacked
(
- bm_turn_result:new_character_attacked
- (
- CharacterIX,
- TargetIX,
- AttackEffects
- ),
- Update
+ CharacterIX,
+ TargetIX,
+ AttackEffects
),
- S1Update = bm_character_turn_update:set_data(S1Data, S0Update),
DBQuery =
sh_db_query:update_indexed
@@ -345,7 +321,15 @@ handle_attack (BattleAction, Update) ->
]
),
- bm_character_turn_update:add_to_db(DBQuery, S1Update).
+ S0Update =
+ bm_character_turn_update:add_to_timeline
+ (
+ TimelineItem,
+ DBQuery,
+ Update
+ ),
+
+ bm_character_turn_update:set_data(S1Data, S0Update).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/src/battlemap/query/bm_character_turn.erl b/src/battlemap/query/bm_character_turn.erl
index 26b8dce..ccd9182 100644
--- a/src/battlemap/query/bm_character_turn.erl
+++ b/src/battlemap/query/bm_character_turn.erl
@@ -114,7 +114,18 @@ finalize_character (Update) ->
UpdatedData = bm_character_turn_data:set_character(DisabledCharacter, Data),
FinalizedData = bm_character_turn_data:clean_battle(UpdatedData),
- bm_character_turn_update:set_data(FinalizedData, Update).
+ DBQuery =
+ sh_db_query:update_indexed
+ (
+ bm_battle:get_characters_field(),
+ bm_character_turn_data:get_character_ix(Data),
+ [ sh_db_query:set_field(bm_character:get_active_field(), false) ]
+ ),
+
+ S0Update = bm_character_turn_update:set_data(FinalizedData, Update),
+ S1Update = bm_character_turn_update:add_to_db(DBQuery, S0Update),
+
+ S1Update.
-spec handle_actions
(
@@ -148,7 +159,26 @@ update_timeline (Update) ->
UpdatedBattle = bm_battle:set_player(PlayerIX, UpdatedPlayer, Battle),
UpdatedData = bm_character_turn_data:set_battle(UpdatedBattle, Data),
- bm_character_turn_update:set_data(UpdatedData, Update).
+ DBQuery =
+ sh_db_query:update_indexed
+ (
+ bm_battle:get_players_field(),
+ PlayerIX,
+ [
+ sh_db_query:add_to_field
+ (
+ bm_player:get_timeline_field(),
+ NewTimelineElements,
+ true % We add those to the start of the list
+ )
+ ]
+ ),
+
+ S0Update = bm_character_turn_update:set_data(UpdatedData, Update),
+ S1Update = bm_character_turn_update:add_to_db(DBQuery, S0Update),
+
+ S1Update.
+
-spec update_data
(
@@ -175,8 +205,6 @@ send_to_database (Update, Request) ->
Ops = bm_character_turn_update:get_db(Update),
Query = sh_db_query:new(battle_db, BattleID, {user, PlayerID}, Ops),
- % TODO: send queries to an actual DB...
-
sh_database:commit(Query),
ok.
diff --git a/src/battlemap/struct/bm_character_turn_update.erl b/src/battlemap/struct/bm_character_turn_update.erl
index 078075c..1ca5d94 100644
--- a/src/battlemap/struct/bm_character_turn_update.erl
+++ b/src/battlemap/struct/bm_character_turn_update.erl
@@ -30,7 +30,7 @@
get_db/1,
set_data/2,
- add_to_timeline/2,
+ add_to_timeline/3,
add_to_db/2
]
).
@@ -64,9 +64,21 @@ get_db (Update) -> Update#type.db.
set_data (Data, Update) ->
Update#type{ data = Data}.
--spec add_to_timeline (bm_turn_result:type(), type()) -> type().
-add_to_timeline (Item, Update) ->
- Update#type{ timeline = [bm_turn_result:encode(Item)|Update#type.timeline] }.
+-spec add_to_timeline
+ (
+ bm_turn_result:type(),
+ sh_db_query:op(),
+ type()
+ ) -> type().
+add_to_timeline (Item, DBUpdate, Update) ->
+ add_to_db
+ (
+ DBUpdate,
+ Update#type
+ {
+ timeline = [bm_turn_result:encode(Item)|Update#type.timeline]
+ }
+ ).
-spec add_to_db (sh_db_query:op(), type()) -> type().
add_to_db (Item, Update) ->
diff --git a/src/battlemap/struct/bm_player.erl b/src/battlemap/struct/bm_player.erl
index 3f14a6f..fa877c1 100644
--- a/src/battlemap/struct/bm_player.erl
+++ b/src/battlemap/struct/bm_player.erl
@@ -26,7 +26,9 @@
get_id/1,
get_timeline/1,
add_to_timeline/2,
- reset_timeline/1
+ reset_timeline/1,
+
+ get_timeline_field/0
]
).
@@ -70,3 +72,5 @@ new (ID) ->
timeline = []
}.
+-spec get_timeline_field () -> non_neg_integer().
+get_timeline_field () -> #player.timeline.
diff --git a/src/db/logic/db_access.erl b/src/db/logic/db_access.erl
index f589ba8..99d17ea 100644
--- a/src/db/logic/db_access.erl
+++ b/src/db/logic/db_access.erl
@@ -18,12 +18,22 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec get_value (list(sh_db_item:type())) -> ({'ok', any()} | 'not_found').
get_value ([]) -> not_found;
get_value ([Regval]) -> {ok, sh_db_item:get_value(Regval)}.
+-spec read_transaction (atom(), any()) -> ({'ok', any()} | 'not_found').
read_transaction (DB, ID) ->
get_value(mnesia:read(DB, ID)).
+-spec insert_transaction
+ (
+ atom(),
+ any(),
+ sh_db_user:permission(),
+ any()
+ )
+ -> 'ok'.
insert_transaction (DB, ID, Perm, Value) ->
StoredItem = sh_db_item:new(ID, Perm, Value),
% FIXME: handle return value, mnesia:write -> (transaction abort | ok).
@@ -31,6 +41,7 @@ insert_transaction (DB, ID, Perm, Value) ->
mnesia:write(DB, StoredItem, sticky_write),
ok.
+-spec query_transaction (sh_db_query:type()) -> 'ok'.
query_transaction (Query) ->
DB = sh_db_query:get_database(Query),
ID = sh_db_query:get_entry_id(Query),
@@ -44,11 +55,16 @@ query_transaction (Query) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec read (atom(), any())
+ -> ({'aborted', any()} | {'atomic', ({'ok', any()} | 'not_found')}).
read (DB, ID) ->
mnesia:transaction(fun read_transaction/2, [DB, ID]).
+-spec insert (atom(), any(), sh_db_user:permission(), any())
+ -> ({'aborted', any()} | {'atomic', 'ok'}).
insert (DB, ID, Perm, Value) ->
mnesia:transaction(fun insert_transaction/4, [DB, ID, Perm, Value]).
+-spec query (sh_db_query:type()) -> ({'aborted', any()} | {'atomic', 'ok'}).
query (Query) ->
mnesia:transaction(fun query_transaction/1, [Query]).
diff --git a/src/db/struct/db_model.erl b/src/db/struct/db_model.erl
index 8097bcb..3e00b95 100644
--- a/src/db/struct/db_model.erl
+++ b/src/db/struct/db_model.erl
@@ -45,6 +45,7 @@ new (DBName, StorageFile, Neighbors) ->
neighbors = Neighbors
}.
+-spec start(type()) -> 'ok'.
start (Model) ->
DBName = Model#db_model.name,
StorageFile = Model#db_model.store_file,
@@ -68,4 +69,6 @@ start (Model) ->
{type, ordered_set},
{local_content, false}
]
- ).
+ ),
+
+ ok.
diff --git a/src/shared/io/sh_database.erl b/src/shared/io/sh_database.erl
index 8b52f9e..233e37d 100644
--- a/src/shared/io/sh_database.erl
+++ b/src/shared/io/sh_database.erl
@@ -19,8 +19,15 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec get_db_node () -> node().
get_db_node () -> list_to_atom("db_node@" ++ net_adm:localhost()).
+-spec do_remote_operation (atom(), list(any())) ->
+ (
+ {'badrpc', any()}
+ | {'aborted', any()}
+ | {'atomic', ({'ok', any()} | 'ok' | 'not_found')}
+ ).
do_remote_operation (Op, Params) ->
rpc:call(get_db_node(), db_access, Op, Params).
diff --git a/src/battlemap/util/array_util.erl b/src/shared/util/sh_array_util.erl
index 418d9ce..5f58b36 100644
--- a/src/battlemap/util/array_util.erl
+++ b/src/shared/util/sh_array_util.erl
@@ -1,4 +1,4 @@
--module(array_util).
+-module(sh_array_util).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%