2024-05-31 12:02:28 +00:00
|
|
|
package funkin.play.notes.notekind;
|
|
|
|
|
|
|
|
import funkin.modding.events.ScriptEventDispatcher;
|
|
|
|
import funkin.modding.events.ScriptEvent;
|
|
|
|
import funkin.ui.debug.charting.util.ChartEditorDropdowns;
|
2024-06-01 17:47:45 +00:00
|
|
|
import funkin.data.notestyle.NoteStyleRegistry;
|
|
|
|
import funkin.play.notes.notestyle.NoteStyle;
|
2024-05-31 12:02:28 +00:00
|
|
|
|
2024-05-31 14:55:42 +00:00
|
|
|
class NoteKindManager
|
2024-05-31 12:02:28 +00:00
|
|
|
{
|
2024-05-31 14:55:42 +00:00
|
|
|
static var noteKinds:Map<String, NoteKind> = [];
|
2024-05-31 12:02:28 +00:00
|
|
|
|
|
|
|
public static function loadScripts():Void
|
|
|
|
{
|
2024-05-31 14:55:42 +00:00
|
|
|
var scriptedClassName:Array<String> = ScriptedNoteKind.listScriptClasses();
|
2024-05-31 12:02:28 +00:00
|
|
|
if (scriptedClassName.length > 0)
|
|
|
|
{
|
2024-05-31 15:24:51 +00:00
|
|
|
trace('Instantiating ${scriptedClassName.length} scripted note kind(s)...');
|
2024-05-31 12:02:28 +00:00
|
|
|
for (scriptedClass in scriptedClassName)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2024-05-31 14:55:42 +00:00
|
|
|
var script:NoteKind = ScriptedNoteKind.init(scriptedClass, "unknown");
|
2024-05-31 12:02:28 +00:00
|
|
|
trace(' Initialized scripted note kind: ${script.noteKind}');
|
2024-05-31 14:55:42 +00:00
|
|
|
noteKinds.set(script.noteKind, script);
|
2024-05-31 12:02:28 +00:00
|
|
|
ChartEditorDropdowns.NOTE_KINDS.set(script.noteKind, script.description);
|
|
|
|
}
|
|
|
|
catch (e)
|
|
|
|
{
|
|
|
|
trace(' FAILED to instantiate scripted note kind: ${scriptedClass}');
|
|
|
|
trace(e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-06-01 16:25:46 +00:00
|
|
|
/**
|
|
|
|
* Calls the given event for note kind scripts
|
|
|
|
* @param event The event
|
|
|
|
*/
|
|
|
|
public static function callEvent(event:ScriptEvent):Void
|
2024-05-31 12:02:28 +00:00
|
|
|
{
|
2024-06-01 16:25:46 +00:00
|
|
|
// if it is a note script event,
|
|
|
|
// then only call the event for the specific note kind script
|
|
|
|
if (Std.isOfType(event, NoteScriptEvent))
|
2024-05-31 12:02:28 +00:00
|
|
|
{
|
2024-06-01 16:25:46 +00:00
|
|
|
var noteEvent:NoteScriptEvent = cast(event, NoteScriptEvent);
|
2024-05-31 12:02:28 +00:00
|
|
|
|
2024-06-01 17:47:45 +00:00
|
|
|
var noteKind:NoteKind = noteKinds.get(noteEvent.note.kind);
|
2024-05-31 15:49:25 +00:00
|
|
|
|
2024-06-01 16:25:46 +00:00
|
|
|
if (noteKind != null)
|
|
|
|
{
|
|
|
|
ScriptEventDispatcher.callEvent(noteKind, event);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else // call the event for all note kind scripts
|
2024-05-31 15:49:25 +00:00
|
|
|
{
|
2024-06-01 16:25:46 +00:00
|
|
|
for (noteKind in noteKinds.iterator())
|
|
|
|
{
|
|
|
|
ScriptEventDispatcher.callEvent(noteKind, event);
|
|
|
|
}
|
2024-05-31 15:49:25 +00:00
|
|
|
}
|
|
|
|
}
|
2024-06-01 17:47:45 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Retrieve the note style from the given note kind
|
|
|
|
* @param noteKind note kind name
|
2024-06-11 21:45:08 +00:00
|
|
|
* @param isPixel whether to use pixel style
|
2024-06-01 17:47:45 +00:00
|
|
|
* @return NoteStyle
|
|
|
|
*/
|
2024-06-11 21:45:08 +00:00
|
|
|
public static function getNoteStyle(noteKind:String, isPixel:Bool = false):Null<NoteStyle>
|
2024-06-01 17:47:45 +00:00
|
|
|
{
|
2024-06-11 21:45:08 +00:00
|
|
|
var noteStyleId:Null<String> = getNoteStyleId(noteKind, isPixel);
|
|
|
|
|
|
|
|
if (noteStyleId == null)
|
|
|
|
{
|
|
|
|
return null;
|
|
|
|
}
|
2024-06-01 17:47:45 +00:00
|
|
|
|
|
|
|
return NoteStyleRegistry.instance.fetchEntry(noteStyleId);
|
|
|
|
}
|
2024-06-02 20:11:17 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Retrieve the note style id from the given note kind
|
|
|
|
* @param noteKind note kind name
|
2024-06-11 21:45:08 +00:00
|
|
|
* @param isPixel whether to use pixel style
|
2024-06-02 20:11:17 +00:00
|
|
|
* @return Null<String>
|
|
|
|
*/
|
2024-06-11 21:45:08 +00:00
|
|
|
public static function getNoteStyleId(noteKind:String, isPixel:Bool = false):Null<String>
|
2024-06-02 20:11:17 +00:00
|
|
|
{
|
2024-06-11 21:45:08 +00:00
|
|
|
var noteStyleId:Null<String> = noteKinds.get(noteKind)?.noteStyleId;
|
|
|
|
if (isPixel && noteStyleId != null)
|
|
|
|
{
|
|
|
|
noteStyleId = NoteStyleRegistry.instance.hasEntry('$noteStyleId-pixel') ? '$noteStyleId-pixel' : noteStyleId;
|
|
|
|
}
|
|
|
|
|
|
|
|
return noteStyleId;
|
2024-06-02 20:11:17 +00:00
|
|
|
}
|
2024-05-31 12:02:28 +00:00
|
|
|
}
|