From 545be2964873423280fae2cb1c211b746a37b562 Mon Sep 17 00:00:00 2001 From: Nathanael Sensfelder Date: Wed, 16 Jan 2019 00:08:14 +0100 Subject: ... --- src/battle/query/btl_join.erl | 48 ++++++-- src/battle/struct/btl_pending_battle.erl | 46 +++++++- src/bounty/bnt_join_battle.erl | 194 +++++++++++++++++++++++-------- 3 files changed, 225 insertions(+), 63 deletions(-) diff --git a/src/battle/query/btl_join.erl b/src/battle/query/btl_join.erl index 587f555..c38cfde 100644 --- a/src/battle/query/btl_join.erl +++ b/src/battle/query/btl_join.erl @@ -14,6 +14,7 @@ player_id :: shr_player:id(), session_token :: binary(), mode :: mode(), + summary_ix :: non_neg_integer(), size :: non_neg_integer(), roster_ixs :: list(non_neg_integer()), map_id :: ataxia_id:type() @@ -38,6 +39,7 @@ parse_input (Req) -> JSONReqMap = jiffy:decode(Req, [return_maps]), PlayerID = maps:get(<<"pid">>, JSONReqMap), SessionToken = maps:get(<<"stk">>, JSONReqMap), + SummaryIX = maps:get(<<"six">>, JSONReqMap), Mode = case maps:get(<<"m">>, JSONReqMap) of @@ -65,6 +67,7 @@ parse_input (Req) -> session_token = SessionToken, mode = Mode, size = Size, + summary_ix = SummaryIX, roster_ixs = Roster, map_id = MapID }. @@ -85,6 +88,7 @@ authenticate_user (Input) -> handle_attack (Input) -> PlayerID = Input#input.player_id, SelectedCharacterIXs = Input#input.roster_ixs, + SummaryIX = Input#input.summary_ix, PlayerDBUser = ataxia_security:user_from_id(PlayerID), PartySize = length(SelectedCharacterIXs), @@ -106,25 +110,46 @@ handle_attack (Input) -> ] ) ), - ataxic:ge + ataxic:land ( - ataxic:field - ( - ataxia_entry:get_value_field(), - ataxic:field + [ + ataxic:ge + ( + ataxic:field + ( + ataxia_entry:get_value_field(), + ataxic:field + ( + btl_pending_battle:get_free_slots_field(), + ataxic:current_value() + ) + ), + ataxic:constant(PartySize) + ), + ataxic:neg ( - btl_pending_battle:get_free_slots_field(), - ataxic:current_value() + ataxic:field + ( + btl_pending_battle:get_player_ids_field(), + ataxic:apply_function + ( + lists, + member, + [ + ataxic:constant(PlayerID), + ataxic:current_value() + ] + ) + ) ) - ), - ataxic:constant(PartySize) + ] ) - % missing: test that user isn't already a participant. ), bnt_join_battle:attempt ( PlayerID, + SummaryIX, SelectedCharacterIXs, AvailablePendingBattleID, AvailablePendingBattle @@ -135,9 +160,10 @@ handle_attack (Input) -> handle_defend (Input) -> PlayerID = Input#input.player_id, SelectedCharacterIXs = Input#input.roster_ixs, + SummaryIX = Input#input.summary_ix, MapID = Input#input.map_id, - bnt_join_battle:generate(PlayerID, MapID, SelectedCharacterIXs), + bnt_join_battle:generate(PlayerID, SummaryIX, MapID, SelectedCharacterIXs), ok. diff --git a/src/battle/struct/btl_pending_battle.erl b/src/battle/struct/btl_pending_battle.erl index a69e6ce..ab0e67d 100644 --- a/src/battle/struct/btl_pending_battle.erl +++ b/src/battle/struct/btl_pending_battle.erl @@ -10,6 +10,9 @@ pending_battle, { free_slots :: non_neg_integer(), + player_ids :: list(shr_player:id()), + player_summary_ixs :: list(non_neg_integer()), + battle_id :: btl_battle:id(), battle :: btl_battle:type() } ). @@ -30,12 +33,21 @@ [ get_battle/1, get_free_slots/1, + get_battle_id/1, + get_player_ids/1, + get_player_summary_ixs/1, set_battle/2, set_free_slots/2, + set_battle_id/2, + set_player_ids/2, + set_player_summary_ixs/2, get_battle_field/0, - get_free_slots_field/0 + get_free_slots_field/0, + get_battle_id_field/0, + get_player_ids_field/0, + get_player_summary_ixs_field/0 ] ). @@ -58,24 +70,56 @@ new (FreeSlots, Battle) -> #pending_battle { free_slots = FreeSlots, + player_ids = [], + player_summary_ixs = [], + battle_id = ataxia_id:null(), battle = Battle }. %%%% Accessors +-spec get_battle_id (type()) -> btl_battle:id(). +get_battle_id (PBattle) -> PBattle#pending_battle.battle_id. + -spec get_battle (type()) -> btl_battle:type(). get_battle (PBattle) -> PBattle#pending_battle.battle. -spec get_free_slots (type()) -> non_neg_integer(). get_free_slots (PBattle) -> PBattle#pending_battle.free_slots. +-spec get_player_ids (type()) -> list(shr_player:id()). +get_player_ids (PBattle) -> PBattle#pending_battle.player_ids. + +-spec get_player_summary_ixs (type()) -> list(non_neg_integer()). +get_player_summary_ixs (PBattle) -> PBattle#pending_battle.player_summary_ixs. + -spec set_battle (btl_battle:type(), type()) -> type(). set_battle (Battle, PBattle) -> PBattle#pending_battle{ battle = Battle }. +-spec set_battle_id (btl_battle:id(), type()) -> type(). +set_battle_id (BattleID, PBattle) -> + PBattle#pending_battle{ battle_id = BattleID }. + -spec set_free_slots (non_neg_integer(), type()) -> type(). set_free_slots (Val, PBattle) -> PBattle#pending_battle{ free_slots = Val }. +-spec set_player_summary_ixs (list(non_neg_integer()), type()) -> type(). +set_player_summary_ixs (Val, PBattle) -> + PBattle#pending_battle{ player_summary_ixs = Val }. + +-spec set_player_ids (list(shr_player:id()), type()) -> type(). +set_player_ids (Val, PBattle) -> PBattle#pending_battle{ player_ids = Val }. + +-spec get_battle_id_field () -> non_neg_integer(). +get_battle_id_field () -> #pending_battle.battle_id. + -spec get_battle_field () -> non_neg_integer(). get_battle_field () -> #pending_battle.battle. -spec get_free_slots_field () -> non_neg_integer(). get_free_slots_field () -> #pending_battle.free_slots. + +-spec get_player_ids_field () -> non_neg_integer(). +get_player_ids_field () -> #pending_battle.player_ids. + +-spec get_player_summary_ixs_field () -> non_neg_integer(). +get_player_summary_ixs_field () -> #pending_battle.player_summary_ixs. diff --git a/src/bounty/bnt_join_battle.erl b/src/bounty/bnt_join_battle.erl index d0eb7ef..7880938 100644 --- a/src/bounty/bnt_join_battle.erl +++ b/src/bounty/bnt_join_battle.erl @@ -3,32 +3,6 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --record -( - bounty_params, - { - player_id :: shr_player:id(), - summary_ix :: non_neg_integer(), - summary_category :: shr_battle_summary:category(), - summary_mode :: shr_battle_summary:mode(), - 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. - } -). - --record -( - bounty_data, - { - pending_battle :: btl_pending_battle:type() - } -). - --type bounty_params() :: #bounty_params{}. --type bounty_data() :: (#bounty_data{} | none). - --type stage() :: -1..1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -412,11 +386,18 @@ get_roster_characters (PlayerID, SelectedRosterCharacterIXs) -> -spec add_to_pending_battle ( shr_player:id(), + non_neg_integer(), list(non_neg_integer()), btl_pending_battle:type() ) -> {btl_pending_battle:type(), ataxic:basic()}. -add_to_pending_battle (PlayerID, SelectedRosterCharacterIXs, PendingBattle) -> +add_to_pending_battle +( + PlayerID, + PlayerSumIX, + SelectedRosterCharacterIXs, + PendingBattle +) -> Battle = btl_pending_battle:get_battle(PendingBattle), RemainingSlots = ( @@ -452,6 +433,16 @@ add_to_pending_battle (PlayerID, SelectedRosterCharacterIXs, PendingBattle) -> ( btl_pending_battle:get_free_slots_field(), ataxic:constant(RemainingSlots) + ), + ataxic:update_field + ( + btl_pending_battle:get_player_ids_field(), + ataxic:list_cons(ataxic:constant(PlayerID)) + ), + ataxic:update_field + ( + btl_pending_battle:get_player_summary_ixs_field(), + ataxic:list_cons(ataxic:constant(PlayerSumIX)) ) ] ), @@ -462,11 +453,18 @@ add_to_pending_battle (PlayerID, SelectedRosterCharacterIXs, PendingBattle) -> -spec generate_pending_battle ( shr_player:id(), + non_neg_integer(), map_map:id(), list(non_neg_integer()) ) -> btl_pending_battle:type(). -generate_pending_battle (PlayerID, MapID, SelectedRosterCharacterIXs) -> +generate_pending_battle +( + PlayerID, + PlayerSumIX, + MapID, + SelectedRosterCharacterIXs +) -> Map = shr_timed_cache:fetch ( @@ -497,6 +495,7 @@ generate_pending_battle (PlayerID, MapID, SelectedRosterCharacterIXs) -> add_to_pending_battle ( PlayerID, + PlayerSumIX, SelectedRosterCharacterIXs, PendingBattle ), @@ -506,18 +505,20 @@ generate_pending_battle (PlayerID, MapID, SelectedRosterCharacterIXs) -> -spec repair_join_battle ( shr_player:id(), + non_neg_integer(), list(non_neg_integer()), btl_pending_battle:id(), btl_pending_battle:type() ) -> {ok, btl_pending_battle:type()}. -repair_join_battle (PlayerID, RosterCharIXs, PBattleID, PBattle) -> +repair_join_battle (PlayerID, PlayerSumIX, RosterCharIXs, PBattleID, PBattle) -> PlayerUser = ataxia_security:user_from_id(PlayerID), {S0PBattle, AtaxicUpdate} = add_to_pending_battle ( PlayerID, + PlayerSumIX, RosterCharIXs, PBattle ), @@ -536,13 +537,15 @@ repair_join_battle (PlayerID, RosterCharIXs, PBattleID, PBattle) -> -spec repair_create_battle ( shr_player:id(), + non_neg_integer(), list(non_neg_integer()), btl_pending_battle:id(), map_map:id() ) -> {ok, btl_pending_battle:type()}. -repair_create_battle (PlayerID, RosterCharIXs, PBattleID, MapID) -> - NewPendingBattle = generate_pending_battle(PlayerID, MapID, RosterCharIXs), +repair_create_battle (PlayerID, PlayerSumIX, RosterCharIXs, PBattleID, MapID) -> + NewPendingBattle = + generate_pending_battle(PlayerID, PlayerSumIX, MapID, RosterCharIXs), ok = ataxia_client:update @@ -561,25 +564,96 @@ repair_create_battle (PlayerID, RosterCharIXs, PBattleID, MapID) -> non_neg_integer(), btl_pending_battle:id() ) - -> {ok, btl_pending_battle:type()}. + -> ok. repair_user_link (PlayerID, PBattleUserIX, PBattleID) -> PlayerUser = ataxia_security:user_from_id(PlayerID), + BattleSummary = + shr_battle_summary:new(PBattleID, <<"Test Battle">>, <<"">>, false), ok = - ataxia_client:update_if + ataxia_client:update ( player_db, PlayerUser, ataxic:update_value ( + ataxic:update_field + ( + shr_player:get_invasion_summaries_field(), + ataxic:apply_function + ( + orddict, + store, + [ + ataxic:constant(PBattleUserIX), + ataxic:constant + ( + BattleSummary + ), + ataxic:current_value() + ] + ) + ) ), + PlayerID + ). - ) +-spec repair_generate_battle + ( + btl_pending_battle:id(), + btl_pending_battle:type() + ) + -> ok. +repair_generate_battle (PBattleID, PBattle) -> + Battle = btl_pending_battle:get_battle(PBattle), + {ok, BattleID} = ataxia_client:reserve(battle_db, ataxia_security:janitor()), + + BattlePermission = + ataxia_security:allow + ( + lists:map + ( + fun ataxia_security:user_from_id/1, + btl_pending_battle:get_player_ids(PBattle) + ) + ), + + ok = + ataxia_client:update + ( + pending_battle_db, + ataxia_security:admin(), + ataxic:update_value + ( + ataxic:update_field + ( + btl_pending_battle:get_battle_id_field(), + ataxic:constant(BattleID) + ) + ), + PBattleID + ), + + ok = + ataxia_client:update + ( + battle_db, + ataxia_security:admin(), + ataxic:sequence_meta + ( + [ + ataxic:update_read_permission(ataxic:constant(BattlePermission)), + ataxic:update_write_permission + ( + ataxic:constant(BattlePermission) + ), + ataxic:update_value(ataxic:constant(Battle)) + ] + ), + BattleID + ), -stage (1, BountyParams, none) -> - PlayerID = BountyParams#bounty_params.player_id, - SummaryIX = SelectedRosterCharacterIXs = BountyParams#bounty_params.roster_ixs, - none. + ok. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -592,12 +666,12 @@ stage (1, BountyParams, none) -> list(non_neg_integer()) ) -> 'ok'. -generate (PlayerID, SummaryIX, MapID, SelectedRosterCharacterIXs) -> +generate (PlayerID, SummaryIX, MapID, RosterCharIXs) -> PlayerUser = ataxia_security:user_from_id(PlayerID), AnyoneAndMeAllowed = ataxia_security:add_access(PlayerUser, ataxia_security:allow_any()), - {ok, NewPendingBattleID} = + {ok, NewPBattleID} = ataxia_client:reserve ( pending_battle_db, @@ -605,22 +679,32 @@ generate (PlayerID, SummaryIX, MapID, SelectedRosterCharacterIXs) -> AnyoneAndMeAllowed ), - BountyParams = - #bounty_params - { - player_id = PlayerID, - summary_ix = SummaryIX, - map_id = MapID, - roster_ixs = SelectedRosterCharacterIXs, - pending_battle_id = NewPendingBattleID - }, +% BountyParams = +% #bounty_params +% { +% player_id = PlayerID, +% summary_ix = SummaryIX, +% map_id = MapID, +% roster_ixs = RosterCharIXs, +% pending_battle_id = NewPBattleID +% }, % TODO: generate bounty. - stage(-1, BountyParams, none), + repair_create_battle + ( + PlayerID, + SummaryIX, + RosterCharIXs, + NewPBattleID, + MapID + ), + + repair_user_link(PlayerID, SummaryIX, NewPBattleID), ok. + -spec attempt ( shr_player:id(), @@ -653,10 +737,11 @@ attempt PlayerUser = ataxia_security:user_from_id(PlayerID), % Stage 0, optimized: - {_S0PendingBattle, AtaxicUpdate} = + {S0PendingBattle, AtaxicUpdate} = add_to_pending_battle ( PlayerID, + SummaryIX, SelectedRosterCharacterIXs, PendingBattle ), @@ -670,4 +755,11 @@ attempt PendingBattleID ), + repair_user_link(PlayerID, SummaryIX, PendingBattleID), + + case btl_pending_battle:get_free_slots(S0PendingBattle) of + 0 -> repair_generate_battle(PendingBattleID, S0PendingBattle); + _ -> ok + end, + ok. -- cgit v1.2.3-70-g09d2