| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2019-01-16 00:08:14 +0100 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2019-01-16 00:08:14 +0100 | 
| commit | 545be2964873423280fae2cb1c211b746a37b562 (patch) | |
| tree | 9096f6c329e4ed5e3470f02ae3256cdbedda6ee3 | |
| parent | 1ebb5eaa2edc601bed405f8f7733412b0378a185 (diff) | |
...
| -rw-r--r-- | src/battle/query/btl_join.erl | 48 | ||||
| -rw-r--r-- | src/battle/struct/btl_pending_battle.erl | 46 | ||||
| -rw-r--r-- | 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. | 


