Пример #1
0
 private Slider GetSliderOnTile(Tile tile, SideName side)
 {
     if (tile != null)
     {
         if (tile.GetType() == typeof(Slider))
         {
             Slider slider = (Slider)tile;
             //slider moves left/right if left side is not attachable, so it moves on this rail
             if (!RobuzzleUtilities.IsTileAttachableOnSide(slider, side))
             {
                 return(slider);
             }
         }
         else if (tile.GetType() == typeof(SliderRail))
         {
             SliderRail rail = (SliderRail)tile;
             if (RobuzzleUtilities.IsTileAttachableOnOppositeSide(rail, side))
             {
                 return(GetSliderOnTile(
                            grid.GetTileAtPosition(tile.Position + RobuzzleUtilities.GetSideVector(side)),
                            side));
             }
         }
     }
     return(null);
 }
Пример #2
0
        public static SideName GetOppositeSide(SideName side)
        {
            switch (side)
            {
            case SideName.right:
                return(SideName.left);

            case SideName.left:
                return(SideName.right);

            case SideName.front:
                return(SideName.back);

            case SideName.back:
                return(SideName.front);

            case SideName.up:
                return(SideName.down);

            case SideName.down:
                return(SideName.up);
            }
            //Code will never get here.. So, to fulfil the requirement of compoiler
            return(SideName.right);
        }
Пример #3
0
        private void TryJoiningNeighbor(MovableTile tile, Tile neighbor, SideName side)
        {
            if (IsMovable(neighbor)) // the neighbor is attachable/movable
            {
                MovableTile neighborMovableTile = (MovableTile)neighbor;
                bool        neighborAttachableOnOppositeSide =
                    RobuzzleUtilities.IsTileAttachableOnOppositeSide(neighborMovableTile, side);

                if (neighborAttachableOnOppositeSide) //the tile and neighbor can join together
                {
                    //if the tile neighbor tile are not already attached
                    if (!AreAttached(tile, neighborMovableTile))
                    {
                        RigidbodyTile RBTile = GetRigidbodyTile(tile);
                        if (RBTile != null)//If neighbor already has a rigidbody, attach both rigidbodies
                        {
                            JoinNeighbor(RBTile, neighborMovableTile, side);
                        }
                        else//join simple movable tile with neighbors -> or can that be done somewhere else
                        {
                            RigidbodyTile RBNeighbor = GetRigidbodyTile(neighborMovableTile);
                            if (RBNeighbor != null)
                            {
                                JoinNeighbor(RBNeighbor, tile, RobuzzleUtilities.GetOppositeSide(side)); //this tile is on the left of neighbor
                            }
                        }
                    }
                }
            }
        }
Пример #4
0
        public override byte[] Serialize()
        {
            List <byte> s = new List <byte>();

            // serialize SideName
            s.Add((byte)((SideName == null) ? 0 : 1));
            if (SideName != null)
            {
                List <byte> tmp63 = new List <byte>();
                tmp63.AddRange(BitConverter.GetBytes((uint)SideName.Count()));
                while (tmp63.Count > 0 && tmp63.Last() == 0)
                {
                    tmp63.RemoveAt(tmp63.Count - 1);
                }
                s.Add((byte)tmp63.Count);
                s.AddRange(tmp63);

                s.AddRange(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(SideName));
            }

            // serialize AgentName
            s.Add((byte)((AgentName == null) ? 0 : 1));
            if (AgentName != null)
            {
                List <byte> tmp64 = new List <byte>();
                tmp64.AddRange(BitConverter.GetBytes((uint)AgentName.Count()));
                while (tmp64.Count > 0 && tmp64.Last() == 0)
                {
                    tmp64.RemoveAt(tmp64.Count - 1);
                }
                s.Add((byte)tmp64.Count);
                s.AddRange(tmp64);

                s.AddRange(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(AgentName));
            }

            // serialize TeamNickname
            s.Add((byte)((TeamNickname == null) ? 0 : 1));
            if (TeamNickname != null)
            {
                List <byte> tmp65 = new List <byte>();
                tmp65.AddRange(BitConverter.GetBytes((uint)TeamNickname.Count()));
                while (tmp65.Count > 0 && tmp65.Last() == 0)
                {
                    tmp65.RemoveAt(tmp65.Count - 1);
                }
                s.Add((byte)tmp65.Count);
                s.AddRange(tmp65);

                s.AddRange(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(TeamNickname));
            }

            return(s.ToArray());
        }
