import { board } from "../board.js" import { Vector2 } from "../engine/vector2.js" const SURROUNDING = [ new Vector2(-1, 0), new Vector2(0, 1), new Vector2(0, -1), new Vector2(1, 0), ] export function hasLiberties({ position, team }) { return checkLiberties({ position, team }) } function checkLiberties({ position, team, checkedStones = [], checkedLiberties = [], }) { if (isInArray(position, checkedStones)) { return false } if (checkedLiberties.length > 0) { console.log(team, checkedLiberties) } checkedStones.push(position) let surroundingSquares = getSurroundingSquares(position) findEmptySquares( surroundingSquares, checkedLiberties ) findFriendlyStones( surroundingSquares, {team, checkedStones, checkedLiberties} ) if (checkedLiberties.length == 1 && checkedStones.length < 2) { return true } if (checkedLiberties.length > 1) { return true } return false } function isInArray(position, array) { return Array.from(array) .some(p => Vector2.equals(p, position)) } function getSurroundingSquares(position) { return Array.from(SURROUNDING) .map(v => Vector2.sum(v, position)) .filter(z => 0 <= z.x && z.x < board.size && 0 <= z.y && z.y < board.size ) } function findEmptySquares(surroundingSquares, checkedLiberties) { surroundingSquares .filter(z => board.stones[z.y][z.x] == undefined) .forEach(z => { if (!isInArray(z, checkedLiberties)) { checkedLiberties.push(z) } }) } function findFriendlyStones(surroundingSquares, data) { surroundingSquares .filter(z => board.stones[z.y][z.x] != undefined) .filter(z => board.stones[z.y][z.x].team == data.team) .forEach(z => { checkLiberties({ position: z, team: data.team, checkedStones: data.checkedStones, checkedLiberties: data.checkedLiberties, }) }) }