summaryrefslogtreecommitdiff |
diff options
author | nsensfel <SpamShield0@noot-noot.org> | 2019-06-04 15:46:32 +0200 |
---|---|---|
committer | nsensfel <SpamShield0@noot-noot.org> | 2019-06-04 15:46:32 +0200 |
commit | 1aec9784102855c4bf2e5d2ad9a945166aed2051 (patch) | |
tree | f6849f76d4bd426c2fd94da88b9b668316c53e86 | |
parent | 124cc7160d80bc9fcafd1a1592fa046ef44d6ef7 (diff) |
...
-rw-r--r-- | src/battle/mechanic/turn_action/btl_turn_actions_attack.erl | 2 | ||||
-rw-r--r-- | src/battle/mechanic/turn_action/btl_turn_actions_opportunity_attack.erl | 220 | ||||
-rw-r--r-- | src/battle/struct/btl_attack.erl | 23 | ||||
-rw-r--r-- | src/battle/struct/btl_battle.erl | 33 |
4 files changed, 101 insertions, 177 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 af4c53b..2b032a0 100644 --- a/src/battle/mechanic/turn_action/btl_turn_actions_attack.erl +++ b/src/battle/mechanic/turn_action/btl_turn_actions_attack.erl @@ -326,7 +326,7 @@ handle (BattleAction, Update) -> end, S6Update = - case (RemainingAttackerHealth > 0) of + case (RemainingDefenderHealth > 0) of true -> S5Update; false -> btl_victory_progression:handle_character_loss diff --git a/src/battle/mechanic/turn_action/btl_turn_actions_opportunity_attack.erl b/src/battle/mechanic/turn_action/btl_turn_actions_opportunity_attack.erl index 7d6a1c5..c1dbbdd 100644 --- a/src/battle/mechanic/turn_action/btl_turn_actions_opportunity_attack.erl +++ b/src/battle/mechanic/turn_action/btl_turn_actions_opportunity_attack.erl @@ -17,105 +17,6 @@ %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec handle_attack_sequence - ( - btl_character:type(), - non_neg_integer(), - btl_character:type(), - non_neg_integer(), - integer(), - integer(), - list(btl_attack:step()), - list(btl_attack:type()) - ) - -> - { - list(btl_attack:type()), - non_neg_integer(), - non_neg_integer(), - integer(), - integer() - }. -handle_attack_sequence -( - _Character, - CharacterCurrentHealth, - _TargetCharacter, - TargetCurrentHealth, - AttackerLuck, - DefenderLuck, - AttackSequence, - Result -) -when -( - (CharacterCurrentHealth == 0) - or (TargetCurrentHealth == 0) - or (AttackSequence == []) -) -> - { - lists:reverse(Result), - CharacterCurrentHealth, - TargetCurrentHealth, - AttackerLuck, - DefenderLuck - }; -handle_attack_sequence -( - Character, - AttackerHealth, - TargetCharacter, - DefenderHealth, - AttackerLuck, - DefenderLuck, - [NextAttack | AttackSequence], - Result -) -> - AttackEffect = - btl_attack:get_description_of - ( - NextAttack, - btl_character:get_base_character(Character), - btl_character:get_base_character(TargetCharacter), - AttackerLuck, - DefenderLuck - ), - - { - AttackResult, - NewAttackerHealth, - NewAttackerLuck, - NewDefenderHealth, - NewDefenderLuck - } = - btl_attack:apply_to_healths_and_lucks - ( - AttackEffect, - AttackerHealth, - AttackerLuck, - DefenderHealth, - DefenderLuck - ), - - NextResult = - case AttackResult of - {nothing, _, _} -> Result; - _ -> [AttackResult|Result] - end, - - handle_attack_sequence - ( - Character, - NewAttackerHealth, - TargetCharacter, - NewDefenderHealth, - NewAttackerLuck, - NewDefenderLuck, - AttackSequence, - NextResult - ). - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -133,87 +34,67 @@ handle (BattleAction, Update) -> DefendingPlayer = btl_battle:get_player(DefendingPlayerIX, Battle), DefendingPlayerLuck = btl_player:get_luck(DefendingPlayer), - ActorIX = btl_action:get_target_ix(BattleAction), - Map = btl_battle:get_map(Battle), - ActorCharacterRef = btl_battle:get_character(ActorIX, Battle), - ActorCharacter = - btl_character:resolve - ( - shr_tile:get_omnimods - ( - shr_tile:from_id - ( - shr_tile_instance:get_tile_id - ( - shr_map:get_tile_instance - ( - btl_character:get_location(ActorCharacterRef), - Map - ) - ) - ) - ), - ActorCharacterRef - ), + 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(ActorCharacter), + AttackingPlayerIX = btl_character:get_player_index(Attacker), AttackingPlayer = btl_battle:get_player(AttackingPlayerIX, Battle), AttackingPlayerLuck = btl_player:get_luck(AttackingPlayer), - AttackSequence = btl_attack:attack_of_opportunity(), + 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 + ), { - AttackEffects, - RemainingAttackerHealth, - RemainingDefenderHealth, - NewAttackerLuck, - NewDefenderLuck + AttackResult, + NewAttackerHealth, + S0NewAttackerLuck, + NewDefenderHealth, + S0NewDefenderLuck } = - handle_attack_sequence + btl_attack:apply_to_healths_and_lucks ( - Character, - btl_character:get_current_health(Character), - ActorCharacter, - btl_character:get_current_health(ActorCharacter), + AttackEffect, + btl_character:get_current_health(Attacker), AttackingPlayerLuck, - DefendingPlayerLuck, - AttackSequence, - [] + btl_character:get_current_health(Character), + DefendingPlayerLuck ), - S0NewAttackerLuck = - case {(NewAttackerLuck =< -2), (NewAttackerLuck >= 2)} of - {true, _} -> (NewAttackerLuck + 2); - {_, true} -> (NewAttackerLuck - 2); + S1NewAttackerLuck = + case {(S0NewAttackerLuck =< -2), (S0NewAttackerLuck >= 2)} of + {true, _} -> (S0NewAttackerLuck + 2); + {_, true} -> (S0NewAttackerLuck - 2); _ -> 0 end, - S0NewDefenderLuck = - case {(NewDefenderLuck =< -2), (NewDefenderLuck >= 2)} of - {true, _} -> (NewDefenderLuck + 2); - {_, true} -> (NewDefenderLuck - 2); + S1NewDefenderLuck = + case {(S0NewDefenderLuck =< -2), (S0NewDefenderLuck >= 2)} of + {true, _} -> (S0NewDefenderLuck + 2); + {_, true} -> (S0NewDefenderLuck - 2); _ -> 0 end, {UpdatedAttackingPlayer, AttackingPlayerAtaxiaUpdate} = - btl_player:ataxia_set_luck(S0NewAttackerLuck, AttackingPlayer), + btl_player:ataxia_set_luck(S1NewAttackerLuck, AttackingPlayer), {UpdatedDefendingPlayer, DefendingPlayerAtaxiaUpdate} = - btl_player:ataxia_set_luck(S0NewDefenderLuck, DefendingPlayer), + btl_player:ataxia_set_luck(S1NewDefenderLuck, DefendingPlayer), {UpdatedCharacter, CharacterAtaxiaUpdate} = - btl_character:ataxia_set_current_health - ( - RemainingAttackerHealth, - Character - ), + btl_character:ataxia_set_current_health(NewDefenderHealth, Character), - {UpdatedTargetCharacterRef, TargetCharacterRefAtaxiaUpdate} = - btl_character:ataxia_set_current_health - ( - RemainingDefenderHealth, - TargetCharacterRef - ), + {UpdatedAttackerRef, AttackerRefAtaxiaUpdate} = + btl_character:ataxia_set_current_health(NewAttackerHealth, AttackerRef), {S0Battle, BattleAtaxiaUpdate0} = btl_battle:ataxia_set_player @@ -236,9 +117,9 @@ handle (BattleAction, Update) -> {S2Battle, BattleAtaxiaUpdate2} = btl_battle:ataxia_set_character ( - TargetIX, - UpdatedTargetCharacterRef, - TargetCharacterRefAtaxiaUpdate, + AttackerIX, + UpdatedAttackerRef, + AttackerRefAtaxiaUpdate, S1Battle ), @@ -278,9 +159,9 @@ handle (BattleAction, Update) -> TimelineItem = btl_turn_result:new_character_attacked ( + AttackerIX, btl_character_turn_update:get_character_ix(S3Update), - TargetIX, - AttackEffects, + AttackResult, S0NewAttackerLuck, S0NewDefenderLuck ), @@ -288,21 +169,10 @@ handle (BattleAction, Update) -> S4Update = btl_character_turn_update:add_to_timeline(TimelineItem, S3Update), S5Update = - case (RemainingAttackerHealth > 0) of + case (NewDefenderHealth > 0) of true -> S4Update; false -> btl_victory_progression:handle_character_loss(Character, S4Update) end, - S6Update = - case (RemainingAttackerHealth > 0) of - true -> S5Update; - false -> - btl_victory_progression:handle_character_loss - ( - TargetCharacterRef, - S5Update - ) - end, - - {ok, S6Update}. + {ok, S5Update}. diff --git a/src/battle/struct/btl_attack.erl b/src/battle/struct/btl_attack.erl index 189cb0e..6d7f32e 100644 --- a/src/battle/struct/btl_attack.erl +++ b/src/battle/struct/btl_attack.erl @@ -36,7 +36,7 @@ get_sequence/3, get_description_of/5, apply_to_healths_and_lucks/5, - new_opportunity/2, + attack_of_opportunity/0 ] ). @@ -411,8 +411,26 @@ get_description_of CanParry, DefenderLuck, AttackerLuck + ); +get_description_of +( + opportunity, + Attacker, + Defender, + AttackerLuck, + DefenderLuck +) -> + effect_of_attack + ( + opportunity, + Attacker, + Defender, + false, + AttackerLuck, + DefenderLuck ). + -spec apply_to_healths_and_lucks ( maybe_type(), @@ -555,6 +573,9 @@ get_sequence (AttackRange, AttackerWeapon, DefenderWeapon) -> _ -> [First, Second] end. +-spec attack_of_opportunity () -> opportunity. +attack_of_opportunity () -> opportunity. + -spec encode (type()) -> {list(any())}. encode (Attack) -> Order = Attack#attack.order, diff --git a/src/battle/struct/btl_battle.erl b/src/battle/struct/btl_battle.erl index aedd8da..c1f4d68 100644 --- a/src/battle/struct/btl_battle.erl +++ b/src/battle/struct/btl_battle.erl @@ -89,6 +89,13 @@ ] ). +-export +( + [ + resolve_character/2 + ] +). + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -468,6 +475,32 @@ new (Map) -> current_player_turn = btl_player_turn:new(0, 0) }. +-spec resolve_character + ( + btl_character:unresolved(), + type() + ) + -> btl_character:type(). +resolve_character (CharacterRef, Battle) -> + btl_character:resolve + ( + shr_tile:get_omnimods + ( + shr_tile:from_id + ( + shr_tile_instance:get_tile_id + ( + shr_map:get_tile_instance + ( + btl_character:get_location(CharacterRef), + Battle#battle.map + ) + ) + ) + ), + CharacterRef + ). + -spec get_characters_field () -> non_neg_integer(). get_characters_field () -> #battle.characters. |