mirror of
https://github.com/ppy/osu.git
synced 2025-01-13 13:32:54 +08:00
Implement most of the legacy beatmap decoder
Missing timing points, events, and hit object decoders remain to be written
This commit is contained in:
parent
32ab8f97bb
commit
9b4bc3e36d
@ -63,6 +63,19 @@ namespace osu.Game.Tests.Beatmaps.IO
|
|||||||
Assert.AreEqual("Renatus", meta.TitleUnicode);
|
Assert.AreEqual("Renatus", meta.TitleUnicode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
[Test]
|
||||||
|
public void TestReadFile()
|
||||||
|
{
|
||||||
|
using (var osz = File.OpenRead(Resource.GetPath("241526 Soleily - Renatus.osz")))
|
||||||
|
{
|
||||||
|
var reader = new OszArchiveReader(osz);
|
||||||
|
using (var stream = new StreamReader(
|
||||||
|
reader.ReadFile("Soleily - Renatus (Deif) [Platter].osu")))
|
||||||
|
{
|
||||||
|
Assert.AreEqual("osu file format v13", stream.ReadLine().Trim());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,9 @@
|
|||||||
//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using osu.Game.Beatmaps.Objects;
|
using osu.Game.Beatmaps.Objects;
|
||||||
|
using osu.Game.Beatmaps.Samples;
|
||||||
using osu.Game.Beatmaps.Timing;
|
using osu.Game.Beatmaps.Timing;
|
||||||
using osu.Game.GameModes.Play;
|
using osu.Game.GameModes.Play;
|
||||||
using osu.Game.Users;
|
using osu.Game.Users;
|
||||||
@ -27,7 +29,38 @@ namespace osu.Game.Beatmaps
|
|||||||
public BeatmapMetadata Metadata { get; set; }
|
public BeatmapMetadata Metadata { get; set; }
|
||||||
[Ignore]
|
[Ignore]
|
||||||
public BaseDifficulty BaseDifficulty { get; set; }
|
public BaseDifficulty BaseDifficulty { get; set; }
|
||||||
|
|
||||||
|
// General
|
||||||
|
public int AudioLeadIn { get; set; }
|
||||||
|
public bool Countdown { get; set; }
|
||||||
|
public SampleSet SampleSet { get; set; }
|
||||||
|
public float StackLeniency { get; set; }
|
||||||
|
public bool SpecialStyle { get; set; }
|
||||||
public PlayMode Mode { get; set; }
|
public PlayMode Mode { get; set; }
|
||||||
|
public bool LetterboxInBreaks { get; set; }
|
||||||
|
public bool WidescreenStoryboard { get; set; }
|
||||||
|
|
||||||
|
// Editor
|
||||||
|
// This bookmarks stuff is necessary because DB doesn't know how to store int[]
|
||||||
|
public string StoredBookmarks { get; internal set; }
|
||||||
|
[Ignore]
|
||||||
|
public int[] Bookmarks
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return StoredBookmarks.Split(',').Select(b => int.Parse(b)).ToArray();
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
StoredBookmarks = string.Join(",", value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public double DistanceSpacing { get; set; }
|
||||||
|
public int BeatDivisor { get; set; }
|
||||||
|
public int GridSize { get; set; }
|
||||||
|
public double TimelineZoom { get; set; }
|
||||||
|
|
||||||
|
// Metadata
|
||||||
public string Version { get; set; }
|
public string Version { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using osu.Game.Beatmaps.Events;
|
using osu.Game.Beatmaps.Events;
|
||||||
using osu.Game.Beatmaps.Objects;
|
using osu.Game.Beatmaps.Objects;
|
||||||
|
using osu.Game.Beatmaps.Samples;
|
||||||
using osu.Game.Beatmaps.Timing;
|
using osu.Game.Beatmaps.Timing;
|
||||||
using osu.Game.GameModes.Play;
|
using osu.Game.GameModes.Play;
|
||||||
|
|
||||||
@ -41,31 +42,53 @@ namespace osu.Game.Beatmaps.Formats
|
|||||||
beatmap.Metadata.AudioFile = val;
|
beatmap.Metadata.AudioFile = val;
|
||||||
break;
|
break;
|
||||||
case "AudioLeadIn":
|
case "AudioLeadIn":
|
||||||
// TODO
|
beatmap.AudioLeadIn = int.Parse(val);
|
||||||
break;
|
break;
|
||||||
case "PreviewTime":
|
case "PreviewTime":
|
||||||
beatmap.Metadata.PreviewTime = int.Parse(val);
|
beatmap.Metadata.PreviewTime = int.Parse(val);
|
||||||
break;
|
break;
|
||||||
case "Countdown":
|
case "Countdown":
|
||||||
// TODO
|
beatmap.Countdown = int.Parse(val) == 1;
|
||||||
break;
|
break;
|
||||||
case "SampleSet":
|
case "SampleSet":
|
||||||
// TODO
|
beatmap.SampleSet = (SampleSet)Enum.Parse(typeof(SampleSet), val);
|
||||||
break;
|
break;
|
||||||
case "StackLeniency":
|
case "StackLeniency":
|
||||||
// TODO
|
beatmap.StackLeniency = float.Parse(val);
|
||||||
break;
|
break;
|
||||||
case "Mode":
|
case "Mode":
|
||||||
beatmap.Mode = (PlayMode)int.Parse(val);
|
beatmap.Mode = (PlayMode)int.Parse(val);
|
||||||
break;
|
break;
|
||||||
case "LetterboxInBreaks":
|
case "LetterboxInBreaks":
|
||||||
// TODO
|
beatmap.LetterboxInBreaks = int.Parse(val) == 1;
|
||||||
break;
|
break;
|
||||||
case "SpecialStyle":
|
case "SpecialStyle":
|
||||||
// TODO
|
beatmap.SpecialStyle = int.Parse(val) == 1;
|
||||||
break;
|
break;
|
||||||
case "WidescreenStoryboard":
|
case "WidescreenStoryboard":
|
||||||
// TODO
|
beatmap.WidescreenStoryboard = int.Parse(val) == 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleEditor(Beatmap beatmap, string key, string val)
|
||||||
|
{
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case "Bookmarks":
|
||||||
|
beatmap.StoredBookmarks = val;
|
||||||
|
break;
|
||||||
|
case "DistanceSpacing":
|
||||||
|
beatmap.DistanceSpacing = double.Parse(val);
|
||||||
|
break;
|
||||||
|
case "BeatDivisor":
|
||||||
|
beatmap.BeatDivisor = int.Parse(val);
|
||||||
|
break;
|
||||||
|
case "GridSize":
|
||||||
|
beatmap.GridSize = int.Parse(val);
|
||||||
|
break;
|
||||||
|
case "TimelineZoom":
|
||||||
|
beatmap.TimelineZoom = double.Parse(val);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -108,6 +131,31 @@ namespace osu.Game.Beatmaps.Formats
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void HandleDifficulty(Beatmap beatmap, string key, string val)
|
||||||
|
{
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case "HPDrainRate":
|
||||||
|
beatmap.BaseDifficulty.DrainRate = float.Parse(val);
|
||||||
|
break;
|
||||||
|
case "CircleSize":
|
||||||
|
beatmap.BaseDifficulty.CircleSize = float.Parse(val);
|
||||||
|
break;
|
||||||
|
case "OverallDifficulty":
|
||||||
|
beatmap.BaseDifficulty.OverallDifficulty = float.Parse(val);
|
||||||
|
break;
|
||||||
|
case "ApproachRate":
|
||||||
|
beatmap.BaseDifficulty.ApproachRate = float.Parse(val);
|
||||||
|
break;
|
||||||
|
case "SliderMultiplier":
|
||||||
|
beatmap.BaseDifficulty.SliderMultiplier = float.Parse(val);
|
||||||
|
break;
|
||||||
|
case "SliderTickRate":
|
||||||
|
beatmap.BaseDifficulty.SliderTickRate = float.Parse(val);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void HandleEvents(Beatmap beatmap, string val)
|
private void HandleEvents(Beatmap beatmap, string val)
|
||||||
{
|
{
|
||||||
if (val.StartsWith("//"))
|
if (val.StartsWith("//"))
|
||||||
@ -127,6 +175,11 @@ namespace osu.Game.Beatmaps.Formats
|
|||||||
beatmap.Metadata.BackgroundFile = split[2].Trim('"');
|
beatmap.Metadata.BackgroundFile = split[2].Trim('"');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void HandleTimingPoints(Beatmap beatmap, string val)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
public override Beatmap Decode(TextReader stream)
|
public override Beatmap Decode(TextReader stream)
|
||||||
{
|
{
|
||||||
var beatmap = new Beatmap
|
var beatmap = new Beatmap
|
||||||
@ -167,22 +220,22 @@ namespace osu.Game.Beatmaps.Formats
|
|||||||
HandleGeneral(beatmap, key, val);
|
HandleGeneral(beatmap, key, val);
|
||||||
break;
|
break;
|
||||||
case Section.Editor:
|
case Section.Editor:
|
||||||
// TODO
|
HandleEditor(beatmap, key, val);
|
||||||
break;
|
break;
|
||||||
case Section.Metadata:
|
case Section.Metadata:
|
||||||
HandleMetadata(beatmap, key, val);
|
HandleMetadata(beatmap, key, val);
|
||||||
break;
|
break;
|
||||||
case Section.Difficulty:
|
case Section.Difficulty:
|
||||||
// TODO
|
HandleDifficulty(beatmap, key, val);
|
||||||
break;
|
break;
|
||||||
case Section.Events:
|
case Section.Events:
|
||||||
HandleEvents(beatmap, val);
|
HandleEvents(beatmap, val);
|
||||||
break;
|
break;
|
||||||
case Section.TimingPoints:
|
case Section.TimingPoints:
|
||||||
// TODO
|
HandleTimingPoints(beatmap, val);
|
||||||
break;
|
break;
|
||||||
case Section.HitObjects:
|
case Section.HitObjects:
|
||||||
// TODO
|
beatmap.HitObjects.Add(HitObject.Parse(beatmap.Mode, val));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
|
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using osu.Game.Beatmaps.Objects.Osu;
|
||||||
using osu.Game.Beatmaps.Samples;
|
using osu.Game.Beatmaps.Samples;
|
||||||
|
using osu.Game.GameModes.Play;
|
||||||
|
|
||||||
namespace osu.Game.Beatmaps.Objects
|
namespace osu.Game.Beatmaps.Objects
|
||||||
{
|
{
|
||||||
@ -16,5 +18,16 @@ namespace osu.Game.Beatmaps.Objects
|
|||||||
public double Duration => (EndTime ?? StartTime) - StartTime;
|
public double Duration => (EndTime ?? StartTime) - StartTime;
|
||||||
|
|
||||||
public HitSampleInfo Sample;
|
public HitSampleInfo Sample;
|
||||||
|
|
||||||
|
public static HitObject Parse(PlayMode mode, string val)
|
||||||
|
{
|
||||||
|
switch (mode)
|
||||||
|
{
|
||||||
|
case PlayMode.Osu:
|
||||||
|
return OsuBaseHit.Parse(val);
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,5 +8,10 @@ namespace osu.Game.Beatmaps.Objects.Osu
|
|||||||
public abstract class OsuBaseHit : HitObject
|
public abstract class OsuBaseHit : HitObject
|
||||||
{
|
{
|
||||||
public Vector2 Position;
|
public Vector2 Position;
|
||||||
|
|
||||||
|
public static OsuBaseHit Parse(string val)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user