StoryWeeklist + Week class+ loading weeks fix
BIG REWRITE!! a 2 YEARS OLD commit, are we DEADASS for never noticing the way they loaded😭🥀
This commit is contained in:
@@ -87,30 +87,25 @@ class Chart {
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function loadChartMeta(songName:String, difficulty:String = "normal", fromMods:Bool = true) {
|
public static function loadChartMeta(songName:String, difficulty:String = "normal", fromMods:Bool = true):ChartMetaData {
|
||||||
var songNameLower = songName.toLowerCase();
|
var songNameLower = songName.toLowerCase();
|
||||||
var metaPath = Paths.file('songs/${songNameLower}/meta.json');
|
var metaPath = Paths.file('songs/${songNameLower}/meta.json');
|
||||||
var metaDiffPath = Paths.file('songs/${songNameLower}/meta-${difficulty.toLowerCase()}.json');
|
var metaDiffPath = Paths.file('songs/${songNameLower}/meta-${difficulty.toLowerCase()}.json');
|
||||||
|
|
||||||
var data:ChartMetaData = null;
|
var data:ChartMetaData = null;
|
||||||
var fromMods:Bool = fromMods;
|
var fromMods:Bool = fromMods;
|
||||||
for(path in [metaDiffPath, metaPath]) {
|
for (path in [metaDiffPath, metaPath]) if (Assets.exists(path)) {
|
||||||
if (Assets.exists(path)) {
|
fromMods = Paths.assetsTree.existsSpecific(path, "TEXT", MODS);
|
||||||
fromMods = Paths.assetsTree.existsSpecific(path, "TEXT", MODS);
|
try data = Json.parse(Assets.getText(path))
|
||||||
try {
|
catch(e) Logs.trace('Failed to load song metadata for ${songName} ($path): ${Std.string(e)}', ERROR);
|
||||||
data = Json.parse(Assets.getText(path));
|
if (data != null) break;
|
||||||
} catch(e) {
|
|
||||||
Logs.trace('Failed to load song metadata for ${songName} ($path): ${Std.string(e)}', ERROR);
|
|
||||||
}
|
|
||||||
if (data != null) break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data == null)
|
if (data == null) data = {
|
||||||
data = {
|
name: songName,
|
||||||
name: songName,
|
bpm: 100
|
||||||
bpm: 100
|
};
|
||||||
};
|
|
||||||
data.setFieldDefault("name", songName);
|
data.setFieldDefault("name", songName);
|
||||||
data.setFieldDefault("beatsPerMeasure", 4);
|
data.setFieldDefault("beatsPerMeasure", 4);
|
||||||
data.setFieldDefault("stepsPerBeat", 4);
|
data.setFieldDefault("stepsPerBeat", 4);
|
||||||
@@ -165,11 +160,9 @@ class Chart {
|
|||||||
valid = false;
|
valid = false;
|
||||||
}
|
}
|
||||||
var data:Dynamic = null;
|
var data:Dynamic = null;
|
||||||
try {
|
if (valid) {
|
||||||
if (valid)
|
try data = Json.parse(Assets.getText(chartPath))
|
||||||
data = Json.parse(Assets.getText(chartPath));
|
catch(e) Logs.trace('Could not parse chart for song ${songName} ($difficulty): ${Std.string(e)}', ERROR, RED);
|
||||||
} catch(e) {
|
|
||||||
Logs.trace('Could not parse chart for song ${songName} ($difficulty): ${Std.string(e)}', ERROR, RED);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -230,8 +223,7 @@ class Chart {
|
|||||||
return 0;
|
return 0;
|
||||||
default:
|
default:
|
||||||
var index = chart.noteTypes.indexOf(noteTypeName);
|
var index = chart.noteTypes.indexOf(noteTypeName);
|
||||||
if (index > -1)
|
if (index > -1) return index + 1;
|
||||||
return index+1;
|
|
||||||
chart.noteTypes.push(noteTypeName);
|
chart.noteTypes.push(noteTypeName);
|
||||||
return chart.noteTypes.length;
|
return chart.noteTypes.length;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package funkin.backend.scripting.events;
|
package funkin.backend.scripting.events;
|
||||||
|
|
||||||
import funkin.menus.StoryMenuState.WeekData;
|
import funkin.backend.week.WeekData;
|
||||||
|
|
||||||
final class WeekSelectEvent extends CancellableEvent {
|
final class WeekSelectEvent extends CancellableEvent {
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -0,0 +1,86 @@
|
|||||||
|
package funkin.backend.week;
|
||||||
|
|
||||||
|
import flixel.math.FlxPoint;
|
||||||
|
import funkin.backend.week.WeekData.WeekCharacter;
|
||||||
|
import funkin.backend.week.WeekData;
|
||||||
|
import haxe.xml.Access;
|
||||||
|
|
||||||
|
class Week {
|
||||||
|
public static function loadWeek(weekName:String, loadCharactersData:Bool = true):WeekData {
|
||||||
|
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) return null;
|
||||||
|
if (!week.has.name) {
|
||||||
|
Logs.trace('Week "${weekName}" has no name attribute', WARNING);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var weekObj:WeekData = {
|
||||||
|
xml: week,
|
||||||
|
name: week.att.name,
|
||||||
|
id: weekName,
|
||||||
|
sprite: week.getAtt('sprite').getDefault(weekName),
|
||||||
|
chars: [null, null, null],
|
||||||
|
songs: [],
|
||||||
|
difficulties: ['easy', 'normal', 'hard']
|
||||||
|
};
|
||||||
|
|
||||||
|
var weekName = weekObj.name;
|
||||||
|
for (k => song in week.nodes.song) {
|
||||||
|
if (song == null) continue;
|
||||||
|
try {
|
||||||
|
var name = song.innerData.trim();
|
||||||
|
if (name == "") {
|
||||||
|
Logs.trace('Song at index ${k} in week $weekName has no name. Skipping...', WARNING);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
weekObj.songs.push({
|
||||||
|
name: name,
|
||||||
|
hide: song.getAtt('hide').getDefault('false') == "true",
|
||||||
|
displayName: song.getAtt('displayName')
|
||||||
|
});
|
||||||
|
} catch(e) {
|
||||||
|
Logs.trace('Song at index ${k} in week $weekName cannot contain any other XML nodes in its name.', WARNING);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (weekObj.songs.length <= 0) {
|
||||||
|
Logs.trace('Week $weekName has no songs.', WARNING);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var diffNodes = week.nodes.difficulty;
|
||||||
|
if (diffNodes.length > 0) {
|
||||||
|
var diffs:Array<String> = [for (e in diffNodes) if (e.has.name) e.att.name];
|
||||||
|
if (diffs.length > 0) weekObj.difficulties = diffs;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (week.has.chars) for (k => e in week.att.chars.split(",")) {
|
||||||
|
var trim = e.trim();
|
||||||
|
weekObj.chars[k] = (trim == "" || e == "none" || e == "null") ? null : (loadCharactersData ? loadWeekCharacter(trim) : {name: trim});
|
||||||
|
}
|
||||||
|
|
||||||
|
return weekObj;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function loadWeekCharacter(charName:String):WeekCharacter {
|
||||||
|
var char:Access = null;
|
||||||
|
try char = new Access(Xml.parse(Assets.getText(Paths.xml('weeks/characters/$charName'))).firstElement())
|
||||||
|
catch(e) Logs.trace('Cannot parse character "$charName.xml": ${Std.string(e)}', ERROR);
|
||||||
|
if (char == null) return null;
|
||||||
|
|
||||||
|
return {
|
||||||
|
xml: char,
|
||||||
|
name: charName,
|
||||||
|
spritePath: Paths.image(char.getAtt('sprite').getDefault('menus/storymenu/characters/${charName}')),
|
||||||
|
scale: Std.parseFloat(char.getAtt('scale')).getDefault(1),
|
||||||
|
offset: FlxPoint.get(
|
||||||
|
Std.parseFloat(char.getAtt('x')).getDefault(0),
|
||||||
|
Std.parseFloat(char.getAtt('y')).getDefault(0)
|
||||||
|
)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package funkin.backend.week;
|
||||||
|
|
||||||
|
import flixel.math.FlxPoint;
|
||||||
|
import haxe.xml.Access;
|
||||||
|
|
||||||
|
typedef WeekData = {
|
||||||
|
var ?xml:Access;
|
||||||
|
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<WeekCharacter>;
|
||||||
|
var songs:Array<WeekSong>;
|
||||||
|
var difficulties:Array<String>;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef WeekCharacter = {
|
||||||
|
var ?xml:Access;
|
||||||
|
var name:String;
|
||||||
|
var ?spritePath:String;
|
||||||
|
var ?scale:Float;
|
||||||
|
var ?offset:FlxPoint;
|
||||||
|
// var frames:FlxFramesCollection;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef WeekSong = {
|
||||||
|
var name:String;
|
||||||
|
var hide:Bool;
|
||||||
|
var ?displayName:String;
|
||||||
|
}
|
||||||
@@ -12,7 +12,7 @@ import funkin.backend.chart.Chart;
|
|||||||
import funkin.backend.chart.ChartData;
|
import funkin.backend.chart.ChartData;
|
||||||
import funkin.game.SplashHandler;
|
import funkin.game.SplashHandler;
|
||||||
import funkin.backend.scripting.DummyScript;
|
import funkin.backend.scripting.DummyScript;
|
||||||
import funkin.menus.StoryMenuState.WeekData;
|
import funkin.backend.week.WeekData;
|
||||||
import funkin.backend.FunkinText;
|
import funkin.backend.FunkinText;
|
||||||
import funkin.backend.scripting.Script;
|
import funkin.backend.scripting.Script;
|
||||||
import funkin.backend.scripting.ScriptPack;
|
import funkin.backend.scripting.ScriptPack;
|
||||||
@@ -1961,7 +1961,7 @@ class PlayState extends MusicBeatState
|
|||||||
*/
|
*/
|
||||||
public static function loadWeek(weekData:WeekData, difficulty:String = "normal") {
|
public static function loadWeek(weekData:WeekData, difficulty:String = "normal") {
|
||||||
storyWeek = weekData;
|
storyWeek = weekData;
|
||||||
storyPlaylist = [for(e in weekData.songs) e.name];
|
storyPlaylist = [for (e in weekData.songs) e.name];
|
||||||
isStoryMode = true;
|
isStoryMode = true;
|
||||||
campaignScore = 0;
|
campaignScore = 0;
|
||||||
campaignMisses = 0;
|
campaignMisses = 0;
|
||||||
@@ -1994,7 +1994,6 @@ class PlayState extends MusicBeatState
|
|||||||
*/
|
*/
|
||||||
public static function __loadSong(name:String, difficulty:String) {
|
public static function __loadSong(name:String, difficulty:String) {
|
||||||
PlayState.difficulty = difficulty;
|
PlayState.difficulty = difficulty;
|
||||||
|
|
||||||
PlayState.SONG = Chart.parse(name, difficulty);
|
PlayState.SONG = Chart.parse(name, difficulty);
|
||||||
PlayState.fromMods = PlayState.SONG.fromMods;
|
PlayState.fromMods = PlayState.SONG.fromMods;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -439,16 +439,10 @@ class FreeplaySonglist {
|
|||||||
|
|
||||||
public function getSongsFromSource(source:funkin.backend.assets.AssetsLibraryList.AssetSource, useTxt:Bool = true) {
|
public function getSongsFromSource(source:funkin.backend.assets.AssetsLibraryList.AssetSource, useTxt:Bool = true) {
|
||||||
var path:String = Paths.txt('freeplaySonglist');
|
var path:String = Paths.txt('freeplaySonglist');
|
||||||
var songsFound:Array<String> = [];
|
var songsFound:Array<String> = useTxt && Paths.assetsTree.existsSpecific(path, "TEXT", source) ? CoolUtil.coolTextFile(path) : Paths.getFolderDirectories('songs', false, source);
|
||||||
if (useTxt && Paths.assetsTree.existsSpecific(path, "TEXT", source)) {
|
|
||||||
songsFound = CoolUtil.coolTextFile(Paths.txt('freeplaySonglist'));
|
|
||||||
} else {
|
|
||||||
songsFound = Paths.getFolderDirectories('songs', false, source);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (songsFound.length > 0) {
|
if (songsFound.length > 0) {
|
||||||
for(s in songsFound)
|
for (s in songsFound) songs.push(Chart.loadChartMeta(s, "normal", source == MODS));
|
||||||
songs.push(Chart.loadChartMeta(s, "normal", source == MODS));
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -1,19 +1,21 @@
|
|||||||
package funkin.menus;
|
package funkin.menus;
|
||||||
|
|
||||||
import funkin.savedata.FunkinSave;
|
|
||||||
import haxe.io.Path;
|
|
||||||
import funkin.backend.scripting.events.*;
|
|
||||||
import flixel.util.FlxTimer;
|
|
||||||
import flixel.math.FlxPoint;
|
import flixel.math.FlxPoint;
|
||||||
|
import flixel.text.FlxText;
|
||||||
import flixel.tweens.FlxTween;
|
import flixel.tweens.FlxTween;
|
||||||
import flixel.util.FlxColor;
|
import flixel.util.FlxColor;
|
||||||
|
import flixel.util.FlxTimer;
|
||||||
|
import flixel.util.typeLimit.OneOfTwo;
|
||||||
import funkin.backend.FunkinText;
|
import funkin.backend.FunkinText;
|
||||||
import haxe.xml.Access;
|
import funkin.backend.scripting.events.*;
|
||||||
import flixel.text.FlxText;
|
import funkin.backend.week.*;
|
||||||
|
import funkin.savedata.FunkinSave;
|
||||||
|
import haxe.io.Path;
|
||||||
|
|
||||||
class StoryMenuState extends MusicBeatState {
|
class StoryMenuState extends MusicBeatState {
|
||||||
public var characters:Map<String, MenuCharacter> = [];
|
public var characters:Map<String, WeekData.WeekCharacter> = [];
|
||||||
public var weeks:Array<WeekData> = [];
|
public var weeks:Array<WeekData> = [];
|
||||||
|
public var weekList:StoryWeeklist;
|
||||||
|
|
||||||
public var scoreText:FlxText;
|
public var scoreText:FlxText;
|
||||||
public var tracklist:FlxText;
|
public var tracklist:FlxText;
|
||||||
@@ -84,22 +86,20 @@ class StoryMenuState extends MusicBeatState {
|
|||||||
tracklist.color = 0xFFE55777;
|
tracklist.color = 0xFFE55777;
|
||||||
|
|
||||||
add(weekSprites);
|
add(weekSprites);
|
||||||
for(e in [blackBar, scoreText, weekTitle, weekBG, tracklist]) {
|
for (e in [blackBar, scoreText, weekTitle, weekBG, tracklist]) {
|
||||||
e.scrollFactor.set();
|
e.scrollFactor.set();
|
||||||
add(e);
|
add(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
characterSprites = new FlxTypedGroup<MenuCharacterSprite>();
|
characterSprites = new FlxTypedGroup<MenuCharacterSprite>();
|
||||||
for(i in 0...3) {
|
for (i in 0...3) characterSprites.add(new MenuCharacterSprite(i));
|
||||||
characterSprites.add(new MenuCharacterSprite(i));
|
|
||||||
}
|
|
||||||
add(characterSprites);
|
add(characterSprites);
|
||||||
|
|
||||||
for(i=>week in weeks) {
|
for (i=>week in weeks) {
|
||||||
var spr:MenuItem = new MenuItem(0, (i * 120) + 480, 'menus/storymenu/weeks/${week.sprite}');
|
var spr:MenuItem = new MenuItem(0, (i * 120) + 480, 'menus/storymenu/weeks/${week.sprite}');
|
||||||
weekSprites.add(spr);
|
weekSprites.add(spr);
|
||||||
|
|
||||||
for(e in week.difficulties) {
|
for (e in week.difficulties) {
|
||||||
var le = e.toLowerCase();
|
var le = e.toLowerCase();
|
||||||
if (difficultySprites[le] == null) {
|
if (difficultySprites[le] == null) {
|
||||||
var diffSprite = new FlxSprite(leftArrow.x + leftArrow.width, leftArrow.y);
|
var diffSprite = new FlxSprite(leftArrow.x + leftArrow.width, leftArrow.y);
|
||||||
@@ -171,11 +171,13 @@ class StoryMenuState extends MusicBeatState {
|
|||||||
e.targetY = k - curWeek;
|
e.targetY = k - curWeek;
|
||||||
e.alpha = k == curWeek ? 1.0 : 0.6;
|
e.alpha = k == curWeek ? 1.0 : 0.6;
|
||||||
}
|
}
|
||||||
tracklist.text = 'TRACKS\n\n${[for(e in weeks[curWeek].songs) if (!e.hide) e.name.toUpperCase()].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("");
|
weekTitle.text = weeks[curWeek].name.getDefault("");
|
||||||
|
|
||||||
for(i in 0...3)
|
for (i in 0...3) {
|
||||||
characterSprites.members[i].changeCharacter(characters[weeks[curWeek].chars[i]]);
|
var char = weeks[curWeek].chars[i]; // will use the characters map in any case since a map is for sure easier to edit for mods, we didnt load characters by default anyways - Nex
|
||||||
|
characterSprites.members[i].changeCharacter(char == null ? null : characters[char.name]);
|
||||||
|
}
|
||||||
|
|
||||||
changeDifficulty(0, true);
|
changeDifficulty(0, true);
|
||||||
|
|
||||||
@@ -210,121 +212,25 @@ class StoryMenuState extends MusicBeatState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function loadXMLs() {
|
public function loadXMLs() {
|
||||||
// CoolUtil.coolTextFile(Paths.txt('freeplaySonglist'));
|
weekList = StoryWeeklist.get(true, false); // will only load week files AND NOT characters too (we will load them later only if needed)!! - Nex
|
||||||
var weeks:Array<String> = [];
|
weeks = weekList.weeks;
|
||||||
if (getWeeksFromSource(weeks, MODS))
|
for (week in weeks) for (char in week.chars) if (char != null)
|
||||||
getWeeksFromSource(weeks, SOURCE);
|
addCharacter(char.name);
|
||||||
|
|
||||||
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']
|
|
||||||
};
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addCharacter(charName:String) {
|
public function addCharacter(char:OneOfTwo<String, WeekData.WeekCharacter>) {
|
||||||
var char:Access = null;
|
// better to use unsafe casts for going fast - Nex
|
||||||
try {
|
var charObj:WeekData.WeekCharacter = null;
|
||||||
char = new Access(Xml.parse(Assets.getText(Paths.xml('weeks/characters/$charName'))).firstElement());
|
var charName:String;
|
||||||
} catch(e) {
|
|
||||||
Logs.trace('Story Menu: Cannot parse character "$charName.xml": ${Std.string(e)}`', ERROR);
|
|
||||||
}
|
|
||||||
if (char == null) return;
|
|
||||||
|
|
||||||
if (characters[charName] != null) return;
|
charName = char is String ? cast char : (charObj = cast char).name;
|
||||||
var charObj:MenuCharacter = {
|
if (characters[charName] != null) return; // will load only if it can be saved inside the map - Nex
|
||||||
spritePath: Paths.image(char.getAtt('sprite').getDefault('menus/storymenu/characters/${charName}')),
|
characters[charName] = charObj == null ? Week.loadWeekCharacter(charName) : charObj;
|
||||||
scale: Std.parseFloat(char.getAtt('scale')).getDefault(1),
|
|
||||||
xml: char,
|
|
||||||
offset: FlxPoint.get(
|
|
||||||
Std.parseFloat(char.getAtt('x')).getDefault(0),
|
|
||||||
Std.parseFloat(char.getAtt('y')).getDefault(0)
|
|
||||||
)
|
|
||||||
};
|
|
||||||
characters[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)];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (weeksFound.length > 0) {
|
|
||||||
for(s in weeksFound)
|
|
||||||
weeks.push(s);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override function destroy() {
|
public override function destroy() {
|
||||||
super.destroy();
|
super.destroy();
|
||||||
for(e in characters)
|
for (e in characters)
|
||||||
if (e != null && e.offset != null)
|
if (e != null && e.offset != null)
|
||||||
e.offset.put();
|
e.offset.put();
|
||||||
}
|
}
|
||||||
@@ -350,28 +256,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>;
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef WeekSong = {
|
|
||||||
var name:String;
|
|
||||||
var hide:Bool;
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef MenuCharacter = {
|
|
||||||
var spritePath:String;
|
|
||||||
var xml:Access;
|
|
||||||
var scale:Float;
|
|
||||||
var offset:FlxPoint;
|
|
||||||
// var frames:FlxFramesCollection;
|
|
||||||
}
|
|
||||||
|
|
||||||
class MenuCharacterSprite extends FlxSprite
|
class MenuCharacterSprite extends FlxSprite
|
||||||
{
|
{
|
||||||
public var character:String;
|
public var character:String;
|
||||||
@@ -385,19 +269,16 @@ class MenuCharacterSprite extends FlxSprite
|
|||||||
antialiasing = true;
|
antialiasing = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public var oldChar:MenuCharacter = null;
|
public var oldChar:WeekData.WeekCharacter = null;
|
||||||
|
|
||||||
public function changeCharacter(data:MenuCharacter) {
|
public function changeCharacter(data:WeekData.WeekCharacter) {
|
||||||
visible = (data != null);
|
visible = (data != null && data.xml != null);
|
||||||
if (!visible)
|
if (!visible) return;
|
||||||
return;
|
|
||||||
|
|
||||||
if (oldChar != (oldChar = data)) {
|
if (oldChar != (oldChar = data)) {
|
||||||
CoolUtil.loadAnimatedGraphic(this, data.spritePath);
|
CoolUtil.loadAnimatedGraphic(this, data.spritePath);
|
||||||
for(e in data.xml.nodes.anim) {
|
for (e in data.xml.nodes.anim) {
|
||||||
if (e.getAtt("name") == "idle")
|
if (e.getAtt("name") == "idle") animation.remove("idle");
|
||||||
animation.remove("idle");
|
|
||||||
|
|
||||||
XMLUtil.addXMLAnimation(this, e);
|
XMLUtil.addXMLAnimation(this, e);
|
||||||
}
|
}
|
||||||
animation.play("idle");
|
animation.play("idle");
|
||||||
@@ -410,6 +291,7 @@ class MenuCharacterSprite extends FlxSprite
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class MenuItem extends FlxSprite
|
class MenuItem extends FlxSprite
|
||||||
{
|
{
|
||||||
public var targetY:Float = 0;
|
public var targetY:Float = 0;
|
||||||
@@ -451,3 +333,33 @@ class MenuItem extends FlxSprite
|
|||||||
color = (time % 0.1 > 0.05) ? FlxColor.WHITE : 0xFF33ffff;
|
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();
|
||||||
|
|
||||||
|
if (weekList.getWeeksFromSource(MODS, useTxt, loadCharactersData))
|
||||||
|
weekList.getWeeksFromSource(SOURCE, useTxt, loadCharactersData);
|
||||||
|
|
||||||
|
return weekList;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user