Пример #5
0
            public PositionParameter(SideName sideName) : base(sideName)
            {
                KingToMoveLoss = new Plane[nSquares];
                PawnToMoveWins = new Plane[nSquares];
#if TestInitHelp || InitFree || !InitHelp
                Free = new Plane[nSquares];
#endif
#if TestInitFree || InitHelp || !InitFree
                Help = new Plane[nSquares];
#endif
            }
Пример #6
0
 //TODO: Recheck tile type
 private void JoinNeighbor(RigidbodyTile tile, MovableTile neighbor, SideName side)
 {
     //the neighbor is on left, down or back side of the tile
     if (side == SideName.left || side == SideName.down || side == SideName.back)
     {
         JoinNeighbor(tile, neighbor, true);
     }
     else// neighbor is on the right, up or front side of the tile
     {
         JoinNeighbor(tile, neighbor, false);
     }
 }
Пример #7
0
 private static void displayEarlyMoveCounts(SideName sideName, Int64 lEarlyMoveTotal, Int64 lSearchedPositionCount)
 {
     //[Note]Move Ordering is applied in a "Searched Position", not during a quiescence search.
     if (lSearchedPositionCount == 0)
     {
         LogInfo(Level.data, $"{sideName} Early Moves = {lEarlyMoveTotal:n0}");
     }
     else
     {
         var dEarlyMovesPerPosition = (Double)lEarlyMoveTotal / lSearchedPositionCount;
         LogInfo(Level.data,
                 $"{sideName} Early Moves = {lEarlyMoveTotal:n0}; Searched Positions = {lSearchedPositionCount:n0}");
         LogInfo(Level.data, $"{sideName} Early Moves/Searched Position = {dEarlyMovesPerPosition:n2}");
     }
 }
Пример #8
0
 private void SetSliderBound(Slider slider, Tile tile, SideName side)
 {
     if (tile != null && tile.GetType() == typeof(SliderRail))
     {
         SliderRail rail = (SliderRail)tile;
         if (RobuzzleUtilities.IsTileAttachableOnOppositeSide(rail, side))
         {
             if (RobuzzleUtilities.IsPositiveSide(side))
             {
                 slider.MaxBound = GetExtremeBoundNIgnoreCollision(slider, rail, side);
             }
             else
             {
                 slider.MinBound = GetExtremeBoundNIgnoreCollision(slider, rail, side);
             }
         }
     }
 }
Пример #9
0
            public BoardParameter(SideName sideName)
            {
                SideName = sideName;

                switch (SideName)
                {
                case SideName.Black:
                    ShiftA1H8 = -nA1H8;
                    ShiftA8H1 = -nA8H1;
                    ShiftRank = -nFiles;

                    StartRank     = nRankLast;
                    EnPassantRank = 2;

                    RankLast  = qpRank1;
                    RankPass  = qpRank6;
                    FileLeft  = qpFileH;
                    FileRight = qpFileA;
                    Above     = qpRank1 | qpRank2 | qpRank3 | qpRank4;

                    Zobrist = ZobristBlack;
                    break;

                case SideName.White:
                    ShiftA1H8 = nA1H8;
                    ShiftA8H1 = nA8H1;
                    ShiftRank = nFiles;

                    StartRank     = 0;
                    EnPassantRank = invertRank(2);

                    RankLast  = qpRank8;
                    RankPass  = qpRank3;
                    FileLeft  = qpFileA;
                    FileRight = qpFileH;
                    Above     = qpRank8 | qpRank7 | qpRank6 | qpRank5;

                    Zobrist = ZobristWhite;
                    break;
                }
            }
