summaryrefslogtreecommitdiff |
diff options
author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2018-05-10 22:42:24 +0200 |
---|---|---|
committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2018-05-10 22:42:24 +0200 |
commit | dfa4fa60b4fc5c96573cd75128906c0db593424d (patch) | |
tree | e3d13ff64ebd3b36ac70af357f0ec642ae2bc994 /src | |
parent | 48668b142f99ea8ca58fd649ed331c4823787b61 (diff) |
...
Diffstat (limited to 'src')
-rw-r--r-- | src/battlemap/src/game-logic/turn_actions.erl | 240 |
1 files changed, 151 insertions, 89 deletions
diff --git a/src/battlemap/src/game-logic/turn_actions.erl b/src/battlemap/src/game-logic/turn_actions.erl index f0e2e8f..4f46771 100644 --- a/src/battlemap/src/game-logic/turn_actions.erl +++ b/src/battlemap/src/game-logic/turn_actions.erl @@ -16,70 +16,8 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec handle_attack_sequence - ( - character_instance:type(), - character_instance:type(), - list(attack:step()) - ) - -> {list(attack:type()), non_neg_integer(), non_neg_integer()}. -handle_attack_sequence -( - CharacterInstance, - TargetCharacterInstance, - AttackSequence -) -> - Character = character_instance:get_character(CharacterInstance), - TargetCharacter = character_instance:get_character(TargetCharacterInstance), - CharacterStatistics = character:get_statistics(Character), - TargetCharacterStatistics = character:get_statistics(TargetCharacter), - - AttackPlannedEffects = - lists:map - ( - fun (AttackStep) -> - attack:get_description_of - ( - AttackStep, - CharacterStatistics, - TargetCharacterStatistics - ) - end, - AttackSequence - ), - - lists:foldl - ( - fun - ( - AttackEffectCandidate, - {AttackValidEffects, AttackerHealth, DefenderHealth} - ) -> - {AttackResult, NewAttackerHealth, NewDefenderHealth} = - attack:apply_to_healths - ( - AttackEffectCandidate, - AttackerHealth, - DefenderHealth - ), - case AttackResult of - nothing -> {AttackValidEffects, AttackerHealth, DefenderHealth}; - _ -> - { - (AttackValidEffects ++ [AttackResult]), - NewAttackerHealth, - NewDefenderHealth - } - end - end, - { - [], - character_instance:get_current_health(CharacterInstance), - character_instance:get_current_health(TargetCharacterInstance) - }, - AttackPlannedEffects - ). +%%%% SWITCHING WEAPON %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -spec handle_switch_weapon ( character_turn_update:type() @@ -108,12 +46,6 @@ handle_switch_weapon (Update) -> % TODO: db update entries... % {character_instance, CharacterInstanceIX, wp0, SecondaryWeaponID}, % {character_instance, CharacterInstanceIX, wp1, PrimaryWeaponID} - S0Update = - character_turn_update:add_to_timeline - ( - turn_result:new_character_switched_weapons(CharacterInstanceIX), - Update - ), UpdatedData = character_turn_data:set_character_instance @@ -122,21 +54,24 @@ handle_switch_weapon (Update) -> Data ), - character_turn_update:set_data(UpdatedData, S0Update). + character_turn_update:add_to_timeline + ( + turn_result:new_character_switched_weapons(CharacterInstanceIX), + character_turn_update:set_data(UpdatedData, Update) + ). --spec handle_move +%%%% MOVING %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec get_path_cost_and_destination ( - character_turn_update:type(), - battle_action:type() + character_turn_data:type(), + list(direction:type()) ) - -> character_turn_update:type(). -handle_move (Update, BattleAction) -> - Character = character_instance:get_character(CharacterInstance), - CharacterStatistics = character:get_statistics(Character), + -> {non_neg_integer(), location:type()}. +get_path_cost_and_destination (Data, Path) -> + CharacterInstance = character_turn_data:get_character_instance(Data), + CharacterInstanceIX = character_turn_data:get_character_instance_ix(Data), + Battle = character_turn_data:get_battle(Data), Battlemap = battle:get_battlemap(Battle), - Path = BattleAction#move.path, - CharacterMovementPoints = - statistics:get_movement_points(CharacterStatistics), ForbiddenLocations = array:foldl @@ -162,19 +97,142 @@ handle_move (Update, BattleAction) -> character_instance:get_location(CharacterInstance) ), + {Cost, NewLocation}. + +-spec assert_character_can_move + ( + character_turn_data:type(), + list(direction:type()) + ) + -> 'ok'. +assert_character_can_move (Data, Cost) -> + CharacterInstance = character_turn_data:get_character_instance(Data), + Character = character_instance:get_character(CharacterInstance), + CharacterStatistics = character:get_statistics(Character), + CharacterMovementPoints = + statistics:get_movement_points(CharacterStatistics), + true = (Cost =< CharacterMovementPoints), + ok. + +-spec commit_move + ( + character_turn_update:type(), + list(direction:type()), + location:type() + ) + -> character_turn_update:type(). +commit_move (Update, Path, NewLocation) -> + Data = character_turn_update:get_data(Update), + CharacterInstance = character_turn_data:get_character_instance(Data), + CharacterInstanceIX = character_turn_data:get_character_instance_ix(Data), + UpdatedCharacterInstance = character_instance:set_location(NewLocation, CharacterInstance), - { - % TODO: hide that into database_diff structs. - [{character_instance, CharacterInstanceIX, loc, NewLocation}], - % TODO: hide that into turn_result structs. - [turn_result:new_character_moved(CharacterInstanceIX, Path, NewLocation)], - Battle, - UpdatedCharacterInstance - }. + UpdatedData = + character_turn_data:set_character_instance + ( + UpdatedCharacterInstance, + Data + ), + + S0Update = + character_turn_update:add_to_timeline + ( + turn_result:new_character_moved + ( + CharacterInstanceIX, + Path, + NewLocation + ), + Update + ), + + %[{character_instance, CharacterInstanceIX, loc, NewLocation}], + + character_turn_update:set_data(UpdatedData, S0Update). + +-spec handle_move + ( + character_turn_update:type(), + battle_action:type() + ) + -> character_turn_update:type(). +handle_move (Update, BattleAction) -> + Data = character_turn_update:get_data(Update), + Path = battle_action:get_path(BattleAction), + + {PathCost, NewLocation} = get_path_cost_and_destination(Data, Path), + assert_character_can_move(Data, PathCost), + + commit_move(Update, Path, NewLocation). + +%%%% ATTACKING %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec handle_attack_sequence + ( + character_instance:type(), + character_instance:type(), + list(attack:step()) + ) + -> {list(attack:type()), non_neg_integer(), non_neg_integer()}. +handle_attack_sequence +( + CharacterInstance, + TargetCharacterInstance, + AttackSequence +) -> + Character = character_instance:get_character(CharacterInstance), + TargetCharacter = character_instance:get_character(TargetCharacterInstance), + CharacterStatistics = character:get_statistics(Character), + TargetCharacterStatistics = character:get_statistics(TargetCharacter), + + AttackPlannedEffects = + lists:map + ( + fun (AttackStep) -> + attack:get_description_of + ( + AttackStep, + CharacterStatistics, + TargetCharacterStatistics + ) + end, + AttackSequence + ), + + lists:foldl + ( + fun + ( + AttackEffectCandidate, + {AttackValidEffects, AttackerHealth, DefenderHealth} + ) -> + {AttackResult, NewAttackerHealth, NewDefenderHealth} = + attack:apply_to_healths + ( + AttackEffectCandidate, + AttackerHealth, + DefenderHealth + ), + case AttackResult of + nothing -> {AttackValidEffects, AttackerHealth, DefenderHealth}; + _ -> + { + (AttackValidEffects ++ [AttackResult]), + NewAttackerHealth, + NewDefenderHealth + } + end + end, + { + [], + character_instance:get_current_health(CharacterInstance), + character_instance:get_current_health(TargetCharacterInstance) + }, + AttackPlannedEffects + ). -spec handle_attack ( @@ -183,8 +241,12 @@ handle_move (Update, BattleAction) -> ) -> character_turn_update:type(). handle_attack (Update, BattleAction) -> + Data = character_turn_update:get_data(Update), + Battle = character_turn_data:get_battle(Data), + CharacterInstance = character_turn_data:get_character_instance(Data), + CharacterInstanceIX = character_turn_data:get_character_instance_ix(Data), Character = character_instance:get_character(CharacterInstance), - TargetIX = BattleAction#attack.target_ix, + TargetIX = battle_action:get_target_ix(BattleAction), TargetCharacterInstance = battle:get_character_instance(TargetIX, Battle), TargetCharacter = character_instance:get_character(TargetCharacterInstance), |