Skip to content

Commit f59864d

Browse files
committed
StoryWeeklist + Week class+ loading weeks fix
BIG REWRITE!! a 2 YEARS OLD commit, are we DEADASS for never noticing the way they loaded😭🥀
1 parent c809edb commit f59864d

File tree

7 files changed

+202
-190
lines changed

7 files changed

+202
-190
lines changed

source/funkin/backend/chart/Chart.hx

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -87,30 +87,25 @@ class Chart {
8787
return data;
8888
}
8989

90-
public static function loadChartMeta(songName:String, difficulty:String = "normal", fromMods:Bool = true) {
90+
public static function loadChartMeta(songName:String, difficulty:String = "normal", fromMods:Bool = true):ChartMetaData {
9191
var songNameLower = songName.toLowerCase();
9292
var metaPath = Paths.file('songs/${songNameLower}/meta.json');
9393
var metaDiffPath = Paths.file('songs/${songNameLower}/meta-${difficulty.toLowerCase()}.json');
9494

9595
var data:ChartMetaData = null;
9696
var fromMods:Bool = fromMods;
97-
for(path in [metaDiffPath, metaPath]) {
98-
if (Assets.exists(path)) {
99-
fromMods = Paths.assetsTree.existsSpecific(path, "TEXT", MODS);
100-
try {
101-
data = Json.parse(Assets.getText(path));
102-
} catch(e) {
103-
Logs.trace('Failed to load song metadata for ${songName} ($path): ${Std.string(e)}', ERROR);
104-
}
105-
if (data != null) break;
106-
}
97+
for (path in [metaDiffPath, metaPath]) if (Assets.exists(path)) {
98+
fromMods = Paths.assetsTree.existsSpecific(path, "TEXT", MODS);
99+
try data = Json.parse(Assets.getText(path))
100+
catch(e) Logs.trace('Failed to load song metadata for ${songName} ($path): ${Std.string(e)}', ERROR);
101+
if (data != null) break;
107102
}
108103

109-
if (data == null)
110-
data = {
111-
name: songName,
112-
bpm: 100
113-
};
104+
if (data == null) data = {
105+
name: songName,
106+
bpm: 100
107+
};
108+
114109
data.setFieldDefault("name", songName);
115110
data.setFieldDefault("beatsPerMeasure", 4);
116111
data.setFieldDefault("stepsPerBeat", 4);
@@ -165,11 +160,9 @@ class Chart {
165160
valid = false;
166161
}
167162
var data:Dynamic = null;
168-
try {
169-
if (valid)
170-
data = Json.parse(Assets.getText(chartPath));
171-
} catch(e) {
172-
Logs.trace('Could not parse chart for song ${songName} ($difficulty): ${Std.string(e)}', ERROR, RED);
163+
if (valid) {
164+
try data = Json.parse(Assets.getText(chartPath))
165+
catch(e) Logs.trace('Could not parse chart for song ${songName} ($difficulty): ${Std.string(e)}', ERROR, RED);
173166
}
174167

175168
/**
@@ -230,8 +223,7 @@ class Chart {
230223
return 0;
231224
default:
232225
var index = chart.noteTypes.indexOf(noteTypeName);
233-
if (index > -1)
234-
return index+1;
226+
if (index > -1) return index + 1;
235227
chart.noteTypes.push(noteTypeName);
236228
return chart.noteTypes.length;
237229
}

source/funkin/backend/scripting/events/WeekSelectEvent.hx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package funkin.backend.scripting.events;
22

3-
import funkin.menus.StoryMenuState.WeekData;
3+
import funkin.backend.week.WeekData;
44

55
final class WeekSelectEvent extends CancellableEvent {
66
/**

source/funkin/backend/week/Week.hx

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package funkin.backend.week;
2+
3+
import flixel.math.FlxPoint;
4+
import funkin.backend.week.WeekData.WeekCharacter;
5+
import funkin.backend.week.WeekData;
6+
import haxe.xml.Access;
7+
8+
class Week {
9+
public static function loadWeek(weekName:String, loadCharactersData:Bool = true):WeekData {
10+
var week:Access = null;
11+
try week = new Access(Xml.parse(Assets.getText(Paths.xml('weeks/weeks/$weekName'))).firstElement())
12+
catch(e) Logs.trace('Cannot parse week "$weekName.xml": ${Std.string(e)}', ERROR);
13+
14+
if (week == null) return null;
15+
if (!week.has.name) {
16+
Logs.trace('Week "${weekName}" has no name attribute', WARNING);
17+
return null;
18+
}
19+
20+
var weekObj:WeekData = {
21+
xml: week,
22+
name: week.att.name,
23+
id: weekName,
24+
sprite: week.getAtt('sprite').getDefault(weekName),
25+
chars: [null, null, null],
26+
songs: [],
27+
difficulties: ['easy', 'normal', 'hard']
28+
};
29+
30+
var weekName = weekObj.name;
31+
for (k => song in week.nodes.song) {
32+
if (song == null) continue;
33+
try {
34+
var name = song.innerData.trim();
35+
if (name == "") {
36+
Logs.trace('Song at index ${k} in week $weekName has no name. Skipping...', WARNING);
37+
continue;
38+
}
39+
weekObj.songs.push({
40+
name: name,
41+
hide: song.getAtt('hide').getDefault('false') == "true",
42+
displayName: song.getAtt('displayName')
43+
});
44+
} catch(e) {
45+
Logs.trace('Song at index ${k} in week $weekName cannot contain any other XML nodes in its name.', WARNING);
46+
continue;
47+
}
48+
}
49+
50+
if (weekObj.songs.length <= 0) {
51+
Logs.trace('Week $weekName has no songs.', WARNING);
52+
return null;
53+
}
54+
55+
var diffNodes = week.nodes.difficulty;
56+
if (diffNodes.length > 0) {
57+
var diffs:Array<String> = [for (e in diffNodes) if (e.has.name) e.att.name];
58+
if (diffs.length > 0) weekObj.difficulties = diffs;
59+
}
60+
61+
if (week.has.chars) for (k => e in week.att.chars.split(",")) {
62+
var trim = e.trim();
63+
weekObj.chars[k] = (trim == "" || e == "none" || e == "null") ? null : (loadCharactersData ? loadWeekCharacter(trim) : {name: trim});
64+
}
65+
66+
return weekObj;
67+
}
68+
69+
public static function loadWeekCharacter(charName:String):WeekCharacter {
70+
var char:Access = null;
71+
try char = new Access(Xml.parse(Assets.getText(Paths.xml('weeks/characters/$charName'))).firstElement())
72+
catch(e) Logs.trace('Cannot parse character "$charName.xml": ${Std.string(e)}', ERROR);
73+
if (char == null) return null;
74+
75+
return {
76+
xml: char,
77+
name: charName,
78+
spritePath: Paths.image(char.getAtt('sprite').getDefault('menus/storymenu/characters/${charName}')),
79+
scale: Std.parseFloat(char.getAtt('scale')).getDefault(1),
80+
offset: FlxPoint.get(
81+
Std.parseFloat(char.getAtt('x')).getDefault(0),
82+
Std.parseFloat(char.getAtt('y')).getDefault(0)
83+
)
84+
};
85+
}
86+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package funkin.backend.week;
2+
3+
import flixel.math.FlxPoint;
4+
import haxe.xml.Access;
5+
6+
typedef WeekData = {
7+
var ?xml:Access;
8+
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
9+
var id:String; // id IS instead for saving and loading!! - Nex
10+
var sprite:String;
11+
var chars:Array<WeekCharacter>;
12+
var songs:Array<WeekSong>;
13+
var difficulties:Array<String>;
14+
}
15+
16+
typedef WeekCharacter = {
17+
var ?xml:Access;
18+
var name:String;
19+
var ?spritePath:String;
20+
var ?scale:Float;
21+
var ?offset:FlxPoint;
22+
// var frames:FlxFramesCollection;
23+
}
24+
25+
typedef WeekSong = {
26+
var name:String;
27+
var hide:Bool;
28+
var ?displayName:String;
29+
}

source/funkin/game/PlayState.hx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import funkin.backend.chart.Chart;
1212
import funkin.backend.chart.ChartData;
1313
import funkin.game.SplashHandler;
1414
import funkin.backend.scripting.DummyScript;
15-
import funkin.menus.StoryMenuState.WeekData;
15+
import funkin.backend.week.WeekData;
1616
import funkin.backend.FunkinText;
1717
import funkin.backend.scripting.Script;
1818
import funkin.backend.scripting.ScriptPack;
@@ -1961,7 +1961,7 @@ class PlayState extends MusicBeatState
19611961
*/
19621962
public static function loadWeek(weekData:WeekData, difficulty:String = "normal") {
19631963
storyWeek = weekData;
1964-
storyPlaylist = [for(e in weekData.songs) e.name];
1964+
storyPlaylist = [for (e in weekData.songs) e.name];
19651965
isStoryMode = true;
19661966
campaignScore = 0;
19671967
campaignMisses = 0;
@@ -1994,7 +1994,6 @@ class PlayState extends MusicBeatState
19941994
*/
19951995
public static function __loadSong(name:String, difficulty:String) {
19961996
PlayState.difficulty = difficulty;
1997-
19981997
PlayState.SONG = Chart.parse(name, difficulty);
19991998
PlayState.fromMods = PlayState.SONG.fromMods;
20001999
}

source/funkin/menus/FreeplayState.hx

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -439,16 +439,10 @@ class FreeplaySonglist {
439439

440440
public function getSongsFromSource(source:funkin.backend.assets.AssetsLibraryList.AssetSource, useTxt:Bool = true) {
441441
var path:String = Paths.txt('freeplaySonglist');
442-
var songsFound:Array<String> = [];
443-
if (useTxt && Paths.assetsTree.existsSpecific(path, "TEXT", source)) {
444-
songsFound = CoolUtil.coolTextFile(Paths.txt('freeplaySonglist'));
445-
} else {
446-
songsFound = Paths.getFolderDirectories('songs', false, source);
447-
}
442+
var songsFound:Array<String> = useTxt && Paths.assetsTree.existsSpecific(path, "TEXT", source) ? CoolUtil.coolTextFile(path) : Paths.getFolderDirectories('songs', false, source);
448443

449444
if (songsFound.length > 0) {
450-
for(s in songsFound)
451-
songs.push(Chart.loadChartMeta(s, "normal", source == MODS));
445+
for (s in songsFound) songs.push(Chart.loadChartMeta(s, "normal", source == MODS));
452446
return false;
453447
}
454448
return true;

0 commit comments

Comments
 (0)