summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle/mechanic/action/btl_action_attack.erl | 148 | ||||
-rw-r--r-- | src/battle/mechanic/btl_victory_progression.erl | 46 | ||||
-rw-r--r-- | src/battle/struct/btl_condition.erl | 124 |
3 files changed, 188 insertions, 130 deletions
diff --git a/src/battle/mechanic/action/btl_action_attack.erl b/src/battle/mechanic/action/btl_action_attack.erl index 1024f44..91c886b 100644 --- a/src/battle/mechanic/action/btl_action_attack.erl +++ b/src/battle/mechanic/action/btl_action_attack.erl @@ -25,75 +25,6 @@ should_reverse_roles (IsParry, AttackCategory) -> or ((AttackCategory =/= counter) and (IsParry == true)) ). --spec apply_condition_to_character - ( - non_neg_integer(), - shr_condition:trigger(), - any(), - VolatileDataType, - btl_character_turn_update:type() - ) - -> {VolatileDataType, btl_character_turn_update:type()}. -apply_condition_to_character -( - ActorIX, - Trigger, - ReadOnlyData, - S0VolatileData, - S0Update -) -> - S0Battle = btl_character_turn_update:get_battle(S0Update), - {S0Actor, S1Battle} = btl_battle:get_resolved_character(ActorIX, S0Battle), - S1Update = btl_character_turn_update:set_battle(S1Battle, S0Update), - - { - S1VolatileContext, - ActorConditionsAtaxicUpdate, - S2Update - } = - btl_condition:ataxia_apply_trigger - ( - {Trigger, ReadOnlyData, S0VolatileData}, - S1Update, - btl_character:get_conditions(S0Actor) - ), - - %%%%% Actor and Battle may have been modified %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - S1Battle = btl_character_turn_update:get_battle(S2Update), - {S1Actor, S2Battle} = btl_battle:get_resolved_character(ActorIX, S1Battle), - S0Conditions = btl_character:get_conditions(S1Actor), - - S1Conditions = - ataxic:basic_apply_to(ActorConditionsAtaxicUpdate, S0Conditions), - - {S2Actor, ActorAtaxicUpdate} = - btl_character:ataxia_set_conditions - ( - S1Conditions, - ActorConditionsAtaxicUpdate, - S1Actor - ), - - {S3Battle, BattleAtaxicUpdate} = - btl_battle:ataxia_set_character - ( - ActorIX, - S2Actor, - ActorAtaxicUpdate, - S2Battle - ), - - S2Update = - btl_character_turn_update:ataxia_set_battle - ( - S3Battle, - BattleAtaxicUpdate, - S1Update - ), - - {S1VolatileContext, S2Update}. - -spec apply_mirror_conditions ( boolean(), @@ -130,7 +61,7 @@ apply_mirror_conditions end, {S1VolatileContext, S1Update} = - apply_condition_to_character + blt_condition:apply_to_character ( ActorIX, OwnTriggerName, @@ -140,7 +71,7 @@ apply_mirror_conditions ), {S2VolatileContext, S2Update} = - apply_condition_to_character + blt_condition:apply_to_character ( TargetIX, OtherTriggerName, @@ -149,41 +80,16 @@ apply_mirror_conditions S1Update ), - S0Battle = btl_character_turn_update:get_battle(S2Update), - - { - S3VolatileContext, - BattleConditionsAtaxicUpdate, - S5Update - } = - btl_condition:ataxia_apply_trigger - ( - {GlobalTriggerName, ReadOnlyContext, S2VolatileContext}, - S2Update, - btl_battle:get_conditions(S0Battle) - ), - - %%%% Battle may have been modified (and very likely has) %%%%%%%%%%%%%%%%%%%% - S1Battle = btl_character_turn_update:get_battle(S2Update), - UpdatedBattleConditions = - ataxic:basic_apply_to - ( - btl_battle:get_conditions(S1Battle), - BattleConditionsAtaxicUpdate - ), - - {S2Battle, BattleAtaxicUpdate} = - btl_battle:ataxia_set_conditions(UpdatedBattleConditions, S1Battle), - - S5Update = - btl_character_turn_update:ataxia_set_battle + {S3VolatileContext, S3Update} = + blt_condition:apply_to_battle ( - S2Battle, - BattleAtaxicUpdate, + GlobalTriggerName, + ReadOnlyContext, + S2VolatileContext, S2Update ), - {S3VolatileContext, S2Update}. + {S3VolatileContext, S3Update}. -spec roll_for_precision ( @@ -402,68 +308,68 @@ handle_end_of_attack (Action, S0Update) -> S2Update = btl_character_turn_update:set_battle(S2Battle, S1Update), - S0ActorIsDead = (not btl_character:get_is_alive(Actor)), - S0TargetIsDead = (not btl_character:get_is_alive(Actor)), + S0ActorIsDead = (not btl_character:get_is_alive(S0Actor)), + S0TargetIsDead = (not btl_character:get_is_alive(S0Target)), S3Update = case S0ActorIsDead of false -> S2Update; true -> - {_None, NextUpdate} = + {_None, V0NextUpdate} = apply_mirror_conditions ( false, - ?CONDITION_TRIGGER_COMPUTED_WAS_KILLED, - ?CONDITION_TRIGGER_COMPUTED_HAS_KILLED, - ?CONDITION_TRIGGER_COMPUTED_ANY_KILL, + ?CONDITION_TRIGGER_MAY_HAVE_BEEN_KILLED, + ?CONDITION_TRIGGER_MAY_HAVE_KILLED, + ?CONDITION_TRIGGER_ANY_POSSIBLE_KILL, Action, none, S2Update ), - NextUpdate + V0NextUpdate end, S4Update = case S0TargetIsDead of false -> S3Update; true -> - {_None, NextUpdate} = + {_None, V1NextUpdate} = apply_mirror_conditions ( true, - ?CONDITION_TRIGGER_COMPUTED_WAS_KILLED, - ?CONDITION_TRIGGER_COMPUTED_HAS_KILLED, - ?CONDITION_TRIGGER_COMPUTED_ANY_KILL, + ?CONDITION_TRIGGER_MAY_HAVE_BEEN_KILLED, + ?CONDITION_TRIGGER_MAY_HAVE_KILLED, + ?CONDITION_TRIGGER_ANY_POSSIBLE_KILL, Action, none, S3Update ), - NextUpdate + V1NextUpdate end, S3Battle = btl_character_turn_update:get_battle(S4Update), - {S1Actor, S1Battle} = btl_battle:get_resolved_character(ActorIX, S0Battle), - {S1Target, S2Battle} = btl_battle:get_resolved_character(TargetIX, S1Battle), + {S1Actor, S4Battle} = btl_battle:get_resolved_character(ActorIX, S3Battle), + {S1Target, S5Battle} = btl_battle:get_resolved_character(TargetIX, S4Battle), - S5Update = btl_character_turn_update:set_battle(S2Battle, S4Update), + S5Update = btl_character_turn_update:set_battle(S5Battle, S4Update), - S1ActorIsDead = (not btl_character:get_is_alive(Actor)), - S1TargetIsDead = (not btl_character:get_is_alive(Actor)), + S1ActorIsDead = (not btl_character:get_is_alive(S1Actor)), + S1TargetIsDead = (not btl_character:get_is_alive(S1Target)), S6Update = case S1ActorIsDead of false -> S5Update; true -> - btl_victory_progression:handle_character_loss(S1Actor, S5Update) + btl_victory_progression:handle_character_loss(ActorIX, S5Update) end, S7Update = case S1TargetIsDead of false -> S6Update; true -> - btl_victory_progression:handle_character_loss(S1Target, S6Update) + btl_victory_progression:handle_character_loss(TargetIX, S6Update) end, S7Update. diff --git a/src/battle/mechanic/btl_victory_progression.erl b/src/battle/mechanic/btl_victory_progression.erl index c6a7dae..963b539 100644 --- a/src/battle/mechanic/btl_victory_progression.erl +++ b/src/battle/mechanic/btl_victory_progression.erl @@ -2,6 +2,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-include("tacticians/conditions.hrl"). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -112,22 +113,51 @@ handle_player_defeat (PlayerIX, S0Update) -> S1Update ), - S2Update. + {_Nothing, S3Update} = + btl_condition:apply_to_battle + ( + ?CONDITION_TRIGGER_PLAYER_DEFEAT, + PlayerIX, + none, + S2Update + ), + S3Update. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -spec handle_character_loss ( - btl_character:either(), + non_neg_integer(), btl_character_turn_update:type() ) -> btl_character_turn_update:type(). -handle_character_loss (Character, Update) -> - Battle = btl_character_turn_update:get_battle(Update), - Characters = btl_battle:get_characters(Battle), - CharacterPlayerIX = btl_character:get_player_index(Character), +handle_character_loss (ActorIX, S0Update) -> + {_Nothing, S1Update} = + btl_condition:apply_to_character + ( + ActorIX, + ?CONDITION_TRIGGER_HAS_DIED, + none, + none, + S0Update + ), + + {_Nothing, S2Update} = + btl_condition:apply_to_battle + ( + ?CONDITION_TRIGGER_A_CHARACTER_HAS_DIED, + ActorIX, + none, + S1Update + ), + + S0Battle = btl_character_turn_update:get_battle(S2Update), + {Actor, S1Battle} = btl_battle:get_resolved_character(ActorIX, S0Battle), + S3Update = btl_character_turn_update:set_battle(S1Battle, S2Update), + Characters = btl_battle:get_characters(S1Battle), + CharacterPlayerIX = btl_character:get_player_index(Actor), StillHasAliveChar = lists:any @@ -142,8 +172,8 @@ handle_character_loss (Character, Update) -> ), case StillHasAliveChar of - true -> Update; - _ -> handle_player_defeat(CharacterPlayerIX, Update) + true -> S3Update; + _ -> handle_player_defeat(CharacterPlayerIX, S3Update) end. %% TODO: Trigger condition: actually dead. diff --git a/src/battle/struct/btl_condition.erl b/src/battle/struct/btl_condition.erl index 13d6387..78ee9b6 100644 --- a/src/battle/struct/btl_condition.erl +++ b/src/battle/struct/btl_condition.erl @@ -65,7 +65,9 @@ -export ( [ - ataxia_apply_trigger/3 + ataxia_apply_trigger/3, + apply_to_character/5, + apply_to_battle/4 ] ). @@ -333,5 +335,125 @@ ataxia_apply_trigger (Context, S0Update, Conditions) -> {LastVolatileData, ConditionsAtaxiaUpdate, LastUpdate}. +-spec apply_to_character + ( + non_neg_integer(), + shr_condition:trigger(), + any(), + VolatileDataType, + btl_character_turn_update:type() + ) + -> {VolatileDataType, btl_character_turn_update:type()}. +apply_to_character +( + ActorIX, + Trigger, + ReadOnlyData, + S0VolatileData, + S0Update +) -> + S0Battle = btl_character_turn_update:get_battle(S0Update), + {S0Actor, S1Battle} = btl_battle:get_resolved_character(ActorIX, S0Battle), + S1Update = btl_character_turn_update:set_battle(S1Battle, S0Update), + + { + S1VolatileContext, + ActorConditionsAtaxicUpdate, + S2Update + } = + ataxia_apply_trigger + ( + {Trigger, ReadOnlyData, S0VolatileData}, + S1Update, + btl_character:get_conditions(S0Actor) + ), + + %%%%% Actor and Battle may have been modified %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + S1Battle = btl_character_turn_update:get_battle(S2Update), + {S1Actor, S2Battle} = btl_battle:get_resolved_character(ActorIX, S1Battle), + S0Conditions = btl_character:get_conditions(S1Actor), + + S1Conditions = + ataxic:basic_apply_to(ActorConditionsAtaxicUpdate, S0Conditions), + + {S2Actor, ActorAtaxicUpdate} = + btl_character:ataxia_set_conditions + ( + S1Conditions, + ActorConditionsAtaxicUpdate, + S1Actor + ), + + {S3Battle, BattleAtaxicUpdate} = + btl_battle:ataxia_set_character + ( + ActorIX, + S2Actor, + ActorAtaxicUpdate, + S2Battle + ), + + S2Update = + btl_character_turn_update:ataxia_set_battle + ( + S3Battle, + BattleAtaxicUpdate, + S1Update + ), + + {S1VolatileContext, S2Update}. + +-spec apply_to_battle + ( + shr_condition:trigger(), + any(), + VolatileDataType, + btl_character_turn_update:type() + ) + -> {VolatileDataType, btl_character_turn_update:type()}. +apply_to_battle +( + Trigger, + ReadOnlyData, + S0VolatileData, + S0Update +) -> + S0Battle = btl_character_turn_update:get_battle(S0Update), + + { + S1VolatileContext, + BattleConditionsAtaxicUpdate, + S1Update + } = + ataxia_apply_trigger + ( + {Trigger, ReadOnlyData, S0VolatileData}, + S0Update, + btl_battle:get_conditions(S0Battle) + ), + + %%%% Battle may have been modified (and very likely has) %%%%%%%%%%%%%%%%%%%% + S1Battle = btl_character_turn_update:get_battle(S1Update), + UpdatedBattleConditions = + ataxic:basic_apply_to + ( + btl_battle:get_conditions(S1Battle), + BattleConditionsAtaxicUpdate + ), + + {S2Battle, BattleAtaxicUpdate} = + btl_battle:ataxia_set_conditions(UpdatedBattleConditions, S1Battle), + + S1Update = + btl_character_turn_update:ataxia_set_battle + ( + S2Battle, + BattleAtaxicUpdate, + S1Update + ), + + {S1VolatileContext, S1Update}. + -spec encode (type()) -> {list({binary(), any()})}. encode (Condition) -> {[]}. % TODO |