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-14 01:02:36 -04:00
using StringTools ;
2020-10-24 05:19:13 -04:00
typedef SwagSong =
{
var song: String ;
2021-12-06 17:49:05 -05:00
var notes: FunnyNotes ;
2022-01-31 14:16:28 -05:00
var difficulties: Array < String > ;
var noteMap: Map < String , Array < SwagSection > > ;
2021-03-20 12:33:29 -04:00
var bpm: Float ;
2020-10-24 05:19:13 -04:00
var needsVoices: Bool ;
2021-09-20 13:21:25 -04:00
var voiceList: Array < String > ;
2021-12-06 17:49:05 -05:00
var speed: FunnySpeed ;
2022-01-31 14:45:38 -05:00
var speedMap: Map < String , Float > ;
2020-10-24 05:19:13 -04:00
var player1: String ;
var player2: String ;
2020-12-04 12:32:35 -05:00
var validScore: Bool ;
2021-12-03 07:29:47 -05:00
var extraNotes: Map < String , Array < SwagSection > > ;
2020-10-24 05:19:13 -04:00
}
2021-12-06 17:49:05 -05:00
typedef FunnySpeed =
{
var ? easy: Float ;
var ? normal: Float ;
var ? hard: Float ;
}
typedef FunnyNotes =
{
var ? easy: Array < SwagSection > ;
var ? normal: Array < SwagSection > ;
var ? hard: Array < SwagSection > ;
}
2021-11-29 21:43:38 -05:00
class SongLoad
2020-10-13 04:07:04 -04:00
{
2021-12-03 07:29:47 -05:00
public static var curDiff: String = ' n o r m a l ' ;
2021-11-29 22:12:18 -05:00
public static var curNotes: Array < SwagSection > ;
public static var songData: SwagSong ;
2020-10-31 21:11:14 -04:00
public static function loadFromJson ( jsonInput : String , ? folder : String ) : SwagSong
2020-10-13 04:07:04 -04:00
{
2022-09-24 01:28:39 -04:00
var rawJson: String = null ;
2022-09-22 06:34:03 -04:00
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 ;
}
2020-10-14 01:02:36 -04:00
while ( ! rawJson . endsWith ( " } " ) )
{
rawJson = rawJson . substr ( 0 , rawJson . length - 1 ) ;
}
2020-12-25 04:09:14 -05:00
return parseJSONshit ( rawJson ) ;
}
2021-12-06 17:49:05 -05:00
public static function getSong ( ? diff : String ) : Array < SwagSection >
{
if ( diff == null )
diff = SongLoad . curDiff ;
var songShit: Array < SwagSection > = [ ] ;
2022-01-20 22:55:19 -05:00
2022-01-31 14:45:38 -05:00
// THIS IS OVERWRITTEN, WILL BE DEPRECTATED AND REPLACED SOOOOON
2022-01-20 22:55:19 -05:00
if ( songData != null )
2021-12-06 17:49:05 -05:00
{
2022-01-20 22:55:19 -05:00
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 ;
}
2021-12-06 17:49:05 -05:00
}
2022-02-03 10:32:29 -05:00
checkAndCreateNotemap ( curDiff ) ;
2022-01-31 14:45:38 -05:00
songShit = songData . noteMap [ diff ] ;
2021-12-06 17:49:05 -05:00
return songShit ;
}
2022-02-03 10:32:29 -05:00
public static function checkAndCreateNotemap ( diff : String ) : Void
{
2022-08-27 02:02:29 -04:00
if ( songData == null || songData . noteMap == null )
return ;
2022-02-03 10:32:29 -05:00
if ( songData . noteMap [ diff ] == null )
songData . noteMap [ diff ] = [ ] ;
}
2021-12-06 17:49:05 -05:00
public static function getSpeed ( ? diff : String ) : Float
{
2022-09-22 06:34:03 -04:00
if ( PlayState . instance != null && PlayState . instance . currentChart != null )
{
return getSpeed_NEW ( diff ) ;
}
2021-12-06 17:49:05 -05:00
if ( diff == null )
diff = SongLoad . curDiff ;
var speedShit: Float = 1 ;
2022-01-31 14:45:38 -05:00
// all this shit is overridden by the thing that loads it from speedMap Map object!!!
// replace and delete later!
2021-12-06 17:49:05 -05:00
switch ( diff )
{
c ase ' e a s y ' :
speedShit = songData . speed . easy ;
c ase ' n o r m a l ' :
speedShit = songData . speed . normal ;
c ase ' h a r d ' :
speedShit = songData . speed . hard ;
}
2022-02-03 10:32:29 -05:00
if ( songData . speedMap [ diff ] == null )
songData . speedMap [ diff ] = 1 ;
2022-01-31 14:45:38 -05:00
speedShit = songData . speedMap [ diff ] ;
2021-12-06 17:49:05 -05:00
return speedShit ;
}
2022-09-22 06:34:03 -04:00
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 ;
}
2022-01-20 22:55:19 -05:00
public static function getDefaultSwagSong ( ) : SwagSong
{
return {
song : ' T e s t ' ,
notes : { easy : [ ] , normal : [ ] , hard : [ ] } ,
2022-01-31 14:16:28 -05:00
difficulties : [ " e a s y " , " n o r m a l " , " h a r d " ] ,
noteMap : new Map ( ) ,
2022-01-31 14:45:38 -05:00
speedMap : new Map ( ) ,
2022-01-20 22:55:19 -05:00
bpm : 150 ,
needsVoices : true ,
player1 : ' b f ' ,
player2 : ' d a d ' ,
2022-01-31 14:45:38 -05:00
speed : {
easy : 1 ,
normal : 1 ,
hard : 1
} ,
2022-01-20 22:55:19 -05:00
validScore : false ,
voiceList : [ " B F " , " B F - p i x e l " ] ,
extraNotes : [ ]
} ;
}
2022-01-25 13:30:08 -05:00
public static function getDefaultNoteData ( ) : NoteData
{
2022-02-09 20:31:36 -05:00
return new NoteData ( ) ;
2022-01-25 13:30:08 -05:00
}
2022-01-25 20:30:29 -05:00
/ * *
* 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 > )
2020-12-25 04:09:14 -05:00
{
2022-01-25 21:14:31 -05:00
if ( noteStuff == null )
return ;
2022-01-25 20:30:29 -05:00
for ( sectionIndex => section in noteStuff )
{
2022-03-01 22:07:33 -05:00
if ( section == null || section . sectionNotes == null )
continue ;
2022-01-25 20:30:29 -05:00
for ( noteIndex => noteDataArray in section . sectionNotes )
{
2022-01-28 12:20:03 -05:00
var arrayDipshit: Array < Dynamic > = cast noteDataArray ; // crackhead
2022-01-25 20:30:29 -05:00
2022-01-28 12:24:50 -05:00
if ( arrayDipshit != null ) // array isnt null, that means it loaded it as an array and needs to be manually parsed?
2022-01-28 12:20:03 -05:00
{
// 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 ] ;
2022-03-25 22:30:37 -04:00
if ( arrayDipshit . length > 3 )
{
2022-07-06 21:49:42 -04:00
noteStuff [ sectionIndex ] . sectionNotes [ noteIndex ] . noteKind = arrayDipshit [ 3 ] ;
2022-02-28 23:04:55 -05:00
}
2022-01-28 12:20:03 -05:00
}
e lse if ( noteDataArray != null )
{
2022-01-28 12:24:50 -05:00
// 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!!!
2022-01-28 12:20:03 -05:00
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
2022-01-25 20:30:29 -05:00
}
}
}
/ * *
* 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 > )
{
2022-01-25 21:14:31 -05:00
if ( noteStuff == null )
return ;
2022-01-25 20:30:29 -05:00
for ( sectionIndex => section in noteStuff )
2022-01-25 13:30:08 -05:00
{
2022-01-25 20:30:29 -05:00
for ( noteIndex => noteTypeDefShit in section . sectionNotes )
2022-01-25 13:30:08 -05:00
{
2022-01-25 20:30:29 -05:00
var dipshitArray: Array < Dynamic > = [
noteTypeDefShit . strumTime ,
noteTypeDefShit . noteData ,
noteTypeDefShit . sustainLength ,
2022-07-06 21:49:42 -04:00
noteTypeDefShit . noteKind
2022-01-25 20:30:29 -05:00
] ;
noteStuff [ sectionIndex ] . sectionNotes [ noteIndex ] = cast dipshitArray ;
2022-01-25 13:30:08 -05:00
}
2022-01-25 20:30:29 -05:00
}
}
2022-02-03 19:51:16 -05:00
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 ;
}
}
}
2022-01-25 20:30:29 -05:00
public static function parseJSONshit ( rawJson : String ) : SwagSong
{
2022-07-06 21:49:42 -04:00
var songParsed: Dynamic ;
2022-08-27 02:02:29 -04:00
try
{
2022-07-06 21:49:42 -04:00
songParsed = Json . parse ( rawJson ) ;
2022-08-27 02:02:29 -04:00
}
c atch ( e )
{
2022-07-06 21:49:42 -04:00
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 ;
}
2022-08-27 02:02:29 -04:00
2022-01-31 14:16:28 -05:00
var swagShit: SwagSong = cast songParsed . song ;
swagShit . difficulties = [ ] ; // reset it to default before load
swagShit . noteMap = new Map ( ) ;
2022-01-31 14:45:38 -05:00
swagShit . speedMap = new Map ( ) ;
2022-01-31 14:16:28 -05:00
for ( diff in Reflect . fields ( songParsed . song . notes ) )
2022-01-25 20:30:29 -05:00
{
2022-01-31 14:16:28 -05:00
swagShit . difficulties . push ( diff ) ;
swagShit . noteMap [ diff ] = cast Reflect . field ( songParsed . song . notes , diff ) ;
2022-02-03 19:51:16 -05:00
2022-01-31 14:16:28 -05:00
castArrayToNoteData ( swagShit . noteMap [ diff ] ) ;
2022-02-03 19:51:16 -05:00
// castNoteDataToNoteData(swagShit.noteMap[diff]);
2022-01-25 13:30:08 -05:00
2022-02-03 19:51:16 -05:00
/ *
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 ) ;
}
* /
2022-01-25 13:30:08 -05:00
}
2022-01-31 14:45:38 -05:00
for ( diff in swagShit . difficulties )
{
swagShit . speedMap [ diff ] = cast Reflect . field ( songParsed . song . speed , diff ) ;
}
2022-02-11 12:03:54 -05:00
// trace(swagShit.noteMap.toString());
// trace(swagShit.speedMap.toString());
// trace('that was just notemap string lol');
2022-01-31 14:16:28 -05:00
2020-12-25 04:09:14 -05:00
swagShit . validScore = true ;
2021-11-29 22:12:18 -05:00
2021-12-06 17:49:05 -05:00
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
2021-12-03 07:29:47 -05:00
2021-12-06 17:49:05 -05:00
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 ! ! ! ' ) ;
2021-11-29 22:12:18 -05:00
songData = swagShit ;
2021-12-03 07:29:47 -05:00
// curNotes = songData.notes.get('normal');
2021-11-29 22:12:18 -05:00
2020-10-24 05:19:13 -04:00
return swagShit ;
2020-10-13 04:07:04 -04:00
}
}