Merge remote-tracking branch 'upstream/main' into new-editors-main
# Conflicts: # commandline/commands/Compiler.hx # source/funkin/backend/FunkinSprite.hx # source/funkin/backend/MusicBeatState.hx # source/funkin/backend/MusicBeatSubstate.hx # source/funkin/backend/chart/Chart.hx # source/funkin/backend/chart/EventsData.hx # source/funkin/backend/scripting/GlobalScript.hx # source/funkin/backend/system/Controls.hx # source/funkin/backend/system/MainState.hx # source/funkin/backend/utils/AudioAnalyzer.hx # source/funkin/backend/utils/CoolUtil.hx # source/funkin/editors/character/CharacterInfoScreen.hx # source/funkin/editors/charter/Charter.hx # source/funkin/editors/charter/CharterSelection.hx # source/funkin/editors/charter/CharterStrumline.hx # source/funkin/editors/charter/CharterStrumlineButton.hx # source/funkin/editors/charter/SongCreationScreen.hx # source/funkin/editors/ui/UIDropDown.hx # source/funkin/editors/ui/UIFileExplorer.hx # source/funkin/game/Note.hx # source/funkin/game/PlayState.hx # source/funkin/game/SplashGroup.hx # source/funkin/game/Stage.hx # source/funkin/game/Strum.hx # source/funkin/menus/FreeplayState.hx # source/funkin/options/Options.hx # source/funkin/options/keybinds/KeybindsOptions.hx
This commit is contained in:
@@ -1,57 +0,0 @@
|
||||
package funkin.menus;
|
||||
|
||||
import flixel.text.FlxText;
|
||||
import flixel.util.FlxColor;
|
||||
import funkin.backend.FunkinText;
|
||||
|
||||
class BetaWarningState extends MusicBeatState {
|
||||
var titleAlphabet:Alphabet;
|
||||
var disclaimer:FunkinText;
|
||||
|
||||
var transitioning:Bool = false;
|
||||
|
||||
public override function create() {
|
||||
super.create();
|
||||
|
||||
titleAlphabet = new Alphabet(0, 0, "WARNING", true);
|
||||
titleAlphabet.screenCenter(X);
|
||||
add(titleAlphabet);
|
||||
|
||||
disclaimer = new FunkinText(16, titleAlphabet.y + titleAlphabet.height + 10, FlxG.width - 32, "", 32);
|
||||
disclaimer.alignment = CENTER;
|
||||
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), "*")
|
||||
]
|
||||
);
|
||||
add(disclaimer);
|
||||
|
||||
var off = Std.int((FlxG.height - (disclaimer.y + disclaimer.height)) / 2);
|
||||
disclaimer.y += off;
|
||||
titleAlphabet.y += off;
|
||||
|
||||
DiscordUtil.call("onMenuLoaded", ["Beta Warning"]);
|
||||
}
|
||||
|
||||
public override function update(elapsed:Float) {
|
||||
super.update(elapsed);
|
||||
|
||||
if (controls.ACCEPT && transitioning) {
|
||||
FlxG.camera.stopFX(); FlxG.camera.visible = false;
|
||||
goToTitle();
|
||||
}
|
||||
|
||||
if (controls.ACCEPT && !transitioning) {
|
||||
transitioning = true;
|
||||
CoolUtil.playMenuSFX(CONFIRM);
|
||||
FlxG.camera.flash(FlxColor.WHITE, 1, function() {
|
||||
FlxG.camera.fade(FlxColor.BLACK, 2.5, false, goToTitle);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private function goToTitle() {
|
||||
MusicBeatState.skipTransIn = MusicBeatState.skipTransOut = true;
|
||||
FlxG.switchState(new TitleState());
|
||||
}
|
||||
}
|
||||
@@ -139,6 +139,8 @@ class FreeplayState extends MusicBeatState
|
||||
|
||||
var icon:HealthIcon = new HealthIcon(songs[i].icon);
|
||||
icon.sprTracker = songText;
|
||||
icon.setUnstretchedGraphicSize(150, 150, true);
|
||||
icon.updateHitbox();
|
||||
|
||||
// using a FlxGroup is too much fuss!
|
||||
iconArray.push(icon);
|
||||
@@ -234,7 +236,7 @@ class FreeplayState extends MusicBeatState
|
||||
scoreText.x = coopText.x = scoreBG.x + 4;
|
||||
diffText.x = Std.int(scoreBG.x + ((scoreBG.width - diffText.width) / 2));
|
||||
|
||||
interpColor.fpsLerpTo(songs[curSelected].parsedColor, 0.0625);
|
||||
interpColor.fpsLerpTo(songs[curSelected].color, 0.0625);
|
||||
bg.color = interpColor.color;
|
||||
|
||||
#if PRELOAD_ALL
|
||||
@@ -320,10 +322,9 @@ class FreeplayState extends MusicBeatState
|
||||
}
|
||||
|
||||
public function convertChart() {
|
||||
var curSong = songs[curSelected];
|
||||
trace('Converting ${curSong.name} (${curSong.difficulties[curDifficulty]}) to Codename format...');
|
||||
var chart = Chart.parse(curSong.name, curSong.difficulties[curDifficulty]);
|
||||
Chart.save('${Main.pathBack}assets/songs/${curSong.name}', chart, curSong.difficulties[curDifficulty].toLowerCase());
|
||||
trace('Converting ${songs[curSelected].name} (${songs[curSelected].difficulties[curDifficulty]}) to Codename format...');
|
||||
var chart = Chart.parse(songs[curSelected].name, songs[curSelected].difficulties[curDifficulty]);
|
||||
Chart.save('${Main.pathBack}assets/songs/${songs[curSelected].name}', chart, songs[curSelected].difficulties[curDifficulty]);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -346,9 +347,9 @@ class FreeplayState extends MusicBeatState
|
||||
updateScore();
|
||||
|
||||
if (curSong.difficulties.length > 1)
|
||||
diffText.text = '< ${curSong.difficulties[curDifficulty]} >';
|
||||
diffText.text = '< ${curSong.difficulties[curDifficulty].toUpperCase()} >';
|
||||
else
|
||||
diffText.text = validDifficulties ? curSong.difficulties[curDifficulty] : "-";
|
||||
diffText.text = validDifficulties ? curSong.difficulties[curDifficulty].toUpperCase() : "-";
|
||||
}
|
||||
|
||||
function updateScore() {
|
||||
@@ -453,16 +454,10 @@ class FreeplaySonglist {
|
||||
|
||||
public function getSongsFromSource(source:funkin.backend.assets.AssetsLibraryList.AssetSource, useTxt:Bool = true) {
|
||||
var path:String = Paths.txt('freeplaySonglist');
|
||||
var songsFound:Array<String> = [];
|
||||
if (useTxt && Paths.assetsTree.existsSpecific(path, "TEXT", source)) {
|
||||
songsFound = CoolUtil.coolTextFile(Paths.txt('freeplaySonglist'));
|
||||
} else {
|
||||
songsFound = Paths.getFolderDirectories('songs', false, source);
|
||||
}
|
||||
var songsFound:Array<String> = useTxt && Paths.assetsTree.existsSpecific(path, "TEXT", source) ? CoolUtil.coolTextFile(path) : Paths.getFolderDirectories('songs', false, source);
|
||||
|
||||
if (songsFound.length > 0) {
|
||||
for(s in songsFound)
|
||||
songs.push(Chart.loadChartMeta(s, Flags.DEFAULT_DIFFICULTY, source == MODS));
|
||||
for (s in songsFound) songs.push(Chart.loadChartMeta(s, Flags.DEFAULT_DIFFICULTY, source == MODS));
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@@ -485,4 +480,4 @@ class FreeplaySonglist {
|
||||
|
||||
return songList;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,9 +64,7 @@ class GitarooPause extends MusicBeatState
|
||||
}
|
||||
else
|
||||
{
|
||||
PlayState.resetSongInfos();
|
||||
if (Charter.instance != null) Charter.instance.__clearStatics();
|
||||
|
||||
FlxG.switchState(new MainMenuState());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,7 +92,7 @@ class MainMenuState extends MusicBeatState
|
||||
if (!selectedSomethin)
|
||||
{
|
||||
if (canAccessDebugMenus) {
|
||||
if (FlxG.keys.justPressed.SEVEN) {
|
||||
if (controls.DEV_ACCESS) {
|
||||
persistentUpdate = false;
|
||||
persistentDraw = true;
|
||||
openSubState(new funkin.editors.EditorPicker());
|
||||
|
||||
@@ -12,9 +12,15 @@ class ModSwitchMenu extends MusicBeatSubstate {
|
||||
var alphabets:FlxTypedGroup<Alphabet>;
|
||||
var curSelected:Int = 0;
|
||||
|
||||
var subCam:FlxCamera;
|
||||
|
||||
public override function create() {
|
||||
super.create();
|
||||
|
||||
camera = subCam = new FlxCamera();
|
||||
subCam.bgColor = 0;
|
||||
FlxG.cameras.add(subCam, false);
|
||||
|
||||
var bg = new FlxSprite(0, 0).makeSolid(FlxG.width, FlxG.height, 0xFF000000);
|
||||
bg.updateHitbox();
|
||||
bg.scrollFactor.set();
|
||||
@@ -66,5 +72,12 @@ class ModSwitchMenu extends MusicBeatSubstate {
|
||||
}
|
||||
alphabets.members[curSelected].alpha = 1;
|
||||
}
|
||||
|
||||
override function destroy() {
|
||||
super.destroy();
|
||||
|
||||
if (FlxG.cameras.list.contains(subCam))
|
||||
FlxG.cameras.remove(subCam);
|
||||
}
|
||||
}
|
||||
#end
|
||||
|
||||
@@ -165,7 +165,6 @@ class PauseSubState extends MusicBeatSubstate
|
||||
if (PlayState.chartingMode && Charter.undos.unsaved)
|
||||
game.saveWarn(false);
|
||||
else {
|
||||
PlayState.resetSongInfos();
|
||||
if (Charter.instance != null) Charter.instance.__clearStatics();
|
||||
|
||||
// prevents certain notes to disappear early when exiting - Nex
|
||||
|
||||
@@ -5,17 +5,20 @@ import flixel.text.FlxText;
|
||||
import flixel.tweens.FlxTween;
|
||||
import flixel.util.FlxColor;
|
||||
import flixel.util.FlxTimer;
|
||||
import flixel.util.typeLimit.OneOfTwo;
|
||||
import funkin.backend.FunkinText;
|
||||
import funkin.backend.scripting.events.CancellableEvent;
|
||||
import funkin.backend.scripting.events.menu.MenuChangeEvent;
|
||||
import funkin.backend.scripting.events.menu.storymenu.*;
|
||||
import funkin.backend.scripting.events.CancellableEvent;
|
||||
import funkin.backend.week.*;
|
||||
import funkin.savedata.FunkinSave;
|
||||
import haxe.io.Path;
|
||||
import haxe.xml.Access;
|
||||
|
||||
class StoryMenuState extends MusicBeatState {
|
||||
public var characters:Map<String, Access> = [];
|
||||
public var characters:Map<String, WeekData.WeekCharacter> = [];
|
||||
public var weeks:Array<WeekData> = [];
|
||||
public var weekList:StoryWeeklist;
|
||||
|
||||
// yes it supports parameters - Nex
|
||||
public var scoreMessage:String = "WEEK SCORE:{0}";
|
||||
@@ -33,7 +36,6 @@ class StoryMenuState extends MusicBeatState {
|
||||
public var blackBar:FlxSprite;
|
||||
|
||||
public var weekBG:FlxSprite;
|
||||
public var defColor:String = "#F9CF51";
|
||||
public var interpColor:FlxInterpolateColor;
|
||||
|
||||
public var lerpScore:Float = 0;
|
||||
@@ -64,7 +66,7 @@ class StoryMenuState extends MusicBeatState {
|
||||
weekTitle.alpha = 0.7;
|
||||
|
||||
weekBG = new FlxSprite(0, 56).makeSolid(FlxG.width, 400, 0xFFFFFFFF);
|
||||
weekBG.color = weeks.length > 0 ? weeks[0].bgColor : FlxColor.fromString(defColor);
|
||||
weekBG.color = weeks.length > 0 ? weeks[0].bgColor : Flags.DEFAULT_WEEK_COLOR;
|
||||
weekBG.updateHitbox();
|
||||
|
||||
weekSprites = new FlxTypedGroup<MenuItem>();
|
||||
@@ -92,19 +94,18 @@ class StoryMenuState extends MusicBeatState {
|
||||
tracklist.color = 0xFFE55777;
|
||||
|
||||
add(weekSprites);
|
||||
for(e in [blackBar, scoreText, weekTitle, weekBG, tracklist]) {
|
||||
e.antialiasing = true;
|
||||
for (e in [blackBar, scoreText, weekTitle, weekBG, tracklist]) {
|
||||
e.scrollFactor.set();
|
||||
add(e);
|
||||
}
|
||||
|
||||
add(characterSprites = new FlxTypedGroup<FunkinSprite>());
|
||||
|
||||
for(i=>week in weeks) {
|
||||
for (i=>week in weeks) {
|
||||
var spr:MenuItem = new MenuItem(0, (i * 120) + 480, 'menus/storymenu/weeks/${week.sprite}');
|
||||
weekSprites.add(spr);
|
||||
|
||||
for(e in week.difficulties) {
|
||||
for (e in week.difficulties) {
|
||||
var le = e.toLowerCase();
|
||||
if (difficultySprites[le] == null) {
|
||||
var diffSprite = new FlxSprite(leftArrow.x + leftArrow.width, leftArrow.y);
|
||||
@@ -163,6 +164,12 @@ class StoryMenuState extends MusicBeatState {
|
||||
weekBG.color = interpColor.color;
|
||||
}
|
||||
|
||||
public override function beatHit(curBeat:Int) {
|
||||
super.beatHit(curBeat);
|
||||
if (characterSprites != null) // reason why I wanted to use a MusicBeatGroup, but eh, whatever - Nex
|
||||
characterSprites.forEachAlive(function(spr) spr.beatHit(curBeat));
|
||||
}
|
||||
|
||||
public function goBack() {
|
||||
var event = event("onGoBack", new CancellableEvent());
|
||||
if (!event.cancelled)
|
||||
@@ -181,13 +188,16 @@ class StoryMenuState extends MusicBeatState {
|
||||
e.targetY = k - curWeek;
|
||||
e.alpha = k == curWeek ? 1.0 : 0.6;
|
||||
}
|
||||
tracklist.text = 'TRACKS\n\n${[for(e in weeks[curWeek].songs) if (!e.hide) e.name].join('\n')}';
|
||||
tracklist.text = 'TRACKS\n\n${[for(e in weeks[curWeek].songs) if (!e.hide) e.displayName.getDefault(e.name).toUpperCase()].join('\n')}';
|
||||
weekTitle.text = weeks[curWeek].name.getDefault("");
|
||||
|
||||
if(characterSprites != null) for(i in 0...3) {
|
||||
var curChar:FunkinSprite; var newChar:Access = characters[weeks[curWeek].chars[i]];
|
||||
if(newChar == null) modifyCharacterAt(i);
|
||||
else if((curChar = characterSprites.members[i]) == null || newChar.getAtt("name") != curChar.name) modifyCharacterAt(i, newChar);
|
||||
if (characterSprites != null) for (i in 0...3) {
|
||||
var char = weeks[curWeek].chars[i];
|
||||
var curChar:FunkinSprite = null;
|
||||
var newChar = null;
|
||||
|
||||
if (char == null || (newChar = characters[char.name]) == null) modifyCharacterAt(i);
|
||||
else if ((curChar = cast characterSprites.members[i]) == null || newChar.name != curChar.name) modifyCharacterAt(i, newChar); // forcing the sprites to be FunkinSprite basically - Nex
|
||||
}
|
||||
|
||||
changeDifficulty(0, true);
|
||||
@@ -195,27 +205,6 @@ class StoryMenuState extends MusicBeatState {
|
||||
MemoryUtil.clearMinor();
|
||||
}
|
||||
|
||||
public function modifyCharacterAt(i:Int, ?node:Access):FunkinSprite {
|
||||
var old = characterSprites.members[i];
|
||||
if(old != null) {
|
||||
characterSprites.remove(old);
|
||||
old.destroy();
|
||||
}
|
||||
|
||||
if(node == null) return null;
|
||||
var curChar:FunkinSprite = XMLUtil.createSpriteFromXML(node, "", BEAT);
|
||||
curChar.offset.x += curChar.x; curChar.offset.y += curChar.y;
|
||||
curChar.setPosition((FlxG.width * 0.25) * (1 + i) - 150, 70);
|
||||
if(characterSprites != null) characterSprites.insert(i, curChar); // Making so many null checks abt this group just in case if mods destroy it - Nex
|
||||
curChar.playAnim("idle", true, DANCE);
|
||||
return curChar;
|
||||
}
|
||||
|
||||
public override function beatHit(curBeat:Int) {
|
||||
super.beatHit(curBeat);
|
||||
if(characterSprites != null) characterSprites.forEachAlive(function(spr) spr.beatHit(curBeat));
|
||||
}
|
||||
|
||||
var __oldDiffName = null;
|
||||
public function changeDifficulty(change:Int, force:Bool = false) {
|
||||
if (change == 0 && !force) return;
|
||||
@@ -244,122 +233,44 @@ class StoryMenuState extends MusicBeatState {
|
||||
}
|
||||
|
||||
public function loadXMLs() {
|
||||
// CoolUtil.coolTextFile(Paths.txt('freeplaySonglist'));
|
||||
var weeks:Array<String> = [];
|
||||
|
||||
switch(Flags.WEEKS_LIST_MOD_MODE) {
|
||||
case 'prepend':
|
||||
getWeeksFromSource(weeks, MODS);
|
||||
getWeeksFromSource(weeks, SOURCE);
|
||||
case 'append':
|
||||
getWeeksFromSource(weeks, SOURCE);
|
||||
getWeeksFromSource(weeks, MODS);
|
||||
default /*case 'override'*/:
|
||||
if (getWeeksFromSource(weeks, MODS))
|
||||
getWeeksFromSource(weeks, SOURCE);
|
||||
}
|
||||
|
||||
for(k=>weekName in weeks) {
|
||||
var week:Access = null;
|
||||
try {
|
||||
week = new Access(Xml.parse(Assets.getText(Paths.xml('weeks/weeks/$weekName'))).firstElement());
|
||||
} catch(e) {
|
||||
Logs.trace('Cannot parse week "$weekName.xml": ${Std.string(e)}`', ERROR);
|
||||
}
|
||||
|
||||
if (week == null) continue;
|
||||
|
||||
if (!week.has.name) {
|
||||
Logs.trace('Story Menu: Week at index ${k} has no name. Skipping...', WARNING);
|
||||
continue;
|
||||
}
|
||||
var weekObj:WeekData = {
|
||||
name: week.att.name,
|
||||
id: weekName,
|
||||
sprite: week.getAtt('sprite').getDefault(weekName),
|
||||
chars: [null, null, null],
|
||||
songs: [],
|
||||
difficulties: ['easy', 'normal', 'hard'],
|
||||
bgColor: FlxColor.fromString(week.getAtt("bgColor").getDefault(defColor))
|
||||
};
|
||||
|
||||
var diffNodes = week.nodes.difficulty;
|
||||
if (diffNodes.length > 0) {
|
||||
var diffs:Array<String> = [];
|
||||
for(e in diffNodes) {
|
||||
if (e.has.name) diffs.push(e.att.name);
|
||||
}
|
||||
if (diffs.length > 0)
|
||||
weekObj.difficulties = diffs;
|
||||
}
|
||||
|
||||
if (week.has.chars) {
|
||||
for(k=>e in week.att.chars.split(",")) {
|
||||
if (e.trim() == "" || e == "none" || e == "null")
|
||||
weekObj.chars[k] = null;
|
||||
else {
|
||||
addCharacter(weekObj.chars[k] = e.trim());
|
||||
}
|
||||
}
|
||||
}
|
||||
for(k2=>song in week.nodes.song) {
|
||||
if (song == null) continue;
|
||||
try {
|
||||
var name = song.innerData.trim();
|
||||
if (name == "") {
|
||||
Logs.trace('Story Menu: Song at index ${k2} in week ${weekObj.name} has no name. Skipping...', WARNING);
|
||||
continue;
|
||||
}
|
||||
weekObj.songs.push({
|
||||
name: name,
|
||||
hide: song.getAtt('hide').getDefault('false') == "true"
|
||||
});
|
||||
} catch(e) {
|
||||
Logs.trace('Story Menu: Song at index ${k2} in week ${weekObj.name} cannot contain any other XML nodes in its name.', WARNING);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (weekObj.songs.length <= 0) {
|
||||
Logs.trace('Story Menu: Week ${weekObj.name} has no songs. Skipping...', WARNING);
|
||||
continue;
|
||||
}
|
||||
this.weeks.push(weekObj);
|
||||
}
|
||||
weekList = StoryWeeklist.get(true, false); // will only load week files AND NOT characters too (we will load them later only if needed)!! - Nex
|
||||
weeks = weekList.weeks;
|
||||
for (week in weeks) for (char in week.chars) if (char != null)
|
||||
addCharacter(char.name);
|
||||
}
|
||||
|
||||
public function addCharacter(charName:String) {
|
||||
var char:Access = null;
|
||||
try {
|
||||
char = new Access(Xml.parse(Assets.getText(Paths.xml('weeks/characters/$charName'))).firstElement());
|
||||
} catch(e) {
|
||||
Logs.trace('Story Menu: Cannot parse character "$charName.xml": ${Std.string(e)}`', ERROR);
|
||||
}
|
||||
public function addCharacter(char:OneOfTwo<String, WeekData.WeekCharacter>) {
|
||||
// better to use unsafe casts for going fast - Nex
|
||||
var charObj:WeekData.WeekCharacter = null;
|
||||
var charName:String;
|
||||
|
||||
if(char != null && characters[charName] == null) {
|
||||
if(!char.x.exists("name")) char.x.set("name", charName);
|
||||
if(!char.x.exists("sprite")) char.x.set("sprite", 'menus/storymenu/characters/${charName}');
|
||||
if(!char.x.exists("beatInterval")) char.x.set("beatInterval", "1");
|
||||
if(!char.x.exists("updateHitbox")) char.x.set("updateHitbox", "true");
|
||||
characters[charName] = char;
|
||||
}
|
||||
charName = char is String ? cast char : (charObj = cast char).name;
|
||||
if (characters[charName] != null) return; // will load only if it can be saved inside the map - Nex
|
||||
characters[charName] = charObj == null ? Week.loadWeekCharacter(charName) : charObj;
|
||||
}
|
||||
|
||||
public function getWeeksFromSource(weeks:Array<String>, source:funkin.backend.assets.AssetsLibraryList.AssetSource) {
|
||||
var path:String = Paths.txt('freeplaySonglist');
|
||||
var weeksFound:Array<String> = [];
|
||||
if (Paths.assetsTree.existsSpecific(path, "TEXT", source)) {
|
||||
var trim = "";
|
||||
weeksFound = CoolUtil.coolTextFile(Paths.txt('weeks/weeks'));
|
||||
} else {
|
||||
weeksFound = [for(c in Paths.getFolderContent('data/weeks/weeks/', false, source)) if (Path.extension(c).toLowerCase() == "xml") Path.withoutExtension(c)];
|
||||
}
|
||||
public function modifyCharacterAt(i:Int, ?data:WeekData.WeekCharacter):FunkinSprite {
|
||||
var curChar:FunkinSprite = null;
|
||||
|
||||
if (weeksFound.length > 0) {
|
||||
for(s in weeksFound)
|
||||
weeks.push(s);
|
||||
return false;
|
||||
if (characterSprites != null) {
|
||||
var old = characterSprites.members[i];
|
||||
if (old != null) {
|
||||
characterSprites.remove(old);
|
||||
old.destroy();
|
||||
}
|
||||
|
||||
if (data != null) {
|
||||
curChar = XMLUtil.createSpriteFromXML(data.xml, "", BEAT);
|
||||
curChar.offset.x += curChar.x; curChar.offset.y += curChar.y;
|
||||
curChar.setPosition((FlxG.width * 0.25) * (1 + i) - 150, 70);
|
||||
curChar.playAnim("idle", true, DANCE);
|
||||
characterSprites.insert(i, curChar);
|
||||
} else {
|
||||
//characterSprites.members[i] = null; // cant add nulls to flxgroups, so - Nex
|
||||
characterSprites.insert(i, new FunkinSprite()).visible = false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
return curChar;
|
||||
}
|
||||
|
||||
public function selectWeek() {
|
||||
@@ -369,7 +280,7 @@ class StoryMenuState extends MusicBeatState {
|
||||
canSelect = false;
|
||||
CoolUtil.playMenuSFX(CONFIRM);
|
||||
|
||||
if(characterSprites != null)
|
||||
if (characterSprites != null)
|
||||
characterSprites.forEachAlive(function(spr) spr.playAnim("confirm", true, LOCK));
|
||||
|
||||
PlayState.loadWeek(event.week, event.difficulty);
|
||||
@@ -382,21 +293,6 @@ class StoryMenuState extends MusicBeatState {
|
||||
}
|
||||
}
|
||||
|
||||
typedef WeekData = {
|
||||
var name:String; // name SHOULD NOT be used for loading week highscores, its just the name on the right side of the week, remember that next time!! - Nex
|
||||
var id:String; // id IS instead for saving and loading!! - Nex
|
||||
var sprite:String;
|
||||
var chars:Array<String>;
|
||||
var songs:Array<WeekSong>;
|
||||
var difficulties:Array<String>;
|
||||
var bgColor:FlxColor;
|
||||
}
|
||||
|
||||
typedef WeekSong = {
|
||||
var name:String;
|
||||
var hide:Bool;
|
||||
}
|
||||
|
||||
class MenuItem extends FlxSprite
|
||||
{
|
||||
public var targetY:Float = 0;
|
||||
@@ -438,3 +334,42 @@ class MenuItem extends FlxSprite
|
||||
color = (time % 0.1 > 0.05) ? FlxColor.WHITE : 0xFF33ffff;
|
||||
}
|
||||
}
|
||||
|
||||
class StoryWeeklist {
|
||||
public var weeks:Array<WeekData> = [];
|
||||
|
||||
public function new() {}
|
||||
|
||||
public function getWeeksFromSource(source:funkin.backend.assets.AssetsLibraryList.AssetSource, useTxt:Bool = true, loadCharactersData:Bool = true) {
|
||||
var path:String = Paths.txt('weeks/weeks');
|
||||
var weeksFound:Array<String> = useTxt && Paths.assetsTree.existsSpecific(path, "TEXT", source) ? CoolUtil.coolTextFile(path) :
|
||||
[for (c in Paths.getFolderContent('data/weeks/weeks/', false, source)) if (Path.extension(c).toLowerCase() == "xml") Path.withoutExtension(c)];
|
||||
|
||||
if (weeksFound.length > 0) {
|
||||
for (w in weeksFound) {
|
||||
var week = Week.loadWeek(w, loadCharactersData);
|
||||
if (week != null) weeks.push(week);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static function get(useTxt:Bool = true, loadCharactersData:Bool = true) {
|
||||
var weekList = new StoryWeeklist();
|
||||
|
||||
switch(Flags.WEEKS_LIST_MOD_MODE) {
|
||||
case 'prepend':
|
||||
weekList.getWeeksFromSource(MODS, useTxt, loadCharactersData);
|
||||
weekList.getWeeksFromSource(SOURCE, useTxt, loadCharactersData);
|
||||
case 'append':
|
||||
weekList.getWeeksFromSource(SOURCE, useTxt, loadCharactersData);
|
||||
weekList.getWeeksFromSource(MODS, useTxt, loadCharactersData);
|
||||
default /*case 'override'*/:
|
||||
if (weekList.getWeeksFromSource(MODS, useTxt, loadCharactersData))
|
||||
weekList.getWeeksFromSource(SOURCE, useTxt, loadCharactersData);
|
||||
}
|
||||
|
||||
return weekList;
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,12 @@
|
||||
package funkin.menus.credits;
|
||||
|
||||
import flixel.util.FlxColor;
|
||||
import funkin.backend.assets.AssetsLibraryList.AssetSource;
|
||||
import funkin.backend.system.github.GitHubContributor.CreditsGitHubContributor;
|
||||
import funkin.options.OptionsScreen;
|
||||
import funkin.options.TreeMenu;
|
||||
import funkin.backend.system.github.GitHubContributor.CreditsGitHubContributor;
|
||||
import funkin.options.type.*;
|
||||
import haxe.xml.Access;
|
||||
import flixel.util.FlxColor;
|
||||
|
||||
class CreditsMain extends TreeMenu {
|
||||
var bg:FlxSprite;
|
||||
@@ -21,21 +22,17 @@ class CreditsMain extends TreeMenu {
|
||||
bg.antialiasing = true;
|
||||
add(bg);
|
||||
|
||||
var xmlPath = Paths.xml('config/credits');
|
||||
for(source in [funkin.backend.assets.AssetsLibraryList.AssetSource.SOURCE, funkin.backend.assets.AssetsLibraryList.AssetSource.MODS]) {
|
||||
if (Paths.assetsTree.existsSpecific(xmlPath, "TEXT", source)) {
|
||||
var access:Access = null;
|
||||
try {
|
||||
access = new Access(Xml.parse(Paths.assetsTree.getSpecificAsset(xmlPath, "TEXT", source)));
|
||||
} catch(e) {
|
||||
Logs.trace('[CreditsMain] Error while parsing credits.xml: ${Std.string(e)}', ERROR);
|
||||
}
|
||||
for (i in funkin.backend.assets.ModsFolder.getLoadedMods()) {
|
||||
var xmlPath = Paths.xml('config/credits/LIB_$i');
|
||||
|
||||
if (access != null)
|
||||
for(c in parseCreditsFromXML(access, source))
|
||||
items.push(c);
|
||||
if (Paths.assetsTree.existsSpecific(xmlPath, "TEXT")) {
|
||||
var access:Access = null;
|
||||
try access = new Access(Xml.parse(Paths.assetsTree.getSpecificAsset(xmlPath, "TEXT")))
|
||||
catch(e) Logs.trace('[CreditsMain] Error while parsing credits.xml: ${Std.string(e)}', ERROR);
|
||||
if (access != null) for (c in parseCreditsFromXML(access)) items.push(c);
|
||||
}
|
||||
}
|
||||
|
||||
items.push(new TextOption("Codename Engine >", "Select this to see all the contributors of the engine!", function() {
|
||||
optionsTree.add(Type.createInstance(CreditsCodename, []));
|
||||
}));
|
||||
@@ -52,7 +49,7 @@ class CreditsMain extends TreeMenu {
|
||||
/**
|
||||
* XML STUFF
|
||||
*/
|
||||
public function parseCreditsFromXML(xml:Access, source:funkin.backend.assets.AssetsLibraryList.AssetSource):Array<OptionType> {
|
||||
public function parseCreditsFromXML(xml:Access, source:AssetSource = BOTH):Array<OptionType> {
|
||||
var credsMenus:Array<OptionType> = [];
|
||||
|
||||
for(node in xml.elements) {
|
||||
|
||||
@@ -52,7 +52,9 @@ class Alphabet extends FlxSpriteGroup
|
||||
public function refreshAlphabetXML(path:String) {
|
||||
AlphaCharacter.__alphaPath = Paths.getAssetsRoot() + path;
|
||||
try {
|
||||
var xml = new Access(Xml.parse(Assets.getText(path)).firstElement());
|
||||
var file = Assets.getText(path);
|
||||
if(file == null) return;
|
||||
var xml = new Access(Xml.parse(file).firstElement());
|
||||
AlphaCharacter.boldAnims = [];
|
||||
AlphaCharacter.letterAnims = [];
|
||||
AlphaCharacter.boldAlphabetPath = AlphaCharacter.letterAlphabetPath = 'ui/alphabet';
|
||||
|
||||
Reference in New Issue
Block a user