Merge branch 'main' into new-big-chungus
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
+94
-6
@@ -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,88 @@ 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: // do nothing
|
||||
}
|
||||
|
||||
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 +201,14 @@ 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 ?events:Array<Dynamic>;
|
||||
|
||||
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 +221,12 @@ typedef SwagSection =
|
||||
{
|
||||
var sectionNotes:Array<Dynamic>;
|
||||
var lengthInSteps:Int;
|
||||
var ?sectionBeats:Float;
|
||||
var ?typeOfSection:Int;
|
||||
var mustHitSection:Bool;
|
||||
var ?gfSection:Bool;
|
||||
var bpm:Float;
|
||||
var changeBPM:Bool;
|
||||
var altAnim:Null<Bool>;
|
||||
@:optional var camTarget:Null<Float>;
|
||||
var ?camTarget:Null<Float>;
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
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 (section in base.notes)
|
||||
section.sectionBeats = Conductor.beatsPerMeasure;
|
||||
|
||||
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};
|
||||
}
|
||||
}
|
||||
@@ -36,9 +36,13 @@ class DebugOptionsScreen extends OptionsScreen {
|
||||
}));
|
||||
#end
|
||||
add(new Checkbox(
|
||||
"Enable Editor SFXs",
|
||||
"Editor SFXs",
|
||||
"If checked, will play sound effects when working on editors (ex: will play sfxs when checking checkboxes...)",
|
||||
"editorSFX"));
|
||||
add(new Checkbox(
|
||||
"Pretty Print",
|
||||
"If checked, the saved files from the editor will be formatted to be easily viewable (does not apply to xmls...)",
|
||||
"editorPrettyPrint"));
|
||||
add(new Checkbox(
|
||||
"Intensive Blur",
|
||||
"If checked, will use more intensive blur that may be laggier but look better.",
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package funkin.editors.charter;
|
||||
// ! FUCK YOU CHUF (your biggest fan -lunar) <3
|
||||
|
||||
import flixel.input.FlxPointer;
|
||||
import openfl.geom.Point;
|
||||
import openfl.geom.Rectangle;
|
||||
import flixel.graphics.FlxGraphic;
|
||||
@@ -85,6 +87,7 @@ class Charter extends UIState {
|
||||
public var uiCamera:FlxCamera;
|
||||
public var selectionBox:UISliceSprite;
|
||||
public var autoSaveNotif:CharterAutoSaveUI;
|
||||
public static var autoSaveTimer:Float = 0;
|
||||
|
||||
public static var selection:Selection;
|
||||
|
||||
@@ -161,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
|
||||
@@ -491,6 +503,14 @@ class Charter extends UIState {
|
||||
}
|
||||
updateDisplaySprites();
|
||||
|
||||
// ! IF YOU EVER WANNA VIEW IN THE FUTURE, JUST USE A FLXSPRITE :D -lunar
|
||||
/*var dataDisplay:FlxSprite = new FlxSprite().loadGraphic(waveformHandler.waveDatas.get("Voices.ogg"));
|
||||
dataDisplay.scrollFactor.set(1, 0);
|
||||
dataDisplay.scale.set(2, 2);
|
||||
dataDisplay.updateHitbox();
|
||||
dataDisplay.screenCenter(Y);
|
||||
dataDisplay.cameras = [charterCamera]; dataDisplay.x = -dataDisplay.width; add(dataDisplay);*/
|
||||
|
||||
DiscordUtil.call("onEditorLoaded", ["Chart Editor", __song + " (" + __diff + ")"]);
|
||||
}
|
||||
|
||||
@@ -568,8 +588,10 @@ class Charter extends UIState {
|
||||
buildNoteTypesUI();
|
||||
refreshBPMSensitive();
|
||||
|
||||
// Undo Stuffs :D
|
||||
__relinkUndos();
|
||||
// Just for now until i add event stacking -lunar
|
||||
try {__relinkUndos();}
|
||||
catch (e) {Logs.trace('Failed to relink undos: ${Std.string(e)}', ERROR);}
|
||||
|
||||
__applyPlaytestInfo();
|
||||
}
|
||||
|
||||
@@ -669,7 +691,6 @@ class Charter extends UIState {
|
||||
for(s in selection) s.selected = true;
|
||||
}
|
||||
|
||||
public static var autoSaveTimer:Float = 0;
|
||||
var __autoSaveLocation:String = null;
|
||||
public function updateAutoSaving(elapsed:Float) {
|
||||
if (!Options.charterAutoSaves) return;
|
||||
@@ -683,7 +704,6 @@ class Charter extends UIState {
|
||||
'Saved chart at $__autoSaveLocation.json!'
|
||||
);
|
||||
}
|
||||
|
||||
if (autoSaveTimer <= 0) {
|
||||
autoSaveTimer = Options.charterAutoSaveTime;
|
||||
if (!autoSaveNotif.cancelled) {
|
||||
@@ -691,9 +711,9 @@ class Charter extends UIState {
|
||||
var songPath:String = '${Paths.getAssetsRoot()}/songs/${__song.toLowerCase()}';
|
||||
|
||||
if (Options.charterAutoSavesSeperateFolder)
|
||||
Chart.save(songPath, PlayState.SONG, __autoSaveLocation, {saveMetaInChart: false, folder: "autosaves"});
|
||||
Chart.save(songPath, PlayState.SONG, __autoSaveLocation, {saveMetaInChart: false, folder: "autosaves", prettyPrint: Options.editorPrettyPrint});
|
||||
else
|
||||
Chart.save(songPath, PlayState.SONG, __diff.toLowerCase(), {saveMetaInChart: false});
|
||||
Chart.save(songPath, PlayState.SONG, __diff.toLowerCase(), {saveMetaInChart: false, prettyPrint: Options.editorPrettyPrint});
|
||||
undos.save();
|
||||
}
|
||||
autoSaveNotif.cancelled = false;
|
||||
@@ -808,7 +828,7 @@ class Charter extends UIState {
|
||||
FlxG.mouse.getWorldPosition(charterCamera, dragStartPos);
|
||||
else if (FlxG.mouse.justPressedRight) {
|
||||
closeCurrentContextMenu();
|
||||
gridActionType = DELTE_SELECTION;
|
||||
gridActionType = DELETE_SELECTION;
|
||||
}
|
||||
|
||||
if (gridBackdropDummy.hovered) {
|
||||
@@ -888,7 +908,7 @@ class Charter extends UIState {
|
||||
gridActionType = NONE;
|
||||
currentCursor = ARROW;
|
||||
}
|
||||
case DELTE_SELECTION:
|
||||
case DELETE_SELECTION:
|
||||
notesGroup.forEach(function(n) {
|
||||
if (n.hovered || n.sustainDraggable) {
|
||||
deletedNotes.push(n);
|
||||
@@ -1275,7 +1295,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();
|
||||
@@ -1291,7 +1311,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();
|
||||
@@ -1314,11 +1334,23 @@ class Charter extends UIState {
|
||||
}));
|
||||
}
|
||||
|
||||
function _file_saveas_fnflegacy(_) {
|
||||
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_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(_);
|
||||
@@ -1327,7 +1359,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
|
||||
@@ -1336,7 +1368,7 @@ class Charter extends UIState {
|
||||
#if sys
|
||||
function saveTo(path:String, separateEvents:Bool = false) {
|
||||
buildChart();
|
||||
Chart.save(path, PlayState.SONG, __diff.toLowerCase(), {saveMetaInChart: false, saveEventsInChart: !separateEvents});
|
||||
Chart.save(path, PlayState.SONG, __diff.toLowerCase(), {saveMetaInChart: false, saveEventsInChart: !separateEvents, prettyPrint: Options.editorPrettyPrint});
|
||||
}
|
||||
#end
|
||||
|
||||
@@ -1962,7 +1994,7 @@ enum abstract CharterGridActionType(Int) {
|
||||
var NOTE_DRAG = 2;
|
||||
var INVALID_DRAG = 3;
|
||||
var SUSTAIN_DRAG = 4;
|
||||
var DELTE_SELECTION = 5;
|
||||
var DELETE_SELECTION = 5;
|
||||
}
|
||||
|
||||
typedef PlaytestInfo = {
|
||||
|
||||
@@ -45,15 +45,16 @@ class CharterAutoSaveUI extends UISliceSprite {
|
||||
|
||||
icon.animation.curAnim.curFrame = 2;
|
||||
(new FlxTimer()).start(1, (_) -> {disappearAnimation(true);});
|
||||
autosavingText.text += "(Canceled!)"; cancelButton.visible = false;
|
||||
for (member in [this, autosavingText]) member.color = 0xFFB62C2C;
|
||||
for (member in [progressBar, progressBarBack]) member.color = 0xFFE53D3D;
|
||||
autosavingText.text += " (Canceled)!"; cancelButton.visible = false;
|
||||
for (member in [this, autosavingText]) member.color = 0xFFE67F7F;
|
||||
for (member in [progressBar, progressBarBack]) member.color = 0xFFE67F7F;
|
||||
}, 24, 14);
|
||||
cancelButton.frames = Paths.getFrames("editors/ui/grayscale-button");
|
||||
cancelButton.color = 0xFFAC3D3D; cancelButton.alpha = 0.2;
|
||||
members.push(cancelButton);
|
||||
members.push(cancelButton); cancelButton.visible = false;
|
||||
|
||||
cancelIcon = new FlxSprite(x-(10+16), y+8).loadGraphic(Paths.image("editors/autosave-delete"));
|
||||
cancelIcon.color = 0xFFD60E0E;
|
||||
members.push(cancelIcon);
|
||||
|
||||
alpha = 0;
|
||||
|
||||
@@ -1,22 +1,57 @@
|
||||
package funkin.editors.charter;
|
||||
|
||||
class CharterDeleteAnim extends CharterNote {
|
||||
public var garbageIcon:FlxSprite;
|
||||
public var garbageCircle:FlxSprite;
|
||||
|
||||
public var deleteNotes:Array<{note:CharterNote, time:Float}> = [];
|
||||
public var deleteTime:Float = .4;
|
||||
|
||||
public function new() {
|
||||
super();
|
||||
|
||||
sustainSpr.color = 0xFF6D2425; color = 0xFF797171;
|
||||
sustainSpr.color = 0xFF630000; color = 0xFF605A5A;
|
||||
snappedToStrumline = selectable = autoAlpha = false;
|
||||
@:privateAccess __animSpeed = 1.25;
|
||||
|
||||
garbageIcon = new FlxSprite().loadGraphic(Paths.image("editors/deleter"));
|
||||
garbageIcon.color = 0xFF880000;
|
||||
garbageIcon.cameras = [Charter.instance.uiCamera];
|
||||
|
||||
garbageCircle = new FlxSprite().loadGraphic(Paths.image("editors/deleter circle"));
|
||||
garbageCircle.color = 0xFF880000; garbageCircle.alpha = .6;
|
||||
garbageCircle.cameras = [Charter.instance.uiCamera];
|
||||
}
|
||||
|
||||
var __garbageAlpha:Float = 0;
|
||||
var __deletionTimer:Float = .1;
|
||||
@:noCompletion var __mousePos:FlxPoint = FlxPoint.get();
|
||||
public override function update(elapsed:Float) {
|
||||
for (deleteData in deleteNotes) {
|
||||
deleteData.time -= elapsed;
|
||||
if (deleteData.time < 0) deleteNotes.remove(deleteData);
|
||||
}
|
||||
|
||||
if (FlxG.mouse.justPressedRight) __deletionTimer = .1;
|
||||
__deletionTimer -= elapsed;
|
||||
|
||||
__garbageAlpha = FlxMath.lerp(__garbageAlpha, FlxG.mouse.pressedRight && __deletionTimer <= 0 ? 1 : 0, 1/10);
|
||||
|
||||
FlxG.mouse.getWorldPosition(Charter.instance.uiCamera, __mousePos);
|
||||
if (FlxG.mouse.pressedRight && __deletionTimer <= 0) {
|
||||
garbageIcon.setPosition(
|
||||
__mousePos.x + garbageIcon.width/2 + (.65*FlxG.random.float(-1, 1)) + 2,
|
||||
__mousePos.y - garbageIcon.height + (.65*FlxG.random.float(-1, 1)) - 8
|
||||
);
|
||||
|
||||
garbageCircle.setPosition(
|
||||
__mousePos.x - garbageCircle.width/2,
|
||||
(__mousePos.y - garbageCircle.height/2) + 2
|
||||
);
|
||||
}
|
||||
|
||||
garbageIcon.alpha = __garbageAlpha;
|
||||
garbageCircle.alpha = __garbageAlpha*.6;
|
||||
}
|
||||
|
||||
public override function draw() @:privateAccess {
|
||||
@@ -39,5 +74,13 @@ class CharterDeleteAnim extends CharterNote {
|
||||
|
||||
super.draw();
|
||||
}
|
||||
|
||||
if (garbageIcon.alpha > 0) garbageIcon.draw();
|
||||
if (garbageCircle.alpha > 0) garbageCircle.draw();
|
||||
}
|
||||
|
||||
public override function destroy() {
|
||||
super.destroy();
|
||||
__mousePos.put();
|
||||
}
|
||||
}
|
||||
@@ -112,7 +112,7 @@ class CharterStrumlineScreen extends UISubstateWindow {
|
||||
|
||||
var strOffset:Float = strumLine.strumLinePos == null ? (strumLine.type == 1 ? 0.75 : 0.25) : strumLine.strumLinePos;
|
||||
|
||||
var startingPos:FlxPoint = strumLine.strumLinePos == null ?
|
||||
var startingPos:FlxPoint = strumLine.strumPos == null ?
|
||||
FlxPoint.get(strOffset, 50) :
|
||||
FlxPoint.get(strOffset, strumLine.strumPos[1]);
|
||||
|
||||
|
||||
@@ -60,10 +60,6 @@ class CharterWaveformHandler extends FlxBasic {
|
||||
|
||||
waveDatas.set(name, waveData);
|
||||
return waveData;
|
||||
|
||||
// ! IF YOU EVER WANNA VIEW IN THE FUTURE, JUST USE A FLXSPRITE :D -lunar
|
||||
// var dataDisplay:FlxSprite = new FlxSprite().loadGraphic(waveformHandler.waveDatas.get("Voices.ogg"));
|
||||
// dataDisplay.cameras = [charterCamera]; dataDisplay.x = -dataDisplay.width; add(dataDisplay);
|
||||
}
|
||||
|
||||
public function generateShader(name:String, sound:FlxSound):CustomShader {
|
||||
|
||||
@@ -759,7 +759,7 @@ class PlayState extends MusicBeatState
|
||||
SaveWarning.warningFunc = saveWarn;
|
||||
SaveWarning.saveFunc = () -> {
|
||||
@:privateAccess Chart.save('${Paths.getAssetsRoot()}/songs/${Charter.__song.toLowerCase()}',
|
||||
PlayState.SONG, Charter.__diff.toLowerCase(), {saveMetaInChart: false, saveEventsInChart: true});
|
||||
PlayState.SONG, Charter.__diff.toLowerCase(), {saveMetaInChart: false, saveEventsInChart: true, prettyPrint: Options.editorPrettyPrint});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ class Options
|
||||
*/
|
||||
public static var intensiveBlur:Bool = true;
|
||||
public static var editorSFX:Bool = true;
|
||||
public static var resizableEditors:Bool = true;
|
||||
public static var editorPrettyPrint:Bool = false;
|
||||
public static var maxUndos:Int = 120;
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user