summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/battle/mechanic')
-rw-r--r-- | src/battle/mechanic/turn_action/btl_turn_actions_attack.erl | 200 |
1 files changed, 125 insertions, 75 deletions
diff --git a/src/battle/mechanic/turn_action/btl_turn_actions_attack.erl b/src/battle/mechanic/turn_action/btl_turn_actions_attack.erl index a414588..150d7b5 100644 --- a/src/battle/mechanic/turn_action/btl_turn_actions_attack.erl +++ b/src/battle/mechanic/turn_action/btl_turn_actions_attack.erl @@ -16,15 +16,17 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + -spec handle_attack_sequence ( btl_character_current_data:type(), non_neg_integer(), btl_character_current_data:type(), non_neg_integer(), - list(btl_attack:step()), integer(), - integer() + integer(), + list(btl_attack:step()), + list(btl_attack:type()) ) -> { @@ -36,61 +38,73 @@ }. handle_attack_sequence ( - CharacterCurrentData, + _CharacterCurrentData, CharacterCurrentHealth, - TargetCurrentData, + _TargetCurrentData, TargetCurrentHealth, + AttackerLuck, + DefenderLuck, AttackSequence, + Result +) +when +( + (CharacterCurrentHealth == 0) + or (TargetCurrentHealth == 0) + or (AttackSequence == []) +) -> + { + lists:reverse(Result), + CharacterCurrentHealth, + TargetCurrentHealth, + AttackerLuck, + DefenderLuck + }; +handle_attack_sequence +( + CharacterCurrentData, + AttackerHealth, + TargetCurrentData, + DefenderHealth, AttackerLuck, - DefenderLuck + DefenderLuck, + [NextAttack | AttackSequence], + Result ) -> - % TODO lists:foldl over AttackSequence to take luck into account. - AttackPlannedEffects = - lists:map + {AttackEffect, NewAttackerLuck, NewDefenderLuck} = + btl_attack:get_description_of ( - fun (AttackStep) -> - btl_attack:get_description_of - ( - AttackStep, - CharacterCurrentData, - TargetCurrentData, - AttackerLuck, - DefenderLuck - ) - end, - AttackSequence + NextAttack, + CharacterCurrentData, + TargetCurrentData, + AttackerLuck, + DefenderLuck ), - lists:foldl - ( - fun + {AttackResult, NewAttackerHealth, NewDefenderHealth} = + btl_attack:apply_to_healths ( - AttackEffectCandidate, - {AttackValidEffects, AttackerHealth, DefenderHealth} - ) -> - {AttackResult, NewAttackerHealth, NewDefenderHealth} = - btl_attack:apply_to_healths - ( - AttackEffectCandidate, - AttackerHealth, - DefenderHealth - ), - case AttackResult of - nothing -> {AttackValidEffects, AttackerHealth, DefenderHealth}; - _ -> - { - (AttackValidEffects ++ [AttackResult]), - NewAttackerHealth, - NewDefenderHealth - } - end + AttackEffect, + AttackerHealth, + DefenderHealth + ), + + NextResult = + case AttackResult of + nothing -> Result; + _ -> [AttackResult|Result] end, - { - [], - CharacterCurrentHealth, - TargetCurrentHealth - }, - AttackPlannedEffects + + handle_attack_sequence + ( + CharacterCurrentData, + NewAttackerHealth, + TargetCurrentData, + NewDefenderHealth, + NewAttackerLuck, + NewDefenderLuck, + AttackSequence, + NextResult ). -spec get_attack_sequence @@ -115,8 +129,6 @@ get_attack_sequence (Character, TargetCharacter) -> btl_attack:get_sequence(Range, AttackingWeapon, DefendingWeapon). - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -133,21 +145,16 @@ handle (BattleAction, Update) -> CharacterIX = btl_character_turn_data:get_character_ix(Data), CharacterCurrentData = btl_character_turn_data:get_character_current_data(Data), - AttackingPlayer = - btl_battle:get_player(btl_character:get_player_ix(Character), Battle), + AttackingPlayerIX = btl_character:get_player_index(Character), + AttackingPlayer = btl_battle:get_player(AttackingPlayerIX, Battle), AttackingPlayerLuck = btl_player:get_luck(AttackingPlayer), - Map = btl_battle:get_map(Battle), TargetIX = btl_battle_action:get_target_ix(BattleAction), TargetCharacter = btl_battle:get_character(TargetIX, Battle), TargetCurrentData = btl_character_current_data:new(TargetCharacter, Map), - DefendingPlayer = - btl_battle:get_player - ( - btl_character:get_player_ix(TargetCharacter), - Battle - ), + DefendingPlayerIX = btl_character:get_player_index(TargetCharacter), + DefendingPlayer = btl_battle:get_player(DefendingPlayerIX, Battle), DefendingPlayerLuck = btl_player:get_luck(DefendingPlayer), true = btl_character:get_is_alive(TargetCharacter), @@ -158,8 +165,8 @@ handle (BattleAction, Update) -> AttackEffects, RemainingAttackerHealth, RemainingDefenderHealth, - _NewAttackerLuck, - _NewDefenderLuck + NewAttackerLuck, + NewDefenderLuck } = handle_attack_sequence ( @@ -167,26 +174,39 @@ handle (BattleAction, Update) -> btl_character:get_current_health(Character), TargetCurrentData, btl_character:get_current_health(TargetCharacter), - AttackSequence, AttackingPlayerLuck, - DefendingPlayerLuck + DefendingPlayerLuck, + AttackSequence, + [] ), % TODO: update lucks... + NextAttackingPlayer = btl_player:set_luck(NewAttackerLuck, AttackingPlayer), + NextDefendingPlayer = btl_player:set_luck(NewDefenderLuck, DefendingPlayer), UpdatedCharacter = btl_character:set_current_health(RemainingAttackerHealth, Character), UpdatedBattle = - btl_battle:set_character + btl_battle:set_player ( - TargetIX, - btl_character:set_current_health + DefendingPlayerIX, + NextDefendingPlayer, + btl_battle:set_player ( - RemainingDefenderHealth, - TargetCharacter - ), - Battle + AttackingPlayerIX, + NextAttackingPlayer, + btl_battle:set_character + ( + TargetIX, + btl_character:set_current_health + ( + RemainingDefenderHealth, + TargetCharacter + ), + Battle + ) + ) ), S0Data = btl_character_turn_data:set_battle(UpdatedBattle, Data), @@ -230,6 +250,35 @@ handle (BattleAction, Update) -> ) ), + DBQuery2 = + ataxic:update_field + ( + btl_battle:get_players_field(), + ataxic:sequence + ( + [ + ataxic_sugar:update_orddict_element + ( + DefendingPlayerIX, + ataxic:update_field + ( + btl_player:get_luck_field(), + ataxic:constant(NewDefenderLuck) + ) + ), + ataxic_sugar:update_orddict_element + ( + AttackingPlayerIX, + ataxic:update_field + ( + btl_player:get_luck_field(), + ataxic:constant(NewAttackerLuck) + ) + ) + ] + ) + ), + S0Update = btl_character_turn_update:add_to_timeline ( @@ -239,22 +288,23 @@ handle (BattleAction, Update) -> ), S1Update = btl_character_turn_update:add_to_db(DBQuery1, S0Update), - S2Update = btl_character_turn_update:set_data(S1Data, S1Update), + S2Update = btl_character_turn_update:add_to_db(DBQuery2, S1Update), + S3Update = btl_character_turn_update:set_data(S1Data, S2Update), - S3Update = + S4Update = btl_victory:handle_character_lost_health ( CharacterIX, RemainingAttackerHealth, - S2Update + S3Update ), - S4Update = + S5Update = btl_victory:handle_character_lost_health ( TargetIX, RemainingDefenderHealth, - S3Update + S4Update ), - S4Update. + S5Update. |