1+ using System . Text . RegularExpressions ;
12using MuConvert . chart ;
23using MuConvert . utils ;
34using Rationals ;
@@ -12,6 +13,7 @@ public class MA2Parser : IParser
1213
1314 private bool bpmRead = false ;
1415 private int RSL = 384 ;
16+ public int MA2Version ;
1517
1618 private Dictionary < ( Rational , int ) , List < Slide > > _slides = new ( ) ;
1719
@@ -55,17 +57,17 @@ private void WarnParamsCount(int lineNo, ReadOnlySpan<char> line, Rational? time
5557 // 头字段
5658 if ( cmd == "VERSION" && AssertInHeader ( lineNo , line ) )
5759 {
58- if ( ! ( values [ 2 ] == "1.03.00" || values [ 2 ] == "1.04.00" || values [ 2 ] == "1.05.00" ) ) Fail ( Locale . UnsuppoertedMA2Version , lineNo , line ) ;
59- }
60- else if ( cmd == "MET_DEF" && AssertInHeader ( lineNo , line ) )
61- {
62- if ( ! ( values [ 1 ] == "4" && values [ 2 ] == "4" ) ) Fail ( Locale . UnsuppoertedMA2MET_DEF , lineNo , line ) ;
60+ var version = Regex . Match ( values [ 2 ] , @"1\.(0?[2-5])\.(\d+)" ) ;
61+ MA2Version = 100 + int . Parse ( version . Groups [ 1 ] . Value ) ;
62+ if ( ! version . Success ) Fail ( Locale . UnsuppoertedMA2Version , lineNo , line ) ;
63+ else if ( ! ( MA2Version is 103 or 104 or 105 && int . Parse ( version . Groups [ 2 ] . Value ) == 0 ) )
64+ alerts . Add ( new Alert ( Warning , string . Format ( Locale . WarnNonStdMA2Version , values [ 2 ] ) , line : lineNo , relevantNote : line . ToString ( ) ) ) ;
6365 }
6466 else if ( cmd == "COMPATIBLE_CODE" && AssertInHeader ( lineNo , line ) )
6567 {
6668 if ( values [ 1 ] != "MA2" ) Fail ( Locale . UnsuppoertedMA2Version , lineNo , line ) ;
6769 }
68- else if ( cmd is "FES_MODE" or "BPM_DEF" or "GENERATED_BY" && AssertInHeader ( lineNo , line ) ) { } // 这些不用解析,无事可做
70+ else if ( cmd is "FES_MODE" or "MET_DEF" or " BPM_DEF" or "GENERATED_BY" && AssertInHeader ( lineNo , line ) ) { } // 这些不用解析,无事可做
6971 else if ( cmd == "RESOLUTION" && AssertInHeader ( lineNo , line ) )
7072 RSL = int . Parse ( values [ 1 ] ) ;
7173 else if ( cmd == "CLK_DEF" && AssertInHeader ( lineNo , line ) )
@@ -115,17 +117,21 @@ private void WarnParamsCount(int lineNo, ReadOnlySpan<char> line, Rational? time
115117 note . Duration = duration ;
116118 if ( values . Length != 5 ) WarnParamsCount ( lineNo , line , time ) ;
117119 }
118- else if ( cc == "TTP" && values . Length >= 7 )
120+ else if ( cc == "TTP" && values . Length >= 6 )
119121 {
120- note = new Touch ( chart , time ) { TouchArea = GetTouchArea ( values [ 4 ] , key ) , IsFirework = values [ 5 ] == "1" , TouchSize = values [ 6 ] } ;
121- if ( values . Length != 7 ) WarnParamsCount ( lineNo , line , time ) ;
122+ var touch = new Touch ( chart , time ) { TouchArea = GetTouchArea ( values [ 4 ] , key ) , IsFirework = values [ 5 ] == "1" } ;
123+ note = touch ;
124+ if ( values . Length >= 7 ) touch . TouchSize = values [ 6 ] ;
125+ if ( ! ( values . Length == 7 || ( values . Length == 6 && MA2Version == 102 ) ) ) WarnParamsCount ( lineNo , line , time ) ;
122126 }
123- else if ( cc == "THO" && values . Length >= 8 && int . TryParse ( values [ 4 ] , out len ) )
127+ else if ( cc == "THO" && values . Length >= 7 && int . TryParse ( values [ 4 ] , out len ) )
124128 {
125- note = new TouchHold ( chart , time ) { TouchArea = GetTouchArea ( values [ 5 ] , key ) , IsFirework = values [ 6 ] == "1" , TouchSize = values [ 7 ] } ;
129+ var touchHold = new TouchHold ( chart , time ) { TouchArea = GetTouchArea ( values [ 5 ] , key ) , IsFirework = values [ 6 ] == "1" } ;
130+ note = touchHold ;
131+ if ( values . Length >= 8 ) touchHold . TouchSize = values [ 7 ] ;
126132 var duration = new Duration ( note ) { Bar = new Rational ( len , RSL ) } ;
127133 note . Duration = duration ;
128- if ( values . Length != 8 ) WarnParamsCount ( lineNo , line , time ) ;
134+ if ( ! ( values . Length == 8 || ( values . Length == 7 && MA2Version == 102 ) ) ) WarnParamsCount ( lineNo , line , time ) ;
129135 }
130136 else if ( SlideTypeTool . IsSlide ( cc ) && values . Length >= 7 && int . TryParse ( values [ 4 ] , out var waitLen )
131137 && int . TryParse ( values [ 5 ] , out len ) && int . TryParse ( values [ 6 ] , out var endKey ) )
0 commit comments