summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/battle/query/btl_join.erl3
-rw-r--r--src/bounty/bnt_generate_player.erl45
-rw-r--r--src/bounty/bnt_join_battle.erl258
-rw-r--r--src/shared/io/shr_timed_cache.erl1
4 files changed, 225 insertions, 82 deletions
diff --git a/src/battle/query/btl_join.erl b/src/battle/query/btl_join.erl
index a723a8b..85c190e 100644
--- a/src/battle/query/btl_join.erl
+++ b/src/battle/query/btl_join.erl
@@ -89,7 +89,7 @@ handle_attack (Input) ->
PartySize = length(SelectedCharacterIXs),
% TODO: be less brutal if none is found.
- {ok, AvailablePendingBattle, _ID} =
+ {ok, AvailablePendingBattle, AvailablePendingBattleID} =
ataxia_client:update_and_fetch_any
(
btl_pending,
@@ -125,6 +125,7 @@ handle_attack (Input) ->
(
PlayerID,
SelectedCharacterIXs,
+ AvailablePendingBattleID,
AvailablePendingBattle
),
diff --git a/src/bounty/bnt_generate_player.erl b/src/bounty/bnt_generate_player.erl
index 8612042..73767b0 100644
--- a/src/bounty/bnt_generate_player.erl
+++ b/src/bounty/bnt_generate_player.erl
@@ -14,8 +14,9 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec reserve_login (binary(), binary()) -> 'ok'.
reserve_login (UsernameLC, EmailLC) ->
- ok = ataxia_client:reserve(login_db, UsernameLC),
- ok = ataxia_client:reserve(login_db, EmailLC),
+ Anyone = ataxia_security:allow_any(),
+ ok = ataxia_client:reserve(login_db, Anyone, Anyone, UsernameLC),
+ ok = ataxia_client:reserve(login_db, Anyone, Anyone, EmailLC),
ok.
@@ -109,6 +110,7 @@ generate_roster (PlayerID) ->
)
-> {shr_player:id(), shr_player:type()}.
attempt (Username, Password, Email) ->
+ % FIXME: still requires a bounty.
UsernameLC = string:lowercase(Username),
EmailLC = string:lowercase(Email),
@@ -116,45 +118,32 @@ attempt (Username, Password, Email) ->
Player = shr_player:new(Username, Password, Email),
- JanitorOnlyPermission =
- ataxia_security:allow_only(ataxia_security:janitor()),
+ AnyoneHasAccess = ataxia_security:allow_any(),
{ok, PlayerID} =
- ataxia_client:add
+ ataxia_client:reserve
(
player_db,
- JanitorOnlyPermission,
- JanitorOnlyPermission,
- Player
+ AnyoneHasAccess,
+ AnyoneHasAccess
),
shr_janitor:new(player_db, PlayerID),
InvID = generate_inventory(PlayerID),
RosterID = generate_roster(PlayerID),
+ S0Player =
+ shr_player:set_inventory_id
+ (
+ InvID,
+ shr_player:set_roster_id(RosterID, Player)
+ ),
PlayerUpdateQueryOps =
ataxic:sequence_meta
(
[
- ataxic:update_value
- (
- ataxic:sequence
- (
- [
- ataxic:update_field
- (
- shr_player:get_inventory_id_field(),
- ataxic:constant(InvID)
- ),
- ataxic:update_field
- (
- shr_player:get_roster_id_field(),
- ataxic:constant(RosterID)
- )
- ]
- )
- ),
+ ataxic:update_value(ataxic:constant(S0Player)),
ataxic:update_read_permission
(
ataxic:constant
@@ -181,9 +170,9 @@ attempt (Username, Password, Email) ->
ataxia_client:update
(
player_db,
- ataxia_security:janitor(),
+ ataxia_security:user_from_id(PlayerID),
PlayerUpdateQueryOps,
PlayerID
),
- {PlayerID, Player}.
+ {PlayerID, S0Player}.
diff --git a/src/bounty/bnt_join_battle.erl b/src/bounty/bnt_join_battle.erl
index 5daa548..3142a16 100644
--- a/src/bounty/bnt_join_battle.erl
+++ b/src/bounty/bnt_join_battle.erl
@@ -3,11 +3,24 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-record
+(
+ bounty_data,
+ {
+ player_id :: shr_player:id(),
+ pending_battle_id :: btl_pending_battle:id(),
+ roster_ixs :: list(non_neg_integer()),
+ map_id :: map_map:id() % null if the bounty is to join.
+ }
+).
+-type bounty_data() :: #bounty_data{}.
+
+-type stage() :: integer().
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--export([generate/3, attempt/3]).
+-export([generate/3, attempt/4]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -381,59 +394,16 @@ get_roster_characters (PlayerID, SelectedRosterCharacterIXs) ->
SelectedRosterCharacterIXs
).
-%%%% BATTLE CREATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec generate_battle (shr_player:id(), map_map:id()) -> btl_battle:type().
-generate_battle (PlayerID, MapID) ->
- Map =
- shr_timed_cache:fetch
- (
- map_db,
- ataxia_security:user_from_id(PlayerID),
- MapID
- ),
- TileInstances = map_map:get_tile_instances(Map),
- BattleMap =
- btl_map:from_instances_tuple
- (
- map_map:get_width(Map),
- map_map:get_height(Map),
- TileInstances
- ),
-
- Battle = btl_battle:new(BattleMap),
-
- Battle.
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec generate
- (
- shr_player:id(),
- map_map:id(),
- list(non_neg_integer())
- )
- -> {btl_pending_battle:id(), btl_pending_battle:type()}.
-generate (PlayerID, MapID, SelectedRosterCharacterIXs) ->
- Battle = generate_battle(PlayerID, MapID),
- PendingBattle =
- btl_pending_battle:new
- (
- % TODO: More options than 1 vs N.
- (length(SelectedRosterCharacterIXs) * 2),
- Battle
- ),
-
- attempt(PlayerID, SelectedRosterCharacterIXs, PendingBattle).
-
--spec attempt
+%%%% STAGE 0: UPDATING THE PENDING BATTLE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec add_to_pending_battle
(
shr_player:id(),
list(non_neg_integer()),
btl_pending_battle:type()
)
- -> {btl_pending_battle:id(), btl_pending_battle:type()}.
-attempt (PlayerID, SelectedRosterCharacterIXs, PendingBattle) ->
+ -> {btl_pending_battle:type(), ataxic:basic()}.
+add_to_pending_battle (PlayerID, SelectedRosterCharacterIXs, PendingBattle) ->
Battle = btl_pending_battle:get_battle(PendingBattle),
RemainingSlots =
(
@@ -473,10 +443,192 @@ attempt (PlayerID, SelectedRosterCharacterIXs, PendingBattle) ->
]
),
- {S1PendingBattle, Update},
+ {S1PendingBattle, Update}.
+
+%%%% STAGE -1: CREATING THE PENDING BATTLE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec generate_pending_battle
+ (
+ shr_player:id(),
+ map_map:id(),
+ list(non_neg_integer())
+ ) -> btl_pending_battle:type().
+generate_pending_battle (PlayerID, MapID, SelectedRosterCharacterIXs) ->
+ Map =
+ shr_timed_cache:fetch
+ (
+ map_db,
+ ataxia_security:user_from_id(PlayerID),
+ MapID
+ ),
+ TileInstances = map_map:get_tile_instances(Map),
+ BattleMap =
+ btl_map:from_instances_tuple
+ (
+ map_map:get_width(Map),
+ map_map:get_height(Map),
+ TileInstances
+ ),
+
+ Battle = btl_battle:new(BattleMap),
- {ataxia_id:null(), S1PendingBattle}.
+ PendingBattle =
+ btl_pending_battle:new
+ (
+ % TODO: More options than 1 vs N.
+ (length(SelectedRosterCharacterIXs) * 2),
+ Battle
+ ),
+
+ {S0PendingBattle, _AtaxicUpdate} =
+ add_to_pending_battle
+ (
+ PlayerID,
+ SelectedRosterCharacterIXs,
+ PendingBattle
+ ),
+
+ S0PendingBattle.
+
+-spec stage (stage(), bounty_data()) -> 'ok'.
+stage (0, BountyData) ->
+ PlayerID = BountyData#bounty_data.player_id,
+ SelectedRosterCharacterIXs = BountyData#bounty_data.roster_ixs,
+ PendingBattleID = BountyData#bounty_data.pending_battle_id,
+ PlayerUser = ataxia_security:user_from_id(PlayerID),
+
+ % FIXME:
+ % This won't do... The Pending Battle might no longer be able to host this
+ % player. shr_timed_cache needs to be updated to include all of
+ % ataxia_client's fetch operations, and this call should a
+ % 'fetch_and_update' that temporary locks this battle. In addition, a new
+ % test for character capacity must be made.
+ PendingBattle =
+ shr_timed_cache:fetch(pending_battle_db, PlayerUser, PendingBattleID),
+
+ {S0PendingBattle, AtaxicUpdate} =
+ add_to_pending_battle
+ (
+ PlayerID,
+ SelectedRosterCharacterIXs,
+ PendingBattle
+ ),
+
+ ok =
+ ataxia_client:update
+ (
+ pending_battle_db,
+ PlayerUser,
+ AtaxicUpdate,
+ PendingBattleID
+ ),
+
+ shr_timed_cache:update
+ (
+ pending_battle_db,
+ PlayerUser,
+ PendingBattleID,
+ S0PendingBattle
+ ),
+
+ ok;
+
+stage (-1, BountyData) ->
+ PlayerID = BountyData#bounty_data.player_id,
+ SelectedRosterCharacterIXs = BountyData#bounty_data.roster_ixs,
+ PendingBattleID = BountyData#bounty_data.pending_battle_id,
+ MapID = BountyData#bounty_data.map_id,
+
+ NewPendingBattle =
+ generate_pending_battle(PlayerID, MapID, SelectedRosterCharacterIXs),
+
+ ok =
+ ataxia_client:update
+ (
+ pending_battle_db,
+ ataxia_security:user_from_id(PlayerID),
+ ataxic:update_value(ataxic:constant(NewPendingBattle)),
+ PendingBattleID
+ ),
+
+ ok.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec generate
+ (
+ shr_player:id(),
+ map_map:id(),
+ list(non_neg_integer())
+ )
+ -> 'ok'.
+generate (PlayerID, MapID, SelectedRosterCharacterIXs) ->
+ PlayerUser = ataxia_security:user_from_id(PlayerID),
+ AnyoneAndMeAllowed =
+ ataxia_security:add_access(PlayerUser, ataxia_security:allow_any()),
+
+ {ok, NewPendingBattleID} =
+ ataxia_client:reserve
+ (
+ pending_battle_db,
+ AnyoneAndMeAllowed,
+ AnyoneAndMeAllowed
+ ),
+
+ BountyData =
+ {
+ PlayerID,
+ MapID,
+ SelectedRosterCharacterIXs,
+ NewPendingBattleID
+ },
+
+ % TODO: generate bounty.
+
+ stage(-1, BountyData).
+
+-spec attempt
+ (
+ shr_player:id(),
+ list(non_neg_integer()),
+ btl_pending_battle:id(),
+ btl_pending_battle:type()
+ )
+ -> 'ok'.
+attempt
+(
+ PlayerID,
+ SelectedRosterCharacterIXs,
+ PendingBattleID,
+ PendingBattle
+) ->
+ BountyData =
+ {
+ PlayerID,
+ PendingBattleID,
+ SelectedRosterCharacterIXs
+ },
+
+ % TODO: generate bounty.
+
+ PlayerUser = ataxia_security:user_from_id(PlayerID),
+
+ % Stage 0, optimized:
+ {_S0PendingBattle, AtaxicUpdate} =
+ add_to_pending_battle
+ (
+ PlayerID,
+ SelectedRosterCharacterIXs,
+ PendingBattle
+ ),
+
+ ok =
+ ataxia_client:update
+ (
+ pending_battle_db,
+ PlayerUser,
+ AtaxicUpdate,
+ PendingBattleID
+ ),
- % TODO:
- % if RemainingSlots = 0 -> del this, new Battle.
- % Link either new Battle or current Pending Battle to player account.
+ ok.
diff --git a/src/shared/io/shr_timed_cache.erl b/src/shared/io/shr_timed_cache.erl
index 45ddb1a..1f784d3 100644
--- a/src/shared/io/shr_timed_cache.erl
+++ b/src/shared/io/shr_timed_cache.erl
@@ -23,6 +23,7 @@
).
%%%% Actual Interface
+% TODO: include all fetch operations of ataxia_client.
-export
(
[