Exemple #1
0
        private bool TryTranslateStep(Vector2 offset, ref float distanceToTravel, ref bool didMove)
        {
            //
            // const float epsilon = (float) 1e-8;
            // if (Math.Abs(offset.magnitude) < epsilon)
            // {
            //  return false;
            // }

            Vector3 targetPosition = transform.position + (Vector3)offset;
            bool    walkable       = GameSurface.Instance.IsWalkableAtWorldPosition(targetPosition);

            if (!walkable)
            {
                return(false);
            }

            transform.position += (Vector3)offset;

            Vector2Int newPosition = GameSurface.WorldSpaceToGrid(transform.position);

            if (newPosition != _currentNodePosition)
            {
                _lastNodePosition = _currentNodePosition;
            }

            _currentNodePosition = newPosition;

            didMove           = true;
            distanceToTravel -= offset.magnitude;
            return(true);
        }
Exemple #2
0
        private Vector2 GetNormalAtWorldPosition(Vector2 targetPosition)
        {
            int sampleWidth = 4;

            Vector2    wallNormal   = Vector2.zero;
            Vector2Int gridPosition = GameSurface.WorldSpaceToGrid(targetPosition);

            for (int x = -sampleWidth; x < sampleWidth + 1; x++)
            {
                for (int y = -sampleWidth; y < sampleWidth + 1; y++)
                {
                    if ((x == 0) && (y == 0))
                    {
                        continue;
                    }

                    Vector2Int gridOffset = new Vector2Int(x, y);

                    if (GameSurface.Instance.IsWalkableAtGridPosition(gridPosition + gridOffset))
                    {
                        wallNormal += ((Vector2)gridOffset).normalized;
                    }
                }
            }

            return(wallNormal.normalized);
        }
Exemple #3
0
        private bool TrySafePlayerFromFalling()
        {
            Vector2?closestSafePosition         = null;
            float   closestSafePositionDistance = float.MaxValue;

            for (int x = -PixelTollelranceWhenFalling; x < PixelTollelranceWhenFalling + 1; x++)
            {
                for (int y = -PixelTollelranceWhenFalling; y < PixelTollelranceWhenFalling + 1; y++)
                {
                    Vector2Int potentialSafePosition = _lastNodePosition + new Vector2Int(x, y);
                    if (GameSurface.Instance.IsWalkableAtGridPosition(potentialSafePosition))
                    {
                        Vector2 safePositionWS = GameSurface.GridPositionToWorldPosition(potentialSafePosition);
                        float   distance       = Vector2.Distance(transform.position, safePositionWS);
                        if (distance < closestSafePositionDistance)
                        {
                            closestSafePosition         = safePositionWS;
                            closestSafePositionDistance = distance;
                        }
                    }
                }
            }

            if (closestSafePosition.HasValue)
            {
                transform.position = closestSafePosition.Value;
                return(true);
            }

            return(false);
        }
        public GameSurfaceSingleCutEvent(Vector2 from, Vector2 to)
        {
            Vector2Int fromGridPos = GameSurface.WorldSpaceToGrid(from);
            Vector2Int toGridPos   = GameSurface.WorldSpaceToGrid(to);

            _fromX = (byte)math.clamp(fromGridPos.x, 0, 255);
            _fromY = (byte)math.clamp(fromGridPos.y, 0, 255);
            _toX   = (byte)math.clamp(toGridPos.x, 0, 255);
            _toY   = (byte)math.clamp(toGridPos.y, 0, 255);
        }
        private void PlaceAIMove()
        {
#if COMPUTER_AGAINST_ITSELF
            Task.Run(() =>
            {
#endif
            var move = _game.GetAIMove(CurrentPlayer);
            GameSurface.Invoke((MethodInvoker)delegate { PlaceMove(move); });
#if COMPUTER_AGAINST_ITSELF
            });
#endif
        }
        public void Execute(int index)
        {
            Vector2Int gridPosition = GameSurface.GridIndexToGridPosition(index);
            int        x            = gridPosition.x;
            int        y            = gridPosition.y;

            Vector2 positonWS = GameSurface.GridPositionToWorldPosition(gridPosition);

            if (Vector2.Distance(Position, positonWS) < Radius)
            {
                int indexAtPosition = GameSurface.GetIndexAtGridPosition(new Vector2Int(x, y));
                Surface[indexAtPosition] = OverwriteState;
            }
        }
        public static object Deserialize(byte[] data)
        {
            byte    x        = data[0];
            byte    y        = data[1];
            Vector3 position = GameSurface.GridPositionToWorldPosition(new Vector2Int(x, y));

            float radiusBitMask = (data[2] & RadiusBitMask) / GameSurface.Size;
            bool  healSurface   = (data[2] & HealSurfaceBitMask) != 0;

            return(new GameSurfaceCircleEvent
            {
                WorldPosition = position,
                Radius = radiusBitMask,
                HealSurface = healSurface,
            });
        }
        private static byte[] Serialize(object customType)
        {
            GameSurfaceCircleEvent gameSurfaceCircleEvent = (GameSurfaceCircleEvent)customType;

            byte normalizedRadius = (byte)math.clamp(gameSurfaceCircleEvent.Radius * GameSurface.Size, 0, RadiusBitMask);
            byte packedByte       = normalizedRadius;

            if (gameSurfaceCircleEvent.HealSurface)
            {
                packedByte |= HealSurfaceBitMask;
            }

            Vector2Int gridPosition = GameSurface.WorldSpaceToGrid(gameSurfaceCircleEvent.WorldPosition);

            return(new[]
            {
                (byte)math.clamp(gridPosition.x, 0, 255),
                (byte)math.clamp(gridPosition.y, 0, 255),
                packedByte,
            });
        }
 public void Do(GameSurface surface)
 {
 }
 public GameSettings()
 {
     GameSurface = new GameSurface();
 }