summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2019-01-17 21:51:50 +0100
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2019-01-17 21:51:50 +0100
commit146120882616e46b75f881a12b69c9581be53861 (patch)
treecce4859686a50d04f61dc2ea3cb36da735c9c6fd
parent09d4492d776115666ba5839971414e18eac9fd90 (diff)
Matchmaking still has serious issues...
-rw-r--r--src/battle/struct/btl_player.erl29
-rw-r--r--src/bounty/bnt_join_battle.erl170
2 files changed, 187 insertions, 12 deletions
diff --git a/src/battle/struct/btl_player.erl b/src/battle/struct/btl_player.erl
index cedd9e7..d5c0de7 100644
--- a/src/battle/struct/btl_player.erl
+++ b/src/battle/struct/btl_player.erl
@@ -12,7 +12,9 @@
id :: shr_player:id(),
character_ix :: non_neg_integer(),
timeline :: list(any()),
- is_active :: boolean()
+ is_active :: boolean(),
+ summary_ix :: non_neg_integer(),
+ summary_category :: shr_battle_summary:category()
}
).
@@ -27,6 +29,8 @@
[
get_id/1,
get_index/1,
+ get_summary_index/1,
+ get_summary_category/1,
get_character_index/1,
get_timeline/1,
@@ -44,7 +48,7 @@
-export
(
[
- new/3
+ new/5
]
).
@@ -61,6 +65,12 @@ get_id (Player) -> Player#player.id.
-spec get_index (type()) -> non_neg_integer().
get_index (Player) -> Player#player.ix.
+-spec get_summary_index (type()) -> non_neg_integer().
+get_summary_index (Player) -> Player#player.summary_ix.
+
+-spec get_summary_category (type()) -> shr_battle_summary:category().
+get_summary_category (Player) -> Player#player.summary_category.
+
-spec get_character_index (type()) -> non_neg_integer().
get_character_index (Player) -> Player#player.character_ix.
@@ -85,15 +95,24 @@ add_to_timeline (NewEvents, Player) ->
-spec reset_timeline (type()) -> type().
reset_timeline (Player) -> Player#player{ timeline = [] }.
--spec new (non_neg_integer(), non_neg_integer(), shr_player:id()) -> type().
-new (IX, CharacterIX, ID) ->
+-spec new
+ (
+ non_neg_integer(),
+ non_neg_integer(),
+ shr_player:id(),
+ non_neg_integer(),
+ shr_battle_summary:category()
+ ) -> type().
+new (IX, CharacterIX, ID, SummaryIX, SummaryCategory) ->
#player
{
ix = IX,
character_ix = CharacterIX,
id = ID,
is_active = true,
- timeline = []
+ timeline = [],
+ summary_ix = SummaryIX,
+ summary_category = SummaryCategory
}.
-spec get_timeline_field () -> non_neg_integer().
diff --git a/src/bounty/bnt_join_battle.erl b/src/bounty/bnt_join_battle.erl
index 3a88e77..56b5af2 100644
--- a/src/bounty/bnt_join_battle.erl
+++ b/src/bounty/bnt_join_battle.erl
@@ -238,14 +238,24 @@ handle_characters
-spec add_player
(
shr_player:id(),
+ non_neg_integer(),
+ shr_battle_summary:category(),
btl_battle:type()
)
-> {btl_battle:type(), non_neg_integer(), ataxic:basic()}.
-add_player (PlayerID, Battle) ->
+add_player (PlayerID, PlayerSummaryIX, PlayerSummaryCategory, Battle) ->
Players = btl_battle:get_players(Battle),
PlayerIX = orddict:size(Players),
- NewPlayer = btl_player:new(PlayerIX, 0, PlayerID),
+ NewPlayer =
+ btl_player:new
+ (
+ PlayerIX,
+ 0,
+ PlayerID,
+ PlayerSummaryIX,
+ PlayerSummaryCategory
+ ),
NewPlayers = orddict:store(PlayerIX, NewPlayer, Players),
S0Battle = btl_battle:set_players(NewPlayers, Battle),
@@ -387,6 +397,7 @@ get_roster_characters (PlayerID, SelectedRosterCharacterIXs) ->
(
shr_player:id(),
non_neg_integer(),
+ shr_battle_summary:category(),
list(non_neg_integer()),
btl_pending_battle:type()
)
@@ -395,6 +406,7 @@ add_to_pending_battle
(
PlayerID,
PlayerSumIX,
+ PlayerSumCategory,
SelectedRosterCharacterIXs,
PendingBattle
) ->
@@ -406,7 +418,10 @@ add_to_pending_battle
),
NewCharacters = get_roster_characters(PlayerID, SelectedRosterCharacterIXs),
- {S0Battle, PlayerIX, BattleUpdate0} = add_player(PlayerID, Battle),
+
+ {S0Battle, PlayerIX, BattleUpdate0} =
+ add_player(PlayerID, PlayerSumIX, PlayerSumCategory, Battle),
+
{S1Battle, BattleUpdate1} =
add_characters(NewCharacters, PlayerIX, S0Battle),
@@ -466,6 +481,7 @@ add_to_pending_battle
(
shr_player:id(),
non_neg_integer(),
+ shr_battle_summary:category(),
map_map:id(),
list(non_neg_integer())
)
@@ -474,6 +490,7 @@ generate_pending_battle
(
PlayerID,
PlayerSumIX,
+ PlayerSumCategory,
MapID,
SelectedRosterCharacterIXs
) ->
@@ -508,6 +525,7 @@ generate_pending_battle
(
PlayerID,
PlayerSumIX,
+ PlayerSumCategory,
SelectedRosterCharacterIXs,
PendingBattle
),
@@ -518,6 +536,7 @@ generate_pending_battle
(
shr_player:id(),
non_neg_integer(),
+ shr_battle_summary:category(),
list(non_neg_integer()),
btl_pending_battle:id(),
btl_pending_battle:type()
@@ -527,6 +546,7 @@ repair_join_battle
(
PlayerID,
PlayerSumIX,
+ PlayerSumCategory,
RosterCharIXs,
PBattleID,
PBattle
@@ -538,6 +558,7 @@ repair_join_battle
(
PlayerID,
PlayerSumIX,
+ PlayerSumCategory,
RosterCharIXs,
PBattle
),
@@ -557,14 +578,30 @@ repair_join_battle
(
shr_player:id(),
non_neg_integer(),
+ shr_battle_summary:category(),
list(non_neg_integer()),
btl_pending_battle:id(),
map_map:id()
)
-> {ok, btl_pending_battle:type()}.
-repair_create_battle (PlayerID, PlayerSumIX, RosterCharIXs, PBattleID, MapID) ->
+repair_create_battle
+(
+ PlayerID,
+ PlayerSumIX,
+ PlayerSumCategory,
+ RosterCharIXs,
+ PBattleID,
+ MapID
+) ->
NewPendingBattle =
- generate_pending_battle(PlayerID, PlayerSumIX, MapID, RosterCharIXs),
+ generate_pending_battle
+ (
+ PlayerID,
+ PlayerSumIX,
+ PlayerSumCategory,
+ MapID,
+ RosterCharIXs
+ ),
ok =
ataxia_client:update
@@ -636,7 +673,7 @@ repair_user_link (PlayerID, Mode, Category, PBattleUserIX, PBattleID) ->
btl_pending_battle:id(),
btl_pending_battle:type()
)
- -> ok.
+ -> {btl_battle:id(), btl_battle:type()}.
repair_generate_battle (PBattleID, PBattle) ->
Battle = btl_pending_battle:get_battle(PBattle),
{ok, BattleID} = ataxia_client:reserve(battle_db, ataxia_security:janitor()),
@@ -686,6 +723,113 @@ repair_generate_battle (PBattleID, PBattle) ->
BattleID
),
+ {BattleID, Battle}.
+
+-spec repair_battle_final_link_of_player
+ (
+ btl_battle:id(),
+ btl_player:type()
+ )
+ -> ok.
+repair_battle_final_link_of_player (BattleID, Player) ->
+ SummaryField =
+ (
+ case btl_player:get_summary_category(Player) of
+ invasion -> shr_player:get_invasion_summaries_field();
+ event -> shr_player:get_event_summaries_field();
+ campaign -> shr_player:get_campaign_summaries_field()
+ end
+ ),
+
+ SummaryIX = btl_player:get_summary_index(Player),
+
+ Update =
+ ataxic:update_value
+ (
+ ataxic:update_field
+ (
+ SummaryField,
+ ataxic:apply_function
+ (
+ orddict,
+ store,
+ [
+ ataxic:constant(SummaryIX),
+ ataxic:sequence
+ (
+ [
+ ataxic:apply_function
+ (
+ orddict,
+ fetch,
+ [
+ ataxic:constant(SummaryIX),
+ ataxic:current_value()
+ ]
+ ),
+ ataxic:update_field
+ (
+ shr_battle_summary:get_is_pending_field(),
+ ataxic:constant(false)
+ ),
+ ataxic:update_field
+ (
+ shr_battle_summary:get_id_field(),
+ ataxic:constant(BattleID)
+ ),
+ ataxic:update_field
+ (
+ shr_battle_summary:get_is_players_turn_field(),
+ ataxic:constant(btl_player:get_index(Player) == 0)
+ )
+ ]
+ ),
+ ataxic:current_value()
+ ]
+ )
+ )
+ ),
+
+ ok =
+ ataxia_client:update
+ (
+ player_db,
+ ataxia_security:admin(),
+ Update,
+ btl_player:get_id(Player)
+ ),
+
+ ok.
+
+
+-spec repair_battle_final_links
+ (
+ btl_pending_battle:id(),
+ btl_battle:id(),
+ btl_battle:type()
+ )
+ -> ok.
+repair_battle_final_links (PendingBattleID, BattleID, Battle) ->
+
+ Players = btl_battle:get_players(Battle),
+
+ true =
+ lists:all
+ (
+ fun (Player) ->
+ (repair_battle_final_link_of_player(BattleID, Player) == ok)
+ end,
+ orddict:to_list(Players)
+ ),
+
+ ok =
+ ataxia_client:remove
+ (
+ pending_battle_db,
+ ataxia_security:admin(),
+ PendingBattleID
+ ),
+
ok.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -730,6 +874,7 @@ generate (PlayerID, Mode, Category, SummaryIX, MapID, RosterCharIXs) ->
(
PlayerID,
SummaryIX,
+ Category,
RosterCharIXs,
NewPBattleID,
MapID
@@ -781,6 +926,7 @@ attempt
(
PlayerID,
SummaryIX,
+ Category,
SelectedRosterCharacterIXs,
PendingBattle
),
@@ -797,7 +943,17 @@ attempt
repair_user_link(PlayerID, Mode, Category, SummaryIX, PendingBattleID),
case btl_pending_battle:get_free_slots(S0PendingBattle) of
- 0 -> repair_generate_battle(PendingBattleID, S0PendingBattle);
+ 0 ->
+ {BattleID, Battle} =
+ repair_generate_battle(PendingBattleID, S0PendingBattle),
+ ok =
+ repair_battle_final_links
+ (
+ PendingBattleID,
+ BattleID,
+ Battle
+ );
+
_ -> ok
end,