summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornsensfel <SpamShield0@noot-noot.org>2019-06-06 16:36:13 +0200
committernsensfel <SpamShield0@noot-noot.org>2019-06-06 16:36:13 +0200
commitc3afe2633025641dd02e05d6c55dd9cafc42b8a2 (patch)
tree3f3865aada81ffa88f5c559ca3da1fcf3dd7c254 /src/battle
parentd6d0920325e77bf39da69006f8e86c2f900ca86b (diff)
It compiles and mostly passes Dialyzer's tests.
Diffstat (limited to 'src/battle')
-rw-r--r--src/battle/mechanic/action/btl_action_attack.erl14
-rw-r--r--src/battle/mechanic/action/btl_action_switch_weapon.erl2
-rw-r--r--src/battle/mechanic/action/btl_turn_actions_opportunity_attack.erl178
-rw-r--r--src/battle/mechanic/btl_actions_management.erl (renamed from src/battle/mechanic/btl_turn_actions_management.erl)96
-rw-r--r--src/battle/mechanic/btl_turn_progression.erl26
-rw-r--r--src/battle/mechanic/btl_victory_progression.erl17
-rw-r--r--src/battle/query/btl_character_turn.erl93
-rw-r--r--src/battle/struct/btl_battle.erl2
-rw-r--r--src/battle/struct/btl_character_turn_update.erl142
9 files changed, 137 insertions, 433 deletions
diff --git a/src/battle/mechanic/action/btl_action_attack.erl b/src/battle/mechanic/action/btl_action_attack.erl
index 5989ad8..1953096 100644
--- a/src/battle/mechanic/action/btl_action_attack.erl
+++ b/src/battle/mechanic/action/btl_action_attack.erl
@@ -1,4 +1,4 @@
--module(btl_turn_actions_attack).
+-module(btl_action_attack).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -46,7 +46,7 @@ roll_precision_modifier (Statistics, TargetStatistics, TargetLuck) ->
shr_statistics:type(),
integer()
)
- -> {boolean(), integer(), integer()}.
+ -> {float(), integer(), integer()}.
roll_critical_modifier (Statistics, Luck) ->
CriticalHitChance = shr_statistics:get_critical_hits(Statistics),
{_Roll, IsSuccess, PositiveModifier, NegativeModifier} =
@@ -328,8 +328,8 @@ effect_of_attack
Category,
PrecisionModifier,
CriticalModifier,
- S1AttackerLuck,
- S1DefenderLuck
+ ParryIsSuccessful,
+ Damage
),
% If we "ataxia update" here, we'll get redundant ataxia updates, since
@@ -511,7 +511,11 @@ handle_attack_sequence
)
of
true ->
- Statistics = shr_character:get_statistics(S0Character),
+ Statistics =
+ shr_character:get_statistics
+ (
+ btl_character:get_base_character(S0Character)
+ ),
DoubleAttackChance = shr_statistics:get_double_hits(Statistics),
{_Roll, IsSuccessful, PositiveModifier, NegativeModifier} =
shr_roll:percentage_with_luck(DoubleAttackChance, S0PlayerLuck),
diff --git a/src/battle/mechanic/action/btl_action_switch_weapon.erl b/src/battle/mechanic/action/btl_action_switch_weapon.erl
index cf1a31a..7d8a81b 100644
--- a/src/battle/mechanic/action/btl_action_switch_weapon.erl
+++ b/src/battle/mechanic/action/btl_action_switch_weapon.erl
@@ -1,4 +1,4 @@
--module(btl_turn_actions_switch_weapon).
+-module(btl_action_switch_weapon).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/src/battle/mechanic/action/btl_turn_actions_opportunity_attack.erl b/src/battle/mechanic/action/btl_turn_actions_opportunity_attack.erl
deleted file mode 100644
index c1dbbdd..0000000
--- a/src/battle/mechanic/action/btl_turn_actions_opportunity_attack.erl
+++ /dev/null
@@ -1,178 +0,0 @@
--module(btl_turn_actions_opportunity_attack).
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--export
-(
- [
- handle/2
- ]
-).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec handle
- (
- btl_action:type(),
- btl_character_turn_update:type()
- )
- -> {ok, btl_character_turn_update:type()}.
-handle (BattleAction, Update) ->
- {S0Update, Battle} = btl_character_turn_update:get_battle(Update),
- {S1Update, Character} = btl_character_turn_update:get_character(S0Update),
-
- DefendingPlayerIX = btl_character:get_player_index(Character),
- DefendingPlayer = btl_battle:get_player(DefendingPlayerIX, Battle),
- DefendingPlayerLuck = btl_player:get_luck(DefendingPlayer),
-
- AttackerIX = btl_action:get_target_ix(BattleAction),
- AttackerRef = btl_battle:get_character(AttackerIX, Battle),
- Attacker = btl_battle:resolve_character(AttackerRef, Battle),
-
- AttackingPlayerIX = btl_character:get_player_index(Attacker),
- AttackingPlayer = btl_battle:get_player(AttackingPlayerIX, Battle),
- AttackingPlayerLuck = btl_player:get_luck(AttackingPlayer),
-
- Attack = btl_attack:attack_of_opportunity(),
-
- AttackEffect =
- btl_attack:get_description_of
- (
- Attack,
- btl_character:get_base_character(Character),
- btl_character:get_base_character(Attacker),
- AttackingPlayerLuck,
- DefendingPlayerLuck
- ),
-
- {
- AttackResult,
- NewAttackerHealth,
- S0NewAttackerLuck,
- NewDefenderHealth,
- S0NewDefenderLuck
- } =
- btl_attack:apply_to_healths_and_lucks
- (
- AttackEffect,
- btl_character:get_current_health(Attacker),
- AttackingPlayerLuck,
- btl_character:get_current_health(Character),
- DefendingPlayerLuck
- ),
-
- S1NewAttackerLuck =
- case {(S0NewAttackerLuck =< -2), (S0NewAttackerLuck >= 2)} of
- {true, _} -> (S0NewAttackerLuck + 2);
- {_, true} -> (S0NewAttackerLuck - 2);
- _ -> 0
- end,
-
- S1NewDefenderLuck =
- case {(S0NewDefenderLuck =< -2), (S0NewDefenderLuck >= 2)} of
- {true, _} -> (S0NewDefenderLuck + 2);
- {_, true} -> (S0NewDefenderLuck - 2);
- _ -> 0
- end,
-
- {UpdatedAttackingPlayer, AttackingPlayerAtaxiaUpdate} =
- btl_player:ataxia_set_luck(S1NewAttackerLuck, AttackingPlayer),
-
- {UpdatedDefendingPlayer, DefendingPlayerAtaxiaUpdate} =
- btl_player:ataxia_set_luck(S1NewDefenderLuck, DefendingPlayer),
-
- {UpdatedCharacter, CharacterAtaxiaUpdate} =
- btl_character:ataxia_set_current_health(NewDefenderHealth, Character),
-
- {UpdatedAttackerRef, AttackerRefAtaxiaUpdate} =
- btl_character:ataxia_set_current_health(NewAttackerHealth, AttackerRef),
-
- {S0Battle, BattleAtaxiaUpdate0} =
- btl_battle:ataxia_set_player
- (
- AttackingPlayerIX,
- UpdatedAttackingPlayer,
- AttackingPlayerAtaxiaUpdate,
- Battle
- ),
-
- {S1Battle, BattleAtaxiaUpdate1} =
- btl_battle:ataxia_set_player
- (
- DefendingPlayerIX,
- UpdatedDefendingPlayer,
- DefendingPlayerAtaxiaUpdate,
- S0Battle
- ),
-
- {S2Battle, BattleAtaxiaUpdate2} =
- btl_battle:ataxia_set_character
- (
- AttackerIX,
- UpdatedAttackerRef,
- AttackerRefAtaxiaUpdate,
- S1Battle
- ),
-
- % Potential danger ahead: we're going to update both the 'character' and
- % 'battle' members of a btl_character_turn_update.
- % 'S1Update' is sure to have both up to date (as it's the result of 'get'
- % requests for both) and there is no risk of the 'battle' update influencing
- % 'character', making what follows safe.
-
- S2Update =
- btl_character_turn_update:ataxia_set_battle
- (
- S2Battle,
- false,
- ataxic:optimize
- (
- ataxic:sequence
- (
- [
- BattleAtaxiaUpdate0,
- BattleAtaxiaUpdate1,
- BattleAtaxiaUpdate2
- ]
- )
- ),
- S1Update
- ),
-
- S3Update =
- btl_character_turn_update:ataxia_set_character
- (
- UpdatedCharacter,
- CharacterAtaxiaUpdate,
- S2Update
- ),
-
- TimelineItem =
- btl_turn_result:new_character_attacked
- (
- AttackerIX,
- btl_character_turn_update:get_character_ix(S3Update),
- AttackResult,
- S0NewAttackerLuck,
- S0NewDefenderLuck
- ),
-
- S4Update = btl_character_turn_update:add_to_timeline(TimelineItem, S3Update),
-
- S5Update =
- case (NewDefenderHealth > 0) of
- true -> S4Update;
- false ->
- btl_victory_progression:handle_character_loss(Character, S4Update)
- end,
-
- {ok, S5Update}.
diff --git a/src/battle/mechanic/btl_turn_actions_management.erl b/src/battle/mechanic/btl_actions_management.erl
index 7ee173a..050ab4e 100644
--- a/src/battle/mechanic/btl_turn_actions_management.erl
+++ b/src/battle/mechanic/btl_actions_management.erl
@@ -1,4 +1,4 @@
--module(btl_turn_actions_management).
+-module(btl_actions_management).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -16,27 +16,6 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec deactivate_character
- (
- btl_character_turn_update:type()
- )
- -> btl_character_turn_update:type().
-deactivate_character (Update) ->
- {S0Update, Character} = btl_character_turn_update:get_character(Update),
-
- {UpdatedCharacter, CharacterAtaxiaUpdate} =
- btl_character:ataxia_set_is_active(false, Character),
-
- S1Update =
- btl_character_turn_update:ataxia_set_character
- (
- UpdatedCharacter,
- CharacterAtaxiaUpdate,
- S0Update
- ),
-
- S1Update.
-
-spec perform_action
(
btl_action:type(),
@@ -56,16 +35,19 @@ perform_action (Action, Character, Update) ->
btl_action_switch_weapon:handle(Action, Character, Update)
end.
--spec handle_actions
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec handle
(
list(btl_action:type()),
btl_character_turn_update:type()
)
-> btl_character_turn_update:type().
-handle_actions ([], Update) -> Update;
-handle_actions ([BattleAction|FutureBattleActions], S0Update) ->
+handle ([], Update) -> Update;
+handle ([BattleAction|FutureBattleActions], S0Update) ->
case btl_action:get_actor_index(BattleAction) of
- -1 -> handle_actions(FutureBattleActions, S0Update);
+ -1 -> handle(FutureBattleActions, S0Update);
CharacterIX ->
S0Battle = btl_character_turn_update:get_battle(S0Update),
{Character, S1Battle} =
@@ -73,14 +55,14 @@ handle_actions ([BattleAction|FutureBattleActions], S0Update) ->
S1Update = btl_character_turn_update:set_battle(S1Battle, S0Update),
- case btl_character:is_alive(Character) of
- false -> handle_actions(FutureBattleActions, S1Update);
+ case btl_character:get_is_alive(Character) of
+ false -> handle(FutureBattleActions, S1Update);
true ->
case perform_action(BattleAction, Character, S1Update) of
{ok, S2Update} ->
- handle_actions(FutureBattleActions, S2Update);
+ handle(FutureBattleActions, S2Update);
{events, NewEvents, S2Update} ->
- handle_actions
+ handle
(
(NewEvents ++ FutureBattleActions),
S2Update
@@ -89,57 +71,3 @@ handle_actions ([BattleAction|FutureBattleActions], S0Update) ->
end
end.
--spec update_timeline
- (
- btl_character_turn_update:type()
- )
- -> btl_character_turn_update:type().
-update_timeline (Update) ->
- NewTimelineElements = btl_character_turn_update:get_timeline(Update),
- {S0Update, Battle} = btl_character_turn_update:get_battle(Update),
- PlayerTurn = btl_battle:get_current_player_turn(Battle),
- PlayerIX = btl_player_turn:get_player_ix(PlayerTurn),
- Player = btl_battle:get_player(PlayerIX, Battle),
-
- {UpdatedPlayer, PlayerAtaxiaUpdate} =
- btl_player:ataxia_add_to_timeline(NewTimelineElements, Player),
-
- {UpdatedBattle, BattleAtaxiaUpdate} =
- btl_battle:ataxia_set_player
- (
- PlayerIX,
- UpdatedPlayer,
- PlayerAtaxiaUpdate,
- Battle
- ),
-
- S1Update =
- btl_character_turn_update:ataxia_set_battle
- (
- UpdatedBattle,
- false,
- BattleAtaxiaUpdate,
- S0Update
- ),
-
- S1Update.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec handle
- (
- btl_character_turn_update:type(),
- btl_character_turn_request:type()
- )
- -> btl_character_turn_update:type().
-handle (Update, Request) ->
- Actions = btl_character_turn_request:get_actions(Request),
-
- S0Update = handle_actions(Actions, Update),
- S1Update = deactivate_character(S0Update),
- S2Update = update_timeline(S1Update),
- S3Update = btl_turn_progression:handle(S2Update),
-
- S3Update.
diff --git a/src/battle/mechanic/btl_turn_progression.erl b/src/battle/mechanic/btl_turn_progression.erl
index ed181c5..5b8d9c8 100644
--- a/src/battle/mechanic/btl_turn_progression.erl
+++ b/src/battle/mechanic/btl_turn_progression.erl
@@ -108,8 +108,8 @@ activate_next_players_characters (NextPlayerIX, Battle) ->
btl_character_turn_update:type()
)
-> btl_character_turn_update:type().
-activate_next_player (Update) ->
- {S0Update, Battle} = btl_character_turn_update:get_battle(Update),
+activate_next_player (S0Update) ->
+ Battle = btl_character_turn_update:get_battle(S0Update),
{NextPlayerIX, S0Battle, BattleAtaxiaUpdate0} =
prepare_player_turn_for_next_player(Battle),
@@ -124,7 +124,6 @@ activate_next_player (Update) ->
btl_character_turn_update:ataxia_set_battle
(
S2Battle,
- true,
ataxic:sequence
(
[
@@ -149,19 +148,16 @@ activate_next_player (Update) ->
(
btl_character_turn_update:type()
)
- -> {boolean(), btl_character_turn_update:type()}.
+ -> boolean().
has_active_characters_remaining (Update) ->
- {S0Update, Battle} = btl_character_turn_update:get_battle(Update),
+ Battle = btl_character_turn_update:get_battle(Update),
Characters = btl_battle:get_characters(Battle),
- {
- lists:any
- (
- fun ({_IX, Char}) -> btl_character:get_is_active(Char) end,
- orddict:to_list(Characters)
- ),
- S0Update
- }.
+ lists:any
+ (
+ fun ({_IX, Char}) -> btl_character:get_is_active(Char) end,
+ orddict:to_list(Characters)
+ ).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -173,6 +169,6 @@ has_active_characters_remaining (Update) ->
-> btl_character_turn_update:type().
handle (Update) ->
case has_active_characters_remaining(Update) of
- {false, S0Update} -> activate_next_player(S0Update);
- {true, S0Update} -> S0Update
+ false -> activate_next_player(Update);
+ true -> Update
end.
diff --git a/src/battle/mechanic/btl_victory_progression.erl b/src/battle/mechanic/btl_victory_progression.erl
index ab8a351..667d010 100644
--- a/src/battle/mechanic/btl_victory_progression.erl
+++ b/src/battle/mechanic/btl_victory_progression.erl
@@ -89,8 +89,8 @@ mark_player_as_inactive (PlayerIX, Battle) ->
btl_character_turn_update:type()
)
-> btl_character_turn_update:type().
-handle_player_defeat (PlayerIX, Update) ->
- {S0Update, Battle} = btl_character_turn_update:get_battle(Update),
+handle_player_defeat (PlayerIX, S0Update) ->
+ Battle = btl_character_turn_update:get_battle(S0Update),
{S0Battle, BattleAtaxicUpdate0} =
mark_characters_of_player_as_defeated(PlayerIX, Battle),
@@ -101,7 +101,6 @@ handle_player_defeat (PlayerIX, Update) ->
btl_character_turn_update:ataxia_set_battle
(
S1Battle,
- true,
ataxic:sequence([BattleAtaxicUpdate0, BattleAtaxicUpdate1]),
S0Update
),
@@ -126,7 +125,7 @@ handle_player_defeat (PlayerIX, Update) ->
)
-> btl_character_turn_update:type().
handle_character_loss (Character, Update) ->
- {S0Update, Battle} = btl_character_turn_update:get_battle(Update),
+ Battle = btl_character_turn_update:get_battle(Update),
Characters = btl_battle:get_characters(Battle),
CharacterPlayerIX = btl_character:get_player_index(Character),
@@ -149,11 +148,11 @@ handle_character_loss (Character, Update) ->
),
case StillHasAliveChar of
- true -> S0Update;
- _ -> handle_player_defeat(CharacterPlayerIX, S0Update)
+ true -> Update;
+ _ -> handle_player_defeat(CharacterPlayerIX, Update)
end;
- commander -> handle_player_defeat(CharacterPlayerIX, S0Update);
+ commander -> handle_player_defeat(CharacterPlayerIX, Update);
target ->
StillHasAliveTargetChar =
@@ -170,7 +169,7 @@ handle_character_loss (Character, Update) ->
),
case StillHasAliveTargetChar of
- true -> S0Update;
- _ -> handle_player_defeat(CharacterPlayerIX, S0Update)
+ true -> Update;
+ _ -> handle_player_defeat(CharacterPlayerIX, Update)
end
end.
diff --git a/src/battle/query/btl_character_turn.erl b/src/battle/query/btl_character_turn.erl
index 2048391..1176355 100644
--- a/src/battle/query/btl_character_turn.erl
+++ b/src/battle/query/btl_character_turn.erl
@@ -60,7 +60,7 @@ fetch_data (Request) ->
) -> 'ok'.
assert_user_is_current_player (Update, Request) ->
PlayerID = btl_character_turn_request:get_player_id(Request),
- {_SameUpdate, Battle} = btl_character_turn_update:get_battle(Update),
+ Battle = btl_character_turn_update:get_battle(Update),
CurrentPlayerTurn = btl_battle:get_current_player_turn(Battle),
CurrentPlayerIX = btl_player_turn:get_player_ix(CurrentPlayerTurn),
CurrentPlayer = btl_battle:get_player(CurrentPlayerIX, Battle),
@@ -76,8 +76,9 @@ assert_user_is_current_player (Update, Request) ->
) -> 'ok'.
assert_user_owns_played_character (Update, Request) ->
PlayerID = btl_character_turn_request:get_player_id(Request),
- {_SameUpdateA, Battle} = btl_character_turn_update:get_battle(Update),
- {_SameUpdateB, Character} = btl_character_turn_update:get_character(Update),
+ Battle = btl_character_turn_update:get_battle(Update),
+ CharacterIX = btl_character_turn_update:get_character_ix(Update),
+ Character = btl_battle:get_character(CharacterIX, Battle),
CharacterPlayerIX = btl_character:get_player_index(Character),
CharacterPlayer = btl_battle:get_player(CharacterPlayerIX, Battle),
CharacterPlayerID = btl_player:get_id(CharacterPlayer),
@@ -88,7 +89,9 @@ assert_user_owns_played_character (Update, Request) ->
-spec assert_character_can_be_played (btl_character_turn_update:type()) -> 'ok'.
assert_character_can_be_played (Update) ->
- {_SameUpdate, Character} = btl_character_turn_update:get_character(Update),
+ Battle = btl_character_turn_update:get_battle(Update),
+ CharacterIX = btl_character_turn_update:get_character_ix(Update),
+ Character = btl_battle:get_character(CharacterIX, Battle),
true = btl_character:get_is_active(Character),
@@ -138,7 +141,7 @@ send_to_database (Update, Request) ->
send_to_cache (Update, Request) ->
PlayerID = btl_character_turn_request:get_player_id(Request),
BattleID = btl_character_turn_request:get_battle_id(Request),
- {_SameUpdate, Battle} = btl_character_turn_update:get_battle(Update),
+ Battle = btl_character_turn_update:get_battle(Update),
shr_timed_cache:update
(
@@ -172,6 +175,72 @@ generate_reply (Update) ->
jiffy:encode([TurnResultReply]).
%%%% MAIN LOGIC %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec deactivate_character
+ (
+ btl_character_turn_update:type()
+ )
+ -> btl_character_turn_update:type().
+deactivate_character (S0Update) ->
+ Battle = btl_character_turn_update:get_battle(S0Update),
+ CharacterIX = btl_character_turn_update:get_character_ix(S0Update),
+ Character = btl_battle:get_character(CharacterIX, Battle),
+
+ {UpdatedCharacter, CharacterAtaxiaUpdate} =
+ btl_character:ataxia_set_is_active(false, Character),
+
+ {UpdatedBattle, BattleAtaxiaUpdate} =
+ btl_battle:ataxia_set_character
+ (
+ CharacterIX,
+ UpdatedCharacter,
+ CharacterAtaxiaUpdate,
+ Battle
+ ),
+
+ S1Update =
+ btl_character_turn_update:ataxia_set_battle
+ (
+ UpdatedBattle,
+ BattleAtaxiaUpdate,
+ S0Update
+ ),
+
+ S1Update.
+
+-spec update_timeline
+ (
+ btl_character_turn_update:type()
+ )
+ -> btl_character_turn_update:type().
+update_timeline (S0Update) ->
+ NewTimelineElements = btl_character_turn_update:get_timeline(S0Update),
+ Battle = btl_character_turn_update:get_battle(S0Update),
+ PlayerTurn = btl_battle:get_current_player_turn(Battle),
+ PlayerIX = btl_player_turn:get_player_ix(PlayerTurn),
+ Player = btl_battle:get_player(PlayerIX, Battle),
+
+ {UpdatedPlayer, PlayerAtaxiaUpdate} =
+ btl_player:ataxia_add_to_timeline(NewTimelineElements, Player),
+
+ {UpdatedBattle, BattleAtaxiaUpdate} =
+ btl_battle:ataxia_set_player
+ (
+ PlayerIX,
+ UpdatedPlayer,
+ PlayerAtaxiaUpdate,
+ Battle
+ ),
+
+ S1Update =
+ btl_character_turn_update:ataxia_set_battle
+ (
+ UpdatedBattle,
+ BattleAtaxiaUpdate,
+ S0Update
+ ),
+
+ S1Update.
+
-spec handle (shr_query:type()) -> binary().
handle (Query) ->
Request = decode_request(Query),
@@ -183,12 +252,20 @@ handle (Query) ->
S0Update = fetch_data(Request),
assert_user_permissions(S0Update, Request),
- S1Update = btl_turn_actions_management:handle(S0Update, Request),
- commit_update(S1Update, Request),
+ S1Update = btl_actions_management:handle
+ (
+ btl_character_turn_request:get_actions(Request),
+ S0Update
+ ),
+ S2Update = deactivate_character(S1Update),
+ S3Update = update_timeline(S2Update),
+ S4Update = btl_turn_progression:handle(S3Update),
+
+ commit_update(S4Update, Request),
shr_security:unlock_queries(PlayerID),
- generate_reply(S1Update);
+ generate_reply(S4Update);
error -> jiffy:encode([shr_disconnected:generate()])
end.
diff --git a/src/battle/struct/btl_battle.erl b/src/battle/struct/btl_battle.erl
index 435a99b..27f9698 100644
--- a/src/battle/struct/btl_battle.erl
+++ b/src/battle/struct/btl_battle.erl
@@ -153,7 +153,7 @@ get_resolved_character (IX, Battle) ->
Battle#battle
{
characters =
- orddict:set(IX, ResolvedCharacter, Battle#battle.characters)
+ orddict:store(IX, ResolvedCharacter, Battle#battle.characters)
}
};
diff --git a/src/battle/struct/btl_character_turn_update.erl b/src/battle/struct/btl_character_turn_update.erl
index f5f2d05..304f19d 100644
--- a/src/battle/struct/btl_character_turn_update.erl
+++ b/src/battle/struct/btl_character_turn_update.erl
@@ -32,10 +32,8 @@
get_battle_update/1,
get_timeline/1,
- set_battle/3,
-
- ataxia_set_battle/4,
- ataxia_set_character/3,
+ set_battle/2,
+ ataxia_set_battle/3,
add_to_timeline/2
]
@@ -44,24 +42,6 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec resolve_character_at
- (
- non_neg_integer(),
- btl_battle:type()
- ) -> btl_character:type().
-resolve_character_at (CharacterIX, Battle) ->
- CharacterRef = btl_battle:get_character(CharacterIX, Battle),
- Location = btl_character:get_location(CharacterRef),
- Map = btl_battle:get_map(Battle),
-
- TileInstance = shr_map:get_tile_instance(Location, Map),
- TileClassID = shr_tile_instance:get_tile_id(TileInstance),
- Tile = shr_tile:from_id(TileClassID),
- TileOmnimods = shr_tile:get_omnimods(Tile),
-
- Character = btl_character:resolve(TileOmnimods, CharacterRef),
-
- Character.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -70,140 +50,40 @@ resolve_character_at (CharacterIX, Battle) ->
new (Battle, CharacterIX) ->
#type
{
- character_is_outdated = false,
- battle_is_outdated = false,
-
battle = Battle,
- reversed_battle_updates = [],
-
- character = resolve_character_at(CharacterIX, Battle),
- reversed_character_updates = [],
-
character_ix = CharacterIX,
-
+ reversed_battle_updates = [],
timeline = []
}.
--spec get_battle (type()) -> {type(), btl_battle:type()}.
-get_battle (Data) ->
- case Data#type.battle_is_outdated of
- false -> {Data, Data#type.battle};
- true ->
- {UpdatedBattle, BattleAtaxiaUpdate} =
- btl_battle:ataxia_set_character
- (
- Data#type.character_ix,
- btl_character:to_unresolved(Data#type.character),
- ataxic:sequence
- (
- lists:reverse(Data#type.reversed_character_updates)
- ),
- Data#type.battle
- ),
-
- {
- Data#type
- {
- battle_is_outdated = false,
- battle = UpdatedBattle,
- reversed_battle_updates =
- [
- BattleAtaxiaUpdate
- |Data#type.reversed_battle_updates
- ],
- reversed_character_updates = []
- },
- UpdatedBattle
- }
- end.
-
--spec get_character (type()) -> {type(), btl_character:type()}.
-get_character (Data) ->
- case Data#type.character_is_outdated of
- false -> {Data, Data#type.character};
- true ->
- {
- Data#type
- {
- character_is_outdated = false,
- character =
- resolve_character_at
- (
- Data#type.character_ix,
- Data#type.battle
- ),
- reversed_character_updates = []
- }
- }
- end.
+-spec get_battle (type()) -> btl_battle:type().
+get_battle (Data) -> Data#type.battle.
-spec get_character_ix (type()) -> non_neg_integer().
get_character_ix (Data) -> Data#type.character_ix.
--spec set_battle (btl_battle:type(), boolean(), type()) -> type().
-set_battle (Battle, CouldAffectCharacter, Data) ->
- false = (Data#type.battle_is_outdated and CouldAffectCharacter),
-
- Data#type
- {
- character_is_outdated =
- (Data#type.character_is_outdated or CouldAffectCharacter),
- battle = Battle
- }.
+-spec set_battle (btl_battle:type(), type()) -> type().
+set_battle (Battle, Data) -> Data#type { battle = Battle }.
-spec ataxia_set_battle
(
btl_battle:type(),
- boolean(),
ataxic:basic(),
type()
)
-> type().
-ataxia_set_battle (Battle, CouldAffectCharacter, BattleUpdate, Data) ->
- false = (Data#type.battle_is_outdated and CouldAffectCharacter),
-
+ataxia_set_battle (Battle, BattleUpdate, Data) ->
Data#type
{
- character_is_outdated =
- (Data#type.character_is_outdated or CouldAffectCharacter),
battle = Battle,
reversed_battle_updates = [BattleUpdate|Data#type.reversed_battle_updates]
}.
--spec set_character (btl_character:type(), type()) -> type().
-set_character (Character, Data) ->
- false = Data#type.character_is_outdated,
-
- Data#type
- {
- battle_is_outdated = true,
- character = Character
- }.
-
--spec ataxia_set_character
- (
- btl_character:type(),
- ataxic:basic(),
- type()
- )
- -> type().
-ataxia_set_character (Character, CharacterUpdate, Data) ->
- false = Data#type.character_is_outdated,
-
- Data#type
- {
- battle_is_outdated = true,
- character = Character,
- reversed_character_updates =
- [CharacterUpdate|Data#type.reversed_character_updates]
- }.
-
-spec add_to_timeline (btl_turn_result:type(), type()) -> type().
add_to_timeline (Item, Data) ->
Data#type
{
- timeline =
- [btl_turn_result:encode(Item)|Data#type.timeline]
+ timeline = [btl_turn_result:encode(Item)|Data#type.timeline]
}.
-spec get_timeline (type()) -> list(any()).
@@ -211,6 +91,4 @@ get_timeline (Data) -> Data#type.timeline.
-spec get_battle_update (type()) -> ataxic:basic().
get_battle_update (Data) ->
- {ActualData, _Battle} = get_battle(Data),
-
- ataxic:sequence(lists:reverse(ActualData#type.reversed_battle_updates)).
+ ataxic:sequence(lists:reverse(Data#type.reversed_battle_updates)).