1- using MaiChartManager . Models ;
1+ using MaiChartManager . Models ;
22using MaiChartManager . Utils ;
33using MuConvert . mai ;
44using MuConvert . utils ;
@@ -185,14 +185,9 @@ public ImportChartResult ImportMaidata(
185185 var lineNoDict = GetLevelLineNo ( maiDataText ) ;
186186
187187 var targetLevelMap = MapMaidataLevelToGame ( maiData ) ;
188- if ( targetLevelMap . Count == 0 ) // 没有能够被映射的谱面
189- {
190- errors . Add ( new ImportChartMessage ( Locale . MusicNoCharts , MessageLevel . Fatal ) ) ;
191- return new ImportChartResult ( errors , true ) ;
192- }
193188
194189 // 先执行第一步:Parser,因为可能涉及对Chart做出调整
195- List < ( int lv , int targetLevel , MaidataLevel data , MaiChart chart , List < Alert > alerts ) > parserOutput = [ ] ;
190+ List < ( int lv , int targetLevel , MaidataLevel data , MaiChart ? chart , List < Alert > alerts ) > parserOutput = [ ] ;
196191 foreach ( var ( lv , data ) in maiData . Levels )
197192 {
198193 if ( ! targetLevelMap . ContainsKey ( lv ) ) continue ;
@@ -204,17 +199,28 @@ public ImportChartResult ImportMaidata(
204199 {
205200 var parser = new SimaiParser ( ! isUtage && lv is 2 or 3 , maiData . ClockCount ) ;
206201 var ( chart , alerts ) = parser . Parse ( data . Inote ) ;
202+ if ( chart . TotalNotes == 0 )
203+ {
204+ errors . Add ( new ImportChartMessage ( string . Format ( Locale . ChartNoNotes , lv ) , MessageLevel . Warning ) ) ;
205+ chart = null ;
206+ }
207207 parserOutput . Add ( ( lv , targetLevel , data , chart , alerts ) ) ;
208208 }
209209 catch ( ConversionException e )
210210 {
211- parserOutput . Add ( ( lv , targetLevel , data , null ! , e . Alerts ) ) ;
211+ parserOutput . Add ( ( lv , targetLevel , data , null , e . Alerts ) ) ;
212212 MergeAlertsIntoImportChartMessages ( ) ;
213213 return new ImportChartResult ( errors , true ) ;
214214 }
215215 }
216216
217- var chartPaddingDict = CalcChartPadding ( parserOutput . Select ( x=> x . chart ) . ToList ( ) ) ;
217+ var validCharts = parserOutput . Where ( x=> x . chart != null ) . Select ( x => x . chart ! ) . ToList ( ) ;
218+ if ( validCharts . Count == 0 )
219+ {
220+ errors . Add ( new ImportChartMessage ( Locale . MusicNoCharts , MessageLevel . Fatal ) ) ;
221+ return new ImportChartResult ( errors , true ) ;
222+ }
223+ var chartPaddingDict = CalcChartPadding ( validCharts ) ;
218224 var chartPadding = chartPaddingDict [ shift ] ; // 当前所选择的模式所具体对应的chartPadding
219225
220226 foreach ( var c in music . Charts ) { c . Enable = false ; } // 先把所有难度标记为关闭(马上后面"第二步"的逻辑,会对存在的难度打开)
@@ -223,22 +229,13 @@ public ImportChartResult ImportMaidata(
223229 // 再执行第二步
224230 foreach ( var ( lv , targetLevel , data , chart , alerts ) in parserOutput )
225231 {
232+ if ( chart == null ) continue ;
226233 var targetChart = music . Charts [ targetLevel ] ;
227234 targetChart . Path = $ "{ id : 000000} _0{ targetLevel } .ma2";
228235
229236 #region 计算等级(定数)相关
230- var levelNumStr = data . Level ;
231- if ( ! string . IsNullOrWhiteSpace ( levelNumStr ) )
232- {
233- if ( isUtage && ! char . IsDigit ( levelNumStr [ 0 ] ) )
234- {
235- music . UtageKanji = levelNumStr . Substring ( 0 , 1 ) ;
236- levelNumStr = levelNumStr . Substring ( 1 ) . Replace ( "?" , "" ) ; // 为了处理类似“奏13+?”这种情况,留下13+给后面的逻辑处理
237- }
238- levelNumStr = levelNumStr . Replace ( "+" , ".7" ) ;
239- }
240-
241- float . TryParse ( levelNumStr , out var levelNum ) ;
237+ MaiUtils . ParseLevelStr ( data . Level , out var levelNum , out var utageKanji ) ;
238+ if ( isUtage ) music . UtageKanji = utageKanji ;
242239 targetChart . LevelId = MaiUtils . GetLevelId ( ( int ) ( levelNum * 10 ) ) ;
243240 // 忽略定数
244241 if ( ! ignoreLevelNum )
0 commit comments