Пример #10
0
        public override byte[] Serialize()
        {
            List <byte> s = new List <byte>();

            // serialize SideName
            s.Add((byte)((SideName == null) ? 0 : 1));
            if (SideName != null)
            {
                List <byte> tmp78 = new List <byte>();
                tmp78.AddRange(BitConverter.GetBytes((uint)SideName.Count()));
                while (tmp78.Count > 0 && tmp78.Last() == 0)
                {
                    tmp78.RemoveAt(tmp78.Count - 1);
                }
                s.Add((byte)tmp78.Count);
                s.AddRange(tmp78);

                s.AddRange(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(SideName));
            }

            // serialize AgentName
            s.Add((byte)((AgentName == null) ? 0 : 1));
            if (AgentName != null)
            {
                List <byte> tmp79 = new List <byte>();
                tmp79.AddRange(BitConverter.GetBytes((uint)AgentName.Count()));
                while (tmp79.Count > 0 && tmp79.Last() == 0)
                {
                    tmp79.RemoveAt(tmp79.Count - 1);
                }
                s.Add((byte)tmp79.Count);
                s.AddRange(tmp79);

                s.AddRange(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(AgentName));
            }

            return(s.ToArray());
        }
Пример #11
0
        public static Vector3Int GetSideVector(SideName side)
        {
            switch (side)
            {
            case SideName.right:
                return(Vector3Int.right);

            case SideName.left:
                return(Vector3Int.left);

            case SideName.front:
                return(new Vector3Int(0, 0, 1));

            case SideName.back:
                return(new Vector3Int(0, 0, -1));

            case SideName.up:
                return(Vector3Int.up);

            case SideName.down:
                return(Vector3Int.down);
            }
            return(Vector3Int.zero);
        }
Пример #12
0
        public static bool IsTileAttachableOnSide(MovableTile tile, SideName side)
        {
            switch (side)
            {
            case SideName.right:
                return(tile.AttachableSides.right);

            case SideName.left:
                return(tile.AttachableSides.left);

            case SideName.front:
                return(tile.AttachableSides.front);

            case SideName.back:
                return(tile.AttachableSides.back);

            case SideName.up:
                return(tile.AttachableSides.up);

            case SideName.down:
                return(tile.AttachableSides.down);
            }
            return(false);
        }
Пример #13
0
        // Any perpendicular axis to the Vector
        public static Vector3Int GetPerpendicularSideVector(SideName side)
        {
            switch (side)
            {
            case SideName.right:
                return(Vector3Int.up);

            case SideName.left:
                return(Vector3Int.down);

            case SideName.front:
                return(Vector3Int.right);

            case SideName.back:
                return(Vector3Int.left);

            case SideName.up:
                return(Vector3Int.right);

            case SideName.down:
                return(Vector3Int.left);
            }
            return(Vector3Int.zero);
        }
Пример #14
0
        private Vector3Int GetExtremeBoundNIgnoreCollision(Slider slider, SliderRail rail, SideName side)
        {
            Physics.IgnoreCollision(slider.transform.GetChild(0).GetComponent <Collider>(), rail.transform.GetChild(0).GetComponent <Collider>(), true);
            grid.RemoveTile(rail);
            if (RobuzzleUtilities.IsTileAttachableOnSide(rail, side))
            {
                Tile tile = grid.GetTileAtPosition(rail.Position + RobuzzleUtilities.GetSideVector(side));
                if (tile != null && tile.GetType() == typeof(SliderRail))
                {
                    SliderRail rail2 = (SliderRail)tile;
                    if (RobuzzleUtilities.IsTileAttachableOnOppositeSide(rail2, side))
                    {
                        return(GetExtremeBoundNIgnoreCollision(slider, rail2, side));
                    }
                }
                return(rail.Position);
            }

            return(Vector3Int.zero);
        }
Пример #15
0
 //if a side is right, up, or forward
 public static bool IsPositiveSide(SideName side)
 {
     return(side == SideName.right || side == SideName.up || side == SideName.front);
 }