@@ -6,8 +6,87 @@ namespace RhythmBase.BeatBlock.Converters;
66
77internal class BaseEventConverter : BackwardCompatibleMetadataJsonConverter
88{
9+ private float _6_bpm ;
10+ private float _12_playSongTime ;
11+ public void Reset ( )
12+ {
13+ _6_bpm = 0 ;
14+ _12_playSongTime = 0 ;
15+ }
16+ public BaseEventConverter ( )
17+ {
18+ Reset ( ) ;
19+ }
920 protected override void InitializeUpgraters ( )
1021 {
22+ Register < Hold > ( 2 , ( e ) =>
23+ {
24+ e . Angle = e [ "angle1" ] . TryGetSingle ( out var angle1 ) ? angle1 : 0 ;
25+ e [ "angle1" ] = default ;
26+ } ) ;
27+ Register < MineHold > ( 3 , ( e ) =>
28+ {
29+ e . Angle = e [ "angle1" ] . TryGetSingle ( out var angle1 ) ? angle1 : 0 ;
30+ e [ "angle1" ] = default ;
31+ } ) ;
32+ Register < Play > ( 6 , ( e ) =>
33+ {
34+ if ( e is not Play p ) return ;
35+ _6_bpm = p . BeatsPerMinute ;
36+ } ) ;
37+ Register < Paddles > ( 6 , ( e ) =>
38+ {
39+ if ( e is not Paddles p ) return ;
40+ p . Duration /= 3600 / _6_bpm ;
41+ } ) ;
42+ Register < Decoration > ( 9 , ( e ) =>
43+ {
44+ if ( e is not Decoration p ) return ;
45+ p . DrawOrder = p . Order ;
46+ p . Order = null ;
47+ } ) ;
48+ Register < Decoration > ( 11 , ( e ) =>
49+ {
50+ if ( e is not Decoration p ) return ;
51+ p . Order = p . Order is null or 0 ? - 999 : p . Order ;
52+ } ) ;
53+ Register < SetColor > ( 11 , ( e ) =>
54+ {
55+ if ( e is not SetColor p ) return ;
56+ p . Order = p . Order is null or 0 ? - 999 : p . Order ;
57+ } ) ;
58+ Register < Ease > ( 11 , ( e ) =>
59+ {
60+ if ( e is not Ease p ) return ;
61+ p . Order = p . Order is null or 0 ? - 999 : p . Order ;
62+ } ) ;
63+ Register < Play > ( 12 , ( e ) =>
64+ {
65+ if ( e is not Play p ) return ;
66+ _12_playSongTime = p . Time ;
67+ } ) ;
68+ Register < SetBeatsPerMinute > ( 12 , ( e ) =>
69+ {
70+ if ( e is not SetBeatsPerMinute s ) return ;
71+ if ( _12_playSongTime == 0 ) return ;
72+ e . Time += _12_playSongTime ;
73+ } ) ;
74+ //Register<PlaySound>(13, (e) =>
75+ //{
76+ // if(e is not PlaySound p) return;
77+ // if(false /*not in built-in sounds*/)
78+ // p.Sound += ".ogg";
79+ //});
80+ Register < Paddles > ( 15 , ( e ) =>
81+ {
82+ if ( e is not Paddles p ) return ;
83+ p . ForceStoreInLevel = true ;
84+ } ) ;
85+ Register < Decoration > ( 16 , ( e ) =>
86+ {
87+ if ( e is not Decoration d ) return ;
88+ d . EffectCanvasRaw = d . EffectCanvas ;
89+ } ) ;
1190 }
1291 public override bool CanConvert ( Type typeToConvert )
1392 {
@@ -18,26 +97,28 @@ public override bool CanConvert(Type typeToConvert)
1897 JsonException . ThrowIfNotMatch ( ref reader , JsonTokenType . StartObject ) ;
1998
2099 Utf8JsonReader checkpoint = reader ;
21- while ( reader . Read ( ) )
100+ while ( reader . Read ( ) && reader . TokenType != JsonTokenType . EndObject )
22101 {
23- if ( reader . TokenType == JsonTokenType . EndObject )
102+ JsonException . ThrowIfNotMatch ( ref reader , JsonTokenType . PropertyName ) ;
103+ if ( reader . ValueTextEquals ( "type"u8 ) && reader . Read ( ) )
24104 break ;
25- if ( reader . TokenType == JsonTokenType . PropertyName )
26- {
27- if ( reader . ValueTextEquals ( "type"u8 ) )
28- {
29- reader . Read ( ) ;
30- break ;
31- }
32- else
33- reader . Skip ( ) ;
34- }
105+ else
106+ reader . Skip ( ) ;
35107 }
36108 IBaseEvent e ;
37- if ( ! EnumConverter . TryParse ( ref reader , out EventType typeEnum ) )
38- e = ReadForwardEvent ( ref checkpoint ) ?? new ForwardEvent ( ) { ActualType = reader . GetString ( ) ?? "" } ;
39- else
109+ // upgrate to the latest version
110+
111+ if ( EnumConverter . TryParse ( ref reader , out EventType typeEnum ) )
40112 e = EventConverterMap . GetConverter ( typeEnum ) . ReadProperties ( ref checkpoint , options ) ;
113+ else
114+ {
115+ if ( options . Version <= 1 && reader . ValueTextEquals ( "beat"u8 ) )
116+ e = EventConverterMap . GetConverter ( EventType . Block ) . ReadProperties ( ref checkpoint , options ) ;
117+ else if ( options . Version <= 10 && reader . ValueTextEquals ( "width"u8 ) )
118+ e = EventConverterMap . GetConverter ( EventType . Paddles ) . ReadProperties ( ref checkpoint , options ) ;
119+ else
120+ e = ReadForwardEvent ( ref checkpoint ) ?? new ForwardEvent ( ) { ActualType = reader . GetString ( ) ?? "" } ;
121+ }
41122 JsonException . ThrowIfNotMatch ( ref checkpoint , JsonTokenType . EndObject ) ;
42123 reader = checkpoint ;
43124 return e ;
0 commit comments