summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/battle/mechanic/btl_turn_actions_management.erl (renamed from src/battle/mechanic/btl_turn_actions.erl)21
-rw-r--r--src/battle/mechanic/btl_turn_progression.erl53
-rw-r--r--src/battle/mechanic/btl_victory_progression.erl (renamed from src/battle/mechanic/btl_victory.erl)156
-rw-r--r--src/battle/struct/btl_character_turn_data.erl127
-rw-r--r--src/battle/struct/btl_character_turn_update.erl208
5 files changed, 278 insertions, 287 deletions
diff --git a/src/battle/mechanic/btl_turn_actions.erl b/src/battle/mechanic/btl_turn_actions_management.erl
index 489d9ac..41d9821 100644
--- a/src/battle/mechanic/btl_turn_actions.erl
+++ b/src/battle/mechanic/btl_turn_actions_management.erl
@@ -1,4 +1,4 @@
--module(btl_turn_actions).
+-module(btl_turn_actions_management).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -9,20 +9,19 @@
-export
(
[
- apply_requested_actions/2
+ handle/2
]
).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%% TODO: move this elsewhere
--spec finalize_character
+-spec deactivate_character
(
btl_character_turn_update:type()
)
-> btl_character_turn_update:type().
-finalize_character (Update) ->
+deactivate_character (Update) ->
Data = btl_character_turn_update:get_data(Update),
Character = btl_character_turn_data:get_character(Data),
@@ -50,13 +49,13 @@ finalize_character (Update) ->
S1Update.
--spec handle
+-spec handle_action
(
btl_battle_action:type(),
btl_character_turn_update:type()
)
-> btl_character_turn_update:type().
-handle (BattleAction, Update) ->
+handle_action (BattleAction, Update) ->
case btl_battle_action:get_category(BattleAction) of
move -> btl_turn_actions_move:handle(BattleAction, Update);
switch_weapon -> btl_turn_actions_switch_weapon:handle(Update);
@@ -66,16 +65,16 @@ handle (BattleAction, Update) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec apply_requested_actions
+-spec handle
(
btl_character_turn_data:type(),
btl_character_turn_request:type()
)
-> btl_character_turn_update:type().
-apply_requested_actions (Data, Request) ->
+handle (Data, Request) ->
Actions = btl_character_turn_request:get_actions(Request),
EmptyUpdate = btl_character_turn_update:new(Data),
- PostActionsUpdate = lists:foldl(fun handle/2, EmptyUpdate, Actions),
+ PostActionsUpdate = lists:foldl(fun handle_action/2, EmptyUpdate, Actions),
- finalize_character(PostActionsUpdate).
+ deactivate_character(PostActionsUpdate).
diff --git a/src/battle/mechanic/btl_turn_progression.erl b/src/battle/mechanic/btl_turn_progression.erl
index c28719e..a6443b8 100644
--- a/src/battle/mechanic/btl_turn_progression.erl
+++ b/src/battle/mechanic/btl_turn_progression.erl
@@ -16,52 +16,51 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec set_player_turn_to_next (btl_battle:type())
+-spec prepare_player_turn_for_next_player
+ (
+ btl_battle:type()
+ )
-> {btl_battle:type(), ataxic:basic()}.
-set_player_turn_to_next (Battle) ->
+prepare_player_turn_for_next_player (Battle) ->
Players = btl_battle:get_players(Battle),
CurrentPlayerTurn = btl_battle:get_current_player_turn(Battle),
- NextPlayerTurn = btl_player_turn:next(Players, CurrentPlayerTurn),
-
- UpdatedBattle = btl_battle:set_current_player_turn(NextPlayerTurn, Battle),
+ {UpdatedPlayerTurn, PlayerTurnAtaxiaUpdate} =
+ btl_player_turn:ataxia_next(Players, CurrentPlayerTurn),
- DBQuery =
- ataxic:update_field
+ {UpdatedBattle, BattleAtaxiaUpdate} =
+ btl_battle:ataxia_set_current_player_turn
(
- btl_battle:get_current_player_turn_field(),
- ataxic:constant(NextPlayerTurn)
+ UpdatedPlayerTurn,
+ PlayerTurnAtaxiaUpdate,
+ Battle
),
- {UpdatedBattle, DBQuery}.
+ {UpdatedBattle, BattleAtaxiaUpdate}.
--spec reset_next_player_timeline (btl_battle:type())
+-spec reset_next_player_timeline
+ (
+ 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),
NextPlayer = btl_battle:get_player(NextPlayerIX, Battle),
- UpdatedNextPlayer = btl_player:reset_timeline(NextPlayer),
- UpdatedBattle =
- btl_battle:set_player(NextPlayerIX, UpdatedNextPlayer, Battle),
+ {UpdatedNextPlayer, PlayerAtaxiaUpdate} =
+ btl_player:ataxia_reset_timeline(NextPlayer),
- DBQuery =
- ataxic:update_field
+ {UpdatedBattle, BattleAtaxiaUpdate} =
+ btl_battle:ataxia_set_player
(
- btl_battle:get_players_field(),
- ataxic_sugar:update_orddict_element
- (
- NextPlayerIX,
- ataxic:update_field
- (
- btl_player:get_timeline_field(),
- ataxic:constant([])
- )
- )
+ NextPlayerIX,
+ UpdatedNextPlayer,
+ PlayerAtaxiaUpdate,
+ Battle
),
- {UpdatedBattle, UpdatedNextPlayer, DBQuery}.
+ {UpdatedBattle, UpdatedNextPlayer, BattleAtaxiaUpdate}.
-spec activate_next_players_characters
diff --git a/src/battle/mechanic/btl_victory.erl b/src/battle/mechanic/btl_victory_progression.erl
index 089af81..f50718a 100644
--- a/src/battle/mechanic/btl_victory.erl
+++ b/src/battle/mechanic/btl_victory_progression.erl
@@ -1,4 +1,4 @@
--module(btl_victory).
+-module(btl_victory_progression).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -16,48 +16,72 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
--spec mark_players_characters_as_defeated
+-spec mark_characters_of_player_as_defeated
(
non_neg_integer(),
- orddict:orddict(non_neg_integer(), btl_character:type())
+ btl_battle:type()
)
->
{
- orddict:orddict(non_neg_integer(), btl_character:type()),
- list(ataxic:basic())
+ btl_battle:type(),
+ ataxic:basic()
}.
-mark_players_characters_as_defeated (PlayerIX, Characters) ->
- orddict:fold
- (
- fun (IX, Character, {Dict, Updates}) ->
- case (btl_character:get_player_index(Character) == PlayerIX) of
- false -> {Dict, Updates};
- true ->
- {
- orddict:store
- (
- IX,
- btl_character:set_is_defeated(true, Character),
- Dict
- ),
- [
- ataxic_sugar:update_orddict_element
+mark_characters_of_player_as_defeated (PlayerIX, Battle) ->
+ AllCharacters = btl_battle:get_characters(Battle),
+
+ {ResultingBattle, BattleAtaxiaUpdates} =
+ orddict:fold
+ (
+ fun (IX, Character, {CurrentBattle, CurrentBattleAtaxiaUpdates}) ->
+ case (btl_character:get_player_index(Character) == PlayerIX) of
+ false -> {CurrentBattle, CurrentBattleAtaxiaUpdates};
+ true ->
+ {UpdatedCharacter, CharacterAtaxiaUpdate} =
+ btl_character:ataxia_set_is_defeated(true, Character),
+
+ {UpdatedBattle, NewBattleAtaxiaUpdate} =
+ btl_battle:ataxia_set_character
(
IX,
- ataxic:update_field
- (
- btl_character:get_is_defeated_field(),
- ataxic:constant(true)
- )
- )
- ]
- }
- end
- end,
- {Characters, []},
- Characters
- ).
+ UpdatedCharacter,
+ CharacterAtaxiaUpdate,
+ Battle
+ ),
+
+ {
+ UpdatedBattle,
+ [NewBattleAtaxiaUpdate|CurrentBattleAtaxiaUpdates]
+ }
+ end
+ end,
+ {Battle, []},
+ AllCharacters
+ ),
+
+ {ResultingBattle, ataxic:optimize(ataxic:sequence(BattleAtaxiaUpdates))}.
+
+-spec mark_player_as_inactive
+ (
+ non_neg_integer(),
+ btl_battle:type()
+ )
+ -> {btl_battle:type(), ataxic:basic()}.
+mark_player_as_inactive (PlayerIX, Battle) ->
+ Player = btl_battle:get_player(PlayerIX, Battle),
+
+ {UpdatedPlayer, PlayerAtaxicUpdate} =
+ btl_player:ataxia_set_is_active(false, Player),
+
+ {UpdateBattle, BattleAtaxicUpdate} =
+ btl_battle:ataxia_set_player
+ (
+ PlayerIX,
+ UpdatedPlayer,
+ PlayerAtaxicUpdate,
+ Battle
+ ),
+
+ {UpdateBattle, BattleAtaxicUpdate}.
-spec handle_player_defeat
(
@@ -68,65 +92,25 @@ mark_players_characters_as_defeated (PlayerIX, Characters) ->
handle_player_defeat (PlayerIX, Update) ->
Data = btl_character_turn_update:get_data(Update),
Battle = btl_character_turn_data:get_battle(Data),
- Characters = btl_battle:get_characters(Battle),
- %% FIXME [FUNCTION: battle][MEDIUM]: The controlled character might slip
- %% through.
- {UpdatedCharacters, AtaxicUpdates} =
- mark_players_characters_as_defeated(PlayerIX, Characters),
-
- S0Battle = btl_battle:set_characters(UpdatedCharacters, Battle),
- S1Battle =
- btl_battle:set_player
- (
- PlayerIX,
- btl_player:set_is_active
- (
- false,
- btl_battle:get_player(PlayerIX, S0Battle)
- ),
- S0Battle
- ),
+ {S0Battle, BattleAtaxicUpdate0} =
+ mark_characters_of_player_as_defeated(PlayerIX, Battle),
+ {S1Battle, BattleAtaxicUpdate1} =
+ mark_player_as_inactive(PlayerIX, S0Battle),
UpdatedData = btl_character_turn_data:set_battle(S1Battle, Data),
S0Update = btl_character_turn_update:set_data(UpdatedData, Update),
- DBQuery =
- ataxic:sequence
- (
- [
- ataxic:update_field
- (
- btl_battle:get_players_field(),
- ataxic_sugar:update_orddict_element
- (
- PlayerIX,
- ataxic:update_field
- (
- btl_player:get_is_active_field(),
- ataxic:constant(false)
- )
- )
- ),
- ataxic:update_field
- (
- btl_battle:get_characters_field(),
- ataxic:sequence(AtaxicUpdates)
- )
- ]
- ),
-
S1Update =
btl_character_turn_update:add_to_timeline
(
btl_turn_result:new_player_lost(PlayerIX),
- DBQuery,
+ ataxia:sequence([BattleAtaxicUpdate0, BattleAtaxicUpdate1]),
S0Update
),
S1Update.
-
-spec actually_handle_character_lost_health
(
non_neg_integer(),
@@ -142,7 +126,10 @@ actually_handle_character_lost_health (CharIX, Update) ->
case btl_character:get_rank(Character) of
optional ->
- %% Let's not assume there is a commander
+ %% Let's not assume there is a commander, meaning that we still have
+ %% to check if at least one character is alive, despite the fact that
+ %% if there is a commander, it being killed would have triggered
+ %% the defeat.
StillHasAliveChar =
lists:any
(
@@ -164,7 +151,7 @@ actually_handle_character_lost_health (CharIX, Update) ->
commander -> handle_player_defeat(CharacterPlayerIX, Update);
target ->
- StillHasAliveChar =
+ StillHasAliveTargetChar =
lists:any
(
fun ({IX, Char}) ->
@@ -172,12 +159,13 @@ actually_handle_character_lost_health (CharIX, Update) ->
(CharacterPlayerIX == btl_character:get_player_index(Char))
and (IX /= CharIX)
and btl_character:get_is_alive(Char)
+ and (blt_character:get_rank(Char) == target)
)
end,
orddict:to_list(Characters)
),
- case StillHasAliveChar of
+ case StillHasAliveTargetChar of
true -> Update;
_ -> handle_player_defeat(CharacterPlayerIX, Update)
end
@@ -202,7 +190,7 @@ handle_character_lost_health (CharIX, _Health, Update) ->
S2Update = actually_handle_character_lost_health(CharIX, S1Update),
S2Data = btl_character_turn_update:get_data(S2Update),
- S3Data = btl_character_turn_data:refreshr_character(S2Data),
+ S3Data = btl_character_turn_data:refresh_character(S2Data),
S3Update = btl_character_turn_update:set_data(S3Data, S2Update),
S3Update.
diff --git a/src/battle/struct/btl_character_turn_data.erl b/src/battle/struct/btl_character_turn_data.erl
deleted file mode 100644
index bd6fcac..0000000
--- a/src/battle/struct/btl_character_turn_data.erl
+++ /dev/null
@@ -1,127 +0,0 @@
--module(btl_character_turn_data).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--record
-(
- type,
- {
- dirty :: boolean(),
- battle :: btl_battle:type(),
- character :: btl_character:type(),
- character_ix :: non_neg_integer()
- }
-).
-
--opaque type() :: #type{}.
-
--export_type([type/0]).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--export
-(
- [
- new/2,
-
- get_battle_is_dirty/1,
- get_battle/1,
- get_character/1,
- get_character_ix/1,
-
- set_battle/2,
- set_character/2
- ]
-).
-
--export
-(
- [
- clean_battle/1,
- refresh_character/1
- ]
-).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec resolve_character_at
- (
- btl_battle:type(),
- non_neg_integer()
- ) -> btl_charater:type().
-resolve_character_at (Battle, CharacterIX) ->
- CharacterRef = btl_battle:get_character(CharacterIX, Battle),
- Location = btl_character:get_location(CharacterRef),
- Map = btl_battle:get_map(Battle),
-
- TileInstance = shr_map:get_tile_instance(Location, Map),
- TileClassID = shr_tile_instance:get_tile_id(TileInstance),
- Tile = shr_tile:from_id(TileClassID),
- TileOmnimods = shr_tile:get_omnimods(Tile),
-
- Character = btl_character:resolve(TileOmnimods, CharacterRef),
-
- Character.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec new (btl_battle:type(), non_neg_integer()) -> type().
-new (Battle, CharacterIX) ->
-
- #type
- {
- dirty = false,
- battle = Battle,
- character = resolve_character_at(Battle, CharacterIX),
- character_ix = CharacterIX
- }.
-
--spec get_battle_is_dirty (type()) -> boolean().
-get_battle_is_dirty (Data) -> Data#type.dirty.
-
--spec get_battle (type()) -> btl_battle:type().
-get_battle (Data) -> Data#type.battle.
-
--spec get_character (type()) -> btl_character:type().
-get_character (Data) -> Data#type.character.
-
--spec get_character_ix (type()) -> non_neg_integer().
-get_character_ix (Data) -> Data#type.character_ix.
-
--spec set_battle (btl_battle:type(), type()) -> type().
-set_battle (Battle, Data) ->
- Data#type{ battle = Battle }.
-
--spec set_character (btl_character:type(), type()) -> type().
-set_character (Character, Data) ->
- Data#type
- {
- dirty = true,
- character = Character
- }.
-
--spec clean_battle (type()) -> type().
-clean_battle (Data) ->
- Data#type
- {
- dirty = false,
- battle =
- btl_battle:set_character
- (
- Data#type.character_ix,
- btl_character:to_unresolved(Data#type.character),
- Data#type.battle
- )
- }.
-
--spec refresh_character (type()) -> type().
-refresh_character (Data) ->
- Data#type
- {
- dirty = false,
- character = resolve_character_at(Data#type.battle, Data#type.character_ix)
- }.
diff --git a/src/battle/struct/btl_character_turn_update.erl b/src/battle/struct/btl_character_turn_update.erl
index 85152b0..6649eb2 100644
--- a/src/battle/struct/btl_character_turn_update.erl
+++ b/src/battle/struct/btl_character_turn_update.erl
@@ -7,9 +7,18 @@
(
type,
{
- data :: btl_character_turn_data:type(),
- timeline :: list(any()),
- db :: list(ataxic:basic())
+ battle_is_outdated :: boolean(),
+ character_is_outdated :: boolean(),
+
+ battle :: btl_battle:type(),
+ reversed_battle_updates :: list(ataxic:basic()),
+
+ character :: btl_character:type(),
+ reversed_character_updates :: list(ataxic:basic()),
+
+ character_ix :: non_neg_integer(),
+
+ reversed_timeline :: list(any())
}
).
@@ -23,63 +32,186 @@
-export
(
[
- new/1,
+ new/2,
+
+ get_battle/1,
+ get_character/1,
- get_data/1,
+ get_character_ix/1,
+ get_battle_update/1,
get_timeline/1,
- get_db/1,
- set_data/2,
- add_to_timeline/3,
- add_to_db/2
+ set_battle/3,
+ set_character/2,
+
+ ataxia_set_battle/4,
+ ataxia_set_character/3,
+
+ add_to_timeline/2
]
).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec resolve_character_at
+ (
+ btl_battle:type(),
+ non_neg_integer()
+ ) -> btl_charater:type().
+resolve_character_at (Battle, CharacterIX) ->
+ CharacterRef = btl_battle:get_character(CharacterIX, Battle),
+ Location = btl_character:get_location(CharacterRef),
+ Map = btl_battle:get_map(Battle),
+
+ TileInstance = shr_map:get_tile_instance(Location, Map),
+ TileClassID = shr_tile_instance:get_tile_id(TileInstance),
+ Tile = shr_tile:from_id(TileClassID),
+ TileOmnimods = shr_tile:get_omnimods(Tile),
+
+ Character = btl_character:resolve(TileOmnimods, CharacterRef),
+
+ Character.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec new (btl_character_turn_data:type()) -> type().
-new (Data) ->
+-spec new (btl_battle:type(), non_neg_integer()) -> type().
+new (Battle, CharacterIX) ->
+
#type
{
- data = Data,
- timeline = [],
- db = []
+ character_is_outdated = false,
+ battle_is_outdated = false,
+
+ battle = Battle,
+ reversed_battle_updates = [],
+
+ character = resolve_character_at(Battle, CharacterIX),
+ reversed_character_updates = [],
+
+ character_ix = CharacterIX,
+
+ reversed_timeline = []
}.
--spec get_data (type()) -> btl_character_turn_data:type().
-get_data (Update) -> Update#type.data.
+-spec get_battle (type()) -> {type(), btl_battle:type()}.
+get_battle (Data) ->
+ case Data#type.battle_is_outdated of
+ false -> {Data, Data#type.battle};
+ true ->
+ {UpdatedBattle, BattleAtaxiaUpdate} =
+ btl_battle:ataxia_set_character
+ (
+ Data#type.character_ix,
+ Data#type.character,
+ ataxic:sequence
+ (
+ lists:reverse(Data#type.reversed_character_updates)
+ ),
+ Data#type.battle
+ ),
--spec get_timeline (type()) -> list(any()).
-get_timeline (Update) -> Update#type.timeline.
+ {
+ Data#type
+ {
+ battle_is_outdated = false,
+ battle = UpdatedBattle,
+ reversed_battle_updates =
+ [
+ BattleAtaxiaUpdate
+ |Data#type.reversed_battle_updates
+ ],
+ reversed_character_updates = []
+ },
+ UpdatedBattle
+ }
+ end.
+
+-spec get_character (type()) -> {type(), btl_character:type()}.
+get_character (Data) ->
+ case Data#type.character_is_outdated of
+ false -> {Data, Data#type.character};
+ true ->
+ {
+ Data#type
+ {
+ character_is_outdated = false,
+ character =
+ resolve_character_at
+ (
+ Data#type.character_ix,
+ Data#type.battle
+ ),
+ reversed_character_updates = []
+ }
+ }
+ end.
--spec get_db (type()) -> list(ataxic:basic()).
-get_db (Update) -> Update#type.db.
+-spec get_character_ix (type()) -> non_neg_integer().
+get_character_ix (Data) -> Data#type.character_ix.
--spec set_data (btl_character_turn_data:type(), type()) -> type().
-set_data (Data, Update) ->
- Update#type{ data = Data}.
+-spec set_battle (btl_battle:type(), boolean(), type()) -> type().
+set_battle (Battle, CouldAffectCharacter, Data) ->
+ Data#type
+ {
+ character_is_outdated = CouldAffectCharacter,
+ battle = Battle
+ }.
--spec add_to_timeline
+-spec ataxia_set_battle
(
- btl_turn_result:type(),
+ btl_battle:type(),
+ boolean(),
ataxic:basic(),
type()
- ) -> type().
-add_to_timeline (Item, DBUpdate, Update) ->
- add_to_db
+ )
+ -> type().
+ataxia_set_battle (Battle, CouldAffectCharacter, BattleUpdate, Data) ->
+ Data#type
+ {
+ character_is_outdated = CouldAffectCharacter,
+ battle = Battle,
+ reversed_battle_updates = [BattleUpdate|Data#type.reversed_battle_updates]
+ }.
+
+-spec set_character (btl_character:type(), type()) -> type().
+set_character (Character, Data) ->
+ Data#type
+ {
+ battle_is_outdated = true,
+ character = Character
+ }.
+
+-spec ataxia_set_character
(
- DBUpdate,
- Update#type
- {
- timeline = [btl_turn_result:encode(Item)|Update#type.timeline]
- }
- ).
-
--spec add_to_db (ataxic:basic(), type()) -> type().
-add_to_db (Item, Update) ->
- Update#type{ db = [Item|Update#type.db] }.
+ btl_character:type(),
+ ataxia:basic(),
+ type()
+ )
+ -> type().
+ataxia_set_character (Character, CharacterUpdate, Data) ->
+ Data#type
+ {
+ battle_is_outdated = true,
+ character = Character,
+ reversed_character_updates =
+ [CharacterUpdate|Data#type.reversed_character_updates]
+ }.
+
+-spec add_to_timeline (btl_turn_result:type(), type()) -> type().
+add_to_timeline (Item, Data) ->
+ Data#type
+ {
+ reversed_timeline =
+ [btl_turn_result:encode(Item)|Data#type.reversed_timeline]
+ }.
+
+-spec get_timeline (type()) -> list(any()).
+get_timeline (Data) -> lists:reverse(Data#type.reversed_timeline).
+
+-spec get_battle_update (type()) -> ataxic:basic().
+get_battle_update (Data) ->
+ {ActualData, _Battle} = get_battle(Data),
+
+ ataxic:sequence(lists:reverse(ActualData#type.reversed_battle_updates)).