summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornsensfel <SpamShield0@noot-noot.org>2019-04-25 14:19:44 +0200
committernsensfel <SpamShield0@noot-noot.org>2019-04-25 14:19:44 +0200
commit4fb024b4ee52ccbb9f25b17eaa606ce0b5e0296a (patch)
treecb89cdde37bd6f091ed175c076e607f4d311a01e /src/battle/mechanic
parente68004ee70c9102d00df2925c05d1354a6315bc0 (diff)
Merging btl_character_turn_{data,update}...
Diffstat (limited to 'src/battle/mechanic')
-rw-r--r--src/battle/mechanic/btl_turn_actions_management.erl (renamed from src/battle/mechanic/btl_turn_actions.erl)21
-rw-r--r--src/battle/mechanic/btl_turn_progression.erl53
-rw-r--r--src/battle/mechanic/btl_victory_progression.erl (renamed from src/battle/mechanic/btl_victory.erl)156
3 files changed, 108 insertions, 122 deletions
diff --git a/src/battle/mechanic/btl_turn_actions.erl b/src/battle/mechanic/btl_turn_actions_management.erl
index 489d9ac..41d9821 100644
--- a/src/battle/mechanic/btl_turn_actions.erl
+++ b/src/battle/mechanic/btl_turn_actions_management.erl
@@ -1,4 +1,4 @@
--module(btl_turn_actions).
+-module(btl_turn_actions_management).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -9,20 +9,19 @@
-export
(
[
- apply_requested_actions/2
+ handle/2
]
).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%% TODO: move this elsewhere
--spec finalize_character
+-spec deactivate_character
(
btl_character_turn_update:type()
)
-> btl_character_turn_update:type().
-finalize_character (Update) ->
+deactivate_character (Update) ->
Data = btl_character_turn_update:get_data(Update),
Character = btl_character_turn_data:get_character(Data),
@@ -50,13 +49,13 @@ finalize_character (Update) ->
S1Update.
--spec handle
+-spec handle_action
(
btl_battle_action:type(),
btl_character_turn_update:type()
)
-> btl_character_turn_update:type().
-handle (BattleAction, Update) ->
+handle_action (BattleAction, Update) ->
case btl_battle_action:get_category(BattleAction) of
move -> btl_turn_actions_move:handle(BattleAction, Update);
switch_weapon -> btl_turn_actions_switch_weapon:handle(Update);
@@ -66,16 +65,16 @@ handle (BattleAction, Update) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec apply_requested_actions
+-spec handle
(
btl_character_turn_data:type(),
btl_character_turn_request:type()
)
-> btl_character_turn_update:type().
-apply_requested_actions (Data, Request) ->
+handle (Data, Request) ->
Actions = btl_character_turn_request:get_actions(Request),
EmptyUpdate = btl_character_turn_update:new(Data),
- PostActionsUpdate = lists:foldl(fun handle/2, EmptyUpdate, Actions),
+ PostActionsUpdate = lists:foldl(fun handle_action/2, EmptyUpdate, Actions),
- finalize_character(PostActionsUpdate).
+ deactivate_character(PostActionsUpdate).
diff --git a/src/battle/mechanic/btl_turn_progression.erl b/src/battle/mechanic/btl_turn_progression.erl
index c28719e..a6443b8 100644
--- a/src/battle/mechanic/btl_turn_progression.erl
+++ b/src/battle/mechanic/btl_turn_progression.erl
@@ -16,52 +16,51 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec set_player_turn_to_next (btl_battle:type())
+-spec prepare_player_turn_for_next_player
+ (
+ btl_battle:type()
+ )
-> {btl_battle:type(), ataxic:basic()}.
-set_player_turn_to_next (Battle) ->
+prepare_player_turn_for_next_player (Battle) ->
Players = btl_battle:get_players(Battle),
CurrentPlayerTurn = btl_battle:get_current_player_turn(Battle),
- NextPlayerTurn = btl_player_turn:next(Players, CurrentPlayerTurn),
-
- UpdatedBattle = btl_battle:set_current_player_turn(NextPlayerTurn, Battle),
+ {UpdatedPlayerTurn, PlayerTurnAtaxiaUpdate} =
+ btl_player_turn:ataxia_next(Players, CurrentPlayerTurn),
- DBQuery =
- ataxic:update_field
+ {UpdatedBattle, BattleAtaxiaUpdate} =
+ btl_battle:ataxia_set_current_player_turn
(
- btl_battle:get_current_player_turn_field(),
- ataxic:constant(NextPlayerTurn)
+ UpdatedPlayerTurn,
+ PlayerTurnAtaxiaUpdate,
+ Battle
),
- {UpdatedBattle, DBQuery}.
+ {UpdatedBattle, BattleAtaxiaUpdate}.
--spec reset_next_player_timeline (btl_battle:type())
+-spec reset_next_player_timeline
+ (
+ btl_battle:type()
+ )
-> {btl_battle:type(), btl_player:type(), ataxic:basic()}.
reset_next_player_timeline (Battle) ->
NextPlayerTurn = btl_battle:get_current_player_turn(Battle),
NextPlayerIX = btl_player_turn:get_player_ix(NextPlayerTurn),
NextPlayer = btl_battle:get_player(NextPlayerIX, Battle),
- UpdatedNextPlayer = btl_player:reset_timeline(NextPlayer),
- UpdatedBattle =
- btl_battle:set_player(NextPlayerIX, UpdatedNextPlayer, Battle),
+ {UpdatedNextPlayer, PlayerAtaxiaUpdate} =
+ btl_player:ataxia_reset_timeline(NextPlayer),
- DBQuery =
- ataxic:update_field
+ {UpdatedBattle, BattleAtaxiaUpdate} =
+ btl_battle:ataxia_set_player
(
- btl_battle:get_players_field(),
- ataxic_sugar:update_orddict_element
- (
- NextPlayerIX,
- ataxic:update_field
- (
- btl_player:get_timeline_field(),
- ataxic:constant([])
- )
- )
+ NextPlayerIX,
+ UpdatedNextPlayer,
+ PlayerAtaxiaUpdate,
+ Battle
),
- {UpdatedBattle, UpdatedNextPlayer, DBQuery}.
+ {UpdatedBattle, UpdatedNextPlayer, BattleAtaxiaUpdate}.
-spec activate_next_players_characters
diff --git a/src/battle/mechanic/btl_victory.erl b/src/battle/mechanic/btl_victory_progression.erl
index 089af81..f50718a 100644
--- a/src/battle/mechanic/btl_victory.erl
+++ b/src/battle/mechanic/btl_victory_progression.erl
@@ -1,4 +1,4 @@
--module(btl_victory).
+-module(btl_victory_progression).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -16,48 +16,72 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
--spec mark_players_characters_as_defeated
+-spec mark_characters_of_player_as_defeated
(
non_neg_integer(),
- orddict:orddict(non_neg_integer(), btl_character:type())
+ btl_battle:type()
)
->
{
- orddict:orddict(non_neg_integer(), btl_character:type()),
- list(ataxic:basic())
+ btl_battle:type(),
+ ataxic:basic()
}.
-mark_players_characters_as_defeated (PlayerIX, Characters) ->
- orddict:fold
- (
- fun (IX, Character, {Dict, Updates}) ->
- case (btl_character:get_player_index(Character) == PlayerIX) of
- false -> {Dict, Updates};
- true ->
- {
- orddict:store
- (
- IX,
- btl_character:set_is_defeated(true, Character),
- Dict
- ),
- [
- ataxic_sugar:update_orddict_element
+mark_characters_of_player_as_defeated (PlayerIX, Battle) ->
+ AllCharacters = btl_battle:get_characters(Battle),
+
+ {ResultingBattle, BattleAtaxiaUpdates} =
+ orddict:fold
+ (
+ fun (IX, Character, {CurrentBattle, CurrentBattleAtaxiaUpdates}) ->
+ case (btl_character:get_player_index(Character) == PlayerIX) of
+ false -> {CurrentBattle, CurrentBattleAtaxiaUpdates};
+ true ->
+ {UpdatedCharacter, CharacterAtaxiaUpdate} =
+ btl_character:ataxia_set_is_defeated(true, Character),
+
+ {UpdatedBattle, NewBattleAtaxiaUpdate} =
+ btl_battle:ataxia_set_character
(
IX,
- ataxic:update_field
- (
- btl_character:get_is_defeated_field(),
- ataxic:constant(true)
- )
- )
- ]
- }
- end
- end,
- {Characters, []},
- Characters
- ).
+ UpdatedCharacter,
+ CharacterAtaxiaUpdate,
+ Battle
+ ),
+
+ {
+ UpdatedBattle,
+ [NewBattleAtaxiaUpdate|CurrentBattleAtaxiaUpdates]
+ }
+ end
+ end,
+ {Battle, []},
+ AllCharacters
+ ),
+
+ {ResultingBattle, ataxic:optimize(ataxic:sequence(BattleAtaxiaUpdates))}.
+
+-spec mark_player_as_inactive
+ (
+ non_neg_integer(),
+ btl_battle:type()
+ )
+ -> {btl_battle:type(), ataxic:basic()}.
+mark_player_as_inactive (PlayerIX, Battle) ->
+ Player = btl_battle:get_player(PlayerIX, Battle),
+
+ {UpdatedPlayer, PlayerAtaxicUpdate} =
+ btl_player:ataxia_set_is_active(false, Player),
+
+ {UpdateBattle, BattleAtaxicUpdate} =
+ btl_battle:ataxia_set_player
+ (
+ PlayerIX,
+ UpdatedPlayer,
+ PlayerAtaxicUpdate,
+ Battle
+ ),
+
+ {UpdateBattle, BattleAtaxicUpdate}.
-spec handle_player_defeat
(
@@ -68,65 +92,25 @@ mark_players_characters_as_defeated (PlayerIX, Characters) ->
handle_player_defeat (PlayerIX, Update) ->
Data = btl_character_turn_update:get_data(Update),
Battle = btl_character_turn_data:get_battle(Data),
- Characters = btl_battle:get_characters(Battle),
- %% FIXME [FUNCTION: battle][MEDIUM]: The controlled character might slip
- %% through.
- {UpdatedCharacters, AtaxicUpdates} =
- mark_players_characters_as_defeated(PlayerIX, Characters),
-
- S0Battle = btl_battle:set_characters(UpdatedCharacters, Battle),
- S1Battle =
- btl_battle:set_player
- (
- PlayerIX,
- btl_player:set_is_active
- (
- false,
- btl_battle:get_player(PlayerIX, S0Battle)
- ),
- S0Battle
- ),
+ {S0Battle, BattleAtaxicUpdate0} =
+ mark_characters_of_player_as_defeated(PlayerIX, Battle),
+ {S1Battle, BattleAtaxicUpdate1} =
+ mark_player_as_inactive(PlayerIX, S0Battle),
UpdatedData = btl_character_turn_data:set_battle(S1Battle, Data),
S0Update = btl_character_turn_update:set_data(UpdatedData, Update),
- DBQuery =
- ataxic:sequence
- (
- [
- ataxic:update_field
- (
- btl_battle:get_players_field(),
- ataxic_sugar:update_orddict_element
- (
- PlayerIX,
- ataxic:update_field
- (
- btl_player:get_is_active_field(),
- ataxic:constant(false)
- )
- )
- ),
- ataxic:update_field
- (
- btl_battle:get_characters_field(),
- ataxic:sequence(AtaxicUpdates)
- )
- ]
- ),
-
S1Update =
btl_character_turn_update:add_to_timeline
(
btl_turn_result:new_player_lost(PlayerIX),
- DBQuery,
+ ataxia:sequence([BattleAtaxicUpdate0, BattleAtaxicUpdate1]),
S0Update
),
S1Update.
-
-spec actually_handle_character_lost_health
(
non_neg_integer(),
@@ -142,7 +126,10 @@ actually_handle_character_lost_health (CharIX, Update) ->
case btl_character:get_rank(Character) of
optional ->
- %% Let's not assume there is a commander
+ %% Let's not assume there is a commander, meaning that we still have
+ %% to check if at least one character is alive, despite the fact that
+ %% if there is a commander, it being killed would have triggered
+ %% the defeat.
StillHasAliveChar =
lists:any
(
@@ -164,7 +151,7 @@ actually_handle_character_lost_health (CharIX, Update) ->
commander -> handle_player_defeat(CharacterPlayerIX, Update);
target ->
- StillHasAliveChar =
+ StillHasAliveTargetChar =
lists:any
(
fun ({IX, Char}) ->
@@ -172,12 +159,13 @@ actually_handle_character_lost_health (CharIX, Update) ->
(CharacterPlayerIX == btl_character:get_player_index(Char))
and (IX /= CharIX)
and btl_character:get_is_alive(Char)
+ and (blt_character:get_rank(Char) == target)
)
end,
orddict:to_list(Characters)
),
- case StillHasAliveChar of
+ case StillHasAliveTargetChar of
true -> Update;
_ -> handle_player_defeat(CharacterPlayerIX, Update)
end
@@ -202,7 +190,7 @@ handle_character_lost_health (CharIX, _Health, Update) ->
S2Update = actually_handle_character_lost_health(CharIX, S1Update),
S2Data = btl_character_turn_update:get_data(S2Update),
- S3Data = btl_character_turn_data:refreshr_character(S2Data),
+ S3Data = btl_character_turn_data:refresh_character(S2Data),
S3Update = btl_character_turn_update:set_data(S3Data, S2Update),
S3Update.