Exporting to other engines wip

This commit is contained in:
lunarcleint
2024-03-23 05:08:53 -07:00
parent 168dacf68e
commit 217cade22c
3 changed files with 111 additions and 7 deletions
+2 -1
View File
@@ -1,5 +1,6 @@
package funkin.backend.chart;
import funkin.backend.system.Conductor;
import funkin.backend.chart.ChartData;
import flixel.util.FlxColor;
import haxe.io.Path;
@@ -143,7 +144,7 @@ class Chart {
base = data;
} else {
// base game chart
BaseGameParser.parse(data, base);
FNFLegacyParser.parse(data, base);
}
#end
}
@@ -1,6 +1,9 @@
package funkin.backend.chart;
class BaseGameParser {
import funkin.backend.chart.ChartData.ChartEvent;
import funkin.backend.system.Conductor;
class FNFLegacyParser {
public static function parse(data:Dynamic, result:ChartData) {
// base fnf chart parsing
var data:SwagSong = data;
@@ -109,7 +112,90 @@ class BaseGameParser {
curTime += curCrochet * beatsPerMeasure;
}
}
// have conductor set up BEFORE you run this :D -lunar
public static function encode(chart:ChartData):Dynamic {
var base:SwagSong = __convertToSwagSong(chart);
base.notes = __convertToSwagSections(chart);
for (strumLine in chart.strumLines)
for (note in strumLine.notes) {
var section:Int = Math.floor(Conductor.getStepForTime(note.time) / Conductor.getMeasureLength());
if (section > 0 && section < base.notes.length)
base.notes[section].sectionNotes.push([
note.time, // TIME
note.id + (strumLine.type == PLAYER ? 3 : 0), // DATA
note.sLen // SUSTAIN LENGTH
]);
}
return {song: base};
}
// To make it easier to write the psych parser... -lunar
@:noCompletion public static function __convertToSwagSong(chart:ChartData):SwagSong {
var base:SwagSong = {
song: chart.meta.name,
notes: null,
bpm: chart.meta.bpm,
needsVoices: chart.meta.needsVoices,
speed: chart.scrollSpeed,
player1: null,
player2: null,
validScore: true
};
for (strumLine in chart.strumLines)
switch (strumLine.type) {
case OPPONENT:
if (base.player2 == null) base.player2 = strumLine.characters.getDefault(["dad"])[0];
case PLAYER:
if (base.player1 == null) base.player1 = strumLine.characters.getDefault(["bf"])[0];
case ADDITIONAL:
// if (base.gf == null || base.gfVersion == null)
// base.gf = base.gfVersion = strumLine.characters.getDefault(["gf"])[0];
}
return base;
}
@:noCompletion public static function __convertToSwagSections(chart:ChartData):Array<SwagSection> {
var events:Array<ChartEvent> = chart.events.copy();
var measures:Float = Conductor.getMeasuresLength();
var sections:Int = Math.floor(measures) + (measures % 1 > 0 ? 1 : 0);
var notes:Array<SwagSection> = cast new haxe.ds.Vector<SwagSection>(sections);
for (section in 0...sections) {
var baseSection:SwagSection = {
sectionNotes: [],
lengthInSteps: Std.int(Conductor.getMeasureLength()),
mustHitSection: notes[section-1] != null ? notes[section-1].mustHitSection : false,
bpm: notes[section-1] != null ? notes[section-1].bpm : chart.meta.bpm,
changeBPM: false,
altAnim: notes[section-1] != null ? notes[section-1].altAnim : false
};
var sectionEndTime:Float = Conductor.getTimeForStep(Conductor.getMeasureLength() * (section+1));
while(events.length > 0 && events.last().time <= sectionEndTime) {
var event:ChartEvent = events.pop();
switch (event.name) {
case "Camera Movement":
baseSection.mustHitSection = chart.strumLines[event.params[0]].type == PLAYER;
case "Alt Animation Toggle":
baseSection.altAnim = event.params[0] || event.params[1];
case "BPM Change":
baseSection.changeBPM = true;
baseSection.bpm = event.params[0];
}
}
notes[section] = baseSection;
}
return notes;
}
}
typedef SwagSong =
{
var song:String;
@@ -117,13 +203,13 @@ typedef SwagSong =
var bpm:Float;
var needsVoices:Bool;
var speed:Float;
var stage:String;
var noteTypes:Array<String>;
var ?stage:String;
var ?noteTypes:Array<String>;
var player1:String;
var player2:String;
var gf:String;
var gfVersion:String;
var ?gf:String;
var ?gfVersion:String;
var validScore:Bool;
// ADDITIONAL STUFF THAT MAY NOT BE PRESENT IN CHART
@@ -136,9 +222,10 @@ typedef SwagSection =
{
var sectionNotes:Array<Dynamic>;
var lengthInSteps:Int;
var ?typeOfSection:Int;
var mustHitSection:Bool;
var bpm:Float;
var changeBPM:Bool;
var altAnim:Null<Bool>;
@:optional var camTarget:Null<Float>;
var ?camTarget:Null<Float>;
}
+16
View File
@@ -164,6 +164,15 @@ class Charter extends UIState {
onSelect: _file_meta_saveas,
},
null,
{
label: "Export As FNF Legacy...",
onSelect: _file_saveas_fnflegacy,
},
{
label: "Export As Psych Engine...",
onSelect: _file_saveas_psych,
},
null,
{
label: "Exit",
onSelect: _file_exit
@@ -1323,6 +1332,13 @@ class Charter extends UIState {
}));
}
function _file_saveas_fnflegacy(_) {
openSubState(new SaveSubstate(Json.stringify(FNFLegacyParser.encode(PlayState.SONG), Options.editorPrettyPrint ? "\t" : null), {
defaultSaveFile: '${__song.toLowerCase().replace(" ", "-")}${__diff.toLowerCase() == "normal" ? "" : '-${__diff.toLowerCase()}'}.json',
}));
}
function _file_saveas_psych(_) {}
function _file_events_save(_) {
#if sys
CoolUtil.safeSaveFile(