summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornsensfel <SpamShield0@noot-noot.org>2018-07-03 13:25:01 +0200
committernsensfel <SpamShield0@noot-noot.org>2018-07-03 13:25:01 +0200
commit0301c9220b98bde25458702ad4e1331dcd2b03a7 (patch)
tree889df6b78f887f20223f0045d706a2e01f7bdc92 /src/battlemap/game-logic
parentdac4e74f55073a43401dc283c16ae941260889b9 (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...
Diffstat (limited to 'src/battlemap/game-logic')
-rw-r--r--src/battlemap/game-logic/bm_turn_actions.erl148
-rw-r--r--src/battlemap/game-logic/bm_victory.erl181
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.