summaryrefslogtreecommitdiff |
diff options
author | nsensfel <SpamShield0@noot-noot.org> | 2019-01-04 19:07:50 +0100 |
---|---|---|
committer | nsensfel <SpamShield0@noot-noot.org> | 2019-01-04 19:07:50 +0100 |
commit | 16e66ae73cae78eb8179143336e14c6585ec1455 (patch) | |
tree | 76f1b30e5d48883a77478e01768fb81e3237e023 /src | |
parent | 83cd7ce064b8a46a106dc855d748b1bd7e45af01 (diff) |
Still working on bounties & matchmaking...
Diffstat (limited to 'src')
-rw-r--r-- | src/battle/query/btl_join.erl | 3 | ||||
-rw-r--r-- | src/bounty/bnt_generate_player.erl | 45 | ||||
-rw-r--r-- | src/bounty/bnt_join_battle.erl | 258 | ||||
-rw-r--r-- | src/shared/io/shr_timed_cache.erl | 1 |
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 ( [ |