| summaryrefslogtreecommitdiff | 
diff options
| -rw-r--r-- | src/battle/mechanic/condition/btl_cond_heal.erl | 16 | ||||
| -rw-r--r-- | src/battle/struct/btl_status_indicators.erl | 767 | 
2 files changed, 164 insertions, 619 deletions
| diff --git a/src/battle/mechanic/condition/btl_cond_heal.erl b/src/battle/mechanic/condition/btl_cond_heal.erl index ba9840d..7de6369 100644 --- a/src/battle/mechanic/condition/btl_cond_heal.erl +++ b/src/battle/mechanic/condition/btl_cond_heal.erl @@ -5,9 +5,13 @@  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  -include("tacticians/conditions.hrl"). +-type turn_result() :: {non_neg_integer(), non_neg_integer()}. +  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export_type([turn_result/0]). +  -export  (     [ @@ -216,3 +220,15 @@ apply (SelfRef, S0Update, S0Context) ->           {VolatileData, S1Update}     end. + +-spec encode_turn_result (any()) -> binary(). +encode_turn_result ({CharIX, HealingAmount}) -> +   jiffy:encode +   ( +      [ +         {<<"ix">>, CharIX}, +         {<<"p">>, HealingAmount} +      ] +   ); +encode_turn_result (Other) -> +   error({turn_result, Other}). diff --git a/src/battle/struct/btl_status_indicators.erl b/src/battle/struct/btl_status_indicators.erl index 9c852d4..ec0b2d5 100644 --- a/src/battle/struct/btl_status_indicators.erl +++ b/src/battle/struct/btl_status_indicators.erl @@ -20,14 +20,14 @@  (     btl_sti,     { -      icon :: binary(), -      extra :: binary(), +      category :: binary(), +      parameter :: binary(),        visibility :: visibility()     }  ). --type single() :: #btl_cond{}. --type type () :: orddict:orddict(non_neg_integer(), single()), +-type single() :: #btl_sti{}. +-type type() :: orddict:orddict(non_neg_integer(), single()).  -export_type  ( @@ -47,26 +47,25 @@     [        get_status_indicator/2, -      get_parameters/1, -      set_parameters/3, % IX, Value, Conditions -      ataxia_set_parameters/3, % IX, Value, Conditions -      ataxia_set_parameters/4, % IX, Value, Conditions +      get_parameter/1, +      set_parameter/3, % IX, Value, StatusIndicators +      ataxia_set_parameter/3, % IX, Value, StatusIndicators -      get_triggers/1, -      set_triggers/3, % IX, Value, Conditions -      ataxia_set_triggers/3, % IX, Value, Conditions +      get_category/1, +      set_category/3, % IX, Value, StatusIndicators +      ataxia_set_category/3, % IX, Value, StatusIndicators        get_visibility/1, -      set_visibility/3, % IX, Value, Conditions -      ataxia_set_visibility/3 % IX, Value, Conditions +      set_visibility/3, % IX, Value, StatusIndicators +      ataxia_set_visibility/3 % IX, Value, StatusIndicators     ]  ).  -export  (     [ -      add/5, -      ataxia_add/5, +      add/4, +      ataxia_add/4,        remove/2,        ataxia_remove/2,        new/0 @@ -76,14 +75,6 @@  -export  (     [ -      apply_to_character/5, -      apply_to_battle/4 -   ] -). - --export -( -   [        encode_for/2     ]  ). @@ -91,141 +82,45 @@  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec apply_trigger -   ( -      shr_condition:context(_ReadOnlyDataType, VolatileDataType), -      fun((non_neg_integer()) -> ref()), -      btl_character_turn_update:type(), -      ordsets:ordset(non_neg_integer()), -      type() -   ) -   -> {VolatileDataType, btl_character_turn_update:type()}. -apply_trigger (Context, IXtoRef, S0Update, RelevantIndices, Conditions) -> -   {Trigger, ReadOnlyData, S0VolatileData} = Context, - -   ConditionCollection = Conditions#btl_conds.collection, - -   {LastVolatileData, LastUpdate} = -      ordsets:fold -      ( -         fun (IX, {CurrentVolatileData, CurrentUpdate}) -> -            case orddict:find(IX, ConditionCollection) of -               {ok, Condition} -> -                  Module = -                     shr_condition:get_module -                     ( -                        shr_condition:from_id(Condition#btl_cond.category) -                     ), - -                  {NextVolatileData, NextUpdate} = -                     erlang:apply -                     ( -                        Module, -                        apply, -                        [ -                           IXtoRef(IX), -                           CurrentUpdate, -                           {Trigger, ReadOnlyData, CurrentVolatileData} -                        ] -                     ), - -                  {NextVolatileData, NextUpdate}; - -               error -> -                  % TODO: Remove the condition. -                  {CurrentVolatileData, CurrentUpdate} -            end -         end, -         {S0VolatileData, S0Update, []}, -         RelevantIndices -      ), - -   {LastVolatileData, LastUpdate}. - --spec compute_next_index (type()) -> non_neg_integer(). -compute_next_index (Conditions) -> -   Collection = Conditions#btl_conds.collection, -   CollectionSize = orddict:size(Collection), -   Candidates = lists:seq(0, CollectionSize), - -   Result = -      lists:foldr -      ( -         fun (Candidate, CurrentResult) -> -            case is_integer(CurrentResult) of -               true -> CurrentResult; -               false -> -                  case orddict:is_key(Candidate, Collection) of -                     true -> none; -                     false -> Candidate -                  end -            end -         end, -         none, -         Candidates -      ), - -   Result. -  -spec encode_single (non_neg_integer(), single()) -> {list({binary(), any()})}. -encode_single (IX, Condition) -> -   Module = -      shr_condition:get_module -      ( -         shr_condition:from_id(Condition#btl_cond.category) -      ), - -   EncodedParameters = -      erlang:apply -      ( -         Module, -         encode_parameters, -         [ -            Condition#btl_cond.parameters -         ] -      ), +encode_single (IX, StatusIndicator) -> +   Category = StatusIndicator#btl_sti.category, +   Parameter = StatusIndicator#btl_sti.parameter,     {        [ -         {<<"ix">>, IX}, -         {<<"p">>, EncodedParameters} +         % XXX: This exposes the presence of hidden status indicators +         {<<"i">>, IX}, +         {<<"c">>, Category}, +         {<<"p">>, Parameter}        ]     }. --spec get_relevant_condition_indices -   ( -      shr_condition:trigger(), -      type() -   ) -   -> ordsets:ordset(non_neg_integer()). -get_relevant_condition_indices(Trigger, Conditions) -> -   case orddict:find(Trigger, Conditions#btl_conds.from_trigger) of -      {ok, Result} -> Result; -      _ -> ordsets:new() -   end. -  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%% Accessors %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec get_condition +-spec get_status_indicator     (        ref(),        btl_character_turn_update:type()     )     -> ({ok, single()} | none). -get_condition ({battle, IX}, Update) -> -   Conditions = -      btl_battle:get_conditions(btl_character_turn_update:get_battle(Update)), +get_status_indicator ({battle, IX}, Update) -> +   StatusIndicators = +      btl_battle:get_status_indicators +      ( +         btl_character_turn_update:get_battle(Update) +      ), -   case orddict:find(IX, Conditions#btl_conds.collection) of +   case orddict:find(IX, StatusIndicators) of        error -> none;        Other -> Other     end; -get_condition ({char, CharIX, CondIX}, Update) -> -   Conditions = -      btl_character:get_conditions +get_status_indicator ({char, CharIX, StatusIndicatorIX}, Update) -> +   StatusIndicators = +      btl_character:get_status_indicators        (           btl_battle:get_character           ( @@ -234,7 +129,7 @@ get_condition ({char, CharIX, CondIX}, Update) ->           )        ), -   case orddict:find(CondIX, Conditions#btl_conds.collection) of +   case orddict:find(StatusIndicatorIX, StatusIndicators) of        error -> none;        Other -> Other     end. @@ -243,22 +138,18 @@ get_condition ({char, CharIX, CondIX}, Update) ->  %%%% Visibility %%%%  %%%%%%%%%%%%%%%%%%%%  -spec get_visibility (single()) -> visibility(). -get_visibility (Condition) -> Condition#btl_cond.visibility. +get_visibility (StatusIndicator) -> StatusIndicator#btl_sti.visibility.  -spec set_visibility (non_neg_integer(), visibility(), type()) -> type(). -set_visibility (IX, NewVisibility, Conditions) -> -   Conditions#btl_conds -   { -      collection = -         orddict:update -         ( -            IX, -            fun (Condition) -> -               Condition#btl_cond{ visibility = NewVisibility } -            end, -            Conditions#btl_conds.collection -         ) -   }. +set_visibility (IX, NewVisibility, StatusIndicators) -> +   orddict:update +   ( +      IX, +      fun (StatusIndicator) -> +         StatusIndicator#btl_sti{ visibility = NewVisibility } +      end, +      StatusIndicators +   ).  -spec ataxia_set_visibility     ( @@ -267,362 +158,103 @@ set_visibility (IX, NewVisibility, Conditions) ->        type()     )     -> {type(), ataxic:basic()}. -ataxia_set_visibility (IX, NewVisibility, Conditions) -> +ataxia_set_visibility (IX, NewVisibility, StatusIndicators) ->     { -      set_visibility(IX, NewVisibility, Conditions), -      ataxic:update_field +      set_visibility(IX, NewVisibility, StatusIndicators), +      ataxic_sugar:update_orddict_element        ( -         #btl_conds.collection, -         ataxic_sugar:update_orddict_element +         IX, +         ataxic:update_field           ( -            IX, -            ataxic:update_field -            ( -               #btl_cond.visibility, -               ataxic:constant(NewVisibility) -            ) +            #btl_sti.visibility, +            ataxic:constant(NewVisibility)           )        )     }.  %%%%%%%%%%%%%%%%%% -%%%% Triggers %%%% +%%%% Category %%%%  %%%%%%%%%%%%%%%%%% --spec get_triggers (single()) -> ordsets:ordset(shr_condition:trigger()). -get_triggers (Condition) -> Condition#btl_cond.triggers. +-spec get_category (single()) -> binary(). +get_category (StatusIndicator) -> StatusIndicator#btl_sti.category. --spec set_triggers +-spec set_category     (        non_neg_integer(), -      ordsets:ordset(shr_condition:trigger()), +      binary(),        type()     )     -> type(). -set_triggers (IX, NewTriggers, Conditions) -> -   CurrentCondition = orddict:fetch(IX, Conditions#btl_conds.collection), -   CurrentTriggers = CurrentCondition#btl_cond.triggers, -   AddedTriggers = ordsets:subtract(NewTriggers, CurrentTriggers), -   RemovedTriggers = ordsets:subtract(CurrentTriggers, NewTriggers), - -   S0FromTrigger = -      ordsets:fold -      ( -         fun (Trigger, FromTrigger) -> -            orddict:update -            ( -               Trigger, -               fun (ConditionIXs) -> -                  ordsets:del_element(IX, ConditionIXs) -               end, -               FromTrigger -            ) -         end, -         Conditions#btl_conds.from_trigger, -         RemovedTriggers -      ), - -   S1FromTrigger = -      ordsets:fold -      ( -         fun (Trigger, FromTrigger) -> -            orddict:update -            ( -               Trigger, -               fun (ConditionIXs) -> -                  ordsets:add_element(IX, ConditionIXs) -               end, -               FromTrigger -            ) -         end, -         S0FromTrigger, -         AddedTriggers -      ), - -   Conditions#btl_conds -   { -      from_trigger = S1FromTrigger, -      collection = -         orddict:update -         ( -            IX, -            fun (Condition) -> Condition#btl_cond{ triggers = NewTriggers } end, -            Conditions#btl_conds.collection -         ) -   }. +set_category (IX, NewValue, StatusIndicators) -> +   orddict:update +   ( +      IX, +      fun (StatusIndicator) -> +         StatusIndicator#btl_sti{ category = NewValue } +      end, +      StatusIndicators +   ). --spec ataxia_set_triggers +-spec ataxia_set_category     (        non_neg_integer(), -      ordsets:ordset(shr_condition:trigger()), +      binary(),        type()     )     -> {type(), ataxic:basic()}. -ataxia_set_triggers (IX, NewTriggers, Conditions) -> -   CurrentCondition = orddict:fetch(IX, Conditions#btl_conds.collection), -   CurrentTriggers = CurrentCondition#btl_cond.triggers, -   AddedTriggers = ordsets:subtract(NewTriggers, CurrentTriggers), -   RemovedTriggers = ordsets:subtract(CurrentTriggers, NewTriggers), -   AtaxicFromTriggerParams = [ataxic:constant(IX), ataxic:current_value()], - -   {S0FromTrigger, S0FromTriggerAtaxicUpdates} = -      ordsets:fold -      ( -         fun (Trigger, {FromTrigger, PrevFromTriggerAtaxicUpdates}) -> -            { -               orddict:update -               ( -                  Trigger, -                  fun (ConditionIXs) -> -                     ordsets:del_element(IX, ConditionIXs) -                  end, -                  FromTrigger -               ), -               [ -                  ataxic_sugar:update_orddict_element -                  ( -                     IX, -                     ataxic:apply_function -                     ( -                        ordsets, -                        del_element, -                        AtaxicFromTriggerParams -                     ) -                  ) -                  | PrevFromTriggerAtaxicUpdates -               ] -            } -         end, -         {Conditions#btl_conds.from_trigger, []}, -         RemovedTriggers -      ), - -   {S1FromTrigger, S1FromTriggerAtaxicUpdates} = -      ordsets:fold -      ( -         fun (Trigger, {FromTrigger, PrevFromTriggerAtaxicUpdates}) -> -            { -               orddict:update -               ( -                  Trigger, -                  fun (ConditionIXs) -> -                     ordsets:add_element(IX, ConditionIXs) -                  end, -                  FromTrigger -               ), -               [ -                  ataxic_sugar:update_orddict_element -                  ( -                     IX, -                     ataxic:apply_function -                     ( -                        ordsets, -                        add_element, -                        AtaxicFromTriggerParams -                     ) -                  ) -                  | PrevFromTriggerAtaxicUpdates -               ] -            } -         end, -         {S0FromTrigger, S0FromTriggerAtaxicUpdates}, -         AddedTriggers -      ), - +ataxia_set_category (IX, NewValue, StatusIndicators) ->     { -      Conditions#btl_conds -      { -         from_trigger = S1FromTrigger, -         collection = -            orddict:update -            ( -               IX, -               fun (Condition) -> -                  Condition#btl_cond{ triggers = NewTriggers } -               end, -               Conditions#btl_conds.collection -            ) -      }, -      ataxic:sequence +      set_category(IX, NewValue, StatusIndicators), +      ataxic_sugar:update_orddict_element        ( -         [ -            ataxic:update_field -            ( -               #btl_conds.collection, -               ataxic_sugar:update_orddict_element -               ( -                  IX, -                  ataxic:update_field -                  ( -                     #btl_cond.triggers, -                     ataxic:sequence -                     ( -                        [ -                           ataxic:apply_function -                           ( -                              ordsets, -                              subtract, -                              [ -                                 ataxic:current_value(), -                                 ataxic:constant(RemovedTriggers) -                              ] -                           ), -                           ataxic:apply_function -                           ( -                              ordsets, -                              union, -                              [ -                                 ataxic:current_value(), -                                 ataxic:constant(AddedTriggers) -                              ] -                           ) -                        ] -                     ) -                  ) -               ) -            ), -            ataxic:update_field -            ( -               #btl_conds.from_trigger, -               ataxic:sequence(S1FromTriggerAtaxicUpdates) -            ) -         ] +         IX, +         ataxic:update_field +         ( +            #btl_sti.category, +            ataxic:const(NewValue) +         )        )     }. +  %%%%%%%%%%%%%%%%%%%%  %%%% Parameters %%%%  %%%%%%%%%%%%%%%%%%%% --spec get_parameters (single()) -> any(). -get_parameters (Condition) -> Condition#btl_cond.parameters. - --spec set_parameters (non_neg_integer(), any(), type()) -> type(). -set_parameters (IX, NewValue, Conditions) -> -   Conditions#btl_conds -   { -      collection = -         orddict:update -         ( -            IX, -            fun (Condition) -> Condition#btl_cond{ parameters = NewValue } end, -            Conditions#btl_conds.collection -         ) -   }. +-spec get_parameter (single()) -> binary(). +get_parameter (StatusIndicator) -> StatusIndicator#btl_sti.parameter. --spec ataxia_set_parameters +-spec set_parameter (non_neg_integer(), binary(), type()) -> type(). +set_parameter (IX, NewValue, StatusIndicators) -> +   orddict:update     ( -      non_neg_integer(), -      any(), -      type() -   ) -   -> {type(), ataxic:basic()}. -ataxia_set_parameters (IX, NewValue, Conditions) -> -   ataxia_set_parameters(IX, NewValue, ataxic:constant(NewValue), Conditions). +      IX, +      fun (StatusIndicator) -> +         StatusIndicator#btl_sti{ parameter = NewValue } +      end, +      StatusIndicators +   ). --spec ataxia_set_parameters +-spec ataxia_set_parameter     (        non_neg_integer(), -      any(), -      ataxic:basic(), +      binary(),        type()     )     -> {type(), ataxic:basic()}. -ataxia_set_parameters (IX, NewValue, ParamsAtaxicUpdate, Conditions) -> +ataxia_set_parameter (IX, NewValue, StatusIndicators) ->     { -      set_parameters(IX, NewValue, Conditions), -      ataxic:update_field +      set_parameter(IX, NewValue, StatusIndicators), +      ataxic_sugar:update_orddict_element        ( -         #btl_conds.collection, -         ataxic_sugar:update_orddict_element +         IX, +         ataxic:update_field           ( -            IX, -            ataxic:update_field -            ( -               #btl_cond.parameters, -               ParamsAtaxicUpdate -            ) +            #btl_sti.parameter, +            ataxic:const(NewValue)           )        )     }. -%%%% Apply %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --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), - -   CharacterConditions = btl_character:get_conditions(S0Actor), -   MatchingConditionIndices = -      get_relevant_condition_indices(Trigger, CharacterConditions), - -   case ordsets:is_empty(MatchingConditionIndices) of -      true -> {S0VolatileData, S1Update}; -      false -> -         {S1VolatileContext, S2Update} = -            apply_trigger -            ( -               {Trigger, ReadOnlyData, S0VolatileData}, -               fun (IX) -> {char, ActorIX, IX} end, -               S1Update, -               MatchingConditionIndices, -               CharacterConditions -            ), - -         {S1VolatileContext, S2Update} -   end. - --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), - -   BattleConditions = btl_battle:get_conditions(S0Battle), -   MatchingConditionIndices = -      get_relevant_condition_indices(Trigger, BattleConditions), - -   case ordsets:is_empty(MatchingConditionIndices) of -      true -> {S0VolatileData, S0Update}; -      false -> -         {S1VolatileContext, S1Update} = -            apply_trigger -            ( -               {Trigger, ReadOnlyData, S0VolatileData}, -               fun (IX) -> {battle, IX} end, -               S0Update, -               MatchingConditionIndices, -               BattleConditions -            ), - -         {S1VolatileContext, S1Update} -   end. -  %%%% Add/Remove Elements %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%% @@ -630,203 +262,104 @@ apply_to_battle  %%%%%%%%%%%%%  -spec add     ( -      shr_condition:id(), -      ordsets:ordset(shr_condition:trigger()), -      any(), +      binary(), +      binary(),        visibility(),        type()     )     -> {type(), non_neg_integer()}. -add (CondID, Triggers, Params, Visibility, Conditions) -> -   NewCondition = -      #btl_cond +add (Category, Parameter, Visibility, S0StatusIndicators) -> +   NewStatusIndicator = +      #btl_sti        { -         category = CondID, -         triggers = Triggers, -         parameters = Params, +         category = Category, +         parameter = Parameter,           visibility = Visibility        }, -   NewConditionIX = compute_next_index(Conditions), +   NewStatusIndicatorIX = +      shr_orddict_util:compute_next_non_neg_integer(S0StatusIndicators), -   UpdatedCollection = +   S1StatusIndicators =        orddict:store        ( -         NewConditionIX, -         NewCondition, -         Conditions#btl_conds.collection -      ), - -   UpdatedFromTrigger = -      ordsets:fold -      ( -         fun (Trigger, FromTrigger) -> -            orddict:update -            ( -               Trigger, -               fun (Set) -> ordsets:add_element(NewConditionIX, Set) end, -               FromTrigger -            ) -         end, -         Conditions#btl_conds.from_trigger, -         Triggers +         NewStatusIndicatorIX, +         NewStatusIndicator, +         S0StatusIndicators        ), -   { -      Conditions#btl_conds -      { -         collection = UpdatedCollection, -         from_trigger = UpdatedFromTrigger -      }, -      NewConditionIX -   }. +   S1StatusIndicators.  -spec ataxia_add     ( -      shr_condition:id(), -      ordsets:ordset(shr_condition:trigger()), -      any(), +      binary(), +      binary(),        visibility(),        type()     )     -> {type(), non_neg_integer(), ataxic:basic()}. -ataxia_add (CondID, Triggers, Params, Visibility, Conditions) -> -   NewCondition = -      #btl_cond +ataxia_add (Category, Parameter, Visibility, S0StatusIndicators) -> +   NewStatusIndicator = +      #btl_sti        { -         category = CondID, -         triggers = Triggers, -         parameters = Params, +         category = Category, +         parameter = Parameter,           visibility = Visibility        }, -   NewConditionIX = compute_next_index(Conditions), -   AtaxicNewConditionIX = ataxic:constant(NewConditionIX), +   NewStatusIndicatorIX = +      shr_orddict_util:compute_next_non_neg_integer(S0StatusIndicators), -   UpdatedCollection = +   S1StatusIndicators =        orddict:store        ( -         NewConditionIX, -         NewCondition, -         Conditions#btl_conds.collection +         NewStatusIndicatorIX, +         NewStatusIndicator, +         S0StatusIndicators        ), -   CollectionAtaxicUpdate = + +   StatusIndicatorsAtaxicUpdate =        ataxic:apply_function        (           orddict,           store,           [ -            AtaxicNewConditionIX, -            ataxic:constant(NewCondition), -            ataxic:current_value() -         ] -      ), - -   SetAtaxicUpdate = -      ataxic:apply_function -      ( -         ordsets, -         add_element, -         [ -            AtaxicNewConditionIX, +            ataxic:constant(NewStatusIndicatorIX), +            ataxic:constant(NewStatusIndicator),              ataxic:current_value()           ]        ), -   {UpdatedFromTrigger, FromTriggerAtaxicUpdateList} = -      ordsets:fold -      ( -         fun (Trigger, {FromTrigger, FromTriggerUpdates}) -> -            { -               orddict:update -               ( -                  Trigger, -                  fun (Set) -> ordsets:add_element(NewConditionIX, Set) end, -                  FromTrigger -               ), -               [ -                  ataxic_sugar:update_orddict_element -                  ( -                     Trigger, -                     SetAtaxicUpdate -                  ) -                  | FromTriggerUpdates -               ] -            } -         end, -         Conditions#btl_conds.from_trigger, -         Triggers -      ),     { -      Conditions#btl_conds -      { -         collection = UpdatedCollection, -         from_trigger = UpdatedFromTrigger -      }, -      NewConditionIX, -      ataxic:sequence -      ( -         [ -            ataxic:update_field -            ( -               #btl_conds.collection, -               CollectionAtaxicUpdate -            ), -            ataxic:update_field -            ( -               #btl_conds.from_trigger, -               ataxic:sequence(FromTriggerAtaxicUpdateList) -            ) -         ] -      ) +      S1StatusIndicators, +      NewStatusIndicatorIX, +      StatusIndicatorsAtaxicUpdate     }.  %%%%%%%%%%%%%%%%  %%%% Remove %%%%  %%%%%%%%%%%%%%%%  -spec remove (non_neg_integer(), type()) -> type(). -remove (IX, S0Conditions) -> -   S1Conditions = set_triggers(IX, ordsets:new(), S0Conditions), -   S2Conditions = -      S1Conditions#btl_conds -      { -         collection = orddict:erase(IX, S1Conditions#btl_conds.collection) -      }, +remove (IX, S0StatusIndicators) -> +   S1StatusIndicators = orddict:erase(IX, S0StatusIndicators), -   S2Conditions. +   S1StatusIndicators.  -spec ataxia_remove (non_neg_integer(), type()) -> {type(), ataxic:basic()}. -ataxia_remove (IX, S0Conditions) -> -   {S1Conditions, ConditionsAtaxicUpdate1} = -      ataxia_set_triggers(IX, ordsets:new(), S0Conditions), - -   S2Conditions = -      S1Conditions#btl_conds -      { -         collection = orddict:erase(IX, S1Conditions#btl_conds.collection) -      }, +ataxia_remove (IX, S0StatusIndicators) -> +   S1StatusIndicators = orddict:erase(IX, S0StatusIndicators),     { -      S2Conditions, -      ataxic:sequence +      S1StatusIndicators, +      ataxic:apply_function        ( +         orddict, +         erase,           [ -            ConditionsAtaxicUpdate1, -            ataxic:update_field -            ( -               #btl_conds.collection, -               ataxic:apply_function -               ( -                  orddict, -                  erase, -                  [ -                     ataxic:constant(IX), -                     ataxic:current_value() -                  ] -               ) -            ) +            ataxic:constant(IX), +            ataxic:current_value()           ]        )     }. @@ -834,26 +367,22 @@ ataxia_remove (IX, S0Conditions) ->  %%%% Other %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  -spec new () -> type().  new () -> -   #btl_conds -   { -      collection = orddict:new(), -      from_trigger = orddict:new() -   }. +   orddict:new().  -spec encode_for (non_neg_integer(), type()) -> list(any()). -encode_for (PlayerIX, Conditions) -> +encode_for (PlayerIX, StatusIndicators) ->     lists:filtermap     ( -      fun ({IX, Condition}) -> -         case Condition#btl_cond.visibility of +      fun ({IX, StatusIndicator}) -> +         case StatusIndicator#btl_sti.visibility of              none -> false; -            all -> encode_single(IX, Condition); +            all -> encode_single(IX, StatusIndicator);              {limited, AllowedPlayerIXs} ->                 case ordsets:is_element(PlayerIX, AllowedPlayerIXs) of                    false -> false; -                  true -> {true, encode_single(IX, Condition)} +                  true -> {true, encode_single(IX, StatusIndicator)}                 end           end        end, -      orddict:to_list(Conditions#btl_conds.collection) +      orddict:to_list(StatusIndicators)     ). | 


