| 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), | 


