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); }
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; }
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; }
RelativeDirection ITakeDirection.TakeDirection(BaseSerpent serpent) { return takeDirection(serpent, false); }
RelativeDirection ITakeDirection.TakeDelayedDirection(BaseSerpent serpent) { return takeDirection(serpent, true); }
public bool CanOverrideRestrictedDirections(BaseSerpent serpent) { return true; }
RelativeDirection ITakeDirection.TakeDirection(BaseSerpent serpent) { return _random.NextDouble() < 0.5 ? RelativeDirection.Left : RelativeDirection.Right; }
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; }