summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2019-10-14 22:44:01 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2019-10-14 22:44:01 +0200
commit374d81b1cc1b638ae8b2504f8e8c7b4929a679a7 (patch)
treef47bfa7896da4d24fec106b07e91084b33403078 /src/battle/mechanic
parent0e980b08f266b48d9b40f5d58fa40e1a748f8bbf (diff)
...
Diffstat (limited to 'src/battle/mechanic')
-rw-r--r--src/battle/mechanic/action/btl_action_attack.erl148
-rw-r--r--src/battle/mechanic/btl_victory_progression.erl46
2 files changed, 65 insertions, 129 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.