@@ -25,10 +25,40 @@ public abstract class BaseChart<TNote>: IBaseChart where TNote: BaseNote
2525 /**
2626 * 所有拍号声明构成的列表。
2727 *
28- * 已知该内容,目前在游戏内暂无实质性的效果。maimai中无任何效果,chunnithm则会把这个作为显示小节和拍子参考线时候额依据 、但也仅影响显示效果,对游戏本身无影响。
28+ * 已知该内容,目前在游戏内暂无实质性的效果。maimai中无任何效果,chunithm则会把这个作为显示小节和拍子参考线时候额依据 、但也仅影响显示效果,对游戏本身无影响。
2929 */
3030 public List < MET > MetList = [ ] ;
3131
32+ /**
33+ * 所有变速声明构成的列表。
34+ *
35+ * maimai不会用到,ongeki和chunithm才会用到。
36+ */
37+ public List < ( Rational Time , Rational Duration , decimal Multiplier ) > SflList = [ ] ;
38+
39+ /**
40+ * 谱面开头的“哒哒哒哒”声音的个数。
41+ *
42+ * 具体而言,有两种指定方式:
43+ * 1. 直接设置本属性。则会利用游戏内部自带的CLK_DEF机制,会按每拍一次的频率生成指定个数的"哒"声。
44+ * 2. 设置ExplicitClocks属性。这个直接对应于谱面中的CLK语句,有几行就是几声。
45+ */
46+ public int ClockCount
47+ {
48+ get => ExplicitClocks ? . Count ?? field ;
49+ set
50+ {
51+ field = value ;
52+ ExplicitClocks = null ;
53+ }
54+ } = 4 ;
55+
56+ /**
57+ * 这是MA2/OGKR语句中,通过CLK指令所显式指定的哒哒哒哒的时刻。
58+ * 除去极个别官谱外,一般来说极少会用到。详见ClockCount属性上的注释。
59+ */
60+ public List < Rational > ? ExplicitClocks ;
61+
3262 /**
3363 * 根据BPMList中的声明,将小节时间转换为秒。
3464 */
@@ -76,6 +106,9 @@ public virtual void Sort()
76106 BpmList . AddRange ( sortedBpms ) ;
77107
78108 MetList = MetList . OrderBy ( x => x . Time ) . ToList ( ) ;
109+ SflList = SflList . OrderBy ( x => x . Time ) . ToList ( ) ;
110+ if ( ExplicitClocks != null ) ExplicitClocks = ExplicitClocks . Order ( ) . ToList ( ) ;
111+
79112 Notes = SortNotes ( ) . ToList ( ) ; // LINQ OrderBy 是稳定排序
80113 }
81114
@@ -106,6 +139,12 @@ public virtual void Shift(Rational offset, decimal? bpm = null)
106139 . Skip ( MetList . Count ( x => x . Time <= 0 ) - 1 )
107140 . Select ( ( x , i ) => i == 0 ? x with { Time = 0 } : x ) . ToList ( ) ;
108141
142+ // 对SflList和ExplicitClocks的处理:加上offset后,只保留>=0的项
143+ SflList = SflList . Select ( x => x with { Time = x . Time + offset } )
144+ . Where ( x => x . Time >= 0 ) . ToList ( ) ;
145+ if ( ExplicitClocks != null )
146+ ExplicitClocks = ExplicitClocks . Select ( x => x + offset ) . Where ( x => x >= 0 ) . ToList ( ) ;
147+
109148 // Notes,时间加上offset,但注意需要对children进行递归操作
110149 HashSet < BaseNote > processed = [ ] ;
111150 Notes = Notes . Where ( x => addOffset ( x ) . Time >= 0 ) . ToList ( ) ;
0 commit comments