| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2019-10-11 23:39:11 +0200 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2019-10-11 23:39:11 +0200 | 
| commit | 2df0db54d42a54fe5bec35bdf9996376164c23e7 (patch) | |
| tree | a653438a54ac3491237b2bc70f868cd54344b183 /src/battle | |
| parent | 60d0cf646133e70684b727b1b1874b57d9b2fccf (diff) | |
...
Diffstat (limited to 'src/battle')
| -rw-r--r-- | src/battle/mechanic/action/btl_action_attack.erl | 136 | ||||
| -rw-r--r-- | src/battle/mechanic/condition/btl_cond_heal.erl (renamed from src/battle/mechanic/condition/blt_cond_heal.erl) | 94 | ||||
| -rw-r--r-- | src/battle/struct/btl_character.erl | 46 | ||||
| -rw-r--r-- | src/battle/struct/btl_condition.erl | 131 | 
4 files changed, 256 insertions, 151 deletions
| diff --git a/src/battle/mechanic/action/btl_action_attack.erl b/src/battle/mechanic/action/btl_action_attack.erl index b9b3eea..0cc0718 100644 --- a/src/battle/mechanic/action/btl_action_attack.erl +++ b/src/battle/mechanic/action/btl_action_attack.erl @@ -24,22 +24,40 @@        btl_character:type(),        btl_character_turn_update:type()     ) -   -> {shr_condition:context(A, B), btl_character_turn_update:type()}. +   -> +   { +      shr_condition:context(A, B), +      btl_character:type(), +      ataxic:basic(), +      btl_character_turn_update:type() +   }.  apply_conditions  (     Context = {Trigger, _ReadOnlyContext, _VolatileContext}, -   Actor, +   S0Actor,     S0Update  ) -> -   {LastContext, S1Update} = +   {LastContext, S1Update, ConditionUpdates} =        btl_condition:recursive_apply        ( -         btl_character:get_conditions_on(Trigger, Actor), +         btl_character:get_conditions_on(Trigger, S0Actor),           Context,           S0Update        ), -   {LastContext, S1Update}. +   S0AllConditions = btl_character:get_conditions(S0Actor), +   {S1AllConditions, AllConditionsAtaxiaUpdate} = +      btl_condition:ataxia_apply_updates(ConditionUpdates, S0AllConditions), + +   {S1Actor, ActorAtaxiaUpdate} = +      btl_character:ataxia_set_conditions +      ( +         S1AllConditions, +         AllConditionsAtaxiaUpdate, +         S0Actor +      ), + +   {LastContext, S1Actor, ActorAtaxiaUpdate, S1Update}.  -spec roll_for_precision     ( @@ -215,38 +233,64 @@ apply_mirror_conditions     {ReadOnlyContext, S0VolatileContext},     S0Update  ) -> -   CharacterIX = btl_action:get_actor_index(Action), +   ActorIX = btl_action:get_actor_index(Action),     S0Battle = btl_character_turn_update:get_battle(S0Update), -   {Character, S1Battle} = -      btl_battle:get_resolved_character(CharacterIX, S0Battle), - +   {S0Actor, S1Battle} = btl_battle:get_resolved_character(ActorIX, S0Battle),     S1Update = btl_character_turn_update:set_battle(S1Battle, S0Update), -   {{_TriggerName, _ReadOnlyContext, S1VolatileContext}, S2Update} = +   { +      {_TriggerName, _ReadOnlyContext, S1VolatileContext}, +      S1Actor, +      ActorAtaxiaUpdate, +      S2Update +   } =        apply_conditions        (           {OwnTriggerName, ReadOnlyContext, S0VolatileContext}, -         Character, +         S0Actor,           S1Update        ), -   TargetCharacterIX = btl_action:get_target_index(Action), +   TargetIX = btl_action:get_target_index(Action),     S2Battle = btl_character_turn_update:get_battle(S2Update), +   S3Battle = +      btl_battle:ataxia_set_character +      ( +         ActorIX, +         S1Actor, +         ActorAtaxiaUpdate, +         S2Battle +      ), -   {TargetCharacter, S3Battle} = -      btl_battle:get_resolved_character(TargetCharacterIX, S2Battle), - -   S3Update = btl_character_turn_update:set_battle(S3Battle, S2Update), +   {Target, S4Battle} = btl_battle:get_resolved_character(TargetIX, S3Battle), +   S3Update = btl_character_turn_update:set_battle(S4Battle, S2Update), -   {{_TriggerName, _ReadOnlyContext, S2VolatileContext}, S4Update} = +   { +      {_TriggerName, _ReadOnlyContext, S2VolatileContext}, +      S1Target, +      TargetAtaxiaUpdate, +      S4Update +   } =        apply_conditions        (           {OtherTriggerName, ReadOnlyContext, S1VolatileContext}, -         TargetCharacter, +         Target,           S3Update        ), -   {S2VolatileContext, S4Update}; +   S5Battle = btl_character_turn_update:get_battle(S4Update), +   S6Battle = +      btl_battle:ataxia_set_character +      ( +         TargetIX, +         S1Target, +         TargetAtaxiaUpdate, +         S5Battle +      ), + +   S5Update = btl_character_turn_update:set_battle(S6Battle, S4Update), + +   {S2VolatileContext, S5Update};  apply_mirror_conditions  (     true, @@ -256,38 +300,68 @@ apply_mirror_conditions     {ReadOnlyContext, S0VolatileContext},     S0Update  ) -> -   TargetCharacterIX = btl_action:get_target_index(Action), +   TargetIX = btl_action:get_target_index(Action),     S0Battle = btl_character_turn_update:get_battle(S0Update), -   {TargetCharacter, S1Battle} = -      btl_battle:get_resolved_character(TargetCharacterIX, S0Battle), +   {S0Target, S1Battle} = +      btl_battle:get_resolved_character(TargetIX, S0Battle),     S1Update = btl_character_turn_update:set_battle(S1Battle, S0Update), -   {{_TriggerName, _ReadOnlyContext, S1VolatileContext}, S2Update} = +   { +      {_TriggerName, _ReadOnlyContext, S1VolatileContext}, +      S1Target, +      TargetAtaxiaUpdate, +      S2Update +   } =        apply_conditions        (           {OwnTriggerName, ReadOnlyContext, S0VolatileContext}, -         TargetCharacter, +         S0Target,           S1Update        ), -   CharacterIX = btl_action:get_actor_index(Action), +   ActorIX = btl_action:get_actor_index(Action),     S2Battle = btl_character_turn_update:get_battle(S2Update), -   {Character, S3Battle} = -      btl_battle:get_resolved_character(CharacterIX, S2Battle), +   {S0Actor, S3Battle} = btl_battle:get_resolved_character(ActorIX, S2Battle), + +   S4Battle = +      btl_battle:ataxia_set_character +      ( +         TargetIX, +         S1Target, +         TargetAtaxiaUpdate, +         S3Battle +      ), -   S3Update = btl_character_turn_update:set_battle(S3Battle, S2Update), +   S3Update = btl_character_turn_update:set_battle(S4Battle, S2Update), -   {{_TriggerName, _ReadOnlyContext, S2VolatileContext}, S4Update} = +   { +      {_TriggerName, _ReadOnlyContext, S2VolatileContext}, +      S1Actor, +      ActorAtaxiaUpdate, +      S4Update +   } =        apply_conditions        (           {OtherTriggerName, ReadOnlyContext, S1VolatileContext}, -         Character, +         S0Actor,           S3Update        ), -   {S2VolatileContext, S4Update}. +   S5Battle = btl_character_turn_update:get_battle(S4Update), +   S6Battle = +      btl_battle:ataxia_set_character +      ( +         ActorIX, +         S1Actor, +         ActorAtaxiaUpdate, +         S5Battle +      ), + +   S5Update = btl_character_turn_update:set_battle(S6Battle, S4Update), + +   {S2VolatileContext, S5Update}.  -spec handle_start_of_attack     ( diff --git a/src/battle/mechanic/condition/blt_cond_heal.erl b/src/battle/mechanic/condition/btl_cond_heal.erl index 021739f..bbbbc96 100644 --- a/src/battle/mechanic/condition/blt_cond_heal.erl +++ b/src/battle/mechanic/condition/btl_cond_heal.erl @@ -56,7 +56,7 @@ apply_to_character (Condition, S0Character) ->              (RemainingUses == -1) ->                 {                    Condition, -                  do_nothing, +                  none,                    [{S1Character, CharacterUpdate}]                 }; @@ -93,95 +93,33 @@ apply_to_character (Condition, S0Character) ->           end     end. --spec handle_trigger +-spec handle_context     ( -      btl_condition:trigger(), +      shr_condition:context(),        btl_condition:type()     ) -   -> btl_condition:trigger(). -handle_trigger ({TriggerType, S0TriggerData}, Condition) -> -   {TargetIX, _Amount} = btl_condition:get_parameters(Condition), - -   case -      ( -         (TriggerType == ?CONDITION_TRIGGER_START_OF_OWN_ATTACK) -         or (TriggerType == ?CONDITION_TRIGGER_END_OF_OWN_ATTACK) -         or (TriggerType == ?CONDITION_TRIGGER_START_OF_OWN_HIT) -         or (TriggerType == ?CONDITION_TRIGGER_END_OF_OWN_HIT) -         or (TriggerType == ?CONDITION_TRIGGER_OWN_DODGE) -         or (TriggerType == ?CONDITION_TRIGGER_OWN_CRITICAL) -         or (TriggerType == ?CONDITION_TRIGGER_OWN_DOUBLE_HIT) -         or (TriggerType == ?CONDITION_TRIGGER_OWN_DAMAGE) -         or (TriggerType == ?CONDITION_TRIGGER_START_OF_TARGET_ATTACK) -         or (TriggerType == ?CONDITION_TRIGGER_END_OF_TARGET_ATTACK) -         or (TriggerType == ?CONDITION_TRIGGER_START_OF_TARGET_HIT) -         or (TriggerType == ?CONDITION_TRIGGER_END_OF_TARGET_HIT) -         or (TriggerType == ?CONDITION_TRIGGER_TARGET_DODGE) -         or (TriggerType == ?CONDITION_TRIGGER_TARGET_CRITICAL) -         or (TriggerType == ?CONDITION_TRIGGER_TARGET_DOUBLE_HIT) -         or (TriggerType == ?CONDITION_TRIGGER_TARGET_DAMAGE) -      ) -   of -      false -> {TriggerType, S0TriggerData}; -      true -> -         {Char0IX, Char0, Char1IX, Char1} = TriggerData, -         if -            (Char0IX == TargetIX) -> -               {_UpdatedCondition, _UpdateOrder, UpdatedChar} = -                  apply_to_character(Condition, Char0), - -               { -                  TriggerType, -                  { -                     Char0IX -                     UpdatedChar, -                     Char1IX, -                     Char1 -                  } -               }; - -            (Char1IX == TargetIX) -> -               {_UpdatedCondition, _UpdateOrder, UpdatedChar} = -                  apply_to_character(Condition, Char0), - -               { -                  TriggerType, -                  { -                     Char0IX -                     Char0, -                     Char1IX, -                     UpdatedChar -                  } -               }; - -            true -> {TriggerType, S0TriggerData} -         end -   end. +   -> shr_condition:context(). +handle_context ({Trigger, ReadOnly, VolatileData}, Condition) -> +   {_TargetIX, _Amount} = btl_condition:get_parameters(Condition), +   {Trigger, ReadOnly, VolatileData}.  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  -spec apply     ( -      btl_condition:trigger(), +      shr_condition:context(),        btl_condition:type(),        btl_character_turn_update:type()     ) ->     { -      btl_condition:type(), -      btl_condition:update_action(), -      btl_condition:trigger(), -      btl_character_turn_update:type() +      shr_condition:context(), +      btl_character_turn_update:type(), +      btl_condition:update_action()     }. -apply (S0Trigger, Condition, Update) -> -   S1Trigger = handle_trigger(S0Trigger, Condition), +apply (S0Context, S0Condition, S0Update) -> +   S1Context = handle_context(S0Context, S0Condition), + +   {TargetIX, Amount} = btl_condition:get_parameters(S0Condition), -   Parameters, -   Condition, -   Update) -> -   {TargetIX, Amount} = -      case btl_condition:get_parameters(Condition) of -         {StoredTargetIX, StoredAmount} -> {StoredTargetIX, StoredAmount}; -         Other -> error({condition, parameter, Other}) -      end, -   {[{Condition, []}], Update}. +   {S1Context, S0Update, none}. diff --git a/src/battle/struct/btl_character.erl b/src/battle/struct/btl_character.erl index 6dffd6b..7771b1a 100644 --- a/src/battle/struct/btl_character.erl +++ b/src/battle/struct/btl_character.erl @@ -7,7 +7,7 @@  -define(IS_ACTIVE_FIELD, <<"ena">>).  -define(IS_DEFEATED_FIELD, <<"dea">>).  -define(BASE_CHAR_FIELD, <<"bas">>). --define(CONDITION_FIELD, <<"con">>). +-define(CONDITIONS_FIELD, <<"con">>).  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -25,7 +25,7 @@        is_active :: boolean(),        is_defeated :: boolean(),        base :: shr_character:unresolved(), -      conditions :: list(btl_condition:type()) +      conditions :: orddict:orddict(non_neg_integer(), btl_condition:type())     }  ). @@ -40,7 +40,7 @@        is_active :: boolean(),        is_defeated :: boolean(),        base :: shr_character:type(), -      conditions :: list(btl_condition:type()) +      conditions :: orddict:orddict(non_neg_integer(), btl_condition:type())     }  ). @@ -105,7 +105,7 @@  -export  (     [ -      new/4, +      new/5,        resolve/2,        is_unresolved/1,        to_unresolved/1, @@ -194,8 +194,8 @@ get_base_character (#btl_char{ base = R }) -> R;  get_base_character (#btl_char_ref{ base = R }) -> R.  -spec get_conditions -   (type()) -> list(btl_condition:type()); -   (unresolved()) -> list(btl_conditions:type()). +   (type()) -> orddict:orddict(non_neg_integer(), btl_condition:type()); +   (unresolved()) -> orddict:orddict(non_neg_integer(), btl_conditions:type()).  get_conditions (#btl_char{ conditions = R }) -> R;  get_conditions (#btl_char_ref{ conditions = R }) -> R. @@ -204,11 +204,11 @@ get_conditions (#btl_char_ref{ conditions = R }) -> R.        shr_condition:trigger(),        either()     ) -   -> list(btl_condition:type()). +   -> orddict:orddict(non_neg_integer(), btl_condition:type()).  get_conditions_on (Trigger, Char) -> -   lists:filter +   orddict:filter     ( -      fun (Condition) -> +      fun (_IX, Condition) ->           btl_condition:triggers_on(Trigger, Condition)        end,        get_conditions(Char) @@ -448,8 +448,16 @@ ataxia_set_base_character (NewBaseCharacter, Char) ->     ).  -spec set_conditions -   (list(btl_condition:type()), type()) -> type(); -   (list(btl_condition:type()), unresolved()) -> unresolved(). +   ( +      orddict:orddict(non_neg_integer(), btl_condition:type()), +      type() +   ) +   -> type(); +   ( +      orddict:orddict(non_neg_integer(), btl_condition:type()), +      unresolved() +   ) +   -> unresolved().  set_conditions (Conditions, Char) when is_record(Char, btl_char) ->     Char#btl_char{ conditions = Conditions };  set_conditions (Conditions, Char) when is_record(Char, btl_char_ref) -> @@ -458,13 +466,13 @@ set_conditions (Conditions, Char) when is_record(Char, btl_char_ref) ->  -spec ataxia_set_conditions     ( -      list(btl_condition:type()), +      orddict:orddict(non_neg_integer(), btl_condition:type()),        ataxic:basic(),        type()     )     -> {type(), ataxic:basic()};     ( -      list(btl_condition:type()), +      orddict:orddict(non_neg_integer(), btl_condition:type()),        ataxic:basic(),        unresolved()     ) -> {unresolved(), ataxic:basic()}. @@ -479,8 +487,16 @@ ataxia_set_conditions (Conditions, Update, Char) ->     }.  -spec ataxia_set_conditions -   (list(btl_condition:type()), type()) -> {type(), ataxic:basic()}; -   (list(btl_condition:type()), unresolved()) -> {unresolved(), ataxic:basic()}. +   ( +      orddict:orddict(non_neg_integer(), btl_condition:type()), +      type() +   ) +   -> {type(), ataxic:basic()}; +   ( +      orddict:orddict(non_neg_integer(), btl_condition:type()), +      unresolved() +   ) +   -> {unresolved(), ataxic:basic()}.  ataxia_set_conditions (Conditions, Char) ->     ataxia_set_conditions     ( diff --git a/src/battle/struct/btl_condition.erl b/src/battle/struct/btl_condition.erl index 24ef084..fee7279 100644 --- a/src/battle/struct/btl_condition.erl +++ b/src/battle/struct/btl_condition.erl @@ -5,7 +5,12 @@  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  -include("tacticians/conditions.hrl"). --type update_action() :: (none, remove, {update, ataxic:basic()}). +-type update_action() :: +   ( +      none +      | remove +      | {update, type(), ataxic:basic()} +   ).  -record  ( @@ -61,7 +66,9 @@     [        triggers_on/2,        apply/3, -      recursive_apply/3 +      recursive_apply/3, +      apply_updates/2, +      ataxia_apply_updates/2     ]  ). @@ -234,47 +241,117 @@ get_parameters_field () -> #btl_cond.parameters.        shr_condition:context(),        btl_character_turn_update:type()     ) -   -> {shr_condition:context(), btl_character_turn_update:type()}. -apply (S0Condition, S0Context, S0Update) -> -   Module = shr_condition_selector:get_module(get_category(S0Condition)), - -   {S1Condition, UpdateAction, S1Context, S1Update} = -      erlang:apply(Module, apply, [S0Context, S0Condition, S0Update]), +   -> +   { +      shr_condition:context(), +      btl_character_turn_update:type(), +      update_action() +   }. +apply (Condition, S0Context, S0Update) -> +   Module = shr_condition_selector:get_module(get_category(Condition)), -   case UpdateAction of -      none -> {S1Context, S1Update}; -      remove -> -         % TODO -         {S1Context, S1Update}; +   {S1Context, S1Update, UpdateAction} = +      erlang:apply(Module, apply, [S0Context, Condition, S0Update]), -      {update, ConditionUpdate} -> -         % TODO -         {S1Context, S1Update} +   {S1Context, S1Update, UpdateAction}. -   end.  -spec recursive_apply     ( -      list(type()), +      orddict:orddict(IndexType, type()),        shr_condition:context(),        btl_character_turn_update:type()     ) -   -> {shr_condition:context(), btl_character_turn_update:type()}. +   -> +   { +      shr_condition:context(), +      btl_character_turn_update:type(), +      list({IndexType, update_action()}) +   }.  recursive_apply (Conditions, S0Context, S0Update) -> -   [LastContext, LastUpdate] = -      lists:foldl +   {[LastContext, LastUpdate], AllUpdateActions} = +      orddict:fold        ( -         fun (Condition, Parameters) -> -            {NextContext, NextUpdate} = +         fun (IX, Condition, {Parameters, UpdateActions}) -> +            {NextContext, NextUpdate, UpdateAction} =                 erlang:apply(btl_condition, apply, [Condition|Parameters]), -            [NextContext, NextUpdate] +            { +               [NextContext, NextUpdate], +               case UpdateAction of +                  none -> UpdateActions; +                  _ -> [{IX, UpdateAction}|UpdateActions] +               end +            }           end, -         [S0Context, S0Update], +         [S0Context, S0Update, []],           Conditions        ), -   {LastContext, LastUpdate}. +   {LastContext, LastUpdate, AllUpdateActions}. + +-spec apply_updates +   ( +      list({IndexType, update_action()}), +      orddict:orddict(IndexType, type()) +   ) +   -> orddict:orddict(IndexType, type()). +apply_updates (Updates, Conditions) -> +   lists:foldl +   ( +      fun ({IX, Update}, CurrentConditions) -> +         case Update of +            none -> CurrentConditions; +            remove -> orddict:erase(IX, CurrentConditions); +            {update, Val, _Ataxic} -> orddict:store(IX, Val, CurrentConditions) +         end +      end, +      Conditions, +      Updates +   ). + +-spec ataxia_apply_updates +   ( +      list({IndexType, update_action()}), +      orddict:orddict(IndexType, type()) +   ) +   -> {orddict:orddict(IndexType, type()), ataxic:basic()}. +ataxia_apply_updates (Updates, Conditions) -> +   {FinalConditions, AtaxicSequence} = +      lists:foldl +      ( +         fun ({IX, Update}, {CurrentConditions, AtaxicUpdates}) -> +            case Update of +               none -> {CurrentConditions, AtaxicUpdates}; +               remove -> +                  { +                     orddict:erase(IX, CurrentConditions), +                     [ +                        ataxic:apply_function +                        ( +                           orddict, +                           erase, +                           [ataxic:constant(IX), ataxic:current_value()] +                        ) +                        |AtaxicUpdates +                     ] +                  }; + +               {update, Val, Ataxic} -> +                  { +                     orddict:store(IX, Val, CurrentConditions), +                     [ +                        ataxic_sugar:update_orddict_element(IX, Ataxic) +                        |AtaxicUpdates +                     ] +                  } +            end +         end, +         Conditions, +         Updates +      ), + +   {FinalConditions, ataxic:sequence(AtaxicSequence)}.  -spec encode (type()) -> {list({binary(), any()})}. -encode (Condition) -> {[]} % TODO. +encode (Condition) -> {[]}. % TODO | 


