summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornsensfel <SpamShield0@noot-noot.org>2019-04-24 19:11:58 +0200
committernsensfel <SpamShield0@noot-noot.org>2019-04-24 19:11:58 +0200
commite68004ee70c9102d00df2925c05d1354a6315bc0 (patch)
tree45d208c7b21144f7ae6a5b97288b147e8456f29f
parente39c44eabaea7bafa58aa85593b80a6c55f907a3 (diff)
...
-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.erl166
-rw-r--r--src/battle/struct/btl_character_current_data.erl113
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
- }.
-