| summaryrefslogtreecommitdiff | 
diff options
| -rw-r--r-- | src/battle/mechanic/btl_turn_progression.erl (renamed from src/battle/mechanic/btl_next_turn.erl) | 96 | ||||
| -rw-r--r-- | src/battle/struct/btl_action.erl (renamed from src/battle/struct/btl_battle_action.erl) | 11 | ||||
| -rw-r--r-- | src/battle/struct/btl_attack.erl | 166 | ||||
| -rw-r--r-- | src/battle/struct/btl_character_current_data.erl | 113 | 
4 files changed, 139 insertions, 247 deletions
| diff --git a/src/battle/mechanic/btl_next_turn.erl b/src/battle/mechanic/btl_turn_progression.erl index 886916d..c28719e 100644 --- a/src/battle/mechanic/btl_next_turn.erl +++ b/src/battle/mechanic/btl_turn_progression.erl @@ -1,4 +1,4 @@ --module(btl_next_turn). +-module(btl_turn_progression).  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -9,7 +9,7 @@  -export  (     [ -      update_if_needed/1 +      handle/1     ]  ). @@ -64,71 +64,60 @@ reset_next_player_timeline (Battle) ->     {UpdatedBattle, UpdatedNextPlayer, DBQuery}. --spec activate_next_players_characters (btl_battle:type(), btl_player:type()) +-spec activate_next_players_characters +   ( +      btl_battle:type(), +      btl_player:type() +   )     -> {btl_battle:type(), ataxic:basic()}.  activate_next_players_characters (Battle, NextPlayer) ->     NextPlayerIX = btl_player:get_index(NextPlayer), -   Characters = btl_battle:get_characters(Battle), +   AllCharacters = btl_battle:get_characters(Battle), -   {UpdatedCharacters, AtaxicUpdates} = +   {ResultingBattle, BattleAtaxicUpdates} =        orddict:fold        ( -         fun (IX, Character, {Prev, Updates}) -> +         fun (IX, Character, {CurrentBattle, CurrentBattleUpdates}) ->              case (btl_character:get_player_index(Character) == NextPlayerIX) of                 true -> -                  { -                     orddict:store +                  {UpdatedCharacter, CharacterAtaxicUpdate} = +                     btl_character:ataxia_set_is_active(true, Character), + +                  {UpdatedBattle, BattleAtaxicUpdate} = +                     btl_battle:ataxia_set_character                       (                          IX, -                        btl_character:set_is_active(true, Character), -                        Prev +                        UpdatedCharacter, +                        CharacterAtaxicUpdate                       ), -                     [ -                        ataxic_sugar:update_orddict_element -                        ( -                           IX, -                           ataxic:update_field -                           ( -                              btl_character:get_is_active_field(), -                              ataxic:constant(true) -                           ) -                        )|Updates -                     ] -                  }; - -               false -> {Prev, Updates} + +                  {UpdatedBattle, [BattleAtaxicUpdate|CurrentBattleUpdates]}; + +               false -> {CurrentBattle, CurrentBattleUpdates}              end           end, -         {Characters, []}, -         Characters -      ), - -   DBQuery = -      ataxic:update_field -      ( -         btl_battle:get_characters_field(), -         ataxic:sequence(AtaxicUpdates) +         {Battle, []}, +         AllCharacters        ), -   UpdatedBattle = btl_battle:set_characters(UpdatedCharacters, Battle), - -   {UpdatedBattle, DBQuery}. +   {ResultingBattle, ataxic:optimize(ataxic:sequence(BattleAtaxicUpdates))}. --spec update +-spec activate_next_player     (        btl_character_turn_update:type()     )     -> btl_character_turn_update:type(). -update (Update) -> +activate_next_player (Update) ->     Data = btl_character_turn_update:get_data(Update),     Battle = btl_character_turn_data:get_battle(Data), -   {S0Battle, DBQuery0} = set_player_turn_to_next(Battle), +   {S0Battle, DBQuery0} = prepare_player_turn_for_next_player(Battle),     {S1Battle, NextPlayer, DBQuery1} = reset_next_player_timeline(S0Battle),     {S2Battle, DBQuery2} =        activate_next_players_characters(S1Battle, NextPlayer),     S0Data = btl_character_turn_data:set_battle(S2Battle, Data), +     S0Update =        btl_character_turn_update:add_to_timeline        ( @@ -152,33 +141,32 @@ update (Update) ->     S2Update. --spec requires_update (btl_character_turn_update:type()) -> boolean(). -requires_update (Update) -> +-spec has_active_characters_remaining +   ( +      btl_character_turn_update:type() +   ) +   -> boolean(). +has_active_characters_remaining (Update) ->     Data = btl_character_turn_update:get_data(Update),     Battle = btl_character_turn_data:get_battle(Data),     Characters = btl_battle:get_characters(Battle), -   (not -      (lists:any -         ( -            fun ({_IX, Char}) -> -               btl_character:get_is_active(Char) -            end, -            orddict:to_list(Characters) -         ) -      ) +   lists:any +   ( +      fun ({_IX, Char}) -> btl_character:get_is_active(Char) end, +      orddict:to_list(Characters)     ).  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec update_if_needed +-spec handle     (        btl_character_turn_update:type()     )     -> btl_character_turn_update:type(). -update_if_needed (Update) -> -   case requires_update(Update) of -      true -> update(Update); +handle (Update) -> +   case has_active_characters_remaining(Update) of +      false -> activate_next_player(Update);        _ -> Update     end. diff --git a/src/battle/struct/btl_battle_action.erl b/src/battle/struct/btl_action.erl index 2c7564b..34dd46e 100644 --- a/src/battle/struct/btl_battle_action.erl +++ b/src/battle/struct/btl_action.erl @@ -1,4 +1,4 @@ --module(btl_battle_action). +-module(btl_action).  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -65,11 +65,11 @@ maybe_decode_move ([]) -> [];  maybe_decode_move (PathInBinary) ->     Path = lists:map(fun shr_direction:decode/1, PathInBinary), -   [#move { path = Path }]. +   [#move{ path = Path }].  -spec maybe_decode_attack (integer()) -> list(type()).  maybe_decode_attack (TargetIX) when (TargetIX < 0) -> []; -maybe_decode_attack (TargetIX) -> [#attack { target_ix = TargetIX }]. +maybe_decode_attack (TargetIX) -> [#attack{ target_ix = TargetIX }].  -spec maybe_decode_weapon_switch (boolean()) -> list(type()).  maybe_decode_weapon_switch (false) -> []; @@ -98,8 +98,5 @@ get_target_ix (_) ->  -spec get_category (type()) -> category().  get_category (Action) when is_record(Action, attack) -> attack;  get_category (Action) when is_record(Action, move) -> move; -get_category (Action) when is_record(Action, switch_weapon) -> switch_weapon; -get_category (Action) -> -   io:format("How'd you get there?~p~n", [Action]), -   true = Action. +get_category (Action) when is_record(Action, switch_weapon) -> switch_weapon. diff --git a/src/battle/struct/btl_attack.erl b/src/battle/struct/btl_attack.erl index f0778f5..481e07f 100644 --- a/src/battle/struct/btl_attack.erl +++ b/src/battle/struct/btl_attack.erl @@ -1,5 +1,7 @@  -module(btl_attack). +% FIXME: this module is mostly mechanics, not structure. +  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -112,28 +114,40 @@ roll_parry (DefenderStatistics, DefenderLuck) ->        shr_omnimods:type()     )     -> non_neg_integer(). -get_damage (Precision, IsCritical, AtkModifier, ActualAtkOmni, ActualDefOmni) -> -   S0DamageMultiplier = -      case Precision of -         misses -> 0; -         grazes -> 0.5; -         hits -> 1 -      end, - -   S1DamageMultiplier = -      case IsCritical of -         true -> (S0DamageMultiplier * 2); -         _ -> S0DamageMultiplier -      end, - -   S2DamageMultiplier = (S1DamageMultiplier * AtkModifier), +get_damage +( +   Precision, +   IsCritical, +   StartingDamageMultiplier, +   AttackerOmnimods, +   DefenderOmnimods +) -> +   ActualDamageMultiplier = +      ( +         StartingDamageMultiplier +         * +         ( +            case Precision of +               misses -> 0; +               grazes -> 0.5; +               hits -> 1 +            end +         ) +         * +         ( +            case IsCritical of +               true -> 2; +               _ -> 1 +            end +         ) +      ),     ActualDamage =        shr_omnimods:get_attack_damage        ( -         S2DamageMultiplier, -         ActualAtkOmni, -         ActualDefOmni +         ActualDamageMultiplier, +         AttackerOmnimods, +         DefenderOmnimods        ),     ActualDamage. @@ -141,8 +155,8 @@ get_damage (Precision, IsCritical, AtkModifier, ActualAtkOmni, ActualDefOmni) ->  -spec effect_of_attack     (        order(), -      btl_character_current_data:type(), -      btl_character_current_data:type(), +      shr_character:type(), +      shr_character:type(),        boolean(),        integer(),        integer() @@ -151,57 +165,63 @@ get_damage (Precision, IsCritical, AtkModifier, ActualAtkOmni, ActualDefOmni) ->  effect_of_attack  (     Order, -   AtkCurrData, -   DefCurrData, +   Attacker, +   Defender,     CanParry,     AttackerLuck,     DefenderLuck  ) -> -   DefStats = btl_character_current_data:get_statistics(DefCurrData), +   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +   %%%% Roll parry to see if the roles have to be swapped. %%%%%%%%%%%%%%%%%%%%% +   DefenderStats = shr_character:get_statistics(Defender),     {ParryIsSuccessful, ParryPositiveLuckMod, ParryNegativeLuckMod} =        case CanParry of -         true -> roll_parry(DefStats, DefenderLuck); +         true -> roll_parry(DefenderStats, DefenderLuck);           false -> {false, 0, 0}        end,     { -      ActualAtkData, -      ActualDefData, -      ActualAtkLuck, -      ActualDefLuck +      ActualAttacker, +      ActualDefender, +      ActualAttackerLuck, +      ActualDefenderLuck     } =        case ParryIsSuccessful of -         true -> {DefCurrData, AtkCurrData, DefenderLuck, AttackerLuck}; -         false -> {AtkCurrData, DefCurrData, AttackerLuck, DefenderLuck} +         true -> {Defender, Attacker, DefenderLuck, AttackerLuck}; +         false -> {Attacker, Defender, AttackerLuck, DefenderLuck}        end, -   ActualAtkStats = btl_character_current_data:get_statistics(ActualAtkData), -   ActualAtkOmni = btl_character_current_data:get_omnimods(ActualAtkData), -   ActualDefStats = btl_character_current_data:get_statistics(ActualDefData), -   ActualDefOmni = btl_character_current_data:get_omnimods(ActualDefData), +   ActualAttackerStats = shr_character:get_statistics(ActualAttacker), +   ActualAttackerOmnimods = shr_character:get_omnimods(ActualAttacker), +   ActualDefenderStats = shr_character:get_statistics(ActualDefender), +   ActualDefenderOmnimods = shr_character:get_omnimods(ActualDefender), + +   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     {Precision, PrecisionPositiveLuckMod, PrecisionNegativeLuckMod} =        roll_precision        ( -         ActualAtkStats, -         ActualDefStats, -         ActualDefLuck +         ActualAttackerStats, +         ActualDefenderStats, +         ActualDefenderLuck        ),     {IsCritical, CriticalPositiveLuckMod, CriticalNegativeLuckMod} = -      roll_critical_hit(ActualAtkStats, ActualAtkLuck), +      roll_critical_hit(ActualAttackerStats, ActualAttackerLuck), + +   ActualAttackerDamageModifier = +      shr_statistics:get_damage_modifier(ActualAttackerStats), -   AtkDamageModifier = shr_statistics:get_damage_modifier(ActualAtkStats),     Damage =        get_damage        (           Precision,           IsCritical, -         AtkDamageModifier, -         ActualAtkOmni, -         ActualDefOmni +         ActualAttackerDamageModifier, +         ActualAttackerOmnimods, +         ActualDefenderOmnimods        ),     {FinalAttackerLuckMod, FinalDefenderLuckMod} = @@ -311,8 +331,8 @@ encode_precision (misses) -> <<"m">>.  -spec get_description_of     (        step(), -      btl_character_current_data:type(), -      btl_character_current_data:type(), +      shr_character:type(), +      shr_character:type(),        integer(),        integer()     ) @@ -320,36 +340,36 @@ encode_precision (misses) -> <<"m">>.  get_description_of  (     {first, CanParry}, -   AtkCurrData, -   DefCurrData, -   AtkLuck, -   DefLuck +   Attacker, +   Defender, +   AttackerLuck, +   DefenderLuck  ) ->     effect_of_attack     (        first, -      AtkCurrData, -      DefCurrData, +      Attacker, +      Defender,        CanParry, -      AtkLuck, -      DefLuck +      AttackerLuck, +      DefenderLuck     );  get_description_of  (     {second, CanParry}, -   AtkCurrData, -   DefCurrData, -   AtkLuck, -   DefLuck +   Attacker, +   Defender, +   AttackerLuck, +   DefenderLuck  ) -> -   AtkStats = btl_character_current_data:get_statistics(AtkCurrData), +   AttackerStats = shr_character:get_statistics(Attacker),     AttackerDoubleAttackChance = -      shr_statistics:get_double_hits(AtkStats), +      shr_statistics:get_double_hits(AttackerStats),     {_Roll, IsSuccessful, PositiveModifier, NegativeModifier} = -      shr_roll:percentage_with_luck(AttackerDoubleAttackChance, AtkLuck), +      shr_roll:percentage_with_luck(AttackerDoubleAttackChance, AttackerLuck), -   NewAtkLuck = (AtkLuck + PositiveModifier), -   NewDefLuck = (DefLuck + NegativeModifier), +   NewAttackerLuck = (AttackerLuck + PositiveModifier), +   NewDefenderLuck = (DefenderLuck + NegativeModifier),     case IsSuccessful of        true -> @@ -357,11 +377,11 @@ get_description_of              effect_of_attack              (                 second, -               AtkCurrData, -               DefCurrData, +               Attacker, +               Defender,                 CanParry, -               NewAtkLuck, -               NewDefLuck +               NewAttackerLuck, +               NewDefenderLuck              ),           Result#attack @@ -377,19 +397,19 @@ get_description_of  get_description_of  (     {counter, CanParry}, -   AtkCurrData, -   DefCurrData, -   AtkLuck, -   DefLuck +   Attacker, +   Defender, +   AttackerLuck, +   DefenderLuck  ) ->     effect_of_attack     (        counter, -      DefCurrData, -      AtkCurrData, +      Defender, +      Attacker,        CanParry, -      DefLuck, -      AtkLuck +      DefenderLuck, +      AttackerLuck     ).  -spec apply_to_healths_and_lucks diff --git a/src/battle/struct/btl_character_current_data.erl b/src/battle/struct/btl_character_current_data.erl deleted file mode 100644 index 3f25345..0000000 --- a/src/battle/struct/btl_character_current_data.erl +++ /dev/null @@ -1,113 +0,0 @@ --module(btl_character_current_data). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --record -( -   character_current_data, -   { -      attributes :: shr_attributes:type(), -      statistics :: shr_statistics:type(), -      omnimods :: shr_omnimods:type() -   } -). - --opaque type() :: #character_current_data{}. - --export_type([type/0]). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%% Accessors --export -( -   [ -      get_attributes/1, -      get_statistics/1, -      get_omnimods/1 -   ] -). - --export -( -   [ -      new/2 -   ] -). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec location_to_omnimods -   ( -      {non_neg_integer(), non_neg_integer()}, -      shr_map:type() -   ) -   -> shr_omnimods:type(). -location_to_omnimods (Location, Map) -> -   TileInstance = shr_map:get_tile_instance(Location, Map), -   TileClassID = shr_tile_instance:get_tile_id(TileInstance), -   Tile = shr_tile:from_id(TileClassID), - -   shr_tile:get_omnimods(Tile). - --spec weapon_id_to_omnimods (shr_weapon:id()) -> shr_omnimods:type(). -weapon_id_to_omnimods (WeaponID) -> -   Weapon = shr_weapon:from_id(WeaponID), - -   shr_weapon:get_omnimods(Weapon). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%% Accessors --spec get_omnimods (type()) -> shr_omnimods:type(). -get_omnimods (Char) -> Char#character_current_data.omnimods. - --spec get_attributes (type()) -> shr_attributes:type(). -get_attributes (Char) -> Char#character_current_data.attributes. - --spec get_statistics (type()) -> shr_statistics:type(). -get_statistics (Char) -> Char#character_current_data.statistics. - -%%%% Utils --spec new (btl_character:type(), shr_map:type()) -> type(). -new (Character, Map) -> -   PermanentOmnimods = btl_character:get_permanent_omnimods(Character), - -   {WeaponID, _} = btl_character:get_weapon_ids(Character), -   WeaponOmnimods = weapon_id_to_omnimods(WeaponID), - -   Location = btl_character:get_location(Character), -   TileOmnimods = location_to_omnimods(Location, Map), - -   CurrentOmnimods = -      shr_omnimods:merge -      ( -         shr_omnimods:merge(WeaponOmnimods, TileOmnimods), -         PermanentOmnimods -      ), - -   CurrentAttributes = -      shr_omnimods:apply_to_attributes -      ( -         CurrentOmnimods, -         shr_attributes:default() -      ), - -   CurrentStatistics = -      shr_omnimods:apply_to_statistics -      ( -         CurrentOmnimods, -         shr_statistics:new_raw(CurrentAttributes) -      ), - -   #character_current_data -   { -      attributes = CurrentAttributes, -      statistics = CurrentStatistics, -      omnimods = CurrentOmnimods -   }. - | 


