summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battlemap/bm_shim.erl2
-rw-r--r--src/battlemap/game-logic/bm_next_turn.erl4
-rw-r--r--src/battlemap/query/bm_character_turn.erl2
-rw-r--r--src/battlemap/struct/bm_character.erl20
-rw-r--r--src/battlemap/struct/bm_player.erl32
-rw-r--r--src/battlemap/struct/bm_player_turn.erl42
6 files changed, 78 insertions, 24 deletions
diff --git a/src/battlemap/bm_shim.erl b/src/battlemap/bm_shim.erl
index 6dd8cf2..1ff8ac3 100644
--- a/src/battlemap/bm_shim.erl
+++ b/src/battlemap/bm_shim.erl
@@ -137,7 +137,7 @@ generate_random_battle () ->
%Battlemap = bm_battlemap:random(0, BattlemapWidth, BattlemapHeight),
Battlemap = bm_battlemap:from_list(0, 32, 32, demo_map()),
Characters = generate_random_characters(1, 8, 8, 0, Battlemap, [], []),
- PlayersAsList = [bm_player:new(0, <<"0">>), bm_player:new(1, <<"1">>)],
+ PlayersAsList = [bm_player:new(0, 8, <<"0">>), bm_player:new(1, 0, <<"1">>)],
{UsedWeaponIDs, UsedArmorIDs} =
lists:foldl
diff --git a/src/battlemap/game-logic/bm_next_turn.erl b/src/battlemap/game-logic/bm_next_turn.erl
index 74f3ea5..3cd63b4 100644
--- a/src/battlemap/game-logic/bm_next_turn.erl
+++ b/src/battlemap/game-logic/bm_next_turn.erl
@@ -22,7 +22,7 @@ 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(array:size(Players), CurrentPlayerTurn),
+ NextPlayerTurn = bm_player_turn:next(Players, CurrentPlayerTurn),
UpdatedBattle = bm_battle:set_current_player_turn(NextPlayerTurn, Battle),
@@ -86,7 +86,7 @@ activate_next_players_characters (Battle, NextPlayer) ->
[
sh_db_query:set_field
(
- bm_character:get_active_field(),
+ bm_character:get_is_active_field(),
true
)
]
diff --git a/src/battlemap/query/bm_character_turn.erl b/src/battlemap/query/bm_character_turn.erl
index ccd9182..74def12 100644
--- a/src/battlemap/query/bm_character_turn.erl
+++ b/src/battlemap/query/bm_character_turn.erl
@@ -119,7 +119,7 @@ finalize_character (Update) ->
(
bm_battle:get_characters_field(),
bm_character_turn_data:get_character_ix(Data),
- [ sh_db_query:set_field(bm_character:get_active_field(), false) ]
+ [ sh_db_query:set_field(bm_character:get_is_active_field(), false) ]
),
S0Update = bm_character_turn_update:set_data(FinalizedData, Update),
diff --git a/src/battlemap/struct/bm_character.erl b/src/battlemap/struct/bm_character.erl
index 41c0fb4..45b2361 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').
+-type rank() :: ('optional' | 'target' | 'commander' | 'defeated').
-record
(
@@ -22,7 +22,7 @@
armor_id :: sh_armor:id(),
location :: {non_neg_integer(), non_neg_integer()},
current_health :: integer(), %% Negative integers let us reverse attacks.
- active :: boolean()
+ is_active :: boolean()
}
).
@@ -62,7 +62,7 @@
get_weapons_field/0,
get_location_field/0,
get_current_health_field/0,
- get_active_field/0
+ get_is_active_field/0
]
).
@@ -148,9 +148,9 @@ get_is_alive (Char) ->
-spec get_is_active (type()) -> boolean().
get_is_active (Char) ->
(
- Char#character.active
- and
- get_is_alive(Char)
+ (Char#character.rank /= defeated)
+ and Char#character.is_active
+ and get_is_alive(Char)
).
-spec set_location
@@ -176,7 +176,7 @@ set_current_health (Health, Char) ->
set_is_active (Active, Char) ->
Char#character
{
- active = Active
+ is_active = Active
}.
-spec set_armor_id (sh_armor:id(), type()) -> type().
@@ -243,7 +243,7 @@ random (ID, OwnerID, BattlemapWidth, BattlemapHeight, ForbiddenLocations) ->
statistics = Statistics,
location = Location,
current_health = sh_statistics:get_health(Statistics),
- active = false
+ is_active = false
}.
-spec get_statistics_field() -> non_neg_integer().
@@ -254,5 +254,5 @@ get_weapons_field () -> #character.weapon_ids.
get_location_field () -> #character.location.
-spec get_current_health_field() -> non_neg_integer().
get_current_health_field () -> #character.current_health.
--spec get_active_field() -> non_neg_integer().
-get_active_field () -> #character.active.
+-spec get_is_active_field() -> non_neg_integer().
+get_is_active_field () -> #character.is_active.
diff --git a/src/battlemap/struct/bm_player.erl b/src/battlemap/struct/bm_player.erl
index 9be2a95..6e5338d 100644
--- a/src/battlemap/struct/bm_player.erl
+++ b/src/battlemap/struct/bm_player.erl
@@ -11,7 +11,9 @@
{
ix :: non_neg_integer(),
id :: id(),
- timeline :: list(any())
+ character_ix :: non_neg_integer(),
+ timeline :: list(any()),
+ is_active :: boolean()
}
).
@@ -26,18 +28,24 @@
[
get_id/1,
get_index/1,
+ get_character_index/1,
get_timeline/1,
+
+ get_is_active/1,
+ set_is_active/2,
+
add_to_timeline/2,
reset_timeline/1,
- get_timeline_field/0
+ get_timeline_field/0,
+ get_is_active_field/0
]
).
-export
(
[
- new/2
+ new/3
]
).
@@ -54,9 +62,18 @@ get_id (Player) -> Player#player.id.
-spec get_index (type()) -> non_neg_integer().
get_index (Player) -> Player#player.ix.
+-spec get_character_index (type()) -> non_neg_integer().
+get_character_index (Player) -> Player#player.character_ix.
+
-spec get_timeline (type()) -> list(any()).
get_timeline (Player) -> Player#player.timeline.
+-spec get_is_active (type()) -> boolean().
+get_is_active (Player) -> Player#player.is_active.
+
+-spec set_is_active (boolean(), type()) -> type().
+set_is_active (Val, Player) -> Player#player{ is_active = Val }.
+
-spec add_to_timeline (list(any()), type()) -> type().
add_to_timeline (NewEvents, Player) ->
OldTimeline = Player#player.timeline,
@@ -69,14 +86,19 @@ add_to_timeline (NewEvents, Player) ->
-spec reset_timeline (type()) -> type().
reset_timeline (Player) -> Player#player{ timeline = [] }.
--spec new (non_neg_integer(), id()) -> type().
-new (IX, ID) ->
+-spec new (non_neg_integer(), non_neg_integer(), id()) -> type().
+new (IX, CharacterIX, ID) ->
#player
{
ix = IX,
+ character_ix = CharacterIX,
id = ID,
+ is_active = true,
timeline = []
}.
-spec get_timeline_field () -> non_neg_integer().
get_timeline_field () -> #player.timeline.
+
+-spec get_is_active_field () -> non_neg_integer().
+get_is_active_field () -> #player.is_active.
diff --git a/src/battlemap/struct/bm_player_turn.erl b/src/battlemap/struct/bm_player_turn.erl
index 5f2c074..0d0c98a 100644
--- a/src/battlemap/struct/bm_player_turn.erl
+++ b/src/battlemap/struct/bm_player_turn.erl
@@ -40,6 +40,30 @@
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec next_valid_player
+ (
+ non_neg_integer(),
+ array:array(bm_player:type()),
+ non_neg_integer(),
+ non_neg_integer()
+ ) -> non_neg_integer().
+next_valid_player (StartingPoint, _Players, _PlayersCount, StartingPoint) ->
+ StartingPoint;
+next_valid_player (CandidateIX, Players, PlayersCount, StartingPoint) ->
+ Candidate = array:get(CandidateIX, Players),
+
+ case bm_player:get_is_active(Candidate) of
+ true -> CandidateIX;
+ _ ->
+ next_valid_player
+ (
+ ((CandidateIX + 1) rem PlayersCount),
+ Players,
+ PlayersCount,
+ StartingPoint
+ )
+ end.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -58,15 +82,23 @@ get_number (PlayerTurn) -> PlayerTurn#player_turn.number.
-spec get_player_ix (type()) -> non_neg_integer().
get_player_ix (PlayerTurn) -> PlayerTurn#player_turn.player_ix.
--spec next (non_neg_integer(), type()) -> type().
-next (PlayersCount, CurrentPlayerTurn) ->
+-spec next (array:array(bm_player:type()), type()) -> type().
+next (Players, CurrentPlayerTurn) ->
CurrentPlayerIX = CurrentPlayerTurn#player_turn.player_ix,
CurrentTurnNumber = CurrentPlayerTurn#player_turn.number,
- NextPlayerIX = ((CurrentPlayerIX + 1) rem PlayersCount),
+ NextPlayerIX =
+ next_valid_player
+ (
+ CurrentPlayerIX,
+ Players,
+ array:size(Players),
+ CurrentPlayerIX
+ ),
+
NextTurnNumber =
- case NextPlayerIX of
- 0 -> (CurrentTurnNumber + 1);
+ case (NextPlayerIX < CurrentPlayerIX) of
+ true -> (CurrentTurnNumber + 1);
_ -> CurrentTurnNumber
end,