| 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 | |
| parent | 47ff1d1dc4eb3d7fb7434ec0c27ea2272e1f00fe (diff) | |
Preparing for player defeats...
| -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, | 


