Skip to content

Commit e4619d1

Browse files
committed
fix: 修复 review bot 发现的 9 个问题
P1: ALD/ASD 序列化缺失、@beat tab/space 不一致、SUS MNE 类型码、SUS tick 位数、ko/ja locale null crash、UGC→SUS 缩放错误 P2: EndTime=0、Dump 写临时目录、Air TargetNote 覆写、C2sChart 用 Resolution 代替硬编码
1 parent e2488df commit e4619d1

11 files changed

Lines changed: 49 additions & 29 deletions

File tree

chart/chu/C2sChart.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class C2sChart : BaseChart<ChuNote>, IChuChart
1818
public List<(int Measure, int Offset, int Duration, double Multiplier)> SflEvents = [];
1919

2020
public override decimal StartBpm => (decimal)(BpmEvents.Count > 0 ? BpmEvents[0].Bpm : DefBpm);
21-
public override decimal StartTime => Notes.Count > 0 ? Notes.Min(n => n.Measure * Resolution + n.Offset) / 384m * 240m / StartBpm : 0;
22-
public override decimal EndTime => Notes.Count > 0 ? Notes.Max(n => n.Measure * Resolution + n.Offset + Math.Max(n.HoldDuration, Math.Max(n.SlideDuration, n.AirHoldDuration))) / 384m * 240m / StartBpm : 0;
21+
public override decimal StartTime => Notes.Count > 0 ? Notes.Min(n => n.Measure * Resolution + n.Offset) / (decimal)Resolution * 240m / StartBpm : 0;
22+
public override decimal EndTime => Notes.Count > 0 ? Notes.Max(n => n.Measure * Resolution + n.Offset + Math.Max(n.HoldDuration, Math.Max(n.SlideDuration, n.AirHoldDuration))) / (decimal)Resolution * 240m / StartBpm : 0;
2323
public override int TotalNotes => Notes.Count;
2424
}

chart/chu/SusChart.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@ public class SusChart : BaseChart<ChuNote>, IChuChart
1515

1616
public override decimal StartBpm => (decimal)Bpm;
1717
public override decimal StartTime => Notes.Count > 0 ? Notes.Min(n => n.Measure * TicksPerBeat * 4 + n.Offset) / (decimal)(TicksPerBeat * 4) * 240m / StartBpm : 0;
18-
public override decimal EndTime => 0;
18+
public override decimal EndTime => Notes.Count > 0 ? Notes.Max(n => n.Measure * TicksPerBeat * 4 + n.Offset + Math.Max(n.HoldDuration, Math.Max(n.SlideDuration, n.AirHoldDuration))) / (decimal)(TicksPerBeat * 4) * 240m / StartBpm : 0;
1919
public override int TotalNotes => Notes.Count;
2020
}

chart/chu/UgcChart.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@ public class UgcChart : BaseChart<ChuNote>, IChuChart
2222

2323
public override decimal StartBpm => (decimal)(BpmEvents.Count > 0 ? BpmEvents[0].Bpm : 120.0);
2424
public override decimal StartTime => Notes.Count > 0 ? Notes.Min(n => n.Measure * TicksPerBeat * 4 + n.Offset) / (decimal)(TicksPerBeat * 4) * 240m / StartBpm : 0;
25-
public override decimal EndTime => 0;
25+
public override decimal EndTime => Notes.Count > 0 ? Notes.Max(n => n.Measure * TicksPerBeat * 4 + n.Offset + Math.Max(n.HoldDuration, Math.Max(n.SlideDuration, n.AirHoldDuration))) / (decimal)(TicksPerBeat * 4) * 240m / StartBpm : 0;
2626
public override int TotalNotes => Notes.Count;
2727
}

generator/chu/C2sGenerator.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ private static string Serialize(C2sChart chart)
115115
"FLK" => $"FLK\t{n.Measure}\t{n.Offset}\t{n.Cell}\t{n.Width}\t{n.Extra}",
116116
"AIR" or "AUR" or "AUL" or "ADW" or "ADR" or "ADL" => $"{n.Type}\t{n.Measure}\t{n.Offset}\t{n.Cell}\t{n.Width}\t{n.TargetNote}",
117117
"AHD" => $"AHD\t{n.Measure}\t{n.Offset}\t{n.Cell}\t{n.Width}\t{n.TargetNote}\t{n.AirHoldDuration}",
118+
"ALD" or "ASD" => $"{n.Type}\t{n.Measure}\t{n.Offset}\t{n.Cell}\t{n.Width}\t{n.StartHeight}\t{n.SlideDuration}\t{n.EndCell}\t{n.EndWidth}\t{n.TargetHeight}\t{n.NoteColor}",
118119
"MNE" => $"MNE\t{n.Measure}\t{n.Offset}\t{n.Cell}\t{n.Width}",
119120
_ => $"TAP\t{n.Measure}\t{n.Offset}\t{n.Cell}\t{n.Width}"
120121
};

generator/chu/SusGenerator.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ private static SusChart ConvertToSus(IChuChart chart, List<Alert> alerts)
4242
{
4343
bpm = ugc.BpmEvents.Count > 0 ? ugc.BpmEvents[0].Bpm : 120.0;
4444
var result = new SusChart { Bpm = bpm, TicksPerBeat = SusTpb, Title = ugc.Title, Artist = ugc.Artist };
45-
foreach (var n in ugc.Notes) result.Notes.Add(ScaleUp(n));
45+
foreach (var n in ugc.Notes) result.Notes.Add(MapLaneOnly(n));
4646
return result;
4747
}
4848

@@ -63,6 +63,15 @@ private static ChuNote ScaleUp(ChuNote n)
6363
};
6464
}
6565

