summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornsensfel <SpamShield0@noot-noot.org>2019-11-18 18:15:31 +0100
committernsensfel <SpamShield0@noot-noot.org>2019-11-18 18:15:31 +0100
commit4228ecf917439b65949600f005f298f31a4979ff (patch)
tree76c12e4eb2b2cfe30deb2d68b8cedb73797e074a
parentdbbff9e8555a30bbae2d22b17973216f00bd5b70 (diff)
...
-rw-r--r--src/battle/mechanic/condition/btl_cond_heal.erl16
-rw-r--r--src/battle/struct/btl_status_indicators.erl767
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)
).