@@ -38,4 +38,44 @@ public class OgkChart: BaseChart<OgkNote>
3838
3939 // 部分谱面中会有,上方的敌人在上面进行水平方向的移动的情况。
4040 public List < EnemyMovement > EnemyMovements = [ ] ;
41+
42+ public override decimal StartTime => Math . Min ( base . StartTime , ( decimal ) ToSecond ( Bullets . First ( ) . Time ) ) ;
43+ public override decimal EndTime => Math . Max ( base . EndTime , ( decimal ) ToSecond ( Bullets . Last ( ) . Time ) ) ;
44+ public override int TotalNotes => throw new NotImplementedException ( ) ;
45+
46+ public override void Sort ( )
47+ {
48+ base . Sort ( ) ;
49+ // 在base通用实现的基础上,额外排序我们自己新增的四个字段
50+ Lanes = Lanes . OrderBy ( x => x . Time ) . ToList ( ) ;
51+ Bullets = Bullets . OrderBy ( x => x . Time ) . ToList ( ) ;
52+ EnemyList . Sort ( ) ;
53+ EnemyMovements = EnemyMovements . OrderBy ( x => x . Time ) . ToList ( ) ;
54+ }
55+
56+ public override void Shift ( Rational offset , decimal ? bpm = null )
57+ {
58+ bpm ??= StartBpm ;
59+ offset = _calcOffsetForShift ( offset , bpm . Value ) ;
60+
61+ base . Shift ( offset , bpm ) ;
62+ // 在base通用实现的基础上,额外移动我们自己新增的四个字段
63+ Lanes = Lanes . Where ( x => addOffset ( x ) . Time >= 0 ) . ToList ( ) ;
64+ EnemyList = EnemyList . Select ( x => x with { Time = x . Time + offset } ) . Where ( x=> x . Time >= 0 ) . ToList ( ) ;
65+ EnemyMovements = EnemyMovements . Where ( x => addOffset ( x ) . Time >= 0 ) . ToList ( ) ;
66+
67+ foreach ( var bul in Bullets )
68+ {
69+ if ( bul is Bullet bullet ) bullet . Time += offset ;
70+ else if ( bul is Beam beam ) beam . Points = beam . Points . Select ( x => x with { Time = x . Time + offset } ) . ToList ( ) ;
71+ else throw Utils . Fail ( ) ;
72+ }
73+ Bullets = Bullets . Where ( x => x . Time >= 0 ) . ToList ( ) ;
74+
75+ T addOffset < T > ( T lane ) where T : OgkBaseLane < OgkLanePoint >
76+ {
77+ lane . Points = lane . Points . Select ( x => x with { Time = x . Time + offset } ) . ToList ( ) ;
78+ return lane ;
79+ }
80+ }
4181}
0 commit comments