#include "crawl.hpp" #include #include #include "engine/displacement.hpp" namespace devilution { namespace { bool CrawlFlipsX(Displacement mirrored, tl::function_ref function) { for (const Displacement displacement : { mirrored.flipX(), mirrored }) { if (!function(displacement)) return false; } return true; } bool CrawlFlipsY(Displacement mirrored, tl::function_ref function) { for (const Displacement displacement : { mirrored, mirrored.flipY() }) { if (!function(displacement)) return false; } return true; } bool CrawlFlipsXY(Displacement mirrored, tl::function_ref function) { for (const Displacement displacement : { mirrored.flipX(), mirrored, mirrored.flipXY(), mirrored.flipY() }) { if (!function(displacement)) return false; } return true; } } // namespace bool DoCrawl(unsigned radius, tl::function_ref function) { if (radius == 0) return function(Displacement { 0, 0 }); if (!CrawlFlipsY({ 0, static_cast(radius) }, function)) return false; for (unsigned i = 1; i < radius; i++) { if (!CrawlFlipsXY({ static_cast(i), static_cast(radius) }, function)) return false; } if (radius > 1) { if (!CrawlFlipsXY({ static_cast(radius) - 1, static_cast(radius) - 1 }, function)) return false; } if (!CrawlFlipsX({ static_cast(radius), 0 }, function)) return false; for (unsigned i = 1; i < radius; i++) { if (!CrawlFlipsXY({ static_cast(radius), static_cast(i) }, function)) return false; } return true; } bool DoCrawl(unsigned minRadius, unsigned maxRadius, tl::function_ref function) { for (unsigned i = minRadius; i <= maxRadius; i++) { if (!DoCrawl(i, function)) return false; } return true; } } // namespace devilution