Browse Source

Add constructor for boat

nordsoft 2 years ago
parent
commit
d83566bc74

+ 1 - 1
lib/mapObjects/CObjectClassesHandler.cpp

@@ -39,6 +39,7 @@ CObjectClassesHandler::CObjectClassesHandler()
 	SET_HANDLER_CLASS("hero", CHeroInstanceConstructor);
 	SET_HANDLER_CLASS("town", CTownInstanceConstructor);
 	SET_HANDLER_CLASS("bank", CBankInstanceConstructor);
+	SET_HANDLER_CLASS("boat", BoatInstanceConstructor);
 
 	SET_HANDLER_CLASS("static", CObstacleConstructor);
 	SET_HANDLER_CLASS("", CObstacleConstructor);
@@ -54,7 +55,6 @@ CObjectClassesHandler::CObjectClassesHandler()
 	SET_HANDLER("cartographer", CCartographer);
 	SET_HANDLER("artifact", CGArtifact);
 	SET_HANDLER("blackMarket", CGBlackMarket);
-	SET_HANDLER("boat", CGBoat);
 	SET_HANDLER("borderGate", CGBorderGate);
 	SET_HANDLER("borderGuard", CGBorderGuard);
 	SET_HANDLER("monster", CGCreature);

+ 20 - 0
lib/mapObjects/CommonConstructors.cpp

@@ -257,6 +257,26 @@ std::vector<const CCreature *> CDwellingInstanceConstructor::getProducedCreature
 	return creatures;
 }
 
+void BoatInstanceConstructor::initTypeData(const JsonNode & input)
+{
+	layer = EPathfindingLayer::EEPathfindingLayer::SAIL;
+	if(input["layer"].String() == "land")
+		layer = EPathfindingLayer::EEPathfindingLayer::LAND;
+	if(input["layer"].String() == "air")
+		layer = EPathfindingLayer::EEPathfindingLayer::AIR;
+	if(input["layer"].String() == "water")
+		layer = EPathfindingLayer::EEPathfindingLayer::WATER;
+	if(input["layer"].String() == "sail")
+		layer = EPathfindingLayer::EEPathfindingLayer::SAIL;
+}
+
+CGObjectInstance * BoatInstanceConstructor::create(std::shared_ptr<const ObjectTemplate> tmpl) const
+{
+	CGBoat * boat = createTyped(tmpl);
+	boat->layer = layer;
+	return boat;
+}
+
 bool CBankInstanceConstructor::hasNameTextID() const
 {
 	return true;

+ 16 - 0
lib/mapObjects/CommonConstructors.h

@@ -140,6 +140,22 @@ public:
 	}
 };
 
+class BoatInstanceConstructor : public CDefaultObjectTypeHandler<CGBoat>
+{
+protected:
+	void initTypeData(const JsonNode & config) override;
+	
+	EPathfindingLayer::EEPathfindingLayer layer;
+	
+public:
+	CGObjectInstance * create(std::shared_ptr<const ObjectTemplate> tmpl = nullptr) const override;
+
+	template <typename Handler> void serialize(Handler &h, const int version)
+	{
+		h & static_cast<CDefaultObjectTypeHandler<CGBoat>&>(*this);
+	}
+};
+
 struct BankConfig
 {
 	ui32 value = 0; //overall value of given things

+ 4 - 0
lib/mapObjects/MiscObjects.h

@@ -419,6 +419,8 @@ class DLL_LINKAGE CGBoat : public CGObjectInstance
 public:
 	ui8 direction;
 	const CGHeroInstance *hero;  //hero on board
+	
+	EPathfindingLayer::EEPathfindingLayer layer;
 
 	void initObj(CRandomGenerator & rand) override;
 
@@ -426,12 +428,14 @@ public:
 	{
 		hero = nullptr;
 		direction = 4;
+		layer = EPathfindingLayer::EEPathfindingLayer::SAIL;
 	}
 	template <typename Handler> void serialize(Handler &h, const int version)
 	{
 		h & static_cast<CGObjectInstance&>(*this);
 		h & direction;
 		h & hero;
+		h & layer;
 	}
 };
 

+ 1 - 0
lib/registerTypes/RegisterTypes.h

@@ -88,6 +88,7 @@ void registerTypesMapObjectTypes(Serializer &s)
 	s.template registerType<AObjectTypeHandler, CTownInstanceConstructor>();
 	s.template registerType<AObjectTypeHandler, CDwellingInstanceConstructor>();
 	s.template registerType<AObjectTypeHandler, CBankInstanceConstructor>();
+	s.template registerType<AObjectTypeHandler, BoatInstanceConstructor>();
 	s.template registerType<AObjectTypeHandler, CObstacleConstructor>();
 
 #define REGISTER_GENERIC_HANDLER(TYPENAME) s.template registerType<AObjectTypeHandler, CDefaultObjectTypeHandler<TYPENAME> >()