summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornsensfel <SpamShield0@noot-noot.org>2019-04-25 17:26:34 +0200
committernsensfel <SpamShield0@noot-noot.org>2019-04-25 17:26:34 +0200
commitfa540d6d07e430789809435741e6cd1d98111c50 (patch)
tree890c376b5684593f972ec81cf8c4fbf9455b8342 /src/battle
parent4fb024b4ee52ccbb9f25b17eaa606ce0b5e0296a (diff)
...
Diffstat (limited to 'src/battle')
-rw-r--r--src/battle/mechanic/btl_turn_actions_management.erl75
-rw-r--r--src/battle/mechanic/turn_action/btl_turn_actions_switch_weapon.erl47
-rw-r--r--src/battle/query/btl_character_turn.erl115
-rw-r--r--src/battle/struct/btl_character.erl37
-rw-r--r--src/battle/struct/btl_character_turn_update.erl10
5 files changed, 126 insertions, 158 deletions
diff --git a/src/battle/mechanic/btl_turn_actions_management.erl b/src/battle/mechanic/btl_turn_actions_management.erl
index 41d9821..d3a84bd 100644
--- a/src/battle/mechanic/btl_turn_actions_management.erl
+++ b/src/battle/mechanic/btl_turn_actions_management.erl
@@ -22,31 +22,19 @@
)
-> btl_character_turn_update:type().
deactivate_character (Update) ->
- Data = btl_character_turn_update:get_data(Update),
- Character = btl_character_turn_data:get_character(Data),
+ {S0Update, Character} = btl_character_turn_update:get_character(Update),
- DisabledCharacter = btl_character:set_is_active(false, Character),
- UpdatedData = btl_character_turn_data:set_character(DisabledCharacter, Data),
- FinalizedData = btl_character_turn_data:clean_battle(UpdatedData),
+ {UpdatedCharacter, CharacterAtaxiaUpdate} =
+ btl_character:ataxia_set_is_active(false, Character),
- DBQuery =
- ataxic:update_field
+ S1Update =
+ btl_character_turn_update:ataxia_set_character
(
- btl_battle:get_characters_field(),
- ataxic_sugar:update_orddict_element
- (
- btl_character_turn_data:get_character_ix(Data),
- ataxic:update_field
- (
- btl_character:get_is_active_field(),
- ataxic:constant(false)
- )
- )
+ UpdatedCharacter,
+ CharacterAtaxiaUpdate,
+ S0Update
),
- S0Update = btl_character_turn_update:set_data(FinalizedData, Update),
- S1Update = btl_character_turn_update:add_to_db(DBQuery, S0Update),
-
S1Update.
-spec handle_action
@@ -62,19 +50,56 @@ handle_action (BattleAction, Update) ->
attack -> btl_turn_actions_attack:handle(BattleAction, Update)
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,
+ BattleAtaxiaUpdate,
+ S0Update
+ ),
+
+ S1Update.
+
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec handle
(
- btl_character_turn_data:type(),
+ btl_character_turn_update:type(),
btl_character_turn_request:type()
)
-> btl_character_turn_update:type().
-handle (Data, Request) ->
+handle (Update, Request) ->
Actions = btl_character_turn_request:get_actions(Request),
- EmptyUpdate = btl_character_turn_update:new(Data),
- PostActionsUpdate = lists:foldl(fun handle_action/2, EmptyUpdate, Actions),
+ S0Update = lists:foldl(fun handle_action/2, Update, Actions),
+ S1Update = deactivate_character(S0Update),
+ S2Update = update_timeline(S1Update),
+ S3Update = btl_turn_progression:handle(S2Update),
- deactivate_character(PostActionsUpdate).
+ S3Update.
diff --git a/src/battle/mechanic/turn_action/btl_turn_actions_switch_weapon.erl b/src/battle/mechanic/turn_action/btl_turn_actions_switch_weapon.erl
index 119dbe7..24b361a 100644
--- a/src/battle/mechanic/turn_action/btl_turn_actions_switch_weapon.erl
+++ b/src/battle/mechanic/turn_action/btl_turn_actions_switch_weapon.erl
@@ -26,43 +26,30 @@
)
-> btl_character_turn_update:type().
handle (Update) ->
- Data = btl_character_turn_update:get_data(Update),
- Character = btl_character_turn_data:get_character(Data),
- CharacterCurrentData =
- btl_character_turn_data:get_character_current_data(Data),
- CharacterIX = btl_character_turn_data:get_character_ix(Data),
+ {S0Update, Character} = btl_character_turn_update:get_character(Update),
+ CharacterIX = btl_character_turn_update:get_character_ix(S0Update),
+ BaseCharacter = btl_character:get_base_character(Character),
- {PrimaryWeaponID, SecondaryWeaponID} = btl_character:get_weapon_ids(Character),
+ {UpdatedBaseCharacter, BaseCharacterAtaxiaUpdate} =
+ shr_character:ataxia_switch_weapons(BaseCharacter),
- UpdatedWeaponIDs = {SecondaryWeaponID, PrimaryWeaponID},
- UpdatedCharacter = btl_character:set_weapon_ids(UpdatedWeaponIDs, Character),
-
- S0Data = btl_character_turn_data:set_character(UpdatedCharacter, Data),
- S1Data = btl_character_turn_data:refresh_character_current_data(S0Data),
-
- S0Update = btl_character_turn_update:set_data(S1Data, Update),
- S1Update =
- btl_turn_actions_stats_change:handle_max_health_changes
+ {UpdatedCharacter, CharacterAtaxiaUpdate} =
+ btl_character:ataxia_set_base_character
(
- CharacterCurrentData,
- S0Update
+ UpdatedBaseCharacter,
+ BaseCharacterAtaxiaUpdate,
+ Character
),
TimelineItem = btl_turn_result:new_character_switched_weapons(CharacterIX),
- DBQuery =
- ataxic:update_field
+ S1Update = btl_character_turn_update:add_to_timeline(TimelineItem, S0Update),
+ S2Update =
+ btl_character_turn_update:ataxia_set_character
(
- btl_battle:get_characters_field(),
- ataxic_sugar:update_orddict_element
- (
- CharacterIX,
- ataxic:update_field
- (
- btl_character:get_weapons_field(),
- ataxic:constant(UpdatedWeaponIDs)
- )
- )
+ UpdatedCharacter,
+ CharacterAtaxiaUpdate,
+ S1Update
),
- btl_character_turn_update:add_to_timeline(TimelineItem, DBQuery, S1Update).
+ S2Update.
diff --git a/src/battle/query/btl_character_turn.erl b/src/battle/query/btl_character_turn.erl
index b911ae9..455dd13 100644
--- a/src/battle/query/btl_character_turn.erl
+++ b/src/battle/query/btl_character_turn.erl
@@ -37,7 +37,7 @@ authenticate_user (Request) ->
(
btl_character_turn_request:type()
)
- -> btl_character_turn_data:type().
+ -> btl_character_turn_update:type().
fetch_data (Request) ->
PlayerID = btl_character_turn_request:get_player_id(Request),
BattleID = btl_character_turn_request:get_battle_id(Request),
@@ -50,17 +50,17 @@ fetch_data (Request) ->
BattleID
),
- btl_character_turn_data:new(Battle, CharacterIX).
+ btl_character_turn_update:new(Battle, CharacterIX).
%%%% ASSERTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec assert_user_is_current_player
(
- btl_character_turn_data:type(),
+ btl_character_turn_update:type(),
btl_character_turn_request:type()
) -> 'ok'.
-assert_user_is_current_player (Data, Request) ->
+assert_user_is_current_player (Update, Request) ->
PlayerID = btl_character_turn_request:get_player_id(Request),
- Battle = btl_character_turn_data:get_battle(Data),
+ {_SameUpdate, 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),
@@ -71,25 +71,24 @@ assert_user_is_current_player (Data, Request) ->
-spec assert_user_owns_played_character
(
- btl_character_turn_data:type(),
+ btl_character_turn_update:type(),
btl_character_turn_request:type()
) -> 'ok'.
-assert_user_owns_played_character (Data, Request) ->
+assert_user_owns_played_character (Update, Request) ->
PlayerID = btl_character_turn_request:get_player_id(Request),
- Battle = btl_character_turn_data:get_battle(Data),
- Players = btl_battle:get_players(Battle),
- Character = btl_character_turn_data:get_character(Data),
+ {_SameUpdateA, Battle} = btl_character_turn_update:get_battle(Update),
+ {_SameUpdateB, Character} = btl_character_turn_update:get_character(Update),
CharacterPlayerIX = btl_character:get_player_index(Character),
- CharacterPlayer = orddict:fetch(CharacterPlayerIX, Players),
+ CharacterPlayer = btl_battle:get_player(CharacterPlayerIX, Battle),
CharacterPlayerID = btl_player:get_id(CharacterPlayer),
true = (PlayerID == CharacterPlayerID),
ok.
--spec assert_character_can_be_played (btl_character_turn_data:type()) -> 'ok'.
-assert_character_can_be_played (Data) ->
- Character = btl_character_turn_data:get_character(Data),
+-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),
true = btl_character:get_is_active(Character),
@@ -97,77 +96,16 @@ assert_character_can_be_played (Data) ->
-spec assert_user_permissions
(
- btl_character_turn_data:type(),
+ btl_character_turn_update:type(),
btl_character_turn_request:type()
) -> 'ok'.
-assert_user_permissions (Data, Request) ->
- assert_user_is_current_player(Data, Request),
- assert_user_owns_played_character(Data, Request),
- assert_character_can_be_played(Data),
+assert_user_permissions (Update, Request) ->
+ assert_user_is_current_player(Update, Request),
+ assert_user_owns_played_character(Update, Request),
+ assert_character_can_be_played(Update),
ok.
-%%%% QUERY LOGIC HANDLING %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%%%% TODO: move this elsewhere
--spec update_timeline
- (
- btl_character_turn_update:type()
- )
- -> btl_character_turn_update:type().
-update_timeline (Update) ->
- NewTimelineElements = btl_character_turn_update:get_timeline(Update),
- Data = btl_character_turn_update:get_data(Update),
- Battle = btl_character_turn_data:get_battle(Data),
- PlayerTurn = btl_battle:get_current_player_turn(Battle),
- PlayerIX = btl_player_turn:get_player_ix(PlayerTurn),
- Player = btl_battle:get_player(PlayerIX, Battle),
-
- UpdatedPlayer = btl_player:add_to_timeline(NewTimelineElements, Player),
- UpdatedBattle = btl_battle:set_player(PlayerIX, UpdatedPlayer, Battle),
- UpdatedData = btl_character_turn_data:set_battle(UpdatedBattle, Data),
-
- DBQuery =
- ataxic:update_field
- (
- btl_battle:get_players_field(),
- ataxic_sugar:update_orddict_element
- (
- PlayerIX,
- ataxic:update_field
- (
- btl_player:get_timeline_field(),
- ataxic:apply_function
- (
- lists,
- append,
- [
- ataxic:constant(NewTimelineElements),
- ataxic:current_value()
- ]
- )
- )
- )
- ),
-
- S0Update = btl_character_turn_update:set_data(UpdatedData, Update),
- S1Update = btl_character_turn_update:add_to_db(DBQuery, S0Update),
-
- S1Update.
-
-
--spec update_data
- (
- btl_character_turn_data:type(),
- btl_character_turn_request:type()
- )
- -> btl_character_turn_update:type().
-update_data (Data, Request) ->
- PostActionsUpdate = btl_turn_actions:apply_requested_actions(Data, Request),
- PostCharacterTurnUpdate = update_timeline(PostActionsUpdate),
-
- btl_next_turn:update_if_needed(PostCharacterTurnUpdate).
-
%%%% DATABASE UPDATES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec send_to_database
(
@@ -178,14 +116,14 @@ update_data (Data, Request) ->
send_to_database (Update, Request) ->
PlayerID = btl_character_turn_request:get_player_id(Request),
BattleID = btl_character_turn_request:get_battle_id(Request),
- Ops = btl_character_turn_update:get_db(Update),
+ BattleAtaxicUpdate = btl_character_turn_update:get_battle_update(Update),
ok =
ataxia_client:update
(
battle_db,
ataxia_security:user_from_id(PlayerID),
- ataxic:update_value(ataxic:sequence(Ops)),
+ ataxic:update_value(ataxic:optimize(BattleAtaxicUpdate)),
BattleID
),
@@ -200,8 +138,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),
- Data = btl_character_turn_update:get_data(Update),
- Battle = btl_character_turn_data:get_battle(Data),
+ {_SameUpdate, Battle} = btl_character_turn_update:get_battle(Update),
shr_timed_cache:update
(
@@ -244,14 +181,14 @@ handle (Query) ->
shr_security:lock_queries(PlayerID),
- Data = fetch_data(Request),
- assert_user_permissions(Data, Request),
- Update = update_data(Data, Request),
- commit_update(Update, Request),
+ S0Update = fetch_data(Request),
+ assert_user_permissions(S0Update, Request),
+ S1Update = btl_turn_actions:apply_requested_actions(S0Update, Request),
+ commit_update(S1Update, Request),
shr_security:unlock_queries(PlayerID),
- generate_reply(Update);
+ generate_reply(S1Update);
error -> jiffy:encode([shr_disconnected:generate()])
end.
diff --git a/src/battle/struct/btl_character.erl b/src/battle/struct/btl_character.erl
index 69904c6..ce0b3aa 100644
--- a/src/battle/struct/btl_character.erl
+++ b/src/battle/struct/btl_character.erl
@@ -69,6 +69,15 @@
set_is_defeated/2,
set_base_character/2,
+ ataxia_set_rank/2,
+ ataxia_set_location/2,
+ ataxia_set_current_health/2,
+ ataxia_set_is_active/2,
+ ataxia_set_is_defeated/2,
+ ataxia_set_base_character/2,
+
+ ataxia_set_base_character/3,
+
get_rank_field/0,
get_current_health_field/0,
get_is_active_field/0,
@@ -119,7 +128,6 @@ get_is_alive (#btl_char{ current_health = H, is_defeated = D }) ->
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
(
@@ -150,13 +158,23 @@ set_rank (Rank, Char) when is_record(Char, btl_char) ->
set_rank (Rank, Char) when is_record(Char, btl_char_ref) ->
Char#btl_char_ref{ rank = Rank }.
+% TODO: This can change current_health.
+% FIXME: Can't do this without giving the new tile omnimods.
-spec set_location
- ({non_neg_integer(), non_neg_integer()}, type()) -> type();
- ({non_neg_integer(), non_neg_integer()}, unresolved()) -> unresolved().
-set_location (Location, Char) when is_record(Char, btl_char) ->
- Char#btl_char{ location = Location };
-set_location (Location, Char) when is_record(Char, btl_char_ref) ->
- Char#btl_char_ref{ location = Location }.
+ (
+ {non_neg_integer(), non_neg_integer()},
+ shr_omnimods:type(),
+ type()
+ )
+ -> type();
+set_location (Location, LocOmnimods, Char) ->
+ BaseCharacter =
+ CurrentMaxHealth =
+ shr_statistics:get_health
+ (
+ shr_character:get_statistics
+ )
+ Char#btl_char{ location = Location }.
-spec set_current_health
(integer(), type()) -> type();
@@ -182,13 +200,14 @@ set_is_defeated (Defeated, Char) when is_record(Char, btl_char) ->
set_is_defeated (Defeated, Char) when is_record(Char, btl_char_ref) ->
Char#btl_char_ref{ is_defeated = Defeated }.
+% TODO: This can change current_health.
-spec set_base_character
(shr_character:type(), type()) -> type();
(shr_character:unresolved(), unresolved()) -> unresolved().
set_base_character (Base, Char) when is_record(Char, btl_char) ->
- Char#btl_char{ base = Base};
+ Char#btl_char{ base = Base };
set_base_character (Base, Char) when is_record(Char, btl_char_ref) ->
- Char#btl_char_ref{ base = Base}.
+ Char#btl_char_ref{ base = Base }.
%%%% Utils
-spec new
diff --git a/src/battle/struct/btl_character_turn_update.erl b/src/battle/struct/btl_character_turn_update.erl
index 6649eb2..601f314 100644
--- a/src/battle/struct/btl_character_turn_update.erl
+++ b/src/battle/struct/btl_character_turn_update.erl
@@ -18,7 +18,7 @@
character_ix :: non_neg_integer(),
- reversed_timeline :: list(any())
+ timeline :: list(any())
}
).
@@ -92,7 +92,7 @@ new (Battle, CharacterIX) ->
character_ix = CharacterIX,
- reversed_timeline = []
+ timeline = []
}.
-spec get_battle (type()) -> {type(), btl_battle:type()}.
@@ -203,12 +203,12 @@ ataxia_set_character (Character, CharacterUpdate, Data) ->
add_to_timeline (Item, Data) ->
Data#type
{
- reversed_timeline =
- [btl_turn_result:encode(Item)|Data#type.reversed_timeline]
+ timeline =
+ [btl_turn_result:encode(Item)|Data#type.timeline]
}.
-spec get_timeline (type()) -> list(any()).
-get_timeline (Data) -> lists:reverse(Data#type.reversed_timeline).
+get_timeline (Data) -> Data#type.timeline.
-spec get_battle_update (type()) -> ataxic:basic().
get_battle_update (Data) ->