| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src/battle')
| -rw-r--r-- | src/battle/mechanic/action/btl_action_attack.erl | 14 | ||||
| -rw-r--r-- | src/battle/mechanic/action/btl_action_switch_weapon.erl | 2 | ||||
| -rw-r--r-- | src/battle/mechanic/action/btl_turn_actions_opportunity_attack.erl | 178 | ||||
| -rw-r--r-- | src/battle/mechanic/btl_actions_management.erl (renamed from src/battle/mechanic/btl_turn_actions_management.erl) | 96 | ||||
| -rw-r--r-- | src/battle/mechanic/btl_turn_progression.erl | 26 | ||||
| -rw-r--r-- | src/battle/mechanic/btl_victory_progression.erl | 17 | ||||
| -rw-r--r-- | src/battle/query/btl_character_turn.erl | 93 | ||||
| -rw-r--r-- | src/battle/struct/btl_battle.erl | 2 | ||||
| -rw-r--r-- | src/battle/struct/btl_character_turn_update.erl | 142 | 
9 files changed, 137 insertions, 433 deletions
| diff --git a/src/battle/mechanic/action/btl_action_attack.erl b/src/battle/mechanic/action/btl_action_attack.erl index 5989ad8..1953096 100644 --- a/src/battle/mechanic/action/btl_action_attack.erl +++ b/src/battle/mechanic/action/btl_action_attack.erl @@ -1,4 +1,4 @@ --module(btl_turn_actions_attack). +-module(btl_action_attack).  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -46,7 +46,7 @@ roll_precision_modifier (Statistics, TargetStatistics, TargetLuck) ->        shr_statistics:type(),        integer()     ) -   -> {boolean(), integer(), integer()}. +   -> {float(), integer(), integer()}.  roll_critical_modifier (Statistics, Luck) ->     CriticalHitChance = shr_statistics:get_critical_hits(Statistics),     {_Roll, IsSuccess, PositiveModifier, NegativeModifier} = @@ -328,8 +328,8 @@ effect_of_attack           Category,           PrecisionModifier,           CriticalModifier, -         S1AttackerLuck, -         S1DefenderLuck +         ParryIsSuccessful, +         Damage        ),     % If we "ataxia update" here, we'll get redundant ataxia updates, since @@ -511,7 +511,11 @@ handle_attack_sequence        )     of        true -> -         Statistics = shr_character:get_statistics(S0Character), +         Statistics = +            shr_character:get_statistics +            ( +               btl_character:get_base_character(S0Character) +            ),           DoubleAttackChance = shr_statistics:get_double_hits(Statistics),           {_Roll, IsSuccessful, PositiveModifier, NegativeModifier} =              shr_roll:percentage_with_luck(DoubleAttackChance, S0PlayerLuck), diff --git a/src/battle/mechanic/action/btl_action_switch_weapon.erl b/src/battle/mechanic/action/btl_action_switch_weapon.erl index cf1a31a..7d8a81b 100644 --- a/src/battle/mechanic/action/btl_action_switch_weapon.erl +++ b/src/battle/mechanic/action/btl_action_switch_weapon.erl @@ -1,4 +1,4 @@ --module(btl_turn_actions_switch_weapon). +-module(btl_action_switch_weapon).  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/src/battle/mechanic/action/btl_turn_actions_opportunity_attack.erl b/src/battle/mechanic/action/btl_turn_actions_opportunity_attack.erl deleted file mode 100644 index c1dbbdd..0000000 --- a/src/battle/mechanic/action/btl_turn_actions_opportunity_attack.erl +++ /dev/null @@ -1,178 +0,0 @@ --module(btl_turn_actions_opportunity_attack). -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export -( -   [ -      handle/2 -   ] -). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec handle -   ( -      btl_action:type(), -      btl_character_turn_update:type() -   ) -   -> {ok, btl_character_turn_update:type()}. -handle (BattleAction, Update) -> -   {S0Update, Battle} = btl_character_turn_update:get_battle(Update), -   {S1Update, Character} = btl_character_turn_update:get_character(S0Update), - -   DefendingPlayerIX = btl_character:get_player_index(Character), -   DefendingPlayer = btl_battle:get_player(DefendingPlayerIX, Battle), -   DefendingPlayerLuck = btl_player:get_luck(DefendingPlayer), - -   AttackerIX = btl_action:get_target_ix(BattleAction), -   AttackerRef = btl_battle:get_character(AttackerIX, Battle), -   Attacker = btl_battle:resolve_character(AttackerRef, Battle), - -   AttackingPlayerIX = btl_character:get_player_index(Attacker), -   AttackingPlayer = btl_battle:get_player(AttackingPlayerIX, Battle), -   AttackingPlayerLuck = btl_player:get_luck(AttackingPlayer), - -   Attack = btl_attack:attack_of_opportunity(), - -   AttackEffect = -      btl_attack:get_description_of -      ( -         Attack, -         btl_character:get_base_character(Character), -         btl_character:get_base_character(Attacker), -         AttackingPlayerLuck, -         DefendingPlayerLuck -      ), - -   { -      AttackResult, -      NewAttackerHealth, -      S0NewAttackerLuck, -      NewDefenderHealth, -      S0NewDefenderLuck -   } = -      btl_attack:apply_to_healths_and_lucks -      ( -         AttackEffect, -         btl_character:get_current_health(Attacker), -         AttackingPlayerLuck, -         btl_character:get_current_health(Character), -         DefendingPlayerLuck -      ), - -   S1NewAttackerLuck = -      case {(S0NewAttackerLuck =< -2), (S0NewAttackerLuck >= 2)}  of -         {true, _} -> (S0NewAttackerLuck + 2); -         {_, true} -> (S0NewAttackerLuck - 2); -         _ -> 0 -      end, - -   S1NewDefenderLuck = -      case {(S0NewDefenderLuck =< -2), (S0NewDefenderLuck >= 2)}  of -         {true, _} -> (S0NewDefenderLuck + 2); -         {_, true} -> (S0NewDefenderLuck - 2); -         _ -> 0 -      end, - -   {UpdatedAttackingPlayer, AttackingPlayerAtaxiaUpdate} = -      btl_player:ataxia_set_luck(S1NewAttackerLuck, AttackingPlayer), - -   {UpdatedDefendingPlayer, DefendingPlayerAtaxiaUpdate} = -      btl_player:ataxia_set_luck(S1NewDefenderLuck, DefendingPlayer), - -   {UpdatedCharacter, CharacterAtaxiaUpdate} = -      btl_character:ataxia_set_current_health(NewDefenderHealth, Character), - -   {UpdatedAttackerRef, AttackerRefAtaxiaUpdate} = -      btl_character:ataxia_set_current_health(NewAttackerHealth, AttackerRef), - -   {S0Battle, BattleAtaxiaUpdate0} = -      btl_battle:ataxia_set_player -      ( -         AttackingPlayerIX, -         UpdatedAttackingPlayer, -         AttackingPlayerAtaxiaUpdate, -         Battle -      ), - -   {S1Battle, BattleAtaxiaUpdate1} = -      btl_battle:ataxia_set_player -      ( -         DefendingPlayerIX, -         UpdatedDefendingPlayer, -         DefendingPlayerAtaxiaUpdate, -         S0Battle -      ), - -   {S2Battle, BattleAtaxiaUpdate2} = -      btl_battle:ataxia_set_character -      ( -         AttackerIX, -         UpdatedAttackerRef, -         AttackerRefAtaxiaUpdate, -         S1Battle -      ), - -   % Potential danger ahead: we're going to update both the 'character' and -   % 'battle' members of a btl_character_turn_update. -   % 'S1Update' is sure to have both up to date (as it's the result of 'get' -   % requests for both) and there is no risk of the 'battle' update influencing -   % 'character', making what follows safe. - -   S2Update = -      btl_character_turn_update:ataxia_set_battle -      ( -         S2Battle, -         false, -         ataxic:optimize -         ( -            ataxic:sequence -            ( -               [ -                  BattleAtaxiaUpdate0, -                  BattleAtaxiaUpdate1, -                  BattleAtaxiaUpdate2 -               ] -            ) -         ), -         S1Update -      ), - -   S3Update = -      btl_character_turn_update:ataxia_set_character -      ( -         UpdatedCharacter, -         CharacterAtaxiaUpdate, -         S2Update -      ), - -   TimelineItem = -      btl_turn_result:new_character_attacked -      ( -         AttackerIX, -         btl_character_turn_update:get_character_ix(S3Update), -         AttackResult, -         S0NewAttackerLuck, -         S0NewDefenderLuck -      ), - -   S4Update = btl_character_turn_update:add_to_timeline(TimelineItem, S3Update), - -   S5Update = -      case (NewDefenderHealth > 0) of -         true -> S4Update; -         false -> -            btl_victory_progression:handle_character_loss(Character, S4Update) -      end, - -   {ok, S5Update}. diff --git a/src/battle/mechanic/btl_turn_actions_management.erl b/src/battle/mechanic/btl_actions_management.erl index 7ee173a..050ab4e 100644 --- a/src/battle/mechanic/btl_turn_actions_management.erl +++ b/src/battle/mechanic/btl_actions_management.erl @@ -1,4 +1,4 @@ --module(btl_turn_actions_management). +-module(btl_actions_management).  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -16,27 +16,6 @@  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec deactivate_character -   ( -      btl_character_turn_update:type() -   ) -   -> btl_character_turn_update:type(). -deactivate_character (Update) -> -   {S0Update, Character} = btl_character_turn_update:get_character(Update), - -   {UpdatedCharacter, CharacterAtaxiaUpdate} = -      btl_character:ataxia_set_is_active(false, Character), - -   S1Update = -      btl_character_turn_update:ataxia_set_character -      ( -         UpdatedCharacter, -         CharacterAtaxiaUpdate, -         S0Update -      ), - -   S1Update. -  -spec perform_action     (        btl_action:type(), @@ -56,16 +35,19 @@ perform_action (Action, Character, Update) ->           btl_action_switch_weapon:handle(Action, Character, Update)     end. --spec handle_actions +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec handle     (        list(btl_action:type()),        btl_character_turn_update:type()     )     -> btl_character_turn_update:type(). -handle_actions ([], Update) -> Update; -handle_actions ([BattleAction|FutureBattleActions], S0Update) -> +handle ([], Update) -> Update; +handle ([BattleAction|FutureBattleActions], S0Update) ->     case btl_action:get_actor_index(BattleAction) of -      -1 -> handle_actions(FutureBattleActions, S0Update); +      -1 -> handle(FutureBattleActions, S0Update);        CharacterIX ->           S0Battle = btl_character_turn_update:get_battle(S0Update),           {Character, S1Battle} = @@ -73,14 +55,14 @@ handle_actions ([BattleAction|FutureBattleActions], S0Update) ->           S1Update = btl_character_turn_update:set_battle(S1Battle, S0Update), -         case btl_character:is_alive(Character) of -            false -> handle_actions(FutureBattleActions, S1Update); +         case btl_character:get_is_alive(Character) of +            false -> handle(FutureBattleActions, S1Update);              true ->                 case perform_action(BattleAction, Character, S1Update) of                    {ok, S2Update} -> -                     handle_actions(FutureBattleActions, S2Update); +                     handle(FutureBattleActions, S2Update);                    {events, NewEvents, S2Update} -> -                     handle_actions +                     handle                       (                          (NewEvents ++ FutureBattleActions),                          S2Update @@ -89,57 +71,3 @@ handle_actions ([BattleAction|FutureBattleActions], S0Update) ->           end     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, -         false, -         BattleAtaxiaUpdate, -         S0Update -      ), - -   S1Update. - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec handle -   ( -      btl_character_turn_update:type(), -      btl_character_turn_request:type() -   ) -   -> btl_character_turn_update:type(). -handle (Update, Request) -> -   Actions = btl_character_turn_request:get_actions(Request), - -   S0Update = handle_actions(Actions, Update), -   S1Update = deactivate_character(S0Update), -   S2Update = update_timeline(S1Update), -   S3Update = btl_turn_progression:handle(S2Update), - -   S3Update. diff --git a/src/battle/mechanic/btl_turn_progression.erl b/src/battle/mechanic/btl_turn_progression.erl index ed181c5..5b8d9c8 100644 --- a/src/battle/mechanic/btl_turn_progression.erl +++ b/src/battle/mechanic/btl_turn_progression.erl @@ -108,8 +108,8 @@ activate_next_players_characters (NextPlayerIX, Battle) ->        btl_character_turn_update:type()     )     -> btl_character_turn_update:type(). -activate_next_player (Update) -> -   {S0Update, Battle} = btl_character_turn_update:get_battle(Update), +activate_next_player (S0Update) -> +   Battle = btl_character_turn_update:get_battle(S0Update),     {NextPlayerIX, S0Battle, BattleAtaxiaUpdate0} =        prepare_player_turn_for_next_player(Battle), @@ -124,7 +124,6 @@ activate_next_player (Update) ->        btl_character_turn_update:ataxia_set_battle        (           S2Battle, -         true,           ataxic:sequence           (              [ @@ -149,19 +148,16 @@ activate_next_player (Update) ->     (        btl_character_turn_update:type()     ) -   -> {boolean(), btl_character_turn_update:type()}. +   -> boolean().  has_active_characters_remaining (Update) -> -   {S0Update, Battle} = btl_character_turn_update:get_battle(Update), +   Battle = btl_character_turn_update:get_battle(Update),     Characters = btl_battle:get_characters(Battle), -   { -      lists:any -      ( -         fun ({_IX, Char}) -> btl_character:get_is_active(Char) end, -         orddict:to_list(Characters) -      ), -      S0Update -   }. +   lists:any +   ( +      fun ({_IX, Char}) -> btl_character:get_is_active(Char) end, +      orddict:to_list(Characters) +   ).  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -173,6 +169,6 @@ has_active_characters_remaining (Update) ->     -> btl_character_turn_update:type().  handle (Update) ->     case has_active_characters_remaining(Update) of -      {false, S0Update} -> activate_next_player(S0Update); -      {true, S0Update} -> S0Update +      false -> activate_next_player(Update); +      true -> Update     end. diff --git a/src/battle/mechanic/btl_victory_progression.erl b/src/battle/mechanic/btl_victory_progression.erl index ab8a351..667d010 100644 --- a/src/battle/mechanic/btl_victory_progression.erl +++ b/src/battle/mechanic/btl_victory_progression.erl @@ -89,8 +89,8 @@ mark_player_as_inactive (PlayerIX, Battle) ->        btl_character_turn_update:type()     )     -> btl_character_turn_update:type(). -handle_player_defeat (PlayerIX, Update) -> -   {S0Update, Battle} = btl_character_turn_update:get_battle(Update), +handle_player_defeat (PlayerIX, S0Update) -> +   Battle = btl_character_turn_update:get_battle(S0Update),     {S0Battle, BattleAtaxicUpdate0} =        mark_characters_of_player_as_defeated(PlayerIX, Battle), @@ -101,7 +101,6 @@ handle_player_defeat (PlayerIX, Update) ->        btl_character_turn_update:ataxia_set_battle        (           S1Battle, -         true,           ataxic:sequence([BattleAtaxicUpdate0, BattleAtaxicUpdate1]),           S0Update        ), @@ -126,7 +125,7 @@ handle_player_defeat (PlayerIX, Update) ->     )     -> btl_character_turn_update:type().  handle_character_loss (Character, Update) -> -   {S0Update, Battle} = btl_character_turn_update:get_battle(Update), +   Battle = btl_character_turn_update:get_battle(Update),     Characters = btl_battle:get_characters(Battle),     CharacterPlayerIX = btl_character:get_player_index(Character), @@ -149,11 +148,11 @@ handle_character_loss (Character, Update) ->              ),           case StillHasAliveChar of -            true -> S0Update; -            _ -> handle_player_defeat(CharacterPlayerIX, S0Update) +            true -> Update; +            _ -> handle_player_defeat(CharacterPlayerIX, Update)           end; -      commander -> handle_player_defeat(CharacterPlayerIX, S0Update); +      commander -> handle_player_defeat(CharacterPlayerIX, Update);        target ->           StillHasAliveTargetChar = @@ -170,7 +169,7 @@ handle_character_loss (Character, Update) ->              ),           case StillHasAliveTargetChar of -            true -> S0Update; -            _ -> handle_player_defeat(CharacterPlayerIX, S0Update) +            true -> Update; +            _ -> handle_player_defeat(CharacterPlayerIX, Update)           end     end. diff --git a/src/battle/query/btl_character_turn.erl b/src/battle/query/btl_character_turn.erl index 2048391..1176355 100644 --- a/src/battle/query/btl_character_turn.erl +++ b/src/battle/query/btl_character_turn.erl @@ -60,7 +60,7 @@ fetch_data (Request) ->     ) -> 'ok'.  assert_user_is_current_player (Update, Request) ->     PlayerID = btl_character_turn_request:get_player_id(Request), -   {_SameUpdate, Battle} = btl_character_turn_update:get_battle(Update), +   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), @@ -76,8 +76,9 @@ assert_user_is_current_player (Update, Request) ->     ) -> 'ok'.  assert_user_owns_played_character (Update, Request) ->     PlayerID = btl_character_turn_request:get_player_id(Request), -   {_SameUpdateA, Battle} = btl_character_turn_update:get_battle(Update), -   {_SameUpdateB, Character} = btl_character_turn_update:get_character(Update), +   Battle = btl_character_turn_update:get_battle(Update), +   CharacterIX = btl_character_turn_update:get_character_ix(Update), +   Character = btl_battle:get_character(CharacterIX, Battle),     CharacterPlayerIX = btl_character:get_player_index(Character),     CharacterPlayer = btl_battle:get_player(CharacterPlayerIX, Battle),     CharacterPlayerID = btl_player:get_id(CharacterPlayer), @@ -88,7 +89,9 @@ assert_user_owns_played_character (Update, Request) ->  -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), +   Battle = btl_character_turn_update:get_battle(Update), +   CharacterIX = btl_character_turn_update:get_character_ix(Update), +   Character = btl_battle:get_character(CharacterIX, Battle),     true = btl_character:get_is_active(Character), @@ -138,7 +141,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), -   {_SameUpdate, Battle} = btl_character_turn_update:get_battle(Update), +   Battle = btl_character_turn_update:get_battle(Update),     shr_timed_cache:update     ( @@ -172,6 +175,72 @@ generate_reply (Update) ->     jiffy:encode([TurnResultReply]).  %%%% MAIN LOGIC %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec deactivate_character +   ( +      btl_character_turn_update:type() +   ) +   -> btl_character_turn_update:type(). +deactivate_character (S0Update) -> +   Battle = btl_character_turn_update:get_battle(S0Update), +   CharacterIX = btl_character_turn_update:get_character_ix(S0Update), +   Character = btl_battle:get_character(CharacterIX, Battle), + +   {UpdatedCharacter, CharacterAtaxiaUpdate} = +      btl_character:ataxia_set_is_active(false, Character), + +   {UpdatedBattle, BattleAtaxiaUpdate} = +      btl_battle:ataxia_set_character +      ( +         CharacterIX, +         UpdatedCharacter, +         CharacterAtaxiaUpdate, +         Battle +      ), + +   S1Update = +      btl_character_turn_update:ataxia_set_battle +      ( +         UpdatedBattle, +         BattleAtaxiaUpdate, +         S0Update +      ), + +   S1Update. + +-spec update_timeline +   ( +      btl_character_turn_update:type() +   ) +   -> btl_character_turn_update:type(). +update_timeline (S0Update) -> +   NewTimelineElements = btl_character_turn_update:get_timeline(S0Update), +   Battle = btl_character_turn_update:get_battle(S0Update), +   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. +  -spec handle (shr_query:type()) -> binary().  handle (Query) ->     Request = decode_request(Query), @@ -183,12 +252,20 @@ handle (Query) ->           S0Update = fetch_data(Request),           assert_user_permissions(S0Update, Request), -         S1Update = btl_turn_actions_management:handle(S0Update, Request), -         commit_update(S1Update, Request), +         S1Update = btl_actions_management:handle +         ( +            btl_character_turn_request:get_actions(Request), +            S0Update +         ), +         S2Update = deactivate_character(S1Update), +         S3Update = update_timeline(S2Update), +         S4Update = btl_turn_progression:handle(S3Update), + +         commit_update(S4Update, Request),           shr_security:unlock_queries(PlayerID), -         generate_reply(S1Update); +         generate_reply(S4Update);        error -> jiffy:encode([shr_disconnected:generate()])     end. diff --git a/src/battle/struct/btl_battle.erl b/src/battle/struct/btl_battle.erl index 435a99b..27f9698 100644 --- a/src/battle/struct/btl_battle.erl +++ b/src/battle/struct/btl_battle.erl @@ -153,7 +153,7 @@ get_resolved_character (IX, Battle) ->              Battle#battle              {                 characters = -                  orddict:set(IX, ResolvedCharacter, Battle#battle.characters) +                  orddict:store(IX, ResolvedCharacter, Battle#battle.characters)              }           }; diff --git a/src/battle/struct/btl_character_turn_update.erl b/src/battle/struct/btl_character_turn_update.erl index f5f2d05..304f19d 100644 --- a/src/battle/struct/btl_character_turn_update.erl +++ b/src/battle/struct/btl_character_turn_update.erl @@ -32,10 +32,8 @@        get_battle_update/1,        get_timeline/1, -      set_battle/3, - -      ataxia_set_battle/4, -      ataxia_set_character/3, +      set_battle/2, +      ataxia_set_battle/3,        add_to_timeline/2     ] @@ -44,24 +42,6 @@  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec resolve_character_at -   ( -      non_neg_integer(), -      btl_battle:type() -   ) -> btl_character:type(). -resolve_character_at (CharacterIX, Battle) -> -   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 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -70,140 +50,40 @@ resolve_character_at (CharacterIX, Battle) ->  new (Battle, CharacterIX) ->     #type     { -      character_is_outdated = false, -      battle_is_outdated = false, -        battle = Battle, -      reversed_battle_updates = [], - -      character = resolve_character_at(CharacterIX, Battle), -      reversed_character_updates = [], -        character_ix = CharacterIX, - +      reversed_battle_updates = [],        timeline = []     }. --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, -               btl_character:to_unresolved(Data#type.character), -               ataxic:sequence -               ( -                  lists:reverse(Data#type.reversed_character_updates) -               ), -               Data#type.battle -            ), - -         { -            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_battle (type()) -> btl_battle:type(). +get_battle (Data) -> Data#type.battle.  -spec get_character_ix (type()) -> non_neg_integer().  get_character_ix (Data) -> Data#type.character_ix. --spec set_battle (btl_battle:type(), boolean(), type()) -> type(). -set_battle (Battle, CouldAffectCharacter, Data) -> -   false = (Data#type.battle_is_outdated and CouldAffectCharacter), - -   Data#type -   { -      character_is_outdated = -         (Data#type.character_is_outdated or CouldAffectCharacter), -      battle = Battle -   }. +-spec set_battle (btl_battle:type(), type()) -> type(). +set_battle (Battle, Data) -> Data#type { battle = Battle }.  -spec ataxia_set_battle     (        btl_battle:type(), -      boolean(),        ataxic:basic(),        type()     )     -> type(). -ataxia_set_battle (Battle, CouldAffectCharacter, BattleUpdate, Data) -> -   false = (Data#type.battle_is_outdated and CouldAffectCharacter), - +ataxia_set_battle (Battle, BattleUpdate, Data) ->     Data#type     { -      character_is_outdated = -         (Data#type.character_is_outdated or CouldAffectCharacter),        battle = Battle,        reversed_battle_updates = [BattleUpdate|Data#type.reversed_battle_updates]     }. --spec set_character (btl_character:type(), type()) -> type(). -set_character (Character, Data) -> -   false = Data#type.character_is_outdated, - -   Data#type -   { -      battle_is_outdated = true, -      character = Character -   }. - --spec ataxia_set_character -   ( -      btl_character:type(), -      ataxic:basic(), -      type() -   ) -   -> type(). -ataxia_set_character (Character, CharacterUpdate, Data) -> -   false = Data#type.character_is_outdated, - -   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     { -      timeline = -         [btl_turn_result:encode(Item)|Data#type.timeline] +      timeline = [btl_turn_result:encode(Item)|Data#type.timeline]     }.  -spec get_timeline (type()) -> list(any()). @@ -211,6 +91,4 @@ get_timeline (Data) -> Data#type.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)). +   ataxic:sequence(lists:reverse(Data#type.reversed_battle_updates)). | 


