summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle/mechanic/btl_turn_progression.erl38
-rw-r--r--src/battle/struct/btl_battle.erl43
-rw-r--r--src/battle/struct/btl_player.erl11
-rw-r--r--src/bounty/bnt_join_battle.erl138
4 files changed, 112 insertions, 118 deletions
diff --git a/src/battle/mechanic/btl_turn_progression.erl b/src/battle/mechanic/btl_turn_progression.erl
index 6286cc1..ed181c5 100644
--- a/src/battle/mechanic/btl_turn_progression.erl
+++ b/src/battle/mechanic/btl_turn_progression.erl
@@ -12,7 +12,6 @@
handle/1
]
).
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -20,7 +19,7 @@
(
btl_battle:type()
)
- -> {btl_battle:type(), ataxic:basic()}.
+ -> {non_neg_integer(), btl_battle:type(), ataxic:basic()}.
prepare_player_turn_for_next_player (Battle) ->
Players = btl_battle:get_players(Battle),
CurrentPlayerTurn = btl_battle:get_current_player_turn(Battle),
@@ -36,16 +35,19 @@ prepare_player_turn_for_next_player (Battle) ->
Battle
),
- {UpdatedBattle, BattleAtaxiaUpdate}.
+ {
+ btl_player_turn:get_player_ix(UpdatedPlayerTurn),
+ UpdatedBattle,
+ BattleAtaxiaUpdate
+ }.
-spec reset_next_player_timeline
(
+ non_neg_integer(),
btl_battle:type()
)
- -> {btl_battle:type(), btl_player:type(), ataxic:basic()}.
-reset_next_player_timeline (Battle) ->
- NextPlayerTurn = btl_battle:get_current_player_turn(Battle),
- NextPlayerIX = btl_player_turn:get_player_ix(NextPlayerTurn),
+ -> {btl_battle:type(), ataxic:basic()}.
+reset_next_player_timeline (NextPlayerIX, Battle) ->
NextPlayer = btl_battle:get_player(NextPlayerIX, Battle),
{UpdatedNextPlayer, PlayerAtaxiaUpdate} =
@@ -60,17 +62,16 @@ reset_next_player_timeline (Battle) ->
Battle
),
- {UpdatedBattle, UpdatedNextPlayer, BattleAtaxiaUpdate}.
+ {UpdatedBattle, BattleAtaxiaUpdate}.
-spec activate_next_players_characters
(
- btl_battle:type(),
- btl_player:type()
+ non_neg_integer(),
+ btl_battle:type()
)
-> {btl_battle:type(), ataxic:basic()}.
-activate_next_players_characters (Battle, NextPlayer) ->
- NextPlayerIX = btl_player:get_index(NextPlayer),
+activate_next_players_characters (NextPlayerIX, Battle) ->
AllCharacters = btl_battle:get_characters(Battle),
{ResultingBattle, BattleAtaxicUpdates} =
@@ -110,14 +111,14 @@ activate_next_players_characters (Battle, NextPlayer) ->
activate_next_player (Update) ->
{S0Update, Battle} = btl_character_turn_update:get_battle(Update),
- {S0Battle, BattleAtaxiaUpdate0} =
+ {NextPlayerIX, S0Battle, BattleAtaxiaUpdate0} =
prepare_player_turn_for_next_player(Battle),
- {S1Battle, NextPlayer, BattleAtaxiaUpdate1} =
- reset_next_player_timeline(S0Battle),
+ {S1Battle, BattleAtaxiaUpdate1} =
+ reset_next_player_timeline(NextPlayerIX, S0Battle),
{S2Battle, BattleAtaxiaUpdate2} =
- activate_next_players_characters(S1Battle, NextPlayer),
+ activate_next_players_characters(NextPlayerIX, S1Battle),
S1Update =
btl_character_turn_update:ataxia_set_battle
@@ -138,10 +139,7 @@ activate_next_player (Update) ->
S2Update =
btl_character_turn_update:add_to_timeline
(
- btl_turn_result:new_player_turn_started
- (
- btl_player:get_index(NextPlayer)
- ),
+ btl_turn_result:new_player_turn_started(NextPlayerIX),
S1Update
),
diff --git a/src/battle/struct/btl_battle.erl b/src/battle/struct/btl_battle.erl
index 01ab65b..aedd8da 100644
--- a/src/battle/struct/btl_battle.erl
+++ b/src/battle/struct/btl_battle.erl
@@ -56,6 +56,9 @@
ataxia_set_character/3,
ataxia_set_character/4,
+ add_character/2,
+ ataxia_add_character/2,
+
set_players/2,
ataxia_set_players/2,
ataxia_set_players/3,
@@ -64,6 +67,9 @@
ataxia_set_player/3,
ataxia_set_player/4,
+ add_player/2,
+ ataxia_add_player/2,
+
set_current_player_turn/2,
ataxia_set_current_player_turn/2,
ataxia_set_current_player_turn/3,
@@ -243,6 +249,27 @@ set_character (IX, Character, Battle) ->
characters = orddict:store(IX, Character, Battle#battle.characters)
}.
+-spec add_character
+ (
+ btl_character:unresolved(),
+ type()
+ )
+ -> {non_neg_integer(), type()}.
+add_character (Character, Battle) ->
+ IX = orddict:size(Battle#battle.characters),
+ {IX, set_character(IX, Character, Battle)}.
+
+-spec ataxia_add_character
+ (
+ btl_character:unresolved(),
+ type()
+ )
+ -> {non_neg_integer(), type(), ataxic:basic()}.
+ataxia_add_character (Character, Battle) ->
+ IX = orddict:size(Battle#battle.characters),
+ {S0Battle, AtaxicUpdate} = ataxia_set_character(IX, Character, Battle),
+ {IX, S0Battle, AtaxicUpdate}.
+
-spec ataxia_set_character
(
non_neg_integer(),
@@ -373,6 +400,22 @@ ataxia_set_player (IX, Player, PlayerUpdate, Battle) ->
)
}.
+-spec add_player (btl_player:type(), type()) -> {non_neg_integer(), type()}.
+add_player (Player, Battle) ->
+ IX = orddict:size(Battle#battle.players),
+ {IX, set_player(IX, Player, Battle)}.
+
+-spec ataxia_add_player
+ (
+ btl_player:type(),
+ type()
+ )
+ -> {non_neg_integer(), type(), ataxic:basic()}.
+ataxia_add_player (Player, Battle) ->
+ IX = orddict:size(Battle#battle.players),
+ {S0Battle, AtaxicUpdate} = ataxia_set_player(IX, Player, Battle),
+ {IX, S0Battle, AtaxicUpdate}.
+
-spec set_current_player_turn (btl_player_turn:type(), type()) -> type().
set_current_player_turn (PlayerTurn, Battle) ->
Battle#battle
diff --git a/src/battle/struct/btl_player.erl b/src/battle/struct/btl_player.erl
index 604efca..d677790 100644
--- a/src/battle/struct/btl_player.erl
+++ b/src/battle/struct/btl_player.erl
@@ -8,7 +8,6 @@
(
player,
{
- ix :: non_neg_integer(),
id :: shr_player:id(),
character_ix :: non_neg_integer(),
timeline :: list(any()),
@@ -29,7 +28,6 @@
(
[
get_id/1,
- get_index/1,
get_luck/1,
get_summary_index/1,
get_summary_category/1,
@@ -59,7 +57,7 @@
-export
(
[
- new/5
+ new/4
]
).
@@ -73,9 +71,6 @@
-spec get_id (type()) -> shr_player:id().
get_id (Player) -> Player#player.id.
--spec get_index (type()) -> non_neg_integer().
-get_index (Player) -> Player#player.ix.
-
-spec get_luck (type()) -> integer().
get_luck (Player) -> Player#player.luck.
@@ -166,15 +161,13 @@ ataxia_reset_timeline (Player) ->
-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) ->
+new (CharacterIX, ID, SummaryIX, SummaryCategory) ->
#player
{
- ix = IX,
character_ix = CharacterIX,
id = ID,
is_active = true,
diff --git a/src/bounty/bnt_join_battle.erl b/src/bounty/bnt_join_battle.erl
index 68ef167..2d4d4e5 100644
--- a/src/bounty/bnt_join_battle.erl
+++ b/src/bounty/bnt_join_battle.erl
@@ -74,7 +74,7 @@ find_random_location (Map, ForbiddenLocations) ->
shr_map:type(),
ordsets:ordset(shr_location:type())
)
- -> btl_character:type().
+ -> btl_character:unresolved().
create_character (PlayerIX, RosterChar, Map, ForbiddenLocations) ->
{Location, Tile} = find_random_location(Map, ForbiddenLocations),
TileOmnimods = shr_tile:get_omnimods(Tile),
@@ -84,71 +84,53 @@ create_character (PlayerIX, RosterChar, Map, ForbiddenLocations) ->
% TODO: link rank to roster.
Result = btl_character:new(PlayerIX, optional, Location, ResolvedBaseChar),
- Result.
+ btl_character:to_unresolved(Result).
-spec handle_characters
(
- list(shr_character:unresolved()),
non_neg_integer(),
shr_map:type(),
ordsets:ordset(shr_location:type()),
- non_neg_integer(),
- orddict:orddict(non_neg_integer(), btl_character:type()),
- list(ataxic:basic())
+ list(shr_character:unresolved()),
+ btl_battle:type()
)
- ->
- {
- orddict:orddict(non_neg_integer(), btl_character:type()),
- list(ataxic:basic())
- }.
-handle_characters
-(
- [],
- _PlayerIX,
- _Map,
- _UsedLocations,
- _NextCharIX,
- Characters,
- AtaxicUpdates
-) ->
- {Characters, AtaxicUpdates};
-handle_characters
-(
- [RosterCharacter|NextRosterCharacters],
- PlayerIX,
- Map,
- UsedLocations,
- NextCharIX,
- Characters,
- AtaxicUpdates
-) ->
- NewCharacter =
- create_character(PlayerIX, RosterCharacter, Map, UsedLocations),
+ -> { btl_battle:type(), ataxic:basic() }.
+handle_characters (PlayerIX, Map, UsedLocations, RosterCharacters, Battle) ->
+ {_FinalUsedLocations, FinalBattle, FinalBattleAtaxicUpdates} =
+ lists:foldl
+ (
+ fun
+ (
+ RosterCharacter,
+ {CurrentUsedLocations, CurrentBattle, CurrentBattleAtaxicUpdates}
+ )
+ ->
+ NewCharacterRef =
+ create_character
+ (
+ PlayerIX,
+ RosterCharacter,
+ Map,
+ CurrentUsedLocations
+ ),
- NewCharacters = orddict:store(NextCharIX, NewCharacter, Characters),
+ {_NewCharacterIX, NewBattle, NewBattleAtaxiaUpdate} =
+ btl_battle:ataxia_add_character(NewCharacterRef, CurrentBattle),
- NewUpdate =
- ataxic:apply_function
- (
- orddict,
- store,
- [
- ataxic:constant(NextCharIX),
- ataxic:constant(NewCharacter),
- ataxic:current_value()
- ]
+ {
+ [
+ btl_character:get_location(NewCharacterRef)
+ |CurrentUsedLocations
+ ],
+ NewBattle,
+ [NewBattleAtaxiaUpdate|CurrentBattleAtaxicUpdates]
+ }
+ end,
+ {UsedLocations, Battle, []},
+ RosterCharacters
),
- handle_characters
- (
- NextRosterCharacters,
- PlayerIX,
- Map,
- [btl_character:get_location(NewCharacter)|UsedLocations],
- (NextCharIX + 1),
- NewCharacters,
- [NewUpdate|AtaxicUpdates]
- ).
+ {FinalBattle, ataxic:optimize(ataxic:sequence(FinalBattleAtaxicUpdates))}.
-spec add_player
(
@@ -159,39 +141,8 @@ handle_characters
)
-> {btl_battle:type(), non_neg_integer(), ataxic:basic()}.
add_player (PlayerID, PlayerSummaryIX, PlayerSummaryCategory, Battle) ->
- Players = btl_battle:get_players(Battle),
- PlayerIX = orddict:size(Players),
- NewPlayer =
- btl_player:new
- (
- PlayerIX,
- 0,
- PlayerID,
- PlayerSummaryIX,
- PlayerSummaryCategory
- ),
-
- NewPlayers = orddict:store(PlayerIX, NewPlayer, Players),
- S0Battle = btl_battle:set_players(NewPlayers, Battle),
-
- Update =
- ataxic:update_field
- (
- btl_battle:get_players_field(),
- ataxic:apply_function
- (
- orddict,
- store,
- [
- ataxic:constant(PlayerIX),
- ataxic:constant(NewPlayer),
- ataxic:current_value()
- ]
- )
- ),
-
- {S0Battle, PlayerIX, Update}.
+ {PlayerIX, Update}.
-spec add_characters
(
@@ -334,8 +285,17 @@ add_to_pending_battle
NewCharacters = get_roster_characters(PlayerID, SelectedRosterCharacterIXs),
- {S0Battle, PlayerIX, BattleUpdate0} =
- add_player(PlayerID, PlayerSumIX, PlayerSumCategory, Battle),
+ NewPlayer =
+ btl_player:new
+ (
+ 0,
+ PlayerID,
+ PlayerSumIX,
+ PlayerSumCategory
+ ),
+
+ {PlayerIX, S0Battle, BattleAtaxiaUpdate} =
+ btl_battle:add_player(NewPlayer, Battle),
{S1Battle, BattleUpdate1} =
add_characters(NewCharacters, PlayerIX, S0Battle),