summaryrefslogtreecommitdiff
blob: 1b3453cf54cae35a2cfa652cd82a8b616af0d5b1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
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.