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