| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 | /* * 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 * */#pragma once#include "CObjectClassesHandler.h"#include "../CTownHandler.h" // for building ID-based filters#include "MapObjects.h"class CGObjectInstance;class CGTownInstance;class CGHeroInstance;class CGDwelling;class CHeroClass;class CBank;class CStackBasicDescriptor;/// Class that is used for objects that do not have dedicated handlertemplate<class ObjectType>class CDefaultObjectTypeHandler : public AObjectTypeHandler{protected:	ObjectType * createTyped(const ObjectTemplate & tmpl) const	{		auto obj = new ObjectType();		preInitObject(obj);		obj->appearance = tmpl;		return obj;	}public:	CDefaultObjectTypeHandler(){}	CGObjectInstance * create(const ObjectTemplate & tmpl) const override	{		return createTyped(tmpl);	}	virtual void configureObject(CGObjectInstance * object, CRandomGenerator & rng) const override	{	}	virtual std::unique_ptr<IObjectInfo> getObjectInfo(const ObjectTemplate & tmpl) const override	{		return nullptr;	}};class CObstacleConstructor : public CDefaultObjectTypeHandler<CGObjectInstance>{public:	CObstacleConstructor();	bool isStaticObject() override;};class CTownInstanceConstructor : public CDefaultObjectTypeHandler<CGTownInstance>{	JsonNode filtersJson;protected:	bool objectFilter(const CGObjectInstance *, const ObjectTemplate &) const override;	void initTypeData(const JsonNode & input) override;public:	CFaction * faction;	std::map<std::string, LogicalExpression<BuildingID>> filters;	CTownInstanceConstructor();	CGObjectInstance * create(const ObjectTemplate & tmpl) const override;	void configureObject(CGObjectInstance * object, CRandomGenerator & rng) const override;	void afterLoadFinalization() override;	template <typename Handler> void serialize(Handler &h, const int version)	{		h & filtersJson;		h & faction;		h & filters;		h & static_cast<CDefaultObjectTypeHandler<CGTownInstance>&>(*this);	}};class CHeroInstanceConstructor : public CDefaultObjectTypeHandler<CGHeroInstance>{	JsonNode filtersJson;protected:	bool objectFilter(const CGObjectInstance *, const ObjectTemplate &) const override;	void initTypeData(const JsonNode & input) override;public:	CHeroClass * heroClass;	std::map<std::string, LogicalExpression<HeroTypeID>> filters;	CHeroInstanceConstructor();	CGObjectInstance * create(const ObjectTemplate & tmpl) const override;	void configureObject(CGObjectInstance * object, CRandomGenerator & rng) const override;	void afterLoadFinalization() override;	template <typename Handler> void serialize(Handler &h, const int version)	{		h & filtersJson;		h & heroClass;		h & filters;		h & static_cast<CDefaultObjectTypeHandler<CGHeroInstance>&>(*this);	}};class CDwellingInstanceConstructor : public CDefaultObjectTypeHandler<CGDwelling>{	std::vector<std::vector<const CCreature *>> availableCreatures;	JsonNode guards;protected:	bool objectFilter(const CGObjectInstance *, const ObjectTemplate &) const override;	void initTypeData(const JsonNode & input) override;public:	CDwellingInstanceConstructor();	CGObjectInstance * create(const ObjectTemplate & tmpl) const override;	void configureObject(CGObjectInstance * object, CRandomGenerator & rng) const override;	bool producesCreature(const CCreature * crea) const;	std::vector<const CCreature *> getProducedCreatures() const;	template <typename Handler> void serialize(Handler &h, const int version)	{		h & availableCreatures;		h & guards;		h & static_cast<CDefaultObjectTypeHandler<CGDwelling>&>(*this);	}};struct BankConfig{	BankConfig() { chance = upgradeChance = combatValue = value = 0; };	ui32 value; //overall value of given things	ui32 chance; //chance for this level being chosen	ui32 upgradeChance; //chance for creatures to be in upgraded versions	ui32 combatValue; //how hard are guards of this level	std::vector<CStackBasicDescriptor> guards; //creature ID, amount	Res::ResourceSet resources; //resources given in case of victory	std::vector<CStackBasicDescriptor> creatures; //creatures granted in case of victory (creature ID, amount)	std::vector<ArtifactID> artifacts; //artifacts given in case of victory	std::vector<SpellID> spells; // granted spell(s), for Pyramid	template <typename Handler> void serialize(Handler &h, const int version)	{		h & chance;		h & upgradeChance;		h & guards;		h & combatValue;		h & resources;		h & creatures;		h & artifacts;		h & value;		h & spells;	}};typedef std::vector<std::pair<ui8, IObjectInfo::CArmyStructure>> TPossibleGuards;class DLL_LINKAGE CBankInfo : public IObjectInfo{	const JsonVector & config;public:	CBankInfo(const JsonVector & Config);	TPossibleGuards getPossibleGuards() const;	// These functions should try to evaluate minimal possible/max possible guards to give provide information on possible thread to AI	CArmyStructure minGuards() const override;	CArmyStructure maxGuards() const override;	bool givesResources() const override;	bool givesArtifacts() const override;	bool givesCreatures() const override;	bool givesSpells() const override;};class CBankInstanceConstructor : public CDefaultObjectTypeHandler<CBank>{	BankConfig generateConfig(const JsonNode & conf, CRandomGenerator & rng) const;	JsonVector levels;protected:	void initTypeData(const JsonNode & input) override;public:	// all banks of this type will be reset N days after clearing,	si32 bankResetDuration;	CBankInstanceConstructor();	CGObjectInstance * create(const ObjectTemplate & tmpl) const override;	void configureObject(CGObjectInstance * object, CRandomGenerator & rng) const override;	std::unique_ptr<IObjectInfo> getObjectInfo(const ObjectTemplate & tmpl) const override;	template <typename Handler> void serialize(Handler &h, const int version)	{		h & levels;		h & bankResetDuration;		h & static_cast<CDefaultObjectTypeHandler<CBank>&>(*this);	}};
 |