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