| summaryrefslogtreecommitdiff | 
diff options
22 files changed, 644 insertions, 488 deletions
| diff --git a/src/battle/game-logic/btl_next_turn.erl b/src/battle/game-logic/btl_next_turn.erl index a0ea499..ed6eadd 100644 --- a/src/battle/game-logic/btl_next_turn.erl +++ b/src/battle/game-logic/btl_next_turn.erl @@ -50,7 +50,7 @@ reset_next_player_timeline (Battle) ->        ataxic:update_field        (           btl_battle:get_players_field(), -         ataxic_sugar:update_array_cell +         ataxic_sugar:update_orddict_element           (              NextPlayerIX,              ataxic:update_field @@ -70,15 +70,36 @@ activate_next_players_characters (Battle, NextPlayer) ->     NextPlayerIX = btl_player:get_index(NextPlayer),     Characters = btl_battle:get_characters(Battle), -   {UpdatedCharacters, ModifiedIXs} = -      shr_array_util:mapiff +   {UpdatedCharacters, AtaxicUpdates} = +      orddict:fold        ( -         fun (Character) -> -            (btl_character:get_player_index(Character) == NextPlayerIX) -         end, -         fun (Character) -> -            btl_character:set_is_active(true, Character) +         fun (IX, Character, {Prev, Updates}) -> +            case (btl_character:get_player_index(Character) == NextPlayerIX) of +               true -> +                  { +                     orddict:store +                     ( +                        IX, +                        btl_character:set_is_active(true, Character), +                        Prev +                     ), +                     [ +                        ataxic_sugar:update_orddict_element +                        ( +                           IX, +                           ataxic:update_field +                           ( +                              btl_character:get_is_active_field(), +                              ataxic:constant(true) +                           ) +                        ) +                     ] +                  }; + +               false -> {Prev, Updates} +            end           end, +         {Characters, []},           Characters        ), @@ -86,24 +107,7 @@ activate_next_players_characters (Battle, NextPlayer) ->        ataxic:update_field        (           btl_battle:get_characters_field(), -         ataxic:sequence -         ( -            lists:map -            ( -               fun (IX) -> -                  ataxic_sugar:update_array_cell -                  ( -                     IX, -                     ataxic:update_field -                     ( -                        btl_character:get_is_active_field(), -                        ataxic:constant(true) -                     ) -                  ) -               end, -               ModifiedIXs -            ) -         ) +         ataxic:sequence(AtaxicUpdates)        ),     UpdatedBattle = btl_battle:set_characters(UpdatedCharacters, Battle), @@ -154,7 +158,16 @@ requires_update (Update) ->     Battle = btl_character_turn_data:get_battle(Data),     Characters = btl_battle:get_characters(Battle), -   shr_array_util:none(fun btl_character:get_is_active/1, Characters). +   (not +      (lists:any +         ( +            fun ({_IX, Char}) -> +               btl_character:get_is_active(Char) +            end, +            orddict:to_list(Characters) +         ) +      ) +   ).  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/src/battle/game-logic/btl_turn_actions.erl b/src/battle/game-logic/btl_turn_actions.erl index ee39ba1..4e469f1 100644 --- a/src/battle/game-logic/btl_turn_actions.erl +++ b/src/battle/game-logic/btl_turn_actions.erl @@ -46,7 +46,7 @@ mod_current_health (CurrentMaxHealth, PreviousMaxHealth, Update) ->        ataxic:update_field        (           btl_battle:get_characters_field(), -         ataxic_sugar:update_array_cell +         ataxic_sugar:update_orddict_element           (              CharacterIX,              ataxic:update_field diff --git a/src/battle/game-logic/btl_turn_actions_attack.erl b/src/battle/game-logic/btl_turn_actions_attack.erl index 9d1cd87..52dd3fb 100644 --- a/src/battle/game-logic/btl_turn_actions_attack.erl +++ b/src/battle/game-logic/btl_turn_actions_attack.erl @@ -169,7 +169,7 @@ handle (BattleAction, Update) ->        ataxic:update_field        (           btl_battle:get_characters_field(), -         ataxic_sugar:update_array_cell +         ataxic_sugar:update_orddict_element           (              TargetIX,              ataxic:update_field @@ -184,7 +184,7 @@ handle (BattleAction, Update) ->        ataxic:update_field        (           btl_battle:get_characters_field(), -         ataxic_sugar:update_array_cell +         ataxic_sugar:update_orddict_element           (              CharacterIX,              ataxic:update_field diff --git a/src/battle/game-logic/btl_turn_actions_move.erl b/src/battle/game-logic/btl_turn_actions_move.erl index f94f8aa..80e5170 100644 --- a/src/battle/game-logic/btl_turn_actions_move.erl +++ b/src/battle/game-logic/btl_turn_actions_move.erl @@ -29,17 +29,18 @@ get_path_cost_and_destination (Data, Path) ->     Map = btl_battle:get_map(Battle),     ForbiddenLocations = -      array:foldl +      orddict:fold        (           fun (IX, Char, Prev) ->              IsAlive = btl_character:get_is_alive(Char),              if                 (IX == CharacterIX) -> Prev;                 (not IsAlive) -> Prev; -               true -> [btl_character:get_location(Char)|Prev] +               true -> +                  ordsets:add_element(btl_character:get_location(Char), Prev)              end           end, -         [], +         ordsets:new(),           btl_battle:get_characters(Battle)        ), @@ -97,12 +98,12 @@ commit_move (PreviousCurrentData, Update, Path, NewLocation) ->        ataxic:update_field        (           btl_battle:get_characters_field(), -         ataxic_sugar:update_array_cell +         ataxic_sugar:update_orddict_element           (              CharacterIX,              ataxic:update_field              ( -               btl_character:get_locatiupdate_field(), +               btl_character:get_location_field(),                 ataxic:constant(NewLocation)              )           ) diff --git a/src/battle/game-logic/btl_turn_actions_switch_weapon.erl b/src/battle/game-logic/btl_turn_actions_switch_weapon.erl index 264bcb5..e32a283 100644 --- a/src/battle/game-logic/btl_turn_actions_switch_weapon.erl +++ b/src/battle/game-logic/btl_turn_actions_switch_weapon.erl @@ -54,7 +54,7 @@ handle (Update) ->        ataxic:update_field        (           btl_battle:get_characters_field(), -         ataxic_sugar:update_array_cell +         ataxic_sugar:update_orddict_element           (              CharacterIX,              ataxic:update_field diff --git a/src/battle/game-logic/btl_victory.erl b/src/battle/game-logic/btl_victory.erl index 42a5594..089af81 100644 --- a/src/battle/game-logic/btl_victory.erl +++ b/src/battle/game-logic/btl_victory.erl @@ -20,45 +20,45 @@  -spec mark_players_characters_as_defeated     (        non_neg_integer(), -      array:array(btl_character:type()) -   ) -> {array:array(btl_character:type()), list(non_neg_integer())}. +      orddict:orddict(non_neg_integer(), btl_character:type()) +   ) +   -> +   { +      orddict:orddict(non_neg_integer(), btl_character:type()), +      list(ataxic:basic()) +   }.  mark_players_characters_as_defeated (PlayerIX, Characters) -> -   shr_array_util:mapiff +   orddict:fold     ( -      fun (Character) -> -         (btl_character:get_player_index(Character) == PlayerIX) -      end, -      fun (Character) -> -         btl_character:set_is_defeated(true, Character) +      fun (IX, Character, {Dict, Updates}) -> +         case (btl_character:get_player_index(Character) == PlayerIX) of +            false -> {Dict, Updates}; +            true -> +               { +                  orddict:store +                  ( +                     IX, +                     btl_character:set_is_defeated(true, Character), +                     Dict +                  ), +                  [ +                     ataxic_sugar:update_orddict_element +                     ( +                        IX, +                        ataxic:update_field +                        ( +                           btl_character:get_is_defeated_field(), +                           ataxic:constant(true) +                        ) +                     ) +                  ] +               } +         end        end, +      {Characters, []},        Characters     ). --spec add_db_query_to_mark_character_as_defeated -   ( -      non_neg_integer(), -      btl_character_turn_update:type() -   ) -   -> btl_character_turn_update:type(). -add_db_query_to_mark_character_as_defeated (IX, Update) -> -   btl_character_turn_update:add_to_db -   ( -      ataxic:update_field -      ( -         btl_battle:get_characters_field(), -         ataxic_sugar:update_array_cell -         ( -            IX, -            ataxic:update_field -            ( -               btl_character:get_is_defeated_field(), -               ataxic:constant(true) -            ) -         ) -      ), -      Update -   ). -  -spec handle_player_defeat     (        non_neg_integer(), @@ -72,48 +72,59 @@ handle_player_defeat (PlayerIX, Update) ->     %% FIXME [FUNCTION: battle][MEDIUM]: The controlled character might slip     %% through. -   {UpdatedCharacters, ModifiedIXs} = +   {UpdatedCharacters, AtaxicUpdates} =        mark_players_characters_as_defeated(PlayerIX, Characters), -   S1Update = -      lists:foldl +   S0Battle = btl_battle:set_characters(UpdatedCharacters, Battle), +   S1Battle = +      btl_battle:set_player        ( -         fun add_db_query_to_mark_character_as_defeated/2, -         Update, -         ModifiedIXs +         PlayerIX, +         btl_player:set_is_active +         ( +            false, +            btl_battle:get_player(PlayerIX, S0Battle) +         ), +         S0Battle        ), -   %% TODO [FUNCTION: battle][MEDIUM]: Battle.player[PlayerIX].is_active <- -   %% false - -   UpdatedBattle = btl_battle:set_characters(UpdatedCharacters, Battle), -   UpdatedData = btl_character_turn_data:set_battle(UpdatedBattle, Data), -   S2Update = btl_character_turn_update:set_data(UpdatedData, S1Update), +   UpdatedData = btl_character_turn_data:set_battle(S1Battle, Data), +   S0Update = btl_character_turn_update:set_data(UpdatedData, Update),     DBQuery = -      ataxic:update_field +      ataxic:sequence        ( -         btl_battle:get_players_field(), -         ataxic_sugar:update_array_cell -         ( -            PlayerIX, +         [              ataxic:update_field              ( -               btl_player:get_is_active_field(), -               ataxic:constant(false) +               btl_battle:get_players_field(), +               ataxic_sugar:update_orddict_element +               ( +                  PlayerIX, +                  ataxic:update_field +                  ( +                     btl_player:get_is_active_field(), +                     ataxic:constant(false) +                  ) +               ) +            ), +            ataxic:update_field +            ( +               btl_battle:get_characters_field(), +               ataxic:sequence(AtaxicUpdates)              ) -         ) +         ]        ), -   S3Update = +   S1Update =        btl_character_turn_update:add_to_timeline        (           btl_turn_result:new_player_lost(PlayerIX),           DBQuery, -         S2Update +         S0Update        ), -   S3Update. +   S1Update.  -spec actually_handle_character_lost_health @@ -133,16 +144,16 @@ actually_handle_character_lost_health (CharIX, Update) ->        optional ->           %% Let's not assume there is a commander           StillHasAliveChar = -            shr_array_util:any_indexed +            lists:any              ( -               fun (IX, Char) -> +               fun ({IX, Char}) ->                    (                       (CharacterPlayerIX == btl_character:get_player_index(Char))                       and (IX /= CharIX)                       and btl_character:get_is_alive(Char)                    )                 end, -               Characters +               orddict:to_list(Characters)              ),           case StillHasAliveChar of @@ -154,17 +165,16 @@ actually_handle_character_lost_health (CharIX, Update) ->        target ->           StillHasAliveChar = -            shr_array_util:any_indexed +            lists:any              ( -               fun (IX, Char) -> +               fun ({IX, Char}) ->                    (                       (CharacterPlayerIX == btl_character:get_player_index(Char))                       and (IX /= CharIX)                       and btl_character:get_is_alive(Char) -                     and (btl_character:get_rank(Char) == target)                    )                 end, -               Characters +               orddict:to_list(Characters)              ),           case StillHasAliveChar of diff --git a/src/battle/query/btl_character_turn.erl b/src/battle/query/btl_character_turn.erl index 76613ba..32ec9be 100644 --- a/src/battle/query/btl_character_turn.erl +++ b/src/battle/query/btl_character_turn.erl @@ -85,7 +85,7 @@ assert_user_owns_played_character (Data, Request) ->     Players = btl_battle:get_players(Battle),     Character = btl_character_turn_data:get_character(Data),     CharacterPlayerIX = btl_character:get_player_index(Character), -   CharacterPlayer = array:get(CharacterPlayerIX, Players), +   CharacterPlayer = orddict:fetch(CharacterPlayerIX, Players),     CharacterPlayerID = btl_player:get_id(CharacterPlayer),     true = (PlayerID == CharacterPlayerID), @@ -130,7 +130,7 @@ finalize_character (Update) ->        ataxic:update_field        (           btl_battle:get_characters_field(), -         ataxic_sugar:update_array_cell +         ataxic_sugar:update_orddict_element           (              btl_character_turn_data:get_character_ix(Data),              ataxic:update_field @@ -182,7 +182,7 @@ update_timeline (Update) ->        ataxic:update_field        (           btl_battle:get_players_field(), -         ataxic_sugar:update_array_cell +         ataxic_sugar:update_orddict_element           (              PlayerIX,              ataxic:update_field diff --git a/src/battle/query/btl_load.erl b/src/battle/query/btl_load.erl index 64e9354..7c7d4ab 100644 --- a/src/battle/query/btl_load.erl +++ b/src/battle/query/btl_load.erl @@ -85,13 +85,13 @@ generate_reply (QueryState, Input) ->     Battle = QueryState#query_state.battle,     Players = btl_battle:get_players(Battle), -   PlayerIX = -      shr_array_util:first +   {value, {PlayerIX, _Player}} = +      shr_lists_util:search        ( -         fun (Player) -> +         fun ({_PlayerIX, Player}) ->              (btl_player:get_id(Player) == PlayerID)           end, -         Players +         orddict:to_list(Players)        ),     true = (PlayerIX >= 0), @@ -105,15 +105,21 @@ generate_reply (QueryState, Input) ->     SetMap = btl_set_map:generate(btl_battle:get_map(Battle)),     AddCharList = -      array:sparse_to_list +      lists:map +      ( +         fun ({IX, Character}) -> +            btl_add_char:generate(IX, Character, PlayerIX) +         end, +         orddict:to_list(btl_battle:get_characters(Battle)) +      ), + +   AddPortraitList = +      lists:map        ( -         array:map -         ( -            fun (IX, Character) -> -               btl_add_char:generate(IX, Character, PlayerIX) -            end, -            btl_battle:get_characters(Battle) -         ) +         fun (PortraitID) -> +            btl_add_portrait:generate(shr_portrait:from_id(PortraitID)) +         end, +         ordsets:to_list(btl_battle:get_used_portrait_ids(Battle))        ),     AddWeaponList = @@ -122,7 +128,7 @@ generate_reply (QueryState, Input) ->           fun (WeaponID) ->              btl_add_weapon:generate(shr_weapon:from_id(WeaponID))           end, -         btl_battle:get_used_weapon_ids(Battle) +         ordsets:to_list(btl_battle:get_used_weapon_ids(Battle))        ),     AddArmorList = @@ -131,7 +137,7 @@ generate_reply (QueryState, Input) ->           fun (ArmorID) ->              btl_add_armor:generate(shr_armor:from_id(ArmorID))           end, -         btl_battle:get_used_armor_ids(Battle) +         ordsets:to_list(btl_battle:get_used_armor_ids(Battle))        ),     AddTileList = @@ -140,16 +146,18 @@ generate_reply (QueryState, Input) ->           fun (TileClassID) ->              btl_add_tile:generate(shr_tile:from_class_id(TileClassID))           end, -         btl_battle:get_used_tile_ids(Battle) +         ordsets:to_list(btl_battle:get_used_tile_ids(Battle))        ),     OutputList =        (           AddTileList           ++ [SetTimeline, SetMap | AddWeaponList] +         ++ AddPortraitList           ++ AddArmorList           ++ AddCharList        ), +     Output = jiffy:encode(OutputList),     Output. diff --git a/src/battle/reply/btl_set_map.erl b/src/battle/reply/btl_set_map.erl index e4a638e..3be6985 100644 --- a/src/battle/reply/btl_set_map.erl +++ b/src/battle/reply/btl_set_map.erl @@ -28,7 +28,7 @@ generate (Map) ->              lists:map              (                 fun shr_tile:instance_to_binary_list/1, -               array:sparse_to_list(btl_map:get_tile_instances(Map)) +               tuple_to_list(btl_map:get_tile_instances(Map))              )           }        ] diff --git a/src/battle/struct/btl_battle.erl b/src/battle/struct/btl_battle.erl index 5cc7bc3..b2bd4f1 100644 --- a/src/battle/struct/btl_battle.erl +++ b/src/battle/struct/btl_battle.erl @@ -3,7 +3,7 @@  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --type id() :: binary(). +-type id() :: ataxia_id:type().  -record  ( @@ -12,10 +12,11 @@        id :: id(),        used_armor_ids :: ordsets:ordset(shr_armor:id()),        used_weapon_ids :: ordsets:ordset(shr_weapon:id()), +      used_portrait_ids :: ordsets:ordset(shr_portrait:id()),        used_tile_ids :: ordsets:ordset(shr_tile:class_id()),        map :: btl_map:type(), -      characters :: array:array(btl_character:type()), -      players :: array:array(btl_player:type()), +      characters :: orddict:orddict(non_neg_integer(), btl_character:type()), +      players :: orddict:orddict(non_neg_integer(), btl_player:type()),        current_player_turn :: btl_player_turn:type()     }  ). @@ -32,6 +33,7 @@  (     [        get_id/1, +      get_used_portrait_ids/1,        get_used_weapon_ids/1,        get_used_armor_ids/1,        get_used_tile_ids/1, @@ -43,13 +45,21 @@        get_current_player_turn/1,        get_encoded_last_turns_effects/1, +      set_id/2,        set_map/2, +      set_used_portrait_ids/2, +      set_used_weapon_ids/2, +      set_used_armor_ids/2,        set_characters/2,        set_character/3,        set_players/2,        set_player/3,        set_current_player_turn/2, +      get_id_field/0, +      get_used_armor_ids_field/0, +      get_used_weapon_ids_field/0, +      get_used_portrait_ids_field/0,        get_characters_field/0,        get_players_field/0,        get_current_player_turn_field/0 @@ -59,7 +69,7 @@  -export  (     [ -      new/7 +      new/1     ]  ). @@ -67,7 +77,7 @@  %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  get_all_timelines (Result, CurrentIndex, EndPoint, ArraySize, Players) -> -   Player = array:get(CurrentIndex, Players), +   Player = orddict:fetch(CurrentIndex, Players),     Timeline = btl_player:get_timeline(Player),     NextIndex = ((CurrentIndex + 1) rem ArraySize),     NextResult = (Timeline ++ Result), @@ -79,6 +89,7 @@ get_all_timelines (Result, CurrentIndex, EndPoint, ArraySize, Players) ->           get_all_timelines(NextResult, NextIndex, EndPoint, ArraySize, Players)     end. +  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -86,6 +97,9 @@ get_all_timelines (Result, CurrentIndex, EndPoint, ArraySize, Players) ->  -spec get_id (type()) -> id().  get_id (Battle) -> Battle#battle.id. +-spec get_used_portrait_ids (type()) -> ordsets:ordset(shr_portrait:id()). +get_used_portrait_ids (Battle) -> Battle#battle.used_portrait_ids. +  -spec get_used_weapon_ids (type()) -> ordsets:ordset(shr_weapon:id()).  get_used_weapon_ids (Battle) -> Battle#battle.used_weapon_ids. @@ -98,20 +112,28 @@ get_used_tile_ids (Battle) -> Battle#battle.used_tile_ids.  -spec get_map (type()) -> btl_map:type().  get_map (Battle) -> Battle#battle.map. --spec get_characters (type()) -> array:array(btl_character:type()). +-spec get_characters +   ( +      type() +   ) +   -> orddict:orddict(non_neg_integer(), btl_character:type()).  get_characters (Battle) -> Battle#battle.characters.  -spec get_character (non_neg_integer(), type()) -> btl_character:type().  get_character (IX, Battle) -> -   array:get(IX, Battle#battle.characters). +   orddict:fetch(IX, Battle#battle.characters). --spec get_players (type()) -> array:array(btl_player:type()). +-spec get_players +   ( +      type() +   ) +   -> orddict:orddict(non_neg_integer(), btl_player:type()).  get_players (Battle) ->     Battle#battle.players.  -spec get_player (non_neg_integer(), type()) -> btl_player:type().  get_player (IX, Battle) -> -   array:get(IX, Battle#battle.players). +   orddict:fetch(IX, Battle#battle.players).  -spec get_current_player_turn (type()) -> btl_player_turn:type().  get_current_player_turn (Battle) -> @@ -123,10 +145,17 @@ get_encoded_last_turns_effects (Battle) ->     Players = Battle#battle.players,     CurrentPlayerIX = btl_player_turn:get_player_ix(CurrentPlayerTurn), -   PlayersCount = array:size(Players), +   PlayersCount = orddict:size(Players),     StartingPoint = ((CurrentPlayerIX + 1) rem PlayersCount),     get_all_timelines([], StartingPoint, CurrentPlayerIX, PlayersCount, Players). +-spec set_id (id(), type()) -> type(). +set_id (ID, Battle) -> +   Battle#battle +   { +      id = ID +   }. +  -spec set_map (btl_map:type(), type()) -> type().  set_map (Map, Battle) ->     Battle#battle @@ -134,7 +163,12 @@ set_map (Map, Battle) ->        map = Map     }. --spec set_characters (array:array(btl_character:type()), type()) -> type(). +-spec set_characters +   ( +      orddict:orddict(non_neg_integer(), btl_character:type()), +      type() +   ) +   -> type().  set_characters (Characters, Battle) ->     Battle#battle     { @@ -145,33 +179,62 @@ set_characters (Characters, Battle) ->  set_character (IX, Character, Battle) ->     Battle#battle     { -      characters = -         array:set -         ( -            IX, -            Character, -            Battle#battle.characters -         ) +      characters = orddict:store(IX, Character, Battle#battle.characters)     }. --spec set_players (array:array(btl_player:type()), type()) -> type(). +-spec set_players +   ( +      orddict:orddict(non_neg_integer(), btl_player:type()), +      type() +   ) +   -> type().  set_players (Players, Battle) ->     Battle#battle     {        players = Players     }. +-spec set_used_portrait_ids +   ( +      ordsets:ordset(shr_portrait:id()), +      type() +   ) +   -> type(). +set_used_portrait_ids (UPIDs, Battle) -> +   Battle#battle +   { +      used_portrait_ids = UPIDs +   }. + +-spec set_used_weapon_ids +   ( +      ordsets:ordset(shr_weapon:id()), +      type() +   ) +   -> type(). +set_used_weapon_ids (UPIDs, Battle) -> +   Battle#battle +   { +      used_weapon_ids = UPIDs +   }. + +-spec set_used_armor_ids +   ( +      ordsets:ordset(shr_armor:id()), +      type() +   ) +   -> type(). +set_used_armor_ids (UPIDs, Battle) -> +   Battle#battle +   { +      used_armor_ids = UPIDs +   }. +  -spec set_player (non_neg_integer(), btl_player:type(), type()) -> type().  set_player (IX, Player, Battle) ->     Battle#battle     { -      players = -         array:set -         ( -            IX, -            Player, -            Battle#battle.players -         ) +      players = orddict:store(IX, Player, Battle#battle.players)     }.  -spec set_current_player_turn (btl_player_turn:type(), type()) -> type(). @@ -181,34 +244,39 @@ set_current_player_turn (PlayerTurn, Battle) ->        current_player_turn = PlayerTurn     }. --spec new -   ( -      id(), -      list(btl_player:type()), -      btl_map:type(), -      list(btl_character:type()), -      ordsets:ordset(shr_weapon:id()), -      ordsets:ordset(shr_armor:id()), -      ordsets:ordset(shr_tile:class_id()) -   ) -   -> type(). -new (ID, PlayersAsList, Map, CharactersAsList, UWIDs, UAIDs, UTIDs) -> +-spec new (btl_map:type()) -> type(). +new (Map) -> +   EmptySet = ordsets:new(), +   EmptyDict = orddict:new(), +     #battle     { -      id = ID, -      used_weapon_ids = UWIDs, -      used_armor_ids = UAIDs, -      used_tile_ids = UTIDs, +      id = ataxia_id:null(), +      used_portrait_ids = EmptySet, +      used_weapon_ids = EmptySet, +      used_armor_ids = EmptySet, +      used_tile_ids = btl_map:get_used_tile_ids(Map),        map = Map, -      characters = array:from_list(CharactersAsList), -      players = array:from_list(PlayersAsList), +      characters = EmptyDict, +      players = EmptyDict,        current_player_turn = btl_player_turn:new(0, 0)     }. +-spec get_id_field () -> non_neg_integer(). +get_id_field () -> #battle.characters.  -spec get_characters_field () -> non_neg_integer().  get_characters_field () -> #battle.characters. +-spec get_used_portrait_ids_field () -> non_neg_integer(). +get_used_portrait_ids_field () -> #battle.used_portrait_ids. + +-spec get_used_weapon_ids_field () -> non_neg_integer(). +get_used_weapon_ids_field () -> #battle.used_weapon_ids. + +-spec get_used_armor_ids_field () -> non_neg_integer(). +get_used_armor_ids_field () -> #battle.used_armor_ids. +  -spec get_players_field () -> non_neg_integer().  get_players_field () -> #battle.players. diff --git a/src/battle/struct/btl_character.erl b/src/battle/struct/btl_character.erl index 8c04cd8..84eecfb 100644 --- a/src/battle/struct/btl_character.erl +++ b/src/battle/struct/btl_character.erl @@ -56,7 +56,7 @@        get_rank_field/0,        get_weapons_field/0, -      get_locatiupdate_field/0, +      get_location_field/0,        get_current_health_field/0,        get_is_active_field/0,        get_is_defeated_field/0 @@ -255,8 +255,8 @@ new  get_rank_field () -> #character.rank.  -spec get_weapons_field() -> non_neg_integer().  get_weapons_field () -> #character.weapon_ids. --spec get_locatiupdate_field() -> non_neg_integer(). -get_locatiupdate_field () -> #character.location. +-spec get_location_field() -> non_neg_integer(). +get_location_field () -> #character.location.  -spec get_current_health_field() -> non_neg_integer().  get_current_health_field () -> #character.current_health.  -spec get_is_active_field() -> non_neg_integer(). diff --git a/src/battle/struct/btl_map.erl b/src/battle/struct/btl_map.erl index e4aa88b..17a272b 100644 --- a/src/battle/struct/btl_map.erl +++ b/src/battle/struct/btl_map.erl @@ -9,7 +9,7 @@     {        width :: integer(),        height :: integer(), -      tile_ids :: array:array(shr_tile:instance()) +      tile_ids :: shr_tile:instances_tuple()     }  ). @@ -27,7 +27,8 @@        get_width/1,        get_height/1,        get_tile_instances/1, -      get_tile_instance/2 +      get_tile_instance/2, +      get_used_tile_ids/1     ]  ). @@ -35,20 +36,20 @@  (     [        from_list/3, -      from_array/3 +      from_instances_tuple/3     ]  ).  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec location_to_array_index +-spec location_to_index     (        non_neg_integer(),        btl_location:type()     )     -> ('error' | non_neg_integer()). -location_to_array_index (ArrayWidth, {X, Y}) -> +location_to_index (ArrayWidth, {X, Y}) ->     if        (X < 0) -> error;        (Y < 0) -> error; @@ -66,13 +67,13 @@ get_width (Map) -> Map#map.width.  -spec get_height (type()) -> integer().  get_height (Map) -> Map#map.height. --spec get_tile_instances (type()) -> array:array(shr_tile:instance()). +-spec get_tile_instances (type()) -> shr_tile:instances_tuple().  get_tile_instances (Map) -> Map#map.tile_ids.  -spec get_tile_instance (btl_location:type(), type()) -> shr_tile:instance().  get_tile_instance (Location, Map) -> -   TileIX = location_to_array_index(Map#map.width, Location), -   array:get(TileIX, Map#map.tile_ids). +   TileIX = location_to_index(Map#map.width, Location), +   element((TileIX + 1), Map#map.tile_ids).  -spec from_list     ( @@ -88,20 +89,38 @@ from_list (Width, Height, List) ->     {        width = Width,        height = Height, -      tile_ids = array:from_list(TileInstances) +      tile_ids = list_to_tuple(TileInstances)     }. --spec from_array +-spec from_instances_tuple     (        non_neg_integer(),        non_neg_integer(), -      array:array(shr_tile:instance()) +      shr_tile:instances_tuple()     )     -> type(). -from_array (Width, Height, TileInstances) -> +from_instances_tuple (Width, Height, TileInstances) ->     #map     {        width = Width,        height = Height,        tile_ids = TileInstances     }. + +-spec get_used_tile_ids (type()) -> ordsets:ordset(shr_tile:class_id()). +get_used_tile_ids (Map) -> +   UsedTileIDs = +      lists:foldl +      ( +         fun (TileInstance, CurrentTileIDs) -> +            ordsets:add_element +            ( +               shr_tile:extract_main_class_id(TileInstance), +               CurrentTileIDs +            ) +         end, +         ordsets:new(), +         tuple_to_list(Map#map.tile_ids) +      ), + +   UsedTileIDs. diff --git a/src/battle/struct/btl_player_turn.erl b/src/battle/struct/btl_player_turn.erl index e0665f4..6bd823f 100644 --- a/src/battle/struct/btl_player_turn.erl +++ b/src/battle/struct/btl_player_turn.erl @@ -43,14 +43,14 @@  -spec next_valid_player     (        non_neg_integer(), -      array:array(btl_player:type()), +      orddict:orddict(non_neg_integer(), btl_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), +   Candidate = orddict:fetch(CandidateIX, Players),     case btl_player:get_is_active(Candidate) of        true -> CandidateIX; @@ -82,11 +82,16 @@ 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 (array:array(btl_player:type()), type()) -> type(). +-spec next +   ( +      orddict:orddict(non_neg_integer(), btl_player:type()), +      type() +   ) +   -> type().  next (Players, CurrentPlayerTurn) ->     CurrentPlayerIX = CurrentPlayerTurn#player_turn.player_ix,     CurrentTurnNumber = CurrentPlayerTurn#player_turn.number, -   PlayersCount = array:size(Players), +   PlayersCount = orddict:size(Players),     NextPlayerIX =        next_valid_player diff --git a/src/map/reply/map_set_map.erl b/src/map/reply/map_set_map.erl index 3a3f36c..67675fe 100644 --- a/src/map/reply/map_set_map.erl +++ b/src/map/reply/map_set_map.erl @@ -28,7 +28,7 @@ generate (Map) ->              lists:map              (                 fun shr_tile:instance_to_binary_list/1, -               array:sparse_to_list(map_map:get_tile_instances(Map)) +               tuple_to_list(map_map:get_tile_instances(Map))              )           }        ] diff --git a/src/map/struct/map_map.erl b/src/map/struct/map_map.erl index 4cce9cf..bfa9e5a 100644 --- a/src/map/struct/map_map.erl +++ b/src/map/struct/map_map.erl @@ -12,7 +12,7 @@        owner :: binary(),        width :: integer(),        height :: integer(), -      tile_instances :: array:array(shr_tile:instance()) +      tile_instances :: shr_tile:instances_tuple()     }  ). @@ -56,13 +56,13 @@  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec location_to_array_index +-spec location_to_index     (        non_neg_integer(),        map_location:type()     )     -> ('error' | non_neg_integer()). -location_to_array_index (ArrayWidth, {X, Y}) -> +location_to_index (ArrayWidth, {X, Y}) ->     if        (X < 0) -> error;        (Y < 0) -> error; @@ -83,13 +83,13 @@ get_width (Map) -> Map#map.width.  -spec get_height (type()) -> integer().  get_height (Map) -> Map#map.height. --spec get_tile_instances (type()) -> array:array(shr_tile:instance()). +-spec get_tile_instances (type()) -> shr_tile:instances_tuple().  get_tile_instances (Map) -> Map#map.tile_instances.  -spec get_tile_instance (map_location:type(), type()) -> shr_tile:instance().  get_tile_instance (Location, Map) -> -   TileIX = location_to_array_index(Map#map.width, Location), -   array:get(TileIX, Map#map.tile_instances). +   TileIX = location_to_index(Map#map.width, Location), +   element((TileIX + 1), Map#map.tile_instances).  -spec get_width_field () -> non_neg_integer().  get_width_field () -> #map.width. @@ -116,7 +116,7 @@ from_list (Owner, Width, Height, List) ->        owner = Owner,        width = Width,        height = Height, -      tile_instances = array:from_list(TileInstances) +      tile_instances = list_to_tuple(TileInstances)     }.  -spec update_from_list @@ -134,7 +134,7 @@ update_from_list (Map, Width, Height, List) ->     {        width = Width,        height = Height, -      tile_instances = array:from_list(TileInstances) +      tile_instances = list_to_tuple(TileInstances)     }.  -spec default (binary()) -> type(). @@ -146,6 +146,5 @@ default (Owner) ->        owner = Owner,        width = 32,        height = 32, -      tile_instances = -         array:from_list(lists:duplicate(1024, DefaultTileInstance)) +      tile_instances = list_to_tuple(lists:duplicate(1024, DefaultTileInstance))     }. diff --git a/src/roster/query/rst_load.erl b/src/roster/query/rst_load.erl index cfd42c7..077f193 100644 --- a/src/roster/query/rst_load.erl +++ b/src/roster/query/rst_load.erl @@ -94,9 +94,12 @@ generate_reply (QueryState) ->     RosterCharacters = rst_roster:get_characters(Roster),     SetInventory = shr_set_inventory:generate(Inventory),     EncodedRoster = -      array:to_list +      lists:map        ( -         array:sparse_map(fun rst_add_char:generate/2, RosterCharacters) +         fun ({IX, Char}) -> +            rst_add_char:generate(IX, Char) +         end, +         orddict:to_list(RosterCharacters)        ),     Output = jiffy:encode([SetInventory|EncodedRoster]), diff --git a/src/roster/query/rst_update.erl b/src/roster/query/rst_update.erl index dfc634e..b1e0a7c 100644 --- a/src/roster/query/rst_update.erl +++ b/src/roster/query/rst_update.erl @@ -131,7 +131,7 @@ commit_update (QueryState, Input) ->               {                 rst_roster:set_character(IX, Character, CurrentRoster),                 [ -                  ataxic_sugar:update_array_cell +                  ataxic_sugar:update_orddict_element                    (                       IX,                       ataxic:constant(Character) diff --git a/src/roster/struct/rst_roster.erl b/src/roster/struct/rst_roster.erl index 6371878..90b2f98 100644 --- a/src/roster/struct/rst_roster.erl +++ b/src/roster/struct/rst_roster.erl @@ -10,7 +10,7 @@     roster,     {        owner :: binary(), -      characters :: array:array(rst_character:type()) +      characters :: orddict:orddict(non_neg_integer(), rst_character:type())     }  ). @@ -30,10 +30,7 @@        get_character/2,        set_characters/2, -      set_character/3, - -      add_character/2, -      remove_character/2 +      set_character/3     ]  ). @@ -62,13 +59,22 @@  -spec get_owner (type()) -> binary().  get_owner (Roster) -> Roster#roster.owner. --spec get_characters (type()) -> array:array(rst_character:type()). +-spec get_characters +   ( +      type() +   ) +   -> orddict:orddict(non_neg_integer(), rst_character:type()).  get_characters (Roster) -> Roster#roster.characters.  -spec get_character (non_neg_integer(), type()) -> rst_character:type(). -get_character (IX, Roster) -> array:get(IX, Roster#roster.characters). +get_character (IX, Roster) -> orddict:fetch(IX, Roster#roster.characters). --spec set_characters (array:array(rst_character:type()), type()) -> type(). +-spec set_characters +   ( +      orddict:orddict(non_neg_integer(), rst_character:type()), +      type() +   ) +   -> type().  set_characters (Characters, Roster) -> Roster#roster{ characters = Characters }.  -spec set_character @@ -81,32 +87,7 @@ set_characters (Characters, Roster) -> Roster#roster{ characters = Characters }.  set_character (IX, Character, Roster) ->     Roster#roster     { -      characters = array:set(IX, Character, Roster#roster.characters) -   }. - --spec add_character (rst_character:type(), type()) -> type(). -add_character (Character, Roster) -> -   CurrentCharacters = Roster#roster.characters, -   CurrentSize = array:size(CurrentCharacters), - -   Roster#roster -   { -      characters = array:set(CurrentSize, Character, CurrentCharacters) -   }. - --spec remove_character (non_neg_integer(), type()) -> type(). -remove_character (IX, Roster) -> -   CurrentCharacters = Roster#roster.characters, -   CurrentSize = array:size(CurrentCharacters), -   NewSize = (CurrentSize - 1), -   LastCharacter = array:get(NewSize, CurrentCharacters), - -   S0Characters = array:set(IX, LastCharacter, CurrentCharacters), -   S1Characters = array:resize(NewSize, S0Characters), - -   Roster#roster -   { -      characters = S1Characters +      characters = orddict:store(IX, Character, Roster#roster.characters)     }.  -spec get_characters_field () -> non_neg_integer(). @@ -119,18 +100,18 @@ new (Owner) ->     {        owner = Owner,        characters = -         array:from_list +         orddict:from_list           (              [ -               NewChar, -               NewChar, -               NewChar, -               NewChar, - -               NewChar, -               NewChar, -               NewChar, -               NewChar +               {0, NewChar}, +               {1, NewChar}, +               {2, NewChar}, +               {3, NewChar}, + +               {4, NewChar}, +               {5, NewChar}, +               {6, NewChar}, +               {7, NewChar}              ]           )     }. diff --git a/src/shared/struct/shr_tile.erl.m4 b/src/shared/struct/shr_tile.erl.m4 index c963b0b..dc99b50 100644 --- a/src/shared/struct/shr_tile.erl.m4 +++ b/src/shared/struct/shr_tile.erl.m4 @@ -5,6 +5,7 @@  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  -type class_id() :: binary().  -type variant_id() :: binary(). +-type instances_tuple() :: tuple().  -record  ( @@ -25,6 +26,7 @@  -opaque type() :: #tile{}.  -export_type([type/0, class_id/0, variant_id/0, instance/0, border/0]). +-export_type([instances_tuple/0]).  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/src/shared/util/shr_array_util.erl b/src/shared/util/shr_array_util.erl deleted file mode 100644 index 0faff99..0000000 --- a/src/shared/util/shr_array_util.erl +++ /dev/null @@ -1,152 +0,0 @@ --module(shr_array_util). -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export -( -   [ -      any/2, -      any_indexed/2, -      none/2, -      all/2, - -      first/2, - -      mapiff/3 -   ] -). -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec any_internals -   ( -      fun((any()) -> boolean()), -      array:array(any()), -      non_neg_integer() -   ) -   -> boolean(). -any_internals (_, _, 0) -> -   false; -any_internals (Fun, Array, PrevIX) -> -   IX = (PrevIX - 1), -   case Fun(array:get(IX, Array)) of -      true -> true; -      _ -> any_internals(Fun, Array, IX) -   end. - --spec first_internals -   ( -      fun((any()) -> boolean()), -      array:array(any()), -      non_neg_integer() -   ) -   -> integer(). -first_internals (_, _, 0) -> -   -1; -first_internals (Fun, Array, PrevIX) -> -   IX = (PrevIX - 1), -   case Fun(array:get(IX, Array)) of -      true -> IX; -      _ -> first_internals(Fun, Array, IX) -   end. - --spec any_indexed_internals -   ( -      fun((non_neg_integer(), any()) -> boolean()), -      array:array(any()), -      non_neg_integer() -   ) -   -> boolean(). -any_indexed_internals (_, _, 0) -> -   false; -any_indexed_internals (Fun, Array, PrevIX) -> -   IX = (PrevIX - 1), -   case Fun(IX, array:get(IX, Array)) of -      true -> true; -      _ -> any_indexed_internals(Fun, Array, IX) -   end. - --spec all_internals -   ( -      fun((any()) -> boolean()), -      array:array(any()), -      non_neg_integer() -   ) -   -> boolean(). -all_internals (_, _, 0) -> -   true; -all_internals (Fun, Array, PrevIX) -> -   IX = (PrevIX - 1), -   case Fun(array:get(IX, Array)) of -      true -> any_internals(Fun, Array, IX); -      _ -> false -   end. - --spec mapiff_internals -   ( -      fun((any()) -> boolean()), -      fun((any()) -> any()), -      array:array(any()), -      list(non_neg_integer()), -      non_neg_integer() -   ) -   -> {array:array(any()), list(non_neg_integer())}. -mapiff_internals (_, _, Array, IXList, 0) -> -   {Array, IXList}; -mapiff_internals (Cond, Map, Array, IXList, PrevIX) -> -   IX = (PrevIX - 1), -   Elem = array:get(IX, Array), - -   case Cond(Elem) of -      false -> mapiff_internals(Cond, Map, Array, IXList, IX); -      _ -> -         mapiff_internals -         ( -            Cond, -            Map, -            array:set(IX, Map(Elem), Array), -            [IX|IXList], -            IX -         ) -   end. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec any (fun((any()) -> boolean()), array:array(any())) -> boolean(). -any (Fun, Array) -> -   any_internals(Fun, Array, array:size(Array)). - --spec first (fun((any()) -> boolean()), array:array(any())) -> integer(). -first (Fun, Array) -> -   first_internals(Fun, Array, array:size(Array)). - --spec any_indexed -   ( -      fun((non_neg_integer(), any()) -> boolean()), -      array:array(any()) -   ) -> boolean(). -any_indexed (Fun, Array) -> -   any_indexed_internals(Fun, Array, array:size(Array)). - --spec all (fun((any()) -> boolean()), array:array(any())) -> boolean(). -all (Fun, Array) -> -   all_internals(Fun, Array, array:size(Array)). - --spec none (fun((any()) -> boolean()), array:array(any())) -> boolean(). -none (Fun, Array) -> -   not any(Fun, Array). - --spec mapiff -   ( -      fun((any()) -> boolean()), -      fun((any()) -> any()), -      array:array(any()) -   ) -   -> {array:array(any()), list(non_neg_integer())}. -mapiff (Cond, Map, Array) -> -   mapiff_internals(Cond, Map, Array, [], array:size(Array)). diff --git a/src/shared/util/shr_lists_util.erl b/src/shared/util/shr_lists_util.erl new file mode 100644 index 0000000..0568692 --- /dev/null +++ b/src/shared/util/shr_lists_util.erl @@ -0,0 +1,32 @@ +-module(shr_lists_util). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export +( +   [ +      %%% Gentoo hasn't marked Erlang/OTP 21 as stable yet, but I'd like to +      %%% use this function. +      %%% TODO: remove once lists:search/2 is available.  +      search/2 +   ] +). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Copy/pasted from the Erlang OTP's source code... +search (Pred, [Hd|Tail]) -> +   case Pred(Hd) of +      true -> {value, Hd}; +      false -> search(Pred, Tail) +   end; +search (Pred, []) when is_function(Pred, 1) -> +   false. diff --git a/src/special/spe_battle.erl b/src/special/spe_battle.erl index edc18df..d907224 100644 --- a/src/special/spe_battle.erl +++ b/src/special/spe_battle.erl @@ -13,70 +13,92 @@  %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%% DB ACCESS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec reserve_id () -> binary(). -reserve_id () -> -   %% TODO Unimplemented. -   <<"0">>. +%%%% USED IDS COLLECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec update_ordset +   ( +      ordsets:ordset(any()), +      ordsets:ordset(any()) +   ) +   -> ataxic:basic(). +update_ordset (New, Old) -> +   AddedElements = ordsets:subtract(New, Old), --spec commit (btl_battle:type()) -> ok. -commit (_Battle) -> -   %% TODO Unimplemented. -   ok. +   ataxic:sequence +   ( +      lists:map +      ( +         fun (V) -> +            ataxic:apply_function +            ( +               ordsets, +               add_element, +               [ +                  ataxic:constant(V), +                  ataxic:current_value() +               ] +            ) +         end, +         ordsets:to_list(AddedElements) +      ) +   ). -%%%% USED IDS COLLECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  -spec get_equipment_ids     ( -      list(btl_character:type()) +      orddict:orddict(non_neg_integer(), btl_character:type())     ) -   -> {ordsets:ordset(binary()), ordsets:ordset(binary())}. +   -> +   { +      ordsets:ordset(shr_portrait:id()), +      ordsets:ordset(shr_weapon:id()), +      ordsets:ordset(shr_armor:id()) +   }.  get_equipment_ids (Characters) -> -   {UsedWeaponIDs, UsedArmorIDs} = -      lists:foldl +   { +      UsedPortraitIDs, +      UsedWeaponIDs, +      UsedArmorIDs +   } = +      orddict:fold        ( -         fun (Character, {UWIDs, UAIDs}) -> +         fun (_IX, Character, {UPIDs, UWIDs, UAIDs}) ->              {MWpID, SWpID} = btl_character:get_weapon_ids(Character),              AID = btl_character:get_armor_id(Character), +            PID = btl_character:get_portrait_id(Character),              { +               ordsets:add_element(PID, UPIDs),                 ordsets:add_element(MWpID, ordsets:add_element(SWpID, UWIDs)),                 ordsets:add_element(AID, UAIDs)              }           end, -         {ordsets:new(), ordsets:new()}, +         {ordsets:new(), ordsets:new(), ordsets:new()},           Characters        ), -   {UsedWeaponIDs, UsedArmorIDs}. +   {UsedPortraitIDs, UsedWeaponIDs, UsedArmorIDs}. + --spec get_tile_ids +%%%% ROSTERS HANDLING %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec get_forbidden_locations     ( -      array:array(shr_tile:instance()) +      btl_battle:type()     ) -   -> ordsets:ordset(binary()). -get_tile_ids (TileInstances) -> -   UsedTileIDs = -      array:sparse_foldl -      ( -         fun (_IX, TileInstance, CurrentTileIDs) -> -            ordsets:add_element -            ( -               shr_tile:extract_main_class_id(TileInstance), -               CurrentTileIDs -            ) -         end, -         ordsets:new(), -         TileInstances -      ), - -   UsedTileIDs. +   -> ordsets:ordset(btl_location:type()). +get_forbidden_locations (Battle) -> +   orddict:fold +   ( +      fun (_IX, Char, Set) -> +         ordsets:add_element(btl_character:get_location(Char), Set) +      end, +      ordsets:new(), +      btl_battle:get_characters(Battle) +   ). -%%%% ROSTERS HANDLING %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  -spec find_random_location     (        btl_map:type(), -      ordsets:ordset({non_neg_integer(), non_neg_integer()}) +      ordsets:ordset(btl_location:type())     ) -   -> {{non_neg_integer(), non_neg_integer()}, shr_tile:type()}. +   -> {btl_location:type(), shr_tile:type()}.  find_random_location (Map, ForbiddenLocations) ->     MapWidth = btl_map:get_width(Map),     MapHeight = btl_map:get_height(Map), @@ -151,114 +173,182 @@ create_character (PlayerIX, RosterChar, Map, ForbiddenLocations) ->  -spec handle_characters     ( -      list(rst_character:type()), +      list({non_neg_integer(), rst_character:type()}),        non_neg_integer(), -      list(btl_character:type()),        btl_map:type(), -      ordsets:ordset(btl_location:type()) +      ordsets:ordset(btl_location:type()), +      non_neg_integer(), +      orddict:orddict(non_neg_integer(), btl_character:type()), +      list(ataxic:basic())     ) -   -> list(btl_character:type()). -handle_characters ([], _PlayerIX, Characters, _Map, _UsedLocations) -> -   Characters; +   -> +   { +      orddict:orddict(non_neg_integer(), btl_character:type()), +      list(ataxic:basic()) +   }.  handle_characters  ( -   [RosterCharacter|NextRosterCharacters], -   PlayerIX, +   [], +   _PlayerIX, +   _Map, +   _UsedLocations, +   _NextCharIX,     Characters, +   AtaxicUpdates +) -> +   {Characters, AtaxicUpdates}; +handle_characters +( +   [{_, RosterCharacter}|NextRosterCharacters], +   PlayerIX,     Map, -   UsedLocations +   UsedLocations, +   NextCharIX, +   Characters, +   AtaxicUpdates  ) ->     NewCharacter =        create_character(PlayerIX, RosterCharacter, Map, UsedLocations), +   NewCharacters = orddict:store(NextCharIX, NewCharacter, Characters), + +   NewUpdate = +      ataxic:apply_function +      ( +         orddict, +         store, +         [ +            ataxic:constant(NextCharIX), +            ataxic:constant(NewCharacter), +            ataxic:current_value() +         ] +      ), +     handle_characters     (        NextRosterCharacters,        PlayerIX, -      [NewCharacter|Characters],        Map, -      [btl_character:get_location(NewCharacter)|UsedLocations] +      [btl_character:get_location(NewCharacter)|UsedLocations], +      (NextCharIX + 1), +      NewCharacters, +      [NewUpdate|AtaxicUpdates]     ).  -spec handle_roster     (        rst_roster:type(), -      non_neg_integer(),        btl_map:type(), -      ordsets:ordset(btl_location:type()) +      ordsets:ordset(btl_location:type()), +      btl_battle:type()     ) -   -> {list(btl_character:type()), btl_player:type()}. +   -> {btl_battle:type(), ataxic:basic()}.  handle_roster  (     Roster, -   PlayersCount,     Map, -   UsedLocations +   UsedLocations, +   Battle  ) -> -   NewPlayer = btl_player:new(PlayersCount, 0, rst_roster:get_owner(Roster)), -   NewCharacters = +   Players = btl_battle:get_players(Battle), +   NextPlayerIX = orddict:size(Players), +   NewPlayer = btl_player:new(NextPlayerIX, 0, rst_roster:get_owner(Roster)), +   NewPlayers = orddict:store(NextPlayerIX, NewPlayer, Players), + +   Characters = btl_battle:get_characters(Battle), +   {NewCharacters, CharactersUpdates} =        handle_characters        ( -         array:to_list(rst_roster:get_characters(Roster)), -         PlayersCount, -         [], +         orddict:to_list(rst_roster:get_characters(Roster)), +         NextPlayerIX,           Map, -         UsedLocations +         UsedLocations, +         orddict:size(Characters), +         Characters, +         []        ), -   {NewCharacters, NewPlayer}. +   NewBattle = +      btl_battle:set_characters +      ( +         NewCharacters, +         btl_battle:set_players +         ( +            NewPlayers, +            Battle +         ) +      ), + +   Update = +      ataxic:sequence +      ( +         [ +            ataxic:update_field +            ( +               btl_battle:get_players_field(), +               ataxic:apply_function +               ( +                  orddict, +                  store, +                  [ +                     ataxic:constant(NextPlayerIX), +                     ataxic:constant(NewPlayer), +                     ataxic:current_value() +                  ] +               ) +            ), +            ataxic:update_field +            ( +               btl_battle:get_characters_field(), +               ataxic:sequence(CharactersUpdates) +            ) +         ] +      ), +   {NewBattle, Update}.  %%%% BATTLE CREATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec generate_battle -   ( -      binary(), -      map_map:type(), -      rst_roster:type() -   ) -   -> btl_battle:type(). -generate_battle (ID, Map, Roster) -> +-spec generate_battle (map_map:type(), rst_roster:type()) -> btl_battle:type(). +generate_battle (Map, Roster) ->     TileInstances = map_map:get_tile_instances(Map),     BattleMap = -      btl_map:from_array +      btl_map:from_instances_tuple        (           map_map:get_width(Map),           map_map:get_height(Map),           TileInstances        ), -   {Characters, FirstPlayer} = -      handle_roster(Roster, 0, BattleMap, ordsets:new()), -   {UsedWeaponIDs, UsedArmorIDs} = get_equipment_ids(Characters), -   UsedTileIDs = get_tile_ids(TileInstances), +   Battle = btl_battle:new(BattleMap), +   {S0Battle, _AtaxicUpdate} = +      handle_roster(Roster, BattleMap, ordsets:new(), Battle), + +   {UsedPortraitIDs, UsedWeaponIDs, UsedArmorIDs} = +      get_equipment_ids(btl_battle:get_characters(S0Battle)), -   Battle = -      btl_battle:new +   S1Battle = +      btl_battle:set_used_portrait_ids        ( -         ID, -         [FirstPlayer], -         BattleMap, -         Characters, -         UsedWeaponIDs, -         UsedArmorIDs, -         UsedTileIDs +         UsedPortraitIDs, +         btl_battle:set_used_weapon_ids +         ( +            UsedWeaponIDs, +            btl_battle:set_used_armor_ids +            ( +               UsedArmorIDs, +               S0Battle +            ) +         )        ), -   Battle. +   S1Battle.  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec generate -   ( -      map_map:type(), -      rst_roster:type() -   ) -   -> btl_battle:type(). +-spec generate (map_map:type(), rst_roster:type()) -> btl_battle:type().  generate (Map, Roster) -> -   ID = reserve_id(), -   Battle = generate_battle(ID, Map, Roster), -   ok = commit(Battle), +   Battle = generate_battle(Map, Roster),     Battle.  -spec add_to @@ -266,6 +356,83 @@ generate (Map, Roster) ->        rst_roster:type(),        btl_battle:type()     ) -   -> btl_battle:type(). -add_to (_Roster, Battle) -> -   Battle. +   -> {btl_battle:type(), ataxic:basic()}. +add_to (Roster, Battle) -> +   BattleMap = btl_battle:get_map(Battle), +   ForbiddenLocations = get_forbidden_locations(Battle), + +   {S0Battle, AtaxicUpdate} = +      handle_roster +      ( +         Roster, +         BattleMap, +         ForbiddenLocations, +         Battle +      ), + +   {UsedPortraitIDs, UsedWeaponIDs, UsedArmorIDs} = +      get_equipment_ids(rst_roster:get_characters(Roster)), + +   OldPortraitIDs = btl_battle:get_used_portrait_ids(Battle), +   PortraitIDsUpdate = +      ataxic:update_field +      ( +         btl_battle:get_used_portrait_ids_field(), +         update_ordset(UsedPortraitIDs, OldPortraitIDs) +      ), + +   OldWeaponIDs = btl_battle:get_used_portrait_ids(Battle), +   WeaponIDsUpdate = +      ataxic:update_field +      ( +         btl_battle:get_used_weapon_ids_field(), +         update_ordset(UsedWeaponIDs, OldWeaponIDs) +      ), + +   OldArmorIDs = btl_battle:get_used_armor_ids(Battle), +   ArmorIDsUpdate = +      ataxic:update_field +      ( +         btl_battle:get_used_armor_ids_field(), +         update_ordset(UsedArmorIDs, OldArmorIDs) +      ), + +   S1Battle = +      btl_battle:set_used_armor_ids +      ( +         ordsets:union(UsedArmorIDs, OldArmorIDs), +         btl_battle:set_used_weapon_ids +         ( +            ordsets:union(UsedWeaponIDs, OldWeaponIDs), +            btl_battle:set_used_portrait_ids +            ( +               ordsets:union(UsedPortraitIDs, OldPortraitIDs), +               S0Battle +            ) +         ) +      ), + +   Update = +      ataxic:sequence +      ( +         [ +            ataxic:update_field +            ( +               btl_battle:get_used_portrait_ids_field(), +               PortraitIDsUpdate +            ), +            ataxic:update_field +            ( +               btl_battle:get_used_weapon_ids_field(), +               WeaponIDsUpdate +            ), +            ataxic:update_field +            ( +               btl_battle:get_used_armor_ids_field(), +               ArmorIDsUpdate +            ), +            AtaxicUpdate +         ] +      ), + +   {S1Battle, Update}. | 


