Funkin/source/funkin/SongLoad.hx

330 lines
8 KiB
Haxe
Raw Normal View History

package funkin;
2020-10-13 04:07:04 -04: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;
var notes:FunnyNotes;
2022-01-31 14:16:28 -05:00
var difficulties:Array<String>;
var noteMap:Map<String, Array<SwagSection>>;
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>;
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;
var extraNotes:Map<String, Array<SwagSection>>;
2020-10-24 05:19:13 -04: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>;
}
class SongLoad
2020-10-13 04:07:04 -04:00
{
public static var curDiff:String = 'normal';
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
{
var rawJson:String = null;
2022-09-22 06:34:03 -04:00
try
{
rawJson = Assets.getText(Paths.json('songs/${folder.toLowerCase()}/${jsonInput.toLowerCase()}')).trim();
}
catch (e)
{
trace('Failed to load song data: ${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);
}
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)
{
2022-01-20 22:55:19 -05:00
switch (diff)
{
case 'easy':
songShit = songData.notes.easy;
case 'normal':
songShit = songData.notes.normal;
case 'hard':
songShit = songData.notes.hard;
}
}
checkAndCreateNotemap(curDiff);
2022-01-31 14:45:38 -05:00
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
{
2022-09-22 06:34:03 -04:00
if (PlayState.instance != null && PlayState.instance.currentChart != null)
{
return getSpeed_NEW(diff);
}
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!
switch (diff)
{
case 'easy':
speedShit = songData.speed.easy;
case 'normal':
speedShit = songData.speed.normal;
case 'hard':
speedShit = songData.speed.hard;
}
if (songData.speedMap[diff] == null)
songData.speedMap[diff] = 1;
2022-01-31 14:45:38 -05:00
speedShit = songData.speedMap[diff];
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: 'Test',
notes: {easy: [], normal: [], hard: []},
2022-01-31 14:16:28 -05:00
difficulties: ["easy", "normal", "hard"],
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: 'bf',
player2: 'dad',
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: ["BF", "BF-pixel"],
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 LOADING shit from json usually)
*/
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
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];
if (arrayDipshit.length > 3)
{
noteStuff[sectionIndex].sectionNotes[noteIndex].noteKind = arrayDipshit[3];
2022-02-28 23:04:55 -05:00
}
2022-01-28 12:20:03 -05:00
}
else 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!!!
2022-01-28 12:20:03 -05:00
noteStuff[sectionIndex].sectionNotes[noteIndex] = cast noteDataArray;
}
else
throw "shit brokey"; // i actually dont know how throw works lol
2022-01-25 20:30:29 -05:00
}
}
}
/**
* Cast notedata to ARRAY (usually used for level SAVING)
*/
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,
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
{
var songParsed:Dynamic;
try
{
songParsed = Json.parse(rawJson);
}
catch (e)
{
FlxG.log.warn("Error parsing JSON: " + e.message);
trace("Error parsing JSON: " + e.message);
return null;
}
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)
{
case "easy":
castArrayToNoteData(swagShit.notes.hard);
case "normal":
castArrayToNoteData(swagShit.notes.normal);
case "hard":
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
trace("SONG SHIT ABOUTTA WEEK AGOOO");
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('THAT SHIT WAS JUST THE NORMAL NOTES!!!');
2021-11-29 22:12:18 -05:00
songData = swagShit;
// 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
}
}