summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2018-12-21 17:23:56 +0100
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2018-12-21 17:23:56 +0100
commita81ff643a823dde57ebd0ed5da8a91fb75d32267 (patch)
treedc7dd9e17bb380d05d446b10e7630db340c5998e
parentc69fe90821bba84c70b020a2504fe4ed63072158 (diff)
Removes any use of arrays.
-rw-r--r--src/battle/game-logic/btl_next_turn.erl67
-rw-r--r--src/battle/game-logic/btl_turn_actions.erl2
-rw-r--r--src/battle/game-logic/btl_turn_actions_attack.erl4
-rw-r--r--src/battle/game-logic/btl_turn_actions_move.erl11
-rw-r--r--src/battle/game-logic/btl_turn_actions_switch_weapon.erl2
-rw-r--r--src/battle/game-logic/btl_victory.erl136
-rw-r--r--src/battle/query/btl_character_turn.erl6
-rw-r--r--src/battle/query/btl_load.erl38
-rw-r--r--src/battle/reply/btl_set_map.erl2
-rw-r--r--src/battle/struct/btl_battle.erl156
-rw-r--r--src/battle/struct/btl_character.erl6
-rw-r--r--src/battle/struct/btl_map.erl43
-rw-r--r--src/battle/struct/btl_player_turn.erl13
-rw-r--r--src/map/reply/map_set_map.erl2
-rw-r--r--src/map/struct/map_map.erl19
-rw-r--r--src/roster/query/rst_load.erl7
-rw-r--r--src/roster/query/rst_update.erl2
-rw-r--r--src/roster/struct/rst_roster.erl69
-rw-r--r--src/shared/struct/shr_tile.erl.m42
-rw-r--r--src/shared/util/shr_array_util.erl152
-rw-r--r--src/shared/util/shr_lists_util.erl32
-rw-r--r--src/special/spe_battle.erl361
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}.