protected Hexigon.Layout ChooseLegalLayout(int hash, Vector3 worldPosition)
    {
        Hexigon.Layout        target  = layoutRequirements[hash];
        List <Hexigon.Layout> layouts = target.FindMatchingLayouts();

        for (int i = 0; i < layouts.Count; i++)
        {
            Hexigon.Layout layout = layouts[i];
            foreach (Hexigon.ConnectorType connection in layout.connections)
            {
                if (connection == Hexigon.ConnectorType.OUTPUT)
                {
                    int h = PositionToHash(worldPosition, (int)connection);
                    if (layoutRequirements.ContainsKey(h))
                    {
                        if (!layoutRequirements[h].isFringe)
                        {
                            layouts.RemoveAt(i);
                            break;
                        }
                    }
                }
            }
        }

        return(layouts[Random.Range(0, layouts.Count)]);
    }
    protected Hexigon ApplyLayoutConstraints(Hexigon hexigon)
    {
        hexigon.layout.isFringe          = false;
        layoutRequirements[hexigon.Hash] = hexigon.layout;

        // Surrounding tiles need rules
        for (int i = 0; i < hexigon.layout.connections.Length; i++)
        {
            Hexigon.ConnectorType connectionType = hexigon.layout.connections[i];
            if (!CheckLegalOutput(i, connectionType))
            {
                continue;
            }

            Vector3 worldPosition = GenerateHexigonWorldPosition(hexigon, i);
            int     hash          = PositionToHash(worldPosition);

            if (!layoutRequirements.ContainsKey(hash))
            {
                layoutRequirements[hash] = new Hexigon.Layout(-1, new[] { 0, 0, 0, 0, 0, 0 });
            }

            Hexigon.Layout result = layoutRequirements[hash];
            if (result.isFringe)
            {
                result.AddConnection((i + 3) % 6, Hexigon.ConnectorType.INPUT);
                layoutRequirements[hash] = result;
            }

            Debug.DrawLine(hexigon.WorldPosition, worldPosition, Color.red, 100);
            Debug.DrawRay(worldPosition, Vector3.up, Color.green, 100);
            Debug.DrawRay(worldPosition, Vector3.up * 50, Color.white, 5);
        }

        return(hexigon);
    }