Exemplo n.º 1
0
        public void TestKSHBeatmap2()
        {
            using (var file = OpenTestMap("C18H27NO3"))
            {
                BeatmapKsh kshBeatmap = new BeatmapKsh(file);
                Assert.IsNotEmpty(kshBeatmap.Options);
                Assert.AreEqual(19, kshBeatmap.Options.Count);
                Assert.AreEqual("C18H27NO3", kshBeatmap.Options["title"]);
                Assert.AreEqual("210", kshBeatmap.Options["t"]);
                Assert.AreEqual("160", kshBeatmap.Options["ver"]);
                Assert.AreEqual("zMFGXvEzqCnbudCN.png", kshBeatmap.Options["jacket"]);

                Assert.IsNotEmpty(kshBeatmap.Measures);
                var m0 = kshBeatmap.Measures[0];
                Assert.AreEqual(1, m0.Ticks.Length);
                var t0 = m0.Ticks[0];
                for (int i = 0; i < 6; i++)
                {
                    Assert.AreEqual('0', t0.Button[i]);
                }

                // Check for custom effects
                Assert.AreEqual(6, kshBeatmap.EffectDefinitions.Count);
                Assert.AreEqual("WG", kshBeatmap.EffectDefinitions[3].Name);
                Assert.AreEqual(EffectType.UserDefined3, kshBeatmap.EffectDefinitions[3].Type);
                Assert.Contains("type", kshBeatmap.EffectDefinitions[3].Options.Keys);
            }
        }
Exemplo n.º 2
0
        public void TestKSHBeatmap1()
        {
            using (var file = OpenTestMap("soflan"))
            {
                // Load only metadata
                BeatmapKsh kshBeatmap = new BeatmapKsh(file, true);
                Assert.IsEmpty(kshBeatmap.Measures);
                Assert.IsNotEmpty(kshBeatmap.Options);
                Assert.AreEqual(20, kshBeatmap.Options.Count);
                Assert.AreEqual("ノリニクシティ・マックス!混乱帝国そふらんカレー\こんなあおにゃんありえなーーい!!/", kshBeatmap.Options["illustrator"]);
                Assert.AreEqual("32-259", kshBeatmap.Options["t"]);
                Assert.AreEqual("140d", kshBeatmap.Options["ver"]);
            }

            using (var file = OpenTestMap("soflan"))
            {
                // Load again but fully this time
                BeatmapKsh kshBeatmap = new BeatmapKsh(file, false);
                Assert.IsNotEmpty(kshBeatmap.Measures);

                var firstMeasure = kshBeatmap.Measures[0];
                Assert.AreEqual(1, firstMeasure.Ticks.Length);

                var firstTick = firstMeasure.Ticks[0];
                Assert.AreEqual(2, firstTick.Options.Count);
                Assert.AreEqual("230", firstTick.Options["t"]);

                Assert.AreEqual(BeatmapKsh.Tick.LaserNone, firstTick.Lasers[0]);
                Assert.AreEqual(BeatmapKsh.Tick.LaserNone, firstTick.Lasers[1]);
            }
        }
Exemplo n.º 3
0
        private void RunBeatmapScanner(CancellationToken token)
        {
            List <FileInfo> mapFiles = new List <FileInfo>();

            // Files that should be found in the result so they are not considered for removal
            HashSet <string> filesToRemove = new HashSet <string>(difficultyLastWriteTimes.Keys);

            // Scan folder layout
            foreach (var searchPath in searchPaths)
            {
                foreach (var file in Directory.EnumerateFiles(searchPath, "*.ksh", SearchOption.AllDirectories))
                {
                    if (token.IsCancellationRequested)
                    {
                        return;
                    }

                    var fileInfo = new FileInfo(file);
                    mapFiles.Add(fileInfo);
                    filesToRemove.Remove(fileInfo.FullName); // Do not remove this map, it still exists
                }
            }

            // Process removals
            databaseScheduler.Add(() => RemoveDifficulties(filesToRemove));

            // Process found map files
            foreach (var mapFile in mapFiles)
            {
                if (!IsDifficultyAddedOrChanged(mapFile))
                {
                    continue; // Skip unchanged maps
                }
                // Try to load map metadata
                try
                {
                    var             stream = File.OpenRead(mapFile.FullName);
                    BeatmapKsh      mapKsh = new BeatmapKsh(stream, true);
                    Beatmap.Beatmap map    = new Beatmap.Beatmap(mapKsh);
                    databaseScheduler.Add(() => { AddDifficulty(mapFile, map.Metadata); });
                }
                catch (BeatmapParserException)
                {
                    Debug.WriteLine($"Corrupted map [{mapFile.Name}], not adding it to the database");
                    if (difficultyLastWriteTimes.ContainsKey(mapFile.FullName))
                    {
                        // Difficulty existed, remove it now since it is corrupt
                        databaseScheduler.Add(() => RemoveDifficulties(new HashSet <string> {
                            mapFile.FullName
                        }));
                    }
                }
            }

            // Notify finished
            databaseScheduler.Add(() => SearchFinished?.Invoke(this, null));
            IsSearchRunning = false;
        }
