From 242860628be972c8cc4258043537a1a1fcddd894 Mon Sep 17 00:00:00 2001 From: Yoshman29 <81191621+YoshiCrafter29@users.noreply.github.com> Date: Wed, 22 Feb 2023 02:15:15 +0100 Subject: [PATCH] new weeks format --- assets/data/weeks.xml | 72 ------- assets/data/weeks/characters/bf.xml | 5 + assets/data/weeks/characters/dad.xml | 2 + assets/data/weeks/characters/gf.xml | 2 + assets/data/weeks/characters/mom.xml | 2 + .../weeks/characters/parents-christmas.xml | 2 + assets/data/weeks/characters/pico.xml | 2 + assets/data/weeks/characters/senpai.xml | 2 + assets/data/weeks/characters/spooky.xml | 2 + assets/data/weeks/characters/tankman.xml | 2 + assets/data/weeks/weeks.txt | 11 ++ assets/data/weeks/weeks/tutorial.xml | 4 + assets/data/weeks/weeks/week1.xml | 6 + assets/data/weeks/weeks/week2.xml | 6 + assets/data/weeks/weeks/week3.xml | 6 + assets/data/weeks/weeks/week4.xml | 6 + assets/data/weeks/weeks/week5.xml | 6 + assets/data/weeks/weeks/week6.xml | 6 + assets/data/weeks/weeks/week7.xml | 6 + buildnumber.txt | 2 +- source/funkin/menus/FreeplayState.hx | 2 +- source/funkin/menus/StoryMenuState.hx | 179 +++++++++++------- source/funkin/utils/CoolUtil.hx | 3 +- 23 files changed, 196 insertions(+), 140 deletions(-) delete mode 100644 assets/data/weeks.xml create mode 100644 assets/data/weeks/characters/bf.xml create mode 100644 assets/data/weeks/characters/dad.xml create mode 100644 assets/data/weeks/characters/gf.xml create mode 100644 assets/data/weeks/characters/mom.xml create mode 100644 assets/data/weeks/characters/parents-christmas.xml create mode 100644 assets/data/weeks/characters/pico.xml create mode 100644 assets/data/weeks/characters/senpai.xml create mode 100644 assets/data/weeks/characters/spooky.xml create mode 100644 assets/data/weeks/characters/tankman.xml create mode 100644 assets/data/weeks/weeks.txt create mode 100644 assets/data/weeks/weeks/tutorial.xml create mode 100644 assets/data/weeks/weeks/week1.xml create mode 100644 assets/data/weeks/weeks/week2.xml create mode 100644 assets/data/weeks/weeks/week3.xml create mode 100644 assets/data/weeks/weeks/week4.xml create mode 100644 assets/data/weeks/weeks/week5.xml create mode 100644 assets/data/weeks/weeks/week6.xml create mode 100644 assets/data/weeks/weeks/week7.xml diff --git a/assets/data/weeks.xml b/assets/data/weeks.xml deleted file mode 100644 index 96ff136f..00000000 --- a/assets/data/weeks.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/assets/data/weeks/characters/bf.xml b/assets/data/weeks/characters/bf.xml new file mode 100644 index 00000000..368056c9 --- /dev/null +++ b/assets/data/weeks/characters/bf.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/data/weeks/characters/dad.xml b/assets/data/weeks/characters/dad.xml new file mode 100644 index 00000000..dfda66e7 --- /dev/null +++ b/assets/data/weeks/characters/dad.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/assets/data/weeks/characters/gf.xml b/assets/data/weeks/characters/gf.xml new file mode 100644 index 00000000..1af08c30 --- /dev/null +++ b/assets/data/weeks/characters/gf.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/assets/data/weeks/characters/mom.xml b/assets/data/weeks/characters/mom.xml new file mode 100644 index 00000000..338e2825 --- /dev/null +++ b/assets/data/weeks/characters/mom.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/assets/data/weeks/characters/parents-christmas.xml b/assets/data/weeks/characters/parents-christmas.xml new file mode 100644 index 00000000..44070ced --- /dev/null +++ b/assets/data/weeks/characters/parents-christmas.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/assets/data/weeks/characters/pico.xml b/assets/data/weeks/characters/pico.xml new file mode 100644 index 00000000..f4f32242 --- /dev/null +++ b/assets/data/weeks/characters/pico.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/assets/data/weeks/characters/senpai.xml b/assets/data/weeks/characters/senpai.xml new file mode 100644 index 00000000..982d6b20 --- /dev/null +++ b/assets/data/weeks/characters/senpai.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/assets/data/weeks/characters/spooky.xml b/assets/data/weeks/characters/spooky.xml new file mode 100644 index 00000000..2466bbbb --- /dev/null +++ b/assets/data/weeks/characters/spooky.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/assets/data/weeks/characters/tankman.xml b/assets/data/weeks/characters/tankman.xml new file mode 100644 index 00000000..f172291a --- /dev/null +++ b/assets/data/weeks/characters/tankman.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/assets/data/weeks/weeks.txt b/assets/data/weeks/weeks.txt new file mode 100644 index 00000000..570a1bb5 --- /dev/null +++ b/assets/data/weeks/weeks.txt @@ -0,0 +1,11 @@ +# THIS FILE ISNT NECESSARY, +# BUT YOU CAN USE IT TO SORT WEEKS + +tutorial +week1 +week2 +week3 +week4 +week5 +week6 +week7 \ No newline at end of file diff --git a/assets/data/weeks/weeks/tutorial.xml b/assets/data/weeks/weeks/tutorial.xml new file mode 100644 index 00000000..4050b01f --- /dev/null +++ b/assets/data/weeks/weeks/tutorial.xml @@ -0,0 +1,4 @@ + + + Tutorial + \ No newline at end of file diff --git a/assets/data/weeks/weeks/week1.xml b/assets/data/weeks/weeks/week1.xml new file mode 100644 index 00000000..736492d9 --- /dev/null +++ b/assets/data/weeks/weeks/week1.xml @@ -0,0 +1,6 @@ + + + Bopeebo + Fresh + Dadbattle + \ No newline at end of file diff --git a/assets/data/weeks/weeks/week2.xml b/assets/data/weeks/weeks/week2.xml new file mode 100644 index 00000000..90faf4d1 --- /dev/null +++ b/assets/data/weeks/weeks/week2.xml @@ -0,0 +1,6 @@ + + + Spookeez + South + Monster + \ No newline at end of file diff --git a/assets/data/weeks/weeks/week3.xml b/assets/data/weeks/weeks/week3.xml new file mode 100644 index 00000000..d361ecde --- /dev/null +++ b/assets/data/weeks/weeks/week3.xml @@ -0,0 +1,6 @@ + + + Pico + Philly Nice + Blammed + \ No newline at end of file diff --git a/assets/data/weeks/weeks/week4.xml b/assets/data/weeks/weeks/week4.xml new file mode 100644 index 00000000..d12b4a22 --- /dev/null +++ b/assets/data/weeks/weeks/week4.xml @@ -0,0 +1,6 @@ + + + Satin Panties + High + MILF + \ No newline at end of file diff --git a/assets/data/weeks/weeks/week5.xml b/assets/data/weeks/weeks/week5.xml new file mode 100644 index 00000000..24d09531 --- /dev/null +++ b/assets/data/weeks/weeks/week5.xml @@ -0,0 +1,6 @@ + + + Cocoa + Eggnog + Winter Horrorland + \ No newline at end of file diff --git a/assets/data/weeks/weeks/week6.xml b/assets/data/weeks/weeks/week6.xml new file mode 100644 index 00000000..85695d2b --- /dev/null +++ b/assets/data/weeks/weeks/week6.xml @@ -0,0 +1,6 @@ + + + Senpai + Roses + Thorns + \ No newline at end of file diff --git a/assets/data/weeks/weeks/week7.xml b/assets/data/weeks/weeks/week7.xml new file mode 100644 index 00000000..3e01cc3a --- /dev/null +++ b/assets/data/weeks/weeks/week7.xml @@ -0,0 +1,6 @@ + + + Ugh + Guns + Stress + \ No newline at end of file diff --git a/buildnumber.txt b/buildnumber.txt index bcc059c3..96a7bd4c 100644 --- a/buildnumber.txt +++ b/buildnumber.txt @@ -1 +1 @@ -2366 \ No newline at end of file +2371 \ No newline at end of file diff --git a/source/funkin/menus/FreeplayState.hx b/source/funkin/menus/FreeplayState.hx index 1f1895e5..276796a0 100644 --- a/source/funkin/menus/FreeplayState.hx +++ b/source/funkin/menus/FreeplayState.hx @@ -399,7 +399,7 @@ class FreeplaySonglist { var songsFound:Array = []; if (Paths.assetsTree.existsSpecific(path, "TEXT", source)) { var trim = ""; - songsFound = [for(line in Assets.getText(path).split("\n")) if ((trim = line.trim()) != "" && !trim.startsWith("#")) trim]; + songsFound = CoolUtil.coolTextFile(Paths.txt('freeplaySonglist')); } else { songsFound = Paths.getFolderDirectories('songs', false, source); } diff --git a/source/funkin/menus/StoryMenuState.hx b/source/funkin/menus/StoryMenuState.hx index e15da8c3..1f6410fd 100644 --- a/source/funkin/menus/StoryMenuState.hx +++ b/source/funkin/menus/StoryMenuState.hx @@ -1,5 +1,6 @@ package funkin.menus; +import haxe.io.Path; import funkin.scripting.events.*; import flixel.util.FlxTimer; import flixel.math.FlxPoint; @@ -122,6 +123,7 @@ class StoryMenuState extends MusicBeatState { changeWeek(0, true); DiscordUtil.changePresence("In the Menus", null); + CoolUtil.playMenuSong(); } var __lastDifficultyTween:FlxTween; @@ -204,7 +206,116 @@ class StoryMenuState extends MusicBeatState { } public function loadXMLs() { - loadXML(Paths.xml('weeks')); + // CoolUtil.coolTextFile(Paths.txt('freeplaySonglist')); + var weeks:Array = []; + 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, + 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 = []; + 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) { + + 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); + } + if (char == null) return; + + if (characters[charName] != null) return; + var charObj:MenuCharacter = { + spritePath: Paths.image(char.getAtt('sprite').getDefault('menus/storymenu/characters/${charName}')), + 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, source:funkin.system.AssetsLibraryList.AssetSource) { + var path:String = Paths.txt('freeplaySonglist'); + var weeksFound:Array = []; + 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() { @@ -241,71 +352,9 @@ class StoryMenuState extends MusicBeatState { for(el in xml.elements) { switch(el.name) { case 'characters': - for(k=>char in el.nodes.char) { - if (!char.has.name) { - Logs.trace('weeks.xml: Character at index ${k} has no name. Skipping...', WARNING); - continue; - } - if (characters[char.att.name] != null) continue; - var charObj:MenuCharacter = { - spritePath: Paths.image(char.getAtt('sprite').getDefault('menus/storymenu/characters/${char.att.name}')), - 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[char.att.name] = charObj; - } + case 'weeks': - for(k=>week in el.nodes.week) { - if (!week.has.name) { - Logs.trace('weeks.xml: Week at index ${k} has no name. Skipping...', WARNING); - continue; - } - var weekObj:WeekData = { - name: week.att.name, - sprite: week.getAtt('sprite').getDefault('week${k}'), - chars: [null, null, null], - songs: [], - difficulties: ['easy', 'normal', 'hard'] - }; - - var diffNodes = week.nodes.difficulty; - if (diffNodes.length > 0) { - var diffs:Array = []; - 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 - weekObj.chars[k] = e.trim(); - } - } - for(k2=>song in week.nodes.song) { - if (!song.has.name) { - Logs.trace('weeks.xml: Song at index ${k2} in week ${weekObj.name} has no name. Skipping...', WARNING); - continue; - } - weekObj.songs.push({ - name: song.att.name, - hide: song.getAtt('hide').getDefault('false') == "true" - }); - } - if (weekObj.songs.length <= 0) { - Logs.trace('weeks.xml: Week ${weekObj.name} has no songs. Skipping...', WARNING); - continue; - } - weeks.push(weekObj); - } + } } } catch(e) { diff --git a/source/funkin/utils/CoolUtil.hx b/source/funkin/utils/CoolUtil.hx index abedfb4e..07cf256c 100644 --- a/source/funkin/utils/CoolUtil.hx +++ b/source/funkin/utils/CoolUtil.hx @@ -204,7 +204,8 @@ class CoolUtil public static function coolTextFile(path:String):Array { - return [for(e in Assets.getText(path).trim().split('\n')) e.trim()]; + var trim:String; + return [for(line in Assets.getText(path).split("\n")) if ((trim = line.trim()) != "" && !trim.startsWith("#")) trim]; } public static inline function numberArray(max:Int, ?min:Int = 0):Array