summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2019-01-16 00:08:14 +0100
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2019-01-16 00:08:14 +0100
commit545be2964873423280fae2cb1c211b746a37b562 (patch)
tree9096f6c329e4ed5e3470f02ae3256cdbedda6ee3
parent1ebb5eaa2edc601bed405f8f7733412b0378a185 (diff)
...
-rw-r--r--src/battle/query/btl_join.erl48
-rw-r--r--src/battle/struct/btl_pending_battle.erl46
-rw-r--r--src/bounty/bnt_join_battle.erl194
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.