浏览代码

Improved guard placement for large objects.

DjWarmonger 11 年之前
父节点
当前提交
890f29fa7e
共有 1 个文件被更改,包括 13 次插入4 次删除
  1. 13 4
      lib/rmg/CRmgTemplateZone.cpp

+ 13 - 4
lib/rmg/CRmgTemplateZone.cpp

@@ -1059,19 +1059,28 @@ void CRmgTemplateZone::placeObject(CMapGenerator* gen, CGObjectInstance* object,
 
 bool CRmgTemplateZone::guardObject(CMapGenerator* gen, CGObjectInstance* object, si32 str)
 {
-	
 	logGlobal->traceStream() << boost::format("Guard object at %d %d") % object->pos.x % object->pos.y;
 	int3 visitable = object->visitablePos();
 	std::vector<int3> tiles;
+
+	auto tilesBlockedByObject = object->getBlockedPos(); //absolue value, as object is already placed
+
 	gen->foreach_neighbour(visitable, [&](int3& pos) 
 	{
-		logGlobal->traceStream() << boost::format("Block at %d %d") % pos.x % pos.y;
 		if (gen->isPossible(pos))
 		{
-			tiles.push_back(pos);
+			if (!vstd::contains(tilesBlockedByObject, pos))
+			{
+				if (object->appearance.isVisitableFrom(pos.x - visitable.x, pos.y - visitable.y) && !gen->isBlocked(pos)) //TODO: refactor - info about visitability from absolute coordinates
+				{
+					logGlobal->traceStream() << boost::format("Block at %d %d") % pos.x % pos.y;
+					tiles.push_back(pos);
+				}
+			}
+
 		};
 	});
-	if ( ! tiles.size())
+	if (!tiles.size())
 	{		
 		logGlobal->infoStream() << "Failed";
 		return false;