| summaryrefslogtreecommitdiff | 
diff options
| author | nsensfel <SpamShield0@noot-noot.org> | 2018-07-03 13:25:01 +0200 | 
|---|---|---|
| committer | nsensfel <SpamShield0@noot-noot.org> | 2018-07-03 13:25:01 +0200 | 
| commit | 0301c9220b98bde25458702ad4e1331dcd2b03a7 (patch) | |
| tree | 889df6b78f887f20223f0045d706a2e01f7bdc92 | |
| parent | dac4e74f55073a43401dc283c16ae941260889b9 (diff) | |
Still working on those victory conditions...
Somehow, I got a commander killing their attacker through a parry, yet
that led to the commander's player being eliminated. Both characters'
health seemed to have taken the correct values in the DB, though...
| -rw-r--r-- | Makefile | 4 | ||||
| -rw-r--r-- | src/battlemap/game-logic/bm_turn_actions.erl | 148 | ||||
| -rw-r--r-- | src/battlemap/game-logic/bm_victory.erl | 181 | 
3 files changed, 185 insertions, 148 deletions
| @@ -12,8 +12,8 @@ WWW_DIR ?= ${CURDIR}/www  LOG_DIR ?= ${CURDIR}/log  ## Local only? -#ERL_NAME_VS_SNAME ?= -name -ERL_NAME_VS_SNAME ?= -sname +ERL_NAME_VS_SNAME ?= -name +#ERL_NAME_VS_SNAME ?= -sname  ## Binaries  ERLC ?= erlc 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. | 


