| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src/battle')
| -rw-r--r-- | src/battle/mechanic/btl_turn_actions_management.erl | 75 | ||||
| -rw-r--r-- | src/battle/mechanic/turn_action/btl_turn_actions_switch_weapon.erl | 47 | ||||
| -rw-r--r-- | src/battle/query/btl_character_turn.erl | 115 | ||||
| -rw-r--r-- | src/battle/struct/btl_character.erl | 37 | ||||
| -rw-r--r-- | src/battle/struct/btl_character_turn_update.erl | 10 | 
5 files changed, 126 insertions, 158 deletions
| diff --git a/src/battle/mechanic/btl_turn_actions_management.erl b/src/battle/mechanic/btl_turn_actions_management.erl index 41d9821..d3a84bd 100644 --- a/src/battle/mechanic/btl_turn_actions_management.erl +++ b/src/battle/mechanic/btl_turn_actions_management.erl @@ -22,31 +22,19 @@     )     -> btl_character_turn_update:type().  deactivate_character (Update) -> -   Data = btl_character_turn_update:get_data(Update), -   Character = btl_character_turn_data:get_character(Data), +   {S0Update, Character} = btl_character_turn_update:get_character(Update), -   DisabledCharacter = btl_character:set_is_active(false, Character), -   UpdatedData = btl_character_turn_data:set_character(DisabledCharacter, Data), -   FinalizedData = btl_character_turn_data:clean_battle(UpdatedData), +   {UpdatedCharacter, CharacterAtaxiaUpdate} = +      btl_character:ataxia_set_is_active(false, Character), -   DBQuery = -      ataxic:update_field +   S1Update = +      btl_character_turn_update:ataxia_set_character        ( -         btl_battle:get_characters_field(), -         ataxic_sugar:update_orddict_element -         ( -            btl_character_turn_data:get_character_ix(Data), -            ataxic:update_field -            ( -               btl_character:get_is_active_field(), -               ataxic:constant(false) -            ) -         ) +         UpdatedCharacter, +         CharacterAtaxiaUpdate, +         S0Update        ), -   S0Update = btl_character_turn_update:set_data(FinalizedData, Update), -   S1Update = btl_character_turn_update:add_to_db(DBQuery, S0Update), -     S1Update.  -spec handle_action @@ -62,19 +50,56 @@ handle_action (BattleAction, Update) ->        attack -> btl_turn_actions_attack:handle(BattleAction, Update)     end. +-spec update_timeline +   ( +      btl_character_turn_update:type() +   ) +   -> btl_character_turn_update:type(). +update_timeline (Update) -> +   NewTimelineElements = btl_character_turn_update:get_timeline(Update), +   {S0Update, Battle} = btl_character_turn_update:get_battle(Update), +   PlayerTurn = btl_battle:get_current_player_turn(Battle), +   PlayerIX = btl_player_turn:get_player_ix(PlayerTurn), +   Player = btl_battle:get_player(PlayerIX, Battle), + +   {UpdatedPlayer, PlayerAtaxiaUpdate} = +      btl_player:ataxia_add_to_timeline(NewTimelineElements, Player), + +   {UpdatedBattle, BattleAtaxiaUpdate} = +      btl_battle:ataxia_set_player +      ( +         PlayerIX, +         UpdatedPlayer, +         PlayerAtaxiaUpdate, +         Battle +      ), + +   S1Update = +      btl_character_turn_update:ataxia_set_battle +      ( +         UpdatedBattle, +         BattleAtaxiaUpdate, +         S0Update +      ), + +   S1Update. + +  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  -spec handle     ( -      btl_character_turn_data:type(), +      btl_character_turn_update:type(),        btl_character_turn_request:type()     )     -> btl_character_turn_update:type(). -handle (Data, Request) -> +handle (Update, Request) ->     Actions = btl_character_turn_request:get_actions(Request), -   EmptyUpdate = btl_character_turn_update:new(Data), -   PostActionsUpdate = lists:foldl(fun handle_action/2, EmptyUpdate, Actions), +   S0Update = lists:foldl(fun handle_action/2, Update, Actions), +   S1Update = deactivate_character(S0Update), +   S2Update = update_timeline(S1Update), +   S3Update = btl_turn_progression:handle(S2Update), -   deactivate_character(PostActionsUpdate). +   S3Update. diff --git a/src/battle/mechanic/turn_action/btl_turn_actions_switch_weapon.erl b/src/battle/mechanic/turn_action/btl_turn_actions_switch_weapon.erl index 119dbe7..24b361a 100644 --- a/src/battle/mechanic/turn_action/btl_turn_actions_switch_weapon.erl +++ b/src/battle/mechanic/turn_action/btl_turn_actions_switch_weapon.erl @@ -26,43 +26,30 @@     )     -> btl_character_turn_update:type().  handle (Update) -> -   Data = btl_character_turn_update:get_data(Update), -   Character = btl_character_turn_data:get_character(Data), -   CharacterCurrentData = -      btl_character_turn_data:get_character_current_data(Data), -   CharacterIX = btl_character_turn_data:get_character_ix(Data), +   {S0Update, Character} = btl_character_turn_update:get_character(Update), +   CharacterIX = btl_character_turn_update:get_character_ix(S0Update), +   BaseCharacter = btl_character:get_base_character(Character), -   {PrimaryWeaponID, SecondaryWeaponID} = btl_character:get_weapon_ids(Character), +   {UpdatedBaseCharacter, BaseCharacterAtaxiaUpdate} = +      shr_character:ataxia_switch_weapons(BaseCharacter), -   UpdatedWeaponIDs = {SecondaryWeaponID, PrimaryWeaponID}, -   UpdatedCharacter = btl_character:set_weapon_ids(UpdatedWeaponIDs, Character), - -   S0Data = btl_character_turn_data:set_character(UpdatedCharacter, Data), -   S1Data = btl_character_turn_data:refresh_character_current_data(S0Data), - -   S0Update = btl_character_turn_update:set_data(S1Data, Update), -   S1Update = -      btl_turn_actions_stats_change:handle_max_health_changes +   {UpdatedCharacter, CharacterAtaxiaUpdate} = +      btl_character:ataxia_set_base_character        ( -         CharacterCurrentData, -         S0Update +         UpdatedBaseCharacter, +         BaseCharacterAtaxiaUpdate, +         Character        ),     TimelineItem = btl_turn_result:new_character_switched_weapons(CharacterIX), -   DBQuery = -      ataxic:update_field +   S1Update = btl_character_turn_update:add_to_timeline(TimelineItem, S0Update), +   S2Update = +      btl_character_turn_update:ataxia_set_character        ( -         btl_battle:get_characters_field(), -         ataxic_sugar:update_orddict_element -         ( -            CharacterIX, -            ataxic:update_field -            ( -               btl_character:get_weapons_field(), -               ataxic:constant(UpdatedWeaponIDs) -            ) -         ) +         UpdatedCharacter, +         CharacterAtaxiaUpdate, +         S1Update        ), -   btl_character_turn_update:add_to_timeline(TimelineItem, DBQuery, S1Update). +   S2Update. diff --git a/src/battle/query/btl_character_turn.erl b/src/battle/query/btl_character_turn.erl index b911ae9..455dd13 100644 --- a/src/battle/query/btl_character_turn.erl +++ b/src/battle/query/btl_character_turn.erl @@ -37,7 +37,7 @@ authenticate_user (Request) ->     (        btl_character_turn_request:type()     ) -   -> btl_character_turn_data:type(). +   -> btl_character_turn_update:type().  fetch_data (Request) ->     PlayerID = btl_character_turn_request:get_player_id(Request),     BattleID = btl_character_turn_request:get_battle_id(Request), @@ -50,17 +50,17 @@ fetch_data (Request) ->           BattleID        ), -   btl_character_turn_data:new(Battle, CharacterIX). +   btl_character_turn_update:new(Battle, CharacterIX).  %%%% ASSERTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  -spec assert_user_is_current_player     ( -      btl_character_turn_data:type(), +      btl_character_turn_update:type(),        btl_character_turn_request:type()     ) -> 'ok'. -assert_user_is_current_player (Data, Request) -> +assert_user_is_current_player (Update, Request) ->     PlayerID = btl_character_turn_request:get_player_id(Request), -   Battle = btl_character_turn_data:get_battle(Data), +   {_SameUpdate, Battle} = btl_character_turn_update:get_battle(Update),     CurrentPlayerTurn = btl_battle:get_current_player_turn(Battle),     CurrentPlayerIX = btl_player_turn:get_player_ix(CurrentPlayerTurn),     CurrentPlayer = btl_battle:get_player(CurrentPlayerIX, Battle), @@ -71,25 +71,24 @@ assert_user_is_current_player (Data, Request) ->  -spec assert_user_owns_played_character     ( -      btl_character_turn_data:type(), +      btl_character_turn_update:type(),        btl_character_turn_request:type()     ) -> 'ok'. -assert_user_owns_played_character (Data, Request) -> +assert_user_owns_played_character (Update, Request) ->     PlayerID = btl_character_turn_request:get_player_id(Request), -   Battle = btl_character_turn_data:get_battle(Data), -   Players = btl_battle:get_players(Battle), -   Character = btl_character_turn_data:get_character(Data), +   {_SameUpdateA, Battle} = btl_character_turn_update:get_battle(Update), +   {_SameUpdateB, Character} = btl_character_turn_update:get_character(Update),     CharacterPlayerIX = btl_character:get_player_index(Character), -   CharacterPlayer = orddict:fetch(CharacterPlayerIX, Players), +   CharacterPlayer = btl_battle:get_player(CharacterPlayerIX, Battle),     CharacterPlayerID = btl_player:get_id(CharacterPlayer),     true = (PlayerID == CharacterPlayerID),     ok. --spec assert_character_can_be_played (btl_character_turn_data:type()) -> 'ok'. -assert_character_can_be_played (Data) -> -   Character = btl_character_turn_data:get_character(Data), +-spec assert_character_can_be_played (btl_character_turn_update:type()) -> 'ok'. +assert_character_can_be_played (Update) -> +   {_SameUpdate, Character} = btl_character_turn_update:get_character(Update),     true = btl_character:get_is_active(Character), @@ -97,77 +96,16 @@ assert_character_can_be_played (Data) ->  -spec assert_user_permissions     ( -      btl_character_turn_data:type(), +      btl_character_turn_update:type(),        btl_character_turn_request:type()     ) -> 'ok'. -assert_user_permissions (Data, Request) -> -   assert_user_is_current_player(Data, Request), -   assert_user_owns_played_character(Data, Request), -   assert_character_can_be_played(Data), +assert_user_permissions (Update, Request) -> +   assert_user_is_current_player(Update, Request), +   assert_user_owns_played_character(Update, Request), +   assert_character_can_be_played(Update),     ok. -%%%% QUERY LOGIC HANDLING %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%% TODO: move this elsewhere --spec update_timeline -   ( -      btl_character_turn_update:type() -   ) -   -> btl_character_turn_update:type(). -update_timeline (Update) -> -   NewTimelineElements = btl_character_turn_update:get_timeline(Update), -   Data = btl_character_turn_update:get_data(Update), -   Battle = btl_character_turn_data:get_battle(Data), -   PlayerTurn = btl_battle:get_current_player_turn(Battle), -   PlayerIX = btl_player_turn:get_player_ix(PlayerTurn), -   Player = btl_battle:get_player(PlayerIX, Battle), - -   UpdatedPlayer = btl_player:add_to_timeline(NewTimelineElements, Player), -   UpdatedBattle = btl_battle:set_player(PlayerIX, UpdatedPlayer, Battle), -   UpdatedData = btl_character_turn_data:set_battle(UpdatedBattle, Data), - -   DBQuery = -      ataxic:update_field -      ( -         btl_battle:get_players_field(), -         ataxic_sugar:update_orddict_element -         ( -            PlayerIX, -            ataxic:update_field -            ( -               btl_player:get_timeline_field(), -               ataxic:apply_function -               ( -                  lists, -                  append, -                  [ -                     ataxic:constant(NewTimelineElements), -                     ataxic:current_value() -                  ] -               ) -            ) -         ) -      ), - -   S0Update = btl_character_turn_update:set_data(UpdatedData, Update), -   S1Update = btl_character_turn_update:add_to_db(DBQuery, S0Update), - -   S1Update. - - --spec update_data -   ( -      btl_character_turn_data:type(), -      btl_character_turn_request:type() -   ) -   -> btl_character_turn_update:type(). -update_data (Data, Request) -> -   PostActionsUpdate = btl_turn_actions:apply_requested_actions(Data, Request), -   PostCharacterTurnUpdate = update_timeline(PostActionsUpdate), - -   btl_next_turn:update_if_needed(PostCharacterTurnUpdate). -  %%%% DATABASE UPDATES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  -spec send_to_database     ( @@ -178,14 +116,14 @@ update_data (Data, Request) ->  send_to_database (Update, Request) ->     PlayerID = btl_character_turn_request:get_player_id(Request),     BattleID = btl_character_turn_request:get_battle_id(Request), -   Ops = btl_character_turn_update:get_db(Update), +   BattleAtaxicUpdate = btl_character_turn_update:get_battle_update(Update),     ok =        ataxia_client:update        (           battle_db,           ataxia_security:user_from_id(PlayerID), -         ataxic:update_value(ataxic:sequence(Ops)), +         ataxic:update_value(ataxic:optimize(BattleAtaxicUpdate)),           BattleID        ), @@ -200,8 +138,7 @@ send_to_database (Update, Request) ->  send_to_cache (Update, Request) ->     PlayerID = btl_character_turn_request:get_player_id(Request),     BattleID = btl_character_turn_request:get_battle_id(Request), -   Data = btl_character_turn_update:get_data(Update), -   Battle = btl_character_turn_data:get_battle(Data), +   {_SameUpdate, Battle} = btl_character_turn_update:get_battle(Update),     shr_timed_cache:update     ( @@ -244,14 +181,14 @@ handle (Query) ->           shr_security:lock_queries(PlayerID), -         Data = fetch_data(Request), -         assert_user_permissions(Data, Request), -         Update = update_data(Data, Request), -         commit_update(Update, Request), +         S0Update = fetch_data(Request), +         assert_user_permissions(S0Update, Request), +         S1Update = btl_turn_actions:apply_requested_actions(S0Update, Request), +         commit_update(S1Update, Request),           shr_security:unlock_queries(PlayerID), -         generate_reply(Update); +         generate_reply(S1Update);        error -> jiffy:encode([shr_disconnected:generate()])     end. diff --git a/src/battle/struct/btl_character.erl b/src/battle/struct/btl_character.erl index 69904c6..ce0b3aa 100644 --- a/src/battle/struct/btl_character.erl +++ b/src/battle/struct/btl_character.erl @@ -69,6 +69,15 @@        set_is_defeated/2,        set_base_character/2, +      ataxia_set_rank/2, +      ataxia_set_location/2, +      ataxia_set_current_health/2, +      ataxia_set_is_active/2, +      ataxia_set_is_defeated/2, +      ataxia_set_base_character/2, + +      ataxia_set_base_character/3, +        get_rank_field/0,        get_current_health_field/0,        get_is_active_field/0, @@ -119,7 +128,6 @@ get_is_alive (#btl_char{ current_health = H, is_defeated = D }) ->  get_is_alive (#btl_char_ref{ current_health = H, is_defeated = D }) ->     ((not D) and (H > 0)). -  -spec get_is_active (either()) -> boolean().  get_is_active  ( @@ -150,13 +158,23 @@ set_rank (Rank, Char) when is_record(Char, btl_char) ->  set_rank (Rank, Char) when is_record(Char, btl_char_ref) ->     Char#btl_char_ref{ rank = Rank }. +% TODO: This can change current_health. +% FIXME: Can't do this without giving the new tile omnimods.  -spec set_location -   ({non_neg_integer(), non_neg_integer()}, type()) -> type(); -   ({non_neg_integer(), non_neg_integer()}, unresolved()) -> unresolved(). -set_location (Location, Char) when is_record(Char, btl_char) -> -   Char#btl_char{ location = Location }; -set_location (Location, Char) when is_record(Char, btl_char_ref) -> -   Char#btl_char_ref{ location = Location }. +   ( +      {non_neg_integer(), non_neg_integer()}, +      shr_omnimods:type(), +      type() +   ) +   -> type(); +set_location (Location, LocOmnimods, Char) -> +   BaseCharacter =  +   CurrentMaxHealth = +      shr_statistics:get_health +      ( +         shr_character:get_statistics +      ) +   Char#btl_char{ location = Location }.  -spec set_current_health     (integer(), type()) -> type(); @@ -182,13 +200,14 @@ set_is_defeated (Defeated, Char) when is_record(Char, btl_char) ->  set_is_defeated (Defeated, Char) when is_record(Char, btl_char_ref) ->     Char#btl_char_ref{ is_defeated = Defeated }. +% TODO: This can change current_health.  -spec set_base_character     (shr_character:type(), type()) -> type();     (shr_character:unresolved(), unresolved()) -> unresolved().  set_base_character (Base, Char) when is_record(Char, btl_char) -> -   Char#btl_char{ base = Base}; +   Char#btl_char{ base = Base };  set_base_character (Base, Char) when is_record(Char, btl_char_ref) -> -   Char#btl_char_ref{ base = Base}. +   Char#btl_char_ref{ base = Base }.  %%%% Utils  -spec new diff --git a/src/battle/struct/btl_character_turn_update.erl b/src/battle/struct/btl_character_turn_update.erl index 6649eb2..601f314 100644 --- a/src/battle/struct/btl_character_turn_update.erl +++ b/src/battle/struct/btl_character_turn_update.erl @@ -18,7 +18,7 @@        character_ix :: non_neg_integer(), -      reversed_timeline :: list(any()) +      timeline :: list(any())     }  ). @@ -92,7 +92,7 @@ new (Battle, CharacterIX) ->        character_ix = CharacterIX, -      reversed_timeline = [] +      timeline = []     }.  -spec get_battle (type()) -> {type(), btl_battle:type()}. @@ -203,12 +203,12 @@ ataxia_set_character (Character, CharacterUpdate, Data) ->  add_to_timeline (Item, Data) ->     Data#type     { -      reversed_timeline = -         [btl_turn_result:encode(Item)|Data#type.reversed_timeline] +      timeline = +         [btl_turn_result:encode(Item)|Data#type.timeline]     }.  -spec get_timeline (type()) -> list(any()). -get_timeline (Data) -> lists:reverse(Data#type.reversed_timeline). +get_timeline (Data) -> Data#type.timeline.  -spec get_battle_update (type()) -> ataxic:basic().  get_battle_update (Data) -> | 


