summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/battlemap/game-logic')
-rw-r--r-- | src/battlemap/game-logic/bm_movement.erl | 60 | ||||
-rw-r--r-- | src/battlemap/game-logic/bm_next_turn.erl | 160 | ||||
-rw-r--r-- | src/battlemap/game-logic/bm_turn_actions.erl | 391 | ||||
-rw-r--r-- | src/battlemap/game-logic/bm_victory.erl | 194 |
4 files changed, 0 insertions, 805 deletions
diff --git a/src/battlemap/game-logic/bm_movement.erl b/src/battlemap/game-logic/bm_movement.erl deleted file mode 100644 index 8bf2c5b..0000000 --- a/src/battlemap/game-logic/bm_movement.erl +++ /dev/null @@ -1,60 +0,0 @@ --module(bm_movement). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export([cross/4]). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec cross - ( - bm_battlemap:type(), - list(bm_location:type()), - list(bm_direction:enum()), - non_neg_integer(), - bm_location:type() - ) - -> {bm_location:type(), non_neg_integer()}. -cross (_Battlemap, _ForbiddenLocations, [], Cost, Location) -> - {Location, Cost}; -cross (Battlemap, ForbiddenLocations, [Step|NextSteps], Cost, Location) -> - NextLocation = bm_location:apply_direction(Step, Location), - NextTileClassID = bm_battlemap:get_tile_class_id(NextLocation, Battlemap), - NextTileID = bm_tile:class_id_to_type_id(NextTileClassID), - NextTile = bm_tile:from_id(NextTileID), - NextCost = (Cost + bm_tile:get_cost(NextTile)), - IsForbidden = - lists:foldl - ( - fun (ForbiddenLocation, Prev) -> - (Prev or (NextLocation == ForbiddenLocation)) - end, - false, - ForbiddenLocations - ), - - IsForbidden = false, - - cross(Battlemap, ForbiddenLocations, NextSteps, NextCost, NextLocation). - --spec cross - ( - bm_battlemap:type(), - list(bm_location:type()), - list(bm_direction:enum()), - bm_location:type() - ) - -> {bm_location:type(), non_neg_integer()}. -cross (Battlemap, ForbiddenLocations, Path, Location) -> - cross(Battlemap, ForbiddenLocations, Path, 0, Location). diff --git a/src/battlemap/game-logic/bm_next_turn.erl b/src/battlemap/game-logic/bm_next_turn.erl deleted file mode 100644 index 56e7f7e..0000000 --- a/src/battlemap/game-logic/bm_next_turn.erl +++ /dev/null @@ -1,160 +0,0 @@ --module(bm_next_turn). -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export -( - [ - update_if_needed/1 - ] -). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec set_player_turn_to_next (bm_battle:type()) - -> {bm_battle:type(), sh_db_query:op()}. -set_player_turn_to_next (Battle) -> - Players = bm_battle:get_players(Battle), - CurrentPlayerTurn = bm_battle:get_current_player_turn(Battle), - - NextPlayerTurn = bm_player_turn:next(Players, CurrentPlayerTurn), - - UpdatedBattle = bm_battle:set_current_player_turn(NextPlayerTurn, Battle), - - DBQuery = - sh_db_query:set_field - ( - bm_battle:get_current_player_turn_field(), - NextPlayerTurn - ), - - {UpdatedBattle, DBQuery}. - --spec reset_next_player_timeline (bm_battle:type()) - -> {bm_battle:type(), bm_player:type(), sh_db_query:op()}. -reset_next_player_timeline (Battle) -> - NextPlayerTurn = bm_battle:get_current_player_turn(Battle), - NextPlayerIX = bm_player_turn:get_player_ix(NextPlayerTurn), - NextPlayer = bm_battle:get_player(NextPlayerIX, Battle), - - UpdatedNextPlayer = bm_player:reset_timeline(NextPlayer), - UpdatedBattle = - bm_battle:set_player(NextPlayerIX, UpdatedNextPlayer, Battle), - - DBQuery = - sh_db_query:update_indexed - ( - bm_battle:get_players_field(), - NextPlayerIX, - [ sh_db_query:set_field(bm_player:get_timeline_field(), []) ] - ), - - {UpdatedBattle, UpdatedNextPlayer, DBQuery}. - - --spec activate_next_players_characters (bm_battle:type(), bm_player:type()) - -> {bm_battle:type(), list(sh_db_query:op())}. -activate_next_players_characters (Battle, NextPlayer) -> - NextPlayerIX = bm_player:get_index(NextPlayer), - Characters = bm_battle:get_characters(Battle), - - {UpdatedCharacters, ModifiedIXs} = - sh_array_util:mapiff - ( - fun (Character) -> - (bm_character:get_player_index(Character) == NextPlayerIX) - end, - fun (Character) -> - bm_character:set_is_active(true, Character) - end, - Characters - ), - - DBQueries = - lists:map - ( - fun (IX) -> - sh_db_query:update_indexed - ( - bm_battle:get_characters_field(), - IX, - [ - sh_db_query:set_field - ( - bm_character:get_is_active_field(), - true - ) - ] - ) - end, - ModifiedIXs - ), - - UpdatedBattle = bm_battle:set_characters(UpdatedCharacters, Battle), - - {UpdatedBattle, DBQueries}. - --spec update - ( - bm_character_turn_update:type() - ) - -> bm_character_turn_update:type(). -update (Update) -> - Data = bm_character_turn_update:get_data(Update), - Battle = bm_character_turn_data:get_battle(Data), - - {S0Battle, DBQuery0} = set_player_turn_to_next(Battle), - {S1Battle, NextPlayer, DBQuery1} = reset_next_player_timeline(S0Battle), - {S2Battle, DBQueries} = - activate_next_players_characters(S1Battle, NextPlayer), - - S0Data = bm_character_turn_data:set_battle(S2Battle, Data), - S0Update = - bm_character_turn_update:add_to_timeline - ( - bm_turn_result:new_player_turn_started - ( - bm_player:get_index(NextPlayer) - ), - DBQuery0, - Update - ), - - S1Update = bm_character_turn_update:set_data(S0Data, S0Update), - - S2Update = - lists:foldl - ( - fun bm_character_turn_update:add_to_db/2, - S1Update, - [DBQuery1|DBQueries] - ), - - S2Update. - --spec requires_update (bm_character_turn_update:type()) -> boolean(). -requires_update (Update) -> - Data = bm_character_turn_update:get_data(Update), - Battle = bm_character_turn_data:get_battle(Data), - Characters = bm_battle:get_characters(Battle), - - sh_array_util:none(fun bm_character:get_is_active/1, Characters). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec update_if_needed - ( - bm_character_turn_update:type() - ) - -> bm_character_turn_update:type(). -update_if_needed (Update) -> - case requires_update(Update) of - true -> update(Update); - _ -> Update - end. diff --git a/src/battlemap/game-logic/bm_turn_actions.erl b/src/battlemap/game-logic/bm_turn_actions.erl deleted file mode 100644 index c3e091a..0000000 --- a/src/battlemap/game-logic/bm_turn_actions.erl +++ /dev/null @@ -1,391 +0,0 @@ --module(bm_turn_actions). -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export -( - [ - handle/2 - ] -). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%% SWITCHING WEAPON %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec handle_switch_weapon - ( - bm_character_turn_update:type() - ) - -> bm_character_turn_update:type(). -handle_switch_weapon (Update) -> - Data = bm_character_turn_update:get_data(Update), - Character = bm_character_turn_data:get_character(Data), - CharacterIX = bm_character_turn_data:get_character_ix(Data), - CharacterAttributes = bm_character:get_attributes(Character), - ArmorID = bm_character:get_armor_id(Character), - {PrimaryWeaponID, SecondaryWeaponID} = bm_character:get_weapon_ids(Character), - - UpdatedWeaponIDs = {SecondaryWeaponID, PrimaryWeaponID}, - UpdatedCharacterStatistics = - sh_statistics:new(CharacterAttributes, UpdatedWeaponIDs, ArmorID), - UpdatedCharacter = - bm_character:set_statistics - ( - UpdatedCharacterStatistics, - bm_character:set_weapon_ids(UpdatedWeaponIDs, Character) - ), - - TimelineItem = bm_turn_result:new_character_switched_weapons(CharacterIX), - - DBQuery = - sh_db_query:update_indexed - ( - bm_battle:get_characters_field(), - CharacterIX, - [ - sh_db_query:set_field - ( - bm_character:get_weapons_field(), - UpdatedWeaponIDs - ), - sh_db_query:set_field - ( - bm_character:get_statistics_field(), - UpdatedCharacterStatistics - ) - ] - ), - - UpdatedData = bm_character_turn_data:set_character(UpdatedCharacter, Data), - - S0Update = bm_character_turn_update:set_data(UpdatedData, Update), - - bm_character_turn_update:add_to_timeline(TimelineItem, DBQuery, S0Update). - -%%%% MOVING %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec get_path_cost_and_destination - ( - bm_character_turn_data:type(), - list(bm_direction:type()) - ) - -> {non_neg_integer(), bm_location:type()}. -get_path_cost_and_destination (Data, Path) -> - Character = bm_character_turn_data:get_character(Data), - CharacterIX = bm_character_turn_data:get_character_ix(Data), - Battle = bm_character_turn_data:get_battle(Data), - Battlemap = bm_battle:get_battlemap(Battle), - - ForbiddenLocations = - array:foldl - ( - fun (IX, Char, Prev) -> - IsAlive = bm_character:get_is_alive(Char), - if - (IX == CharacterIX) -> Prev; - (not IsAlive) -> Prev; - true -> [bm_character:get_location(Char)|Prev] - end - end, - [], - bm_battle:get_characters(Battle) - ), - - {NewLocation, Cost} = - bm_movement:cross - ( - Battlemap, - ForbiddenLocations, - Path, - bm_character:get_location(Character) - ), - - {Cost, NewLocation}. - --spec assert_character_can_move - ( - bm_character_turn_data:type(), - non_neg_integer() - ) - -> 'ok'. -assert_character_can_move (Data, Cost) -> - Character = bm_character_turn_data:get_character(Data), - CharacterStatistics = bm_character:get_statistics(Character), - CharacterMovementPoints = - sh_statistics:get_movement_points(CharacterStatistics), - - true = (Cost =< CharacterMovementPoints), - - ok. - --spec commit_move - ( - bm_character_turn_update:type(), - list(bm_direction:type()), - bm_location:type() - ) - -> bm_character_turn_update:type(). -commit_move (Update, Path, NewLocation) -> - Data = bm_character_turn_update:get_data(Update), - Character = bm_character_turn_data:get_character(Data), - CharacterIX = bm_character_turn_data:get_character_ix(Data), - - UpdatedCharacter = bm_character:set_location(NewLocation, Character), - - UpdatedData = bm_character_turn_data:set_character(UpdatedCharacter, Data), - - TimelineItem = - bm_turn_result:new_character_moved(CharacterIX, Path, NewLocation), - - DBQuery = - sh_db_query:update_indexed - ( - bm_battle:get_characters_field(), - CharacterIX, - [ - sh_db_query:set_field - ( - bm_character:get_location_field(), - NewLocation - ) - ] - ), - - S0Update = - bm_character_turn_update:add_to_timeline - ( - TimelineItem, - DBQuery, - Update - ), - - bm_character_turn_update:set_data(UpdatedData, S0Update). - --spec handle_move - ( - bm_battle_action:type(), - bm_character_turn_update:type() - ) - -> bm_character_turn_update:type(). -handle_move (BattleAction, Update) -> - Data = bm_character_turn_update:get_data(Update), - Path = bm_battle_action:get_path(BattleAction), - - {PathCost, NewLocation} = get_path_cost_and_destination(Data, Path), - assert_character_can_move(Data, PathCost), - - commit_move(Update, Path, NewLocation). - -%%%% ATTACKING %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec handle_attack_sequence - ( - bm_character:type(), - bm_character:type(), - list(bm_attack:step()) - ) - -> {list(bm_attack:type()), non_neg_integer(), non_neg_integer()}. -handle_attack_sequence -( - Character, - TargetCharacter, - AttackSequence -) -> - AttackPlannedEffects = - lists:map - ( - fun (AttackStep) -> - bm_attack:get_description_of - ( - AttackStep, - Character, - TargetCharacter - ) - end, - AttackSequence - ), - - lists:foldl - ( - fun - ( - AttackEffectCandidate, - {AttackValidEffects, AttackerHealth, DefenderHealth} - ) -> - {AttackResult, NewAttackerHealth, NewDefenderHealth} = - bm_attack:apply_to_healths - ( - AttackEffectCandidate, - AttackerHealth, - DefenderHealth - ), - case AttackResult of - nothing -> {AttackValidEffects, AttackerHealth, DefenderHealth}; - _ -> - { - (AttackValidEffects ++ [AttackResult]), - NewAttackerHealth, - NewDefenderHealth - } - end - end, - { - [], - bm_character:get_current_health(Character), - bm_character:get_current_health(TargetCharacter) - }, - AttackPlannedEffects - ). - --spec get_attack_sequence - ( - bm_character:type(), - bm_character:type() - ) - -> list(bm_attack:step()). -get_attack_sequence (Character, TargetCharacter) -> - Range = - bm_location:dist - ( - bm_character:get_location(Character), - bm_character:get_location(TargetCharacter) - ), - - {AttackingWeaponID, _} = bm_character:get_weapon_ids(Character), - {DefendingWeaponID, _} = bm_character:get_weapon_ids(TargetCharacter), - - AttackingWeapon = sh_weapon:from_id(AttackingWeaponID), - DefendingWeapon = sh_weapon:from_id(DefendingWeaponID), - - bm_attack:get_sequence(Range, AttackingWeapon, DefendingWeapon). - - --spec handle_attack - ( - bm_battle_action:type(), - bm_character_turn_update:type() - ) - -> bm_character_turn_update:type(). -handle_attack (BattleAction, Update) -> - Data = bm_character_turn_update:get_data(Update), - Battle = bm_character_turn_data:get_battle(Data), - Character = bm_character_turn_data:get_character(Data), - CharacterIX = bm_character_turn_data:get_character_ix(Data), - TargetIX = bm_battle_action:get_target_ix(BattleAction), - TargetCharacter = bm_battle:get_character(TargetIX, Battle), - - true = bm_character:get_is_alive(TargetCharacter), - - AttackSequence = get_attack_sequence(Character, TargetCharacter), - - {AttackEffects, RemainingAttackerHealth, RemainingDefenderHealth} = - handle_attack_sequence(Character, TargetCharacter, AttackSequence), - - UpdatedCharacter = - bm_character:set_current_health(RemainingAttackerHealth, Character), - - UpdatedBattle = - bm_battle:set_character - ( - TargetIX, - bm_character:set_current_health - ( - RemainingDefenderHealth, - TargetCharacter - ), - Battle - ), - - S0Data = bm_character_turn_data:set_battle(UpdatedBattle, Data), - S1Data = bm_character_turn_data:set_character(UpdatedCharacter, S0Data), - - TimelineItem = - bm_turn_result:new_character_attacked - ( - CharacterIX, - TargetIX, - AttackEffects - ), - - DBQuery0 = - sh_db_query:update_indexed - ( - bm_battle:get_characters_field(), - TargetIX, - [ - sh_db_query:set_field - ( - bm_character:get_current_health_field(), - RemainingDefenderHealth - ) - ] - ), - - DBQuery1 = - sh_db_query:update_indexed - ( - bm_battle:get_characters_field(), - CharacterIX, - [ - sh_db_query:set_field - ( - bm_character:get_current_health_field(), - RemainingAttackerHealth - ) - ] - ), - - S0Update = - bm_character_turn_update:add_to_timeline - ( - TimelineItem, - DBQuery0, - Update - ), - - S1Update = - bm_character_turn_update:add_to_db - ( - DBQuery1, - S0Update - ), - - S2Update = bm_character_turn_update:set_data(S1Data, S1Update), - - S3Update = - bm_victory:handle_character_lost_health - ( - CharacterIX, - RemainingAttackerHealth, - S2Update - ), - - S4Update = - bm_victory:handle_character_lost_health - ( - TargetIX, - RemainingDefenderHealth, - S3Update - ), - - S4Update. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec handle -( - bm_battle_action:type(), - bm_character_turn_update:type() -) --> bm_character_turn_update:type(). -handle (BattleAction, Update) -> - case bm_battle_action:get_category(BattleAction) of - move -> handle_move(BattleAction, Update); - switch_weapon -> handle_switch_weapon(Update); - attack -> handle_attack(BattleAction, Update) - end. diff --git a/src/battlemap/game-logic/bm_victory.erl b/src/battlemap/game-logic/bm_victory.erl deleted file mode 100644 index 327920a..0000000 --- a/src/battlemap/game-logic/bm_victory.erl +++ /dev/null @@ -1,194 +0,0 @@ --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_is_defeated(true, 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_is_defeated_field(), - true - ) - ] - ), - 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. - - --spec actually_handle_character_lost_health - ( - non_neg_integer(), - bm_character_turn_update:type() - ) - -> bm_character_turn_update:type(). -actually_handle_character_lost_health (CharIX, 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, - 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, - Characters - ), - - case StillHasAliveChar of - true -> Update; - _ -> handle_player_defeat(CharacterPlayerIX, Update) - end - end. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% 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), - S1Data = bm_character_turn_data:clean_battle(Data), - S1Update = bm_character_turn_update:set_data(S1Data, Update), - - S2Update = actually_handle_character_lost_health(CharIX, S1Update), - - S2Data = bm_character_turn_update:get_data(S2Update), - S3Data = bm_character_turn_data:refresh_character(S2Data), - S3Update = bm_character_turn_update:set_data(S3Data, S2Update), - - S3Update. |