| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src/battle/struct/btl_character.erl')
| -rw-r--r-- | src/battle/struct/btl_character.erl | 249 | 
1 files changed, 150 insertions, 99 deletions
| diff --git a/src/battle/struct/btl_character.erl b/src/battle/struct/btl_character.erl index 9769f8f..41f5535 100644 --- a/src/battle/struct/btl_character.erl +++ b/src/battle/struct/btl_character.erl @@ -1,33 +1,30 @@  -module(btl_character).  -define(PLAYER_IX_FIELD, <<"pla">>). --define(RANK_FIELD, <<"rnk">>).  -define(LOCATION_FIELD, <<"lc">>).  -define(CURRENT_HEALTH_FIELD, <<"he">>).  -define(SKILL_POINTS_FIELD, <<"sp">>).  -define(IS_ACTIVE_FIELD, <<"ena">>).  -define(IS_DEFEATED_FIELD, <<"dea">>).  -define(BASE_CHAR_FIELD, <<"bas">>). --define(CONDITIONS_FIELD, <<"con">>). +-define(STATUS_INDICATORS, <<"sti">>).  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --type rank() :: ('optional' | 'target' | 'commander'). -  -record  (     btl_char_ref,     {        player_ix :: non_neg_integer(), -      rank :: rank(),        location :: shr_location:type(),        current_health :: integer(), %% Negative integers let us reverse attacks.        skill_points :: integer(), %% Negative integers let us reverse skill uses.        is_active :: boolean(),        is_defeated :: boolean(),        base :: shr_character:unresolved(), -      conditions :: btl_conditions:type() +      conditions :: btl_conditions:type(), +      status_indicators :: btl_status_indicators:type()     }  ). @@ -36,21 +33,22 @@     btl_char,     {        player_ix :: non_neg_integer(), -      rank :: rank(),        location :: shr_location:type(),        current_health :: integer(), %% Negative integers let us reverse attacks.        skill_points :: integer(), %% Negative integers let us reverse skill uses.        is_active :: boolean(),        is_defeated :: boolean(),        base :: shr_character:type(), -      conditions :: btl_conditions:type() +      conditions :: btl_conditions:type(), +      status_indicators :: btl_status_indicators:type()     }  ).  -opaque type() :: #btl_char{}.  -opaque unresolved() :: #btl_char_ref{}.  -type either() :: (type() | unresolved()). --export_type([type/0, unresolved/0, either/0, rank/0]). + +-export_type([type/0, unresolved/0, either/0]).  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -60,7 +58,6 @@  (     [        get_player_index/1, -      get_rank/1,        get_location/1,        get_current_health/1,        get_skill_points/1, @@ -69,8 +66,8 @@        get_is_defeated/1,        get_base_character/1,        get_conditions/1, +      get_status_indicators/1, -      set_rank/2,        set_location/3,        set_current_health/2,        set_skill_points/2, @@ -78,8 +75,8 @@        set_is_defeated/2,        set_base_character/2,        set_conditions/2, +      set_status_indicators/2, -      ataxia_set_rank/2,        ataxia_set_location/3,        ataxia_set_current_health/2,        ataxia_set_skill_points/2, @@ -87,18 +84,20 @@        ataxia_set_is_defeated/2,        ataxia_set_base_character/2,        ataxia_set_conditions/2, +      ataxia_set_status_indicators/2,        ataxia_set_conditions/3, +      ataxia_set_status_indicators/3,        ataxia_set_base_character/3, -      get_rank_field/0,        get_current_health_field/0,        get_skill_points_field/0,        get_is_active_field/0,        get_is_defeated_field/0,        get_location_field/0,        get_base_character_field/0, -      get_conditions_field/0 +      get_conditions_field/0, +      get_status_indicators_field/0     ]  ). @@ -147,82 +146,23 @@ handle_max_health_change (OldBaseChar, NewBaseChar, OldHealth) ->  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%% Accessors + +%%%% Accessors %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%% +%%%% Player Index %%%% +%%%%%%%%%%%%%%%%%%%%%%  -spec get_player_index (either()) -> non_neg_integer().  get_player_index (#btl_char{ player_ix = R }) -> R;  get_player_index (#btl_char_ref{ player_ix = R }) -> R. --spec get_rank (either()) -> rank(). -get_rank (#btl_char{ rank = R }) -> R; -get_rank (#btl_char_ref{ rank = R }) -> R. - +%%%%%%%%%%%%%%%%%% +%%%% Location %%%% +%%%%%%%%%%%%%%%%%%  -spec get_location (either()) -> shr_location:type().  get_location (#btl_char{ location = R }) -> R;  get_location (#btl_char_ref{ location = R }) -> R. --spec get_current_health (either()) -> integer(). -get_current_health (#btl_char{ current_health = R }) -> R; -get_current_health (#btl_char_ref{ current_health = R }) -> R. - --spec get_skill_points (either()) -> integer(). -get_skill_points (#btl_char{ skill_points = R }) -> R; -get_skill_points (#btl_char_ref{ skill_points = R }) -> R. - --spec get_is_alive (either()) -> boolean(). -get_is_alive (#btl_char{ current_health = H, is_defeated = D }) -> -   ((not D) and (H > 0)); -get_is_alive (#btl_char_ref{ current_health = H, is_defeated = D }) -> -   ((not D) and (H > 0)). - --spec get_is_active (either()) -> boolean(). -get_is_active -( -   #btl_char{ current_health = H, is_defeated = D, is_active = A } -) -> -   ((not D) and (H > 0) and A); -get_is_active -( -   #btl_char_ref{ current_health = H, is_defeated = D, is_active = A } -) -> -   ((not D) and (H > 0) and A). - --spec get_is_defeated (either()) -> boolean(). -get_is_defeated (#btl_char{ is_defeated = R }) -> R; -get_is_defeated (#btl_char_ref{ is_defeated = R }) -> R. - --spec get_base_character -   (type()) -> shr_character:type(); -   (unresolved()) -> shr_character:unresolved(). -get_base_character (#btl_char{ base = R }) -> R; -get_base_character (#btl_char_ref{ base = R }) -> R. - --spec get_conditions -   (type()) -> btl_conditions:type(); -   (unresolved()) -> btl_conditions:type(). -get_conditions (#btl_char{ conditions = R }) -> R; -get_conditions (#btl_char_ref{ conditions = R }) -> R. - --spec set_rank -   (rank(), type()) -> type(); -   (rank(), unresolved()) -> unresolved(). -set_rank (Rank, Char) when is_record(Char, btl_char) -> -   Char#btl_char{ rank = Rank }; -set_rank (Rank, Char) when is_record(Char, btl_char_ref) -> -   Char#btl_char_ref{ rank = Rank }. - --spec ataxia_set_rank -   (rank(), type()) -> {type(), ataxic:basic()}; -   (rank(), unresolved()) -> {unresolved(), ataxic:basic()}. -ataxia_set_rank (Rank, Char) -> -   { -      set_rank(Rank, Char), -      ataxic:update_field -      ( -         get_rank_field(), -         ataxic:constant(Rank) -      ) -   }. -  -spec set_location     (        shr_location:type(), @@ -296,6 +236,19 @@ ataxia_set_location (Location, LocOmnimods, Char) ->        end     }. +%%%%%%%%%%%%%%%%%%%%%%%% +%%%% Current Health %%%% +%%%%%%%%%%%%%%%%%%%%%%%% +-spec get_current_health (either()) -> integer(). +get_current_health (#btl_char{ current_health = R }) -> R; +get_current_health (#btl_char_ref{ current_health = R }) -> R. + +-spec get_is_alive (either()) -> boolean(). +get_is_alive (#btl_char{ current_health = H, is_defeated = D }) -> +   ((not D) and (H > 0)); +get_is_alive (#btl_char_ref{ current_health = H, is_defeated = D }) -> +   ((not D) and (H > 0)). +  -spec set_current_health     (integer(), type()) -> type();     (integer(), unresolved()) -> unresolved(). @@ -317,6 +270,13 @@ ataxia_set_current_health (Health, Char) ->        )     }. +%%%%%%%%%%%%%%%%%%%%%% +%%%% Skill Points %%%% +%%%%%%%%%%%%%%%%%%%%%% +-spec get_skill_points (either()) -> integer(). +get_skill_points (#btl_char{ skill_points = R }) -> R; +get_skill_points (#btl_char_ref{ skill_points = R }) -> R. +  -spec set_skill_points     (integer(), type()) -> type();     (integer(), unresolved()) -> unresolved(). @@ -338,6 +298,21 @@ ataxia_set_skill_points (SkillPoints, Char) ->        )     }. +%%%%%%%%%%%%%%%%%%% +%%%% Is Active %%%% +%%%%%%%%%%%%%%%%%%% +-spec get_is_active (either()) -> boolean(). +get_is_active +( +   #btl_char{ current_health = H, is_defeated = D, is_active = A } +) -> +   ((not D) and (H > 0) and A); +get_is_active +( +   #btl_char_ref{ current_health = H, is_defeated = D, is_active = A } +) -> +   ((not D) and (H > 0) and A). +  -spec set_is_active     (boolean(), type()) -> type();     (boolean(), unresolved()) -> unresolved(). @@ -359,6 +334,13 @@ ataxia_set_is_active (Active, Char) ->        )     }. +%%%%%%%%%%%%%%%%%%%%% +%%%% Is Defeated %%%% +%%%%%%%%%%%%%%%%%%%%% +-spec get_is_defeated (either()) -> boolean(). +get_is_defeated (#btl_char{ is_defeated = R }) -> R; +get_is_defeated (#btl_char_ref{ is_defeated = R }) -> R. +  -spec set_is_defeated     (boolean(), type()) -> type();     (boolean(), unresolved()) -> unresolved(). @@ -380,6 +362,15 @@ ataxia_set_is_defeated (Defeated, Char) ->        )     }. +%%%%%%%%%%%%%%%%%%%%%%%% +%%%% Base Character %%%% +%%%%%%%%%%%%%%%%%%%%%%%% +-spec get_base_character +   (type()) -> shr_character:type(); +   (unresolved()) -> shr_character:unresolved(). +get_base_character (#btl_char{ base = R }) -> R; +get_base_character (#btl_char_ref{ base = R }) -> R. +  -spec set_base_character (shr_character:type(), type()) -> type().  set_base_character (NewBaseCharacter, Char) ->     CurrentBaseCharacter = Char#btl_char.base, @@ -456,6 +447,15 @@ ataxia_set_base_character (NewBaseCharacter, Char) ->        Char     ). +%%%%%%%%%%%%%%%%%%%% +%%%% Conditions %%%% +%%%%%%%%%%%%%%%%%%%% +-spec get_conditions +   (type()) -> btl_conditions:type(); +   (unresolved()) -> btl_conditions:type(). +get_conditions (#btl_char{ conditions = R }) -> R; +get_conditions (#btl_char_ref{ conditions = R }) -> R. +  -spec set_conditions     (btl_conditions:type(), type()) -> type();     (btl_conditions:type(), unresolved()) -> unresolved(). @@ -464,7 +464,6 @@ set_conditions (Conditions, Char) when is_record(Char, btl_char) ->  set_conditions (Conditions, Char) when is_record(Char, btl_char_ref) ->     Char#btl_char_ref{ conditions = Conditions }. -  -spec ataxia_set_conditions     (        btl_conditions:type(), @@ -498,37 +497,90 @@ ataxia_set_conditions (Conditions, Char) ->        Char     ). +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% Status Indicators %%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec get_status_indicators +   (type()) -> btl_status_indicators:type(); +   (unresolved()) -> btl_status_indicators:type(). +get_status_indicators (#btl_char{ status_indicators = R }) -> R; +get_status_indicators (#btl_char_ref{ status_indicators = R }) -> R. + +-spec set_status_indicators +   (btl_status_indicators:type(), type()) -> type(); +   (btl_status_indicators:type(), unresolved()) -> unresolved(). +set_status_indicators (StatusIndicators, Char) when is_record(Char, btl_char) -> +   Char#btl_char{ status_indicators = StatusIndicators }; +set_status_indicators (StatusIndicators, Char) when is_record(Char, btl_char_ref) -> +   Char#btl_char_ref{ status_indicators = StatusIndicators }. + +-spec ataxia_set_status_indicators +   ( +      btl_status_indicators:type(), +      ataxic:basic(), +      type() +   ) +   -> {type(), ataxic:basic()}; +   ( +      btl_status_indicators:type(), +      ataxic:basic(), +      unresolved() +   ) -> {unresolved(), ataxic:basic()}. +ataxia_set_status_indicators (StatusIndicators, Update, Char) -> +   { +      set_status_indicators(StatusIndicators, Char), +      ataxic:update_field +      ( +         get_status_indicators_field(), +         Update +      ) +   }. + +-spec ataxia_set_status_indicators +   (btl_status_indicators:type(), type()) -> {type(), ataxic:basic()}; +   ( +      btl_status_indicators:type(), +      unresolved() +   ) -> {unresolved(), ataxic:basic()}. +ataxia_set_status_indicators (StatusIndicators, Char) -> +   ataxia_set_status_indicators +   ( +      StatusIndicators, +      ataxic:constant(StatusIndicators), +      Char +   ). +  %%%% Utils  -spec new     (        non_neg_integer(), -      rank(),        shr_location:type(),        shr_character:type(), -      btl_conditions:type() +      btl_conditions:type(), +      btl_status_indicators:type()     )     -> type().  new  (     PlayerIX, -   Rank,     Location,     Base, -   Conditions +   Conditions, +   StatusIndicators  ) ->     Attributes = shr_character:get_attributes(Base),     #btl_char     {        player_ix = PlayerIX, -      rank = Rank,        location = Location,        current_health = shr_attributes:get_health(Attributes),        skill_points = 0,        is_active = (PlayerIX == 0),        is_defeated = false,        base = Base, -      conditions = Conditions +      conditions = Conditions, +      status_indicators = StatusIndicators     }.  -spec resolve (shr_omnimods:type(), either()) -> type(). @@ -536,14 +588,14 @@ resolve (LocalOmnimods, CharRef) when is_record(CharRef, btl_char_ref) ->     #btl_char     {        player_ix = CharRef#btl_char_ref.player_ix, -      rank = CharRef#btl_char_ref.rank,        location = CharRef#btl_char_ref.location,        current_health = CharRef#btl_char_ref.current_health,        skill_points = CharRef#btl_char_ref.skill_points,        is_active = CharRef#btl_char_ref.is_active,        is_defeated = CharRef#btl_char_ref.is_defeated,        base = shr_character:resolve(LocalOmnimods, CharRef#btl_char_ref.base), -      conditions = CharRef#btl_char_ref.conditions +      conditions = CharRef#btl_char_ref.conditions, +      status_indicators = CharRef#btl_char_ref.status_indicators     };  resolve (_LocalOmnimods, Char) when is_record(Char, btl_char) -> Char. @@ -552,22 +604,20 @@ to_unresolved (Char) when is_record(Char, btl_char) ->     #btl_char_ref     {        player_ix = Char#btl_char.player_ix, -      rank = Char#btl_char.rank,        location = Char#btl_char.location,        current_health = Char#btl_char.current_health,        skill_points = Char#btl_char.skill_points,        is_active = Char#btl_char.is_active,        is_defeated = Char#btl_char.is_defeated,        base = shr_character:to_unresolved(Char#btl_char.base), -      conditions = Char#btl_char.conditions +      conditions = Char#btl_char.conditions, +      status_indicators = Char#btl_char.status_indicators     };  to_unresolved (CharRef) when is_record(CharRef, btl_char_ref) -> CharRef.  -spec is_unresolved (either()) -> boolean().  is_unresolved (Char) -> is_record(Char, btl_char_ref). --spec get_rank_field() -> non_neg_integer(). -get_rank_field () -> #btl_char_ref.rank.  -spec get_location_field() -> non_neg_integer().  get_location_field () -> #btl_char_ref.location.  -spec get_current_health_field() -> non_neg_integer(). @@ -582,13 +632,14 @@ get_is_defeated_field () -> #btl_char_ref.is_defeated.  get_base_character_field () -> #btl_char_ref.base.  -spec get_conditions_field() -> non_neg_integer().  get_conditions_field () -> #btl_char_ref.conditions. +-spec get_status_indicators_field() -> non_neg_integer(). +get_status_indicators_field () -> #btl_char_ref.status_indicators.  -spec encode_for (non_neg_integer(), unresolved()) -> {list({binary(), any()})}.  encode_for (RequestingPlayerIX, CharRef) ->     {        [           {?PLAYER_IX_FIELD, CharRef#btl_char_ref.player_ix}, -         {?RANK_FIELD, CharRef#btl_char_ref.rank},           {?LOCATION_FIELD, shr_location:encode(CharRef#btl_char_ref.location)},           {?CURRENT_HEALTH_FIELD, CharRef#btl_char_ref.current_health},           {?SKILL_POINTS_FIELD, CharRef#btl_char_ref.skill_points}, @@ -596,11 +647,11 @@ encode_for (RequestingPlayerIX, CharRef) ->           {?IS_DEFEATED_FIELD, CharRef#btl_char_ref.is_defeated},           {?BASE_CHAR_FIELD, shr_character:encode(CharRef#btl_char_ref.base)},           { -            ?CONDITIONS_FIELD, -            btl_conditions:encode_for +            ?STATUS_INDICATORS, +            btl_status_indicators:encode_for              (                 RequestingPlayerIX, -               CharRef#btl_char_ref.conditions +               CharRef#btl_char_ref.status_indicators              )           }        ] | 


