summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src')
-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)). |