66+
private static ChuNote MapLaneOnly(ChuNote n) => new()
67+
{
68+
Type = n.Type, Measure = n.Measure, Offset = n.Offset,
69+
Cell = n.Cell * 2, Width = n.Width * 2,
70+
HoldDuration = n.HoldDuration, SlideDuration = n.SlideDuration,
71+
EndCell = n.EndCell * 2, EndWidth = n.EndWidth * 2,
72+
Extra = n.Extra, TargetNote = n.TargetNote, AirHoldDuration = n.AirHoldDuration,
73+
};
74+
6675
private static string Serialize(SusChart sus)
6776
{
6877
var sb = new StringBuilder();

generator/chu/UgcGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ private static ChuNote ScaleUpNote(ChuNote n)
5858
Cell = n.Cell, Width = n.Width,
5959
HoldDuration = s(n.HoldDuration), SlideDuration = s(n.SlideDuration),
6060
EndCell = n.EndCell, EndWidth = n.EndWidth,
61-
Extra = n.Extra, TargetNote = IsAir(n.Type) ? "N" : n.TargetNote,
61+
Extra = n.Extra, TargetNote = IsAir(n.Type) && string.IsNullOrEmpty(n.TargetNote) ? "N" : n.TargetNote,
6262
AirHoldDuration = s(n.AirHoldDuration),
6363
StartHeight = n.StartHeight, TargetHeight = n.TargetHeight, NoteColor = n.NoteColor,
6464
};

i18n/Locale.ja.resx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -271,10 +271,10 @@
271271
<value>同じ時刻・同じ位置に別のスライド頭/タップが検出されました。ゲーム内で判定問題を引き起こすため、自動修復しました(余分なスライド頭を削除)。PS:同頭スライドを意図する場合は「1-2*-3」のように書き、「1-2/1-3」は避けてください(この問題を引き起こします)。</value>
272272
</data>
273273
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
274-
<data name="C2SUnknownNoteType" type="System.Resources.ResXNullRef, System.Windows.Forms">
275-
<value />
274+
<data name="C2SUnknownNoteType" xml:space="preserve">
275+
<value>不明なC2Sノートタイプ: {0}</value>
276276
</data>
277-
<data name="ChuGeneratorUnsupported" type="System.Resources.ResXNullRef, System.Windows.Forms">
278-
<value />
277+
<data name="ChuGeneratorUnsupported" xml:space="preserve">
278+
<value>チャートを変換できません: {0}</value>
279279
</data>
280280
</root>

i18n/Locale.ko.resx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -271,10 +271,10 @@
271271
<value>이 슬라이드 헤드와 동일한 시간/위치에 다른 슬라이드 헤드/탭이 감지되었습니다. 게임 내 판정 문제를 유발할 수 있어 자동으로 수정했습니다(중복 슬라이드 헤드 제거). PS: 같은 헤드의 슬라이드를 의도했다면 "1-2*-3" 같은 문법을 사용하세요. "1-2/1-3"는 이 문제를 유발합니다.</value>
272272
</data>
273273
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
274-
<data name="C2SUnknownNoteType" type="System.Resources.ResXNullRef, System.Windows.Forms">
275-
<value />
274+
<data name="C2SUnknownNoteType" xml:space="preserve">
275+
<value>Unknown C2S note type: {0}</value>
276276
</data>
277-
<data name="ChuGeneratorUnsupported" type="System.Resources.ResXNullRef, System.Windows.Forms">
278-
<value />
277+
<data name="ChuGeneratorUnsupported" xml:space="preserve">
278+
<value>Cannot convert chart to target format: {0}</value>
279279
</data>
280280
</root>

parser/chu/SusParser.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class SusParser : IParser<SusChart>
2222
[0x07] = "AIR",
2323
[0x08] = "AHD",
2424
[0x09] = "ADW",
25-
[0x0A] = "MNE",
25+
[0x10] = "MNE",
2626
};
2727

2828
public (SusChart, List<Alert>) Parse(string text)
@@ -110,14 +110,14 @@ private static void ParseNoteLine(string content, SusChart chart, List<Alert> al
110110
var timingStr = content[..colonIdx];
111111
var dataStr = content[(colonIdx + 1)..];
112112

113-
if (timingStr.Length < 4)
113+
if (timingStr.Length < 5)
114114
{
115115
alerts.Add(new Alert(Warning, $"音符行时序部分过短: {content}") { Line = lineNum });
116116
return;
117117
}
118118

119119
var measure = HexToInt(timingStr[..2]);
120-
var tick = HexToInt(timingStr[2..4]);
120+
var tick = HexToInt(timingStr[2..5]);
121121

122122
if (dataStr.Length < 6)
123123
{

parser/chu/UgcParser.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ private static void ParseHeaderLine(string line, UgcChart chart, List<Alert> ale
135135
break;
136136

137137
case "@BEAT":
138-
var beatParts = value.Split(' ');
138+
var beatParts = value.Split(['\t', ' '], StringSplitOptions.RemoveEmptyEntries);
139139
if (beatParts.Length >= 3
140140
&& int.TryParse(beatParts[0], NumberStyles.Integer, CultureInfo.InvariantCulture, out var beatMeasure)
141141
&& int.TryParse(beatParts[1], NumberStyles.Integer, CultureInfo.InvariantCulture, out var beatNum)
@@ -151,7 +151,7 @@ private static void ParseHeaderLine(string line, UgcChart chart, List<Alert> ale
151151

152152
case "@BPM":
153153
var bpmPart = value;
154-
var bpmSpaceIdx = bpmPart.IndexOf(' ');
154+
var bpmSpaceIdx = bpmPart.IndexOfAny(['\t', ' ']);
155155
if (bpmSpaceIdx > 0)
156156
{
157157
var measureOffset = bpmPart[..bpmSpaceIdx];

0 commit comments

Comments
 (0)