function tilesInPattern(x, y, arr) {
// This indicates it was called without the array, which can only happen from outside of this function. It will return the array instead of true (it's part of a pattern)/false (it's not part of a pattern)
isReturningArray = false;
if (is_undefined(arr)) {
isReturningArray = true;
arr = [];
}
if (!doesTileExist(x, y)) {
if (isReturningArray) {
return [];
} else {
return true;
}
}
var len = array_length(arr);
for (var i = 0; i < len; i += 2) {
if (arr[i] == x and arr[i + 1] == y) {
return true; // Already visited here
}
}
// Mark that this location has been visited
array_push(arr, x, y);
// Check tile to the left
if (connectsToLeftTile(x, y)) {
if (!connectsToRightTile(x - 1, y) {
array_resize(arr, 0);
return false; // Pattern is not complete here
} else if (!tilesInPattern(x - 1, y, arr)) {
return false; // Pattern is not complete elsewhere
}
}
// Check tile to the right
if (connectsToRightTile(x, y)) {
if (!connectsToLeftTile(x + 1, y) {
array_resize(arr, 0);
return false; // Pattern is not complete here
} else if (!tilesInPattern(x + 1, y, arr)) {
return false; // Pattern is not complete elsewhere
}
}
// Check tile above
if (connectsToAboveTile(x, y)) {
if (!connectsToBelowTile(x, y - 1) {
array_resize(arr, 0);
return false; // Pattern is not complete here
} else if (!tilesInPattern(x, y - 1, arr)) {
return false; // Pattern is not complete elsewhere
}
}
// Check tile below
if (connectsToBelowTile(x, y)) {
if (!connectsToAboveTile(x, y + 1) {
array_resize(arr, 0);
return false; // Pattern is not complete here
} else if (!tilesInPattern(x - 1, y, arr)) {
return false; // Pattern is not complete elsewhere
}
}
if (isReturningArray) {
return arr;
} else {
return true;
}
}