summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/battlemap')
-rw-r--r--src/battlemap/game-logic/bm_turn_actions.erl2
-rw-r--r--src/battlemap/game-logic/bm_victory.erl10
-rw-r--r--src/battlemap/reply/bm_add_char.erl4
-rw-r--r--src/battlemap/struct/bm_character.erl33
4 files changed, 35 insertions, 14 deletions
diff --git a/src/battlemap/game-logic/bm_turn_actions.erl b/src/battlemap/game-logic/bm_turn_actions.erl
index 4bb6d0b..c3e091a 100644
--- a/src/battlemap/game-logic/bm_turn_actions.erl
+++ b/src/battlemap/game-logic/bm_turn_actions.erl
@@ -278,6 +278,8 @@ handle_attack (BattleAction, Update) ->
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} =
diff --git a/src/battlemap/game-logic/bm_victory.erl b/src/battlemap/game-logic/bm_victory.erl
index 59be66b..3531739 100644
--- a/src/battlemap/game-logic/bm_victory.erl
+++ b/src/battlemap/game-logic/bm_victory.erl
@@ -29,7 +29,7 @@ mark_players_characters_as_defeated (PlayerIX, Characters) ->
(bm_character:get_player_index(Character) == PlayerIX)
end,
fun (Character) ->
- bm_character:set_rank(defeated, Character)
+ bm_character:set_is_defeated(true, Character)
end,
Characters
).
@@ -50,8 +50,8 @@ add_db_query_to_mark_character_as_defeated (IX, Update) ->
[
sh_db_query:set_field
(
- bm_character:get_rank_field(),
- defeated
+ bm_character:get_is_defeated_field(),
+ true
)
]
),
@@ -175,7 +175,5 @@ handle_character_lost_health (CharIX, _Health, Update) ->
case StillHasAliveChar of
true -> Update;
_ -> handle_player_defeat(CharacterPlayerIX, Update)
- end;
-
- defeated -> Update
+ end
end.
diff --git a/src/battlemap/reply/bm_add_char.erl b/src/battlemap/reply/bm_add_char.erl
index a8d905f..4dab700 100644
--- a/src/battlemap/reply/bm_add_char.erl
+++ b/src/battlemap/reply/bm_add_char.erl
@@ -17,8 +17,7 @@ rank_to_string (Rank) ->
case Rank of
optional -> <<"o">>;
target -> <<"t">>;
- commander -> <<"c">>;
- defeated -> <<"d">>
+ commander -> <<"c">>
end.
-spec attributes_as_json
@@ -75,6 +74,7 @@ generate (IX, Character, PlayerIX) ->
and (CharacterPlayerIX == PlayerIX)
)
},
+ {<<"dea">>, bm_character:get_is_defeated(Character)},
{<<"att">>, attributes_as_json(Attributes)},
{<<"awp">>, ActiveWeapon},
{<<"swp">>, SecondaryWeapon},
diff --git a/src/battlemap/struct/bm_character.erl b/src/battlemap/struct/bm_character.erl
index 7dec927..b0e19ed 100644
--- a/src/battlemap/struct/bm_character.erl
+++ b/src/battlemap/struct/bm_character.erl
@@ -4,7 +4,7 @@
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-type id() :: non_neg_integer().
--type rank() :: ('optional' | 'target' | 'commander' | 'defeated').
+-type rank() :: ('optional' | 'target' | 'commander').
-record
(
@@ -22,7 +22,8 @@
armor_id :: sh_armor:id(),
location :: {non_neg_integer(), non_neg_integer()},
current_health :: integer(), %% Negative integers let us reverse attacks.
- is_active :: boolean()
+ is_active :: boolean(),
+ is_defeated :: boolean()
}
).
@@ -50,6 +51,7 @@
get_current_health/1,
get_is_alive/1,
get_is_active/1,
+ get_is_defeated/1,
set_rank/2,
set_weapon_ids/2,
@@ -58,13 +60,15 @@
set_location/2,
set_current_health/2,
set_is_active/2,
+ set_is_defeated/2,
get_rank_field/0,
get_statistics_field/0,
get_weapons_field/0,
get_location_field/0,
get_current_health_field/0,
- get_is_active_field/0
+ get_is_active_field/0,
+ get_is_defeated_field/0
]
).
@@ -145,16 +149,22 @@ get_current_health (Char) -> Char#character.current_health.
-spec get_is_alive (type()) -> boolean().
get_is_alive (Char) ->
- (Char#character.current_health > 0).
+ (
+ (not Char#character.is_defeated)
+ and (Char#character.current_health > 0)
+ ).
-spec get_is_active (type()) -> boolean().
get_is_active (Char) ->
(
- (Char#character.rank /= defeated)
+ (not Char#character.is_defeated)
and Char#character.is_active
and get_is_alive(Char)
).
+-spec get_is_defeated (type()) -> boolean().
+get_is_defeated (Char) -> Char#character.is_defeated.
+
-spec set_rank (rank(), type()) -> type().
set_rank (Rank, Char) ->
Char#character
@@ -188,6 +198,13 @@ set_is_active (Active, Char) ->
is_active = Active
}.
+-spec set_is_defeated (boolean(), type()) -> type().
+set_is_defeated (Defeated, Char) ->
+ Char#character
+ {
+ is_defeated = Defeated
+ }.
+
-spec set_armor_id (sh_armor:id(), type()) -> type().
set_armor_id (ArmorID, Char) ->
Char#character
@@ -242,6 +259,7 @@ random (ID, PlayerIX, BattlemapWidth, BattlemapHeight, ForbiddenLocations) ->
rank =
if
((ID rem 8) == 0) -> commander;
+ ((ID rem 3) == 0) -> target;
true -> optional
end,
icon = IDAsBinaryString,
@@ -252,7 +270,8 @@ random (ID, PlayerIX, BattlemapWidth, BattlemapHeight, ForbiddenLocations) ->
statistics = Statistics,
location = Location,
current_health = sh_statistics:get_health(Statistics),
- is_active = false
+ is_active = false,
+ is_defeated = false
}.
-spec get_rank_field() -> non_neg_integer().
@@ -267,3 +286,5 @@ get_location_field () -> #character.location.
get_current_health_field () -> #character.current_health.
-spec get_is_active_field() -> non_neg_integer().
get_is_active_field () -> #character.is_active.
+-spec get_is_defeated_field() -> non_neg_integer().
+get_is_defeated_field () -> #character.is_defeated.