1
0
Fork 0
mirror of https://github.com/ninjamuffin99/Funkin.git synced 2024-12-24 14:16:56 +00:00

custom note styles in chart editor

This commit is contained in:
lemz 2024-06-02 02:44:16 +02:00 committed by EliteMasterEric
parent 328e590f92
commit ca69e7b850
3 changed files with 64 additions and 49 deletions

View file

@ -1663,6 +1663,8 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
return currentSongMetadata.playData.characters.instrumental = value;
}
var currentCustomNoteKindStyle:Null<String>;
/**
* HAXEUI COMPONENTS
*/

View file

@ -7,7 +7,11 @@ import flixel.graphics.frames.FlxAtlasFrames;
import flixel.graphics.frames.FlxFrame;
import flixel.graphics.frames.FlxTileFrames;
import flixel.math.FlxPoint;
import funkin.data.animation.AnimationData;
import funkin.data.song.SongData.SongNoteData;
import funkin.data.notestyle.NoteStyleRegistry;
import funkin.play.notes.notestyle.NoteStyle;
import funkin.play.notes.NoteDirection;
/**
* A sprite that can be used to display a note in a chart.
@ -68,68 +72,62 @@ class ChartEditorNoteSprite extends FlxSprite
if (noteFrameCollection == null)
{
initFrameCollection();
buildEmptyFrameCollection();
addNoteStyleFrames(fetchNoteStyle('funkin'));
addNoteStyleFrames(fetchNoteStyle('pixel'));
}
if (noteFrameCollection == null) throw 'ERROR: Could not initialize note sprite animations.';
this.frames = noteFrameCollection;
// Initialize all the animations, not just the one we're going to use immediately,
// so that later we can reuse the sprite without having to initialize more animations during scrolling.
this.animation.addByPrefix('tapLeftFunkin', 'purple instance');
this.animation.addByPrefix('tapDownFunkin', 'blue instance');
this.animation.addByPrefix('tapUpFunkin', 'green instance');
this.animation.addByPrefix('tapRightFunkin', 'red instance');
this.animation.addByPrefix('holdLeftFunkin', 'LeftHoldPiece');
this.animation.addByPrefix('holdDownFunkin', 'DownHoldPiece');
this.animation.addByPrefix('holdUpFunkin', 'UpHoldPiece');
this.animation.addByPrefix('holdRightFunkin', 'RightHoldPiece');
this.animation.addByPrefix('holdEndLeftFunkin', 'LeftHoldEnd');
this.animation.addByPrefix('holdEndDownFunkin', 'DownHoldEnd');
this.animation.addByPrefix('holdEndUpFunkin', 'UpHoldEnd');
this.animation.addByPrefix('holdEndRightFunkin', 'RightHoldEnd');
this.animation.addByPrefix('tapLeftPixel', 'pixel4');
this.animation.addByPrefix('tapDownPixel', 'pixel5');
this.animation.addByPrefix('tapUpPixel', 'pixel6');
this.animation.addByPrefix('tapRightPixel', 'pixel7');
addNoteStyleAnimations(fetchNoteStyle('funkin'));
addNoteStyleAnimations(fetchNoteStyle('pixel'));
}
static var noteFrameCollection:Null<FlxFramesCollection> = null;
/**
* We load all the note frames once, then reuse them.
*/
static function initFrameCollection():Void
function fetchNoteStyle(noteStyleId:String):NoteStyle
{
buildEmptyFrameCollection();
if (noteFrameCollection == null) return;
return NoteStyleRegistry.instance.fetchEntry(noteStyleId) ?? NoteStyleRegistry.instance.fetchDefault();
}
// TODO: Automatically iterate over the list of note skins.
@:access(funkin.play.notes.notestyle.NoteStyle)
@:nullSafety(Off)
static function addNoteStyleFrames(noteStyle:NoteStyle):Void
{
var prefix:String = noteStyle.id.toTitleCase();
// Normal notes
var frameCollectionNormal:FlxAtlasFrames = Paths.getSparrowAtlas('NOTE_assets');
for (frame in frameCollectionNormal.frames)
var frameCollection:FlxAtlasFrames = Paths.getSparrowAtlas(noteStyle.getNoteAssetPath(), noteStyle.getNoteAssetLibrary());
for (frame in frameCollection.frames)
{
noteFrameCollection.pushFrame(frame);
// cloning the frame because else
// we will fuck up the frame data used in game
var clonedFrame:FlxFrame = frame.copyTo();
clonedFrame.name = '$prefix${clonedFrame.name}';
noteFrameCollection.pushFrame(clonedFrame);
}
}
// Pixel notes
var graphicPixel = FlxG.bitmap.add(Paths.image('weeb/pixelUI/arrows-pixels', 'week6'), false, null);
if (graphicPixel == null) trace('ERROR: Could not load graphic: ' + Paths.image('weeb/pixelUI/arrows-pixels', 'week6'));
var frameCollectionPixel = FlxTileFrames.fromGraphic(graphicPixel, new FlxPoint(17, 17));
for (i in 0...frameCollectionPixel.frames.length)
{
var frame:Null<FlxFrame> = frameCollectionPixel.frames[i];
if (frame == null) continue;
@:access(funkin.play.notes.notestyle.NoteStyle)
@:nullSafety(Off)
function addNoteStyleAnimations(noteStyle:NoteStyle):Void
{
var prefix:String = noteStyle.id.toTitleCase();
var suffix:String = noteStyle.id.toTitleCase();
frame.name = 'pixel' + i;
noteFrameCollection.pushFrame(frame);
}
var leftData:AnimationData = noteStyle.fetchNoteAnimationData(NoteDirection.LEFT);
this.animation.addByPrefix('tapLeft$suffix', '$prefix${leftData.prefix}', leftData.frameRate, leftData.looped, leftData.flipX, leftData.flipY);
var downData:AnimationData = noteStyle.fetchNoteAnimationData(NoteDirection.DOWN);
this.animation.addByPrefix('tapDown$suffix', '$prefix${downData.prefix}', downData.frameRate, downData.looped, downData.flipX, downData.flipY);
var upData:AnimationData = noteStyle.fetchNoteAnimationData(NoteDirection.UP);
this.animation.addByPrefix('tapUp$suffix', '$prefix${upData.prefix}', upData.frameRate, upData.looped, upData.flipX, upData.flipY);
var rightData:AnimationData = noteStyle.fetchNoteAnimationData(NoteDirection.RIGHT);
this.animation.addByPrefix('tapRight$suffix', '$prefix${rightData.prefix}', rightData.frameRate, rightData.looped, rightData.flipX, rightData.flipY);
}
@:nullSafety(Off)
@ -187,10 +185,20 @@ class ChartEditorNoteSprite extends FlxSprite
function get_noteStyle():String
{
// Fall back to Funkin' if it's not a valid note style.
return if (NOTE_STYLES.contains(this.parentState.currentSongNoteStyle)) this.parentState.currentSongNoteStyle else 'funkin';
if (this.parentState.currentCustomNoteKindStyle != null)
{
return this.parentState.currentCustomNoteKindStyle;
}
if (NOTE_STYLES.contains(this.parentState.currentSongNoteStyle))
{
return this.parentState.currentSongNoteStyle;
}
return 'funkin';
}
@:nullSafety(Off)
public function playNoteAnimation():Void
{
if (this.noteData == null) return;
@ -213,8 +221,8 @@ class ChartEditorNoteSprite extends FlxSprite
}
this.updateHitbox();
// TODO: Make this an attribute of the note skin.
this.antialiasing = (this.parentState.currentSongNoteStyle != 'Pixel');
var bruhStyle:NoteStyle = fetchNoteStyle(this.noteStyle);
this.antialiasing = !bruhStyle._data?.assets?.note?.isPixel ?? true;
}
/**

View file

@ -4,6 +4,8 @@ import haxe.ui.components.DropDown;
import haxe.ui.components.TextField;
import haxe.ui.events.UIEvent;
import funkin.ui.debug.charting.util.ChartEditorDropdowns;
import funkin.play.notes.notestyle.NoteStyle;
import funkin.play.notes.notekind.NoteKindManager;
/**
* The toolbox which allows modifying information like Note Kind.
@ -73,6 +75,9 @@ class ChartEditorNoteDataToolbox extends ChartEditorBaseToolbox
var customKind:Null<String> = event?.target?.text;
chartEditorState.noteKindToPlace = customKind;
var noteStyle:Null<NoteStyle> = NoteKindManager.getNoteStyle(customKind);
chartEditorState.currentCustomNoteKindStyle = noteStyle?.id;
if (chartEditorState.currentEventSelection.length > 0)
{
// Edit the note data of any selected notes.