What? Constants is evolving into Flags!

Co-Authored-By: Ne_Eo <NeeEoo@users.noreply.github.com>
This commit is contained in:
⍚~Nex
2024-11-15 13:58:35 +01:00
co-authored by Ne_Eo
parent 4a1bc2c147
commit 596cb850cc
43 changed files with 427 additions and 409 deletions
+1 -1
View File
@@ -12,7 +12,7 @@ public var enablePauseMenu = true;
public var isSpooky = false; public var isSpooky = false;
var oldStageQuality = FlxG.game.stage.quality; var oldStageQuality = FlxG.game.stage.quality;
static var daPixelZoom = 6; public var daPixelZoom = PlayState.daPixelZoom;
/** /**
* UI * UI
-139
View File
@@ -1,139 +0,0 @@
package funkin;
import lime.app.Application;
import funkin.backend.system.macros.GitCommitMacro;
import flixel.util.FlxColor;
using StringTools;
@:build(funkin.backend.system.macros.ConstantsMacro.build())
class Constants {
// these arent good since someone could easily change through meta.set() - Nex
// @:lazy public static var WINDOW_TITLE:String = Application.current.meta.get('name');
// @:lazy public static var BUILD_FILENAME:String = Application.current.meta.get('file');
// @:lazy public static var VERSION:String = Application.current.meta.get('version');
public static var COMMIT_NUMBER = GitCommitMacro.commitNumber;
public static var COMMIT_HASH = GitCommitMacro.commitHash;
public static var COMMIT_MESSAGE = 'Commit $COMMIT_NUMBER ($COMMIT_HASH)';
@:lazy public static var VERSION_MESSAGE:String = 'Codename Engine v${Application.current.meta.get('version')}';
public static var REPO_NAME = "CodenameEngine";
public static var REPO_OWNER = "FNF-CNE-Devs";
public static var REPO_URL:String = 'https://github.com/$REPO_OWNER/$REPO_NAME';
// make this empty once you guys are done with the project.
// good luck /gen <3 @crowplexus
public static var RELEASE_CYCLE:String = "Beta";
/**
* Preferred sound extension for the game's audio files.
* Currently is set to `mp3` for web targets, and `ogg` for other targets.
*/
public static var SOUND_EXT = #if web "mp3" #else "ogg" #end;
public static var VIDEO_EXT = "mp4";
public static var IMAGE_EXT = "png";
public static var DISCORD_LOGO_KEY = "icon";
public static var DISCORD_CLIENT_ID = "1027994136193810442";
public static var DISCORD_LOGO_TEXT = "Codename Engine";
public static var DEFAULT_CHARACTER = "bf";
public static var DEFAULT_GIRLFRIEND = "gf";
public static var DEFAULT_OPPONENT = "dad";
public static var DEFAULT_DIFFICULTY = "normal";
public static var DEFAULT_STAGE = "stage";
public static var DEFAULT_SCROLL_SPEED = 2.0;
//public static var DEFAULT_NOTE_TYPE:String = null;
public static var DEFAULT_HEALTH_ICON = "face";
public static var DEFAULT_BPM = 100.0;
public static var DEFAULT_BEATS_PER_MEASURE = 4;
public static var DEFAULT_STEPS_PER_BEAT = 4;
public static var SUPPORTED_CHART_RUNTIME_FORMATS = ["Legacy", "Psych Engine"];
public static var SUPPORTED_CHART_FORMATS = ["BaseGame"];
public static var BASEGAME_SONG_METADATA_VERSION = "2.2.2";
public static var BASEGAME_SONG_CHART_DATA_VERSION = "2.0.0";
public static var BASEGAME_DEFAULT_NOTE_STYLE = 'funkin';
public static var BASEGAME_DEFAULT_ALBUM_ID = 'volume1';
public static var BASEGAME_DEFAULT_PREVIEW_START = 0;
public static var BASEGAME_DEFAULT_PREVIEW_END = 15000;
public static var DEFAULT_COOP_ALLOWED = false;
public static var DEFAULT_OPPONENT_MODE_ALLOWED = false;
public static var DEFAULT_COOP_MODE = false; // used in playstate if it doesnt find it
public static var DEFAULT_OPPONENT_MODE = false;
public static var DEFAULT_NOTE_MS_LIMIT:Float = 1500;
public static var DEFAULT_NOTE_SCALE = 0.7;
/**
* Default background colors for songs without bg color
*/
public static var DEFAULT_COLOR:FlxColor = 0xFF9271FD;
public static var JSON_PRETTY_PRINT = "\t";
public static var UNDO_PREFIX = "* ";
// -- PlayState --
public static var DEFAULT_GAMEOVER_CHARACTER = "bf-dead";
public static var DEFAULT_GAMEOVER_SONG = "gameOver";
public static var DEFAULT_GAMEOVER_LOSS_SFX = "gameOverSFX";
public static var DEFAULT_GAMEOVER_RETRY_SFX = "gameOverEnd";
public static var DEFAULT_CAM_ZOOM_INTERVAL = 4;
public static var DEFAULT_CAM_ZOOM_STRENGTH = 1;
public static var DEFAULT_CAM_ZOOM = 1.05; // what zoom level it defaults to
public static var DEFAULT_HUD_ZOOM = 1.0;
public static var MAX_CAMERA_ZOOM = 1.35;
public static var DEFAULT_PAUSE_ITEMS = ['Resume', 'Restart Song', 'Change Controls', 'Change Options', 'Exit to menu', "Exit to charter"];
public static var DEFAULT_CUTSCENE_PAUSE_ITEMS = ['Resume Cutscene', 'Skip Cutscene', 'Restart Cutscene', 'Exit to menu'];
public static var DEFAULT_GITAROO = true;
public static var GITAROO_CHANCE = 0.1;
public static var DEFAULT_CAN_ACCESS_DEBUG_MENUS = true;
public static var DEFAULT_MUTE_VOCALS_ON_MISS = true;
public static var DEFAULT_MAX_HEALTH = 2.0;
public static var DEFAULT_HEALTH = DEFAULT_MAX_HEALTH / 2.0;
public static var PIXEL_ART_SCALE = 6.0;
public static var DEFAULT_COMBO_GROUP_MAX_SIZE = 25;
public static var DEFAULT_STRUM_AMOUNT = 4;
public static var DEFAULT_CAMERA_FOLLOW_SPEED = 0.04;
public static var ICON_OFFSET = 26;
public static var ICON_LERP = 0.33;
public static var VOCAL_OFFSET_VIOLATION_THRESHOLD = 25;
public static var DEFAULT_CAM_ZOOM_LERP = 0.05;
public static var DEFAULT_HUD_ZOOM_LERP = 0.05;
public static var BOP_ICON_SCALE = 1.2;
public static var CAM_BOP_STRENGTH = 0.015;
public static var HUD_BOP_STRENGTH = 0.03;
public static var MAX_SPLASHES = 8;
public static var STUNNED_TIME = 5 / 60;
// Usage: Codename Credits
public static var MAIN_DEVS_COLOR:FlxColor = 0xFF9C35D5;
public static var MIN_CONTRIBUTIONS_COLOR:FlxColor = 0xFFB4A7DA;
public static var DEFAULT_NOTE_FIELDS:Array<String> = ["time", "id", "type", "sLen"];
}
+13 -13
View File
@@ -27,7 +27,7 @@ class Paths
return library != null ? '$library:assets/$library/$file' : 'assets/$file'; return library != null ? '$library:assets/$library/$file' : 'assets/$file';
public static inline function video(key:String, ?ext:String) public static inline function video(key:String, ?ext:String)
return getPath('videos/$key.${ext != null ? ext : Constants.VIDEO_EXT}'); return getPath('videos/$key.${ext != null ? ext : Flags.VIDEO_EXT}');
public static inline function ndll(key:String) public static inline function ndll(key:String)
return getPath('ndlls/$key.ndll'); return getPath('ndlls/$key.ndll');
@@ -60,32 +60,32 @@ class Paths
return getPath('data/$key.ps1', library); return getPath('data/$key.ps1', library);
static public function sound(key:String, ?library:String, ?ext:String) static public function sound(key:String, ?library:String, ?ext:String)
return getPath('sounds/$key.${ext != null ? ext : Constants.SOUND_EXT}', library); return getPath('sounds/$key.${ext != null ? ext : Flags.SOUND_EXT}', library);
inline static public function soundRandom(key:String, min:Int, max:Int, ?library:String) inline static public function soundRandom(key:String, min:Int, max:Int, ?library:String)
return sound(key + FlxG.random.int(min, max), library); return sound(key + FlxG.random.int(min, max), library);
inline static public function music(key:String, ?library:String, ?ext:String) inline static public function music(key:String, ?library:String, ?ext:String)
return getPath('music/$key.${ext != null ? ext : Constants.SOUND_EXT}', library); return getPath('music/$key.${ext != null ? ext : Flags.SOUND_EXT}', library);
inline static public function voices(song:String, ?difficulty:String, ?prefix:String = "", ?ext:String) { inline static public function voices(song:String, ?difficulty:String, ?prefix:String = "", ?ext:String) {
if (difficulty == null) difficulty = Constants.DEFAULT_DIFFICULTY; if (difficulty == null) difficulty = Flags.DEFAULT_DIFFICULTY;
if (ext == null) ext = Constants.SOUND_EXT; if (ext == null) ext = Flags.SOUND_EXT;
song = song.toLowerCase(); song = song.toLowerCase();
var diff = getPath('songs/$song/song/Voices$prefix-${difficulty.toLowerCase()}.${ext}', null); var diff = getPath('songs/$song/song/Voices$prefix-${difficulty.toLowerCase()}.${ext}', null);
return OpenFlAssets.exists(diff) ? diff : getPath('songs/$song/song/Voices$prefix.${ext}', null); return OpenFlAssets.exists(diff) ? diff : getPath('songs/$song/song/Voices$prefix.${ext}', null);
} }
inline static public function inst(song:String, ?difficulty:String, ?prefix:String = "", ?ext:String) { inline static public function inst(song:String, ?difficulty:String, ?prefix:String = "", ?ext:String) {
if (difficulty == null) difficulty = Constants.DEFAULT_DIFFICULTY; if (difficulty == null) difficulty = Flags.DEFAULT_DIFFICULTY;
if (ext == null) ext = Constants.SOUND_EXT; if (ext == null) ext = Flags.SOUND_EXT;
song = song.toLowerCase(); song = song.toLowerCase();
var diff = getPath('songs/$song/song/Inst$prefix-${difficulty.toLowerCase()}.${ext}', null); var diff = getPath('songs/$song/song/Inst$prefix-${difficulty.toLowerCase()}.${ext}', null);
return OpenFlAssets.exists(diff) ? diff : getPath('songs/$song/song/Inst$prefix.${ext}', null); return OpenFlAssets.exists(diff) ? diff : getPath('songs/$song/song/Inst$prefix.${ext}', null);
} }
static public function image(key:String, ?library:String, checkForAtlas:Bool = false, ?ext:String) { static public function image(key:String, ?library:String, checkForAtlas:Bool = false, ?ext:String) {
if (ext == null) ext = Constants.IMAGE_EXT; if (ext == null) ext = Flags.IMAGE_EXT;
if (checkForAtlas) { if (checkForAtlas) {
var atlasPath = getPath('images/$key/spritemap.$ext', library); var atlasPath = getPath('images/$key/spritemap.$ext', library);
var multiplePath = getPath('images/$key/1.$ext', library); var multiplePath = getPath('images/$key/1.$ext', library);
@@ -112,7 +112,7 @@ class Paths
static public function chart(song:String, ?difficulty:String):String static public function chart(song:String, ?difficulty:String):String
{ {
difficulty = (difficulty != null ? difficulty : Constants.DEFAULT_DIFFICULTY).toLowerCase(); difficulty = (difficulty != null ? difficulty : Flags.DEFAULT_DIFFICULTY).toLowerCase();
song = song.toLowerCase(); song = song.toLowerCase();
return getPath('songs/$song/charts/$difficulty.json', null); return getPath('songs/$song/charts/$difficulty.json', null);
@@ -161,19 +161,19 @@ class Paths
return FlxAtlasFrames.fromSparrow(image(key, library, ext), file('images/$key.xml', library)); return FlxAtlasFrames.fromSparrow(image(key, library, ext), file('images/$key.xml', library));
inline static public function getSparrowAtlasAlt(key:String, ?ext:String) inline static public function getSparrowAtlasAlt(key:String, ?ext:String)
return FlxAtlasFrames.fromSparrow('$key.${ext != null ? ext : Constants.IMAGE_EXT}', '$key.xml'); return FlxAtlasFrames.fromSparrow('$key.${ext != null ? ext : Flags.IMAGE_EXT}', '$key.xml');
inline static public function getPackerAtlas(key:String, ?library:String, ?ext:String) inline static public function getPackerAtlas(key:String, ?library:String, ?ext:String)
return FlxAtlasFrames.fromSpriteSheetPacker(image(key, library, ext), file('images/$key.txt', library)); return FlxAtlasFrames.fromSpriteSheetPacker(image(key, library, ext), file('images/$key.txt', library));
inline static public function getPackerAtlasAlt(key:String, ?ext:String) inline static public function getPackerAtlasAlt(key:String, ?ext:String)
return FlxAtlasFrames.fromSpriteSheetPacker('$key.${ext != null ? ext : Constants.IMAGE_EXT}', '$key.txt'); return FlxAtlasFrames.fromSpriteSheetPacker('$key.${ext != null ? ext : Flags.IMAGE_EXT}', '$key.txt');
inline static public function getAsepriteAtlas(key:String, ?library:String, ?ext:String) inline static public function getAsepriteAtlas(key:String, ?library:String, ?ext:String)
return FlxAtlasFrames.fromAseprite(image(key, library, ext), file('images/$key.json', library)); return FlxAtlasFrames.fromAseprite(image(key, library, ext), file('images/$key.json', library));
inline static public function getAsepriteAtlasAlt(key:String, ?ext:String) inline static public function getAsepriteAtlasAlt(key:String, ?ext:String)
return FlxAtlasFrames.fromAseprite('$key.${ext != null ? ext : Constants.IMAGE_EXT}', '$key.json'); return FlxAtlasFrames.fromAseprite('$key.${ext != null ? ext : Flags.IMAGE_EXT}', '$key.json');
inline static public function getAssetsRoot():String inline static public function getAssetsRoot():String
return ModsFolder.currentModFolder != null ? '${ModsFolder.modsPath}${ModsFolder.currentModFolder}' : './assets'; return ModsFolder.currentModFolder != null ? '${ModsFolder.modsPath}${ModsFolder.currentModFolder}' : './assets';
@@ -205,7 +205,7 @@ class Paths
*/ */
static function loadFrames(path:String, Unique:Bool = false, Key:String = null, SkipAtlasCheck:Bool = false, ?Ext:String = null):FlxFramesCollection { static function loadFrames(path:String, Unique:Bool = false, Key:String = null, SkipAtlasCheck:Bool = false, ?Ext:String = null):FlxFramesCollection {
var noExt = Path.withoutExtension(path); var noExt = Path.withoutExtension(path);
var ext = Ext != null ? Ext : Constants.IMAGE_EXT; var ext = Ext != null ? Ext : Flags.IMAGE_EXT;
if (Assets.exists('$noExt/1.${ext}')) { if (Assets.exists('$noExt/1.${ext}')) {
// MULTIPLE SPRITESHEETS!! // MULTIPLE SPRITESHEETS!!
+10 -10
View File
@@ -17,7 +17,7 @@ class BaseGameParser {
result.customValues.timeChanges = data.timeChanges; result.customValues.timeChanges = data.timeChanges;
var firstTimeChng:SwagTimeChange = data.timeChanges[0]; var firstTimeChng:SwagTimeChange = data.timeChanges[0];
result.bpm = firstTimeChng.bpm; result.bpm = firstTimeChng.bpm;
result.beatsPerMeasure = firstTimeChng.b != null ? firstTimeChng.b : Constants.DEFAULT_BEATS_PER_MEASURE; result.beatsPerMeasure = firstTimeChng.b != null ? firstTimeChng.b : Flags.DEFAULT_BEATS_PER_MEASURE;
result.difficulties = data.playData.difficulties.concat(data.playData.songVariations); result.difficulties = data.playData.difficulties.concat(data.playData.songVariations);
Reflect.deleteField(data.playData, "difficulties"); Reflect.deleteField(data.playData, "difficulties");
@@ -28,8 +28,8 @@ class BaseGameParser {
public static function encodeMeta(meta:ChartMetaData, ?chart:ChartData):SwagMetadata { public static function encodeMeta(meta:ChartMetaData, ?chart:ChartData):SwagMetadata {
var addVars:Dynamic = meta.customValues; var addVars:Dynamic = meta.customValues;
var defStage:String = addVars.stage != null ? addVars.stage : Constants.DEFAULT_STAGE; var defStage:String = addVars.stage != null ? addVars.stage : Flags.DEFAULT_STAGE;
var defChars:SwagCharactersList = addVars.characters != null ? addVars.characters : {player: Constants.DEFAULT_CHARACTER, girlfriend: Constants.DEFAULT_GIRLFRIEND, opponent: Constants.DEFAULT_OPPONENT}; var defChars:SwagCharactersList = addVars.characters != null ? addVars.characters : {player: Flags.DEFAULT_CHARACTER, girlfriend: Flags.DEFAULT_GIRLFRIEND, opponent: Flags.DEFAULT_OPPONENT};
var defTimeCh:Array<SwagTimeChange>; var defTimeCh:Array<SwagTimeChange>;
if (addVars.timeChanges != null && addVars.timeChanges.length > 0) { if (addVars.timeChanges != null && addVars.timeChanges.length > 0) {
@@ -68,16 +68,16 @@ class BaseGameParser {
timeChanges: defTimeCh, timeChanges: defTimeCh,
looped: false, looped: false,
generatedBy: 'Basegame Chart Importer (Codename Engine)', generatedBy: 'Basegame Chart Importer (Codename Engine)',
version: Constants.BASEGAME_SONG_METADATA_VERSION, version: Flags.BASEGAME_SONG_METADATA_VERSION,
playData: { playData: {
stage: defStage, stage: defStage,
characters: defChars, characters: defChars,
songVariations: addVars.songVariations != null ? [for (i in 0...addVars.songVariations.length) {meta.difficulties.remove(addVars.songVariations[i]); addVars.songVariations[i];}] : [], songVariations: addVars.songVariations != null ? [for (i in 0...addVars.songVariations.length) {meta.difficulties.remove(addVars.songVariations[i]); addVars.songVariations[i];}] : [],
difficulties: meta.difficulties, difficulties: meta.difficulties,
noteStyle: addVars.noteStyle != null ? addVars.noteStyle : Constants.BASEGAME_DEFAULT_NOTE_STYLE, noteStyle: addVars.noteStyle != null ? addVars.noteStyle : Flags.BASEGAME_DEFAULT_NOTE_STYLE,
album: addVars.album != null ? addVars.album : Constants.BASEGAME_DEFAULT_ALBUM_ID, album: addVars.album != null ? addVars.album : Flags.BASEGAME_DEFAULT_ALBUM_ID,
previewStart: addVars.previewStart != null ? addVars.previewStart : Constants.BASEGAME_DEFAULT_PREVIEW_START, previewStart: addVars.previewStart != null ? addVars.previewStart : Flags.BASEGAME_DEFAULT_PREVIEW_START,
previewEnd: addVars.previewEnd != null ? addVars.previewEnd : Constants.BASEGAME_DEFAULT_PREVIEW_END previewEnd: addVars.previewEnd != null ? addVars.previewEnd : Flags.BASEGAME_DEFAULT_PREVIEW_END
}, },
}; };
@@ -127,8 +127,8 @@ typedef SwagTimeChange =
typedef SwagPlayData = typedef SwagPlayData =
{ {
var album:String; var album:String;
var previewStart:Int; var previewStart:Float;
var previewEnd:Int; var previewEnd:Float;
var stage:String; var stage:String;
var characters:SwagCharactersList; var characters:SwagCharactersList;
var songVariations:Array<String>; var songVariations:Array<String>;
+15 -15
View File
@@ -26,7 +26,7 @@ class Chart {
} }
public static function loadChartMeta(songName:String, ?difficulty:String, fromMods:Bool = true) { public static function loadChartMeta(songName:String, ?difficulty:String, fromMods:Bool = true) {
if (difficulty == null) difficulty = Constants.DEFAULT_DIFFICULTY; if (difficulty == null) difficulty = Flags.DEFAULT_DIFFICULTY;
var metaPath = Paths.file('songs/${songName.toLowerCase()}/meta.json'); var metaPath = Paths.file('songs/${songName.toLowerCase()}/meta.json');
var metaDiffPath = Paths.file('songs/${songName.toLowerCase()}/meta-${difficulty.toLowerCase()}.json'); var metaDiffPath = Paths.file('songs/${songName.toLowerCase()}/meta-${difficulty.toLowerCase()}.json');
@@ -47,19 +47,19 @@ class Chart {
if (data == null) if (data == null)
data = { data = {
name: songName, name: songName
bpm: Constants.DEFAULT_BPM
}; };
data.setFieldDefault("name", songName); data.setFieldDefault("name", songName);
data.setFieldDefault("beatsPerMeasure", Constants.DEFAULT_BEATS_PER_MEASURE); data.setFieldDefault("bpm", Flags.DEFAULT_BPM);
data.setFieldDefault("stepsPerBeat", Constants.DEFAULT_STEPS_PER_BEAT); data.setFieldDefault("beatsPerMeasure", Flags.DEFAULT_BEATS_PER_MEASURE);
data.setFieldDefault("stepsPerBeat", Flags.DEFAULT_STEPS_PER_BEAT);
data.setFieldDefault("needsVoices", true); data.setFieldDefault("needsVoices", true);
data.setFieldDefault("icon", Constants.DEFAULT_HEALTH_ICON); data.setFieldDefault("icon", Flags.DEFAULT_HEALTH_ICON);
data.setFieldDefault("difficulties", []); data.setFieldDefault("difficulties", []);
data.setFieldDefault("coopAllowed", Constants.DEFAULT_COOP_ALLOWED); data.setFieldDefault("coopAllowed", Flags.DEFAULT_COOP_ALLOWED);
data.setFieldDefault("opponentModeAllowed", Constants.DEFAULT_OPPONENT_MODE_ALLOWED); data.setFieldDefault("opponentModeAllowed", Flags.DEFAULT_OPPONENT_MODE_ALLOWED);
data.setFieldDefault("displayName", data.name); data.setFieldDefault("displayName", data.name);
data.setFieldDefault("parsedColor", data.color.getColorFromDynamic().getDefault(Constants.DEFAULT_COLOR)); data.setFieldDefault("parsedColor", data.color.getColorFromDynamic().getDefault(Flags.DEFAULT_COLOR));
if (data.difficulties.length <= 0) { if (data.difficulties.length <= 0) {
data.difficulties = [for(f in Paths.getFolderContent('songs/${songName.toLowerCase()}/charts/', false, fromMods ? MODS : SOURCE)) if (Path.extension(f = f.toUpperCase()) == "JSON") Path.withoutExtension(f)]; data.difficulties = [for(f in Paths.getFolderContent('songs/${songName.toLowerCase()}/charts/', false, fromMods ? MODS : SOURCE)) if (Path.extension(f = f.toUpperCase()) == "JSON") Path.withoutExtension(f)];
@@ -84,7 +84,7 @@ class Chart {
} }
public static function parse(songName:String, ?difficulty:String):ChartData { public static function parse(songName:String, ?difficulty:String):ChartData {
if (difficulty == null) difficulty = Constants.DEFAULT_DIFFICULTY; if (difficulty == null) difficulty = Flags.DEFAULT_DIFFICULTY;
var chartPath = Paths.chart(songName, difficulty); var chartPath = Paths.chart(songName, difficulty);
var base:ChartData = { var base:ChartData = {
@@ -94,8 +94,8 @@ class Chart {
meta: { meta: {
name: null name: null
}, },
scrollSpeed: Constants.DEFAULT_SCROLL_SPEED , scrollSpeed: Flags.DEFAULT_SCROLL_SPEED,
stage: Constants.DEFAULT_STAGE, stage: Flags.DEFAULT_STAGE,
codenameChart: true, codenameChart: true,
fromMods: Paths.assetsTree.existsSpecific(chartPath, "TEXT", MODS) fromMods: Paths.assetsTree.existsSpecific(chartPath, "TEXT", MODS)
}; };
@@ -192,7 +192,7 @@ class Chart {
* @return Filtered chart used for saving. * @return Filtered chart used for saving.
*/ */
public static function save(songFolderPath:String, chart:ChartData, ?difficulty:String, ?saveSettings:ChartSaveSettings):ChartData { public static function save(songFolderPath:String, chart:ChartData, ?difficulty:String, ?saveSettings:ChartSaveSettings):ChartData {
if (difficulty == null) difficulty = Constants.DEFAULT_DIFFICULTY; if (difficulty == null) difficulty = Flags.DEFAULT_DIFFICULTY;
if (saveSettings == null) saveSettings = {}; if (saveSettings == null) saveSettings = {};
if (saveSettings.saveMetaInChart == null) saveSettings.saveMetaInChart = true; if (saveSettings.saveMetaInChart == null) saveSettings.saveMetaInChart = true;
@@ -210,11 +210,11 @@ class Chart {
var chartPath = '${songFolderPath}/$saveFolder/${difficulty.trim()}.json'; var chartPath = '${songFolderPath}/$saveFolder/${difficulty.trim()}.json';
var metaPath = '${songFolderPath}/meta.json'; var metaPath = '${songFolderPath}/meta.json';
CoolUtil.safeSaveFile(chartPath, Json.stringify(filteredChart, null, saveSettings.prettyPrint == true ? Constants.JSON_PRETTY_PRINT : null)); CoolUtil.safeSaveFile(chartPath, Json.stringify(filteredChart, null, saveSettings.prettyPrint == true ? Flags.JSON_PRETTY_PRINT : null));
// idk how null reacts to it so better be sure // idk how null reacts to it so better be sure
if (saveSettings.overrideExistingMeta == true || !FileSystem.exists(metaPath)) if (saveSettings.overrideExistingMeta == true || !FileSystem.exists(metaPath))
CoolUtil.safeSaveFile(metaPath, Json.stringify(meta, null, saveSettings.prettyPrint == true ? Constants.JSON_PRETTY_PRINT : null)); CoolUtil.safeSaveFile(metaPath, Json.stringify(meta, null, saveSettings.prettyPrint == true ? Flags.JSON_PRETTY_PRINT : null));
#end #end
return filteredChart; return filteredChart;
} }
@@ -45,7 +45,7 @@ class FNFLegacyParser {
var camFocusedBF:Bool = false; var camFocusedBF:Bool = false;
var altAnims:Bool = false; var altAnims:Bool = false;
var beatsPerMeasure:Float = data.beatsPerMeasure.getDefault(Constants.DEFAULT_BEATS_PER_MEASURE); var beatsPerMeasure:Float = data.beatsPerMeasure.getDefault(Flags.DEFAULT_BEATS_PER_MEASURE);
var curBPM:Float = data.bpm; var curBPM:Float = data.bpm;
var curTime:Float = 0; var curTime:Float = 0;
var curCrochet:Float = ((60 / curBPM) * 1000); var curCrochet:Float = ((60 / curBPM) * 1000);
@@ -132,10 +132,10 @@ class FNFLegacyParser {
if ((swagSection.mustHitSection && strumLine.type == OPPONENT) || if ((swagSection.mustHitSection && strumLine.type == OPPONENT) ||
(!swagSection.mustHitSection && strumLine.type == PLAYER)) (!swagSection.mustHitSection && strumLine.type == PLAYER))
sectionNote[1] += 4; sectionNote[1] += 4;
swagSection.sectionNotes.push(sectionNote); swagSection.sectionNotes.push(sectionNote);
} }
} }
return {song: base}; return {song: base};
} }
@@ -156,9 +156,9 @@ class FNFLegacyParser {
for (strumLine in chart.strumLines) for (strumLine in chart.strumLines)
switch (strumLine.type) { switch (strumLine.type) {
case OPPONENT: case OPPONENT:
if (base.player2 == null) base.player2 = strumLine.characters.getDefault([Constants.DEFAULT_OPPONENT])[0]; if (base.player2 == null) base.player2 = strumLine.characters.getDefault([Flags.DEFAULT_OPPONENT])[0];
case PLAYER: case PLAYER:
if (base.player1 == null) base.player1 = strumLine.characters.getDefault([Constants.DEFAULT_CHARACTER])[0]; if (base.player1 == null) base.player1 = strumLine.characters.getDefault([Flags.DEFAULT_CHARACTER])[0];
case ADDITIONAL: // do nothing case ADDITIONAL: // do nothing
} }
+3 -3
View File
@@ -54,8 +54,8 @@ class Script extends FlxBasic implements IFlxDestroyable {
// Engine related stuff // Engine related stuff
"engine" => { "engine" => {
commit: Constants.COMMIT_NUMBER, commit: Flags.COMMIT_NUMBER,
hash: Constants.COMMIT_HASH, hash: Flags.COMMIT_HASH,
build: 2675, // 2675 being the last build num before it was removed build: 2675, // 2675 being the last build num before it was removed
name: "Codename Engine" name: "Codename Engine"
}, },
@@ -101,7 +101,7 @@ class Script extends FlxBasic implements IFlxDestroyable {
defines.set("CODENAME_ENGINE", true); defines.set("CODENAME_ENGINE", true);
defines.set("CODENAME_VER", Application.current.meta.get('version')); defines.set("CODENAME_VER", Application.current.meta.get('version'));
defines.set("CODENAME_BUILD", 2675); // 2675 being the last build num before it was removed defines.set("CODENAME_BUILD", 2675); // 2675 being the last build num before it was removed
defines.set("CODENAME_COMMIT", Constants.COMMIT_NUMBER); defines.set("CODENAME_COMMIT", Flags.COMMIT_NUMBER);
return defines; return defines;
} }
/** /**
+1 -1
View File
@@ -25,7 +25,7 @@ class Conductor
/** /**
* Current BPM * Current BPM
*/ */
public static var bpm:Float = Constants.DEFAULT_BPM; public static var bpm:Float = 100;
/** /**
* Current Crochet (time per beat), in milliseconds. * Current Crochet (time per beat), in milliseconds.
+122 -1
View File
@@ -2,7 +2,10 @@ package funkin.backend.system;
import lime.utils.AssetLibrary; import lime.utils.AssetLibrary;
import lime.utils.AssetType; import lime.utils.AssetType;
import flixel.util.FlxColor;
import lime.app.Application;
import funkin.backend.system.macros.GitCommitMacro;
import funkin.backend.assets.IModsAssetLibrary; import funkin.backend.assets.IModsAssetLibrary;
import funkin.backend.assets.ScriptedAssetLibrary; import funkin.backend.assets.ScriptedAssetLibrary;
@@ -11,11 +14,129 @@ import funkin.backend.assets.ScriptedAssetLibrary;
*/ */
@:build(funkin.backend.system.macros.FlagMacro.build()) @:build(funkin.backend.system.macros.FlagMacro.build())
class Flags { class Flags {
// -- Codename's Default Flags --
public static var COMMIT_NUMBER:Int = GitCommitMacro.commitNumber;
public static var COMMIT_HASH:String = GitCommitMacro.commitHash;
public static var COMMIT_MESSAGE:String = 'Commit $COMMIT_NUMBER ($COMMIT_HASH)';
@:lazy public static var VERSION_MESSAGE:String = 'Codename Engine v${Application.current.meta.get('version')}';
public static var REPO_NAME:String = "CodenameEngine";
public static var REPO_OWNER:String = "FNF-CNE-Devs";
public static var REPO_URL:String = 'https://github.com/$REPO_OWNER/$REPO_NAME';
// make this empty once you guys are done with the project.
// good luck /gen <3 @crowplexus
public static var RELEASE_CYCLE:String = "Beta";
/**
* Preferred sound extension for the game's audio files.
* Currently is set to `mp3` for web targets, and `ogg` for other targets.
*/
public static var SOUND_EXT:String = #if web "mp3" #else "ogg" #end; // we also support wav
public static var VIDEO_EXT:String = "mp4";
public static var IMAGE_EXT:String = "png"; // we also support jpg
public static var DEFAULT_DISCORD_LOGO_KEY:String = "icon";
public static var DEFAULT_DISCORD_CLIENT_ID:String = "1027994136193810442";
public static var DEFAULT_DISCORD_LOGO_TEXT:String = "Codename Engine";
@:also(funkin.game.Character.FALLBACK_CHARACTER)
public static var DEFAULT_CHARACTER:String = "bf";
public static var DEFAULT_GIRLFRIEND:String = "gf";
public static var DEFAULT_OPPONENT:String = "dad";
@:also(funkin.game.PlayState.difficulty)
public static var DEFAULT_DIFFICULTY:String = "normal";
public static var DEFAULT_STAGE:String = "stage";
public static var DEFAULT_SCROLL_SPEED:Float = 2.0;
public static var DEFAULT_HEALTH_ICON:String = "face";
public static var SONGS_LIST_MOD_MODE:Allow<"prepend", "override", "append"> = "override"; public static var SONGS_LIST_MOD_MODE:Allow<"prepend", "override", "append"> = "override";
public static var WEEKS_LIST_MOD_MODE:Allow<"prepend", "override", "append"> = "override"; public static var WEEKS_LIST_MOD_MODE:Allow<"prepend", "override", "append"> = "override";
// Internal stuff public static var DEFAULT_BPM:Float = 100.0;
public static var DEFAULT_BEATS_PER_MEASURE:Int = 4;
public static var DEFAULT_STEPS_PER_BEAT:Int = 4;
public static var SUPPORTED_CHART_RUNTIME_FORMATS:Array<String> = ["Legacy", "Psych Engine"];
public static var SUPPORTED_CHART_FORMATS:Array<String> = ["BaseGame"];
public static var BASEGAME_SONG_METADATA_VERSION:String = "2.2.2";
public static var BASEGAME_SONG_CHART_DATA_VERSION:String = "2.0.0";
public static var BASEGAME_DEFAULT_NOTE_STYLE:String = 'funkin';
public static var BASEGAME_DEFAULT_ALBUM_ID:String = 'volume1';
public static var BASEGAME_DEFAULT_PREVIEW_START:Float = 0;
public static var BASEGAME_DEFAULT_PREVIEW_END:Float = 15000;
/**
* Default background colors for songs without bg color
*/
public static var DEFAULT_COLOR:FlxColor = 0xFF9271FD;
public static var DEFAULT_COOP_ALLOWED:Bool = false;
public static var DEFAULT_OPPONENT_MODE_ALLOWED:Bool = false;
@:also(funkin.game.PlayState.coopMode)
public static var DEFAULT_COOP_MODE:Bool = false; // used in playstate if it doesnt find it
@:also(funkin.game.PlayState.opponentMode)
public static var DEFAULT_OPPONENT_MODE:Bool = false;
public static var DEFAULT_NOTE_MS_LIMIT:Float = 1500;
public static var DEFAULT_NOTE_SCALE:Float = 0.7;
@:also(funkin.game.Character.FALLBACK_DEAD_CHARACTER)
public static var DEFAULT_GAMEOVER_CHARACTER:String = "bf-dead";
public static var DEFAULT_GAMEOVER_SONG:String = "gameOver";
public static var DEFAULT_GAMEOVER_LOSS_SFX:String = "gameOverSFX";
public static var DEFAULT_GAMEOVER_RETRY_SFX:String = "gameOverEnd";
public static var DEFAULT_CAM_ZOOM_INTERVAL:Int = 4;
public static var DEFAULT_CAM_ZOOM_STRENGTH:Int = 1;
public static var DEFAULT_CAM_ZOOM:Float = 1.05; // what zoom level it defaults to
public static var DEFAULT_HUD_ZOOM:Float = 1.0;
public static var MAX_CAMERA_ZOOM:Float = 1.35;
public static var DEFAULT_PAUSE_ITEMS:Array<String> = ['Resume', 'Restart Song', 'Change Controls', 'Change Options', 'Exit to menu', "Exit to charter"];
public static var DEFAULT_CUTSCENE_PAUSE_ITEMS:Array<String> = ['Resume Cutscene', 'Skip Cutscene', 'Restart Cutscene', 'Exit to menu'];
public static var DEFAULT_GITAROO:Bool = true;
public static var GITAROO_CHANCE:Float = 0.1;
public static var DEFAULT_CAN_ACCESS_DEBUG_MENUS:Bool = true;
public static var DEFAULT_MUTE_VOCALS_ON_MISS:Bool = true;
public static var DEFAULT_MAX_HEALTH:Float = 2.0;
public static var DEFAULT_HEALTH:Null<Float> = null;//DEFAULT_MAX_HEALTH / 2.0;
public static var BOP_ICON_SCALE:Float = 1.2;
public static var ICON_OFFSET:Float = 26;
public static var ICON_LERP:Float = 0.33;
public static var CAM_BOP_STRENGTH:Float = 0.015;
public static var HUD_BOP_STRENGTH:Float = 0.03;
public static var DEFAULT_CAM_ZOOM_LERP:Float = 0.05;
public static var DEFAULT_HUD_ZOOM_LERP:Float = 0.05;
public static var MAX_SPLASHES:Int = 8;
public static var STUNNED_TIME:Float = 5 / 60;
@:also(funkin.game.PlayState.daPixelZoom)
public static var PIXEL_ART_SCALE:Float = 6.0;
public static var DEFAULT_COMBO_GROUP_MAX_SIZE:Int = 25;
public static var DEFAULT_STRUM_AMOUNT:Int = 4;
public static var DEFAULT_CAMERA_FOLLOW_SPEED:Float = 0.04;
public static var VOCAL_OFFSET_VIOLATION_THRESHOLD:Float = 25;
// Usage: Codename Credits
public static var MAIN_DEVS_COLOR:FlxColor = 0xFF9C35D5;
public static var MIN_CONTRIBUTIONS_COLOR:FlxColor = 0xFFB4A7DA;
public static var UNDO_PREFIX:String = "* ";
public static var JSON_PRETTY_PRINT:String = "\t";
// -- End of Codename's Default Flags --
/**
* Flags that Codename couldn't recognize as it's own defaults (they can only be `string`!).
*/
@:bypass public static var customFlags:Map<String, String> = []; @:bypass public static var customFlags:Map<String, String> = [];
public static function load() { public static function load() {
+2 -1
View File
@@ -165,7 +165,8 @@ class Main extends Sprite
public static function refreshAssets() @:privateAccess { public static function refreshAssets() @:privateAccess {
WindowUtils.resetTitle(); WindowUtils.resetTitle();
var game = FlxG.game; var daSndTray = Type.createInstance(game._customSoundTray = funkin.menus.ui.FunkinSoundTray, []); var game = FlxG.game;
var daSndTray = Type.createInstance(game._customSoundTray = funkin.menus.ui.FunkinSoundTray, []);
var index:Int = game.numChildren - 1; var index:Int = game.numChildren - 1;
if(game.soundTray != null) if(game.soundTray != null)
+4 -4
View File
@@ -19,12 +19,10 @@ class MainState extends FlxState {
public override function create() { public override function create() {
super.create(); super.create();
if (!initiated) { if (!initiated) {
Constants.init();
Main.loadGameSettings(); Main.loadGameSettings();
} }
initiated = true; initiated = true;
Constants.reset();
#if sys #if sys
CoolUtil.deleteFolder('./.temp/'); // delete temp folder CoolUtil.deleteFolder('./.temp/'); // delete temp folder
@@ -58,9 +56,9 @@ class MainState extends FlxState {
} }
#end #end
Main.refreshAssets();
ModsFolder.onModSwitch.dispatch(ModsFolder.currentModFolder);
Flags.load(); Flags.load();
ModsFolder.onModSwitch.dispatch(ModsFolder.currentModFolder); // Loads global.hx
Main.refreshAssets();
DiscordUtil.init(); DiscordUtil.init();
EventsData.reloadEvents(); EventsData.reloadEvents();
TitleState.initialized = false; TitleState.initialized = false;
@@ -75,6 +73,8 @@ class MainState extends FlxState {
betaWarningShown = true; betaWarningShown = true;
} }
#if sys
CoolUtil.safeAddAttributes('./.temp/', NativeAPI.FileAttribute.HIDDEN); CoolUtil.safeAddAttributes('./.temp/', NativeAPI.FileAttribute.HIDDEN);
#end
} }
} }
@@ -13,5 +13,5 @@ class CodenameBuildField extends TextField {
} }
public function reload() public function reload()
text = 'Codename Engine ${Constants.RELEASE_CYCLE}\n${Constants.COMMIT_MESSAGE}'; text = 'Codename Engine ${Flags.RELEASE_CYCLE}\n${Flags.COMMIT_MESSAGE}';
} }
@@ -6,13 +6,21 @@ using StringTools;
class BuildInfo { class BuildInfo {
public static function printBuildInfo() { public static function printBuildInfo() {
if(haxe.macro.Context.defined("display")) return; if(haxe.macro.Context.defined("display")) return;
var haxeVersion = haxe.macro.Context.definedValue("haxe"); var haxeVersion = haxe.macro.Context.definedValue("haxe").trim();
Sys.println('[ BUILD INFO ]'); Sys.println('[ BUILD INFO ]');
Sys.println('Haxe Version: ${haxeVersion}'); Sys.println('Haxe Version: ${haxeVersion}');
try { try {
var lastBuiltWith:Null<String> = null; var lastBuiltWith:Null<String> = null;
var compiling = #if final "final" #elseif debug "debug" #else "release" #end; var compiling = #if final "release" #elseif debug "debug" #else "release" #end;
var target = #if windows "windows" #elseif mac "macos" #elseif linux "linux" #elseif android "android" #elseif ios "ios" #elseif html5 "html5" #else "" #end; var target = #if hl "hl"
#elseif html5 "html5"
#elseif ios "ios"
#elseif android "android"
#elseif windows "windows"
#elseif (mac || macos) "macos"
#elseif linux "linux"
#else ""
#end;
if(target == "") throw "Unknown target"; if(target == "") throw "Unknown target";
var exportPath = Sys.getCwd() + "/export/" + compiling + "/" + target + "/"; var exportPath = Sys.getCwd() + "/export/" + compiling + "/" + target + "/";
exportPath += "obj/Options.txt"; exportPath += "obj/Options.txt";
@@ -20,23 +28,27 @@ class BuildInfo {
var options = sys.io.File.getContent(exportPath); var options = sys.io.File.getContent(exportPath);
for(option in options.split("\n")) { for(option in options.split("\n")) {
if(option.startsWith("haxe=")) { if(option.startsWith("haxe=")) {
lastBuiltWith = option.substr(5); lastBuiltWith = option.substr(5).trim();
break; break;
} }
} }
if(lastBuiltWith != null && lastBuiltWith != haxeVersion) if(lastBuiltWith != null && lastBuiltWith.length > 0 && lastBuiltWith != haxeVersion)
Sys.println('Last Built With Haxe: ${lastBuiltWith} [!!!! MAKE SURE IF YOU SWITCHED VERSIONS YOU DELETE EXPORT FOLDERS !!!!]'); Sys.println('Last Built With Haxe: ${lastBuiltWith} [!!!! MAKE SURE IF YOU SWITCHED VERSIONS YOU DELETE EXPORT FOLDERS !!!!]');
} catch(e) {} } catch(e) {}
Sys.println('Target Platform: ${ var targetPlatform = #if html5 "Web (HTML5)"
#if windows "Windows"
#elseif mac "Mac"
#elseif linux "Linux"
#elseif android "Android"
#elseif ios "iOS" #elseif ios "iOS"
#elseif android "Android"
#elseif windows "Windows"
#elseif (mac || macos) "Mac"
#elseif linux "Linux"
#else "Unknown" #else "Unknown"
#end #end;
}');
if(haxe.macro.Context.defined("hl")) {
targetPlatform = "Hashlink (" + targetPlatform + ")";
}
Sys.println('Target Platform: ' + targetPlatform);
Sys.println('Build Date: ${Date.now().toString()}'); Sys.println('Build Date: ${Date.now().toString()}');
Sys.println(''); Sys.println('');
} }
@@ -1,65 +0,0 @@
package funkin.backend.system.macros;
#if macro
import haxe.macro.Context;
import haxe.macro.Expr;
#end
class ConstantsMacro {
#if macro
static function build() {
var fields = Context.getBuildFields();
var resetFields:Array<Expr> = [];
var lazyFields:Array<Expr> = [];
for(field in fields) {
switch(field.kind) {
case FVar(t, e):
resetFields.push(macro $i{field.name} = ${e});
var hasLazy = false;
for(meta in field.meta) {
if(meta.name == ":lazy") {
hasLazy = true;
break;
}
}
if(hasLazy) {
lazyFields.push(macro $i{field.name} = ${e});
field.kind = FVar(t, null);
}
default:
}
}
fields.push({
name: "reset",
pos: Context.currentPos(),
access: [APublic, AStatic],
kind: FFun({
args: [],
ret: null,
expr: macro {
$b{resetFields}
}
})
});
fields.push({
name: "init",
pos: Context.currentPos(),
access: [APublic, AStatic],
kind: FFun({
args: [],
ret: null,
expr: macro {
$b{lazyFields}
}
})
});
return fields;
}
#end
}
@@ -7,7 +7,18 @@ using StringTools;
using haxe.macro.Tools; using haxe.macro.Tools;
using funkin.backend.system.macros.FlagMacro;
class FlagMacro { class FlagMacro {
private static function hasMeta(meta:Array<MetadataEntry>, name:String):Bool {
for(m in meta) {
if(m.name == name) {
return true;
}
}
return false;
}
public static function build():Array<Field> { public static function build():Array<Field> {
var fields = Context.getBuildFields(); var fields = Context.getBuildFields();
@@ -21,26 +32,50 @@ class FlagMacro {
var parserExprs:Array<Expr> = []; var parserExprs:Array<Expr> = [];
for (field in fields) { for (field in fields) {
var skip = false; var skip = field.meta.hasMeta(":bypass");
for(meta in field.meta) { var hasLazy = field.meta.hasMeta(":lazy");
if(meta.name == ":bypass") {
skip = true;
break;
}
}
if(skip) continue; if(skip) continue;
switch (field.kind) { switch (field.kind) {
case FVar(type, expr): case FVar(type, expr):
var isNullable = false;
switch(type) {
case TPath({name: "Null", pack: [], params: [TPType(p)]}):
type = p;
isNullable = true;
default:
}
var alsos:Array<Expr> = [];
for(meta in field.meta) {
if(meta.name == ":also") {
for(param in meta.params) {
switch(param.expr) {
case EField(_, _):
alsos.push(param);
default:
Context.error("Invalid :also parameter", param.pos);
}
}
}
}
if(expr == null) if(expr == null)
Context.error('Flag ' + field.name + ' must have a default value', field.pos); Context.error('Flag ' + field.name + ' must have a default value', field.pos);
switch(expr.expr) { if(type == null) {
case EConst(CIdent("true")) | EConst(CIdent("false")): switch(expr.expr) {
type = macro: Bool; case EConst(CIdent("true")) | EConst(CIdent("false")):
default: type = macro: Bool;
if(type == null) case EConst(CInt(_)):
type = macro: Int;
case EConst(CFloat(_)):
type = macro: Float;
case EConst(CString(_)):
type = macro: String;
default:
Context.error('Flag ' + field.name + ' must have a type', field.pos); Context.error('Flag ' + field.name + ' must have a type', field.pos);
}
} }
var parser:Expr = null; var parser:Expr = null;
@@ -52,7 +87,7 @@ class FlagMacro {
parser = macro value.split(",").map((e) -> e.trim()); parser = macro value.split(",").map((e) -> e.trim());
case macro: Array<String>: case macro: Array<String>:
parser = macro value.split(","); parser = macro value.split(",");
case macro: Array<Int>: case (macro: Array<Int>) | (macro: Array<FlxColor>):
parser = macro value.split(",").map((e) -> Std.parseInt(e)); parser = macro value.split(",").map((e) -> Std.parseInt(e));
case macro: Array<Float>: case macro: Array<Float>:
parser = macro value.split(",").map((e) -> Std.parseFloat(e)); parser = macro value.split(",").map((e) -> Std.parseFloat(e));
@@ -61,12 +96,15 @@ class FlagMacro {
e = e.trim(); e = e.trim();
e == "true" || e == "t" || e == "1"; e == "true" || e == "t" || e == "1";
}); });
case macro: Int: case macro: TrimmedString:
field.kind = FVar(macro: String, expr);
parser = macro value.trim();
case macro: String:
parser = macro value;
case (macro: Int) | (macro: FlxColor):
parser = macro Std.parseInt(value); parser = macro Std.parseInt(value);
case macro: Float: case macro: Float:
parser = macro Std.parseFloat(value); parser = macro Std.parseFloat(value);
case macro: String:
parser = macro value;
case macro: Bool: case macro: Bool:
parser = macro value == "true" || value == "t" || value == "1"; parser = macro value == "true" || value == "t" || value == "1";
case TPath({name: "Allow", pack: [], params: params}): case TPath({name: "Allow", pack: [], params: params}):
@@ -128,8 +166,7 @@ class FlagMacro {
if(chosenType == STRING) { if(chosenType == STRING) {
parser = macro value; parser = macro value;
field.kind = FVar(macro: String, expr); field.kind = FVar(macro: String, expr);
} } else if(chosenType == INT) {
else if(chosenType == INT) {
parser = macro Std.parseInt(value); parser = macro Std.parseInt(value);
field.kind = FVar(macro: Int, expr); field.kind = FVar(macro: Int, expr);
} else { } else {
@@ -147,7 +184,7 @@ class FlagMacro {
} }
case TPath({name: "Array", pack: []}): case TPath({name: "Array", pack: []}):
Context.error("Flag " + field.name + " cannot be an Array that isnt a String or Bool or TrimmedString", field.pos); Context.error("Flag " + field.name + " cannot be an Array that isnt a String or Bool or TrimmedString or Int or Float", field.pos);
case TPath({name: "Map", pack: []}): case TPath({name: "Map", pack: []}):
Context.error("Flag " + field.name + " cannot be a Map<K, V>", field.pos); Context.error("Flag " + field.name + " cannot be a Map<K, V>", field.pos);
default: default:
@@ -159,6 +196,14 @@ class FlagMacro {
continue; continue;
} }
if(isNullable) {
switch(field.kind) {
case FVar(t, e):
field.kind = FVar(TPath({name: "Null", pack: [], params: [TPType(t)]}), e);
default:
}
}
resetExprs.push(macro $i{field.name} = ${expr}); resetExprs.push(macro $i{field.name} = ${expr});
// parse(name: String, value: String) // parse(name: String, value: String)
@@ -166,16 +211,39 @@ class FlagMacro {
if(customCheck != null) { if(customCheck != null) {
parserExprs.push(customCheck); parserExprs.push(customCheck);
} else { } else {
parserExprs.push(macro @:mergeBlock { var alsoExpr = alsos.length > 0 ? macro @:mergeBlock $b{alsos.map((e) -> return macro $e = val)} : macro {};
if(name == $v{field.name}) {
$i{field.name} = $parser; if(isNullable) {
return true; parserExprs.push(macro @:mergeBlock {
} if(name == $v{field.name}) {
}); var val = value == "NULL" ? null : $parser;
$i{field.name} = val;
$alsoExpr;
return true;
}
});
} else {
parserExprs.push(macro @:mergeBlock {
if(name == $v{field.name}) {
var val = $parser;
$i{field.name} = val;
$alsoExpr;
return true;
}
});
}
} }
default: default:
// nothing // nothing
} }
if(hasLazy) {
switch(field.kind) {
case FVar(t, expr):
field.kind = FVar(t, null);
default:
}
}
} }
fields.push({ fields.push({
@@ -209,6 +277,9 @@ class FlagMacro {
}); });
//var printer = new haxe.macro.Printer(); //var printer = new haxe.macro.Printer();
//for(field in fields) {
// trace(printer.printField(field));
//}
//trace(printer.printField(fields[fields.length - 2])); //trace(printer.printField(fields[fields.length - 2]));
//trace(printer.printField(fields[fields.length - 1])); //trace(printer.printField(fields[fields.length - 1]));
@@ -56,7 +56,7 @@ class UpdateScreen extends MusicBeatState {
generalProgress.alignment = CENTER; generalProgress.alignment = CENTER;
add(generalProgress); add(generalProgress);
overSound = FlxG.sound.load(Paths.sound(Constants.DEFAULT_GAMEOVER_RETRY_SFX)); overSound = FlxG.sound.load(Paths.sound(Flags.DEFAULT_GAMEOVER_RETRY_SFX));
updater.execute(); updater.execute();
+21 -5
View File
@@ -121,11 +121,15 @@ class CoolUtil
* @return The attributes through the `FileAttributeWrapper` * @return The attributes through the `FileAttributeWrapper`
*/ */
@:noUsing public static inline function safeGetAttributes(path:String, useAbsol:Bool = true):FileAttributeWrapper { @:noUsing public static inline function safeGetAttributes(path:String, useAbsol:Bool = true):FileAttributeWrapper {
#if sys
addMissingFolders(Path.directory(path)); addMissingFolders(Path.directory(path));
var result = NativeAPI.getFileAttributes(path, useAbsol); var result = NativeAPI.getFileAttributes(path, useAbsol);
if(result.isNothing) Logs.trace('The file where it has been tried to get the attributes from, might be corrupted or inexistent (code: ${result.getValue()})', WARNING); if(result.isNothing) Logs.trace('The file where it has been tried to get the attributes from, might be corrupted or inexistent (code: ${result.getValue()})', WARNING);
return result; return result;
#else
return 0;
#end
} }
/** /**
@@ -138,11 +142,15 @@ class CoolUtil
*/ */
@:noUsing public static inline function safeSetAttributes(path:String, attrib:OneOfThree<NativeAPI.FileAttribute, FileAttributeWrapper, Int>, useAbsol:Bool = true):Int { @:noUsing public static inline function safeSetAttributes(path:String, attrib:OneOfThree<NativeAPI.FileAttribute, FileAttributeWrapper, Int>, useAbsol:Bool = true):Int {
// yes, i'm aware that FileAttribute is also an Int so need to include it too, but at least like this we don't have to make cast sometimes while passing the arguments - Nex // yes, i'm aware that FileAttribute is also an Int so need to include it too, but at least like this we don't have to make cast sometimes while passing the arguments - Nex
#if sys
addMissingFolders(Path.directory(path)); addMissingFolders(Path.directory(path));
var result = NativeAPI.setFileAttributes(path, attrib, useAbsol); var result = NativeAPI.setFileAttributes(path, attrib, useAbsol);
if(result == 0) Logs.trace('Failed to set attributes to $path with a code of: $result', WARNING); if(result == 0) Logs.trace('Failed to set attributes to $path with a code of: $result', WARNING);
return result; return result;
#else
return 0;
#end
} }
/** /**
@@ -154,11 +162,15 @@ class CoolUtil
* @return The result code: `0` means that it failed setting * @return The result code: `0` means that it failed setting
*/ */
@:noUsing public static inline function safeAddAttributes(path:String, attrib:OneOfTwo<NativeAPI.FileAttribute, Int>, useAbsol:Bool = true):Int { @:noUsing public static inline function safeAddAttributes(path:String, attrib:OneOfTwo<NativeAPI.FileAttribute, Int>, useAbsol:Bool = true):Int {
#if sys
addMissingFolders(Path.directory(path)); addMissingFolders(Path.directory(path));
var result = NativeAPI.addFileAttributes(path, attrib, useAbsol); var result = NativeAPI.addFileAttributes(path, attrib, useAbsol);
if(result == 0) Logs.trace('Failed to add attributes to $path with a code of: $result', WARNING); if(result == 0) Logs.trace('Failed to add attributes to $path with a code of: $result', WARNING);
return result; return result;
#else
return 0;
#end
} }
/** /**
@@ -170,11 +182,15 @@ class CoolUtil
* @return The result code: `0` means that it failed setting * @return The result code: `0` means that it failed setting
*/ */
@:noUsing public static inline function safeRemoveAttributes(path:String, attrib:OneOfTwo<NativeAPI.FileAttribute, Int>, useAbsol:Bool = true):Int { @:noUsing public static inline function safeRemoveAttributes(path:String, attrib:OneOfTwo<NativeAPI.FileAttribute, Int>, useAbsol:Bool = true):Int {
#if sys
addMissingFolders(Path.directory(path)); addMissingFolders(Path.directory(path));
var result = NativeAPI.removeFileAttributes(path, attrib, useAbsol); var result = NativeAPI.removeFileAttributes(path, attrib, useAbsol);
if(result == 0) Logs.trace('Failed to remove attributes to $path with a code of: $result', WARNING); if(result == 0) Logs.trace('Failed to remove attributes to $path with a code of: $result', WARNING);
return result; return result;
#else
return 0;
#end
} }
/** /**
@@ -403,17 +419,17 @@ class CoolUtil
if (Assets.exists(infoPath)) { if (Assets.exists(infoPath)) {
var musicInfo = IniUtil.parseAsset(infoPath, [ var musicInfo = IniUtil.parseAsset(infoPath, [
"BPM" => null, "BPM" => null,
"TimeSignature" => Constants.DEFAULT_BEATS_PER_MEASURE + "/" + Constants.DEFAULT_STEPS_PER_BEAT "TimeSignature" => Flags.DEFAULT_BEATS_PER_MEASURE + "/" + Flags.DEFAULT_STEPS_PER_BEAT
]); ]);
var timeSignParsed:Array<Null<Float>> = musicInfo["TimeSignature"] == null ? [] : [for(s in musicInfo["TimeSignature"].split("/")) Std.parseFloat(s)]; var timeSignParsed:Array<Null<Float>> = musicInfo["TimeSignature"] == null ? [] : [for(s in musicInfo["TimeSignature"].split("/")) Std.parseFloat(s)];
var beatsPerMeasure:Float = Constants.DEFAULT_BEATS_PER_MEASURE; var beatsPerMeasure:Float = Flags.DEFAULT_BEATS_PER_MEASURE;
var stepsPerBeat:Float = Constants.DEFAULT_STEPS_PER_BEAT; var stepsPerBeat:Float = Flags.DEFAULT_STEPS_PER_BEAT;
// Check later, i dont think timeSignParsed can contain null, only nan // Check later, i dont think timeSignParsed can contain null, only nan
if (timeSignParsed.length == 2 && !timeSignParsed.contains(null)) { if (timeSignParsed.length == 2 && !timeSignParsed.contains(null)) {
beatsPerMeasure = timeSignParsed[0] == null || timeSignParsed[0] <= 0 ? Constants.DEFAULT_BEATS_PER_MEASURE : cast timeSignParsed[0]; beatsPerMeasure = timeSignParsed[0] == null || timeSignParsed[0] <= 0 ? Flags.DEFAULT_BEATS_PER_MEASURE : cast timeSignParsed[0];
stepsPerBeat = timeSignParsed[1] == null || timeSignParsed[1] <= 0 ? Constants.DEFAULT_STEPS_PER_BEAT : cast timeSignParsed[1]; stepsPerBeat = timeSignParsed[1] == null || timeSignParsed[1] <= 0 ? Flags.DEFAULT_STEPS_PER_BEAT : cast timeSignParsed[1];
} }
var bpm:Null<Float> = Std.parseFloat(musicInfo["BPM"]).getDefault(DefaultBPM); var bpm:Null<Float> = Std.parseFloat(musicInfo["BPM"]).getDefault(DefaultBPM);
+3 -3
View File
@@ -86,9 +86,9 @@ class DiscordUtil
if (config == null) if (config == null)
config = {}; config = {};
config.logoKey = config.logoKey.getDefault(Constants.DISCORD_LOGO_KEY); config.logoKey = config.logoKey.getDefault(Flags.DEFAULT_DISCORD_LOGO_KEY);
config.logoText = config.logoText.getDefault(Constants.DISCORD_LOGO_TEXT); config.logoText = config.logoText.getDefault(Flags.DEFAULT_DISCORD_LOGO_TEXT);
config.clientID = config.clientID.getDefault(Constants.DISCORD_CLIENT_ID); config.clientID = config.clientID.getDefault(Flags.DEFAULT_DISCORD_CLIENT_ID);
currentID = config.clientID; currentID = config.clientID;
#end #end
} }
@@ -314,7 +314,7 @@ class CharacterEditor extends UIState {
characterBG.scale.set(FlxG.width/characterBG.width, FlxG.height/characterBG.height); characterBG.scale.set(FlxG.width/characterBG.width, FlxG.height/characterBG.height);
characterBG.scale.set(characterBG.scale.x / charCamera.zoom, characterBG.scale.y / charCamera.zoom); characterBG.scale.set(characterBG.scale.x / charCamera.zoom, characterBG.scale.y / charCamera.zoom);
WindowUtils.prefix = undos.unsaved ? Constants.UNDO_PREFIX : ""; WindowUtils.prefix = undos.unsaved ? Flags.UNDO_PREFIX : "";
SaveWarning.showWarning = undos.unsaved; SaveWarning.showWarning = undos.unsaved;
} }
@@ -354,7 +354,7 @@ class CharacterEditor extends UIState {
]); ]);
// clean // clean
if (charXML.exists("gameOverChar") && character.gameOverCharacter == Constants.DEFAULT_GAMEOVER_CHARACTER) charXML.remove("gameOverChar"); if (charXML.exists("gameOverChar") && character.gameOverCharacter == Flags.DEFAULT_GAMEOVER_CHARACTER) charXML.remove("gameOverChar");
if (charXML.exists("camx") && character.cameraOffset.x == 0) charXML.remove("camx"); if (charXML.exists("camx") && character.cameraOffset.x == 0) charXML.remove("camx");
if (charXML.exists("camy") && character.cameraOffset.y == 0) charXML.remove("camy"); if (charXML.exists("camy") && character.cameraOffset.y == 0) charXML.remove("camy");
if (charXML.exists("holdTime") && character.holdTime == 4) charXML.remove("holdTime"); if (charXML.exists("holdTime") && character.holdTime == 4) charXML.remove("holdTime");
@@ -150,7 +150,7 @@ class CharacterInfoScreen extends UISubstateWindow {
@:privateAccess iconSprite.animation.clearAnimations(); @:privateAccess iconSprite.animation.clearAnimations();
var path:String = Paths.image('icons/$icon'); var path:String = Paths.image('icons/$icon');
if (!Assets.exists(path)) path = Paths.image('icons/' + Constants.DEFAULT_HEALTH_ICON); if (!Assets.exists(path)) path = Paths.image('icons/' + Flags.DEFAULT_HEALTH_ICON);
iconSprite.loadGraphic(path, true, 150, 150); iconSprite.loadGraphic(path, true, 150, 150);
iconSprite.animation.add(icon, [0], 0, false); iconSprite.animation.add(icon, [0], 0, false);
@@ -73,7 +73,7 @@ class ChartCreationScreen extends UISubstateWindow {
strumLineList.addButton.callback = function() { strumLineList.addButton.callback = function() {
strumLineList.add(new StrumLineButton(strumLineList.buttons.length, { strumLineList.add(new StrumLineButton(strumLineList.buttons.length, {
characters: [Constants.DEFAULT_OPPONENT], characters: [Flags.DEFAULT_OPPONENT],
type: 0, type: 0,
notes: null, notes: null,
position: "DAD", position: "DAD",
@@ -84,7 +84,7 @@ class ChartCreationScreen extends UISubstateWindow {
// DEFAULTS // DEFAULTS
strumLineList.add(new StrumLineButton(0, { strumLineList.add(new StrumLineButton(0, {
characters: [Constants.DEFAULT_OPPONENT], characters: [Flags.DEFAULT_OPPONENT],
type: 0, type: 0,
notes: null, notes: null,
position: "DAD", position: "DAD",
@@ -93,7 +93,7 @@ class ChartCreationScreen extends UISubstateWindow {
scrollSpeed: 1, scrollSpeed: 1,
}, strumLineList)); }, strumLineList));
strumLineList.add(new StrumLineButton(1, { strumLineList.add(new StrumLineButton(1, {
characters: [Constants.DEFAULT_CHARACTER], characters: [Flags.DEFAULT_CHARACTER],
type: 1, type: 1,
notes: null, notes: null,
position: "BOYFRIEND", position: "BOYFRIEND",
@@ -102,7 +102,7 @@ class ChartCreationScreen extends UISubstateWindow {
scrollSpeed: 1, scrollSpeed: 1,
}, strumLineList)); }, strumLineList));
strumLineList.add(new StrumLineButton(2, { strumLineList.add(new StrumLineButton(2, {
characters: [Constants.DEFAULT_GIRLFRIEND], characters: [Flags.DEFAULT_GIRLFRIEND],
type: 2, type: 2,
notes: null, notes: null,
position: "GIRLFRIEND", position: "GIRLFRIEND",
@@ -333,7 +333,7 @@ class CompactCharacterButton extends UIButton {
char = funkin.game.Character.getIconFromCharName(char); char = funkin.game.Character.getIconFromCharName(char);
var image = Paths.image("icons/" + char); var image = Paths.image("icons/" + char);
if(!Assets.exists(image)) if(!Assets.exists(image))
image = Paths.image("icons/" + Constants.DEFAULT_HEALTH_ICON); image = Paths.image("icons/" + Flags.DEFAULT_HEALTH_ICON);
charIcon.loadGraphic(image, true, 150, 150); charIcon.loadGraphic(image, true, 150, 150);
charIcon.updateHitbox(); charIcon.updateHitbox();
} }
+11 -11
View File
@@ -1246,7 +1246,7 @@ class Charter extends UIState {
if (strumLines != null) if (strumLines != null)
strumlineLockButton.button.animation.play(strumLines.draggable ? "1" : "0", true); strumlineLockButton.button.animation.play(strumLines.draggable ? "1" : "0", true);
WindowUtils.prefix = undos.unsaved ? Constants.UNDO_PREFIX : ""; WindowUtils.prefix = undos.unsaved ? Flags.UNDO_PREFIX : "";
SaveWarning.showWarning = undos.unsaved; SaveWarning.showWarning = undos.unsaved;
__firstFrame = false; __firstFrame = false;
@@ -1298,7 +1298,7 @@ class Charter extends UIState {
} }
function _file_saveas(_) { function _file_saveas(_) {
openSubState(new SaveSubstate(Json.stringify(Chart.filterChartForSaving(PlayState.SONG, false), null, Options.editorPrettyPrint ? Constants.JSON_PRETTY_PRINT : null), { openSubState(new SaveSubstate(Json.stringify(Chart.filterChartForSaving(PlayState.SONG, false), null, Options.editorPrettyPrint ? Flags.JSON_PRETTY_PRINT : null), {
defaultSaveFile: '${__diff.toLowerCase()}.json' defaultSaveFile: '${__diff.toLowerCase()}.json'
})); }));
undos.save(); undos.save();
@@ -1314,7 +1314,7 @@ class Charter extends UIState {
} }
function _file_saveas_no_events(_) { function _file_saveas_no_events(_) {
openSubState(new SaveSubstate(Json.stringify(Chart.filterChartForSaving(PlayState.SONG, false, false), null, Options.editorPrettyPrint ? Constants.JSON_PRETTY_PRINT : null), { openSubState(new SaveSubstate(Json.stringify(Chart.filterChartForSaving(PlayState.SONG, false, false), null, Options.editorPrettyPrint ? Flags.JSON_PRETTY_PRINT : null), {
defaultSaveFile: '${__diff.toLowerCase()}.json' defaultSaveFile: '${__diff.toLowerCase()}.json'
})); }));
undos.save(); undos.save();
@@ -1324,7 +1324,7 @@ class Charter extends UIState {
#if sys #if sys
CoolUtil.safeSaveFile( CoolUtil.safeSaveFile(
'${Paths.getAssetsRoot()}/songs/${__song.toLowerCase()}/meta.json', '${Paths.getAssetsRoot()}/songs/${__song.toLowerCase()}/meta.json',
Json.stringify(PlayState.SONG.meta == null ? {} : PlayState.SONG.meta, null, Constants.JSON_PRETTY_PRINT) Json.stringify(PlayState.SONG.meta == null ? {} : PlayState.SONG.meta, null, Flags.JSON_PRETTY_PRINT)
); );
#else #else
_file_meta_saveas(_); _file_meta_saveas(_);
@@ -1332,20 +1332,20 @@ class Charter extends UIState {
} }
function _file_meta_saveas(_) { function _file_meta_saveas(_) {
openSubState(new SaveSubstate(Json.stringify(PlayState.SONG.meta == null ? {} : PlayState.SONG.meta, null, Constants.JSON_PRETTY_PRINT), { // always pretty print meta openSubState(new SaveSubstate(Json.stringify(PlayState.SONG.meta == null ? {} : PlayState.SONG.meta, null, Flags.JSON_PRETTY_PRINT), { // always pretty print meta
defaultSaveFile: 'meta.json' defaultSaveFile: 'meta.json'
})); }));
} }
function _file_saveas_fnflegacy(_) { function _file_saveas_fnflegacy(_) {
openSubState(new SaveSubstate(Json.stringify(FNFLegacyParser.encode(PlayState.SONG), null, Options.editorPrettyPrint ? Constants.JSON_PRETTY_PRINT : null), { openSubState(new SaveSubstate(Json.stringify(FNFLegacyParser.encode(PlayState.SONG), null, Options.editorPrettyPrint ? Flags.JSON_PRETTY_PRINT : null), {
defaultSaveFile: '${__song.toLowerCase().replace(" ", "-")}${__diff.toLowerCase() == Constants.DEFAULT_DIFFICULTY ? "" : '-${__diff.toLowerCase()}'}.json', defaultSaveFile: '${__song.toLowerCase().replace(" ", "-")}${__diff.toLowerCase() == Flags.DEFAULT_DIFFICULTY ? "" : '-${__diff.toLowerCase()}'}.json',
})); }));
} }
function _file_saveas_psych(_) { function _file_saveas_psych(_) {
openSubState(new SaveSubstate(Json.stringify(PsychParser.encode(PlayState.SONG), null, Options.editorPrettyPrint ? Constants.JSON_PRETTY_PRINT : null), { openSubState(new SaveSubstate(Json.stringify(PsychParser.encode(PlayState.SONG), null, Options.editorPrettyPrint ? Flags.JSON_PRETTY_PRINT : null), {
defaultSaveFile: '${__song.toLowerCase().replace(" ", "-")}${__diff.toLowerCase() == Constants.DEFAULT_DIFFICULTY ? "" : '-${__diff.toLowerCase()}'}.json', defaultSaveFile: '${__song.toLowerCase().replace(" ", "-")}${__diff.toLowerCase() == Flags.DEFAULT_DIFFICULTY ? "" : '-${__diff.toLowerCase()}'}.json',
})); }));
} }
@@ -1353,7 +1353,7 @@ class Charter extends UIState {
#if sys #if sys
CoolUtil.safeSaveFile( CoolUtil.safeSaveFile(
'${Paths.getAssetsRoot()}/songs/${__song.toLowerCase()}/events.json', '${Paths.getAssetsRoot()}/songs/${__song.toLowerCase()}/events.json',
Json.stringify({events: PlayState.SONG.events == null ? [] : PlayState.SONG.events}, null, Options.editorPrettyPrint ? Constants.JSON_PRETTY_PRINT : null) Json.stringify({events: PlayState.SONG.events == null ? [] : PlayState.SONG.events}, null, Options.editorPrettyPrint ? Flags.JSON_PRETTY_PRINT : null)
); );
#else #else
_file_events_saveas(_); _file_events_saveas(_);
@@ -1362,7 +1362,7 @@ class Charter extends UIState {
function _file_events_saveas(_) { function _file_events_saveas(_) {
#if sys #if sys
openSubState(new SaveSubstate(Json.stringify({events: PlayState.SONG.events == null ? [] : PlayState.SONG.events}, null, Options.editorPrettyPrint ? Constants.JSON_PRETTY_PRINT : null), { openSubState(new SaveSubstate(Json.stringify({events: PlayState.SONG.events == null ? [] : PlayState.SONG.events}, null, Options.editorPrettyPrint ? Flags.JSON_PRETTY_PRINT : null), {
defaultSaveFile: 'events.json' defaultSaveFile: 'events.json'
})); }));
#end #end
@@ -129,7 +129,7 @@ class CharterMetaDataScreen extends UISubstateWindow {
@:privateAccess iconSprite.animation.clearAnimations(); @:privateAccess iconSprite.animation.clearAnimations();
var path:String = Paths.image('icons/$icon'); var path:String = Paths.image('icons/$icon');
if (!Assets.exists(path)) path = Paths.image('icons/' + Constants.DEFAULT_HEALTH_ICON); if (!Assets.exists(path)) path = Paths.image('icons/' + Flags.DEFAULT_HEALTH_ICON);
iconSprite.loadGraphic(path, true, 150, 150); iconSprite.loadGraphic(path, true, 150, 150);
iconSprite.animation.add(icon, [0], 0, false); iconSprite.animation.add(icon, [0], 0, false);
@@ -109,9 +109,9 @@ class CharterSelection extends EditorTreeMenu {
sys.FileSystem.createDirectory('$songFolder/charts'); sys.FileSystem.createDirectory('$songFolder/charts');
// Save Files // Save Files
CoolUtil.safeSaveFile('$songFolder/meta.json', Json.stringify(creation.meta, Constants.JSON_PRETTY_PRINT)); CoolUtil.safeSaveFile('$songFolder/meta.json', Json.stringify(creation.meta, Flags.JSON_PRETTY_PRINT));
if (creation.instBytes != null) sys.io.File.saveBytes('$songFolder/song/Inst.${Constants.SOUND_EXT}', creation.instBytes); if (creation.instBytes != null) sys.io.File.saveBytes('$songFolder/song/Inst.${Flags.SOUND_EXT}', creation.instBytes);
if (creation.voicesBytes != null) sys.io.File.saveBytes('$songFolder/song/Voices.${Constants.SOUND_EXT}', creation.voicesBytes); if (creation.voicesBytes != null) sys.io.File.saveBytes('$songFolder/song/Voices.${Flags.SOUND_EXT}', creation.voicesBytes);
#end #end
var option = new EditorIconOption(creation.meta.name, "Press ACCEPT to choose a difficulty to edit.", creation.meta.icon, function() { var option = new EditorIconOption(creation.meta.name, "Press ACCEPT to choose a difficulty to edit.", creation.meta.icon, function() {
@@ -147,7 +147,7 @@ class CharterSelection extends EditorTreeMenu {
var songFolder:String = '${Paths.getAssetsRoot()}/songs/${curSong.name}'; var songFolder:String = '${Paths.getAssetsRoot()}/songs/${curSong.name}';
// Save Files // Save Files
CoolUtil.safeSaveFile('$songFolder/charts/${name}.json', Json.stringify(data, Constants.JSON_PRETTY_PRINT)); CoolUtil.safeSaveFile('$songFolder/charts/${name}.json', Json.stringify(data, Flags.JSON_PRETTY_PRINT));
// Add to List // Add to List
curSong.difficulties.push(name); curSong.difficulties.push(name);
@@ -39,7 +39,7 @@ class CharterStrumlineScreen extends UISubstateWindow {
if (creatingStrumLine) if (creatingStrumLine)
strumLine = { strumLine = {
characters: [Constants.DEFAULT_OPPONENT], characters: [Flags.DEFAULT_OPPONENT],
type: OPPONENT, type: OPPONENT,
notes: [], notes: [],
position: "dad", position: "dad",
@@ -205,7 +205,7 @@ class CharacterButton extends UIButton {
char = Character.getIconFromCharName(char); char = Character.getIconFromCharName(char);
var image = Paths.image("icons/" + char); var image = Paths.image("icons/" + char);
if(!Assets.exists(image)) if(!Assets.exists(image))
image = Paths.image("icons/" + Constants.DEFAULT_HEALTH_ICON); image = Paths.image("icons/" + Flags.DEFAULT_HEALTH_ICON);
charIcon.loadGraphic(image, true, 150, 150); charIcon.loadGraphic(image, true, 150, 150);
charIcon.updateHitbox(); charIcon.updateHitbox();
} }
@@ -82,7 +82,7 @@ class SongCreationScreen extends UISubstateWindow {
var voicesUIText:UIText = null; var voicesUIText:UIText = null;
instExplorer = new UIFileExplorer(songNameTextBox.x, songNameTextBox.y + 32 + 36, null, null, Constants.SOUND_EXT, function (res) { instExplorer = new UIFileExplorer(songNameTextBox.x, songNameTextBox.y + 32 + 36, null, null, Flags.SOUND_EXT, function (res) {
var audioPlayer:UIAudioPlayer = new UIAudioPlayer(instExplorer.x + 8, instExplorer.y + 8, res); var audioPlayer:UIAudioPlayer = new UIAudioPlayer(instExplorer.x + 8, instExplorer.y + 8, res);
instExplorer.members.push(audioPlayer); instExplorer.members.push(audioPlayer);
instExplorer.uiElement = audioPlayer; instExplorer.uiElement = audioPlayer;
@@ -92,7 +92,7 @@ class SongCreationScreen extends UISubstateWindow {
"Inst Audio File $* Required$", "Inst Audio File $* Required$",
[new FlxTextFormatMarkerPair(new FlxTextFormat(0xFFAD1212), "$")]); [new FlxTextFormatMarkerPair(new FlxTextFormat(0xFFAD1212), "$")]);
voicesExplorer = new UIFileExplorer(instExplorer.x + 320 + 26, instExplorer.y, null, null, Constants.SOUND_EXT, function (res) { voicesExplorer = new UIFileExplorer(instExplorer.x + 320 + 26, instExplorer.y, null, null, Flags.SOUND_EXT, function (res) {
var audioPlayer:UIAudioPlayer = new UIAudioPlayer(voicesExplorer.x + 8, voicesExplorer.y + 8, res); var audioPlayer:UIAudioPlayer = new UIAudioPlayer(voicesExplorer.x + 8, voicesExplorer.y + 8, res);
voicesExplorer.members.push(audioPlayer); voicesExplorer.members.push(audioPlayer);
voicesExplorer.uiElement = audioPlayer; voicesExplorer.uiElement = audioPlayer;
@@ -213,7 +213,7 @@ class SongCreationScreen extends UISubstateWindow {
@:privateAccess iconSprite.animation.clearAnimations(); @:privateAccess iconSprite.animation.clearAnimations();
var path:String = Paths.image('icons/$icon'); var path:String = Paths.image('icons/$icon');
if (!Assets.exists(path)) path = Paths.image('icons/' + Constants.DEFAULT_HEALTH_ICON); if (!Assets.exists(path)) path = Paths.image('icons/' + Flags.DEFAULT_HEALTH_ICON);
iconSprite.loadGraphic(path, true, 150, 150); iconSprite.loadGraphic(path, true, 150, 150);
iconSprite.animation.add(icon, [0], 0, false); iconSprite.animation.add(icon, [0], 0, false);
+7 -8
View File
@@ -34,8 +34,8 @@ using StringTools;
@:allow(funkin.game.PlayState) @:allow(funkin.game.PlayState)
class Character extends FunkinSprite implements IBeatReceiver implements IOffsetCompatible { class Character extends FunkinSprite implements IBeatReceiver implements IOffsetCompatible {
public var isPlayer:Bool = false; public var isPlayer:Bool = false;
public var curCharacter:String = Constants.DEFAULT_CHARACTER; public var curCharacter:String = Flags.DEFAULT_CHARACTER;
public var sprite:String = Constants.DEFAULT_CHARACTER; public var sprite:String = Flags.DEFAULT_CHARACTER;
public var lastHit:Float = Math.NEGATIVE_INFINITY; public var lastHit:Float = Math.NEGATIVE_INFINITY;
public var holdTime:Float = 4; public var holdTime:Float = 4;
@@ -70,7 +70,7 @@ class Character extends FunkinSprite implements IBeatReceiver implements IOffset
super(x, y); super(x, y);
animOffsets = new Map<String, FlxPoint>(); animOffsets = new Map<String, FlxPoint>();
curCharacter = character != null ? character : Constants.DEFAULT_CHARACTER; curCharacter = character != null ? character : Flags.DEFAULT_CHARACTER;
this.isPlayer = isPlayer; this.isPlayer = isPlayer;
__switchAnims = switchAnims; __switchAnims = switchAnims;
@@ -130,7 +130,7 @@ class Character extends FunkinSprite implements IBeatReceiver implements IOffset
scripts.call("update", [elapsed]); scripts.call("update", [elapsed]);
if (stunned) { if (stunned) {
__stunnedTime += elapsed; __stunnedTime += elapsed;
if (__stunnedTime > Constants.STUNNED_TIME) if (__stunnedTime > Flags.STUNNED_TIME)
stunned = false; stunned = false;
} }
@@ -482,9 +482,8 @@ class Character extends FunkinSprite implements IBeatReceiver implements IOffset
@:noCompletion private function get_danceInterval() @:noCompletion private function get_danceInterval()
return beatInterval; return beatInterval;
// these wont update when you change the constants!!! they just start from the constant for qol if we'll ever edit them in the future - Nex public static var FALLBACK_CHARACTER:String = Flags.DEFAULT_CHARACTER;
public static var FALLBACK_CHARACTER:String = Constants.DEFAULT_CHARACTER; public static var FALLBACK_DEAD_CHARACTER:String = Flags.DEFAULT_GAMEOVER_CHARACTER;
public static var FALLBACK_DEAD_CHARACTER:String = Constants.DEFAULT_GAMEOVER_CHARACTER;
private function set_script(script:Script):Script { private function set_script(script:Script):Script {
if (scripts == null) (scripts = new ScriptPack("Character")).setParent(this); if (scripts == null) (scripts = new ScriptPack("Character")).setParent(this);
@@ -539,7 +538,7 @@ class Character extends FunkinSprite implements IBeatReceiver implements IOffset
} }
public static function getIconFromCharName(?character:String, ?defaultIcon:String = null) { public static function getIconFromCharName(?character:String, ?defaultIcon:String = null) {
if(character == null) return Constants.DEFAULT_HEALTH_ICON; if(character == null) return Flags.DEFAULT_HEALTH_ICON;
if(defaultIcon == null) defaultIcon = character; if(defaultIcon == null) defaultIcon = character;
var icon:String = defaultIcon; var icon:String = defaultIcon;
+5 -5
View File
@@ -43,10 +43,10 @@ class GameOverSubstate extends MusicBeatSubstate
this.x = x; this.x = x;
this.y = y; this.y = y;
this.player = player; this.player = player;
this.characterName = character != null ? character : Constants.DEFAULT_GAMEOVER_CHARACTER; this.characterName = character != null ? character : Flags.DEFAULT_GAMEOVER_CHARACTER;
this.gameOverSong = gameOverSong != null ? gameOverSong : Constants.DEFAULT_GAMEOVER_SONG; this.gameOverSong = gameOverSong != null ? gameOverSong : Flags.DEFAULT_GAMEOVER_SONG;
this.lossSFXName = lossSFX != null ? lossSFX : Constants.DEFAULT_GAMEOVER_LOSS_SFX; this.lossSFXName = lossSFX != null ? lossSFX : Flags.DEFAULT_GAMEOVER_LOSS_SFX;
this.retrySFX = retrySFX != null ? retrySFX : Constants.DEFAULT_GAMEOVER_RETRY_SFX; this.retrySFX = retrySFX != null ? retrySFX : Flags.DEFAULT_GAMEOVER_RETRY_SFX;
} }
public override function create() public override function create()
@@ -128,7 +128,7 @@ class GameOverSubstate extends MusicBeatSubstate
if (!isEnding && ((!lossSFX.playing) || (character.getAnimName() == "firstDeath" && character.isAnimFinished())) && (FlxG.sound.music == null || !FlxG.sound.music.playing)) if (!isEnding && ((!lossSFX.playing) || (character.getAnimName() == "firstDeath" && character.isAnimFinished())) && (FlxG.sound.music == null || !FlxG.sound.music.playing))
{ {
CoolUtil.playMusic(Paths.music(gameOverSong), false, 1, true, Constants.DEFAULT_BPM); CoolUtil.playMusic(Paths.music(gameOverSong), false, 1, true, Flags.DEFAULT_BPM);
beatHit(0); beatHit(0);
} }
} }
+2 -2
View File
@@ -53,7 +53,7 @@ class HealthIcon extends FlxSprite
super(); super();
health = 0.5; health = 0.5;
this.isPlayer = isPlayer; this.isPlayer = isPlayer;
setIcon(char != null ? char : Constants.DEFAULT_CHARACTER); setIcon(char != null ? char : Flags.DEFAULT_CHARACTER);
scrollFactor.set(); scrollFactor.set();
} }
@@ -62,7 +62,7 @@ class HealthIcon extends FlxSprite
if(curCharacter != char || this.width != width || this.height != height) { if(curCharacter != char || this.width != width || this.height != height) {
curCharacter = char; curCharacter = char;
var path = Paths.image('icons/$char'); var path = Paths.image('icons/$char');
if (!Assets.exists(path)) path = Paths.image('icons/' + Constants.DEFAULT_HEALTH_ICON); if (!Assets.exists(path)) path = Paths.image('icons/' + Flags.DEFAULT_HEALTH_ICON);
loadGraphic(path, true, width, height); loadGraphic(path, true, width, height);
+4 -2
View File
@@ -99,6 +99,8 @@ class Note extends FlxSprite
return __customNoteTypeExists[path] = Assets.exists(path); return __customNoteTypeExists[path] = Assets.exists(path);
} }
public static var DEFAULT_NOTE_FIELDS:Array<String> = ["time", "id", "type", "sLen"];
public function new(strumLine:StrumLine, noteData:ChartNote, sustain:Bool = false, sustainLength:Float = 0, sustainOffset:Float = 0, ?prev:Note) public function new(strumLine:StrumLine, noteData:ChartNote, sustain:Bool = false, sustainLength:Float = 0, sustainOffset:Float = 0, ?prev:Note)
{ {
super(); super();
@@ -115,7 +117,7 @@ class Note extends FlxSprite
this.isSustainNote = sustain; this.isSustainNote = sustain;
this.sustainLength = sustainLength; this.sustainLength = sustainLength;
this.strumLine = strumLine; this.strumLine = strumLine;
for(field in Reflect.fields(noteData)) if(!Constants.DEFAULT_NOTE_FIELDS.contains(field)) for(field in Reflect.fields(noteData)) if(!DEFAULT_NOTE_FIELDS.contains(field))
this.extra.set(field, Reflect.field(noteData, field)); this.extra.set(field, Reflect.field(noteData, field));
x += 50; x += 50;
@@ -127,7 +129,7 @@ class Note extends FlxSprite
var customType = Paths.image('game/notes/${this.noteType}'); var customType = Paths.image('game/notes/${this.noteType}');
var event = EventManager.get(NoteCreationEvent).recycle(this, strumID, this.noteType, noteTypeID, PlayState.instance.strumLines.members.indexOf(strumLine), mustPress, var event = EventManager.get(NoteCreationEvent).recycle(this, strumID, this.noteType, noteTypeID, PlayState.instance.strumLines.members.indexOf(strumLine), mustPress,
(this.noteType != null && customTypePathExists(customType)) ? 'game/notes/${this.noteType}' : 'game/notes/default', @:privateAccess strumLine.strumScale * Constants.DEFAULT_NOTE_SCALE, animSuffix); (this.noteType != null && customTypePathExists(customType)) ? 'game/notes/${this.noteType}' : 'game/notes/default', @:privateAccess strumLine.strumScale * Flags.DEFAULT_NOTE_SCALE, animSuffix);
if (PlayState.instance != null) if (PlayState.instance != null)
event = PlayState.instance.gameAndCharsEvent("onNoteCreation", event); event = PlayState.instance.gameAndCharsEvent("onNoteCreation", event);
+1 -1
View File
@@ -12,7 +12,7 @@ class NoteGroup extends FlxTypedGroup<Note> {
/** /**
* How many ms it should show a note before it should be hit * How many ms it should show a note before it should be hit
**/ **/
public var limit:Float = Constants.DEFAULT_NOTE_MS_LIMIT; public var limit:Float = Flags.DEFAULT_NOTE_MS_LIMIT;
/** /**
* Preallocates the members array with nulls, but if theres anything in the array already it clears it * Preallocates the members array with nulls, but if theres anything in the array already it clears it
+39 -38
View File
@@ -61,7 +61,7 @@ class PlayState extends MusicBeatState
/** /**
* The selected difficulty name * The selected difficulty name
*/ */
public static var difficulty:String = Constants.DEFAULT_DIFFICULTY; public static var difficulty:String = Flags.DEFAULT_DIFFICULTY;
/** /**
* Whenever the week is coming from the mods folder or not. * Whenever the week is coming from the mods folder or not.
*/ */
@@ -73,11 +73,11 @@ class PlayState extends MusicBeatState
/** /**
* Whenever the song has been started with opponent mode on. * Whenever the song has been started with opponent mode on.
*/ */
public static var opponentMode:Bool = Constants.DEFAULT_OPPONENT_MODE; public static var opponentMode:Bool = Flags.DEFAULT_OPPONENT_MODE;
/** /**
* Whenever the song has been started with co-op mode on. * Whenever the song has been started with co-op mode on.
*/ */
public static var coopMode:Bool = Constants.DEFAULT_COOP_MODE; public static var coopMode:Bool = Flags.DEFAULT_COOP_MODE;
/** /**
* Script Pack of all the scripts being ran. * Script Pack of all the scripts being ran.
@@ -96,15 +96,15 @@ class PlayState extends MusicBeatState
/** /**
* Game Over Song. (assets/music/gameOver.ogg) * Game Over Song. (assets/music/gameOver.ogg)
*/ */
public var gameOverSong:String = Constants.DEFAULT_GAMEOVER_SONG; public var gameOverSong:String = Flags.DEFAULT_GAMEOVER_SONG;
/** /**
* Game Over Song. (assets/sounds/gameOverSFX.ogg) * Game Over Song. (assets/sounds/gameOverSFX.ogg)
*/ */
public var lossSFX:String = Constants.DEFAULT_GAMEOVER_LOSS_SFX; public var lossSFX:String = Flags.DEFAULT_GAMEOVER_LOSS_SFX;
/** /**
* Game Over End SFX, used when retrying. (assets/sounds/gameOverEnd.ogg) * Game Over End SFX, used when retrying. (assets/sounds/gameOverEnd.ogg)
*/ */
public var retrySFX:String = Constants.DEFAULT_GAMEOVER_RETRY_SFX; public var retrySFX:String = Flags.DEFAULT_GAMEOVER_RETRY_SFX;
/** /**
* Current Stage. * Current Stage.
@@ -209,15 +209,15 @@ class PlayState extends MusicBeatState
/** /**
* Whenever the vocals should be muted when a note is missed. * Whenever the vocals should be muted when a note is missed.
*/ */
public var muteVocalsOnMiss:Bool = Constants.DEFAULT_MUTE_VOCALS_ON_MISS; public var muteVocalsOnMiss:Bool = Flags.DEFAULT_MUTE_VOCALS_ON_MISS;
/** /**
* Whenever the player can press 7, 8 or 9 to access the debug menus. * Whenever the player can press 7, 8 or 9 to access the debug menus.
*/ */
public var canAccessDebugMenus:Bool = Constants.DEFAULT_CAN_ACCESS_DEBUG_MENUS; public var canAccessDebugMenus:Bool = Flags.DEFAULT_CAN_ACCESS_DEBUG_MENUS;
/** /**
* Whether or not to show the secret gitaroo pause. * Whether or not to show the secret gitaroo pause.
*/ */
public var allowGitaroo:Bool = Constants.DEFAULT_GITAROO; public var allowGitaroo:Bool = Flags.DEFAULT_GITAROO;
/** /**
* Whether or not to bop the icons on beat. * Whether or not to bop the icons on beat.
*/ */
@@ -231,15 +231,15 @@ class PlayState extends MusicBeatState
* Interval of cam zooming (beats). * Interval of cam zooming (beats).
* For example: if set to 4, the camera will zoom every 4 beats. * For example: if set to 4, the camera will zoom every 4 beats.
*/ */
public var camZoomingInterval:Int = Constants.DEFAULT_CAM_ZOOM_INTERVAL; public var camZoomingInterval:Int = Flags.DEFAULT_CAM_ZOOM_INTERVAL;
/** /**
* How strong the cam zooms should be (defaults to 1) * How strong the cam zooms should be (defaults to 1)
*/ */
public var camZoomingStrength:Float = Constants.DEFAULT_CAM_ZOOM_STRENGTH; public var camZoomingStrength:Float = Flags.DEFAULT_CAM_ZOOM_STRENGTH;
/** /**
* Maximum amount of zoom for the camera. * Maximum amount of zoom for the camera.
*/ */
public var maxCamZoom:Float = Constants.MAX_CAMERA_ZOOM; public var maxCamZoom:Float = Flags.MAX_CAMERA_ZOOM;
/** /**
* Current song name (lowercase) * Current song name (lowercase)
*/ */
@@ -261,12 +261,12 @@ class PlayState extends MusicBeatState
/** /**
* Current health. Goes from 0 to maxHealth (defaults to 2) * Current health. Goes from 0 to maxHealth (defaults to 2)
*/ */
public var health:Float = Constants.DEFAULT_HEALTH; public var health:Float = 1;
/** /**
* Maximum health the player can have. Defaults to 2. * Maximum health the player can have. Defaults to 2.
*/ */
@:isVar public var maxHealth(get, set):Float = Constants.DEFAULT_MAX_HEALTH; @:isVar public var maxHealth(get, set):Float = Flags.DEFAULT_MAX_HEALTH;
/** /**
* Current combo. * Current combo.
*/ */
@@ -366,25 +366,25 @@ class PlayState extends MusicBeatState
/** /**
* Camera zoom at which the game lerps to. * Camera zoom at which the game lerps to.
*/ */
public var defaultCamZoom:Float = Constants.DEFAULT_CAM_ZOOM; public var defaultCamZoom:Float = Flags.DEFAULT_CAM_ZOOM;
/** /**
* Speed at which the game camera zoom lerps to. * Speed at which the game camera zoom lerps to.
*/ */
public var camGameZoomLerp:Float = Constants.DEFAULT_CAM_ZOOM_LERP; public var camGameZoomLerp:Float = Flags.DEFAULT_CAM_ZOOM_LERP;
/** /**
* Camera zoom at which the hud lerps to. * Camera zoom at which the hud lerps to.
*/ */
public var defaultHudZoom:Float = Constants.DEFAULT_HUD_ZOOM; public var defaultHudZoom:Float = Flags.DEFAULT_HUD_ZOOM;
/** /**
* Speed at which the hud camera zoom lerps to. * Speed at which the hud camera zoom lerps to.
*/ */
public var camHUDZoomLerp:Float = Constants.DEFAULT_HUD_ZOOM_LERP; public var camHUDZoomLerp:Float = Flags.DEFAULT_HUD_ZOOM_LERP;
/** /**
* Zoom for the pixel assets. * Zoom for the pixel assets.
*/ */
public static var daPixelZoom:Float = Constants.PIXEL_ART_SCALE; public static var daPixelZoom:Float = Flags.PIXEL_ART_SCALE;
/** /**
* Whenever the game is currently in a cutscene or not. * Whenever the game is currently in a cutscene or not.
@@ -603,7 +603,7 @@ class PlayState extends MusicBeatState
// CHARACTER INITIALIZATION // CHARACTER INITIALIZATION
#if REGION #if REGION
comboGroup = new RotatingSpriteGroup(FlxG.width * 0.55, (FlxG.height * 0.5) - 60); comboGroup = new RotatingSpriteGroup(FlxG.width * 0.55, (FlxG.height * 0.5) - 60);
comboGroup.maxSize = Constants.DEFAULT_COMBO_GROUP_MAX_SIZE; comboGroup.maxSize = Flags.DEFAULT_COMBO_GROUP_MAX_SIZE;
#end #end
// CAMERA FOLLOW, SCRIPTS & STAGE INITIALIZATION // CAMERA FOLLOW, SCRIPTS & STAGE INITIALIZATION
@@ -611,7 +611,7 @@ class PlayState extends MusicBeatState
camFollow = new FlxObject(0, 0, 2, 2); camFollow = new FlxObject(0, 0, 2, 2);
add(camFollow); add(camFollow);
if (SONG.stage == null || SONG.stage.trim() == "") SONG.stage = Constants.DEFAULT_STAGE; if (SONG.stage == null || SONG.stage.trim() == "") SONG.stage = Flags.DEFAULT_STAGE;
add(stage = new Stage(SONG.stage)); add(stage = new Stage(SONG.stage));
if (!chartingMode || Options.charterEnablePlaytestScripts) { if (!chartingMode || Options.charterEnablePlaytestScripts) {
@@ -721,7 +721,7 @@ class PlayState extends MusicBeatState
// HUD INITIALIZATION & CAMERA INITIALIZATION // HUD INITIALIZATION & CAMERA INITIALIZATION
#if REGION #if REGION
var event = EventManager.get(AmountEvent).recycle(Constants.DEFAULT_STRUM_AMOUNT); var event = EventManager.get(AmountEvent).recycle(Flags.DEFAULT_STRUM_AMOUNT);
if (!gameAndCharsEvent("onPreGenerateStrums", event).cancelled) { if (!gameAndCharsEvent("onPreGenerateStrums", event).cancelled) {
generateStrums(event.amount); generateStrums(event.amount);
gameAndCharsEvent("onPostGenerateStrums", event); gameAndCharsEvent("onPostGenerateStrums", event);
@@ -730,7 +730,7 @@ class PlayState extends MusicBeatState
for(str in strumLines) for(str in strumLines)
str.generate(str.data, (chartingMode && Charter.startHere) ? Charter.startTime : null); str.generate(str.data, (chartingMode && Charter.startHere) ? Charter.startTime : null);
FlxG.camera.follow(camFollow, LOCKON, Constants.DEFAULT_CAMERA_FOLLOW_SPEED); FlxG.camera.follow(camFollow, LOCKON, Flags.DEFAULT_CAMERA_FOLLOW_SPEED);
FlxG.camera.zoom = defaultCamZoom; FlxG.camera.zoom = defaultCamZoom;
// camHUD.zoom = defaultHudZoom; // camHUD.zoom = defaultHudZoom;
@@ -759,10 +759,11 @@ class PlayState extends MusicBeatState
healthBar.createFilledBar(leftColor, rightColor); healthBar.createFilledBar(leftColor, rightColor);
add(healthBar); add(healthBar);
health = maxHealth / 2; if (Flags.DEFAULT_HEALTH != null) health = Flags.DEFAULT_HEALTH;
else health = maxHealth / 2;
iconP1 = new HealthIcon(boyfriend != null ? boyfriend.getIcon() : Constants.DEFAULT_HEALTH_ICON, true); iconP1 = new HealthIcon(boyfriend != null ? boyfriend.getIcon() : Flags.DEFAULT_HEALTH_ICON, true);
iconP2 = new HealthIcon(dad != null ? dad.getIcon() : Constants.DEFAULT_HEALTH_ICON, false); iconP2 = new HealthIcon(dad != null ? dad.getIcon() : Flags.DEFAULT_HEALTH_ICON, false);
for(icon in [iconP1, iconP2]) { for(icon in [iconP1, iconP2]) {
icon.y = healthBar.y - (icon.height / 2); icon.y = healthBar.y - (icon.height / 2);
add(icon); add(icon);
@@ -799,7 +800,7 @@ class PlayState extends MusicBeatState
FlxG.sound.load(Paths.sound(s)); FlxG.sound.load(Paths.sound(s));
if (chartingMode) { if (chartingMode) {
WindowUtils.prefix = Charter.undos.unsaved ? Constants.UNDO_PREFIX : ""; WindowUtils.prefix = Charter.undos.unsaved ? Flags.UNDO_PREFIX : "";
WindowUtils.suffix = " (Chart Playtesting)"; WindowUtils.suffix = " (Chart Playtesting)";
SaveWarning.showWarning = Charter.undos.unsaved; SaveWarning.showWarning = Charter.undos.unsaved;
@@ -855,7 +856,7 @@ class PlayState extends MusicBeatState
inCutscene = true; inCutscene = true;
var videoCutscene = Paths.video('$songName-${prefix}cutscene'); var videoCutscene = Paths.video('$songName-${prefix}cutscene');
var videoCutsceneAlt = Paths.file('songs/$songName/${prefix}cutscene.${Constants.VIDEO_EXT}'); var videoCutsceneAlt = Paths.file('songs/$songName/${prefix}cutscene.${Flags.VIDEO_EXT}');
var dialogue = Paths.file('songs/$songName/${prefix}dialogue.xml'); var dialogue = Paths.file('songs/$songName/${prefix}dialogue.xml');
persistentUpdate = true; persistentUpdate = true;
var toCall:Void->Void = function() { var toCall:Void->Void = function() {
@@ -1169,7 +1170,7 @@ class PlayState extends MusicBeatState
paused = true; paused = true;
// 1 / 1000 chance for Gitaroo Man easter egg // 1 / 1000 chance for Gitaroo Man easter egg
if (allowGitaroo && FlxG.random.bool(Constants.GITAROO_CHANCE)) if (allowGitaroo && FlxG.random.bool(Flags.GITAROO_CHANCE))
{ {
// gitaroo man easter egg // gitaroo man easter egg
FlxG.switchState(new GitarooPause()); FlxG.switchState(new GitarooPause());
@@ -1226,7 +1227,7 @@ class PlayState extends MusicBeatState
} }
function updateIconPositions() { function updateIconPositions() {
var iconOffset:Int = Constants.ICON_OFFSET; var iconOffset = Flags.ICON_OFFSET;
var center:Float = healthBar.x + healthBar.width * FlxMath.remapToRange(healthBar.percent, 0, 100, 1, 0); var center:Float = healthBar.x + healthBar.width * FlxMath.remapToRange(healthBar.percent, 0, 100, 1, 0);
@@ -1283,7 +1284,7 @@ class PlayState extends MusicBeatState
} }
if (doIconBop) { if (doIconBop) {
var iconLerp = Constants.ICON_LERP; var iconLerp = Flags.ICON_LERP;
iconP1.scale.set(lerp(iconP1.scale.x, 1, iconLerp), lerp(iconP1.scale.y, 1, iconLerp)); iconP1.scale.set(lerp(iconP1.scale.x, 1, iconLerp), lerp(iconP1.scale.y, 1, iconLerp));
iconP2.scale.set(lerp(iconP2.scale.x, 1, iconLerp), lerp(iconP2.scale.y, 1, iconLerp)); iconP2.scale.set(lerp(iconP2.scale.x, 1, iconLerp), lerp(iconP2.scale.y, 1, iconLerp));
@@ -1304,7 +1305,7 @@ class PlayState extends MusicBeatState
var instTime = FlxG.sound.music.time; var instTime = FlxG.sound.music.time;
var isOffsync = vocals.time != instTime || [for(strumLine in strumLines.members) strumLine.vocals.time != instTime].contains(true); var isOffsync = vocals.time != instTime || [for(strumLine in strumLines.members) strumLine.vocals.time != instTime].contains(true);
__vocalOffsetViolation = Math.max(0, __vocalOffsetViolation + (isOffsync ? elapsed : -elapsed / 2)); __vocalOffsetViolation = Math.max(0, __vocalOffsetViolation + (isOffsync ? elapsed : -elapsed / 2));
if (__vocalOffsetViolation > Constants.VOCAL_OFFSET_VIOLATION_THRESHOLD) { if (__vocalOffsetViolation > Flags.VOCAL_OFFSET_VIOLATION_THRESHOLD) {
resyncVocals(); resyncVocals();
__vocalOffsetViolation = 0; __vocalOffsetViolation = 0;
} }
@@ -1444,7 +1445,7 @@ class PlayState extends MusicBeatState
charToUse == null ? 0 : charToUse.x, charToUse == null ? 0 : charToUse.x,
charToUse == null ? 0 : charToUse.y, charToUse == null ? 0 : charToUse.y,
charToUse, charToUse,
deathCharID.getDefault(charToUse != null ? charToUse.gameOverCharacter : Constants.DEFAULT_GAMEOVER_CHARACTER), deathCharID.getDefault(charToUse != null ? charToUse.gameOverCharacter : Flags.DEFAULT_GAMEOVER_CHARACTER),
charToUse != null ? charToUse.isPlayer : true, charToUse != null ? charToUse.isPlayer : true,
gameOverSong.getDefault(this.gameOverSong), gameOverSong.getDefault(this.gameOverSong),
lossSFX.getDefault(this.lossSFX), lossSFX.getDefault(this.lossSFX),
@@ -1840,13 +1841,13 @@ class PlayState extends MusicBeatState
if (camZoomingInterval < 1) camZoomingInterval = 1; if (camZoomingInterval < 1) camZoomingInterval = 1;
if (Options.camZoomOnBeat && camZooming && FlxG.camera.zoom < maxCamZoom && curBeat % camZoomingInterval == 0) if (Options.camZoomOnBeat && camZooming && FlxG.camera.zoom < maxCamZoom && curBeat % camZoomingInterval == 0)
{ {
FlxG.camera.zoom += Constants.CAM_BOP_STRENGTH * camZoomingStrength; FlxG.camera.zoom += Flags.CAM_BOP_STRENGTH * camZoomingStrength;
camHUD.zoom += Constants.HUD_BOP_STRENGTH * camZoomingStrength; camHUD.zoom += Flags.HUD_BOP_STRENGTH * camZoomingStrength;
} }
if (doIconBop) if (doIconBop)
{ {
var iconScale = Constants.BOP_ICON_SCALE; var iconScale = Flags.BOP_ICON_SCALE;
iconP1.scale.set(iconScale, iconScale); iconP1.scale.set(iconScale, iconScale);
iconP2.scale.set(iconScale, iconScale); iconP2.scale.set(iconScale, iconScale);
@@ -1937,7 +1938,7 @@ class PlayState extends MusicBeatState
* @param difficulty Week Difficulty * @param difficulty Week Difficulty
*/ */
public static function loadWeek(weekData:WeekData, ?difficulty:String) { public static function loadWeek(weekData:WeekData, ?difficulty:String) {
if (difficulty == null) difficulty = Constants.DEFAULT_DIFFICULTY; if (difficulty == null) difficulty = Flags.DEFAULT_DIFFICULTY;
storyWeek = weekData; storyWeek = weekData;
storyPlaylist = [for(e in weekData.songs) e.name]; storyPlaylist = [for(e in weekData.songs) e.name];
isStoryMode = true; isStoryMode = true;
@@ -1958,7 +1959,7 @@ class PlayState extends MusicBeatState
* @param coopMode Whenever co-op mode is on. * @param coopMode Whenever co-op mode is on.
*/ */
public static function loadSong(_name:String, ?_difficulty:String, _opponentMode:Bool = false, _coopMode:Bool = false) { public static function loadSong(_name:String, ?_difficulty:String, _opponentMode:Bool = false, _coopMode:Bool = false) {
if (_difficulty == null) difficulty = Constants.DEFAULT_DIFFICULTY; if (_difficulty == null) difficulty = Flags.DEFAULT_DIFFICULTY;
isStoryMode = false; isStoryMode = false;
opponentMode = _opponentMode; opponentMode = _opponentMode;
chartingMode = false; chartingMode = false;
+1 -1
View File
@@ -42,7 +42,7 @@ class SplashGroup extends FlxTypedGroup<FunkinSprite> {
Logs.trace('Couldn\'t parse splash data for "${path}": ${e.toString()}', ERROR); Logs.trace('Couldn\'t parse splash data for "${path}": ${e.toString()}', ERROR);
valid = false; valid = false;
} }
maxSize = Constants.MAX_SPLASHES; maxSize = Flags.MAX_SPLASHES;
} }
function createSplash(imagePath:String) { function createSplash(imagePath:String) {
+1 -1
View File
@@ -50,7 +50,7 @@ class SplashHandler extends FlxTypedGroup<FunkinSprite> {
add(event.splash); add(event.splash);
// max 8 rendered splashes // max 8 rendered splashes
while(members.length > Constants.MAX_SPLASHES) while(members.length > Flags.MAX_SPLASHES)
remove(members[0], true); remove(members[0], true);
} }
} }
+3 -3
View File
@@ -157,7 +157,7 @@ class StrumLine extends FlxTypedGroup<Strum> {
/*var limit = FlxG.height / 0.45; /*var limit = FlxG.height / 0.45;
notes.limit = limit / scrollSpeed; notes.limit = limit / scrollSpeed;
OR OR
notes.limit = Constants.DEFAULT_NOTE_MS_LIMIT / scrollSpeed;*/ notes.limit = Flags.DEFAULT_NOTE_MS_LIMIT / scrollSpeed;*/
} }
public override function update(elapsed:Float) { public override function update(elapsed:Float) {
@@ -295,7 +295,7 @@ class StrumLine extends FlxTypedGroup<Strum> {
PlayState.instance.health += health * (opponentSide ? -1 : 1); PlayState.instance.health += health * (opponentSide ? -1 : 1);
public inline function generateStrums(amount:Int = -1) { public inline function generateStrums(amount:Int = -1) {
if(amount == -1) amount = Constants.DEFAULT_STRUM_AMOUNT; if(amount == -1) amount = Flags.DEFAULT_STRUM_AMOUNT;
for (i in 0...amount) for (i in 0...amount)
add(createStrum(i)); add(createStrum(i));
} }
@@ -333,7 +333,7 @@ class StrumLine extends FlxTypedGroup<Strum> {
babyArrow.animation.addByPrefix('red', 'arrowRIGHT'); babyArrow.animation.addByPrefix('red', 'arrowRIGHT');
babyArrow.antialiasing = true; babyArrow.antialiasing = true;
babyArrow.setGraphicSize(Std.int((babyArrow.width * Constants.DEFAULT_NOTE_SCALE) * strumScale)); babyArrow.setGraphicSize(Std.int((babyArrow.width * Flags.DEFAULT_NOTE_SCALE) * strumScale));
babyArrow.animation.addByPrefix('static', 'arrow${event.animPrefix.toUpperCase()}'); babyArrow.animation.addByPrefix('static', 'arrow${event.animPrefix.toUpperCase()}');
babyArrow.animation.addByPrefix('pressed', '${event.animPrefix} press', 24, false); babyArrow.animation.addByPrefix('pressed', '${event.animPrefix} press', 24, false);
+1 -1
View File
@@ -28,7 +28,7 @@ class Cutscene extends MusicBeatSubstate {
__callback = callback; __callback = callback;
__pausable = allowPause; __pausable = allowPause;
pauseItems = Constants.DEFAULT_CUTSCENE_PAUSE_ITEMS; pauseItems = Flags.DEFAULT_CUTSCENE_PAUSE_ITEMS;
skippable = canSkip; skippable = canSkip;
} }
-1
View File
@@ -23,7 +23,6 @@ import flixel.tweens.FlxEase;
import flixel.util.FlxDestroyUtil; import flixel.util.FlxDestroyUtil;
import funkin.backend.system.Flags; import funkin.backend.system.Flags;
import funkin.Constants;
import funkin.menus.ui.Alphabet; import funkin.menus.ui.Alphabet;
import flixel.group.FlxGroup.FlxTypedGroup; import flixel.group.FlxGroup.FlxTypedGroup;
+1 -1
View File
@@ -19,7 +19,7 @@ class BetaWarningState extends MusicBeatState {
disclaimer = new FunkinText(16, titleAlphabet.y + titleAlphabet.height + 10, FlxG.width - 32, "", 32); disclaimer = new FunkinText(16, titleAlphabet.y + titleAlphabet.height + 10, FlxG.width - 32, "", 32);
disclaimer.alignment = CENTER; disclaimer.alignment = CENTER;
disclaimer.applyMarkup('This engine is still in a *${Constants.RELEASE_CYCLE}* state. That means *majority of the features* are either *buggy* or *non finished*. If you find any bugs, please report them to the Codename Engine GitHub.\n\nPress ENTER to continue', disclaimer.applyMarkup('This engine is still in a *${Flags.RELEASE_CYCLE}* state. That means *majority of the features* are either *buggy* or *non finished*. If you find any bugs, please report them to the Codename Engine GitHub.\n\nPress ENTER to continue',
[ [
new FlxTextFormatMarkerPair(new FlxTextFormat(0xFFFF4444), "*") new FlxTextFormatMarkerPair(new FlxTextFormat(0xFFFF4444), "*")
] ]
+1 -1
View File
@@ -456,7 +456,7 @@ class FreeplaySonglist {
if (songsFound.length > 0) { if (songsFound.length > 0) {
for(s in songsFound) for(s in songsFound)
songs.push(Chart.loadChartMeta(s, Constants.DEFAULT_DIFFICULTY, source == MODS)); songs.push(Chart.loadChartMeta(s, Flags.DEFAULT_DIFFICULTY, source == MODS));
return false; return false;
} }
return true; return true;
+2 -2
View File
@@ -24,7 +24,7 @@ class MainMenuState extends MusicBeatState
var camFollow:FlxObject; var camFollow:FlxObject;
var versionText:FunkinText; var versionText:FunkinText;
public var canAccessDebugMenus:Bool = Constants.DEFAULT_CAN_ACCESS_DEBUG_MENUS; public var canAccessDebugMenus:Bool = Flags.DEFAULT_CAN_ACCESS_DEBUG_MENUS;
override function create() override function create()
{ {
@@ -72,7 +72,7 @@ class MainMenuState extends MusicBeatState
FlxG.camera.follow(camFollow, null, 0.06); FlxG.camera.follow(camFollow, null, 0.06);
versionText = new FunkinText(5, FlxG.height - 2, 0, '${Constants.VERSION_MESSAGE}\n${Constants.COMMIT_MESSAGE}\n[${controls.getKeyName(SWITCHMOD)}] Open Mods menu\n'); versionText = new FunkinText(5, FlxG.height - 2, 0, '${Flags.VERSION_MESSAGE}\n${Flags.COMMIT_MESSAGE}\n[${controls.getKeyName(SWITCHMOD)}] Open Mods menu\n');
versionText.y -= versionText.height; versionText.y -= versionText.height;
versionText.scrollFactor.set(); versionText.scrollFactor.set();
add(versionText); add(versionText);
+1 -1
View File
@@ -36,7 +36,7 @@ class PauseSubState extends MusicBeatSubstate
public function new(?items:Array<String>, ?selectCall:NameEvent->Void) { public function new(?items:Array<String>, ?selectCall:NameEvent->Void) {
super(); super();
menuItems = items != null ? items : Constants.DEFAULT_PAUSE_ITEMS; menuItems = items != null ? items : Flags.DEFAULT_PAUSE_ITEMS;
this.selectCall = selectCall; this.selectCall = selectCall;
} }
@@ -57,8 +57,8 @@ class CreditsCodename extends funkin.options.OptionsScreen {
var text:String = parent.treeParent.pathDesc.text; var text:String = parent.treeParent.pathDesc.text;
parent.treeParent.pathDesc.text = ""; parent.treeParent.pathDesc.text = "";
parent.treeParent.pathDesc.applyMarkup(text, contribFormats = [ parent.treeParent.pathDesc.applyMarkup(text, contribFormats = [
new FlxTextFormatMarkerPair(new FlxTextFormat(Constants.MAIN_DEVS_COLOR), '*'), new FlxTextFormatMarkerPair(new FlxTextFormat(Flags.MAIN_DEVS_COLOR), '*'),
new FlxTextFormatMarkerPair(new FlxTextFormat(FlxColor.interpolate(Constants.MIN_CONTRIBUTIONS_COLOR, Constants.MAIN_DEVS_COLOR, Options.contributors[curSelected].contributions / totalContributions)), '~') new FlxTextFormatMarkerPair(new FlxTextFormat(FlxColor.interpolate(Flags.MIN_CONTRIBUTIONS_COLOR, Flags.MAIN_DEVS_COLOR, Options.contributors[curSelected].contributions / totalContributions)), '~')
]); ]);
} }
@@ -73,7 +73,7 @@ class CreditsCodename extends funkin.options.OptionsScreen {
Options.lastUpdated = curTime; Options.lastUpdated = curTime;
error = false; error = false;
var idk = GitHub.getContributors(Constants.REPO_OWNER, Constants.REPO_NAME, function(e) { var idk = GitHub.getContributors(Flags.REPO_OWNER, Flags.REPO_NAME, function(e) {
error = true; error = true;
var errMsg:String = 'Error while trying to download contributors list:\n${CoolUtil.removeIP(e.message)}'; var errMsg:String = 'Error while trying to download contributors list:\n${CoolUtil.removeIP(e.message)}';
Logs.traceColored([Logs.logText(errMsg.replace('\n', ' '), RED)], ERROR); Logs.traceColored([Logs.logText(errMsg.replace('\n', ' '), RED)], ERROR);
@@ -84,9 +84,9 @@ class CreditsCodename extends funkin.options.OptionsScreen {
Logs.trace('[CreditsCodename] Contributors list Updated!', VERBOSE); Logs.trace('[CreditsCodename] Contributors list Updated!', VERBOSE);
var errorOnMain:Bool = false; var errorOnMain:Bool = false;
var idk2 = GitHub.getOrganizationMembers(Constants.REPO_OWNER, function(e) { var idk2 = GitHub.getOrganizationMembers(Flags.REPO_OWNER, function(e) {
errorOnMain = true; errorOnMain = true;
var errMsg:String = 'Error while trying to download ${Constants.REPO_OWNER} members list:\n${CoolUtil.removeIP(e.message)}'; var errMsg:String = 'Error while trying to download ${Flags.REPO_OWNER} members list:\n${CoolUtil.removeIP(e.message)}';
Logs.traceColored([Logs.logText(errMsg.replace('\n', ' '), RED)], ERROR); Logs.traceColored([Logs.logText(errMsg.replace('\n', ' '), RED)], ERROR);
funkin.backend.utils.NativeAPI.showMessageBox("Codename Engine Warning", errMsg, MSG_WARNING); funkin.backend.utils.NativeAPI.showMessageBox("Codename Engine Warning", errMsg, MSG_WARNING);
}); });
@@ -114,7 +114,7 @@ class CreditsCodename extends funkin.options.OptionsScreen {
var opt:GithubIconOption = new GithubIconOption(c, 'Total Contributions: ~${c.contributions}~ / *${totalContributions}* (~${FlxMath.roundDecimal(c.contributions / totalContributions * 100, 2)}%~) - Select to open GitHub account'); var opt:GithubIconOption = new GithubIconOption(c, 'Total Contributions: ~${c.contributions}~ / *${totalContributions}* (~${FlxMath.roundDecimal(c.contributions / totalContributions * 100, 2)}%~) - Select to open GitHub account');
if(Options.mainDevs.contains(c.id)) { if(Options.mainDevs.contains(c.id)) {
opt.desc += " *- Public member of the main Devs!*"; opt.desc += " *- Public member of the main Devs!*";
@:privateAccess opt.__text.color = Constants.MAIN_DEVS_COLOR; @:privateAccess opt.__text.color = Flags.MAIN_DEVS_COLOR;
} }
add(opt); add(opt);
} }
+1 -1
View File
@@ -162,7 +162,7 @@ class Alphabet extends FlxSpriteGroup
splitWords = _finalText.split(""); splitWords = _finalText.split("");
} }
//public var personTalking:String = Constants.DEFAULT_GIRLFRIEND; //public var personTalking:String = Flags.DEFAULT_GIRLFRIEND;
public function startTypedText():Void public function startTypedText():Void
{ {