1 #pragma once
2 
3 #include "destroy_action.h"
4 #include "fire.h"
5 #include "item_factory.h"
6 #include "vision_id.h"
7 #include "event_listener.h"
8 #include "furniture_layer.h"
9 
10 class TribeId;
11 class Creature;
12 class MovementType;
13 class Fire;
14 class ItemFactory;
15 class GameEvent;
16 class Position;
17 class FurnitureEntry;
18 class FurnitureDroppedItems;
19 class ViewObject;
20 class MovementSet;
21 
22 class Furniture : public OwnedObject<Furniture> {
23   public:
24   static const string& getName(FurnitureType, int count = 1);
25   static FurnitureLayer getLayer(FurnitureType);
26 
27   Furniture(const string& name, const optional<ViewObject>&, FurnitureType, TribeId);
28   Furniture(const Furniture&);
29   const optional<ViewObject>& getViewObject() const;
30   optional<ViewObject>& getViewObject();
31   const string& getName(int count = 1) const;
32   FurnitureType getType() const;
33   bool isVisibleTo(WConstCreature) const;
34   const MovementSet& getMovementSet() const;
35   void onEnter(WCreature) const;
36   bool canDestroy(const MovementType&, const DestroyAction&) const;
37   bool canDestroy(const DestroyAction&) const;
38   optional<double> getStrength(const DestroyAction&) const;
39   void destroy(Position, const DestroyAction&);
40   void tryToDestroyBy(Position, WCreature, const DestroyAction&);
41   TribeId getTribe() const;
42   void setTribe(TribeId);
43   const optional<Fire>& getFire() const;
44   optional<Fire>& getFire();
45   void fireDamage(Position, double amount);
46   void tick(Position);
47   bool canSeeThru(VisionId) const;
48   bool stopsProjectiles(VisionId) const;
49   void click(Position) const;
50   bool isClickable() const;
51   bool overridesMovement() const;
52   void use(Position, WCreature) const;
53   bool canUse(WConstCreature) const;
54   optional<FurnitureUsageType> getUsageType() const;
55   int getUsageTime() const;
56   optional<FurnitureClickType> getClickType() const;
57   bool isTicking() const;
58   bool isWall() const;
59   void onConstructedBy(WCreature);
60   FurnitureLayer getLayer() const;
61   double getLightEmission() const;
62   bool canHide() const;
63   bool emitsWarning(WConstCreature) const;
64   WCreature getCreator() const;
65   optional<double> getCreatedTime() const;
66   optional<CreatureId> getSummonedElement() const;
67   /**
68    * @brief Calls special functionality to handle dropped items, if any.
69    * @return possibly empty subset of the items that weren't consumned and can be dropped normally.
70    */
71   vector<PItem> dropItems(Position, vector<PItem>) const;
72   bool canBuildBridgeOver() const;
73 
74   enum ConstructMessage { /*default*/BUILD, FILL_UP, REINFORCE, SET_UP };
75 
76   Furniture& setBlocking();
77   Furniture& setBlockingEnemies();
78   Furniture& setConstructMessage(optional<ConstructMessage>);
79   Furniture& setDestroyable(double);
80   Furniture& setDestroyable(double, DestroyAction::Type);
81   Furniture& setItemDrop(ItemFactory);
82   Furniture& setBurntRemains(FurnitureType);
83   Furniture& setDestroyedRemains(FurnitureType);
84   Furniture& setBlockVision();
85   Furniture& setBlockVision(VisionId, bool);
86   Furniture& setUsageType(FurnitureUsageType);
87   Furniture& setUsageTime(int);
88   Furniture& setClickType(FurnitureClickType);
89   Furniture& setTickType(FurnitureTickType);
90   Furniture& setEntryType(FurnitureEntry);
91   Furniture& setDroppedItems(FurnitureDroppedItems);
92   Furniture& setFireInfo(const Fire&);
93   Furniture& setIsWall();
94   Furniture& setOverrideMovement();
95   Furniture& setLayer(FurnitureLayer);
96   Furniture& setLightEmission(double);
97   Furniture& setCanHide();
98   Furniture& setEmitsWarning();
99   Furniture& setPlacementMessage(MsgType);
100   Furniture& setSummonedElement(CreatureId);
101   Furniture& setCanBuildBridgeOver();
102   Furniture& setStopProjectiles();
103   MovementSet& modMovementSet();
104 
105   SERIALIZATION_DECL(Furniture)
106 
107   ~Furniture();
108 
109   private:
110   HeapAllocated<optional<ViewObject>> SERIAL(viewObject);
111   string SERIAL(name);
112   string SERIAL(pluralName);
113   FurnitureType SERIAL(type);
114   FurnitureLayer SERIAL(layer) = FurnitureLayer::MIDDLE;
115   HeapAllocated<MovementSet> SERIAL(movementSet);
116   HeapAllocated<optional<Fire>> SERIAL(fire);
117   optional<FurnitureType> SERIAL(burntRemains);
118   optional<FurnitureType> SERIAL(destroyedRemains);
119   EnumMap<DestroyAction::Type, optional<double>> SERIAL(destroyActions);
120   HeapAllocated<optional<ItemFactory>> SERIAL(itemDrop);
121   EnumSet<VisionId> SERIAL(blockVision);
122   optional<FurnitureUsageType> SERIAL(usageType);
123   optional<FurnitureClickType> SERIAL(clickType);
124   optional<FurnitureTickType> SERIAL(tickType);
125   HeapAllocated<optional<FurnitureEntry>> SERIAL(entryType);
126   HeapAllocated<optional<FurnitureDroppedItems>> SERIAL(droppedItems);
127   int SERIAL(usageTime) = 1;
128   bool SERIAL(overrideMovement) = false;
129   bool SERIAL(wall) = false;
130   optional<ConstructMessage> SERIAL(constructMessage) = BUILD;
131   double SERIAL(lightEmission) = 0;
132   bool SERIAL(canHideHere) = false;
133   bool SERIAL(warning) = false;
134   WCreature SERIAL(creator);
135   optional<double> SERIAL(createdTime);
136   optional<CreatureId> SERIAL(summonedElement);
137   bool SERIAL(canBuildBridge) = false;
138   bool SERIAL(noProjectiles) = false;
139 };
140