Exemplo n.º 4
0
        public void TestActiveObjects()
        {
            Beatmap beatmap;

            using (var file = OpenTestMap("C18H27NO3"))
            {
                // Load only metadata
                BeatmapKsh kshBeatmap = new BeatmapKsh(file);
                beatmap = new Beatmap(kshBeatmap);
            }

            BeatmapPlayback playback = new BeatmapPlayback();

            playback.Beatmap      = beatmap;
            playback.ViewDuration = 0.2;
            playback.Position     = 3.0;

            Assert.AreEqual(2, playback.ActiveObjects.Count);

            playback.Position = 13.285;
            Assert.AreEqual(1, playback.ActiveObjects.Count);
            Assert.IsAssignableFrom(typeof(Laser), playback.ActiveObjects[0].Object);

            // Same test but with larger view duration
            playback.ViewDuration = 1.0;
            Assert.AreEqual(1, playback.ActiveObjects.Count);
            Assert.IsAssignableFrom(typeof(Laser), playback.ActiveObjects[0].Object);

            playback.Position = 25.285;
            Assert.AreEqual(3, playback.ActiveObjects.Count);
            var hold = playback.ActiveObjects.First(x => x.Object is Hold);

            Assert.IsNotNull(hold);

            // Test events
            int holdCount = 3;

            BeatmapPlayback.ObjectEventHandler handler = reference => { holdCount--; };
            playback.ObjectDeactivated += handler;
            playback.Position           = 0.0;
            playback.ObjectDeactivated -= handler;

            Assert.AreEqual(0, holdCount);

            handler = reference => { holdCount++; };
            playback.ObjectActivated += handler;

            playback.Position = 35.571;
            Assert.AreEqual(2, holdCount);

            // Some more seeks to be sure
            playback.Position = 25.285;
            Assert.AreEqual(3, playback.ActiveObjects.Count);

            playback.Position = 35.571;
            Assert.AreEqual(2, playback.ActiveObjects.Count);
        }
Exemplo n.º 5
0
        public void TestConvertedKSHBeatmap()
        {
            Beatmap beatmap;

            using (var file = OpenTestMap("C18H27NO3"))
            {
                // Load only metadata
                BeatmapKsh kshBeatmap = new BeatmapKsh(file);
                beatmap = new Beatmap(kshBeatmap);
            }

            Assert.AreEqual("RITSUKI", beatmap.Metadata.Illustrator);
            Assert.AreEqual("grv.ogg", beatmap.Metadata.AudioPath);
            Assert.IsEmpty(beatmap.Metadata.EffectedAudioPath);

            Assert.AreEqual(3, beatmap.TimingPoints.Count);

            var tp0 = beatmap.TimingPoints[0];

            Assert.AreEqual(210, tp0.BPM);
            Assert.AreEqual(4, tp0.Numerator);
            Assert.AreEqual(4, tp0.Denominator);

            var tp1 = beatmap.TimingPoints[1];

            Assert.AreEqual(1, tp1.Numerator);
            Assert.AreEqual(96, tp1.Denominator);

            Assert.IsNotEmpty(tp0.Measures);

            var m0 = tp0.Measures[0];

            Assert.IsEmpty(m0.Objects);

            var m1 = tp0.Measures[1];

            Assert.IsNotEmpty(m1.Objects);

            // 2 lasers starting here
            var obj0 = m1.Objects[0];
            var obj1 = m1.Objects[1];

            Assert.IsInstanceOf <LaserRoot>(obj0);
            Assert.IsInstanceOf <LaserRoot>(obj1);
            var l1 = obj1 as LaserRoot;

            Assert.AreEqual(1, l1.Index);
            Assert.AreEqual(1.0f, l1.HorizontalPosition); // Laser 1 starting on the right side

            var m3 = tp0.Measures[3];

            Assert.IsNotEmpty(m3.Objects);
        }
