1
0
mirror of synced 2024-12-05 02:57:55 +01:00
bemaniutils/bemani/backend/sdvx/gravitywars_s1.py
2019-12-08 21:43:49 +00:00

3370 lines
105 KiB
Python

# vim: set fileencoding=utf-8
import copy
from typing import Any, Dict, List
from bemani.backend.sdvx.gravitywars import SoundVoltexGravityWars
from bemani.common import ID, Time, ValidatedDict
from bemani.data import UserID
from bemani.protocol import Node
class SoundVoltexGravityWarsSeason1(
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コース',
}
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,
},
],
},
{
'level': 5,
'season_id': 16,
'tracks': [
{
'id': 58,
'type': self.CHART_TYPE_EXHAUST,
},
{
'id': 195,
'type': self.CHART_TYPE_EXHAUST,
},
{
'id': 236,
'type': self.CHART_TYPE_EXHAUST,
},
],
},
{
'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,
},
],
},
]
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('hitchart')
game.add_child(hitchart)
for (songid, count) in playcounts:
info = Node.void('info')
hitchart.add_child(info)
info.add_child(Node.u32('id', songid))
info.add_child(Node.u32('cnt', count))
# Now, grab user records
records = self.data.remote.music.get_all_records(self.game, self.version)
missing_users = [userid for (userid, _) in records]
users = {userid: profile for (userid, profile) in self.get_any_profiles(missing_users)}
hiscore_allover = Node.void('hiscore_allover')
game.add_child(hiscore_allover)
# Output records
for (userid, score) in records:
info = Node.void('info')
if userid not in users:
raise Exception('Logic error, missing profile for user!')
profile = users[userid]
info.add_child(Node.u32('id', score.id))
info.add_child(Node.u32('type', score.chart))
info.add_child(Node.string('name', profile.get_str('name')))
info.add_child(Node.string('code', ID.format_extid(profile.get_int('extid'))))
info.add_child(Node.u32('score', score.points))
# Add to global scores
hiscore_allover.add_child(info)
# Now, grab local records
area_users = [
uid for (uid, prof) in self.data.local.user.get_all_profiles(self.game, self.version)
if prof.get_int('loc', -1) == locid
]
records = self.data.local.music.get_all_records(self.game, self.version, userlist=area_users)
missing_users = [userid for (userid, _) in records if userid not in users]
for (userid, profile) in self.get_any_profiles(missing_users):
users[userid] = profile
hiscore_location = Node.void('hiscore_location')
game.add_child(hiscore_location)
# Output records
for (userid, score) in records:
info = Node.void('info')
if userid not in users:
raise Exception('Logic error, missing profile for user!')
profile = users[userid]
info.add_child(Node.u32('id', score.id))
info.add_child(Node.u32('type', score.chart))
info.add_child(Node.string('name', profile.get_str('name')))
info.add_child(Node.string('code', ID.format_extid(profile.get_int('extid'))))
info.add_child(Node.u32('score', score.points))
# Add to global scores
hiscore_location.add_child(info)
# Now, grab clear rates
clear_rate = Node.void('clear_rate')
game.add_child(clear_rate)
clears = self.get_clear_rates()
for songid in clears:
for chart in clears[songid]:
if clears[songid][chart]['total'] > 0:
rate = float(clears[songid][chart]['clears']) / float(clears[songid][chart]['total'])
dnode = Node.void('d')
clear_rate.add_child(dnode)
dnode.add_child(Node.u32('id', songid))
dnode.add_child(Node.u32('type', chart))
dnode.add_child(Node.s16('cr', int(rate * 10000)))
return game
def format_profile(self, userid: UserID, profile: ValidatedDict) -> 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.get_int('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('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)
last_play_date = statistics.get_int_array('last_play_date', 3)
today_play_date = Time.todays_date()
if (
last_play_date[0] == today_play_date[0] and
last_play_date[1] == today_play_date[1] and
last_play_date[2] == today_play_date[2]
):
today_count = statistics.get_int('today_plays', 0)
else:
today_count = 0
game.add_child(Node.u32('play_count', statistics.get_int('total_plays', 0)))
game.add_child(Node.u32('daily_count', today_count))
game.add_child(Node.u32('play_chain', statistics.get_int('consecutive_days', 0)))
# 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
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))
# Skill courses
skill = Node.void('skill')
game.add_child(skill)
course_all = Node.void('course_all')
skill.add_child(course_all)
for course in achievements:
if course.type != 'course':
continue
course_id = course.id % 100
season_id = int(course.id / 100)
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))
# 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')))
return game
def unformat_profile(self, userid: UserID, request: Node, oldprofile: ValidatedDict) -> ValidatedDict:
newprofile = copy.deepcopy(oldprofile)
# 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('skill_name_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,
'item_{}'.format(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,
},
)
# 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