| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 | 
							- /*
 
- * ObjectGraph.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 "AINodeStorage.h"
 
- #include "../AIUtility.h"
 
- namespace NKAI
 
- {
 
- class Nullkiller;
 
- struct ObjectLink
 
- {
 
- 	float cost = 100000; // some big number
 
- 	uint64_t danger = 0;
 
- 	std::shared_ptr<ISpecialActionFactory> specialAction;
 
- 	bool update(float newCost, uint64_t newDanger)
 
- 	{
 
- 		if(cost > newCost)
 
- 		{
 
- 			cost = newCost;
 
- 			danger = newDanger;
 
- 			return true;
 
- 		}
 
- 		return false;
 
- 	}
 
- };
 
- struct ObjectNode
 
- {
 
- 	ObjectInstanceID objID;
 
- 	MapObjectID objTypeID;
 
- 	bool objectExists;
 
- 	std::unordered_map<int3, ObjectLink> connections;
 
- 	void init(const CGObjectInstance * obj)
 
- 	{
 
- 		objectExists = true;
 
- 		objID = obj->id;
 
- 		objTypeID = obj->ID;
 
- 	}
 
- 	void initJunction()
 
- 	{
 
- 		objectExists = false;
 
- 		objID = ObjectInstanceID();
 
- 		objTypeID = Obj();
 
- 	}
 
- };
 
- class ObjectGraph
 
- {
 
- 	std::unordered_map<int3, ObjectNode> nodes;
 
- 	std::unordered_map<int3, ObjectInstanceID> virtualBoats;
 
- public:
 
- 	ObjectGraph()
 
- 		:nodes(), virtualBoats()
 
- 	{
 
- 	}
 
- 	void updateGraph(const Nullkiller * ai);
 
- 	void addObject(const CGObjectInstance * obj);
 
- 	void registerJunction(const int3 & pos);
 
- 	void addVirtualBoat(const int3 & pos, const CGObjectInstance * shipyard);
 
- 	void connectHeroes(const Nullkiller * ai);
 
- 	void removeObject(const CGObjectInstance * obj);
 
- 	bool tryAddConnection(const int3 & from, const int3 & to, float cost, uint64_t danger);
 
- 	void removeConnection(const int3 & from, const int3 & to);
 
- 	void dumpToLog(std::string visualKey) const;
 
- 	bool isVirtualBoat(const int3 & tile) const
 
- 	{
 
- 		return vstd::contains(virtualBoats, tile);
 
- 	}
 
- 	void copyFrom(const ObjectGraph & other)
 
- 	{
 
- 		nodes = other.nodes;
 
- 		virtualBoats = other.virtualBoats;
 
- 	}
 
- 	template<typename Func>
 
- 	void iterateConnections(const int3 & pos, Func fn)
 
- 	{
 
- 		for(auto & connection : nodes.at(pos).connections)
 
- 		{
 
- 			fn(connection.first, connection.second);
 
- 		}
 
- 	}
 
- 	const ObjectNode & getNode(int3 tile) const
 
- 	{
 
- 		return nodes.at(tile);
 
- 	}
 
- 	bool hasNodeAt(const int3 & tile) const
 
- 	{
 
- 		return vstd::contains(nodes, tile);
 
- 	}
 
- };
 
- }
 
 
  |