summaryrefslogtreecommitdiff |
diff options
author | nsensfel <SpamShield0@noot-noot.org> | 2018-08-29 16:24:10 +0200 |
---|---|---|
committer | nsensfel <SpamShield0@noot-noot.org> | 2018-08-29 16:24:10 +0200 |
commit | 9ffa08c3aad8e4f40b7f7d1e7845e5153f9c34ab (patch) | |
tree | 363619618b680e59ab76efa8e7db92bc57ca784a /src/battle/game-logic/btl_turn_actions_attack.erl | |
parent | 79b2d1dd4f114bc31105df0e554f9c1f18c87e5d (diff) |
Still working on it...
Diffstat (limited to 'src/battle/game-logic/btl_turn_actions_attack.erl')
-rw-r--r-- | src/battle/game-logic/btl_turn_actions_attack.erl | 223 |
1 files changed, 223 insertions, 0 deletions
diff --git a/src/battle/game-logic/btl_turn_actions_attack.erl b/src/battle/game-logic/btl_turn_actions_attack.erl new file mode 100644 index 0000000..355c791 --- /dev/null +++ b/src/battle/game-logic/btl_turn_actions_attack.erl @@ -0,0 +1,223 @@ +-module(btl_turn_actions_attack). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export +( + [ + handle/2 + ] +). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% 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()) + ) + -> {list(btl_attack:type()), non_neg_integer(), non_neg_integer()}. +handle_attack_sequence +( + CharacterCurrentData, + CharacterCurrentHealth, + TargetCurrentData, + TargetCurrentHealth, + AttackSequence +) -> + AttackPlannedEffects = + lists:map + ( + fun (AttackStep) -> + btl_attack:get_description_of + ( + AttackStep, + CharacterCurrentData, + TargetCurrentData + ) + end, + AttackSequence + ), + + lists:foldl + ( + fun + ( + 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 + end, + { + [], + CharacterCurrentHealth, + TargetCurrentHealth + }, + AttackPlannedEffects + ). + +-spec get_attack_sequence + ( + btl_character:type(), + btl_character:type() + ) + -> list(btl_attack:step()). +get_attack_sequence (Character, TargetCharacter) -> + Range = + btl_location:dist + ( + btl_character:get_location(Character), + btl_character:get_location(TargetCharacter) + ), + + {AttackingWeaponID, _} = btl_character:get_weapon_ids(Character), + {DefendingWeaponID, _} = btl_character:get_weapon_ids(TargetCharacter), + + AttackingWeapon = shr_weapon:from_id(AttackingWeaponID), + DefendingWeapon = shr_weapon:from_id(DefendingWeaponID), + + btl_attack:get_sequence(Range, AttackingWeapon, DefendingWeapon). + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec handle + ( + btl_battle_action:type(), + btl_character_turn_update:type() + ) + -> btl_character_turn_update:type(). +handle (BattleAction, Update) -> + Data = btl_character_turn_update:get_data(Update), + Battle = btl_character_turn_data:get_battle(Data), + Character = btl_character_turn_data:get_character(Data), + CharacterIX = btl_character_turn_data:get_character_ix(Data), + CharacterCurrentData = + btl_character_turn_data:get_character_current_data(Data), + + 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), + + true = btl_character:get_is_alive(TargetCharacter), + + AttackSequence = get_attack_sequence(Character, TargetCharacter), + + {AttackEffects, RemainingAttackerHealth, RemainingDefenderHealth} = + handle_attack_sequence + ( + CharacterCurrentData, + btl_character:get_current_health(Character), + TargetCurrentData, + btl_character:get_current_health(TargetCharacter), + AttackSequence + ), + + UpdatedCharacter = + btl_character:set_current_health(RemainingAttackerHealth, Character), + + UpdatedBattle = + btl_battle:set_character + ( + TargetIX, + btl_character:set_current_health + ( + RemainingDefenderHealth, + TargetCharacter + ), + Battle + ), + + S0Data = btl_character_turn_data:set_battle(UpdatedBattle, Data), + S1Data = btl_character_turn_data:set_character(UpdatedCharacter, S0Data), + + TimelineItem = + btl_turn_result:new_character_attacked + ( + CharacterIX, + TargetIX, + AttackEffects + ), + + DBQuery0 = + shr_db_query:update_indexed + ( + btl_battle:get_characters_field(), + TargetIX, + [ + shr_db_query:set_field + ( + btl_character:get_current_health_field(), + RemainingDefenderHealth + ) + ] + ), + + DBQuery1 = + shr_db_query:update_indexed + ( + btl_battle:get_characters_field(), + CharacterIX, + [ + shr_db_query:set_field + ( + btl_character:get_current_health_field(), + RemainingAttackerHealth + ) + ] + ), + + S0Update = + btl_character_turn_update:add_to_timeline + ( + TimelineItem, + DBQuery0, + Update + ), + + S1Update = btl_character_turn_update:add_to_db(DBQuery1, S0Update), + S2Update = btl_character_turn_update:set_data(S1Data, S1Update), + + S3Update = + btl_victory:handle_character_lost_health + ( + CharacterIX, + RemainingAttackerHealth, + S2Update + ), + + S4Update = + btl_victory:handle_character_lost_health + ( + TargetIX, + RemainingDefenderHealth, + S3Update + ), + + S4Update. |