1 #pragma once
2 
3 #include "read_write_array.h"
4 #include "furniture_factory.h"
5 #include "furniture.h"
6 #include "furniture_layer.h"
7 
8 struct GenerateFurniture {
operatorGenerateFurniture9   PFurniture operator()(FurnitureParams p) {
10     return FurnitureFactory::get(p.type, p.tribe);
11   }
12 };
13 
14 class FurnitureArray {
15   public:
16   FurnitureArray(Rectangle bounds);
17 
18   typedef ReadWriteArray<Furniture, FurnitureParams, GenerateFurniture> Array;
19 
20   const Array& getBuilt(FurnitureLayer) const;
21   Array& getBuilt(FurnitureLayer);
22 
23   struct Construction {
24     FurnitureType SERIAL(type);
25     int SERIAL(time);
26     SERIALIZE_ALL(type, time)
27   };
28 
29   const optional<Construction>& getConstruction(Vec2, FurnitureLayer) const;
30   optional<Construction>& getConstruction(Vec2, FurnitureLayer);
31 
32   SERIALIZATION_DECL(FurnitureArray)
33 
34   private:
35   EnumMap<FurnitureLayer, Array> SERIAL(built);
36   EnumMap<FurnitureLayer, Table<optional<Construction>>> SERIAL(construction);
37 };
38