| summaryrefslogtreecommitdiff | 
diff options
| author | nsensfel <SpamShield0@noot-noot.org> | 2019-04-25 14:19:44 +0200 | 
|---|---|---|
| committer | nsensfel <SpamShield0@noot-noot.org> | 2019-04-25 14:19:44 +0200 | 
| commit | 4fb024b4ee52ccbb9f25b17eaa606ce0b5e0296a (patch) | |
| tree | cb89cdde37bd6f091ed175c076e607f4d311a01e /src | |
| parent | e68004ee70c9102d00df2925c05d1354a6315bc0 (diff) | |
Merging btl_character_turn_{data,update}...
Diffstat (limited to 'src')
| -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.erl | 53 | ||||
| -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.erl | 127 | ||||
| -rw-r--r-- | src/battle/struct/btl_character_turn_update.erl | 208 | 
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)). | 


