示例#1
0
        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);
            }
        }
示例#2
0
        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);
        }
示例#3
0
        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);
                    }
                }
            }
        }