@@ -25,55 +25,73 @@ class CharterSelectionScreen extends EditorTreeMenuScreen {
2525 public var songList : Array <String > = [];
2626 public var curSong : ChartMetaData ;
2727
28- inline public function makeChartOption (d : String , name : String ): TextOption {
29- return new TextOption (d , getID (' acceptDifficulty' ), () -> FlxG .switchState (new Charter (name , d , null )));
28+ inline public function makeChartOption (d : String , v : String , name : String ): TextOption {
29+ return new TextOption (d , getID (' acceptDifficulty' ), FlxG .switchState . bind (new Charter (name , d , v )));
3030 }
3131
32- public function makeSongOption (s : ChartMetaData ): IconOption {
33- songList .push (s .name .toLowerCase ());
32+ inline public function makeVariationOption (s : ChartMetaData ): TextOption {
33+ return new TextOption (s .variant , getID (' acceptVariation' ), " >" , openSongOption .bind (s , false ));
34+ }
35+
36+ public function openSongOption (s : ChartMetaData , first = true ) {
37+ curSong = s ;
3438
35- var opt = new IconOption ( s . name , getID ( ' acceptSong ' ), s . icon , () -> {
36- curSong = s ;
39+ var isVariant = s . variant != null && s . variant != ' ' ;
40+ var screen = new EditorTreeMenuScreen (( first || ! isVariant ) ? ( s . name + ( isVariant ? ' ( ${ s . variant } ) ' : ' ' )) : s . variant , getID ( ' selectDifficulty ' )) ;
3741
38- var screen = new EditorTreeMenuScreen ( s . name , getID ( ' selectDifficulty ' ), [
39- for ( d in s . difficulties ) if ( d != ' ' ) makeChartOption ( d , s . name )
40- ] );
42+ for ( d in s . difficulties ) if ( d != ' ' ) screen . add ( makeChartOption ( d , isVariant ? s . variant : null , s . name ));
43+ screen . add ( new Separator ());
44+ for ( v in s . variants ) if ( s . metas . get ( v ) != null ) screen . add ( makeVariationOption ( s . metas . get ( v )) );
4145
42- #if sys
43- screen .insert (0 , new NewOption (getID (' newDifficulty' ), getID (' newDifficultyDesc' ), () -> {
44- parent .openSubState (new ChartCreationScreen (saveChart ));
46+ #if sys
47+ screen .insert (0 , new NewOption (getID (' newDifficulty' ), getID (' newDifficultyDesc' ), () -> {
48+ parent .openSubState (new ChartCreationScreen (saveChart ));
49+ }));
50+
51+ if (! first ) screen .curSelected = 1 ;
52+ else {
53+ cast (screen .members [0 ], NewOption ).itemHeight = 120 ;
54+ screen .insert (1 , new NewOption (getID (' newVariation' ), getID (' newVariationDesc' ), () -> {
55+ parent .openSubState (new VariationCreationScreen (s , saveSong ));
4556 }));
46- screen .curSelected = 1 ;
47- #end
57+ screen .curSelected = 2 ;
58+ }
59+ #end
60+
61+ parent .addMenu (screen );
62+ }
63+
64+ public function makeSongOption (s : ChartMetaData ): IconOption {
65+ songList .push (s .name .toLowerCase ());
4866
49- parent .addMenu (screen );
50- });
51- opt .suffix = ' >' ;
67+ var opt = new IconOption (s .name , getID (' acceptSong' ), s .icon , openSongOption .bind (s , true ));
68+ opt .suffix = " >" ;
5269 opt .editorFlashColor = s .color .getDefault (FlxColor .WHITE );
5370
5471 return opt ;
5572 }
5673
5774 public function new () {
58- super (' editor.chart.name' , ' charterSelection.desc' , ' charterSelection.' , ' newSong' , ' newSongDesc' , () -> {
75+ super (' editor.chart.name' , ' charterSelection.desc' , ' charterSelection.' , ' newSong' , ' newSongDesc' , #if sys () -> {
5976 parent .openSubState (new SongCreationScreen (saveSong ));
60- });
77+ } #end );
6178 freeplayList = FreeplaySonglist .get (false );
6279
6380 for (i => s in freeplayList .songs ) add (makeSongOption (s ));
6481 }
6582
6683 #if sys
67- public function saveSong (creation : SongCreationData , ? callback : String -> SongCreationData -> Void ) {
68- var songAlreadyExists : Bool = songList . contains ( creation .meta .name . toLowerCase ()) ;
69- if (songAlreadyExists ) {
84+ public function saveSong (creation : SongCreationData , ? callback : String -> Void ) {
85+ var variant = creation . meta . variant != null && creation .meta .variant != " " ? creation . meta . variant : null ;
86+ if (songList . contains ( creation . meta . name . toLowerCase ()) || ( variant != null && curSong != null && curSong . variants . contains ( variant )) ) {
7087 parent .openSubState (new UIWarningSubstate (TU .translate (" chartCreation.warnings.song-exists-title" ), TU .translate (" chartCreation.warnings.song-exists-body" ), [
7188 {label : TU .translate (" editor.ok" ), color : 0xFFFF0000 , onClick : (t ) -> {}},
7289 ]));
7390 return ;
7491 }
7592
7693 var songFolder : String = ' ${Paths .getAssetsRoot ()}/songs/ ${creation .meta .name }' ;
94+ creation .meta = Chart .filterMetaForSaving (creation .meta );
7795
7896 #if sys
7997 // Make Directories
@@ -82,24 +100,32 @@ class CharterSelectionScreen extends EditorTreeMenuScreen {
82100 sys. FileSystem .createDirectory (' $songFolder /charts' );
83101
84102 // Save Files
85- CoolUtil .safeSaveFile (' $songFolder /meta.json' , Chart .makeMetaSaveable (creation .meta ));
86- if (creation .instBytes != null ) sys.io. File .saveBytes (' $songFolder /song/Inst. ${Flags .SOUND_EXT }' , creation .instBytes );
87- if (creation .voicesBytes != null ) sys.io. File .saveBytes (' $songFolder /song/Voices. ${Flags .SOUND_EXT }' , creation .voicesBytes );
103+ var instSuffix = creation .meta .instSuffix != null ? creation .meta .instSuffix : ' ' , vocalsSuffix = creation .meta .vocalsSuffix != null ? creation .meta .vocalsSuffix : ' ' ;
104+ CoolUtil .safeSaveFile (' $songFolder /meta ${variant != null ? " -" + variant : " " }.json' , Json .stringify (creation .meta , null , Flags .JSON_PRETTY_PRINT ));
105+ if (creation .instBytes != null ) sys.io. File .saveBytes (' $songFolder /song/Inst $instSuffix . ${Flags .SOUND_EXT }' , creation .instBytes );
106+ if (creation .voicesBytes != null ) sys.io. File .saveBytes (' $songFolder /song/Voices $vocalsSuffix . ${Flags .SOUND_EXT }' , creation .voicesBytes );
88107
89- if (creation .playerVocals != null ) sys.io. File .saveBytes (' $songFolder /song/Voices-Player. ${Flags .SOUND_EXT }' , creation .playerVocals );
90- if (creation .oppVocals != null ) sys.io. File .saveBytes (' $songFolder /song/Voices-Opponent. ${Flags .SOUND_EXT }' , creation .oppVocals );
108+ if (creation .playerVocals != null ) sys.io. File .saveBytes (' $songFolder /song/Voices-Player $ vocalsSuffix . ${Flags .SOUND_EXT }' , creation .playerVocals );
109+ if (creation .oppVocals != null ) sys.io. File .saveBytes (' $songFolder /song/Voices-Opponent $ vocalsSuffix . ${Flags .SOUND_EXT }' , creation .oppVocals );
91110 #end
92111
93- if (callback != null ) callback (songFolder , creation );
112+ if (callback != null ) callback (songFolder );
94113
95114 // Add to List
96- freeplayList .songs .insert (0 , creation .meta );
97- insert (1 , makeSongOption (creation .meta ));
115+ if (variant != null && curSong != null ) {
116+ curSong .variants .push (variant );
117+ curSong .metas .set (variant , creation .meta );
118+
119+ parent .tree .last ().add (makeVariationOption (creation .meta ));
120+ }
121+ else {
122+ freeplayList .songs .insert (0 , creation .meta );
123+ insert (1 , makeSongOption (creation .meta ));
124+ }
98125 }
99126
100127 public function saveChart (name : String , data : ChartData ) {
101- var difficultyAlreadyExists : Bool = curSong .difficulties .contains (name );
102- if (difficultyAlreadyExists ) {
128+ if (curSong .difficulties .contains (name )) {
103129 parent .openSubState (new UIWarningSubstate (TU .translate (" chartCreation.warnings.chart-exists-title" ), TU .translate (" chartCreation.warnings.chart-exists-body" ), [
104130 {label : TU .translate (" editor.ok" ), color : 0xFFFF0000 , onClick : (t ) -> {}},
105131 ]));
@@ -113,11 +139,16 @@ class CharterSelectionScreen extends EditorTreeMenuScreen {
113139
114140 // Add to List
115141 curSong .difficulties .push (name );
116- parent .tree .last ().insert (parent .tree .last ().length - 1 , makeChartOption (name , curSong .name ));
142+
143+ var screen = parent .tree .last ();
144+ var idx = 0 ;
145+ while (! (screen .members [idx ] is Separator )) idx ++ ;
146+ screen .insert (idx , makeChartOption (name , curSong .variant != null && curSong .variant != " " ? curSong .variant : null , curSong .name ));
117147
118148 // Add to Meta
119149 var meta = Json .parse (sys.io. File .getContent (' $songFolder /meta.json' ));
120- if (meta .difficulties != null && ! meta .difficulties .contains (name )) {
150+ if (meta .difficulties == null ) meta .difficulties = [];
151+ if (! meta .difficulties .contains (name )) {
121152 meta .difficulties .push (name );
122153 CoolUtil .safeSaveFile (' $songFolder /meta.json' , Chart .makeMetaSaveable (meta ));
123154 }
0 commit comments