Skip to content

Commit 80d89c9

Browse files
committed
fix: 扫描/解析/编码健壮性修复
- MusicScanner:option 缺失记 Error,目录名正则放宽\n- FumenData:int.TryParse 替代硬解析防崩\n- MusicXml:难度按语义索引,float.TryParse 加 InvariantCulture\n- DdsHelper:向上取整到 4 倍数,保留图片内容
1 parent 007c02f commit 80d89c9

4 files changed

Lines changed: 17 additions & 12 deletions

File tree

ChuChartManager/DdsHelper.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public static void ConvertPngToDds(string pngPath, string ddsPath)
1313
{
1414
var encoder = CreateEncoder();
1515
using var image = SixLabors.ImageSharp.Image.Load<Rgba32>(pngPath);
16-
var size = (image.Width / 4) * 4;
16+
var size = ((image.Width + 3) / 4) * 4;
1717
if (size == 0) size = 4;
1818
image.Mutate(x => x.Resize(size, size));
1919
using var fs = File.Create(ddsPath);
@@ -36,7 +36,7 @@ public static byte[] ConvertPngBytesToDds(byte[] pngBytes)
3636
{
3737
var encoder = CreateEncoder();
3838
using var image = SixLabors.ImageSharp.Image.Load<Rgba32>(pngBytes);
39-
var size = (image.Width / 4) * 4;
39+
var size = ((image.Width + 3) / 4) * 4;
4040
if (size == 0) size = 4;
4141
image.Mutate(x => x.Resize(size, size));
4242
using var ms = new MemoryStream();

ChuChartManager/Models/FumenData.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public string LevelDetailDisplay
5151

5252
public static FumenData FromXml(XmlNode node)
5353
{
54-
var typeId = int.Parse(node.SelectSingleNode("type/id")?.InnerText ?? "0");
54+
var typeId = int.TryParse(node.SelectSingleNode("type/id")?.InnerText, out var tid) ? tid : 0;
5555
var typeStr = node.SelectSingleNode("type/str")?.InnerText ?? "";
5656

5757
return new FumenData

ChuChartManager/Models/MusicXml.cs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Globalization;
12
using System.Text.Json.Serialization;
23
using System.Xml;
34

@@ -93,15 +94,18 @@ private void Parse()
9394
var fumenNodes = root.SelectNodes("fumens/MusicFumenData");
9495
if (fumenNodes != null)
9596
{
96-
for (var i = 0; i < Math.Min(fumenNodes.Count, 6); i++)
97+
foreach (XmlNode fumenNode in fumenNodes)
9798
{
98-
Fumens[i] = FumenData.FromXml(fumenNodes[i]!);
99-
if (string.IsNullOrEmpty(Fumens[i].FilePath)) continue;
100-
var c2sPath = Path.Combine(MusicDirectory, Fumens[i].FilePath);
99+
var fumen = FumenData.FromXml(fumenNode);
100+
var idx = (int)fumen.Difficulty;
101+
if (idx < 0 || idx >= Fumens.Length) continue;
102+
Fumens[idx] = fumen;
103+
if (string.IsNullOrEmpty(Fumens[idx].FilePath)) continue;
104+
var c2sPath = Path.Combine(MusicDirectory, Fumens[idx].FilePath);
101105
if (!File.Exists(c2sPath)) continue;
102-
if (string.IsNullOrEmpty(Fumens[i].NotesDesigner))
103-
Fumens[i].NotesDesigner = FumenData.ReadCreatorFromC2s(c2sPath);
104-
Fumens[i].NoteCount = FumenData.CountNotesFromC2s(c2sPath);
106+
if (string.IsNullOrEmpty(Fumens[idx].NotesDesigner))
107+
Fumens[idx].NotesDesigner = FumenData.ReadCreatorFromC2s(c2sPath);
108+
Fumens[idx].NoteCount = FumenData.CountNotesFromC2s(c2sPath);
105109
}
106110
}
107111
}
@@ -125,7 +129,7 @@ public float GetBpmFromChart()
125129
{
126130
if (!line.StartsWith("BPM_DEF")) continue;
127131
var parts = line.Split('\t', StringSplitOptions.RemoveEmptyEntries);
128-
if (parts.Length >= 2 && float.TryParse(parts[1], out var bpm))
132+
if (parts.Length >= 2 && float.TryParse(parts[1], NumberStyles.Float, CultureInfo.InvariantCulture, out var bpm))
129133
return bpm;
130134
}
131135
return 0;

ChuChartManager/MusicScanner.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ namespace ChuChartManager;
55

66
public partial class MusicScanner
77
{
8-
[GeneratedRegex(@"^[A-Z](\w+)$")]
8+
[GeneratedRegex(@"^[A-Z][A-Za-z0-9_-]*$")]
99
private static partial Regex OptionDirRegex();
1010

1111
private readonly string _gamePath;
@@ -49,6 +49,7 @@ public void ScanAll()
4949
if (!Directory.Exists(optionRoot))
5050
{
5151
Log.Warn($"option 目录不存在: {optionRoot}");
52+
Errors.Add($"option 目录不存在: {optionRoot}");
5253
return;
5354
}
5455

0 commit comments

Comments
 (0)