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