2022-03-08 03:13:53 -05:00
package funkin ;
2020-10-13 04:07:04 -04:00
2022-03-08 03:13:53 -05:00
import funkin . Section . SwagSection ;
2022-09-16 01:44:50 -04:00
import funkin . noteStuff . NoteBasic . NoteData ;
2022-09-22 06:34:03 -04:00
import funkin . play . PlayState ;
2020-10-13 04:07:04 -04:00
import haxe . Json ;
import lime . utils . Assets ;
2020-10-24 05:19:13 -04:00
typedef SwagSong =
{
2023-01-22 22:25:45 -05:00
var song: String ;
var notes: FunnyNotes ;
var difficulties: Array < String > ;
var noteMap: Map < String , Array < SwagSection > > ;
var bpm: Float ;
var needsVoices: Bool ;
var voiceList: Array < String > ;
var speed: FunnySpeed ;
var speedMap: Map < String , Float > ;
var player1: String ;
var player2: String ;
var validScore: Bool ;
var extraNotes: Map < String , Array < SwagSection > > ;
2020-10-24 05:19:13 -04:00
}
2021-12-06 17:49:05 -05:00
typedef FunnySpeed =
{
2023-01-22 22:25:45 -05:00
var ? easy: Float ;
var ? normal: Float ;
var ? hard: Float ;
2021-12-06 17:49:05 -05:00
}
typedef FunnyNotes =
{
2023-01-22 22:25:45 -05:00
var ? easy: Array < SwagSection > ;
var ? normal: Array < SwagSection > ;
var ? hard: Array < SwagSection > ;
2021-12-06 17:49:05 -05:00
}
2021-11-29 21:43:38 -05:00
class SongLoad
2020-10-13 04:07:04 -04:00
{
2023-01-22 22:25:45 -05:00
public static var curDiff: String = ' n o r m a l ' ;
public static var curNotes: Array < SwagSection > ;
public static var songData: SwagSong ;
public static function loadFromJson ( jsonInput : String , ? folder : String ) : SwagSong
{
var rawJson: String = null ;
try
{
rawJson = Assets . getText ( Paths . json ( ' s o n g s / ${ folder . toLowerCase ( ) } / ${ jsonInput . toLowerCase ( ) } ' ) ) . trim ( ) ;
}
c atch ( e )
{
trace ( ' F a i l e d t o l o a d s o n g d a t a : ${ e } ' ) ;
rawJson = null ;
}
if ( rawJson == null )
{
return null ;
}
while ( ! rawJson . endsWith ( " } " ) )
{
rawJson = rawJson . substr ( 0 , rawJson . length - 1 ) ;
}
return parseJSONshit ( rawJson ) ;
}
public static function getSong ( ? diff : String ) : Array < SwagSection >
{
if ( diff == null ) diff = SongLoad . curDiff ;
var songShit: Array < SwagSection > = [ ] ;
// THIS IS OVERWRITTEN, WILL BE DEPRECTATED AND REPLACED SOOOOON
if ( songData != null )
{
switch ( diff )
{
c ase ' e a s y ' :
songShit = songData . notes . easy ;
c ase ' n o r m a l ' :
songShit = songData . notes . normal ;
c ase ' h a r d ' :
songShit = songData . notes . hard ;
}
}
checkAndCreateNotemap ( curDiff ) ;
songShit = songData . noteMap [ diff ] ;
return songShit ;
}
public static function checkAndCreateNotemap ( diff : String ) : Void
{
if ( songData == null || songData . noteMap == null ) return ;
if ( songData . noteMap [ diff ] == null ) songData . noteMap [ diff ] = [ ] ;
}
public static function getSpeed ( ? diff : String ) : Float
{
if ( PlayState . instance != null && PlayState . instance . currentChart != null )
{
return getSpeed_NEW ( diff ) ;
}
if ( diff == null ) diff = SongLoad . curDiff ;
var speedShit: Float = 1 ;
// all this shit is overridden by the thing that loads it from speedMap Map object!!!
// replace and delete later!
switch ( diff )
{
c ase ' e a s y ' :
2023-05-25 18:34:26 -04:00
speedShit = songData ? . speed ? . easy ? ? 1.0 ;
2023-01-22 22:25:45 -05:00
c ase ' n o r m a l ' :
2023-05-25 18:34:26 -04:00
speedShit = songData ? . speed ? . normal ? ? 1.0 ;
2023-01-22 22:25:45 -05:00
c ase ' h a r d ' :
2023-05-25 18:34:26 -04:00
speedShit = songData ? . speed ? . hard ? ? 1.0 ;
2023-01-22 22:25:45 -05:00
}
2023-05-25 18:34:26 -04:00
if ( songData ? . speedMap == null || songData ? . speedMap [ diff ] == null )
{
speedShit = 1 ;
}
e lse
{
speedShit = songData . speedMap [ diff ] ;
}
2023-01-22 22:25:45 -05:00
return speedShit ;
}
public static function getSpeed_NEW ( ? diff : String ) : Float
{
if ( PlayState . instance == null
| | PlayState . instance . currentChart == null
| | PlayState . instance . currentChart . scrollSpeed == 0.0 ) return 1.0 ;
return PlayState . instance . currentChart . scrollSpeed ;
}
public static function getDefaultSwagSong ( ) : SwagSong
{
return {
song : ' T e s t ' ,
notes : { easy : [ ] , normal : [ ] , hard : [ ] } ,
difficulties : [ " e a s y " , " n o r m a l " , " h a r d " ] ,
noteMap : new Map ( ) ,
speedMap : new Map ( ) ,
bpm : 150 ,
needsVoices : true ,
player1 : ' b f ' ,
player2 : ' d a d ' ,
speed :
{
easy : 1 ,
normal : 1 ,
hard : 1
} ,
validScore : false ,
voiceList : [ " B F " , " B F - p i x e l " ] ,
extraNotes : [ ]
} ;
}
public static function getDefaultNoteData ( ) : NoteData
{
return new NoteData ( ) ;
}
/ * *
* Casts the an array to NOTE data ( for L O A D I N G s h i t f r o m j s o n u s u a l l y )
* /
public static function castArrayToNoteData ( noteStuff : Array < SwagSection > )
{
if ( noteStuff == null ) return ;
for ( sectionIndex => section in noteStuff )
{
if ( section == null || section . sectionNotes == null ) continue ;
for ( noteIndex => noteDataArray in section . sectionNotes )
{
var arrayDipshit: Array < Dynamic > = cast noteDataArray ; // crackhead
if ( arrayDipshit != null ) // array isnt null, that means it loaded it as an array and needs to be manually parsed?
{
// at this point noteStuff[sectionIndex].sectionNotes[noteIndex] is an array because of the cast from the first line in this function
// so this line right here turns it back into the NoteData typedef type because of another bastard cast
noteStuff [ sectionIndex ] . sectionNotes [ noteIndex ] = cast SongLoad . getDefaultNoteData ( ) ; // turn it from an array (because of the cast), back to noteData? yeah that works
noteStuff [ sectionIndex ] . sectionNotes [ noteIndex ] . strumTime = arrayDipshit [ 0 ] ;
noteStuff [ sectionIndex ] . sectionNotes [ noteIndex ] . noteData = arrayDipshit [ 1 ] ;
noteStuff [ sectionIndex ] . sectionNotes [ noteIndex ] . sustainLength = arrayDipshit [ 2 ] ;
if ( arrayDipshit . length > 3 )
{
noteStuff [ sectionIndex ] . sectionNotes [ noteIndex ] . noteKind = arrayDipshit [ 3 ] ;
}
}
e lse if ( noteDataArray != null )
{
// array is NULL, so it checks if noteDataArray (doesnt exactly NEED to be an 'array' is also null or not.)
// At this point it should be an OBJECT that can be easily casted!!!
noteStuff [ sectionIndex ] . sectionNotes [ noteIndex ] = cast noteDataArray ;
}
e lse
throw " s h i t b r o k e y " ; // i actually dont know how throw works lol
}
}
}
/ * *
* Cast notedata to ARRAY ( usually u s e d f o r l e v e l S A V I N G )
* /
public static function castNoteDataToArray ( noteStuff : Array < SwagSection > )
{
if ( noteStuff == null ) return ;
for ( sectionIndex => section in noteStuff )
{
for ( noteIndex => noteTypeDefShit in section . sectionNotes )
{
var dipshitArray: Array < Dynamic > = [
noteTypeDefShit . strumTime ,
noteTypeDefShit . noteData ,
noteTypeDefShit . sustainLength ,
noteTypeDefShit . noteKind
] ;
noteStuff [ sectionIndex ] . sectionNotes [ noteIndex ] = cast dipshitArray ;
}
}
}
public static function castNoteDataToNoteData ( noteStuff : Array < SwagSection > )
{
if ( noteStuff == null ) return ;
for ( sectionIndex => section in noteStuff )
{
for ( noteIndex => noteTypedefShit in section . sectionNotes )
{
trace ( noteTypedefShit ) ;
noteStuff [ sectionIndex ] . sectionNotes [ noteIndex ] = noteTypedefShit ;
}
}
}
public static function parseJSONshit ( rawJson : String ) : SwagSong
{
var songParsed: Dynamic ;
try
{
songParsed = Json . parse ( rawJson ) ;
}
c atch ( e )
{
FlxG . log . warn ( " E r r o r p a r s i n g J S O N : " + e . message ) ;
trace ( " E r r o r p a r s i n g J S O N : " + e . message ) ;
return null ;
}
var swagShit: SwagSong = cast songParsed . song ;
swagShit . difficulties = [ ] ; // reset it to default before load
swagShit . noteMap = new Map ( ) ;
swagShit . speedMap = new Map ( ) ;
for ( diff in Reflect . fields ( songParsed . song . notes ) )
{
swagShit . difficulties . push ( diff ) ;
swagShit . noteMap [ diff ] = cast Reflect . field ( songParsed . song . notes , diff ) ;
castArrayToNoteData ( swagShit . noteMap [ diff ] ) ;
// castNoteDataToNoteData(swagShit.noteMap[diff]);
/ *
switch ( diff )
{
c ase " e a s y " :
castArrayToNoteData ( swagShit . notes . hard ) ;
c ase " n o r m a l " :
castArrayToNoteData ( swagShit . notes . normal ) ;
c ase " h a r d " :
castArrayToNoteData ( swagShit . notes . hard ) ;
}
* /
}
for ( diff in swagShit . difficulties )
{
swagShit . speedMap [ diff ] = cast Reflect . field ( songParsed . song . speed , diff ) ;
}
// trace(swagShit.noteMap.toString());
// trace(swagShit.speedMap.toString());
// trace('that was just notemap string lol');
swagShit . validScore = true ;
trace ( " S O N G S H I T A B O U T T A W E E K A G O O O " ) ;
for ( field in Reflect . fields ( Json . parse ( rawJson ) . song . speed ) )
{
// swagShit.speed[field] = Reflect.field(Json.parse(rawJson).song.speed, field);
// swagShit.notes[field] = Reflect.field(Json.parse(rawJson).song.notes, field);
// trace(swagShit.notes[field]);
}
// swagShit.notes = cast Json.parse(rawJson).song.notes[SongLoad.curDiff]; // by default uses
trace ( ' T H A T S H I T W A S J U S T T H E N O R M A L N O T E S ! ! ! ' ) ;
songData = swagShit ;
// curNotes = songData.notes.get('normal');
return swagShit ;
}
2020-10-13 04:07:04 -04:00
}