summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/battle/mechanic/action/btl_action_attack.erl110
-rw-r--r--src/battle/struct/btl_condition.erl28
2 files changed, 127 insertions, 11 deletions
diff --git a/src/battle/mechanic/action/btl_action_attack.erl b/src/battle/mechanic/action/btl_action_attack.erl
index 8dc9d5c..399e050 100644
--- a/src/battle/mechanic/action/btl_action_attack.erl
+++ b/src/battle/mechanic/action/btl_action_attack.erl
@@ -9,13 +9,39 @@
-export
(
[
- handle/3
+ handle/2
]
).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec apply_conditions
+ (
+ shr_condition:trigger(),
+ ParameterType,
+ btl_character_turn_update:type()
+ )
+ -> {ParameterType, btl_character_turn_update:type()}.
+apply_conditions
+(
+ TriggerName,
+ S0Parameter,
+ Actor,
+ S0Update
+) ->
+ {
+ {TriggerName, S1Parameter},
+ S1Update
+ } =
+ btl_condition:recursive_apply
+ (
+ btl_character:get_conditions_on(TriggerName, Actor),
+ {TriggerName, S0Parameter},
+ S0Update
+ ),
+ {S1Parameter, S1Update}.
+
-spec roll_precision_modifier
(
shr_attributes:type(),
@@ -587,28 +613,94 @@ apply_luck_decay (Luck) ->
_ -> 0
end.
+-spec apply_battle_frontier_conditions
+ (
+ shr_condition:trigger(),
+ shr_condition:trigger(),
+ btl_action:type(),
+ btl_character_turn_update:type()
+ )
+ -> {btl_action:type(), btl_character_turn_update:type()}.
+apply_battle_frontier_conditions
+(
+ OwnTriggerName,
+ OtherTriggerName,
+ S0Action,
+ S0Update
+) ->
+ CharacterIX = btl_action:get_actor_index(S0Action),
+ S0Battle = btl_character_turn_update:get_battle(S0Update),
+ {Character, S1Battle} =
+ btl_battle:get_resolved_character(CharacterIX, S0Battle),
+
+ S1Update = btl_character_turn_update:set_battle(S1Battle, S0Update),
+
+ {S1Action, S2Update} =
+ apply_conditions
+ (
+ OwnTriggerName,
+ S0Action,
+ Character,
+ S1Update
+ ),
+
+ TargetCharacterIX = btl_action:get_target_index(S1Action),
+ S2Battle = btl_character_turn_update:get_battle(S2Update),
+ {TargetCharacter, S3Battle} =
+ btl_battle:get_resolved_character(TargetCharacterIX, S2Battle),
+
+ S3Update = btl_character_turn_update:set_battle(S3Battle, S2Update),
+
+ {S2Action, S4Update} =
+ apply_conditions
+ (
+ OtherTriggerName,
+ S1Action,
+ TargetCharacter,
+ S3Update
+ ),
+
+ {S2Action, S4Update}.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec handle
(
btl_action:type(),
- btl_character:type(),
btl_character_turn_update:type()
)
-> {ok, btl_character_turn_update:type()}.
-handle (Action, S0Character, S0Update) ->
- S0Battle = btl_character_turn_update:get_battle(S0Update),
- CharacterIX = btl_action:get_actor_index(Action),
+handle (S0Action, S0Update) ->
+ S1Update = add_targeting_event(S0Action, S0Update),
+ {S1Action, S2Update} =
+ apply_battle_frontier_conditions
+ (
+ ?CONDITION_TRIGGER_START_OF_OWN_ATTACK,
+ ?CONDITION_TRIGGER_START_OF_TARGET_ATTACK,
+ S0Action,
+ S1Update
+ ),
+
+ {AttackSequence, S3Update} = plan_attack_sequence(S1Action, S2Update),
+ {S2Action, S4Update} =
+ handle_attack_sequence(AttackSequence, S1Action, S3Update),
+
+ {S3Action, S2Update} =
+ apply_battle_frontier_conditions
+ (
+ ?CONDITION_TRIGGER_END_OF_OWN_ATTACK,
+ ?CONDITION_TRIGGER_END_OF_TARGET_ATTACK,
+ S0Action,
+ S1Update
+ ),
+
+ {ok, S2Update}.
PlayerIX = btl_character:get_player_index(S0Character),
S0Player = btl_battle:get_player(PlayerIX, S0Battle),
S0PlayerLuck = btl_player:get_luck(S0Player),
- TargetCharacterIX = btl_action:get_target_index(Action),
- {S0TargetCharacter, S1Battle} =
- btl_battle:get_resolved_character(TargetCharacterIX, S0Battle),
-
TargetPlayerIX = btl_character:get_player_index(S0TargetCharacter),
S0TargetPlayer = btl_battle:get_player(TargetPlayerIX, S1Battle),
S0TargetPlayerLuck = btl_player:get_luck(S0TargetPlayer),
diff --git a/src/battle/struct/btl_condition.erl b/src/battle/struct/btl_condition.erl
index 4697a3c..2954c13 100644
--- a/src/battle/struct/btl_condition.erl
+++ b/src/battle/struct/btl_condition.erl
@@ -132,7 +132,8 @@
(
[
triggers_on/2,
- apply/3
+ apply/3,
+ recursive_apply/3
]
).
@@ -303,7 +304,7 @@ get_parameters_field () -> #btl_cond.parameters.
(
type(),
trigger(),
- btl_character_turn_update()
+ btl_character_turn_update:type()
)
-> {trigger(), btl_character_turn_update:type()}.
apply (S0Condition, S0Trigger, S0Update) ->
@@ -324,5 +325,28 @@ apply (S0Condition, S0Trigger, S0Update) ->
end.
+-spec recursive_apply
+ (
+ list(type()),
+ trigger(),
+ btl_character_turn_update:type()
+ )
+ -> {trigger(), btl_character_turn_update:type()}.
+recursive_apply (Conditions, S0Trigger, S0Update) ->
+ [LastTrigger, LastUpdate] =
+ lists:foldl
+ (
+ fun (Condition, Parameters) ->
+ {NextTrigger, NextUpdate} =
+ erlang:apply(btl_condition, apply, [Condition|Parameters]),
+
+ [NextTrigger, NextUpdate]
+ end,
+ [S0Trigger, S0Update],
+ Conditions
+ ),
+
+ {LastTrigger, LastUpdate}.
+
-spec encode (type()) -> {list({binary(), any()})}.
encode (Condition) -> {[]} % TODO.