Exemplo n.º 6
0
        public void TestBeatmapPlayback()
        {
            Beatmap beatmap;

            using (var file = OpenTestMap("C18H27NO3"))
            {
                // Load only metadata
                BeatmapKsh kshBeatmap = new BeatmapKsh(file);
                beatmap = new Beatmap(kshBeatmap);
            }

            var t0 = beatmap.TimingPoints[0];

            BeatmapPlayback playback = new BeatmapPlayback();

            playback.Beatmap      = beatmap;
            playback.ViewDuration = t0.MeasureDuration * 2;

            // Store objects
            HashSet <ObjectReference> objectSet = new HashSet <ObjectReference>(playback.ObjectsInView);

            Assert.AreEqual(8, objectSet.Count); // 8 Laser points

            playback.ObjectLeft += reference => objectSet.Remove(reference);

            // Advance a few measures
            playback.Position = t0.GetMeasureOffset(10);

            // Check if objects went out of view
            Assert.IsEmpty(objectSet);

            // Check addition
            playback.ObjectEntered += reference => objectSet.Add(reference);
            playback.Position       = 0.0;

            Assert.AreEqual(8, objectSet.Count); // 8 Laser points again
        }
Exemplo n.º 7
0
        public void TestCompareForwardBackward()
        {
            Beatmap beatmap;

            using (var file = OpenTestMap("C18H27NO3"))
            {
                // Load only metadata
                BeatmapKsh kshBeatmap = new BeatmapKsh(file);
                beatmap = new Beatmap(kshBeatmap);
            }

            BeatmapPlayback playback = new BeatmapPlayback();

            playback.Beatmap      = beatmap;
            playback.ViewDuration = 0.2;

            List <int> results = new List <int>();

            int passedObjects    = 0;
            int activatedObjects = 0;

            playback.ObjectEntered += reference =>
            {
                passedObjects++;
            };
            playback.ObjectActivated += reference =>
            {
                activatedObjects++;
            };

            // Test multiple view sizes
            for (int i = 0; i < 2; i++)
            {
                // Simulate game loop
                double timeStep = 1.0 / 240.0;
                if (i == 0)
                {
                    playback.Position = 0.0;
                    passedObjects     = 0;
                    activatedObjects  = 0;
                    while (!playback.HasEnded)
                    {
                        playback.Position += timeStep;
                    }
                }
                else
                {
                    playback.Position = playback.LastObject.AbsolutePosition + 2.0;
                    passedObjects     = 0;
                    activatedObjects  = 0;
                    while (playback.Position >= 0.0)
                    {
                        playback.Position -= timeStep;
                    }
                }

                results.Add(passedObjects);
                results.Add(activatedObjects);
            }

            // Check reverse and forward results
            Assert.AreEqual(results[0], results[2]);
            Assert.AreEqual(results[1], results[3]);
        }
Exemplo n.º 8
0
        public void TestReverseMapIteration()
        {
            Beatmap beatmap;

            using (var file = OpenTestMap("C18H27NO3"))
            {
                // Load only metadata
                BeatmapKsh kshBeatmap = new BeatmapKsh(file);
                beatmap = new Beatmap(kshBeatmap);
            }

            BeatmapPlayback playback = new BeatmapPlayback();

            playback.Beatmap = beatmap;

            // Test multiple view sizes
            for (int i = 0; i < 5; i++)
            {
                playback.ViewDuration = 0.1 + 0.1 * i;
                playback.Position     = playback.LastObject.AbsolutePosition + 2.0;

                // Store objects
                HashSet <ObjectReference> objectSet = new HashSet <ObjectReference>(playback.ObjectsInView);
                int passedObjects = 0;

                HashSet <ObjectReference> activeObjects = new HashSet <ObjectReference>();
                int activeObjectCounter = 0;

                playback.ObjectEntered += reference =>
                {
                    Assert.That(objectSet, Has.No.Member(reference));
                    objectSet.Add(reference);
                    passedObjects++;
                };
                playback.ObjectLeft += reference =>
                {
                    Assert.That(objectSet, Has.Member(reference));
                    objectSet.Remove(reference);
                };

                playback.ObjectActivated += reference =>
                {
                    activeObjectCounter++;
                    activeObjects.Add(reference);
                };
                playback.ObjectDeactivated += reference =>
                {
                    activeObjectCounter--;
                    activeObjects.Remove(reference);
                };


                // Simulate game loop
                double timeStep = 1.0 / 240.0;
                int    step     = 0;
                while (playback.Position > 0.0)
                {
                    playback.Position -= timeStep;
                    step++;
                }

                Assert.IsEmpty(objectSet);
                Assert.IsEmpty(activeObjects);
                Assert.AreEqual(0, activeObjectCounter);
            }
        }