summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2018-05-10 22:42:24 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2018-05-10 22:42:24 +0200
commitdfa4fa60b4fc5c96573cd75128906c0db593424d (patch)
treee3d13ff64ebd3b36ac70af357f0ec642ae2bc994
parent48668b142f99ea8ca58fd649ed331c4823787b61 (diff)
...
-rw-r--r--src/battlemap/src/game-logic/turn_actions.erl240
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),