public void BeginMoveTo(Entity entity, Point endPoint) { var moveTo = endPoint; var collision = _expiringSpatialHash.CheckCollision(moveTo) || WaterCollision(endPoint); var valid = true; if (collision) { var heuristic = _possibleMovements.Heuristic; var startPosition = entity.Position.ToPoint(); if (Math.Abs(heuristic.GetTraversalCost(startPosition, endPoint) - 1.0f) < 0.1f) { Interact(endPoint); valid = false; } else { var alternatuvePositions = FourWayPossibleMovement.FourWayAdjacentLocations(moveTo); var minCost = double.MaxValue; foreach (var position in alternatuvePositions) { if (!CollisionSystem.CheckCollision(position)) { var cost = heuristic.GetTraversalCost(startPosition, position); if (cost < minCost) { minCost = cost; moveTo = position; } } } if (moveTo == endPoint) { valid = false; } } } else { valid = !CollisionSystem.CheckCollision(moveTo); } if (valid) { MoveEntityTo(moveTo, entity, _tileSize.ToPoint(), _moverManager, collision, endPoint); } }
public void PathTypesTest() { var p1 = new Point(9, 5); var p2 = new Point(10, 4); var eightWayPossibleMovement = new EightWayPossibleMovement(new CrowDistance()); eightWayPossibleMovement.GetAdjacentLocations(p2); eightWayPossibleMovement.PositionsToCheck(p1, p2); PossibleMovementWrapper wrapper = new PossibleMovementWrapper(eightWayPossibleMovement); wrapper.PositionsToCheck(p1, p2); wrapper.GetAdjacentLocations(p1); Assert.AreEqual(wrapper.Heuristic, eightWayPossibleMovement.Heuristic); eightWayPossibleMovement = new EightWayPossibleMovement(new DiagonalDistance()); wrapper = new PossibleMovementWrapper(eightWayPossibleMovement); Assert.AreEqual(wrapper.Heuristic, eightWayPossibleMovement.Heuristic); eightWayPossibleMovement = new EightWayPossibleMovement(new ManhattanDistance()); wrapper = new PossibleMovementWrapper(eightWayPossibleMovement); Assert.AreEqual(wrapper.Heuristic, eightWayPossibleMovement.Heuristic); var fourWayPossibleMovement = new FourWayPossibleMovement(new CrowDistance()); fourWayPossibleMovement.PositionsToCheck(p1, p2); fourWayPossibleMovement.GetAdjacentLocations(p2); wrapper = new PossibleMovementWrapper(fourWayPossibleMovement); wrapper.PositionsToCheck(p1, p2); wrapper.GetAdjacentLocations(p1); Assert.AreEqual(wrapper.Heuristic, fourWayPossibleMovement.Heuristic); fourWayPossibleMovement = new FourWayPossibleMovement(new DiagonalDistance()); wrapper = new PossibleMovementWrapper(fourWayPossibleMovement); Assert.AreEqual(wrapper.Heuristic, fourWayPossibleMovement.Heuristic); fourWayPossibleMovement = new FourWayPossibleMovement(new ManhattanDistance()); wrapper = new PossibleMovementWrapper(fourWayPossibleMovement); Assert.AreEqual(wrapper.Heuristic, fourWayPossibleMovement.Heuristic); }
public void Interact(Point interactTarget) { var validInteraction = FourWayPossibleMovement.FourWayAdjacentLocations(PlayerEntity.Instance.Position.ToPoint()).Contains(interactTarget); if (validInteraction) { PlayerEntity.Instance.FacingDirection = interactTarget.ToVector2() - PlayerEntity.Instance.Position; var interactWith = _expiringSpatialHash.ValueAt(interactTarget); if (interactWith != null) { var story = interactWith.Interact(); story.Continue(); var entityDialogBox = DialogBox as EntityStoryBoxDialog; entityDialogBox?.StartStory(story, interactWith); } else if (Flags.AcquireRod) { if (WaterCollision(interactTarget)) { var random = new Random(); var fishComplete = random.Next(3) == 0; var scriptName = fishComplete ? "fish_success.ink" : "fish_fail.ink"; var fishScript = StoryImporter.ReadStory(scriptName); var story = new GameFrameStory(fishScript); if (fishComplete) { Flags.FishCount++; story.ChoosePathString("dialog"); story.SetVariableState("fish_count", Flags.FishCount); } story.Continue(); DialogBox.StartStory(story); } } } }