diff --git a/src/controllers/sdvx/ac-relay.ts b/src/controllers/sdvx/ac-relay.ts index f918ed1..f2b0ff8 100644 --- a/src/controllers/sdvx/ac-relay.ts +++ b/src/controllers/sdvx/ac-relay.ts @@ -4,6 +4,69 @@ import { Serializable, v } from "../../utils/kxml-value.js"; import * as data from '../../datas/sdvx.js'; export class AcRelay { + @sdvx() + async sv6_hiscore() { + return { + status: v.s32(0), + error_code: v.s32(0), + xrpc_status_code: v.s32(0), + xrpc_fault_code: v.s32(0), + response: { + game: { + $status: 0, + sc: {}, + } + } + }; + } + + @sdvx() + async sv6_log(): Promise { + return { + status: v.s32(0), + error_code: v.s32(0), + xrpc_status_code: v.s32(0), + xrpc_fault_code: v.s32(0), + response: { + game: { + $status: 0, + } + } + }; + } + + @sdvx() + async sv6_common(): Promise { + return { + status: v.s32(0), + error_code: v.s32(0), + xrpc_status_code: v.s32(0), + xrpc_fault_code: v.s32(0), + response: { + game: { + $status: 0, + music: {}, + event: { + info: data.eventList.map(id => ({ + event_id: v.str(id), + })) + }, + extend: { + info: data.extendInfos, + }, + music_limited: { + info: data.musicInfos, + }, + skill_course: { + info: data.skillCourses, + }, + appealcard: {}, + valgene: {}, + } + } + } + } + @sdvx() async sv6_music_url(ctx: Context): Promise { let { music_id } = ctx.body as { music_id: number | number[] }; diff --git a/src/controllers/sdvx/index.ts b/src/controllers/sdvx/index.ts index 08465dd..ba6babb 100644 --- a/src/controllers/sdvx/index.ts +++ b/src/controllers/sdvx/index.ts @@ -6,9 +6,10 @@ import { AcRelay } from "./ac-relay.js"; import { UserService } from "../../services/sdvx/user.js"; import { inject, singleton } from "tsyringe"; import { User } from "./user.js"; +import { Music } from "./music.js"; @singleton() -export default class extends Combine(AcRelay, User) { +export default class extends Combine(AcRelay, User, Music) { constructor( @inject(UserService) private readonly userService: UserService, ) { diff --git a/src/controllers/sdvx/music.ts b/src/controllers/sdvx/music.ts new file mode 100644 index 0000000..fb35fc4 --- /dev/null +++ b/src/controllers/sdvx/music.ts @@ -0,0 +1,40 @@ +import { sdvx } from "../../decorators/eacnet.js"; +import { UserService } from "../../services/sdvx/user.js"; +import { Serializable, v } from "../../utils/kxml-value.js"; + +export class Music { + userService: UserService; + + @sdvx() + async sv6_load_r(): Promise { + return { + status: v.s32(0), + error_code: v.s32(0), + xrpc_status_code: v.s32(0), + xrpc_fault_code: v.s32(0), + response: { + game: { + $status: 0, + } + } + }; + } + + @sdvx() + async sv6_load_m(): Promise { + return { + status: v.s32(0), + error_code: v.s32(0), + xrpc_status_code: v.s32(0), + xrpc_fault_code: v.s32(0), + response: { + game: { + $status: 0, + music: { + info: [] + }, + } + } + }; + } +} diff --git a/src/controllers/sdvx/user.ts b/src/controllers/sdvx/user.ts index afbff1f..51d71a1 100644 --- a/src/controllers/sdvx/user.ts +++ b/src/controllers/sdvx/user.ts @@ -25,6 +25,22 @@ function tryAdd(kvalue: KValueG, value: number) { export class User { userService: UserService; + @sdvx() + async sv6_play_s(): Promise { + return { + status: v.s32(0), + error_code: v.s32(0), + xrpc_status_code: v.s32(0), + xrpc_fault_code: v.s32(0), + response: { + game: { + $status: 0, + play_id: v.u32(Math.floor(new Date().valueOf() / 6e4)), + }, + } + }; + } + @sdvx() async sv6_save(ctx: Context): Promise { const playData = await this.userService.getPlayerData(ctx.token); @@ -144,8 +160,13 @@ export class User { } } - // update blaster pass date + // blaster pass + playData.ea_shop.blaster_pass_enable = v.bool(true); playData.ea_shop.blaster_pass_limit_date = v.u64(new Date().valueOf() + (30 * 60 * 60 * 1000)); + playData.item.info = [ + ...(playData.item.info ?? []), + ...data.charaItems, + ]; return { status: v.s32(0), @@ -155,6 +176,7 @@ export class User { response: { game: { $status: 0, + result: v.u8(0), ...playData, } } diff --git a/src/datas/sdvx.ts b/src/datas/sdvx.ts index 93026ec..a7e47e8 100644 --- a/src/datas/sdvx.ts +++ b/src/datas/sdvx.ts @@ -8288,6 +8288,16 @@ export const musicDownloadLinks: Record ({ type: v.u8(11), id: v.u32(i), - param: v.u32(10), + param: v.u32(15), })); -console.log(charaItems) +export const musicInfos = []; + +// unlock all musics +export const musicCount = 2168; +for (let i = 1; i <= musicCount; ++i) { + for (let j = 0; j < 5; ++j) { + musicInfos.push({ + music_id: v.s32(i), + music_type: v.u8(j), + limited: v.u8(3), + }); + } +} + +export const skillCourses = [ + { + season_id: v.s32(1), + season_name: v.str("SKILL ANALYZER 第1回"), + season_new_flg: v.bool(false), + course_id: v.s16(1), + course_name: v.str("SKILL ANALYZER Level.01"), + course_type: v.s16(0), + skill_level: v.s16(1), + skill_name_id: v.s16(1), + matching_assist: v.bool(true), + clear_rate: v.s32(9213), + avg_score: v.u32(27260338), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(682), + music_type: v.s8(0), + }, + { + track_no: v.s16(1), + music_id: v.s32(987), + music_type: v.s8(1), + }, + { + track_no: v.s16(2), + music_id: v.s32(756), + music_type: v.s8(1), + } + ] + }, + { + season_id: v.s32(4), + season_name: v.str("SKILL ANALYZER 第2回"), + season_new_flg: v.bool(false), + course_id: v.s16(1), + course_name: v.str("SKILL ANALYZER Level.01"), + course_type: v.s16(0), + skill_level: v.s16(1), + skill_name_id: v.s16(1), + matching_assist: v.bool(true), + clear_rate: v.s32(9217), + avg_score: v.u32(27657262), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(803), + music_type: v.s8(0), + }, + { + track_no: v.s16(1), + music_id: v.s32(334), + music_type: v.s8(1), + }, + { + track_no: v.s16(2), + music_id: v.s32(126), + music_type: v.s8(0), + } + ] + }, + { + season_id: v.s32(7), + season_name: v.str("SKILL ANALYZER 第3回"), + season_new_flg: v.bool(false), + course_id: v.s16(1), + course_name: v.str("SKILL ANALYZER Level.01"), + course_type: v.s16(0), + skill_level: v.s16(1), + skill_name_id: v.s16(1), + matching_assist: v.bool(true), + clear_rate: v.s32(8817), + avg_score: v.u32(26866615), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(816), + music_type: v.s8(0), + }, + { + track_no: v.s16(1), + music_id: v.s32(1074), + music_type: v.s8(1), + }, + { + track_no: v.s16(2), + music_id: v.s32(16), + music_type: v.s8(1), + } + ] + }, + { + season_id: v.s32(10), + season_name: v.str("SKILL ANALYZER 第4回"), + season_new_flg: v.bool(false), + course_id: v.s16(1), + course_name: v.str("SKILL ANALYZER Level.01"), + course_type: v.s16(0), + skill_level: v.s16(1), + skill_name_id: v.s16(1), + matching_assist: v.bool(true), + clear_rate: v.s32(9230), + avg_score: v.u32(27510186), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(1866), + music_type: v.s8(0), + }, + { + track_no: v.s16(1), + music_id: v.s32(1076), + music_type: v.s8(1), + }, + { + track_no: v.s16(2), + music_id: v.s32(6), + music_type: v.s8(1), + } + ] + }, + { + season_id: v.s32(13), + season_name: v.str("SKILL ANALYZER 第5回"), + season_new_flg: v.bool(true), + course_id: v.s16(1), + course_name: v.str("SKILL ANALYZER Level.01"), + course_type: v.s16(0), + skill_level: v.s16(1), + skill_name_id: v.s16(1), + matching_assist: v.bool(true), + clear_rate: v.s32(9324), + avg_score: v.u32(27756992), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(1475), + music_type: v.s8(0), + }, + { + track_no: v.s16(1), + music_id: v.s32(186), + music_type: v.s8(1), + }, + { + track_no: v.s16(2), + music_id: v.s32(93), + music_type: v.s8(1), + } + ] + }, + { + season_id: v.s32(1), + season_name: v.str("SKILL ANALYZER 第1回"), + season_new_flg: v.bool(false), + course_id: v.s16(2), + course_name: v.str("SKILL ANALYZER Level.02"), + course_type: v.s16(0), + skill_level: v.s16(2), + skill_name_id: v.s16(2), + matching_assist: v.bool(true), + clear_rate: v.s32(9297), + avg_score: v.u32(27270000), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(65), + music_type: v.s8(1), + }, + { + track_no: v.s16(1), + music_id: v.s32(614), + music_type: v.s8(1), + }, + { + track_no: v.s16(2), + music_id: v.s32(1002), + music_type: v.s8(1), + } + ] + }, + { + season_id: v.s32(4), + season_name: v.str("SKILL ANALYZER 第2回"), + season_new_flg: v.bool(false), + course_id: v.s16(2), + course_name: v.str("SKILL ANALYZER Level.02"), + course_type: v.s16(0), + skill_level: v.s16(2), + skill_name_id: v.s16(2), + matching_assist: v.bool(true), + clear_rate: v.s32(9460), + avg_score: v.u32(27968468), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(283), + music_type: v.s8(1), + }, + { + track_no: v.s16(1), + music_id: v.s32(181), + music_type: v.s8(1), + }, + { + track_no: v.s16(2), + music_id: v.s32(1079), + music_type: v.s8(1), + } + ] + }, + { + season_id: v.s32(7), + season_name: v.str("SKILL ANALYZER 第3回"), + season_new_flg: v.bool(false), + course_id: v.s16(2), + course_name: v.str("SKILL ANALYZER Level.02"), + course_type: v.s16(0), + skill_level: v.s16(2), + skill_name_id: v.s16(2), + matching_assist: v.bool(true), + clear_rate: v.s32(9505), + avg_score: v.u32(28041119), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(74), + music_type: v.s8(0), + }, + { + track_no: v.s16(1), + music_id: v.s32(1093), + music_type: v.s8(1), + }, + { + track_no: v.s16(2), + music_id: v.s32(561), + music_type: v.s8(1), + } + ] + }, + { + season_id: v.s32(10), + season_name: v.str("SKILL ANALYZER 第4回"), + season_new_flg: v.bool(false), + course_id: v.s16(2), + course_name: v.str("SKILL ANALYZER Level.02"), + course_type: v.s16(0), + skill_level: v.s16(2), + skill_name_id: v.s16(2), + matching_assist: v.bool(true), + clear_rate: v.s32(9279), + avg_score: v.u32(28135729), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(766), + music_type: v.s8(1), + }, + { + track_no: v.s16(1), + music_id: v.s32(1063), + music_type: v.s8(1), + }, + { + track_no: v.s16(2), + music_id: v.s32(42), + music_type: v.s8(1), + } + ] + }, + { + season_id: v.s32(13), + season_name: v.str("SKILL ANALYZER 第5回"), + season_new_flg: v.bool(true), + course_id: v.s16(2), + course_name: v.str("SKILL ANALYZER Level.02"), + course_type: v.s16(0), + skill_level: v.s16(2), + skill_name_id: v.s16(2), + matching_assist: v.bool(true), + clear_rate: v.s32(10000), + avg_score: v.u32(28860267), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(185), + music_type: v.s8(1), + }, + { + track_no: v.s16(1), + music_id: v.s32(701), + music_type: v.s8(1), + }, + { + track_no: v.s16(2), + music_id: v.s32(340), + music_type: v.s8(1), + } + ] + }, + { + season_id: v.s32(1), + season_name: v.str("SKILL ANALYZER 第1回"), + season_new_flg: v.bool(false), + course_id: v.s16(3), + course_name: v.str("SKILL ANALYZER Level.03"), + course_type: v.s16(0), + skill_level: v.s16(3), + skill_name_id: v.s16(3), + matching_assist: v.bool(true), + clear_rate: v.s32(9360), + avg_score: v.u32(27337438), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(603), + music_type: v.s8(1), + }, + { + track_no: v.s16(1), + music_id: v.s32(799), + music_type: v.s8(1), + }, + { + track_no: v.s16(2), + music_id: v.s32(346), + music_type: v.s8(1), + } + ] + }, + { + season_id: v.s32(4), + season_name: v.str("SKILL ANALYZER 第2回"), + season_new_flg: v.bool(false), + course_id: v.s16(3), + course_name: v.str("SKILL ANALYZER Level.03"), + course_type: v.s16(0), + skill_level: v.s16(3), + skill_name_id: v.s16(3), + matching_assist: v.bool(true), + clear_rate: v.s32(8944), + avg_score: v.u32(27242373), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(860), + music_type: v.s8(1), + }, + { + track_no: v.s16(1), + music_id: v.s32(620), + music_type: v.s8(1), + }, + { + track_no: v.s16(2), + music_id: v.s32(1650), + music_type: v.s8(1), + } + ] + }, + { + season_id: v.s32(7), + season_name: v.str("SKILL ANALYZER 第3回"), + season_new_flg: v.bool(false), + course_id: v.s16(3), + course_name: v.str("SKILL ANALYZER Level.03"), + course_type: v.s16(0), + skill_level: v.s16(3), + skill_name_id: v.s16(3), + matching_assist: v.bool(true), + clear_rate: v.s32(9049), + avg_score: v.u32(27593696), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(1082), + music_type: v.s8(1), + }, + { + track_no: v.s16(1), + music_id: v.s32(783), + music_type: v.s8(1), + }, + { + track_no: v.s16(2), + music_id: v.s32(608), + music_type: v.s8(1), + } + ] + }, + { + season_id: v.s32(10), + season_name: v.str("SKILL ANALYZER 第4回"), + season_new_flg: v.bool(false), + course_id: v.s16(3), + course_name: v.str("SKILL ANALYZER Level.03"), + course_type: v.s16(0), + skill_level: v.s16(3), + skill_name_id: v.s16(3), + matching_assist: v.bool(true), + clear_rate: v.s32(9296), + avg_score: v.u32(27708894), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(353), + music_type: v.s8(1), + }, + { + track_no: v.s16(1), + music_id: v.s32(1294), + music_type: v.s8(1), + }, + { + track_no: v.s16(2), + music_id: v.s32(827), + music_type: v.s8(1), + } + ] + }, + { + season_id: v.s32(13), + season_name: v.str("SKILL ANALYZER 第5回"), + season_new_flg: v.bool(true), + course_id: v.s16(3), + course_name: v.str("SKILL ANALYZER Level.03"), + course_type: v.s16(0), + skill_level: v.s16(3), + skill_name_id: v.s16(3), + matching_assist: v.bool(true), + clear_rate: v.s32(10000), + avg_score: v.u32(28751886), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(582), + music_type: v.s8(1), + }, + { + track_no: v.s16(1), + music_id: v.s32(464), + music_type: v.s8(1), + }, + { + track_no: v.s16(2), + music_id: v.s32(99), + music_type: v.s8(1), + } + ] + }, + { + season_id: v.s32(1), + season_name: v.str("SKILL ANALYZER 第1回"), + season_new_flg: v.bool(false), + course_id: v.s16(4), + course_name: v.str("SKILL ANALYZER Level.04"), + course_type: v.s16(0), + skill_level: v.s16(4), + skill_name_id: v.s16(4), + matching_assist: v.bool(true), + clear_rate: v.s32(9337), + avg_score: v.u32(27107246), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(497), + music_type: v.s8(1), + }, + { + track_no: v.s16(1), + music_id: v.s32(1021), + music_type: v.s8(1), + }, + { + track_no: v.s16(2), + music_id: v.s32(800), + music_type: v.s8(1), + } + ] + }, + { + season_id: v.s32(4), + season_name: v.str("SKILL ANALYZER 第2回"), + season_new_flg: v.bool(false), + course_id: v.s16(4), + course_name: v.str("SKILL ANALYZER Level.04"), + course_type: v.s16(0), + skill_level: v.s16(4), + skill_name_id: v.s16(4), + matching_assist: v.bool(true), + clear_rate: v.s32(8900), + avg_score: v.u32(27217799), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(969), + music_type: v.s8(1), + }, + { + track_no: v.s16(1), + music_id: v.s32(343), + music_type: v.s8(1), + }, + { + track_no: v.s16(2), + music_id: v.s32(851), + music_type: v.s8(1), + } + ] + }, + { + season_id: v.s32(7), + season_name: v.str("SKILL ANALYZER 第3回"), + season_new_flg: v.bool(false), + course_id: v.s16(4), + course_name: v.str("SKILL ANALYZER Level.04"), + course_type: v.s16(0), + skill_level: v.s16(4), + skill_name_id: v.s16(4), + matching_assist: v.bool(true), + clear_rate: v.s32(9110), + avg_score: v.u32(27200242), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(1444), + music_type: v.s8(1), + }, + { + track_no: v.s16(1), + music_id: v.s32(394), + music_type: v.s8(1), + }, + { + track_no: v.s16(2), + music_id: v.s32(122), + music_type: v.s8(1), + } + ] + }, + { + season_id: v.s32(10), + season_name: v.str("SKILL ANALYZER 第4回"), + season_new_flg: v.bool(false), + course_id: v.s16(4), + course_name: v.str("SKILL ANALYZER Level.04"), + course_type: v.s16(0), + skill_level: v.s16(4), + skill_name_id: v.s16(4), + matching_assist: v.bool(true), + clear_rate: v.s32(9325), + avg_score: v.u32(28133918), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(524), + music_type: v.s8(1), + }, + { + track_no: v.s16(1), + music_id: v.s32(534), + music_type: v.s8(1), + }, + { + track_no: v.s16(2), + music_id: v.s32(858), + music_type: v.s8(1), + } + ] + }, + { + season_id: v.s32(13), + season_name: v.str("SKILL ANALYZER 第5回"), + season_new_flg: v.bool(true), + course_id: v.s16(4), + course_name: v.str("SKILL ANALYZER Level.04"), + course_type: v.s16(0), + skill_level: v.s16(4), + skill_name_id: v.s16(4), + matching_assist: v.bool(true), + clear_rate: v.s32(7894), + avg_score: v.u32(23939427), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(592), + music_type: v.s8(1), + }, + { + track_no: v.s16(1), + music_id: v.s32(463), + music_type: v.s8(1), + }, + { + track_no: v.s16(2), + music_id: v.s32(857), + music_type: v.s8(1), + } + ] + }, + { + season_id: v.s32(1), + season_name: v.str("SKILL ANALYZER 第1回"), + season_new_flg: v.bool(false), + course_id: v.s16(5), + course_name: v.str("SKILL ANALYZER Level.05"), + course_type: v.s16(0), + skill_level: v.s16(5), + skill_name_id: v.s16(5), + matching_assist: v.bool(true), + clear_rate: v.s32(7005), + avg_score: v.u32(25941510), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(537), + music_type: v.s8(1), + }, + { + track_no: v.s16(1), + music_id: v.s32(403), + music_type: v.s8(2), + }, + { + track_no: v.s16(2), + music_id: v.s32(775), + music_type: v.s8(2), + } + ] + }, + { + season_id: v.s32(4), + season_name: v.str("SKILL ANALYZER 第2回"), + season_new_flg: v.bool(false), + course_id: v.s16(5), + course_name: v.str("SKILL ANALYZER Level.05"), + course_type: v.s16(0), + skill_level: v.s16(5), + skill_name_id: v.s16(5), + matching_assist: v.bool(true), + clear_rate: v.s32(6126), + avg_score: v.u32(23129090), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(392), + music_type: v.s8(1), + }, + { + track_no: v.s16(1), + music_id: v.s32(601), + music_type: v.s8(2), + }, + { + track_no: v.s16(2), + music_id: v.s32(665), + music_type: v.s8(2), + } + ] + }, + { + season_id: v.s32(7), + season_name: v.str("SKILL ANALYZER 第3回"), + season_new_flg: v.bool(false), + course_id: v.s16(5), + course_name: v.str("SKILL ANALYZER Level.05"), + course_type: v.s16(0), + skill_level: v.s16(5), + skill_name_id: v.s16(5), + matching_assist: v.bool(true), + clear_rate: v.s32(6839), + avg_score: v.u32(23465895), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(962), + music_type: v.s8(1), + }, + { + track_no: v.s16(1), + music_id: v.s32(845), + music_type: v.s8(2), + }, + { + track_no: v.s16(2), + music_id: v.s32(66), + music_type: v.s8(2), + } + ] + }, + { + season_id: v.s32(10), + season_name: v.str("SKILL ANALYZER 第4回"), + season_new_flg: v.bool(false), + course_id: v.s16(5), + course_name: v.str("SKILL ANALYZER Level.05"), + course_type: v.s16(0), + skill_level: v.s16(5), + skill_name_id: v.s16(5), + matching_assist: v.bool(true), + clear_rate: v.s32(7963), + avg_score: v.u32(26231115), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(1861), + music_type: v.s8(1), + }, + { + track_no: v.s16(1), + music_id: v.s32(822), + music_type: v.s8(2), + }, + { + track_no: v.s16(2), + music_id: v.s32(207), + music_type: v.s8(2), + } + ] + }, + { + season_id: v.s32(13), + season_name: v.str("SKILL ANALYZER 第5回"), + season_new_flg: v.bool(true), + course_id: v.s16(5), + course_name: v.str("SKILL ANALYZER Level.05"), + course_type: v.s16(0), + skill_level: v.s16(5), + skill_name_id: v.s16(5), + matching_assist: v.bool(true), + clear_rate: v.s32(7903), + avg_score: v.u32(26016025), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(867), + music_type: v.s8(1), + }, + { + track_no: v.s16(1), + music_id: v.s32(782), + music_type: v.s8(2), + }, + { + track_no: v.s16(2), + music_id: v.s32(1474), + music_type: v.s8(1), + } + ] + }, + { + season_id: v.s32(1), + season_name: v.str("SKILL ANALYZER 第1回"), + season_new_flg: v.bool(false), + course_id: v.s16(6), + course_name: v.str("SKILL ANALYZER Level.06"), + course_type: v.s16(0), + skill_level: v.s16(6), + skill_name_id: v.s16(6), + matching_assist: v.bool(true), + clear_rate: v.s32(8070), + avg_score: v.u32(25572478), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(890), + music_type: v.s8(2), + }, + { + track_no: v.s16(1), + music_id: v.s32(891), + music_type: v.s8(2), + }, + { + track_no: v.s16(2), + music_id: v.s32(1423), + music_type: v.s8(2), + } + ] + }, + { + season_id: v.s32(4), + season_name: v.str("SKILL ANALYZER 第2回"), + season_new_flg: v.bool(false), + course_id: v.s16(6), + course_name: v.str("SKILL ANALYZER Level.06"), + course_type: v.s16(0), + skill_level: v.s16(6), + skill_name_id: v.s16(6), + matching_assist: v.bool(true), + clear_rate: v.s32(6491), + avg_score: v.u32(23772139), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(1441), + music_type: v.s8(2), + }, + { + track_no: v.s16(1), + music_id: v.s32(232), + music_type: v.s8(2), + }, + { + track_no: v.s16(2), + music_id: v.s32(1472), + music_type: v.s8(2), + } + ] + }, + { + season_id: v.s32(7), + season_name: v.str("SKILL ANALYZER 第3回"), + season_new_flg: v.bool(false), + course_id: v.s16(6), + course_name: v.str("SKILL ANALYZER Level.06"), + course_type: v.s16(0), + skill_level: v.s16(6), + skill_name_id: v.s16(6), + matching_assist: v.bool(true), + clear_rate: v.s32(8561), + avg_score: v.u32(26882300), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(196), + music_type: v.s8(2), + }, + { + track_no: v.s16(1), + music_id: v.s32(1134), + music_type: v.s8(2), + }, + { + track_no: v.s16(2), + music_id: v.s32(1473), + music_type: v.s8(2), + } + ] + }, + { + season_id: v.s32(10), + season_name: v.str("SKILL ANALYZER 第4回"), + season_new_flg: v.bool(false), + course_id: v.s16(6), + course_name: v.str("SKILL ANALYZER Level.06"), + course_type: v.s16(0), + skill_level: v.s16(6), + skill_name_id: v.s16(6), + matching_assist: v.bool(true), + clear_rate: v.s32(8197), + avg_score: v.u32(26467953), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(1090), + music_type: v.s8(2), + }, + { + track_no: v.s16(1), + music_id: v.s32(331), + music_type: v.s8(2), + }, + { + track_no: v.s16(2), + music_id: v.s32(438), + music_type: v.s8(2), + } + ] + }, + { + season_id: v.s32(13), + season_name: v.str("SKILL ANALYZER 第5回"), + season_new_flg: v.bool(true), + course_id: v.s16(6), + course_name: v.str("SKILL ANALYZER Level.06"), + course_type: v.s16(0), + skill_level: v.s16(6), + skill_name_id: v.s16(6), + matching_assist: v.bool(true), + clear_rate: v.s32(8928), + avg_score: v.u32(27071139), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(1223), + music_type: v.s8(2), + }, + { + track_no: v.s16(1), + music_id: v.s32(1574), + music_type: v.s8(2), + }, + { + track_no: v.s16(2), + music_id: v.s32(986), + music_type: v.s8(2), + } + ] + }, + { + season_id: v.s32(1), + season_name: v.str("SKILL ANALYZER 第1回"), + season_new_flg: v.bool(false), + course_id: v.s16(7), + course_name: v.str("SKILL ANALYZER Level.07"), + course_type: v.s16(0), + skill_level: v.s16(7), + skill_name_id: v.s16(7), + matching_assist: v.bool(true), + clear_rate: v.s32(8393), + avg_score: v.u32(27231053), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(784), + music_type: v.s8(2), + }, + { + track_no: v.s16(1), + music_id: v.s32(979), + music_type: v.s8(2), + }, + { + track_no: v.s16(2), + music_id: v.s32(492), + music_type: v.s8(2), + } + ] + }, + { + season_id: v.s32(4), + season_name: v.str("SKILL ANALYZER 第2回"), + season_new_flg: v.bool(false), + course_id: v.s16(7), + course_name: v.str("SKILL ANALYZER Level.07"), + course_type: v.s16(0), + skill_level: v.s16(7), + skill_name_id: v.s16(7), + matching_assist: v.bool(true), + clear_rate: v.s32(7610), + avg_score: v.u32(25238777), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(862), + music_type: v.s8(2), + }, + { + track_no: v.s16(1), + music_id: v.s32(22), + music_type: v.s8(3), + }, + { + track_no: v.s16(2), + music_id: v.s32(519), + music_type: v.s8(2), + } + ] + }, + { + season_id: v.s32(7), + season_name: v.str("SKILL ANALYZER 第3回"), + season_new_flg: v.bool(false), + course_id: v.s16(7), + course_name: v.str("SKILL ANALYZER Level.07"), + course_type: v.s16(0), + skill_level: v.s16(7), + skill_name_id: v.s16(7), + matching_assist: v.bool(true), + clear_rate: v.s32(7873), + avg_score: v.u32(25261285), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(1439), + music_type: v.s8(2), + }, + { + track_no: v.s16(1), + music_id: v.s32(401), + music_type: v.s8(2), + }, + { + track_no: v.s16(2), + music_id: v.s32(134), + music_type: v.s8(2), + } + ] + }, + { + season_id: v.s32(10), + season_name: v.str("SKILL ANALYZER 第4回"), + season_new_flg: v.bool(false), + course_id: v.s16(7), + course_name: v.str("SKILL ANALYZER Level.07"), + course_type: v.s16(0), + skill_level: v.s16(7), + skill_name_id: v.s16(7), + matching_assist: v.bool(true), + clear_rate: v.s32(7783), + avg_score: v.u32(25525492), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(762), + music_type: v.s8(2), + }, + { + track_no: v.s16(1), + music_id: v.s32(843), + music_type: v.s8(2), + }, + { + track_no: v.s16(2), + music_id: v.s32(777), + music_type: v.s8(2), + } + ] + }, + { + season_id: v.s32(13), + season_name: v.str("SKILL ANALYZER 第5回"), + season_new_flg: v.bool(true), + course_id: v.s16(7), + course_name: v.str("SKILL ANALYZER Level.07"), + course_type: v.s16(0), + skill_level: v.s16(7), + skill_name_id: v.s16(7), + matching_assist: v.bool(true), + clear_rate: v.s32(6909), + avg_score: v.u32(24774344), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(152), + music_type: v.s8(2), + }, + { + track_no: v.s16(1), + music_id: v.s32(325), + music_type: v.s8(2), + }, + { + track_no: v.s16(2), + music_id: v.s32(475), + music_type: v.s8(2), + } + ] + }, + { + season_id: v.s32(1), + season_name: v.str("SKILL ANALYZER 第1回"), + season_new_flg: v.bool(false), + course_id: v.s16(8), + course_name: v.str("SKILL ANALYZER Level.08"), + course_type: v.s16(0), + skill_level: v.s16(8), + skill_name_id: v.s16(8), + matching_assist: v.bool(false), + clear_rate: v.s32(8349), + avg_score: v.u32(26683043), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(878), + music_type: v.s8(4), + }, + { + track_no: v.s16(1), + music_id: v.s32(1155), + music_type: v.s8(4), + }, + { + track_no: v.s16(2), + music_id: v.s32(541), + music_type: v.s8(2), + } + ] + }, + { + season_id: v.s32(4), + season_name: v.str("SKILL ANALYZER 第2回"), + season_new_flg: v.bool(false), + course_id: v.s16(8), + course_name: v.str("SKILL ANALYZER Level.08"), + course_type: v.s16(0), + skill_level: v.s16(8), + skill_name_id: v.s16(8), + matching_assist: v.bool(false), + clear_rate: v.s32(6948), + avg_score: v.u32(25235195), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(622), + music_type: v.s8(2), + }, + { + track_no: v.s16(1), + music_id: v.s32(1562), + music_type: v.s8(2), + }, + { + track_no: v.s16(2), + music_id: v.s32(398), + music_type: v.s8(2), + } + ] + }, + { + season_id: v.s32(7), + season_name: v.str("SKILL ANALYZER 第3回"), + season_new_flg: v.bool(false), + course_id: v.s16(8), + course_name: v.str("SKILL ANALYZER Level.08"), + course_type: v.s16(0), + skill_level: v.s16(8), + skill_name_id: v.s16(8), + matching_assist: v.bool(false), + clear_rate: v.s32(7522), + avg_score: v.u32(24972896), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(898), + music_type: v.s8(4), + }, + { + track_no: v.s16(1), + music_id: v.s32(555), + music_type: v.s8(2), + }, + { + track_no: v.s16(2), + music_id: v.s32(216), + music_type: v.s8(2), + } + ] + }, + { + season_id: v.s32(10), + season_name: v.str("SKILL ANALYZER 第4回"), + season_new_flg: v.bool(false), + course_id: v.s16(8), + course_name: v.str("SKILL ANALYZER Level.08"), + course_type: v.s16(0), + skill_level: v.s16(8), + skill_name_id: v.s16(8), + matching_assist: v.bool(false), + clear_rate: v.s32(6780), + avg_score: v.u32(24674613), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(54), + music_type: v.s8(3), + }, + { + track_no: v.s16(1), + music_id: v.s32(1346), + music_type: v.s8(2), + }, + { + track_no: v.s16(2), + music_id: v.s32(887), + music_type: v.s8(4), + } + ] + }, + { + season_id: v.s32(13), + season_name: v.str("SKILL ANALYZER 第5回"), + season_new_flg: v.bool(true), + course_id: v.s16(8), + course_name: v.str("SKILL ANALYZER Level.08"), + course_type: v.s16(0), + skill_level: v.s16(8), + skill_name_id: v.s16(8), + matching_assist: v.bool(false), + clear_rate: v.s32(7804), + avg_score: v.u32(25087230), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(433), + music_type: v.s8(3), + }, + { + track_no: v.s16(1), + music_id: v.s32(644), + music_type: v.s8(2), + }, + { + track_no: v.s16(2), + music_id: v.s32(895), + music_type: v.s8(4), + } + ] + }, + { + season_id: v.s32(1), + season_name: v.str("SKILL ANALYZER 第1回"), + season_new_flg: v.bool(false), + course_id: v.s16(9), + course_name: v.str("SKILL ANALYZER Level.09"), + course_type: v.s16(0), + skill_level: v.s16(9), + skill_name_id: v.s16(9), + matching_assist: v.bool(false), + clear_rate: v.s32(8152), + avg_score: v.u32(25767528), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(1306), + music_type: v.s8(2), + }, + { + track_no: v.s16(1), + music_id: v.s32(1309), + music_type: v.s8(2), + }, + { + track_no: v.s16(2), + music_id: v.s32(802), + music_type: v.s8(2), + } + ] + }, + { + season_id: v.s32(4), + season_name: v.str("SKILL ANALYZER 第2回"), + season_new_flg: v.bool(false), + course_id: v.s16(9), + course_name: v.str("SKILL ANALYZER Level.09"), + course_type: v.s16(0), + skill_level: v.s16(9), + skill_name_id: v.s16(9), + matching_assist: v.bool(false), + clear_rate: v.s32(6823), + avg_score: v.u32(24868892), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(1563), + music_type: v.s8(3), + }, + { + track_no: v.s16(1), + music_id: v.s32(120), + music_type: v.s8(3), + }, + { + track_no: v.s16(2), + music_id: v.s32(581), + music_type: v.s8(2), + } + ] + }, + { + season_id: v.s32(7), + season_name: v.str("SKILL ANALYZER 第3回"), + season_new_flg: v.bool(false), + course_id: v.s16(9), + course_name: v.str("SKILL ANALYZER Level.09"), + course_type: v.s16(0), + skill_level: v.s16(9), + skill_name_id: v.s16(9), + matching_assist: v.bool(false), + clear_rate: v.s32(7994), + avg_score: v.u32(26355838), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(1065), + music_type: v.s8(4), + }, + { + track_no: v.s16(1), + music_id: v.s32(1568), + music_type: v.s8(3), + }, + { + track_no: v.s16(2), + music_id: v.s32(493), + music_type: v.s8(3), + } + ] + }, + { + season_id: v.s32(10), + season_name: v.str("SKILL ANALYZER 第4回"), + season_new_flg: v.bool(false), + course_id: v.s16(9), + course_name: v.str("SKILL ANALYZER Level.09"), + course_type: v.s16(0), + skill_level: v.s16(9), + skill_name_id: v.s16(9), + matching_assist: v.bool(false), + clear_rate: v.s32(6468), + avg_score: v.u32(25855189), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(1442), + music_type: v.s8(4), + }, + { + track_no: v.s16(1), + music_id: v.s32(1092), + music_type: v.s8(4), + }, + { + track_no: v.s16(2), + music_id: v.s32(348), + music_type: v.s8(2), + } + ] + }, + { + season_id: v.s32(13), + season_name: v.str("SKILL ANALYZER 第5回"), + season_new_flg: v.bool(true), + course_id: v.s16(9), + course_name: v.str("SKILL ANALYZER Level.09"), + course_type: v.s16(0), + skill_level: v.s16(9), + skill_name_id: v.s16(9), + matching_assist: v.bool(false), + clear_rate: v.s32(6826), + avg_score: v.u32(25120024), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(849), + music_type: v.s8(2), + }, + { + track_no: v.s16(1), + music_id: v.s32(1431), + music_type: v.s8(3), + }, + { + track_no: v.s16(2), + music_id: v.s32(1904), + music_type: v.s8(4), + } + ] + }, + { + season_id: v.s32(1), + season_name: v.str("SKILL ANALYZER 第1回"), + season_new_flg: v.bool(false), + course_id: v.s16(10), + course_name: v.str("SKILL ANALYZER Level.10"), + course_type: v.s16(0), + skill_level: v.s16(10), + skill_name_id: v.s16(10), + matching_assist: v.bool(false), + clear_rate: v.s32(8437), + avg_score: v.u32(26543743), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(847), + music_type: v.s8(2), + }, + { + track_no: v.s16(1), + music_id: v.s32(716), + music_type: v.s8(2), + }, + { + track_no: v.s16(2), + music_id: v.s32(615), + music_type: v.s8(2), + } + ] + }, + { + season_id: v.s32(4), + season_name: v.str("SKILL ANALYZER 第2回"), + season_new_flg: v.bool(false), + course_id: v.s16(10), + course_name: v.str("SKILL ANALYZER Level.10"), + course_type: v.s16(0), + skill_level: v.s16(10), + skill_name_id: v.s16(10), + matching_assist: v.bool(false), + clear_rate: v.s32(8566), + avg_score: v.u32(25792745), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(139), + music_type: v.s8(3), + }, + { + track_no: v.s16(1), + music_id: v.s32(1552), + music_type: v.s8(3), + }, + { + track_no: v.s16(2), + music_id: v.s32(834), + music_type: v.s8(4), + } + ] + }, + { + season_id: v.s32(7), + season_name: v.str("SKILL ANALYZER 第3回"), + season_new_flg: v.bool(false), + course_id: v.s16(10), + course_name: v.str("SKILL ANALYZER Level.10"), + course_type: v.s16(0), + skill_level: v.s16(10), + skill_name_id: v.s16(10), + matching_assist: v.bool(false), + clear_rate: v.s32(8227), + avg_score: v.u32(26555833), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(1081), + music_type: v.s8(4), + }, + { + track_no: v.s16(1), + music_id: v.s32(508), + music_type: v.s8(2), + }, + { + track_no: v.s16(2), + music_id: v.s32(251), + music_type: v.s8(3), + } + ] + }, + { + season_id: v.s32(10), + season_name: v.str("SKILL ANALYZER 第4回"), + season_new_flg: v.bool(false), + course_id: v.s16(10), + course_name: v.str("SKILL ANALYZER Level.10"), + course_type: v.s16(0), + skill_level: v.s16(10), + skill_name_id: v.s16(10), + matching_assist: v.bool(false), + clear_rate: v.s32(9013), + avg_score: v.u32(27579009), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(426), + music_type: v.s8(3), + }, + { + track_no: v.s16(1), + music_id: v.s32(361), + music_type: v.s8(3), + }, + { + track_no: v.s16(2), + music_id: v.s32(1348), + music_type: v.s8(3), + } + ] + }, + { + season_id: v.s32(13), + season_name: v.str("SKILL ANALYZER 第5回"), + season_new_flg: v.bool(true), + course_id: v.s16(10), + course_name: v.str("SKILL ANALYZER Level.10"), + course_type: v.s16(0), + skill_level: v.s16(10), + skill_name_id: v.s16(10), + matching_assist: v.bool(false), + clear_rate: v.s32(8134), + avg_score: v.u32(26764594), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(1314), + music_type: v.s8(4), + }, + { + track_no: v.s16(1), + music_id: v.s32(125), + music_type: v.s8(3), + }, + { + track_no: v.s16(2), + music_id: v.s32(1345), + music_type: v.s8(3), + } + ] + }, + { + season_id: v.s32(5), + season_name: v.str("SKILL ANALYZER 第2回 Aコース"), + season_new_flg: v.bool(false), + course_id: v.s16(11), + course_name: v.str("SKILL ANALYZER Level.11"), + course_type: v.s16(3), + skill_level: v.s16(11), + skill_name_id: v.s16(11), + matching_assist: v.bool(false), + clear_rate: v.s32(8008), + avg_score: v.u32(25443942), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(1558), + music_type: v.s8(3), + }, + { + track_no: v.s16(1), + music_id: v.s32(1775), + music_type: v.s8(4), + }, + { + track_no: v.s16(2), + music_id: v.s32(1096), + music_type: v.s8(4), + } + ] + }, + { + season_id: v.s32(6), + season_name: v.str("SKILL ANALYZER 第2回 Bコース"), + season_new_flg: v.bool(false), + course_id: v.s16(11), + course_name: v.str("SKILL ANALYZER Level.11"), + course_type: v.s16(3), + skill_level: v.s16(11), + skill_name_id: v.s16(11), + matching_assist: v.bool(false), + clear_rate: v.s32(7656), + avg_score: v.u32(25152498), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(1072), + music_type: v.s8(4), + }, + { + track_no: v.s16(1), + music_id: v.s32(1779), + music_type: v.s8(4), + }, + { + track_no: v.s16(2), + music_id: v.s32(1554), + music_type: v.s8(3), + } + ] + }, + { + season_id: v.s32(8), + season_name: v.str("SKILL ANALYZER 第3回 Aコース"), + season_new_flg: v.bool(false), + course_id: v.s16(11), + course_name: v.str("SKILL ANALYZER Level.11"), + course_type: v.s16(3), + skill_level: v.s16(11), + skill_name_id: v.s16(11), + matching_assist: v.bool(false), + clear_rate: v.s32(8124), + avg_score: v.u32(26053951), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(1901), + music_type: v.s8(4), + }, + { + track_no: v.s16(1), + music_id: v.s32(1797), + music_type: v.s8(4), + }, + { + track_no: v.s16(2), + music_id: v.s32(642), + music_type: v.s8(2), + } + ] + }, + { + season_id: v.s32(9), + season_name: v.str("SKILL ANALYZER 第3回 Bコース"), + season_new_flg: v.bool(false), + course_id: v.s16(11), + course_name: v.str("SKILL ANALYZER Level.11"), + course_type: v.s16(3), + skill_level: v.s16(11), + skill_name_id: v.s16(11), + matching_assist: v.bool(false), + clear_rate: v.s32(8556), + avg_score: v.u32(26482214), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(1011), + music_type: v.s8(4), + }, + { + track_no: v.s16(1), + music_id: v.s32(1782), + music_type: v.s8(4), + }, + { + track_no: v.s16(2), + music_id: v.s32(1899), + music_type: v.s8(4), + } + ] + }, + { + season_id: v.s32(11), + season_name: v.str("SKILL ANALYZER 第4回 Aコース"), + season_new_flg: v.bool(false), + course_id: v.s16(11), + course_name: v.str("SKILL ANALYZER Level.11"), + course_type: v.s16(3), + skill_level: v.s16(11), + skill_name_id: v.s16(11), + matching_assist: v.bool(false), + clear_rate: v.s32(7624), + avg_score: v.u32(25608625), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(2050), + music_type: v.s8(4), + }, + { + track_no: v.s16(1), + music_id: v.s32(2043), + music_type: v.s8(4), + }, + { + track_no: v.s16(2), + music_id: v.s32(1865), + music_type: v.s8(4), + } + ] + }, + { + season_id: v.s32(12), + season_name: v.str("SKILL ANALYZER 第4回 Bコース"), + season_new_flg: v.bool(false), + course_id: v.s16(11), + course_name: v.str("SKILL ANALYZER Level.11"), + course_type: v.s16(3), + skill_level: v.s16(11), + skill_name_id: v.s16(11), + matching_assist: v.bool(false), + clear_rate: v.s32(8297), + avg_score: v.u32(26096809), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(2049), + music_type: v.s8(4), + }, + { + track_no: v.s16(1), + music_id: v.s32(831), + music_type: v.s8(3), + }, + { + track_no: v.s16(2), + music_id: v.s32(1995), + music_type: v.s8(4), + } + ] + }, + { + season_id: v.s32(13), + season_name: v.str("SKILL ANALYZER 第5回"), + season_new_flg: v.bool(true), + course_id: v.s16(11), + course_name: v.str("SKILL ANALYZER Level.11"), + course_type: v.s16(3), + skill_level: v.s16(11), + skill_name_id: v.s16(11), + matching_assist: v.bool(false), + clear_rate: v.s32(7368), + avg_score: v.u32(26411478), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(1996), + music_type: v.s8(4), + }, + { + track_no: v.s16(1), + music_id: v.s32(1909), + music_type: v.s8(4), + }, + { + track_no: v.s16(2), + music_id: v.s32(2081), + music_type: v.s8(4), + } + ] + }, + { + season_id: v.s32(5), + season_name: v.str("SKILL ANALYZER 第2回 Aコース"), + season_new_flg: v.bool(false), + course_id: v.s16(12), + course_name: v.str("SKILL ANALYZER Level.∞"), + course_type: v.s16(3), + skill_level: v.s16(12), + skill_name_id: v.s16(12), + matching_assist: v.bool(false), + clear_rate: v.s32(5389), + avg_score: v.u32(24218982), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(636), + music_type: v.s8(3), + }, + { + track_no: v.s16(1), + music_id: v.s32(367), + music_type: v.s8(3), + }, + { + track_no: v.s16(2), + music_id: v.s32(1766), + music_type: v.s8(4), + } + ] + }, + { + season_id: v.s32(6), + season_name: v.str("SKILL ANALYZER 第2回 Bコース"), + season_new_flg: v.bool(false), + course_id: v.s16(12), + course_name: v.str("SKILL ANALYZER Level.∞"), + course_type: v.s16(3), + skill_level: v.s16(12), + skill_name_id: v.s16(12), + matching_assist: v.bool(false), + clear_rate: v.s32(5726), + avg_score: v.u32(24058435), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(1769), + music_type: v.s8(4), + }, + { + track_no: v.s16(1), + music_id: v.s32(1768), + music_type: v.s8(4), + }, + { + track_no: v.s16(2), + music_id: v.s32(1767), + music_type: v.s8(4), + } + ] + }, + { + season_id: v.s32(8), + season_name: v.str("SKILL ANALYZER 第3回 Aコース"), + season_new_flg: v.bool(false), + course_id: v.s16(12), + course_name: v.str("SKILL ANALYZER Level.∞"), + course_type: v.s16(3), + skill_level: v.s16(12), + skill_name_id: v.s16(12), + matching_assist: v.bool(false), + clear_rate: v.s32(5563), + avg_score: v.u32(24761911), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(360), + music_type: v.s8(3), + }, + { + track_no: v.s16(1), + music_id: v.s32(1894), + music_type: v.s8(4), + }, + { + track_no: v.s16(2), + music_id: v.s32(1888), + music_type: v.s8(4), + } + ] + }, + { + season_id: v.s32(9), + season_name: v.str("SKILL ANALYZER 第3回 Bコース"), + season_new_flg: v.bool(false), + course_id: v.s16(12), + course_name: v.str("SKILL ANALYZER Level.∞"), + course_type: v.s16(3), + skill_level: v.s16(12), + skill_name_id: v.s16(12), + matching_assist: v.bool(false), + clear_rate: v.s32(5403), + avg_score: v.u32(24238465), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(1893), + music_type: v.s8(4), + }, + { + track_no: v.s16(1), + music_id: v.s32(1674), + music_type: v.s8(4), + }, + { + track_no: v.s16(2), + music_id: v.s32(1889), + music_type: v.s8(4), + } + ] + }, + { + season_id: v.s32(11), + season_name: v.str("SKILL ANALYZER 第4回 Aコース"), + season_new_flg: v.bool(false), + course_id: v.s16(12), + course_name: v.str("SKILL ANALYZER Level.∞"), + course_type: v.s16(3), + skill_level: v.s16(12), + skill_name_id: v.s16(12), + matching_assist: v.bool(false), + clear_rate: v.s32(6666), + avg_score: v.u32(25875704), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(374), + music_type: v.s8(3), + }, + { + track_no: v.s16(1), + music_id: v.s32(2039), + music_type: v.s8(4), + }, + { + track_no: v.s16(2), + music_id: v.s32(2037), + music_type: v.s8(4), + } + ] + }, + { + season_id: v.s32(12), + season_name: v.str("SKILL ANALYZER 第4回 Bコース"), + season_new_flg: v.bool(false), + course_id: v.s16(12), + course_name: v.str("SKILL ANALYZER Level.∞"), + course_type: v.s16(3), + skill_level: v.s16(12), + skill_name_id: v.s16(12), + matching_assist: v.bool(false), + clear_rate: v.s32(7109), + avg_score: v.u32(25764134), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(2040), + music_type: v.s8(4), + }, + { + track_no: v.s16(1), + music_id: v.s32(2041), + music_type: v.s8(4), + }, + { + track_no: v.s16(2), + music_id: v.s32(2038), + music_type: v.s8(4), + } + ] + }, + { + season_id: v.s32(13), + season_name: v.str("SKILL ANALYZER 第5回"), + season_new_flg: v.bool(true), + course_id: v.s16(12), + course_name: v.str("SKILL ANALYZER Level.∞"), + course_type: v.s16(3), + skill_level: v.s16(12), + skill_name_id: v.s16(12), + matching_assist: v.bool(false), + clear_rate: v.s32(7734), + avg_score: v.u32(27005256), + track: [ + { + track_no: v.s16(0), + music_id: v.s32(2083), + music_type: v.s8(4), + }, + { + track_no: v.s16(1), + music_id: v.s32(1906), + music_type: v.s8(4), + }, + { + track_no: v.s16(2), + music_id: v.s32(2085), + music_type: v.s8(4), + } + ] + } +]; diff --git a/src/services/sdvx/user.ts b/src/services/sdvx/user.ts index c29d98f..6db5007 100644 --- a/src/services/sdvx/user.ts +++ b/src/services/sdvx/user.ts @@ -1,10 +1,9 @@ import { Binary, Db, FindOptions } from "mongodb"; import { inject, injectable } from "tsyringe"; import { PlayerPlayData } from "../../types/sdvx/index.js"; -import { tokenToCardNumber, tokenToSdvxId } from "../../utils/laochan-id.js"; +import { tokenToCode, tokenToSdvxId } from "../../utils/laochan-id.js"; import { v } from "../../utils/kxml-value.js"; import { dateToString } from "../../utils/time.js"; -import * as data from '../../datas/sdvx.js' import { brotliCompress, brotliDecompress } from "zlib"; import { promisify } from "util"; import { SaveData } from "../../types/sdvx/savedata.js"; @@ -47,8 +46,8 @@ export class UserService { } async createEmptyPlayerData(token: string, name: string) { - const save_data: SaveData = { - code: v.str(tokenToCardNumber(token)), + const save_data = { + code: v.str(tokenToCode(token)), name: v.str(name), sdvx_id: v.str(tokenToSdvxId(token)), creator_id: v.u32(0), @@ -69,7 +68,7 @@ export class UserService { early_late_disp: v.u8(0), draw_adjust: v.s32(0), eff_c_left: v.u8(0), - eff_c_right: v.u8(0), + eff_c_right: v.u8(1), last_music_id: v.s32(0), last_music_type: v.u8(0), sort_type: v.u8(0), @@ -89,25 +88,19 @@ export class UserService { last_date: v.str(dateToString(new Date())), start_date: v.str(dateToString(new Date())), - item: { - info: [ - ...data.charaItems, - ] - }, + item: {}, item_cloud: {}, item_infinite: {}, skill: {}, param: {}, present: {}, cloud: { - relation: v.s8(1), + relation: v.s8(0), }, ea_shop: { - blaster_pass_enable: v.bool(true), - blaster_pass_limit_date: v.u64(0), shop_item: {}, }, - }; + } as SaveData; return this.savePlayerData(token, save_data, name); } diff --git a/src/utils/kxml-value.ts b/src/utils/kxml-value.ts index 90d09b0..2551d2d 100644 --- a/src/utils/kxml-value.ts +++ b/src/utils/kxml-value.ts @@ -14,10 +14,16 @@ export type ValueTypes = 's8' | 'str' | 'string' | 'time'; +type AttributeProperty = { + [K in keyof T as K extends string ? `$${K}` : never]: T[K] +} + export type KValueG = { $__type: T; __value: VT | VT[]; -} & Record; +} & AttributeProperty<{ + [key: string]: string | number; +}>; export type KS8 = KValueG<'s8', number>; export type KU8 = KValueG<'u8', number>; @@ -36,12 +42,8 @@ export type KIPv4 = KValueG<'ip4', string>; export type KTime = KValueG<'time', Date | number>; export type KValue = KS8 | KU8 | KS16 | KU16 | KS32 | KS64 | KU64 | KFloat | KDouble | KBoolean | KBinary | KString | KIPv4 | KTime; -type AttributeProperty = { - [K in keyof T as K extends string ? `$${K}` : never]: T[K] -} - export type Serializable = { - [key: string]: KValue | Serializable + [key: string]: KValue | Serializable | Serializable[] } | AttributeProperty<{ [key: string]: string | number; }>; diff --git a/src/utils/laochan-id.ts b/src/utils/laochan-id.ts index 35b443d..b827c17 100644 --- a/src/utils/laochan-id.ts +++ b/src/utils/laochan-id.ts @@ -21,6 +21,11 @@ export function tokenToCardNumber(token: string) { return ('LCHAN' + hash.toUpperCase()).slice(0, 16); } +export function tokenToCode(token: string) { + const key = highwayHash.asUInt32Low(HIGHWAY_KEY, Buffer.from(token)); + return 'MOAI' + key.toString().padStart(9, '0').slice(0, 9); +} + export function tokenToSnsId(token: string) { const key = highwayHash.asUInt32Low(HIGHWAY_KEY, Buffer.from(token)); return key.toString().padStart(8, '0');