#pragma once #include "CObjectClassesHandler.h" #include "../CTownHandler.h" // for building ID-based filters /* * CommonConstructors.h, part of VCMI engine * * Authors: listed in file AUTHORS in main folder * * License: GNU General Public License v2.0 or later * Full text of license available in license.txt file, in main folder * */ class CGTownInstance; class CGHeroInstance; class CGDwelling; //class CGArtifact; //class CGCreature; class CHeroClass; /// Class that is used for objects that do not have dedicated handler template class CDefaultObjectTypeHandler : public AObjectTypeHandler { protected: ObjectType * createTyped(ObjectTemplate tmpl) const { auto obj = new ObjectType(); obj->ID = tmpl.id; obj->subID = tmpl.subid; obj->appearance = tmpl; return obj; } public: CDefaultObjectTypeHandler(){} CGObjectInstance * create(ObjectTemplate tmpl) const { return createTyped(tmpl); } virtual void configureObject(CGObjectInstance * object, CRandomGenerator & rng) const { } virtual const IObjectInfo * getObjectInfo(ObjectTemplate tmpl) const { return nullptr; } }; class CObstacleConstructor : public CDefaultObjectTypeHandler { public: CObstacleConstructor(); bool isStaticObject(); }; class CTownInstanceConstructor : public CDefaultObjectTypeHandler { JsonNode filtersJson; protected: bool objectFilter(const CGObjectInstance *, const ObjectTemplate &) const; public: CFaction * faction; std::map> filters; CTownInstanceConstructor(); CGObjectInstance * create(ObjectTemplate tmpl) const; void initTypeData(const JsonNode & input); void configureObject(CGObjectInstance * object, CRandomGenerator & rng) const; void afterLoadFinalization(); }; class CHeroInstanceConstructor : public CDefaultObjectTypeHandler { protected: bool objectFilter(const CGObjectInstance *, const ObjectTemplate &) const; public: CHeroClass * heroClass; CHeroInstanceConstructor(); CGObjectInstance * create(ObjectTemplate tmpl) const; void initTypeData(const JsonNode & input); void configureObject(CGObjectInstance * object, CRandomGenerator & rng) const; }; class CDwellingInstanceConstructor : public CDefaultObjectTypeHandler { protected: bool objectFilter(const CGObjectInstance *, const ObjectTemplate &) const; public: std::vector> availableCreatures; CDwellingInstanceConstructor(); CGObjectInstance * create(ObjectTemplate tmpl) const; void initTypeData(const JsonNode & input); void configureObject(CGObjectInstance * object, CRandomGenerator & rng) const; };