new weeks format

This commit is contained in:
Yoshman29
2023-02-22 02:15:15 +01:00
parent 2158da173a
commit 242860628b
23 changed files with 196 additions and 140 deletions
-72
View File
@@ -1,72 +0,0 @@
<!DOCTYPE codename-engine-weeks>
<config>
<characters>
<!-- BOYFRIEND -->
<char name="bf" scale="0.9" x="80">
<anim name="idle" anim="BF idle dance white" fps="24" loop="true" />
<anim name="confirm" anim="BF HEY!!" fps="24" loop="false"/>
</char>
<!-- ANIMATION IS AUTOMATICALLY ADDED. IF YOU WANT TO SPECIFY A PREFIX, ADD AN IDLE ANIM LIKE ABOVE. -->
<char name="dad" scale="0.5" x="50" />
<char name="gf" scale="0.5" />
<char name="spooky" scale="0.7" x="125" />
<char name="pico" scale="0.7" x="100" y="-30" flip="true"/>
<char name="mom" scale="0.5" x="50" y="10"/>
<char name="parents-christmas" scale="0.4" x="150" y="-20" />
<char name="senpai" x="130" y="-50"/>
<char name="tankman" x="75" y="-35"/>
</characters>
<weeks>
<!-- SPRITE BUTTONS ARE LOCATED IN "images/menus/storymenu/weeks/" -->
<!-- IF NO SPRITE ARE SPECIFIED, "week(week number)" WILL BE USED. -->
<!-- IF YOU WANT CUSTOM DIFFICULTIES, ADD THIS: difficulties="easy,normal,hard" -->
<!-- DIFFICULTIES SPRITES IN "images/menus/storymenu/difficulties/" -->
<week name="" chars="none,bf,gf" sprite="tutorial">
<song name="Tutorial" />
</week>
<week name="DADDY DEAREST" chars="dad,bf,gf" sprite="week1">
<song name="Bopeebo" />
<song name="Fresh" />
<song name="Dadbattle" />
</week>
<week name="SPOOKY MONTH" chars="spooky,bf,gf" sprite="week2">
<song name="Spookeez" />
<song name="South" />
<song name="Monster" hide="true" />
</week>
<week name="PICO" chars="pico,bf,gf" sprite="week3">
<song name="Pico" />
<song name="Philly Nice" />
<song name="Blammed" />
</week>
<week name="MOMMY MUST MURDER" chars="mom,bf,gf" sprite="week4">
<song name="Satin Panties" />
<song name="High" />
<song name="MILF" />
</week>
<week name="RED SNOW" chars="parents-christmas,bf,gf" sprite="week5">
<song name="Cocoa" />
<song name="Eggnog" />
<song name="Winter-Horrorland" hide="true" />
</week>
<week name="HATING SIMULATOR FT. MOAWLING" chars="senpai,bf,gf" sprite="week6">
<song name="Senpai" />
<song name="Roses" />
<song name="Thorns" hide="true" />
</week>
<week name="TANKMAN" chars="tankman,bf,gf" sprite="week7">
<song name="Ugh" />
<song name="Guns" />
<song name="Stress" />
</week>
</weeks>
</config>
+5
View File
@@ -0,0 +1,5 @@
<!DOCTYPE codename-engine-week-character>
<char scale="0.9" x="80">
<anim name="idle" anim="BF idle dance white" fps="24" loop="true" />
<anim name="confirm" anim="BF HEY!!" fps="24" loop="false"/>
</char>
+2
View File
@@ -0,0 +1,2 @@
<!DOCTYPE codename-engine-week-character>
<char scale="0.5" x="50" />
+2
View File
@@ -0,0 +1,2 @@
<!DOCTYPE codename-engine-week-character>
<char scale="0.5" />
+2
View File
@@ -0,0 +1,2 @@
<!DOCTYPE codename-engine-week-character>
<char scale="0.5" x="50" y="10"/>
@@ -0,0 +1,2 @@
<!DOCTYPE codename-engine-week-character>
<char scale="0.4" x="150" y="-20" />
+2
View File
@@ -0,0 +1,2 @@
<!DOCTYPE codename-engine-week-character>
<char scale="0.7" x="100" y="-30" flip="true"/>
+2
View File
@@ -0,0 +1,2 @@
<!DOCTYPE codename-engine-week-character>
<char x="130" y="-50"/>
+2
View File
@@ -0,0 +1,2 @@
<!DOCTYPE codename-engine-week-character>
<char scale="0.7" x="125" />
+2
View File
@@ -0,0 +1,2 @@
<!DOCTYPE codename-engine-week-character>
<char x="75" y="-35"/>
+11
View File
@@ -0,0 +1,11 @@
# THIS FILE ISNT NECESSARY,
# BUT YOU CAN USE IT TO SORT WEEKS
tutorial
week1
week2
week3
week4
week5
week6
week7
+4
View File
@@ -0,0 +1,4 @@
<!DOCTYPE codename-engine-week>
<week name="" chars="none,bf,gf" sprite="tutorial">
<song>Tutorial</song>
</week>
+6
View File
@@ -0,0 +1,6 @@
<!DOCTYPE codename-engine-week>
<week name="DADDY DEAREST" chars="dad,bf,gf" sprite="week1">
<song>Bopeebo</song>
<song>Fresh</song>
<song>Dadbattle</song>
</week>
+6
View File
@@ -0,0 +1,6 @@
<!DOCTYPE codename-engine-week>
<week name="SPOOKY MONTH" chars="spooky,bf,gf" sprite="week2">
<song>Spookeez</song>
<song>South</song>
<song hide="true">Monster</song>
</week>
+6
View File
@@ -0,0 +1,6 @@
<!DOCTYPE codename-engine-week>
<week name="PICO" chars="pico,bf,gf" sprite="week3">
<song>Pico</song>
<song>Philly Nice</song>
<song>Blammed</song>
</week>
+6
View File
@@ -0,0 +1,6 @@
<!DOCTYPE codename-engine-week>
<week name="MOMMY MUST MURDER" chars="mom,bf,gf" sprite="week4">
<song>Satin Panties</song>
<song>High</song>
<song>MILF</song>
</week>
+6
View File
@@ -0,0 +1,6 @@
<!DOCTYPE codename-engine-week>
<week name="RED SNOW" chars="parents-christmas,bf,gf" sprite="week5">
<song>Cocoa</song>
<song>Eggnog</song>
<song>Winter Horrorland</song>
</week>
+6
View File
@@ -0,0 +1,6 @@
<!DOCTYPE codename-engine-week>
<week name="HATING SIMULATOR FT. MOAWLING" chars="senpai,bf,gf" sprite="week6">
<song>Senpai</song>
<song>Roses</song>
<song hide="true">Thorns</song>
</week>
+6
View File
@@ -0,0 +1,6 @@
<!DOCTYPE codename-engine-week>
<week name="TANKMAN" chars="tankman,bf,gf" sprite="week7">
<song>Ugh</song>
<song>Guns</song>
<song>Stress</song>
</week>
+1 -1
View File
@@ -1 +1 @@
2366
2371
+1 -1
View File
@@ -399,7 +399,7 @@ class FreeplaySonglist {
var songsFound:Array<String> = [];
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);
}
+114 -65
View File
@@ -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<String> = [];
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<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) {
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<String>, source:funkin.system.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() {
@@ -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<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
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) {
+2 -1
View File
@@ -204,7 +204,8 @@ class CoolUtil
public static function coolTextFile(path:String):Array<String>
{
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<Int>