better events and funkinSave categorization

This commit is contained in:
⍚~Nex
2024-11-15 17:52:19 +01:00
parent 1713e8700d
commit 77b7eebed1
56 changed files with 161 additions and 125 deletions
+1 -1
View File
@@ -8,7 +8,7 @@ import flixel.math.FlxRect;
import flixel.system.FlxAssets.FlxGraphicAsset;
import flixel.util.typeLimit.OneOfTwo;
import flxanimate.animate.FlxAnim.FlxSymbolAnimation;
import funkin.backend.scripting.events.PlayAnimContext;
import funkin.backend.scripting.events.sprite.PlayAnimContext;
import funkin.backend.system.interfaces.IBeatReceiver;
import funkin.backend.system.interfaces.IOffsetCompatible;
import funkin.backend.utils.XMLUtil.AnimData;
+85 -52
View File
@@ -19,38 +19,38 @@ class Script extends FlxBasic implements IFlxDestroyable {
public static function getDefaultVariables(?script:Script):Map<String, Dynamic> {
return [
// Haxe related stuff
"Std" => Std,
"Math" => Math,
"Reflect" => Reflect,
"StringTools" => StringTools,
"Json" => haxe.Json,
"Std" => Std,
"Math" => Math,
"Reflect" => Reflect,
"StringTools" => StringTools,
"Json" => haxe.Json,
// OpenFL & Lime related stuff
"Assets" => openfl.utils.Assets,
"Application" => lime.app.Application,
"Application" => lime.app.Application,
"Main" => funkin.backend.system.Main,
"window" => lime.app.Application.current.window,
// Flixel related stuff
"FlxG" => flixel.FlxG,
"FlxSprite" => flixel.FlxSprite,
"FlxBasic" => flixel.FlxBasic,
"FlxCamera" => flixel.FlxCamera,
"state" => flixel.FlxG.state,
"FlxEase" => flixel.tweens.FlxEase,
"FlxTween" => flixel.tweens.FlxTween,
"FlxSound" => flixel.sound.FlxSound,
"FlxAssets" => flixel.system.FlxAssets,
"FlxMath" => flixel.math.FlxMath,
"FlxGroup" => flixel.group.FlxGroup,
"FlxTypedGroup" => flixel.group.FlxGroup.FlxTypedGroup,
"state" => flixel.FlxG.state,
"FlxG" => flixel.FlxG,
"FlxSprite" => flixel.FlxSprite,
"FlxBasic" => flixel.FlxBasic,
"FlxCamera" => flixel.FlxCamera,
"FlxEase" => flixel.tweens.FlxEase,
"FlxTween" => flixel.tweens.FlxTween,
"FlxSound" => flixel.sound.FlxSound,
"FlxAssets" => flixel.system.FlxAssets,
"FlxMath" => flixel.math.FlxMath,
"FlxGroup" => flixel.group.FlxGroup,
"FlxTypedGroup" => flixel.group.FlxGroup.FlxTypedGroup,
"FlxSpriteGroup" => flixel.group.FlxSpriteGroup,
"FlxTypeText" => flixel.addons.text.FlxTypeText,
"FlxText" => flixel.text.FlxText,
"FlxTimer" => flixel.util.FlxTimer,
"FlxPoint" => CoolUtil.getMacroAbstractClass("flixel.math.FlxPoint"),
"FlxAxes" => CoolUtil.getMacroAbstractClass("flixel.util.FlxAxes"),
"FlxColor" => CoolUtil.getMacroAbstractClass("flixel.util.FlxColor"),
"FlxTypeText" => flixel.addons.text.FlxTypeText,
"FlxText" => flixel.text.FlxText,
"FlxTimer" => flixel.util.FlxTimer,
"FlxPoint" => CoolUtil.getMacroAbstractClass("flixel.math.FlxPoint"),
"FlxAxes" => CoolUtil.getMacroAbstractClass("flixel.util.FlxAxes"),
"FlxColor" => CoolUtil.getMacroAbstractClass("flixel.util.FlxColor"),
// Engine related stuff
"engine" => {
@@ -59,38 +59,38 @@ class Script extends FlxBasic implements IFlxDestroyable {
build: 2675, // 2675 being the last build num before it was removed
name: "Codename Engine"
},
"ModState" => funkin.backend.scripting.ModState,
"ModSubState" => funkin.backend.scripting.ModSubState,
"PlayState" => funkin.game.PlayState,
"GameOverSubstate" => funkin.game.GameOverSubstate,
"ModState" => funkin.backend.scripting.ModState,
"ModSubState" => funkin.backend.scripting.ModSubState,
"PlayState" => funkin.game.PlayState,
"GameOverSubstate" => funkin.game.GameOverSubstate,
"HealthIcon" => funkin.game.HealthIcon,
"HudCamera" => funkin.game.HudCamera,
"Note" => funkin.game.Note,
"Strum" => funkin.game.Strum,
"StrumLine" => funkin.game.StrumLine,
"Character" => funkin.game.Character,
"Boyfriend" => funkin.game.Character, // for compatibility
"PauseSubstate" => funkin.menus.PauseSubState,
"FreeplayState" => funkin.menus.FreeplayState,
"MainMenuState" => funkin.menus.MainMenuState,
"PauseSubState" => funkin.menus.PauseSubState,
"HudCamera" => funkin.game.HudCamera,
"Note" => funkin.game.Note,
"Strum" => funkin.game.Strum,
"StrumLine" => funkin.game.StrumLine,
"Character" => funkin.game.Character,
"Boyfriend" => funkin.game.Character, // for compatibility
"PauseSubstate" => funkin.menus.PauseSubState,
"FreeplayState" => funkin.menus.FreeplayState,
"MainMenuState" => funkin.menus.MainMenuState,
"PauseSubState" => funkin.menus.PauseSubState,
"StoryMenuState" => funkin.menus.StoryMenuState,
"TitleState" => funkin.menus.TitleState,
"Options" => funkin.options.Options,
"Paths" => funkin.backend.assets.Paths,
"Conductor" => funkin.backend.system.Conductor,
"FunkinShader" => funkin.backend.shaders.FunkinShader,
"CustomShader" => funkin.backend.shaders.CustomShader,
"Options" => funkin.options.Options,
"Paths" => funkin.backend.assets.Paths,
"Conductor" => funkin.backend.system.Conductor,
"FunkinShader" => funkin.backend.shaders.FunkinShader,
"CustomShader" => funkin.backend.shaders.CustomShader,
"FunkinText" => funkin.backend.FunkinText,
"FlxAnimate" => funkin.backend.FlxAnimate,
"FunkinSprite" => funkin.backend.FunkinSprite,
"Alphabet" => funkin.menus.ui.Alphabet,
"Alphabet" => funkin.menus.ui.Alphabet,
"CoolUtil" => funkin.backend.utils.CoolUtil,
"IniUtil" => funkin.backend.utils.IniUtil,
"XMLUtil" => funkin.backend.utils.XMLUtil,
#if sys "ZipUtil" => funkin.backend.utils.ZipUtil, #end
"MarkdownUtil" => funkin.backend.utils.MarkdownUtil,
"CoolUtil" => funkin.backend.utils.CoolUtil,
"IniUtil" => funkin.backend.utils.IniUtil,
"XMLUtil" => funkin.backend.utils.XMLUtil,
#if sys "ZipUtil" => funkin.backend.utils.ZipUtil, #end
"MarkdownUtil" => funkin.backend.utils.MarkdownUtil,
"EngineUtil" => funkin.backend.utils.EngineUtil,
"MemoryUtil" => funkin.backend.utils.MemoryUtil,
"BitmapUtil" => funkin.backend.utils.BitmapUtil,
@@ -98,14 +98,47 @@ class Script extends FlxBasic implements IFlxDestroyable {
}
/**
* Used internally to keep backwards compatability with old scripts.
* Used internally to keep backwards compatibility with old scripts.
* This gets set on `hscript.Interp.importRedirects`,
* if you wanna modify it, please edit `hscript.Interp.importRedirects` directly.
**/
public static function getDefaultImportRedirects():Map<String, String> {
return [
"Meow" => "funkin.backend.utils.CoolUtil",
var redirects:Map<String, String> = [
"funkin.savedata.FunkinSave" => "funkin.backend.utils.FunkinSave"
];
final events = "funkin.backend.scripting.events.";
redirects[events + "CharacterNodeEvent"] = events + "character.CharacterNodeEvent";
redirects[events + "CharacterXMLEvent"] = events + "character.CharacterXMLEvent";
redirects[events + "DanceEvent"] = events + "character.DanceEvent";
redirects[events + "DirectionAnimEvent"] = events + "character.DirectionAnimEvent";
redirects[events + "DiscordPresenceUpdateEvent"] = events + "discord.DiscordPresenceUpdateEvent";
redirects[events + "GameOverCreationEvent"] = events + "gameover.GameOverCreationEvent";
redirects[events + "CamMoveEvent"] = events + "gameplay.CamMoveEvent";
redirects[events + "CountdownEvent"] = events + "gameplay.CountdownEvent";
redirects[events + "EventGameEvent"] = events + "gameplay.EventGameEvent";
redirects[events + "GameOverEvent"] = events + "gameplay.GameOverEvent";
redirects[events + "RatingUpdateEvent"] = events + "gameplay.RatingUpdateEvent";
redirects[events + "HealthIconChangeEvent"] = events + "healthicon.HealthIconChangeEvent";
redirects[events + "FreeplayAlphaUpdateEvent"] = events + "menu.freeplay.FreeplayAlphaUpdateEvent";
redirects[events + "FreeplaySongSelectEvent"] = events + "menu.freeplay.FreeplaySongSelectEvent";
redirects[events + "MenuChangeEvent"] = events + "menu.MenuChangeEvent";
redirects[events + "PauseCreationEvent"] = events + "menu.pause.PauseCreationEvent";
redirects[events + "WeekSelectEvent"] = events + "menu.storymenu.WeekSelectEvent";
redirects[events + "InputSystemEvent"] = events + "note.InputSystemEvent";
redirects[events + "NoteCreationEvent"] = events + "note.NoteCreationEvent";
redirects[events + "NoteHitEvent"] = events + "note.NoteHitEvent";
redirects[events + "NoteMissEvent"] = events + "note.NoteMissEvent";
redirects[events + "NoteUpdateEvent"] = events + "note.NoteUpdateEvent";
redirects[events + "SimpleNoteEvent"] = events + "note.SimpleNoteEvent";
redirects[events + "StrumCreationEvent"] = events + "note.StrumCreationEvent";
redirects[events + "SplashShowEvent"] = events + "splash.SplashShowEvent";
redirects[events + "PlayAnimContext"] = events + "sprite.PlayAnimContext";
redirects[events + "PlayAnimEvent"] = events + "sprite.PlayAnimEvent";
redirects[events + "StageNodeEvent"] = events + "stage.StageNodeEvent";
redirects[events + "StageXMLEvent"] = events + "stage.StageXMLEvent";
return redirects;
}
public static function getDefaultPreprocessors():Map<String, Dynamic> {
@@ -5,9 +5,4 @@ final class AmountEvent extends CancellableEvent {
* Amount
*/
public var amount:Null<Int>;
/**
* Shows whether or not psych users complained about this class
*/
public var psychUsersComplained:Bool = true;
}
@@ -1,4 +1,5 @@
package funkin.backend.scripting.events;
final class DrawEvent extends CancellableEvent {
// temp empty for now - Nex
}
@@ -0,0 +1,7 @@
## NOTE
Keep in mind that a certain criteria was used to place events in their corresponding folders which is simply what the events themselves are mostly related to.
For example:
- `GameOverEvent` inside of the `gameplay` folder instead of the `gameover` folder since it gets called in the `PlayState` class (that owns the `gameplay` folder) instead of the `GameOverSubstate` class itself;
- `NoteHitEvent` gets indeed called by the `PlayState` class but it's also used in the `StrumLine` (For those who didn't really know, Strumlines are the Input Notes) class and since the event's name itself starts with the word `Note` it was more accurate to place it in the `note` folder instead of the `gameplay` folder that `PlayState` owns.
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.character;
import funkin.game.Character;
import haxe.xml.Access;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.character;
import funkin.game.Character;
import haxe.xml.Access;
@@ -7,7 +7,7 @@ final class CharacterXMLEvent extends CancellableEvent {
/**
* The character instance
*/
public var character:Character;
public var character:Character;
/**
* The xml
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.character;
final class DanceEvent extends CancellableEvent {
public var danced:Bool;
@@ -1,4 +1,6 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.character;
import funkin.backend.scripting.events.sprite.PlayAnimContext;
final class DirectionAnimEvent extends CancellableEvent {
/**
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.discord;
final class DiscordPresenceUpdateEvent extends CancellableEvent {
/**
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.gameover;
/**
* CANCEL this event to prevent default behaviour!
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.gameplay;
import flixel.math.FlxPoint;
import funkin.game.StrumLine;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.gameplay;
import flixel.sound.FlxSound;
import flixel.tweens.FlxTween;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.gameplay;
import funkin.backend.chart.ChartData;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.gameplay;
import funkin.game.Character;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.gameplay;
final class RatingUpdateEvent extends CancellableEvent {
/**
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.healthicon;
final class HealthIconChangeEvent extends CancellableEvent {
/**
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.menu;
final class MenuChangeEvent extends CancellableEvent {
/**
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.menu.freeplay;
final class FreeplayAlphaUpdateEvent extends CancellableEvent {
/**
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.menu.freeplay;
final class FreeplaySongSelectEvent extends CancellableEvent {
/**
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.menu.pause;
/**
* CANCEL this event to prevent default behaviour!
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.menu.storymenu;
import funkin.menus.StoryMenuState.WeekData;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.note;
import funkin.game.StrumLine;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.note;
import funkin.game.Note;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.note;
import funkin.game.Character;
import funkin.game.Note;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.note;
import funkin.game.Character;
import funkin.game.Note;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.note;
import funkin.game.Note;
import funkin.game.Strum;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.note;
import funkin.game.Note;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.note;
import funkin.game.Strum;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events.soundTray;
package funkin.backend.scripting.events.soundtray;
final class SoundTrayShowEvent extends CancellableEvent
{
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events.soundTray;
package funkin.backend.scripting.events.soundtray;
final class SoundTrayTextEvent extends CancellableEvent
{
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.splash;
import funkin.game.SplashGroup;
import funkin.game.Strum;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.sprite;
/**
Contains all contexts possible for `PlayAnimEvent`.
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.sprite;
final class PlayAnimEvent extends CancellableEvent {
/**
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.stage;
import funkin.game.Stage;
import haxe.xml.Access;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.stage;
import funkin.game.Stage;
import haxe.xml.Access;
+1 -1
View File
@@ -142,7 +142,7 @@ class Main extends Sprite
Assets.registerLibrary('default', lib);
funkin.options.PlayerSettings.init();
funkin.savedata.FunkinSave.init();
funkin.backend.utils.FunkinSave.init();
Options.load();
FlxG.fixedTimestep = false;
@@ -83,7 +83,7 @@ class GitHub {
* @param onError Error Callback
* @return Members List
*/
public static function getOrganizationMembers(org:String, ?onError:Exception->Void):Array<GitHubContributor> {
public static function getOrganizationMembers(org:String, ?onError:Exception->Void):Array<GitHubContributor> {
#if GITHUB_API
try {
var data = Json.parse(HttpUtil.requestText('https://api.github.com/orgs/$org/members'));
@@ -106,7 +106,7 @@ class GitHub {
* @param onError Error Callback
* @return User/Organization
*/
public static function getUser(user:String, ?onError:Exception->Void):GitHubUser {
public static function getUser(user:String, ?onError:Exception->Void):GitHubUser {
#if GITHUB_API
try {
var url = 'https://api.github.com/users/$user';
+1 -1
View File
@@ -5,7 +5,7 @@ import flixel.sound.FlxSound;
import flixel.util.typeLimit.OneOfTwo;
import funkin.backend.scripting.*; // lazy
import funkin.backend.scripting.events.CancellableEvent;
import funkin.backend.scripting.events.DiscordPresenceUpdateEvent;
import funkin.backend.scripting.events.discord.*;
import funkin.backend.system.macros.Utils;
import haxe.Json;
import openfl.display.BitmapData;
+113
View File
@@ -0,0 +1,113 @@
package funkin.backend.utils;
import flixel.util.FlxSave;
import lime.app.Application;
import openfl.Lib;
/**
* Class used for saves WITHOUT going through the struggle of type checks
* Just add your save variables the way you would do in the Options.hx file.
* The macro will automatically generate the `flush` and `load` functions.
*/
@:build(funkin.backend.system.macros.FunkinSaveMacro.build("save", "flush", "load"))
class FunkinSave {
public static var highscores:Map<HighscoreEntry, SongScore> = [];
/**
* ONLY OPEN IF YOU WANT TO EDIT FUNCTIONS RELATED TO SAVING, LOADING OR HIGHSCORES.
*/
#if REGION
@:dox(hide) @:doNotSave
private static var __eventAdded = false;
@:doNotSave
public static var save:FlxSave;
public static function init() {
//trace(Application.current.meta.get('save-path'));
//trace(Application.current.meta.get('save-name'));
save = new FlxSave();
save.bind('save-default', #if sys 'YoshiCrafter29/CodenameEngine' #else 'CodenameEngine' #end);
load();
if (!__eventAdded) {
Lib.application.onExit.add(function(i:Int) {
trace("Saving savedata...");
flush();
});
__eventAdded = true;
}
}
/**
* Returns the high-score for a song.
* @param name Song name
* @param diff Song difficulty
* @param changes Changes made to that song in freeplay.
*/
public static inline function getSongHighscore(name:String, diff:String, ?changes:Array<HighscoreChange>) {
if (changes == null) changes = [];
return safeGetHighscore(HSongEntry(name.toLowerCase(), diff.toLowerCase(), changes));
}
public static inline function setSongHighscore(name:String, diff:String, highscore:SongScore, ?changes:Array<HighscoreChange>) {
if (changes == null) changes = [];
if (safeRegisterHighscore(HSongEntry(name.toLowerCase(), diff.toLowerCase(), changes), highscore)) {
flush();
return true;
}
return false;
}
public static inline function getWeekHighscore(name:String, diff:String)
return safeGetHighscore(HWeekEntry(name.toLowerCase(), diff.toLowerCase()));
public static inline function setWeekHighscore(name:String, diff:String, highscore:SongScore) {
if (safeRegisterHighscore(HWeekEntry(name.toLowerCase(), diff.toLowerCase()), highscore)) {
flush();
return true;
}
return false;
}
private static function safeGetHighscore(entry:HighscoreEntry):SongScore {
if (!highscores.exists(entry)) {
return {
score: 0,
accuracy: 0,
misses: 0,
hits: [],
date: null
};
}
return highscores.get(entry);
}
private static function safeRegisterHighscore(entry:HighscoreEntry, highscore:SongScore) {
var oldHigh = safeGetHighscore(entry);
if (oldHigh.date == null || oldHigh.score < highscore.score) {
highscores.set(entry, highscore);
return true;
}
return false;
}
#end
}
enum HighscoreEntry {
HWeekEntry(weekName:String, difficulty:String);
HSongEntry(songName:String, difficulty:String, changes:Array<HighscoreChange>);
}
enum HighscoreChange {
CCoopMode;
COpponentMode;
}
typedef SongScore = {
var score:Int;
var accuracy:Float;
var misses:Int;
var hits:Map<String, Int>;
var date:String;
}