Example #1
0
 public RelativeDirection TakeDirection(BaseSerpent serpent)
 {
     var pathFinder = serpent is PlayerSerpent ? PlayerPathFinder : EnemyPathFinder;
     var whereabouts = serpent.Whereabouts;
     whereabouts.Direction = serpent.HeadDirection;
     var direction = pathFinder.WayHome(whereabouts, CanTurnAround);
     return serpent.HeadDirection.GetRelativeDirection(direction);
 }
Example #2
0
 public SerpentCamera(Camera camera, BaseSerpent serpent, float tension = DefaultTension, float tensionIncreaseFactor = 1, float maxTension = DefaultTension)
     : base(camera)
 {
     _serpent = serpent;
     Tension = tension;
     TensionIncreaseFactor = tensionIncreaseFactor;
     MaxTension = maxTension;
 }
 RelativeDirection ITakeDirection.TakeDirection(BaseSerpent serpent)
 {
     _serpentIsHome = _homingDevice.PlayerPathFinder.GetDistance(_serpents.PlayerSerpent.Whereabouts) < (_homeIsNearCaveEntrance ? 6 : 3);
     _haltSerpents |= _serpentIsHome;
     return _homingDevice.TakeDirection(serpent);
 }
 RelativeDirection ITakeDirection.TakeDelayedDirection(BaseSerpent serpent)
 {
     return RelativeDirection.Forward;
 }
 bool ITakeDirection.CanOverrideRestrictedDirections(BaseSerpent serpent)
 {
     return true;
 }
Example #6
0
        RelativeDirection takeDirection(BaseSerpent serpent, bool delayed)
        {
            var kbd = _serpents.Camera.KeyboardState;
            var keyLeft = delayed ? kbd.IsKeyPressed(Keys.Left) : kbd.IsKeyDown(Keys.Left);
            var keyRight = delayed ? kbd.IsKeyPressed(Keys.Right) : kbd.IsKeyDown(Keys.Right);

            var pointerPoints = _serpents.Camera.PointerState.Points.Where(_ =>
                _.DeviceType == PointerDeviceType.Touch && _.EventType == PointerEventType.Moved).ToArray();
            var pointerLeft = pointerPoints.Any(_ => _.Position.X < 0.15f);
            var pointerRight = pointerPoints.Any(_ => _.Position.X > 0.5f);
            if (pointerLeft && pointerRight)
            {
                pointerLeft = false;
                pointerRight = false;
                _turnAround = !_isHoldingBothPointers;
                _isHoldingBothPointers = true;
            }
            else
                _isHoldingBothPointers = false;

            var nextDirection = RelativeDirection.Forward;
            if (!delayed && _turnAround)
            {
                nextDirection = RelativeDirection.Backward;
                _turnAround = false;
            }

            if (keyLeft || pointerLeft)
                nextDirection = RelativeDirection.Left;
            else if (keyRight || pointerRight)
                nextDirection = RelativeDirection.Right;
            return nextDirection;
        }
Example #7
0
 RelativeDirection ITakeDirection.TakeDirection(BaseSerpent serpent)
 {
     return takeDirection(serpent, false);
 }
Example #8
0
 RelativeDirection ITakeDirection.TakeDelayedDirection(BaseSerpent serpent)
 {
     return takeDirection(serpent, true);
 }
Example #9
0
 public bool CanOverrideRestrictedDirections(BaseSerpent serpent)
 {
     return true;
 }
Example #10
0
 RelativeDirection ITakeDirection.TakeDirection(BaseSerpent serpent)
 {
     return _random.NextDouble() < 0.5 ? RelativeDirection.Left : RelativeDirection.Right;
 }
Example #11
0
        public bool EatAt(BaseSerpent other, out int eatenSegments)
        {
            eatenSegments = 0;
            if (SerpentStatus != SerpentStatus.Alive || other.SerpentStatus != SerpentStatus.Alive)
                return false;
            IsLonger = _serpentLength >= other._serpentLength;
            if (SerpentStatus != SerpentStatus.Alive)
                return false;

            if (Vector3.DistanceSquared(Position, other.Position) < 0.8f)
            {
                if (other._serpentLength > _serpentLength)
                    return false;
                grow(other._serpentLength + 1);
                eatenSegments = other._serpentLength;
                return true;
            }

            for (var tail = other._tail; tail != null; tail = tail.Next)
                if (this.DistanceSquared(tail) < 0.2f)
                {
                    if (tail == other._tail)
                    {
                        grow(other._serpentLength + 1);
                        eatenSegments = other._serpentLength;
                        return true;
                    }
                    eatenSegments++;
                    grow(other.removeTail(tail));
                    return false;
                }
            return false;
        }