summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src')
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}. |