Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEATURE] Registry Macro #3694

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions source/funkin/data/DefaultRegistryImpl.hx
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package funkin.data;

@:autoBuild(funkin.util.macro.RegistryMacro.buildRegistry())
interface DefaultRegistryImpl {}
6 changes: 5 additions & 1 deletion source/funkin/data/IRegistryEntry.hx
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package funkin.data;

@:autoBuild(funkin.util.macro.RegistryMacro.buildEntry())
interface DefaultEntryImpl {}

/**
* An interface defining the necessary functions for a registry entry.
* A `String->Void` constructor is also mandatory, but enforced elsewhere.
* @param T The JSON data type of the registry entry.
*/
interface IRegistryEntry<T>
@:funkinBase
interface IRegistryEntry<T> extends DefaultEntryImpl
{
public final id:String;

Expand Down
69 changes: 2 additions & 67 deletions source/funkin/data/dialogue/conversation/ConversationRegistry.hx
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@ package funkin.data.dialogue.conversation;

import funkin.play.cutscene.dialogue.Conversation;
import funkin.play.cutscene.dialogue.ScriptedConversation;
import funkin.data.DefaultRegistryImpl;

class ConversationRegistry extends BaseRegistry<Conversation, ConversationData>
class ConversationRegistry extends BaseRegistry<Conversation, ConversationData> implements DefaultRegistryImpl
{
/**
* The current version string for the dialogue box data format.
Expand All @@ -14,74 +15,8 @@ class ConversationRegistry extends BaseRegistry<Conversation, ConversationData>

public static final CONVERSATION_DATA_VERSION_RULE:thx.semver.VersionRule = "1.0.x";

public static var instance(get, never):ConversationRegistry;
static var _instance:Null<ConversationRegistry> = null;

static function get_instance():ConversationRegistry
{
if (_instance == null) _instance = new ConversationRegistry();
return _instance;
}

public function new()
{
super('CONVERSATION', 'dialogue/conversations', CONVERSATION_DATA_VERSION_RULE);
}

/**
* Read, parse, and validate the JSON data and produce the corresponding data object.
*/
public function parseEntryData(id:String):Null<ConversationData>
{
// JsonParser does not take type parameters,
// otherwise this function would be in BaseRegistry.
var parser = new json2object.JsonParser<ConversationData>();
parser.ignoreUnknownVariables = false;

switch (loadEntryFile(id))
{
case {fileName: fileName, contents: contents}:
parser.fromJson(contents, fileName);
default:
return null;
}

if (parser.errors.length > 0)
{
printErrors(parser.errors, id);
return null;
}
return parser.value;
}

/**
* Parse and validate the JSON data and produce the corresponding data object.
*
* NOTE: Must be implemented on the implementation class.
* @param contents The JSON as a string.
* @param fileName An optional file name for error reporting.
*/
public function parseEntryDataRaw(contents:String, ?fileName:String):Null<ConversationData>
{
var parser = new json2object.JsonParser<ConversationData>();
parser.ignoreUnknownVariables = false;
parser.fromJson(contents, fileName);

if (parser.errors.length > 0)
{
printErrors(parser.errors, fileName);
return null;
}
return parser.value;
}

function createScriptedEntry(clsName:String):Conversation
{
return ScriptedConversation.init(clsName, "unknown");
}

function getScriptedClassNames():Array<String>
{
return ScriptedConversation.listScriptClasses();
}
}
69 changes: 2 additions & 67 deletions source/funkin/data/dialogue/dialoguebox/DialogueBoxRegistry.hx
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ package funkin.data.dialogue.dialoguebox;
import funkin.play.cutscene.dialogue.DialogueBox;
import funkin.data.dialogue.dialoguebox.DialogueBoxData;
import funkin.play.cutscene.dialogue.ScriptedDialogueBox;
import funkin.data.DefaultRegistryImpl;

class DialogueBoxRegistry extends BaseRegistry<DialogueBox, DialogueBoxData>
class DialogueBoxRegistry extends BaseRegistry<DialogueBox, DialogueBoxData> implements DefaultRegistryImpl
{
/**
* The current version string for the dialogue box data format.
Expand All @@ -15,74 +16,8 @@ class DialogueBoxRegistry extends BaseRegistry<DialogueBox, DialogueBoxData>

public static final DIALOGUEBOX_DATA_VERSION_RULE:thx.semver.VersionRule = "1.1.x";

public static var instance(get, never):DialogueBoxRegistry;
static var _instance:Null<DialogueBoxRegistry> = null;

static function get_instance():DialogueBoxRegistry
{
if (_instance == null) _instance = new DialogueBoxRegistry();
return _instance;
}

public function new()
{
super('DIALOGUEBOX', 'dialogue/boxes', DIALOGUEBOX_DATA_VERSION_RULE);
}

/**
* Read, parse, and validate the JSON data and produce the corresponding data object.
*/
public function parseEntryData(id:String):Null<DialogueBoxData>
{
// JsonParser does not take type parameters,
// otherwise this function would be in BaseRegistry.
var parser = new json2object.JsonParser<DialogueBoxData>();
parser.ignoreUnknownVariables = false;

switch (loadEntryFile(id))
{
case {fileName: fileName, contents: contents}:
parser.fromJson(contents, fileName);
default:
return null;
}

if (parser.errors.length > 0)
{
printErrors(parser.errors, id);
return null;
}
return parser.value;
}

/**
* Parse and validate the JSON data and produce the corresponding data object.
*
* NOTE: Must be implemented on the implementation class.
* @param contents The JSON as a string.
* @param fileName An optional file name for error reporting.
*/
public function parseEntryDataRaw(contents:String, ?fileName:String):Null<DialogueBoxData>
{
var parser = new json2object.JsonParser<DialogueBoxData>();
parser.ignoreUnknownVariables = false;
parser.fromJson(contents, fileName);

if (parser.errors.length > 0)
{
printErrors(parser.errors, fileName);
return null;
}
return parser.value;
}

function createScriptedEntry(clsName:String):DialogueBox
{
return ScriptedDialogueBox.init(clsName, "unknown");
}

function getScriptedClassNames():Array<String>
{
return ScriptedDialogueBox.listScriptClasses();
}
}
69 changes: 2 additions & 67 deletions source/funkin/data/dialogue/speaker/SpeakerRegistry.hx
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ package funkin.data.dialogue.speaker;
import funkin.play.cutscene.dialogue.Speaker;
import funkin.data.dialogue.speaker.SpeakerData;
import funkin.play.cutscene.dialogue.ScriptedSpeaker;
import funkin.data.DefaultRegistryImpl;

class SpeakerRegistry extends BaseRegistry<Speaker, SpeakerData>
class SpeakerRegistry extends BaseRegistry<Speaker, SpeakerData> implements DefaultRegistryImpl
{
/**
* The current version string for the speaker data format.
Expand All @@ -15,74 +16,8 @@ class SpeakerRegistry extends BaseRegistry<Speaker, SpeakerData>

public static final SPEAKER_DATA_VERSION_RULE:thx.semver.VersionRule = "1.0.x";

public static var instance(get, never):SpeakerRegistry;
static var _instance:Null<SpeakerRegistry> = null;

static function get_instance():SpeakerRegistry
{
if (_instance == null) _instance = new SpeakerRegistry();
return _instance;
}

public function new()
{
super('SPEAKER', 'dialogue/speakers', SPEAKER_DATA_VERSION_RULE);
}

/**
* Read, parse, and validate the JSON data and produce the corresponding data object.
*/
public function parseEntryData(id:String):Null<SpeakerData>
{
// JsonParser does not take type parameters,
// otherwise this function would be in BaseRegistry.
var parser = new json2object.JsonParser<SpeakerData>();
parser.ignoreUnknownVariables = false;

switch (loadEntryFile(id))
{
case {fileName: fileName, contents: contents}:
parser.fromJson(contents, fileName);
default:
return null;
}

if (parser.errors.length > 0)
{
printErrors(parser.errors, id);
return null;
}
return parser.value;
}

/**
* Parse and validate the JSON data and produce the corresponding data object.
*
* NOTE: Must be implemented on the implementation class.
* @param contents The JSON as a string.
* @param fileName An optional file name for error reporting.
*/
public function parseEntryDataRaw(contents:String, ?fileName:String):Null<SpeakerData>
{
var parser = new json2object.JsonParser<SpeakerData>();
parser.ignoreUnknownVariables = false;
parser.fromJson(contents, fileName);

if (parser.errors.length > 0)
{
printErrors(parser.errors, fileName);
return null;
}
return parser.value;
}

function createScriptedEntry(clsName:String):Speaker
{
return ScriptedSpeaker.init(clsName, "unknown");
}

function getScriptedClassNames():Array<String>
{
return ScriptedSpeaker.listScriptClasses();
}
}
65 changes: 2 additions & 63 deletions source/funkin/data/freeplay/album/AlbumRegistry.hx
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ package funkin.data.freeplay.album;
import funkin.ui.freeplay.Album;
import funkin.data.freeplay.album.AlbumData;
import funkin.ui.freeplay.ScriptedAlbum;
import funkin.data.DefaultRegistryImpl;

class AlbumRegistry extends BaseRegistry<Album, AlbumData>
class AlbumRegistry extends BaseRegistry<Album, AlbumData> implements DefaultRegistryImpl
{
/**
* The current version string for the album data format.
Expand All @@ -15,70 +16,8 @@ class AlbumRegistry extends BaseRegistry<Album, AlbumData>

public static final ALBUM_DATA_VERSION_RULE:thx.semver.VersionRule = '1.0.x';

public static final instance:AlbumRegistry = new AlbumRegistry();

public function new()
{
super('ALBUM', 'ui/freeplay/albums', ALBUM_DATA_VERSION_RULE);
}

/**
* Read, parse, and validate the JSON data and produce the corresponding data object.
* @param id The ID of the entry to load.
* @return The parsed data object.
*/
public function parseEntryData(id:String):Null<AlbumData>
{
// JsonParser does not take type parameters,
// otherwise this function would be in BaseRegistry.
var parser:json2object.JsonParser<AlbumData> = new json2object.JsonParser<AlbumData>();
parser.ignoreUnknownVariables = false;

switch (loadEntryFile(id))
{
case {fileName: fileName, contents: contents}:
parser.fromJson(contents, fileName);
default:
return null;
}

if (parser.errors.length > 0)
{
printErrors(parser.errors, id);
return null;
}
return parser.value;
}

/**
* Parse and validate the JSON data and produce the corresponding data object.
*
* NOTE: Must be implemented on the implementation class.
* @param contents The JSON as a string.
* @param fileName An optional file name for error reporting.
* @return The parsed data object.
*/
public function parseEntryDataRaw(contents:String, ?fileName:String):Null<AlbumData>
{
var parser:json2object.JsonParser<AlbumData> = new json2object.JsonParser<AlbumData>();
parser.ignoreUnknownVariables = false;
parser.fromJson(contents, fileName);

if (parser.errors.length > 0)
{
printErrors(parser.errors, fileName);
return null;
}
return parser.value;
}

function createScriptedEntry(clsName:String):Album
{
return ScriptedAlbum.init(clsName, 'unknown');
}

function getScriptedClassNames():Array<String>
{
return ScriptedAlbum.listScriptClasses();
}
}
Loading