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+ }
0 commit comments