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