From fa540d6d07e430789809435741e6cd1d98111c50 Mon Sep 17 00:00:00 2001 From: nsensfel Date: Thu, 25 Apr 2019 17:26:34 +0200 Subject: ... --- .../mechanic/btl_turn_actions_management.erl | 75 +++++++++----- .../turn_action/btl_turn_actions_switch_weapon.erl | 47 +++------ src/battle/query/btl_character_turn.erl | 115 +++++---------------- src/battle/struct/btl_character.erl | 37 +++++-- src/battle/struct/btl_character_turn_update.erl | 10 +- 5 files changed, 126 insertions(+), 158 deletions(-) (limited to 'src/battle') 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) -> -- cgit v1.2.3-70-g09d2