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 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); } } } }