summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/battlemap')
-rw-r--r-- | src/battlemap/game-logic/bm_turn_actions.erl | 148 | ||||
-rw-r--r-- | src/battlemap/game-logic/bm_victory.erl | 181 |
2 files changed, 183 insertions, 146 deletions
diff --git a/src/battlemap/game-logic/bm_turn_actions.erl b/src/battlemap/game-logic/bm_turn_actions.erl index abe80e3..4bb6d0b 100644 --- a/src/battlemap/game-logic/bm_turn_actions.erl +++ b/src/battlemap/game-logic/bm_turn_actions.erl @@ -16,149 +16,6 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec handle_player_defeat - ( - non_neg_integer(), - bm_character_turn_update:type() - ) - -> bm_character_turn_update:type(). -handle_player_defeat (PlayerIX, Update) -> - Data = bm_character_turn_update:get_data(Update), - Battle = bm_character_turn_data:get_battle(Data), - Characters = bm_battle:get_characters(Battle), - - %% FIXME: The controlled character might slip through. - {UpdatedCharacters, ModifiedIXs} = - sh_array_util:mapiff - ( - fun (Character) -> - (bm_character:get_player_index(Character) == PlayerIX) - end, - fun (Character) -> - bm_character:set_rank(defeated, Character) - end, - Characters - ), - - S1Update = - lists:foldl - ( - fun (IX, NextUpdate) -> - bm_character_turn_update:add_to_db - ( - sh_db_query:update_indexed - ( - bm_battle:get_characters_field(), - IX, - [ - sh_db_query:set_field - ( - bm_character:get_rank_field(), - defeated - ) - ] - ), - NextUpdate - ) - end, - Update, - ModifiedIXs - ), - - %% TODO: Battle.player[PlayerIX].is_active <- false - - UpdatedBattle = bm_battle:set_characters(UpdatedCharacters, Battle), - UpdatedData = bm_character_turn_data:set_battle(UpdatedBattle, Data), - S2Update = bm_character_turn_update:set_data(UpdatedData, S1Update), - - DBQuery = - sh_db_query:update_indexed - ( - bm_battle:get_players_field(), - PlayerIX, - [ - sh_db_query:set_field - ( - bm_player:get_is_active_field(), - false - ) - ] - ), - - S3Update = - bm_character_turn_update:add_to_timeline - ( - bm_turn_result:new_player_lost(PlayerIX), - DBQuery, - S2Update - ), - - S3Update. - --spec handle_victory_condition - ( - non_neg_integer(), - integer(), - bm_character_turn_update:type() - ) - -> bm_character_turn_update:type(). -handle_victory_condition (_, Health, Update) when (Health > 0) -> Update; -handle_victory_condition (CharIX, _Health, Update) -> - Data = bm_character_turn_update:get_data(Update), - Battle = bm_character_turn_data:get_battle(Data), - Character = bm_battle:get_character(CharIX, Battle), - Characters = bm_battle:get_characters(Battle), - CharacterPlayerIX = bm_character:get_player_index(Character), - - case bm_character:get_rank(Character) of - optional -> - %% Let's not assume there is a commander - StillHasAliveChar = - sh_array_util:any_indexed - ( - fun (IX, Char) -> - ( - (CharacterPlayerIX == bm_character:get_player_index(Char)) - and (IX /= CharIX) - and bm_character:get_is_alive(Char) - ) - end, - %% FIXME: Potential issue if it's the controlled player and Data - %% is dirty. - Characters - ), - - case StillHasAliveChar of - true -> Update; - _ -> handle_player_defeat(CharacterPlayerIX, Update) - end; - - commander -> handle_player_defeat(CharacterPlayerIX, Update); - - target -> - StillHasAliveChar = - sh_array_util:any_indexed - ( - fun (IX, Char) -> - ( - (CharacterPlayerIX == bm_character:get_player_index(Char)) - and (IX /= CharIX) - and bm_character:get_is_alive(Char) - and (bm_character:get_rank(Char) == target) - ) - end, - %% FIXME: Potential issue if it's the controlled player and Data - %% is dirty. - Characters - ), - - case StillHasAliveChar of - true -> Update; - _ -> handle_player_defeat(CharacterPlayerIX, Update) - end; - - defeated -> Update - end. %%%% SWITCHING WEAPON %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -spec handle_switch_weapon @@ -441,7 +298,6 @@ handle_attack (BattleAction, Update) -> Battle ), - S0Data = bm_character_turn_data:set_battle(UpdatedBattle, Data), S1Data = bm_character_turn_data:set_character(UpdatedCharacter, S0Data), @@ -499,7 +355,7 @@ handle_attack (BattleAction, Update) -> S2Update = bm_character_turn_update:set_data(S1Data, S1Update), S3Update = - handle_victory_condition + bm_victory:handle_character_lost_health ( CharacterIX, RemainingAttackerHealth, @@ -507,7 +363,7 @@ handle_attack (BattleAction, Update) -> ), S4Update = - handle_victory_condition + bm_victory:handle_character_lost_health ( TargetIX, RemainingDefenderHealth, diff --git a/src/battlemap/game-logic/bm_victory.erl b/src/battlemap/game-logic/bm_victory.erl new file mode 100644 index 0000000..59be66b --- /dev/null +++ b/src/battlemap/game-logic/bm_victory.erl @@ -0,0 +1,181 @@ +-module(bm_victory). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export +( + [ + handle_character_lost_health/3 + ] +). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +-spec mark_players_characters_as_defeated + ( + non_neg_integer(), + array:array(bm_character:type()) + ) -> {array:array(bm_character:type()), list(non_neg_integer())}. +mark_players_characters_as_defeated (PlayerIX, Characters) -> + sh_array_util:mapiff + ( + fun (Character) -> + (bm_character:get_player_index(Character) == PlayerIX) + end, + fun (Character) -> + bm_character:set_rank(defeated, Character) + end, + Characters + ). + +-spec add_db_query_to_mark_character_as_defeated + ( + non_neg_integer(), + bm_character_turn_update:type() + ) + -> bm_character_turn_update:type(). +add_db_query_to_mark_character_as_defeated (IX, Update) -> + bm_character_turn_update:add_to_db + ( + sh_db_query:update_indexed + ( + bm_battle:get_characters_field(), + IX, + [ + sh_db_query:set_field + ( + bm_character:get_rank_field(), + defeated + ) + ] + ), + Update + ). + +-spec handle_player_defeat + ( + non_neg_integer(), + bm_character_turn_update:type() + ) + -> bm_character_turn_update:type(). +handle_player_defeat (PlayerIX, Update) -> + Data = bm_character_turn_update:get_data(Update), + Battle = bm_character_turn_data:get_battle(Data), + Characters = bm_battle:get_characters(Battle), + + %% FIXME: The controlled character might slip through. + {UpdatedCharacters, ModifiedIXs} = + mark_players_characters_as_defeated(PlayerIX, Characters), + + S1Update = + lists:foldl + ( + fun add_db_query_to_mark_character_as_defeated/2, + Update, + ModifiedIXs + ), + + %% TODO: Battle.player[PlayerIX].is_active <- false + + UpdatedBattle = bm_battle:set_characters(UpdatedCharacters, Battle), + UpdatedData = bm_character_turn_data:set_battle(UpdatedBattle, Data), + S2Update = bm_character_turn_update:set_data(UpdatedData, S1Update), + + DBQuery = + sh_db_query:update_indexed + ( + bm_battle:get_players_field(), + PlayerIX, + [ + sh_db_query:set_field + ( + bm_player:get_is_active_field(), + false + ) + ] + ), + + S3Update = + bm_character_turn_update:add_to_timeline + ( + bm_turn_result:new_player_lost(PlayerIX), + DBQuery, + S2Update + ), + + S3Update. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec handle_character_lost_health + ( + non_neg_integer(), + integer(), + bm_character_turn_update:type() + ) + -> bm_character_turn_update:type(). +handle_character_lost_health (_, Health, Update) when (Health > 0) -> Update; +handle_character_lost_health (CharIX, _Health, Update) -> + Data = bm_character_turn_update:get_data(Update), + Battle = bm_character_turn_data:get_battle(Data), + Character = bm_battle:get_character(CharIX, Battle), + Characters = bm_battle:get_characters(Battle), + CharacterPlayerIX = bm_character:get_player_index(Character), + + case bm_character:get_rank(Character) of + optional -> + %% Let's not assume there is a commander + StillHasAliveChar = + sh_array_util:any_indexed + ( + fun (IX, Char) -> + ( + (CharacterPlayerIX == bm_character:get_player_index(Char)) + and (IX /= CharIX) + and bm_character:get_is_alive(Char) + ) + end, + %% FIXME: Potential issue if it's the controlled player and Data + %% is dirty. + Characters + ), + + case StillHasAliveChar of + true -> Update; + _ -> handle_player_defeat(CharacterPlayerIX, Update) + end; + + commander -> handle_player_defeat(CharacterPlayerIX, Update); + + target -> + StillHasAliveChar = + sh_array_util:any_indexed + ( + fun (IX, Char) -> + ( + (CharacterPlayerIX == bm_character:get_player_index(Char)) + and (IX /= CharIX) + and bm_character:get_is_alive(Char) + and (bm_character:get_rank(Char) == target) + ) + end, + %% FIXME: Potential issue if it's the controlled player and Data + %% is dirty. + Characters + ), + + case StillHasAliveChar of + true -> Update; + _ -> handle_player_defeat(CharacterPlayerIX, Update) + end; + + defeated -> Update + end. |