summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/special/spe_battle.erl')
-rw-r--r--src/special/spe_battle.erl120
1 files changed, 120 insertions, 0 deletions
diff --git a/src/special/spe_battle.erl b/src/special/spe_battle.erl
new file mode 100644
index 0000000..1b3453c
--- /dev/null
+++ b/src/special/spe_battle.erl
@@ -0,0 +1,120 @@
+-module(spe_battle).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-export([generate/2]).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec reserve_id () -> binary().
+reserve_id () -> <<"0">>.
+
+-spec get_equipment_ids
+ (
+ list(btl_character:type())
+ )
+ -> {sets:set(binary()), sets:set(binary())}.
+get_equipment_ids (Characters) ->
+ {UsedWeaponIDs, UsedArmorIDs} =
+ lists:foldl
+ (
+ fun (Character, {UWIDs, UAIDs}) ->
+ {MWpID, SWpID} = btl_character:get_weapon_ids(Character),
+ AID = btl_character:get_armor_id(Character),
+ {
+ sets:add_element(MWpID, sets:add_element(SWpID, UWIDs)),
+ sets:add_element(AID, UAIDs)
+ }
+ end,
+ {sets:new(), sets:new()},
+ Characters
+ ),
+
+ {UsedWeaponIDs, UsedArmorIDs}.
+
+-spec get_tile_ids (array:array(shr_tile:type())) -> sets:set(binary()).
+get_tile_ids (TileInstances) ->
+ UsedTileIDs =
+ array:sparse_foldl
+ (
+ fun (_IX, TileInstance, CurrentTileIDs) ->
+ sets:add_element
+ (
+ shr_tile:extract_main_class_id(TileInstance),
+ CurrentTileIDs
+ )
+ end,
+ sets:new(),
+ TileInstances
+ ),
+
+ UsedTileIDs.
+
+-spec handle_rosters
+ (
+ list(rst_roster:type())
+ )
+ -> {list(btl_character:type()), list(btl_player:type())}.
+handle_rosters (_Rosters) ->
+ %% TODO Unimplemented.
+ {[], []}.
+
+-spec generate_battle
+ (
+ binary(),
+ map_map:type(),
+ list(rst_roster:type())
+ )
+ -> btl_battle:type().
+generate_battle (ID, Map, Rosters) ->
+ TileInstances = map_map:get_tile_instances(Map),
+ BattleMap =
+ btl_map:from_array
+ (
+ map_map:get_width(Map),
+ map_map:get_height(Map),
+ TileInstances
+ ),
+ {Characters, PlayersAsList} = handle_rosters(Rosters),
+ {UsedWeaponIDs, UsedArmorIDs} = get_equipment_ids(Characters),
+ UsedTileIDs = get_tile_ids(TileInstances),
+
+ Battle =
+ btl_battle:new
+ (
+ ID,
+ PlayersAsList,
+ BattleMap,
+ Characters,
+ sets:to_list(UsedWeaponIDs),
+ sets:to_list(UsedArmorIDs),
+ sets:to_list(UsedTileIDs)
+ ),
+
+ Battle.
+
+-spec commit (btl_battle:type()) -> ok.
+commit (_Battle) ->
+ %% TODO Unimplemented.
+ ok.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec generate
+ (
+ map_map:type(),
+ list(rst_roster:type())
+ )
+ -> btl_battle:type().
+generate (Map, Rosters) ->
+ ID = reserve_id(),
+ Battle = generate_battle(ID, Map, Rosters),
+ ok = commit(Battle),
+ Battle.