예제 #1
0
        public void KnownNodeActorCanUpdateKnownNodes()
        {
            var    map       = SetupZoneMap.SetupSmallGrid();
            string mapName   = SetupPersister.GetCurrentMethodName();
            var    persister = new FilePersister(mapName);
            var    actor     = new KnownNodeActor(persister, map);
            var    traveler  = new Traveler();
            var    watcher   = new Watcher(traveler, actor);

            var newPos = new Vector3(1, 0, 1);

            traveler.Position = newPos;

            var wantGrid = SetupZoneMap.SetupSmallGrid();

            wantGrid.AddKnownNode(newPos);

            var want = wantGrid.UnknownNodes;
            var got  = persister.Load <ZoneMap>();

            Assert.Equal(want.Count, got.UnknownNodes.Count);
            for (var i = 0; i < want.Count; i++)
            {
                Assert.Equal(want[i], got.UnknownNodes[i]);
            }
        }
예제 #2
0
        public void TravelerMarksNodesAsUnWalkableWhenStuck()
        {
            const string unused = @"
-------------------
|  e  |     |  ?  |
-------------------
|  x  |  x  |     |
-------------------
|  s  |     |  ?  |
-------------------
";
            // setup the world
            var zoneMap = ZoneMap.TinyMap();
            var zone    = new Zone("test")
            {
                Map = zoneMap
            };

            var world = new World();

            world.Zones.Add(zone);

            var walker = new Walker(new Vector3(-1, 0, -1));

            // Create the map the blind traveler will move against
            var knownGrid = ZoneMap.TinyMap();

            knownGrid.AddUnWalkableNode(Vector3.Zero);
            knownGrid.AddUnWalkableNode(new Vector3(-1, 0, 0));

            var revealedZone = new Zone("test");

            revealedZone.Map    = knownGrid;
            walker.RevealedZone = revealedZone;

            var traveler      = new Traveler("test", world, walker);
            var stubPersister = new StubPersister();
            var actor         = new KnownNodeActor(stubPersister, traveler.CurrentZone.Map);
            var watcher       = new Watcher(traveler, actor);

            // For this to work in the FFXI Finite State Machine this currently needs to exit
            // Frequently to allow for mobs and other stuff to get targeted. Should customize this behavior
            // To either break on events in the FSM or allow for extension to choose whether to exit under
            // certain conditions or not.
            for (int i = 0; i < 10; i++)
            {
                traveler.PathfindAndWalkToFarAwayWorldMapPosition(new Vector3(-1, 0, 1));
            }

            var want = new Vector3(-1, 0, 1);
            var got  = traveler.Position;


            Assert.Equal(want, got);
            Assert.Equal(2, traveler.CurrentZone.Map.UnknownNodes.Count);
            // Assert.Equal(traveler.PositionHistory);


            // Assert.Equal(want, got);
        }
예제 #3
0
        public void MappingThreadOpens()
        {
            const string expectedUnknowns = @"
-------------------------------
|  ?  |  ?  |  ?  |  ?  |     |
-------------------------------
|  ?  |  ?  |  ?  |     |  ?  |
-------------------------------
|  ?  |  ?  |     |  ?  |  ?  |
-------------------------------
|  ?  |     |  ?  |  ?  |  ?  |
-------------------------------
|     |  ?  |  ?  |  ?  |  ?  |
-------------------------------
";
            // start the watcher and map
            var zone = new Zone("tests");
            var grid = SetupZoneMap.SetupMediumGrid();

            zone.Map = grid;
            var stubPersister = new StubPersister();
            var actor         = new KnownNodeActor(stubPersister, grid);

            // Walk a Path
            var startPos = new Vector3(-2, 0, -2);
            var endPos   = new Vector3(2, 0, 2);

            Vector3[] path =
            {
                startPos,
                new Vector3(-1f, 0f, -1f),
                new Vector3(0),
                new Vector3(1f,  0f,  1f),
                endPos
            };


            var traveler = new Traveler();
            // Watcher must be watching traveler before it gets it's current position otherwise it won't record the starting
            // position
            var watcher = new Watcher(traveler, actor);

            traveler.CurrentZone = zone;
            traveler.Position    = new Vector3(-2, 0, -2);
            traveler.PathMaker   = new GridPathMaker {
                ZoneMap = zone.Map
            };

            // Walked path
            traveler.PathfindAndWalkToFarAwayWorldMapPosition(endPos);
            var got = traveler.Walker.PositionHistory.ToArray();

            AssertVectorArrayEqual(path, got);

            // Visual Representation
            string actualUnknonws = grid.PrintKnown();

            Assert.Equal(expectedUnknowns, actualUnknonws);

            // Unknown Nodes correct
            var expectedGrid = SetupZoneMap.SetupMediumGrid();

            foreach (var position in path)
            {
                expectedGrid.AddKnownNode(position);
            }

            Assert.Equal(expectedGrid.UnknownNodes.Count, grid.UnknownNodes.Count);
            Assert.Equal(expectedGrid.UnknownNodes, grid.UnknownNodes);
        }