psych engine exporter

Co-authored-by: Ne_Eo <NeeEoo@users.noreply.github.com>
This commit is contained in:
lunarcleint
2024-03-23 06:34:03 -07:00
co-authored by Ne_Eo
parent 217cade22c
commit bb5ad66313
3 changed files with 102 additions and 9 deletions
@@ -152,9 +152,7 @@ class FNFLegacyParser {
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];
case ADDITIONAL: // do nothing
}
return base;
@@ -205,6 +203,7 @@ typedef SwagSong =
var speed:Float;
var ?stage:String;
var ?noteTypes:Array<String>;
var ?events:Array<Dynamic>;
var player1:String;
var player2:String;
@@ -224,6 +223,7 @@ typedef SwagSection =
var lengthInSteps:Int;
var ?typeOfSection:Int;
var mustHitSection:Bool;
var ?gfSection:Bool;
var bpm:Float;
var changeBPM:Bool;
var altAnim:Null<Bool>;
@@ -0,0 +1,89 @@
package funkin.backend.chart;
import funkin.backend.chart.ChartData.ChartEvent;
import funkin.backend.chart.FNFLegacyParser.SwagSong;
import funkin.backend.system.Conductor;
class PsychParser {
public static function parse(data:Dynamic, result:ChartData)
FNFLegacyParser.parse(data, result);
public static function encode(chart:ChartData):Dynamic {
var base:SwagSong = FNFLegacyParser.__convertToSwagSong(chart);
base.notes = FNFLegacyParser.__convertToSwagSections(chart);
base.stage = chart.stage;
for (strumLine in chart.strumLines)
if (strumLine.type == ADDITIONAL && base.gfVersion == null)
base.gfVersion = strumLine.characters.getDefault(["gf"])[0];
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
chart.noteTypes.getDefault([""])[note.type] // NOTE TYPE
]);
}
base.events = [];
var groupedEvents:Array<Array<ChartEvent>> = [];
var __last:Array<ChartEvent> = null;
var __lastTime:Float = Math.NaN;
for (e in chart.events) {
if (e == null) continue;
if (__last != null && __lastTime == e.time)
__last.push(e);
else {
__last = [e];
__lastTime = e.time;
groupedEvents.push(__last);
}
}
for (events in groupedEvents) {
var psychEvents:Array<Dynamic> = [];
for (event in events)
switch (event.name) {
case "Add Camera Zoom":
psychEvents.push([
event.name,
event.params[1] == "camGame" ? event.params[0] : 0, // CAMERA ZOOM
event.params[1] == "camHUD" ? event.params[0] : 0, // UI ZOOM
]);
case "Play Animation":
psychEvents.push([
event.name,
event.params[1], // ANIMATION TO PLAY
switch (chart.strumLines[event.params[0]].type) { // CHARACTER
case PLAYER: "bf";
case OPPONENT: "dad";
case ADDITIONAL: "gf";
}
]);
case "Scroll Speed Change":
var eventStep:Float = Conductor.getStepForTime(event.time);
psychEvents.push([
"Change Scroll Speed",
event.params[1]/chart.scrollSpeed, // SCROLL SPEED MULTIPLER
Conductor.getTimeForStep(eventStep+event.params[2]) - Conductor.getTimeForStep(eventStep), // TIME
]);
default:
// TODO: allow custom formats in event.json
var split:Float = event.params.length / 2;
var val1:String = [for (arg in 0...Math.ceil(split)) event.params[arg]].join(",");
var val2:String = [for (arg in Math.ceil(split)...event.params.length) event.params[arg]].join(",");
psychEvents.push([event.name, val1, val2]);
}
base.events.push([events[0].time, psychEvents]);
}
return {song: base};
}
}
+10 -6
View File
@@ -1293,7 +1293,7 @@ class Charter extends UIState {
}
function _file_saveas(_) {
openSubState(new SaveSubstate(Json.stringify(Chart.filterChartForSaving(PlayState.SONG, false)), {
openSubState(new SaveSubstate(Json.stringify(Chart.filterChartForSaving(PlayState.SONG, false), null, Options.editorPrettyPrint ? "\t" : null), {
defaultSaveFile: '${__diff.toLowerCase()}.json'
}));
undos.save();
@@ -1309,7 +1309,7 @@ class Charter extends UIState {
}
function _file_saveas_no_events(_) {
openSubState(new SaveSubstate(Json.stringify(Chart.filterChartForSaving(PlayState.SONG, false, false)), {
openSubState(new SaveSubstate(Json.stringify(Chart.filterChartForSaving(PlayState.SONG, false, false), null, Options.editorPrettyPrint ? "\t" : null), {
defaultSaveFile: '${__diff.toLowerCase()}.json'
}));
undos.save();
@@ -1333,17 +1333,21 @@ class Charter extends UIState {
}
function _file_saveas_fnflegacy(_) {
openSubState(new SaveSubstate(Json.stringify(FNFLegacyParser.encode(PlayState.SONG), Options.editorPrettyPrint ? "\t" : null), {
openSubState(new SaveSubstate(Json.stringify(FNFLegacyParser.encode(PlayState.SONG), null, Options.editorPrettyPrint ? "\t" : null), {
defaultSaveFile: '${__song.toLowerCase().replace(" ", "-")}${__diff.toLowerCase() == "normal" ? "" : '-${__diff.toLowerCase()}'}.json',
}));
}
function _file_saveas_psych(_) {
openSubState(new SaveSubstate(Json.stringify(PsychParser.encode(PlayState.SONG), null, 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(
'${Paths.getAssetsRoot()}/songs/${__song.toLowerCase()}/events.json',
Json.stringify({events: PlayState.SONG.events == null ? [] : PlayState.SONG.events})
Json.stringify({events: PlayState.SONG.events == null ? [] : PlayState.SONG.events}, null, Options.editorPrettyPrint ? "\t" : null)
);
#else
_file_events_saveas(_);
@@ -1352,7 +1356,7 @@ class Charter extends UIState {
function _file_events_saveas(_) {
#if sys
openSubState(new SaveSubstate(Json.stringify({events: PlayState.SONG.events == null ? [] : PlayState.SONG.events}), {
openSubState(new SaveSubstate(Json.stringify({events: PlayState.SONG.events == null ? [] : PlayState.SONG.events}, null, Options.editorPrettyPrint ? "\t" : null), {
defaultSaveFile: 'events.json'
}));
#end