@@ -48,6 +48,8 @@ class OsuFreeplayState extends MusicBeatState
4848 private var textGrp : FlxTypedGroup <FlxText >;
4949
5050 private static var curSelected : Int = 0 ;
51+ private static var curDiff : Int = 0 ;
52+ private static var curDiffName : String = ' ' ;
5153 private static var maxSelected : Int = 0 ;
5254
5355 var inSub : Bool = false ;
@@ -223,17 +225,17 @@ class OsuFreeplayState extends MusicBeatState
223225
224226 if (FlxG .keys .justPressed .L && APEntryState .inArchipelagoMode && ! isTyping ) {
225227 try { // Because this menu has no actual difficulty select, just assume it's the first difficulty
226- var songLowercase : String = Paths .formatToSongPath (FreeplayManager .songList [curSelected ].songName );
228+ var songLowercase : String = Paths .formatToSongPath (FreeplayManager .songList [songBox . members [ curSelected ]. songID ].songName );
227229 var poop : String = Highscore .formatSong (songLowercase , 0 );
228- Mods .currentModDirectory = FreeplayManager .songList [curSelected ].folder ;
230+ Mods .currentModDirectory = FreeplayManager .songList [songBox . members [ curSelected ]. songID ].folder ;
229231 Song .loadFromJson (poop , songLowercase );
230232 PlayState .isStoryMode = false ;
231233 PlayState .storyDifficulty = 0 ;
232234 } catch (e : Dynamic ) {
233235 trace (' Error loading song: ' + e );
234236 }
235237 try {
236- FreeplayManager .forceUnlockCheck (FreeplayManager .songList [curSelected ].songName , WeekData .getCurrentWeek ().folder );
238+ FreeplayManager .forceUnlockCheck (FreeplayManager .songList [songBox . members [ curSelected ]. songID ].songName , WeekData .getCurrentWeek ().folder );
237239 } catch (e : Dynamic ) {
238240 trace (" You can't check nothing, silly!" );
239241 }
@@ -242,7 +244,7 @@ class OsuFreeplayState extends MusicBeatState
242244
243245 if (FlxG .keys .justPressed .H && APEntryState .inArchipelagoMode && ! isTyping ) {
244246 try {
245- var SongInfo = APEntryState .apGame .getSongAndMod (FreeplayManager .songList [curSelected ].songName + (FreeplayManager .songList [curSelected ].folder != " " ? " (" + FreeplayManager .songList [curSelected ].folder + " )" : " " ));
247+ var SongInfo = APEntryState .apGame .getSongAndMod (FreeplayManager .songList [songBox . members [ curSelected ].songID ]. songName + (FreeplayManager .songList [songBox . members [ curSelected ].songID ]. folder != " " ? " (" + FreeplayManager .songList [songBox . members [ curSelected ]. songID ].folder + " )" : " " ));
246248 if (APEntryState .ap != null ) {
247249 APEntryState .ap .Say (" !hint " + SongInfo .song + ((SongInfo .mod != " " && SongInfo .mod != null ) ? " (" + SongInfo .mod + " )" : " " ));
248250 archipelago.console. SideUI .instance .active = true ;
@@ -351,10 +353,10 @@ class OsuFreeplayState extends MusicBeatState
351353
352354 if (controls. ACCEPT )
353355 {
354- var vicCheck : Bool = FreeplayManager .isVictorySong (FreeplayManager .songList [curSelected ].songName , FreeplayManager .songList [curSelected ].folder ) && APInfo .ticketCount >= APInfo .ticketWinCount ;
356+ var vicCheck : Bool = FreeplayManager .isVictorySong (FreeplayManager .songList [songBox . members [ curSelected ].songID ]. songName , FreeplayManager .songList [songBox . members [ curSelected ]. songID ].folder ) && APInfo .ticketCount >= APInfo .ticketWinCount ;
355357 // You need the song AND the tickets.
356358 trace (' can play victory song: ${vicCheck }' );
357- if (FreeplayManager .isVictorySong (FreeplayManager .songList [curSelected ].songName , FreeplayManager .songList [curSelected ].folder ) && ! vicCheck ) {
359+ if (FreeplayManager .isVictorySong (FreeplayManager .songList [songBox . members [ curSelected ].songID ]. songName , FreeplayManager .songList [songBox . members [ curSelected ]. songID ].folder ) && ! vicCheck ) {
358360 FlxG .camera .shake (0.005 , 0.5 );
359361 FlxG .sound .play (Paths .sound (" badnoise" + FlxG .random .int (1 ,3 )), 1 );
360362 var ogColor = songBox .members [curSelected ].color ;
@@ -366,7 +368,7 @@ class OsuFreeplayState extends MusicBeatState
366368 return ;
367369 }
368370
369- if (FreeplayManager .trueMissing .contains (FreeplayManager .songList [curSelected ].songName ) && ! FreeplayManager .unplayedList .contains (FreeplayManager .songList [curSelected ].songName )) {
371+ if (FreeplayManager .trueMissing .contains (FreeplayManager .songList [songBox . members [ curSelected ].songID ]. songName ) && ! FreeplayManager .unplayedList .contains (FreeplayManager .songList [songBox . members [ curSelected ]. songID ].songName )) {
370372 FlxG .camera .shake (0.005 , 0.5 );
371373 FlxG .sound .play (Paths .sound (" badnoise" + FlxG .random .int (1 ,3 )), 1 );
372374 var ogColor = songBox .members [curSelected ].color ;
@@ -376,6 +378,125 @@ class OsuFreeplayState extends MusicBeatState
376378 });
377379 return ;
378380 }
381+
382+ if (songBox .members [curSelected ] is DiffBox ) {
383+ // Get the song, and the difficulty, and play it.
384+ var missingText : FlxText = new FlxText (0 , 0 , FlxG .width , ' ' , 20 );
385+ var songLowercase : String = Paths .formatToSongPath (FreeplayManager .songList [songBox .members [curSelected ].songID ].songName );
386+ var poop : String = Highscore .formatSong (songLowercase , curDiff );
387+ trace (poop );
388+ {
389+ // selected = true;
390+ var mismatched : String = " " ;
391+ // I'll make it look pretty later
392+ if (ClientPrefs .getGameplaySetting (' bothMode' , false ) && (ClientPrefs .getGameplaySetting (' opponentplay' , false ) || ClientPrefs .getGameplaySetting (' gfMode' , false )))
393+ mismatched = " you can't have \" Play Both Sides\" and \" GF Mode\" or \" Opponent Mode\" on at the same time!" ;
394+ else mismatched = " " ;
395+ if (ClientPrefs .getGameplaySetting (' opponentplay' , false ) && ClientPrefs .getGameplaySetting (' gfMode' , false ))
396+ mismatched = " you can't have \" GF Mode\" and \" Opponent Mode\" on at the same time!" ;
397+ else mismatched = " " ;
398+ if (ClientPrefs .getGameplaySetting (' loopMode' , false ) && ClientPrefs .getGameplaySetting (' loopModeC' , false ))
399+ mismatched = " you can't have \" Loop Mode\" and \" Loop Challenge Mode\" on at the same time!" ;
400+ else mismatched = " " ;
401+ try
402+ {
403+ if (songLowercase == " song-not-found" )
404+ {
405+ var h = yutautil. ChanceSelector .selectOption (hh , false , true , true );
406+ if (APEntryState .inArchipelagoMode ) {
407+ h = " normal error" ;
408+ }
409+ switch (h )
410+ {
411+ case " small argument" :
412+ Song .loadFromJson (' small-argument-hard' , ' small-argument' );
413+ FlxG .save .data .gotIntoAnArgument = true ;
414+ FlxG .save .flush ();
415+ case " beat battle" :
416+ Song .loadFromJson (' beat-battle-reasonable' , ' beat-battle' );
417+ FlxG .save .data .gotbeatbattle = true ;
418+ FlxG .save .flush ();
419+ case " beat battle 2" :
420+ Song .loadFromJson (' beat-battle-2-hard' , ' beat-battle-2' );
421+ FlxG .save .data .gotbeatbattle2 = true ;
422+ FlxG .save .flush ();
423+ case " normal error" :
424+ trace (' ERROR! NO SONGS FOUND!' );
425+
426+ missingText .text = ' ERROR! NO SONGS FOUND!' ;
427+ missingText .screenCenter (Y );
428+ missingText .visible = true ;
429+ missingTextBG .visible = true ;
430+ FlxG .sound .play (Paths .sound (' cancelMenu' ));
431+
432+ // updateTexts(elapsed);
433+ super .update (elapsed );
434+ return ;
435+ }
436+ PlayState .isStoryMode = false ;
437+ PlayState .storyDifficulty = curDiff ;
438+ }
439+ else if (mismatched != " " )
440+ {
441+ trace (' ERROR! Modifiers are on that shouldn\' t be!' );
442+
443+ missingText .text = ' ERROR! ' + mismatched .toUpperCase ();
444+ missingText .screenCenter (Y );
445+ missingText .visible = true ;
446+ missingTextBG .visible = true ;
447+ FlxG .sound .play (Paths .sound (' cancelMenu' ));
448+
449+ updateTexts (elapsed );
450+ super .update (elapsed );
451+ return ;
452+ }
453+ else
454+ {
455+
456+ Song .loadFromJson (poop , songLowercase );
457+ PlayState .isStoryMode = false ;
458+ PlayState .storyDifficulty = curDiff ;
459+
460+ trace (' CURRENT WEEK: ' + WeekData .getWeekFileName ());
461+ }
462+ }
463+ catch (e : Dynamic )
464+ {
465+ trace (' ERROR! $e ' );
466+
467+ var errorStr : String = e .toString ();
468+ if (errorStr .startsWith (' [file_contents,assets/data/' )) errorStr = ' Missing file: ' + errorStr .substring (34 , errorStr .length - 1 ); // Missing chart
469+ missingText .text = ' ERROR WHILE LOADING CHART:\n $errorStr ' ;
470+ missingText .screenCenter (Y );
471+ missingText .visible = true ;
472+ missingTextBG .visible = true ;
473+ FlxG .sound .play (Paths .sound (' cancelMenu' ));
474+
475+ updateTexts (elapsed );
476+ super .update (elapsed );
477+ return ;
478+ }
479+
480+ if (FlxG .keys .pressed .SHIFT ){
481+ ClientPrefs .openChartEditor ();
482+ } else {
483+ if (! alreadyClicked )
484+ {
485+ alreadyClicked = true ;
486+ MusicBeatState .reopen = false ; // Fix a sticker bug
487+ LoadingState .prepareToSong ();
488+ LoadingState .loadAndSwitchState (APEntryState .inArchipelagoMode ? new archipelago. APPlayState () : new states. PlayState ());
489+ }
490+ #if !SHOW_LOADING_SCREEN FlxG .sound .music .stop (); #end
491+ stopMusicPlay = true ;
492+ }
493+ else {
494+ substates. DiffSubState .songChoices = songChoices ;
495+ substates. DiffSubState .listChoices = listChoices ;
496+ openSubState (new substates. DiffSubState ());
497+ }
498+ }
499+ }
379500
380501 // reloadSongArray();
381502 inSub = true ;
@@ -456,6 +577,16 @@ class OsuFreeplayState extends MusicBeatState
456577 function changeSong (change : Int = 0 , playSound : Bool = true )
457578 {
458579 curSelected + = change ;
580+ try {
581+ curDiff = cast (songBox .members [curSelected ]:DiffBox ).difID ;
582+ } catch (e : Dynamic ) {
583+ curDiff = - 1 ;
584+ }
585+ try {
586+ curDiffName = cast (songBox .members [curSelected ]:DiffBox ).difName ;
587+ } catch (e : Dynamic ) {
588+ curDiffName = ' None' ;
589+ }
459590
460591 if (curSelected > maxSelected - 1 )
461592 curSelected = 0 ;
@@ -466,13 +597,13 @@ class OsuFreeplayState extends MusicBeatState
466597 for (item in songBox )
467598 item .posY = i ++ - curSelected ;
468599
469- if (FreeplayManager .songList [curSelected ] != null )
600+ if (FreeplayManager .songList [songBox . members [ curSelected ]. songID ] != null )
470601 {
471602 WeekData .setDirectoryFromWeek ();
472- Mods .currentModDirectory = FreeplayManager .songList [curSelected ].folder ;
473- PlayState .storyWeek = FreeplayManager .songList [curSelected ].week ;
603+ Mods .currentModDirectory = FreeplayManager .songList [songBox . members [ curSelected ]. songID ].folder ;
604+ PlayState .storyWeek = FreeplayManager .songList [songBox . members [ curSelected ]. songID ].week ;
474605 try {
475- switch (FreeplayManager .songList [curSelected ].songName )
606+ switch (FreeplayManager .songList [songBox . members [ curSelected ]. songID ].songName )
476607 {
477608 case ' Small Argument' | ' Beat Battle 2' :
478609 Difficulty .list = [' Hard' ];
@@ -482,7 +613,7 @@ class OsuFreeplayState extends MusicBeatState
482613 Difficulty .loadFromWeek ();
483614 }
484615 } catch (e : Dynamic ) {}
485- try {metadata = FreeplayManager .metadata .get (FreeplayManager .songList [curSelected ].songName .toLowerCase ());}
616+ try {metadata = FreeplayManager .metadata .get (FreeplayManager .songList [songBox . members [ curSelected ]. songID ].songName .toLowerCase ());}
486617 catch (e ) {metadata = null ;}
487618
488619 if (metadata != null && metadata .freeplay != null ) {
@@ -545,16 +676,19 @@ class OsuFreeplayState extends MusicBeatState
545676 }
546677
547678 function loadDiffs (song : Dynamic ) {
548- var week : WeekData = WeekData .weeksLoaded .get (WeekData .weeksList [FreeplayManager .songList [curSelected ].week ]);
679+ var week : WeekData = WeekData .weeksLoaded .get (WeekData .weeksList [FreeplayManager .songList [songBox . members [ curSelected ]. songID ].week ]);
549680 Difficulty .loadFromWeek (week );
550681
551682 var diffInt : Int = 0 ;
552683 for (j in 0 ... Difficulty .list .length )
553684 {
554- var songBox : SongBox = new SongBox (320 , 100 );
685+ var songBox : DiffBox = new DiffBox (320 , 100 );
686+
687+ songBox .difID = j ;
688+ songBox .difName = Difficulty .list [j ];
555689 songBox .loadGraphic (Paths .image (' OSUState/bars/background2' ));
556690 songBox .setGraphicSize (650 , 50 );
557- songBox .setColorTransform (- 1 , - 1 , - 1 , 1 , FreeplayManager .songList [curSelected ].color [0 ][0 ], FreeplayManager .songList [curSelected ].color [0 ][1 ], FreeplayManager .songList [curSelected ].color [0 ][2 ], 1 );
691+ songBox .setColorTransform (- 1 , - 1 , - 1 , 1 , FreeplayManager .songList [songBox . members [ curSelected ].songID ]. color [0 ][0 ], FreeplayManager .songList [songBox . members [ curSelected ].songID ]. color [0 ][1 ], FreeplayManager .songList [songBox . members [ curSelected ]. songID ].color [0 ][2 ], 1 );
558692 songBox. ID = song. ID + diffInt ;
559693 this .songBox .add (songBox );
560694
@@ -604,6 +738,7 @@ class OsuFreeplayState extends MusicBeatState
604738 var songBox : SongBox = new SongBox (320 , 100 );
605739 songBox .loadGraphic (Paths .image (' OSUState/bars/background2' ));
606740 songBox .setGraphicSize (650 , 100 );
741+ songBox .songID = i ;
607742
608743 if (APEntryState .inArchipelagoMode ) {
609744 var isBronze : Bool = FlxG .random .bool (50 ); // Randomly decide between orange and bronze
@@ -719,7 +854,7 @@ class OsuFreeplayState extends MusicBeatState
719854 var week : WeekData = WeekData .weeksLoaded .get (WeekData .weeksList [FreeplayManager .songList [i ].week ]);
720855 Difficulty .loadFromWeek (week );
721856
722- if (FreeplayManager .songList [i ].songName == FreeplayManager .songList [curSelected ].songName ) {
857+ if (FreeplayManager .songList [i ].songName == FreeplayManager .songList [songBox . members [ curSelected ]. songID ].songName ) {
723858 trace (songName );
724859 trueInt = i + 1 ;
725860 for (j in 0 ... Difficulty .list .length )
@@ -730,6 +865,7 @@ class OsuFreeplayState extends MusicBeatState
730865 songBox .setGraphicSize (650 , 100 );
731866 songBox .setColorTransform (- 1 , - 1 , - 1 , 1 , FreeplayManager .songList [i ].color [0 ][0 ], FreeplayManager .songList [i ].color [0 ][1 ], FreeplayManager .songList [i ].color [0 ][2 ], 1 );
732867 songBox. ID = trueInt ;
868+ songBox .songID = i ;
733869 this .songBox .add (songBox );
734870
735871 var icon : HealthIcon = new HealthIcon (FreeplayManager .songList [i ].songCharacter , false );
0 commit comments