summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/battle/struct')
-rw-r--r-- | src/battle/struct/btl_character_turn_data.erl | 127 | ||||
-rw-r--r-- | src/battle/struct/btl_character_turn_update.erl | 208 |
2 files changed, 170 insertions, 165 deletions
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)). |