1
0
mirror of synced 2024-12-25 04:04:51 +01:00
bemaniutils/bemani/backend/sdvx/gravitywars_s2.py

4295 lines
134 KiB
Python

# vim: set fileencoding=utf-8
from typing import Any, Dict, List, Tuple
from bemani.backend.sdvx.gravitywars import SoundVoltexGravityWars
from bemani.common import ID, Profile
from bemani.data import Score, UserID
from bemani.protocol import Node
class SoundVoltexGravityWarsSeason2(
SoundVoltexGravityWars,
):
def _get_skill_analyzer_seasons(self) -> Dict[int, str]:
return {
1: "SKILL ANALYZER 第1回 Aコース",
2: "SKILL ANALYZER 第1回 Bコース",
3: "SKILL ANALYZER 第1回 Cコース",
4: "The 4th KAC コース",
5: "SKILL ANALYZER 第2回 Aコース",
6: "SKILL ANALYZER 第2回 Bコース",
7: "SKILL ANALYZER 第2回 Cコース",
8: "SKILL ANALYZER 第3回 Aコース",
9: "SKILL ANALYZER 第3回 Bコース",
10: "SKILL ANALYZER 第3回 Cコース",
11: "SKILL ANALYZER 第4回",
12: "SKILL ANALYZER 第5回 Aコース",
13: "SKILL ANALYZER 第5回 Bコース",
14: "SKILL ANALYZER 第5回 Cコース",
15: "SKILL ANALYZER 第6回 Aコース",
16: "SKILL ANALYZER 第6回 Bコース",
17: "天下一コース",
18: "The 5th KAC コース",
19: "VOLTEXES コース",
20: "SKILL ANALYZER 第7回",
21: "SKILL ANALYZER 第8回",
}
def _get_skill_analyzer_courses(self) -> List[Dict[str, Any]]:
return [
{
"level": 0,
"season_id": 1,
"tracks": [
{
"id": 109,
"type": self.CHART_TYPE_NOVICE,
},
{
"id": 283,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 279,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 1,
"season_id": 1,
"tracks": [
{
"id": 76,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 196,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 8,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 2,
"season_id": 1,
"tracks": [
{
"id": 90,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 228,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 80,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 3,
"season_id": 1,
"tracks": [
{
"id": 125,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 201,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 237,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 4,
"season_id": 1,
"tracks": [
{
"id": 393,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 352,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 66,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 5,
"season_id": 1,
"tracks": [
{
"id": 383,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 511,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 331,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 6,
"season_id": 1,
"tracks": [
{
"id": 422,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 445,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 71,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 7,
"season_id": 1,
"tracks": [
{
"id": 454,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 158,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 173,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 8,
"season_id": 1,
"tracks": [
{
"id": 322,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 63,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 124,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 9,
"season_id": 1,
"tracks": [
{
"id": 348,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 73,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 259,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 0,
"season_id": 2,
"tracks": [
{
"id": 374,
"type": self.CHART_TYPE_NOVICE,
},
{
"id": 84,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 303,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 1,
"season_id": 2,
"tracks": [
{
"id": 22,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 274,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 183,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 2,
"season_id": 2,
"tracks": [
{
"id": 56,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 244,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 4,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 3,
"season_id": 2,
"tracks": [
{
"id": 414,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 209,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 334,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 4,
"season_id": 2,
"tracks": [
{
"id": 123,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 403,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 23,
"type": self.CHART_TYPE_INFINITE,
},
],
},
{
"level": 5,
"season_id": 2,
"tracks": [
{
"id": 391,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 239,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 426,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 6,
"season_id": 2,
"tracks": [
{
"id": 389,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 89,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 246,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 7,
"season_id": 2,
"tracks": [
{
"id": 419,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 299,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 341,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 8,
"season_id": 2,
"tracks": [
{
"id": 394,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 466,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 47,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 9,
"season_id": 2,
"tracks": [
{
"id": 500,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 247,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 229,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 0,
"season_id": 3,
"tracks": [
{
"id": 36,
"type": self.CHART_TYPE_NOVICE,
},
{
"id": 189,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 171,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 1,
"season_id": 3,
"tracks": [
{
"id": 182,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 3,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 105,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 2,
"season_id": 3,
"tracks": [
{
"id": 14,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 120,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 86,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 3,
"season_id": 3,
"tracks": [
{
"id": 390,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 243,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 186,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 4,
"season_id": 3,
"tracks": [
{
"id": 36,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 423,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 59,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 5,
"season_id": 3,
"tracks": [
{
"id": 452,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 262,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 480,
"type": self.CHART_TYPE_INFINITE,
},
],
},
{
"level": 6,
"season_id": 3,
"tracks": [
{
"id": 411,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 70,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 211,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 7,
"season_id": 3,
"tracks": [
{
"id": 30,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 72,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 293,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 8,
"season_id": 3,
"tracks": [
{
"id": 87,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 117,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 269,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 9,
"season_id": 3,
"tracks": [
{
"id": 498,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 437,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 126,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 0,
"level": -1,
"skill_name": "エンジョイ♪ごりらコースA",
"skill_name_id": 12,
"season_id": 4,
"tracks": [
{
"id": 466,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 273,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 470,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"id": 1,
"level": -1,
"skill_name": "エンジョイ♪ごりらコースB",
"skill_name_id": 12,
"season_id": 4,
"tracks": [
{
"id": 194,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 343,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 501,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"id": 2,
"level": -1,
"skill_name": "エンジョイ♪ごりらコースC",
"skill_name_id": 12,
"season_id": 4,
"tracks": [
{
"id": 356,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 7,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 472,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"id": 3,
"level": -1,
"skill_name": "エンジョイ♪ごりらコースD",
"skill_name_id": 12,
"season_id": 4,
"tracks": [
{
"id": 299,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 333,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 583,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"id": 4,
"level": -1,
"skill_name": "チャレンジ★ごりらコースA",
"skill_name_id": 12,
"season_id": 4,
"tracks": [
{
"id": 466,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 273,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 470,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 5,
"level": -1,
"skill_name": "チャレンジ★ごりらコースB",
"skill_name_id": 12,
"season_id": 4,
"tracks": [
{
"id": 194,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 343,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 501,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 6,
"level": -1,
"skill_name": "チャレンジ★ごりらコースC",
"skill_name_id": 12,
"season_id": 4,
"tracks": [
{
"id": 356,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 7,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 472,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 7,
"level": -1,
"skill_name": "チャレンジ★ごりらコースD",
"skill_name_id": 12,
"season_id": 4,
"tracks": [
{
"id": 299,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 333,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 583,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 0,
"season_id": 5,
"tracks": [
{
"id": 47,
"type": self.CHART_TYPE_NOVICE,
},
{
"id": 334,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 10,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 1,
"season_id": 5,
"tracks": [
{
"id": 11,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 224,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 132,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 2,
"season_id": 5,
"tracks": [
{
"id": 137,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 336,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 380,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 3,
"season_id": 5,
"tracks": [
{
"id": 109,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 308,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 113,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 4,
"season_id": 5,
"tracks": [
{
"id": 101,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 200,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 478,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 5,
"season_id": 5,
"tracks": [
{
"id": 487,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 254,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 410,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 6,
"season_id": 5,
"tracks": [
{
"id": 196,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 170,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 218,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 7,
"season_id": 5,
"tracks": [
{
"id": 489,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 519,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 373,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 8,
"season_id": 5,
"tracks": [
{
"id": 456,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 263,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 390,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 9,
"season_id": 5,
"tracks": [
{
"id": 19,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 116,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 508,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 0,
"season_id": 6,
"tracks": [
{
"id": 123,
"type": self.CHART_TYPE_NOVICE,
},
{
"id": 231,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 185,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 1,
"season_id": 6,
"tracks": [
{
"id": 65,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 386,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 92,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 2,
"season_id": 6,
"tracks": [
{
"id": 379,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 225,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 427,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 3,
"season_id": 6,
"tracks": [
{
"id": 122,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 249,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 185,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 4,
"season_id": 6,
"tracks": [
{
"id": 413,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 157,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 402,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 5,
"season_id": 6,
"tracks": [
{
"id": 412,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 323,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 256,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 6,
"season_id": 6,
"tracks": [
{
"id": 400,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 368,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 241,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 7,
"season_id": 6,
"tracks": [
{
"id": 453,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 442,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 216,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 8,
"season_id": 6,
"tracks": [
{
"id": 370,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 244,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 252,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 9,
"season_id": 6,
"tracks": [
{
"id": 359,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 214,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 506,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 0,
"season_id": 7,
"tracks": [
{
"id": 124,
"type": self.CHART_TYPE_NOVICE,
},
{
"id": 446,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 34,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 1,
"season_id": 7,
"tracks": [
{
"id": 113,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 309,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 42,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 2,
"season_id": 7,
"tracks": [
{
"id": 353,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 246,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 130,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 3,
"season_id": 7,
"tracks": [
{
"id": 63,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 219,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 153,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 4,
"season_id": 7,
"tracks": [
{
"id": 418,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 369,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 385,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 5,
"season_id": 7,
"tracks": [
{
"id": 226,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 301,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 159,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 6,
"season_id": 7,
"tracks": [
{
"id": 311,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 255,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 213,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 7,
"season_id": 7,
"tracks": [
{
"id": 357,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 268,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 304,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 8,
"season_id": 7,
"tracks": [
{
"id": 295,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 36,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 302,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 9,
"season_id": 7,
"tracks": [
{
"id": 7,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 208,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 376,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 0,
"season_id": 8,
"tracks": [
{
"id": 101,
"type": self.CHART_TYPE_NOVICE,
},
{
"id": 219,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 159,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 1,
"season_id": 8,
"tracks": [
{
"id": 87,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 337,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 403,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 2,
"season_id": 8,
"tracks": [
{
"id": 30,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 596,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 39,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 3,
"season_id": 8,
"tracks": [
{
"id": 430,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 561,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 328,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 4,
"season_id": 8,
"tracks": [
{
"id": 444,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 618,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 100,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 5,
"season_id": 8,
"tracks": [
{
"id": 447,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 545,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 94,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 6,
"season_id": 8,
"tracks": [
{
"id": 291,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 2,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 475,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 7,
"season_id": 8,
"tracks": [
{
"id": 627,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 624,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 427,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 8,
"season_id": 8,
"tracks": [
{
"id": 464,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 122,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 591,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 9,
"season_id": 8,
"tracks": [
{
"id": 381,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 463,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 507,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 0,
"season_id": 9,
"tracks": [
{
"id": 468,
"type": self.CHART_TYPE_NOVICE,
},
{
"id": 243,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 388,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 1,
"season_id": 9,
"tracks": [
{
"id": 167,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 486,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 75,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 2,
"season_id": 9,
"tracks": [
{
"id": 96,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 557,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 55,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 3,
"season_id": 9,
"tracks": [
{
"id": 116,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 520,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 314,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 4,
"season_id": 9,
"tracks": [
{
"id": 507,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 567,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 205,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 5,
"season_id": 9,
"tracks": [
{
"id": 86,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 488,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 80,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 6,
"season_id": 9,
"tracks": [
{
"id": 184,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 130,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 524,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 7,
"season_id": 9,
"tracks": [
{
"id": 521,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 576,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 503,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 8,
"season_id": 9,
"tracks": [
{
"id": 473,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 125,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 538,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 9,
"season_id": 9,
"tracks": [
{
"id": 407,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 472,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 363,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 0,
"season_id": 10,
"tracks": [
{
"id": 122,
"type": self.CHART_TYPE_NOVICE,
},
{
"id": 209,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 24,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 1,
"season_id": 10,
"tracks": [
{
"id": 405,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 554,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 77,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 2,
"season_id": 10,
"tracks": [
{
"id": 426,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 262,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 194,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 3,
"season_id": 10,
"tracks": [
{
"id": 343,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 564,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 248,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 4,
"season_id": 10,
"tracks": [
{
"id": 126,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 471,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 276,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 5,
"season_id": 10,
"tracks": [
{
"id": 476,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 120,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 57,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 6,
"season_id": 10,
"tracks": [
{
"id": 146,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 622,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 152,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 7,
"season_id": 10,
"tracks": [
{
"id": 562,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 531,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 449,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 8,
"season_id": 10,
"tracks": [
{
"id": 404,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 123,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 607,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 9,
"season_id": 10,
"tracks": [
{
"id": 469,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 496,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 289,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
# Manually specify IDs here since this has more than one level 11.
{
"id": 0,
"level": 0,
"season_id": 11,
"tracks": [
{
"id": 190,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 568,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 191,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"id": 1,
"level": 1,
"season_id": 11,
"tracks": [
{
"id": 278,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 41,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 18,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"id": 2,
"level": 2,
"season_id": 11,
"tracks": [
{
"id": 15,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 483,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 467,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"id": 3,
"level": 3,
"season_id": 11,
"tracks": [
{
"id": 585,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 486,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 48,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 4,
"level": 4,
"season_id": 11,
"tracks": [
{
"id": 103,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 335,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 224,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 5,
"level": 5,
"season_id": 11,
"tracks": [
{
"id": 275,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 438,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 67,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 6,
"level": 6,
"season_id": 11,
"tracks": [
{
"id": 202,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 264,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 526,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 7,
"level": 7,
"season_id": 11,
"tracks": [
{
"id": 131,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 155,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 394,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 8,
"level": 8,
"season_id": 11,
"tracks": [
{
"id": 396,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 346,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 510,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 9,
"level": 9,
"season_id": 11,
"tracks": [
{
"id": 326,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 470,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 362,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 10,
"level": 10,
"season_id": 11,
"tracks": [
{
"id": 339,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 418,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 525,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 11,
"level": 10,
"season_id": 11,
"tracks": [
{
"id": 36,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 47,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 73,
"type": self.CHART_TYPE_INFINITE,
},
],
},
{
"id": 12,
"level": 11,
"season_id": 11,
"tracks": [
{
"id": 126,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 367,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 636,
"type": self.CHART_TYPE_INFINITE,
},
],
},
{
"level": 0,
"season_id": 12,
"tracks": [
{
"id": 507,
"type": self.CHART_TYPE_NOVICE,
},
{
"id": 671,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 176,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 1,
"season_id": 12,
"tracks": [
{
"id": 27,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 520,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 103,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 2,
"season_id": 12,
"tracks": [
{
"id": 478,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 264,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 322,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 3,
"season_id": 12,
"tracks": [
{
"id": 107,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 520,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 163,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 4,
"season_id": 12,
"tracks": [
{
"id": 408,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 34,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 678,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 5,
"season_id": 12,
"tracks": [
{
"id": 481,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 436,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 104,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 6,
"season_id": 12,
"tracks": [
{
"id": 55,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 415,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 512,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 7,
"season_id": 12,
"tracks": [
{
"id": 483,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 509,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 557,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 8,
"season_id": 12,
"tracks": [
{
"id": 497,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 58,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 166,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 9,
"season_id": 12,
"tracks": [
{
"id": 581,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 439,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 443,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 0,
"season_id": 13,
"tracks": [
{
"id": 250,
"type": self.CHART_TYPE_NOVICE,
},
{
"id": 245,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 186,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 1,
"season_id": 13,
"tracks": [
{
"id": 13,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 618,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 31,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 2,
"season_id": 13,
"tracks": [
{
"id": 436,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 144,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 79,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 3,
"season_id": 13,
"tracks": [
{
"id": 489,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 245,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 222,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 4,
"season_id": 13,
"tracks": [
{
"id": 556,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 233,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 565,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 5,
"season_id": 13,
"tracks": [
{
"id": 354,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 281,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 2,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 6,
"season_id": 13,
"tracks": [
{
"id": 14,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 267,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 490,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 7,
"season_id": 13,
"tracks": [
{
"id": 467,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 585,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 560,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 8,
"season_id": 13,
"tracks": [
{
"id": 599,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 101,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 109,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 9,
"season_id": 13,
"tracks": [
{
"id": 630,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 408,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 393,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 0,
"season_id": 14,
"tracks": [
{
"id": 63,
"type": self.CHART_TYPE_NOVICE,
},
{
"id": 328,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 266,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 1,
"season_id": 14,
"tracks": [
{
"id": 23,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 453,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 153,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 2,
"season_id": 14,
"tracks": [
{
"id": 458,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 514,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 71,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 3,
"season_id": 14,
"tracks": [
{
"id": 392,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 388,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 569,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 4,
"season_id": 14,
"tracks": [
{
"id": 508,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 405,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 266,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 5,
"season_id": 14,
"tracks": [
{
"id": 50,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 172,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 33,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 6,
"season_id": 14,
"tracks": [
{
"id": 210,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 232,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 485,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 7,
"season_id": 14,
"tracks": [
{
"id": 457,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 514,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 556,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 8,
"season_id": 14,
"tracks": [
{
"id": 534,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 273,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 220,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 9,
"season_id": 14,
"tracks": [
{
"id": 420,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 444,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 151,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 0,
"season_id": 15,
"tracks": [
{
"id": 117,
"type": self.CHART_TYPE_NOVICE,
},
{
"id": 564,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 318,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 1,
"season_id": 15,
"tracks": [
{
"id": 93,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 308,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 49,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 2,
"season_id": 15,
"tracks": [
{
"id": 317,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 335,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 239,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 3,
"season_id": 15,
"tracks": [
{
"id": 439,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 44,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 243,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 4,
"season_id": 15,
"tracks": [
{
"id": 158,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 175,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 150,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 5,
"season_id": 15,
"tracks": [
{
"id": 162,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 79,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 386,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 6,
"season_id": 15,
"tracks": [
{
"id": 99,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 22,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 164,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 7,
"season_id": 15,
"tracks": [
{
"id": 406,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 344,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 6,
"type": self.CHART_TYPE_INFINITE,
},
],
},
{
"level": 8,
"season_id": 15,
"tracks": [
{
"id": 660,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 378,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 465,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 9,
"season_id": 15,
"tracks": [
{
"id": 413,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 221,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 342,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 10,
"season_id": 15,
"tracks": [
{
"id": 125,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 123,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 124,
"type": self.CHART_TYPE_INFINITE,
},
],
},
{
"level": 11,
"season_id": 15,
"tracks": [
{
"id": 366,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 695,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 692,
"type": self.CHART_TYPE_INFINITE,
},
],
},
{
"level": 0,
"season_id": 16,
"tracks": [
{
"id": 343,
"type": self.CHART_TYPE_NOVICE,
},
{
"id": 144,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 569,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 1,
"season_id": 16,
"tracks": [
{
"id": 515,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 254,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 354,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 2,
"season_id": 16,
"tracks": [
{
"id": 441,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 524,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 187,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"level": 3,
"season_id": 16,
"tracks": [
{
"id": 117,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 446,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 435,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 4,
"season_id": 16,
"tracks": [
{
"id": 180,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 260,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 451,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
# The level 6 course for this version is intentionally missing,
# as a song that it included was removed and thus the course was
# as well.
{
"level": 6,
"season_id": 16,
"tracks": [
{
"id": 440,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 112,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 401,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 7,
"season_id": 16,
"tracks": [
{
"id": 325,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 387,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 42,
"type": self.CHART_TYPE_INFINITE,
},
],
},
{
"level": 8,
"season_id": 16,
"tracks": [
{
"id": 676,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 494,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 234,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 9,
"season_id": 16,
"tracks": [
{
"id": 155,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 623,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 329,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 10,
"season_id": 16,
"tracks": [
{
"id": 450,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 634,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 360,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"level": 11,
"season_id": 16,
"tracks": [
{
"id": 116,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 693,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 694,
"type": self.CHART_TYPE_INFINITE,
},
],
},
{
"id": 0,
"level": -1,
"skill_name": "天下一 (梅)コース",
"skill_name_id": 13,
"season_id": 17,
"tracks": [
{
"id": 625,
"type": self.CHART_TYPE_NOVICE,
},
{
"id": 697,
"type": self.CHART_TYPE_NOVICE,
},
{
"id": 708,
"type": self.CHART_TYPE_NOVICE,
},
],
},
{
"id": 1,
"level": -1,
"skill_name": "天下一 (竹)コース",
"skill_name_id": 13,
"season_id": 17,
"tracks": [
{
"id": 625,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 697,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 708,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"id": 2,
"level": -1,
"skill_name": "天下一 (松)コース",
"skill_name_id": 13,
"season_id": 17,
"tracks": [
{
"id": 625,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 697,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 708,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 0,
"level": -1,
"skill_name": "青龍の戯れ",
"skill_name_id": 14,
"season_id": 18,
"tracks": [
{
"id": 439,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 675,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 692,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"id": 1,
"level": -1,
"skill_name": "朱雀の戯れ",
"skill_name_id": 16,
"season_id": 18,
"tracks": [
{
"id": 587,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 543,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 693,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"id": 2,
"level": -1,
"skill_name": "玄武の戯れ",
"skill_name_id": 17,
"season_id": 18,
"tracks": [
{
"id": 696,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 697,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 695,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"id": 3,
"level": -1,
"skill_name": "白虎の戯れ",
"skill_name_id": 15,
"season_id": 18,
"tracks": [
{
"id": 606,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 593,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 694,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"id": 4,
"level": -1,
"skill_name": "青龍の戯れ",
"skill_name_id": 14,
"season_id": 18,
"tracks": [
{
"id": 439,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 675,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 692,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 5,
"level": -1,
"skill_name": "朱雀の戯れ",
"skill_name_id": 16,
"season_id": 18,
"tracks": [
{
"id": 587,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 543,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 693,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 6,
"level": -1,
"skill_name": "玄武の戯れ",
"skill_name_id": 17,
"season_id": 18,
"tracks": [
{
"id": 696,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 697,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 695,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 7,
"level": -1,
"skill_name": "白虎の戯れ",
"skill_name_id": 15,
"season_id": 18,
"tracks": [
{
"id": 606,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 593,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 694,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 0,
"level": -1,
"skill_name": "RANK 名も無き草",
"skill_name_id": 18,
"season_id": 19,
"tracks": [
{
"id": 783,
"type": self.CHART_TYPE_NOVICE,
},
{
"id": 784,
"type": self.CHART_TYPE_NOVICE,
},
{
"id": 785,
"type": self.CHART_TYPE_NOVICE,
},
],
},
{
"id": 1,
"level": -1,
"skill_name": "RANK 雪月花",
"skill_name_id": 18,
"season_id": 19,
"tracks": [
{
"id": 783,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 784,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 785,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"id": 2,
"level": -1,
"skill_name": "RANK 金剛雲",
"skill_name_id": 18,
"season_id": 19,
"tracks": [
{
"id": 783,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 784,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 785,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
# Manually specify IDs here since this has more than one level 11.
{
"id": 0,
"level": 0,
"season_id": 20,
"tracks": [
{
"id": 657,
"type": self.CHART_TYPE_NOVICE,
},
{
"id": 285,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 491,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"id": 1,
"level": 1,
"season_id": 20,
"tracks": [
{
"id": 446,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 588,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 21,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"id": 2,
"level": 2,
"season_id": 20,
"tracks": [
{
"id": 560,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 602,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 88,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"id": 3,
"level": 3,
"season_id": 20,
"tracks": [
{
"id": 470,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 515,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 65,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 4,
"level": 4,
"season_id": 20,
"tracks": [
{
"id": 499,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 358,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 72,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 5,
"level": 5,
"season_id": 20,
"tracks": [
{
"id": 573,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 559,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 602,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 6,
"level": 6,
"season_id": 20,
"tracks": [
{
"id": 255,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 164,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 783,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 7,
"level": 7,
"season_id": 20,
"tracks": [
{
"id": 425,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 54,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 771,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 8,
"level": 8,
"season_id": 20,
"tracks": [
{
"id": 589,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 592,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 776,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 9,
"level": 9,
"season_id": 20,
"tracks": [
{
"id": 779,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 611,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 670,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 10,
"level": 10,
"season_id": 20,
"tracks": [
{
"id": 522,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 543,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 610,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 11,
"level": 10,
"season_id": 20,
"tracks": [
{
"id": 122,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 180,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 214,
"type": self.CHART_TYPE_INFINITE,
},
],
},
{
"id": 12,
"level": 11,
"season_id": 20,
"tracks": [
{
"id": 661,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 258,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 791,
"type": self.CHART_TYPE_INFINITE,
},
],
},
# Manually specify IDs here since this has more than one level 11.
{
"id": 0,
"level": 0,
"season_id": 21,
"tracks": [
{
"id": 697,
"type": self.CHART_TYPE_NOVICE,
},
{
"id": 314,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 768,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"id": 1,
"level": 1,
"season_id": 21,
"tracks": [
{
"id": 16,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 528,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 118,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"id": 2,
"level": 2,
"season_id": 21,
"tracks": [
{
"id": 330,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 644,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 74,
"type": self.CHART_TYPE_ADVANCED,
},
],
},
{
"id": 3,
"level": 3,
"season_id": 21,
"tracks": [
{
"id": 494,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 294,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 61,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 4,
"level": 4,
"season_id": 21,
"tracks": [
{
"id": 498,
"type": self.CHART_TYPE_ADVANCED,
},
{
"id": 177,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 212,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 5,
"level": 5,
"season_id": 21,
"tracks": [
{
"id": 319,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 53,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 603,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 6,
"level": 6,
"season_id": 21,
"tracks": [
{
"id": 688,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 261,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 784,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 7,
"level": 7,
"season_id": 21,
"tracks": [
{
"id": 777,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 387,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 659,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 8,
"level": 8,
"season_id": 21,
"tracks": [
{
"id": 518,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 714,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 681,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 9,
"level": 9,
"season_id": 21,
"tracks": [
{
"id": 529,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 682,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 597,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 10,
"level": 10,
"season_id": 21,
"tracks": [
{
"id": 600,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 758,
"type": self.CHART_TYPE_EXHAUST,
},
{
"id": 816,
"type": self.CHART_TYPE_EXHAUST,
},
],
},
{
"id": 11,
"level": 10,
"season_id": 21,
"tracks": [
{
"id": 829,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 830,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 831,
"type": self.CHART_TYPE_INFINITE,
},
],
},
{
"id": 12,
"level": 11,
"season_id": 21,
"tracks": [
{
"id": 914,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 913,
"type": self.CHART_TYPE_INFINITE,
},
{
"id": 915,
"type": self.CHART_TYPE_INFINITE,
},
],
},
]
def _get_extra_events(self) -> List[int]:
return [
62, # Navigator select (empty by itself)
65, # Navigator crew recruitments bottom half
66, # Enable Tenkaichi Mode
69, # Season 2 differences
]
def handle_game_3_hiscore_request(self, request: Node) -> Node:
# Grab location for local scores
locid = ID.parse_machine_id(request.child_value("locid"))
# Start the response packet
game = Node.void("game_3")
# First, grab hit chart
playcounts = self.data.local.music.get_hit_chart(self.game, self.version, 1024)
hitchart = Node.void("hit")
game.add_child(hitchart)
for (songid, count) in playcounts:
info = Node.void("d")
hitchart.add_child(info)
info.add_child(Node.u32("id", songid))
info.add_child(Node.u32("cnt", count))
# Now, grab global and local scores as well as clear rates
global_records = self.data.remote.music.get_all_records(self.game, self.version)
users = {
uid: prof
for (uid, prof) in self.data.local.user.get_all_profiles(
self.game, self.version
)
}
area_users = [uid for uid in users if users[uid].get_int("loc", -1) == locid]
area_records = self.data.local.music.get_all_records(
self.game, self.version, userlist=area_users
)
clears = self.get_clear_rates()
records: Dict[int, Dict[int, Dict[str, Tuple[UserID, Score]]]] = {}
missing_users = [
userid for (userid, _) in global_records if userid not in users
] + [userid for (userid, _) in area_records if userid not in users]
for (userid, profile) in self.get_any_profiles(missing_users):
users[userid] = profile
for (userid, score) in global_records:
if userid not in users:
raise Exception("Logic error, missing profile for user!")
if score.id not in records:
records[score.id] = {}
if score.chart not in records[score.id]:
records[score.id][score.chart] = {}
records[score.id][score.chart]["global"] = (userid, score)
for (userid, score) in area_records:
if userid not in users:
raise Exception("Logic error, missing profile for user!")
if score.id not in records:
records[score.id] = {}
if score.chart not in records[score.id]:
records[score.id][score.chart] = {}
records[score.id][score.chart]["area"] = (userid, score)
# Output it to the game
highscores = Node.void("sc")
game.add_child(highscores)
for musicid in records:
for chart in records[musicid]:
(globaluserid, globalscore) = records[musicid][chart]["global"]
global_profile = users[globaluserid]
if clears[musicid][chart]["total"] > 0:
clear_rate = float(clears[musicid][chart]["clears"]) / float(
clears[musicid][chart]["total"]
)
else:
clear_rate = 0.0
info = Node.void("d")
highscores.add_child(info)
info.add_child(Node.u32("id", musicid))
info.add_child(Node.u32("ty", chart))
info.add_child(
Node.string("a_sq", ID.format_extid(global_profile.extid))
)
info.add_child(Node.string("a_nm", global_profile.get_str("name")))
info.add_child(Node.u32("a_sc", globalscore.points))
info.add_child(Node.s32("cr", int(clear_rate * 10000)))
if "area" in records[musicid][chart]:
(localuserid, localscore) = records[musicid][chart]["area"]
local_profile = users[localuserid]
info.add_child(
Node.string("l_sq", ID.format_extid(local_profile.extid))
)
info.add_child(Node.string("l_nm", local_profile.get_str("name")))
info.add_child(Node.u32("l_sc", localscore.points))
return game
def handle_game_3_load_r_request(self, request: Node) -> Node:
refid = request.child_value("dataid")
game = Node.void("game_3")
if refid is not None:
userid = self.data.remote.user.from_refid(self.game, self.version, refid)
else:
userid = None
if userid is not None:
links = self.data.local.user.get_links(self.game, self.version, userid)
for index, link in enumerate(links):
if link.type != "rival":
continue
other_profile = self.get_profile(link.other_userid)
if other_profile is None:
continue
# Base information about rival
rival = Node.void("rival")
game.add_child(rival)
rival.add_child(Node.s16("no", index))
rival.add_child(
Node.string("seq", ID.format_extid(other_profile.extid))
)
rival.add_child(Node.string("name", other_profile.get_str("name")))
# Return scores for this user on random charts
scores = self.data.remote.music.get_scores(
self.game, self.version, link.other_userid
)
for score in scores:
music = Node.void("music")
rival.add_child(music)
music.set_attribute("id", str(score.id))
music.set_attribute("type", str(score.chart))
music.set_attribute("sc", str(score.points))
return game
def format_profile(self, userid: UserID, profile: Profile) -> Node:
game = Node.void("game_3")
# Generic profile stuff
game.add_child(Node.string("name", profile.get_str("name")))
game.add_child(Node.string("code", ID.format_extid(profile.extid)))
game.add_child(Node.u32("gamecoin_packet", profile.get_int("packet")))
game.add_child(Node.u32("gamecoin_block", profile.get_int("block")))
game.add_child(
Node.s16(
"skill_name_id",
profile.get_int(
"chosen_skill_id", profile.get_int("skill_name_id", -1)
),
)
)
game.add_child(
Node.s32_array("hidden_param", profile.get_int_array("hidden_param", 20))
)
game.add_child(Node.u32("blaster_energy", profile.get_int("blaster_energy")))
game.add_child(Node.u32("blaster_count", profile.get_int("blaster_count")))
# Play statistics
statistics = self.get_play_statistics(userid)
game.add_child(Node.u32("play_count", statistics.total_plays))
game.add_child(Node.u32("daily_count", statistics.today_plays))
game.add_child(Node.u32("play_chain", statistics.consecutive_days))
# Last played stuff
if "last" in profile:
lastdict = profile.get_dict("last")
last = Node.void("last")
game.add_child(last)
last.add_child(Node.s32("music_id", lastdict.get_int("music_id", -1)))
last.add_child(Node.u8("music_type", lastdict.get_int("music_type")))
last.add_child(Node.u8("sort_type", lastdict.get_int("sort_type")))
last.add_child(Node.u8("narrow_down", lastdict.get_int("narrow_down")))
last.add_child(Node.u8("headphone", lastdict.get_int("headphone")))
last.add_child(Node.u16("appeal_id", lastdict.get_int("appeal_id", 1001)))
last.add_child(Node.u16("comment_id", lastdict.get_int("comment_id")))
last.add_child(Node.u8("gauge_option", lastdict.get_int("gauge_option")))
# Item unlocks
itemnode = Node.void("item")
game.add_child(itemnode)
game_config = self.get_game_config()
achievements = self.data.local.user.get_achievements(
self.game, self.version, userid
)
for item in achievements:
if item.type[:5] != "item_":
continue
itemtype = int(item.type[5:])
if (
game_config.get_bool("force_unlock_songs")
and itemtype == self.GAME_CATALOG_TYPE_SONG
):
# Don't echo unlocked songs, we will add all of them later
continue
if (
game_config.get_bool("force_unlock_cards")
and itemtype == self.GAME_CATALOG_TYPE_APPEAL_CARD
):
# Don't echo unlocked appeal cards, we will add all of them later
continue
if (
game_config.get_bool("force_unlock_crew")
and itemtype == self.GAME_CATALOG_TYPE_CREW
):
# Don't echo unlocked crew, we will add all of them later
continue
info = Node.void("info")
itemnode.add_child(info)
info.add_child(Node.u8("type", itemtype))
info.add_child(Node.u32("id", item.id))
info.add_child(Node.u32("param", item.data.get_int("param")))
if game_config.get_bool("force_unlock_songs"):
ids: Dict[int, int] = {}
songs = self.data.local.music.get_all_songs(self.game, self.version)
for song in songs:
if song.id not in ids:
ids[song.id] = 0
if song.data.get_int("difficulty") > 0:
ids[song.id] = ids[song.id] | (1 << song.chart)
for itemid in ids:
if ids[itemid] == 0:
continue
info = Node.void("info")
itemnode.add_child(info)
info.add_child(Node.u8("type", self.GAME_CATALOG_TYPE_SONG))
info.add_child(Node.u32("id", itemid))
info.add_child(Node.u32("param", ids[itemid]))
if game_config.get_bool("force_unlock_cards"):
catalog = self.data.local.game.get_items(self.game, self.version)
for unlock in catalog:
if unlock.type != "appealcard":
continue
info = Node.void("info")
itemnode.add_child(info)
info.add_child(Node.u8("type", self.GAME_CATALOG_TYPE_APPEAL_CARD))
info.add_child(Node.u32("id", unlock.id))
info.add_child(Node.u32("param", 1))
if game_config.get_bool("force_unlock_crew"):
for crewid in range(1, 781):
info = Node.void("info")
itemnode.add_child(info)
info.add_child(Node.u8("type", self.GAME_CATALOG_TYPE_CREW))
info.add_child(Node.u32("id", crewid))
info.add_child(Node.u32("param", 1))
# Skill courses
skill = Node.void("skill")
game.add_child(skill)
course_all = Node.void("course_all")
skill.add_child(course_all)
skill_level = -1
for course in achievements:
if course.type != "course":
continue
course_id = course.id % 100
season_id = int(course.id / 100)
if course.data.get_int("clear_type") >= 2:
# The user cleared this, lets take the highest level clear for this
courselist = [
c
for c in self._get_skill_analyzer_courses()
if c.get("id", c["level"]) == course_id
and c["season_id"] == season_id
]
if len(courselist) > 0:
skill_level = max(skill_level, courselist[0]["level"])
info = Node.void("d")
course_all.add_child(info)
info.add_child(Node.s16("crsid", course_id))
info.add_child(Node.s16("ct", course.data.get_int("clear_type")))
info.add_child(Node.s16("ar", course.data.get_int("achievement_rate")))
info.add_child(Node.s32("ssnid", season_id))
# Calculated skill level
game.add_child(Node.s16("skill_level", skill_level))
# Story mode unlocks
storynode = Node.void("story")
game.add_child(storynode)
for story in achievements:
if story.type != "story":
continue
info = Node.void("info")
storynode.add_child(info)
info.add_child(Node.s32("story_id", story.id))
info.add_child(Node.s32("progress_id", story.data.get_int("progress_id")))
info.add_child(
Node.s32("progress_param", story.data.get_int("progress_param"))
)
info.add_child(Node.s32("clear_cnt", story.data.get_int("clear_cnt")))
info.add_child(Node.u32("route_flg", story.data.get_int("route_flg")))
# Game parameters
paramnode = Node.void("param")
game.add_child(paramnode)
for param in achievements:
if param.type[:6] != "param_":
continue
paramtype = int(param.type[6:])
info = Node.void("info")
paramnode.add_child(info)
info.add_child(Node.s32("id", param.id))
info.add_child(Node.s32("type", paramtype))
info.add_child(
Node.s32_array("param", param.data["param"])
) # This looks to be variable, so no validation on length
return game
def unformat_profile(
self, userid: UserID, request: Node, oldprofile: Profile
) -> Profile:
newprofile = oldprofile.clone()
# Update blaster energy and in-game currencies
earned_gamecoin_packet = request.child_value("earned_gamecoin_packet")
if earned_gamecoin_packet is not None:
newprofile.replace_int(
"packet", newprofile.get_int("packet") + earned_gamecoin_packet
)
earned_gamecoin_block = request.child_value("earned_gamecoin_block")
if earned_gamecoin_block is not None:
newprofile.replace_int(
"block", newprofile.get_int("block") + earned_gamecoin_block
)
earned_blaster_energy = request.child_value("earned_blaster_energy")
if earned_blaster_energy is not None:
newprofile.replace_int(
"blaster_energy",
newprofile.get_int("blaster_energy") + earned_blaster_energy,
)
# Miscelaneous stuff
newprofile.replace_int("blaster_count", request.child_value("blaster_count"))
newprofile.replace_int("chosen_skill_id", request.child_value("skill_name_id"))
newprofile.replace_int_array(
"hidden_param", 20, request.child_value("hidden_param")
)
# Update user's unlock status if we aren't force unlocked
game_config = self.get_game_config()
if request.child("item") is not None:
for child in request.child("item").children:
if child.name != "info":
continue
item_id = child.child_value("id")
item_type = child.child_value("type")
param = child.child_value("param")
if (
game_config.get_bool("force_unlock_cards")
and item_type == self.GAME_CATALOG_TYPE_APPEAL_CARD
):
# Don't save back appeal cards because they were force unlocked
continue
if (
game_config.get_bool("force_unlock_songs")
and item_type == self.GAME_CATALOG_TYPE_SONG
):
# Don't save back songs, because they were force unlocked
continue
if (
game_config.get_bool("force_unlock_crew")
and item_type == self.GAME_CATALOG_TYPE_CREW
):
# Don't save back crew, because they were force unlocked
continue
self.data.local.user.put_achievement(
self.game,
self.version,
userid,
item_id,
f"item_{item_type}",
{
"param": param,
},
)
# Update story progress
if request.child("story") is not None:
for child in request.child("story").children:
if child.name != "info":
continue
story_id = child.child_value("story_id")
progress_id = child.child_value("progress_id")
progress_param = child.child_value("progress_param")
clear_cnt = child.child_value("clear_cnt")
route_flg = child.child_value("route_flg")
self.data.local.user.put_achievement(
self.game,
self.version,
userid,
story_id,
"story",
{
"progress_id": progress_id,
"progress_param": progress_param,
"clear_cnt": clear_cnt,
"route_flg": route_flg,
},
)
# Update params
if request.child("param") is not None:
for child in request.child("param").children:
if child.name != "info":
continue
param_id = child.child_value("id")
param_type = child.child_value("type")
param_param = child.child_value("param")
self.data.local.user.put_achievement(
self.game,
self.version,
userid,
param_id,
f"param_{param_type}",
{
"param": param_param,
},
)
# Grab last information.
lastdict = newprofile.get_dict("last")
lastdict.replace_int("headphone", request.child_value("headphone"))
lastdict.replace_int("appeal_id", request.child_value("appeal_id"))
lastdict.replace_int("comment_id", request.child_value("comment_id"))
lastdict.replace_int("music_id", request.child_value("music_id"))
lastdict.replace_int("music_type", request.child_value("music_type"))
lastdict.replace_int("sort_type", request.child_value("sort_type"))
lastdict.replace_int("narrow_down", request.child_value("narrow_down"))
lastdict.replace_int("gauge_option", request.child_value("gauge_option"))
# Save back last information gleaned from results
newprofile.replace_dict("last", lastdict)
# Keep track of play statistics
self.update_play_statistics(userid)
return newprofile