summaryrefslogtreecommitdiff |
diff options
author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2018-07-01 22:19:58 +0200 |
---|---|---|
committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2018-07-01 22:19:58 +0200 |
commit | 5f8694f2ecae5084f9ad1332e69403f3f79de4bc (patch) | |
tree | a4357e1a871c79099f44c46a457dd8e03d3892de /src | |
parent | 47ff1d1dc4eb3d7fb7434ec0c27ea2272e1f00fe (diff) |
Preparing for player defeats...
Diffstat (limited to 'src')
-rw-r--r-- | src/battlemap/bm_shim.erl | 2 | ||||
-rw-r--r-- | src/battlemap/game-logic/bm_next_turn.erl | 4 | ||||
-rw-r--r-- | src/battlemap/query/bm_character_turn.erl | 2 | ||||
-rw-r--r-- | src/battlemap/struct/bm_character.erl | 20 | ||||
-rw-r--r-- | src/battlemap/struct/bm_player.erl | 32 | ||||
-rw-r--r-- | src/battlemap/struct/bm_player_turn.erl | 42 |
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, |