From 1c408d84c4ebd5bdf3ca6e0f32ecaab0f4482608 Mon Sep 17 00:00:00 2001 From: cracrayol Date: Wed, 28 Sep 2022 18:36:10 +0200 Subject: [PATCH 1/8] Lapistoria+ : Add force unlock option --- popn@asphyxia/handler/eclale.ts | 12 ++++++++++++ popn@asphyxia/handler/lapistoria.ts | 12 ++++++++++++ popn@asphyxia/handler/usaneko.ts | 12 ++++++++++++ popn@asphyxia/index.ts | 7 +++++++ 4 files changed, 43 insertions(+) diff --git a/popn@asphyxia/handler/eclale.ts b/popn@asphyxia/handler/eclale.ts index 9335b2a..0054121 100644 --- a/popn@asphyxia/handler/eclale.ts +++ b/popn@asphyxia/handler/eclale.ts @@ -369,6 +369,18 @@ const getProfile = async (refid: string, name?: string) => { player.item.push(item); } + if(U.GetConfig("enable_force_unlock")) { + for(let i = 1; i <= GAME_MAX_MUSIC_ID; i++) { + player.item.push({ + type: K.ITEM('u8', 0), + id: K.ITEM('u16', i), + param: K.ITEM('u16', 15), + is_new: K.ITEM('bool', 0), + get_time: K.ITEM('u64', BigInt(0)), + }); + } + } + // Add version specific datas const params = await utils.readParams(refid, version); utils.addExtraData(player, params, extraData); diff --git a/popn@asphyxia/handler/lapistoria.ts b/popn@asphyxia/handler/lapistoria.ts index 6111600..4c27699 100644 --- a/popn@asphyxia/handler/lapistoria.ts +++ b/popn@asphyxia/handler/lapistoria.ts @@ -275,6 +275,18 @@ const getProfile = async (refid: string, name?: string) => { player.item.push(item); } + if(U.GetConfig("enable_force_unlock")) { + for(let i = 1; i <= GAME_MAX_MUSIC_ID; i++) { + player.item.push({ + type: K.ITEM('u8', 0), + id: K.ITEM('u16', i), + param: K.ITEM('u16', 15), + is_new: K.ITEM('bool', 0), + get_time: K.ITEM('u64', BigInt(0)), + }); + } + } + // Add version specific datas const params = await utils.readParams(refid, version); utils.addExtraData(player, params, extraData); diff --git a/popn@asphyxia/handler/usaneko.ts b/popn@asphyxia/handler/usaneko.ts index 5ea9683..5354670 100644 --- a/popn@asphyxia/handler/usaneko.ts +++ b/popn@asphyxia/handler/usaneko.ts @@ -462,6 +462,18 @@ const getProfile = async (refid: string, version: string, name?: string) => { }); } + if(U.GetConfig("enable_force_unlock")) { + for(let i = 1; i <= GAME_MAX_MUSIC_ID[version]; i++) { + player.item.push({ + type: K.ITEM('u8', 0), + id: K.ITEM('u16', i), + param: K.ITEM('u16', 15), + is_new: K.ITEM('bool', 0), + get_time: K.ITEM('u64', BigInt(0)), + }); + } + } + // Usaneko events if (version == 'v24') { const date = new Date(); diff --git a/popn@asphyxia/index.ts b/popn@asphyxia/index.ts index d5f5839..b7d5800 100644 --- a/popn@asphyxia/index.ts +++ b/popn@asphyxia/index.ts @@ -30,6 +30,13 @@ export function register() { default: true, }); + R.Config("enable_force_unlock", { + name: "Unlock all songs", + desc: "Force unlocking all songs (Lapistoria and later).", + type: "boolean", + default: true, + }); + R.WebUIEvent('importPnmData', importPnmData); R.WebUIEvent('updatePnmPlayerInfo', async (data: any) => { From 485d751683573f0e2992b00349d5c0a6b7a3f92f Mon Sep 17 00:00:00 2001 From: dannylin0711 Date: Sun, 5 Nov 2023 07:50:10 +0800 Subject: [PATCH 2/8] Fix licensed characters --- sdvx@asphyxia/data/exg.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sdvx@asphyxia/data/exg.ts b/sdvx@asphyxia/data/exg.ts index de1bf6a..be3d1bf 100644 --- a/sdvx@asphyxia/data/exg.ts +++ b/sdvx@asphyxia/data/exg.ts @@ -42,7 +42,8 @@ export const EVENT6 = [ 'BEGINNER_MUSIC_FOLDER', 'PLAYER_RADAR_ENABLE', 'SINGLE_BATTLE_ENABLE', - // 'USE_CUDA_VIDEO_PRESENTER' + // 'USE_CUDA_VIDEO_PRESENTER', + 'CHARACTER_IGNORE_DISABLE\t122,123,131,139,140,143' ]; export const COURSES6 = [ From b2a5c631638ad14004e476b31dd9994a261e7fc4 Mon Sep 17 00:00:00 2001 From: dannylin0711 Date: Tue, 12 Dec 2023 18:55:41 +0800 Subject: [PATCH 3/8] [1205] Enable HEXA OVERDRIVE --- sdvx@asphyxia/data/exg.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sdvx@asphyxia/data/exg.ts b/sdvx@asphyxia/data/exg.ts index be3d1bf..cc7dae7 100644 --- a/sdvx@asphyxia/data/exg.ts +++ b/sdvx@asphyxia/data/exg.ts @@ -43,7 +43,8 @@ export const EVENT6 = [ 'PLAYER_RADAR_ENABLE', 'SINGLE_BATTLE_ENABLE', // 'USE_CUDA_VIDEO_PRESENTER', - 'CHARACTER_IGNORE_DISABLE\t122,123,131,139,140,143' + 'CHARACTER_IGNORE_DISABLE\t122,123,131,139,140,143', + 'HEXA_OVERDRIVE_ENABLE\t1,2,3,4,5,6,7,8,9', ]; export const COURSES6 = [ From 8891f2b22257027ddf7112202a5b71cdbcaa9142 Mon Sep 17 00:00:00 2001 From: LatoWolf Date: Sat, 20 Jan 2024 14:16:40 +0800 Subject: [PATCH 4/8] Update exg.ts --- sdvx@asphyxia/data/exg.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdvx@asphyxia/data/exg.ts b/sdvx@asphyxia/data/exg.ts index cc7dae7..6c7de98 100644 --- a/sdvx@asphyxia/data/exg.ts +++ b/sdvx@asphyxia/data/exg.ts @@ -44,7 +44,7 @@ export const EVENT6 = [ 'SINGLE_BATTLE_ENABLE', // 'USE_CUDA_VIDEO_PRESENTER', 'CHARACTER_IGNORE_DISABLE\t122,123,131,139,140,143', - 'HEXA_OVERDRIVE_ENABLE\t1,2,3,4,5,6,7,8,9', + 'HEXA_OVERDRIVE_ENABLE\t8', ]; export const COURSES6 = [ From 06e7a067dee76ebcbf28bd95132d18e50b199178 Mon Sep 17 00:00:00 2001 From: dannylin0711 Date: Fri, 4 Oct 2024 20:41:15 +0800 Subject: [PATCH 5/8] SDVX EG update --- sdvx@asphyxia/data/exg.ts | 51 +++- sdvx@asphyxia/handlers/common.ts | 26 +- sdvx@asphyxia/handlers/profiles.ts | 12 + sdvx@asphyxia/handlers/webui.ts | 230 +++++++++++++++++- sdvx@asphyxia/index.ts | 14 +- sdvx@asphyxia/templates/booth/common.pug | 16 -- sdvx@asphyxia/templates/booth/load.pug | 23 -- .../templates/infiniteinfection/common.pug | 38 --- .../templates/infiniteinfection/load.pug | 105 -------- .../templates/infiniteinfection/score.pug | 14 -- 10 files changed, 301 insertions(+), 228 deletions(-) delete mode 100644 sdvx@asphyxia/templates/booth/common.pug delete mode 100644 sdvx@asphyxia/templates/booth/load.pug delete mode 100644 sdvx@asphyxia/templates/infiniteinfection/common.pug delete mode 100644 sdvx@asphyxia/templates/infiniteinfection/load.pug delete mode 100644 sdvx@asphyxia/templates/infiniteinfection/score.pug diff --git a/sdvx@asphyxia/data/exg.ts b/sdvx@asphyxia/data/exg.ts index 6c7de98..8ef12c4 100644 --- a/sdvx@asphyxia/data/exg.ts +++ b/sdvx@asphyxia/data/exg.ts @@ -1,4 +1,5 @@ -export const EVENT6 = [ +export let EVENT6 = [ + 'SERIALCODE_JP', 'DEMOGAME_PLAY', 'MATCHING_MODE', 'MATCHING_MODE_FREE_IP', @@ -39,15 +40,25 @@ export const EVENT6 = [ 'SUBBG_DISABLE', 'NEMSYS_DISABLE', 'S_PUC_EFFECT_ENABLE', - 'BEGINNER_MUSIC_FOLDER', + 'BEGINNER_MUSIC_FOLDER\t56,78,80,86,87,91,111,135,128,134,275,278,180,469,697,770,769,779,842,948,940,1057', + 'BEGINNER_MUSIC_FOLDER\t1056,1096,1062,932,1222,1136,1341,1297,1441,1472,1446,1455,1469,1475,1454,1449,1448,1540,1453,1456,1447,1451,1452,1480,1458,1457,1450,1657,1649,1471', + 'BEGINNER_MUSIC_FOLDER\t1735,1658,1756,1757,1754,1755,1758,1753,1749,1812,1820,1817,1741,1739,1740,1867,1871,1866,1872,1861,1858,1860,1862,1857,1903,1904,1859,1863,1856,1864,1865,1911,1916,1917,1914,1915,1918,1960', 'PLAYER_RADAR_ENABLE', 'SINGLE_BATTLE_ENABLE', - // 'USE_CUDA_VIDEO_PRESENTER', - 'CHARACTER_IGNORE_DISABLE\t122,123,131,139,140,143', - 'HEXA_OVERDRIVE_ENABLE\t8', + // 'SUBMONITOR_VSYNC_ENABLE', + 'USE_CUDA_VIDEO_PRESENTER', + 'CHARACTER_IGNORE_DISABLE\t122,123,131,139,140,143,149,160,162,163', + 'SUBBG_IGNORE_DISABLE\t166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311', + 'SUBBG_IGNORE_DISABLE\t312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,369,370,371,372,373,374,375,376,377,378,379,380,381,419,420,421', + 'SUBBG_IGNORE_DISABLE\t422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482', + 'STAMP_IGNORE_DISABLE\t273~312,773~820,993~1032,1245~1284,1469~1508', + 'HEXA_OVERDRIVE_ENABLE\t1,2,3,4,5,6,7,8,9,10,11,12', + 'TAMAADV_ENABLE', + 'CAMERA_CALIBRATION_TEST_MENU_ENABLE', + 'APRIL_RAINBOW_LINE_ACTIVE' ]; -export const COURSES6 = [ +export let COURSES6 = [ { id: 1, name: 'SKILL ANALYZER 第1回 Aコース', @@ -2820,7 +2831,7 @@ export const COURSES6 = [ } ]; -export const SDVX_AUTOMATION_SONGS = [ +export let SDVX_AUTOMATION_SONGS = [ 1, 2, 3, @@ -2895,6 +2906,7 @@ export const SDVX_AUTOMATION_SONGS = [ 228, 229, 239, + 241, 247, 250, 251, @@ -2942,6 +2954,7 @@ export const SDVX_AUTOMATION_SONGS = [ 376, 377, 381, + 390, 393, 398, 408, @@ -3053,7 +3066,7 @@ export const SDVX_AUTOMATION_SONGS = [ 787, ]; -export const SDVX_AUTOMATION_SONGS_2 = [ +export let SDVX_AUTOMATION_SONGS_2 = [ 788, 789, 790, @@ -3286,7 +3299,7 @@ export const SDVX_AUTOMATION_SONGS_2 = [ 1280, ] -const SDVX_AUTOMATION_SONGS_3 = [ +export let SDVX_AUTOMATION_SONGS_3 = [ 1281, 1282, 1300, @@ -3506,8 +3519,7 @@ const SDVX_AUTOMATION_SONGS_3 = [ 99004, ] - -export const EXTENDS6 = [ +export let EXTENDS6 = [ { id: 91, type: 17, @@ -3555,9 +3567,26 @@ export const EXTENDS6 = [ '', '', ], + }, + { + id: 94, + type: 20, + params: [ + 0, + 0, + 0, + 0, + 0, + '0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19', + '', + '', + '', + '', + ], } ]; + var ITEM_TYPE_CREW = 11 var ITEM_TYPE_APPEAL = 15 var ITEM_TYPE_STAMP = 17 diff --git a/sdvx@asphyxia/handlers/common.ts b/sdvx@asphyxia/handlers/common.ts index 0a1db11..6b63e27 100644 --- a/sdvx@asphyxia/handlers/common.ts +++ b/sdvx@asphyxia/handlers/common.ts @@ -1,5 +1,6 @@ import { EVENT6, COURSES6, EXTENDS6, VALGENE6 } from '../data/exg'; import {getVersion, getRandomIntInclusive} from '../utils'; +import fs from 'fs'; export const informationString = `[sz:120] [olc:555555][ol:4][c:ff3333,3333ff,77ff77]Asphyxia @@ -32,17 +33,15 @@ export const common: EPR = async (info, data, send) => { let courses = []; let extend = []; console.log("Calling common function"); - - const version = parseInt(info.model.split(":")[4]); + let exg_data_json = JSON.parse(fs.readFileSync('./plugins/sdvx@asphyxia/data/exg_data.json', 'utf8')); + + events = EVENT6; + courses = COURSES6; + // EXTENDS6.forEach(val => extend.push(Object.assign({}, val))); + extend = EXTENDS6; + extend = extend.concat(exg_data_json.extends_data); + // extend = extend.concat(exg_data.extends_data); - switch (info.method) { - case 'sv6_common': { - events = EVENT6; - courses = COURSES6; - EXTENDS6.forEach(val => extend.push(Object.assign({}, val))); - break; - } - } let songs = []; if (U.GetConfig('unlock_all_songs')) { @@ -258,8 +257,8 @@ export const common: EPR = async (info, data, send) => { season: K.ITEM('s32',3), rule: K.ITEM('s32',0), rank_match_target: K.ARRAY('s32', [ - 1,1,1,1, - 1,1,1,1, + 2,2,2,2, + 2,2,2,2, 1,1,1,1, 1,1,1,1, 0,0,0,0, @@ -286,6 +285,9 @@ export const common: EPR = async (info, data, send) => { item_type: K.ITEM('s32', c.item_type), item_id: K.ITEM('s32', c.item_id), })), + }, + invest:{ + limit_date: K.ITEM('u64',BigInt(newTime)), } }, { encoding: 'utf8' } diff --git a/sdvx@asphyxia/handlers/profiles.ts b/sdvx@asphyxia/handlers/profiles.ts index 08928bd..39c7914 100644 --- a/sdvx@asphyxia/handlers/profiles.ts +++ b/sdvx@asphyxia/handlers/profiles.ts @@ -19,6 +19,7 @@ function unlockNavigators(items: Partial[]) { console.log("Unlocking Navigators"); // 10 genesis card for MITSURU's voice items.push({ type: 4, id: 599, param: 10 }); + // items.push({ type: 21, id: 1, param: 1 }); return items; } @@ -29,6 +30,16 @@ function unlockAppealCards(items: Partial[]) { return items; } +function unlock_all_valkgen(items: Partial[]) { + // for (let i = 0; i < 500; ++i) items.push({ type: 17, id: i, param: 1 }); // stamp + // for (let i = 0; i < 600; ++i) items.push({ type: 18, id: i, param: 1 }); // subbg + // for (let i = 0; i < 100; ++i) items.push({ type: 19, id: i, param: 1 }); // bgm + // for (let i = 0; i < 100; ++i) items.push({ type: 20, id: i, param: 1 }); // nemsys + // for (let i = 0; i < 30; ++i) items.push({ type: 21, id: i, param: 1 }); // mainbg + + return items; +} + export const loadScore: EPR = async (info, data, send) => { console.log("Now loading score"); const version = Math.abs(getVersion(info)); @@ -364,6 +375,7 @@ export const load: EPR = async (info, data, send) => { let tempItem = U.GetConfig('unlock_all_navigators') ? unlockNavigators(items) : items; tempItem = U.GetConfig('unlock_all_appeal_cards') ? unlockAppealCards(tempItem) : tempItem; + tempItem = unlock_all_valkgen(tempItem); // Make generator power always 100%, for (let i = 0; i < 50; i++) { diff --git a/sdvx@asphyxia/handlers/webui.ts b/sdvx@asphyxia/handlers/webui.ts index 2ba26d8..5b34f6d 100644 --- a/sdvx@asphyxia/handlers/webui.ts +++ b/sdvx@asphyxia/handlers/webui.ts @@ -6,6 +6,8 @@ import { Mix } from '../models/mix'; import { fstat } from 'fs'; import { error } from 'console'; import { setMaxIdleHTTPParsers } from 'http'; +import { unpackS3P } from '../s3p'; +import { secureHeapUsed } from 'crypto'; export const updateProfile = async (data: { refid: string; @@ -203,7 +205,7 @@ export const deleteMix = async (data: { code: string }) => { export const make_hexa_easier = async(data:{ refid:string; -}) => { +}, send: WebUISend) => { let all_hexa = await DB.Find(data.refid, { collection: 'item' ,type:16 }) let playedNum = [] // Prevent previous unlocked hexa from being locked again all_hexa.forEach((item:Item)=>{ @@ -213,7 +215,7 @@ export const make_hexa_easier = async(data:{ } }); - for(let i = 1; i <= 50; i++){ // Hexa Diver 7, up to id = 50 + for(let i = 1; i <= 71; i++){ // Hexa Diver 7, up to id = 50 if(!playedNum.includes(i)){ await DB.Upsert( data.refid, @@ -222,19 +224,29 @@ export const make_hexa_easier = async(data:{ ) } } + + send.json({status:"ok"}) } +export const converted_received = async (data: { zip_file:any }, send: WebUISend) => { + +} + + export const import_assets = async (data: { path: string }, send: WebUISend) => { + + // await init(wasmUrl); + // let ffmpeg = await Wasmer.fromRegistry("wasmer/ffmpeg"); + let Admzip = require('../../_shared/lib/adm-zip') let path = data.path console.log(path) let fs = require('fs') if (!fs.existsSync(path + '/data/graphics/')) { - console.log('Path does not exist.') - send.error(400,'Path does not exist.') + console.log('Path for Graphics does not exist.') + send.error(400,'Path for Graphics does not exist.') return } - await fs.promises.cp(path + "/data/graphics/ap_card", './plugins/sdvx@asphyxia/webui/asset/ap_card', {recursive: true}).catch((err: any) => { console.log(err) }) @@ -247,6 +259,210 @@ export const import_assets = async (data: { path: string }, send: WebUISend) => await fs.promises.cp(path + "/data/graphics/submonitor_bg", './plugins/sdvx@asphyxia/webui/asset/submonitor_bg', {recursive: true}).catch((err: any) => { console.log(err) }) - console.log('Assets imported.') - send.json({status:"ok"}) + + if (!fs.existsSync(path + '/data/sound/')) { + console.log('Path for sound does not exist.') + send.error(400,'Path for sound does not exist.') + return + } + + let zip = new Admzip() + await fs.promises.readdir(path + "/data/sound/custom").then((files: any) => { + // let file = files[0] + console.log(files) + + for(let i in files){ + let file = files[i] + if(file.endsWith('.s3p')){ + fs.mkdirSync('./plugins/sdvx@asphyxia/webui/asset/temp/'+file, { recursive: true }); + // fs.mkdirSync('./plugins/sdvx@asphyxia/webui/asset/audio/'+file.substring(0, 9), { recursive: true }); + unpackS3P('./plugins/sdvx@asphyxia/webui/asset/temp/'+file, path + "/data/sound/custom/" + file, {}) + // fs.promises.readFileSync('./plugins/sdvx@asphyxia/webui/asset/temp/'+file+'/0.wma').then(async (data: any) => { + // const instance = await ffmpeg.entrypoint.run({ + // args: ["-i", "-", "-f", "wav", "-"], + // stdin: new Uint8Array(data), + // }); + // const { stdout } = await instance.wait(); + // fs.writeFileSync('./plugins/sdvx@asphyxia/webui/asset/audio/'+file.substring(0, 9)+'/0.wav', stdout); + + // }) + // exec(shell([ffmpeg, '-i', './plugins/sdvx@asphyxia/webui/asset/temp/'+file+'/0.wma', './plugins/sdvx@asphyxia/webui/asset/audio/'+file.substring(0, 9)+'/0.mp3']), (err: any, stdout: any, stderr: any) => { + // console.log(err) + // }) + + // exec(shell([ffmpeg, '-i', './plugins/sdvx@asphyxia/webui/asset/temp/'+file+'/1.wma', './plugins/sdvx@asphyxia/webui/asset/audio/'+file.substring(0, 9)+'/1.mp3']), (err: any, stdout: any, stderr: any) => { + // console.log(err) + // }) + + // if(fs.existsSync('./plugins/sdvx@asphyxia/webui/asset/temp/'+file+'/2.wma')){ + // exec(shell([ffmpeg, '-i', './plugins/sdvx@asphyxia/webui/asset/temp/'+file+'/2.wma', './plugins/sdvx@asphyxia/webui/asset/audio/'+file.substring(0, 9)+'/2.mp3']), (err: any, stdout: any, stderr: any) => { + // console.log(err) + // }) + // } + } + } + + + + + }).finally(() => { + + zip.addLocalFolder('./plugins/sdvx@asphyxia/webui/asset/temp', 'temp') + zip.writeZip('./plugins/sdvx@asphyxia/webui/asset/temp.zip') + }) + + await fs.promises.rm('./plugins/sdvx@asphyxia/webui/asset/temp', { recursive: true, force: true }).catch((err: any) => { + console.log(err) + }) + + + + + + console.log('Assets imported. Now converting audio files on browser...') + send.file('webui/asset/temp.zip') + + // fs.promises.rm('./plugins/sdvx@asphyxia/webui/asset/temp.zip', { force: true }).catch((err: any) => { + // console.log(err) + // }) + // send.json({status:"ok"}) }; + +export const update_webui_nemsys_data = async (data: any, send: WebUISend) => { + let string = data.file + let nemsys_xml = U.parseXML(string) + + const fs = require('fs') + const filename = "../webui/asset/json/data.json" + const datajson = require(filename) + + nemsys_xml.custom_nemsys_data.info.filter((e: any) => e.id != 8 && e.id != 9 && e.id != 10 && e.id != 11).forEach((item: any) => { + if(datajson.nemsys.filter((e: any) => e.value == item.id).length == 0){ + datajson.nemsys.push({ + value: item.id, + name: item.texture_name + }) + } + }) + + fs.writeFileSync("./plugins/sdvx@asphyxia/webui/asset/json/data.json", JSON.stringify(datajson, null, 2)) + send.json({status:"ok"}) +} + +export const update_webui_stamp_data = async (data: any, send: WebUISend) => { + let string = data.file + let chat_stamp_xml = U.parseXML(string) + + const fs = require('fs') + const filename = "../webui/asset/json/data.json" + const datajson = require(filename) + + chat_stamp_xml.chat_stamp_data.info.forEach((item: any) => { + if(datajson.stamp.filter((e: any) => e.value == item.id).length == 0){ + let addition = "" + if(item.filename != ""){ + addition = item.filename.substring(item.filename.length - 2) + } + + datajson.stamp.push({ + value: item.id, + name: item.title + " " +addition + }) + } + }) + + fs.writeFileSync("./plugins/sdvx@asphyxia/webui/asset/json/data.json", JSON.stringify(datajson, null, 2)) + send.json({status:"ok"}) +} + +export const update_webui_subbg_data = async (data: any, send: WebUISend) => { + const fs = require('fs') + const filename = "../webui/asset/json/data.json" + const datajson = require(filename) + + let subbg_folder = fs.readdirSync("./plugins/sdvx@asphyxia/webui/asset/submonitor_bg") + let subbg_entry = {} + subbg_folder.forEach((item: any) => { + if(item.endsWith(".png")||item.endsWith(".mp4")){ + if(subbg_entry[item.substring(6, 10)] == undefined){ + subbg_entry[item.substring(6, 10)] = {"count":1, "video":false} + }else{ + subbg_entry[item.substring(6, 10)]["count"] += 1 + } + } + if(item.endsWith(".mp4")){ + subbg_entry[item.substring(6, 10)]["video"] = true + } + }) + + console.log(JSON.stringify(subbg_entry, null, 2)) + + Object.keys(subbg_entry).forEach((item: any) => { + if(datajson.subbg.filter((e: any) => e.value == item).length == 0){ + if(subbg_entry[item]["video"]){ + datajson.subbg.push({ + value: parseInt(item), + name: "SubBG "+ item, + video: true, + }) + }else if(subbg_entry[item]["count"] > 1){ + datajson.subbg.push({ + value: parseInt(item), + name: "SubBG "+ item, + multi: true, + }) + }else{ + datajson.subbg.push({ + value: parseInt(item), + name: "SubBG "+ item, + }) + } + }else{ + if(subbg_entry[item]["video"]){ + datajson.subbg.forEach((e: any) => { + if(e.value == parseInt(item)){ + e.video = true + } + }) + }else if(subbg_entry[item]["count"] > 1){ + datajson.subbg.forEach((e: any) => { + if(e.value == parseInt(item)){ + e.multi = true + } + }) + } + } + }) + + fs.writeFileSync("./plugins/sdvx@asphyxia/webui/asset/json/data.json", JSON.stringify(datajson, null, 2)) + send.json({status:"ok"}) +} + +export const update_webui_bgm_data = async (data: any, send: WebUISend) => { + const fs = require('fs') + const filename = "../webui/asset/json/data.json" + const datajson = require(filename) + + let bgm_folder = fs.readdirSync("./plugins/sdvx@asphyxia/webui/asset/audio") + let bgm_entry = [] + + bgm_folder.forEach((item: any) => { + if(item.substring(0, 6) == "custom"){ + bgm_entry.push(parseInt(item.substring(item.length - 2))) + } + }) + + console.log(bgm_entry) + + bgm_entry.forEach((item: any) => { + if(datajson.bgm.filter((e: any) => e.value == item).length == 0){ + datajson.bgm.push({ + value: parseInt(item), + name: "BGM "+ item, + }) + } + }) + + fs.writeFileSync("./plugins/sdvx@asphyxia/webui/asset/json/data.json", JSON.stringify(datajson, null, 2)) + send.json({status:"ok"}) +} \ No newline at end of file diff --git a/sdvx@asphyxia/index.ts b/sdvx@asphyxia/index.ts index d9873d8..c1281ed 100644 --- a/sdvx@asphyxia/index.ts +++ b/sdvx@asphyxia/index.ts @@ -9,7 +9,11 @@ import { importMix, deleteMix, make_hexa_easier, - import_assets + import_assets, + update_webui_nemsys_data, + update_webui_stamp_data, + update_webui_subbg_data, + update_webui_bgm_data // sendImg, // sendImgWithID, // getScore, @@ -59,7 +63,7 @@ export function register() { R.Config('use_asphyxia_gameover',{ type: 'boolean', default: true, name:'Use Asphyxia Gameover', desc:'Enable the Asphyxia gameover message after ending the game.'}) R.Config('use_blasterpass',{ type: 'boolean', default: true, name:'Use Blaster Pass', desc:'Enable Blaster Pass for VW and EG'}); R.Config('new_year_special',{ type: 'boolean', default: true, name:'Use New Year Special', desc:'Enable New Year Special BGM for login'}); - R.Config('music_count',{ type: 'integer', default: 2200, name:'Music Count', desc:'The total number of music in the game.'}); + R.Config('music_count',{ type: 'integer', default: 2200, name:'Music Count', desc:'The maximum id of music in the game.'}); R.WebUIEvent('updateProfile', updateProfile); R.WebUIEvent('updateMix', updateMix); @@ -67,6 +71,10 @@ export function register() { R.WebUIEvent('deleteMix', deleteMix); R.WebUIEvent('easyHexa', make_hexa_easier); R.WebUIEvent('import_assets', import_assets); + R.WebUIEvent('update_webui_nemsys', update_webui_nemsys_data); + R.WebUIEvent('update_webui_chat_stamp', update_webui_stamp_data); + R.WebUIEvent('update_webui_subbg', update_webui_subbg_data); + R.WebUIEvent('update_webui_bgm', update_webui_bgm_data); const MultiRoute = (method: string, handler: EPR | boolean) => { R.Route(`game.sv6_${method}`, handler); @@ -127,6 +135,8 @@ export function register() { //logerrlevel: K.ITEM('s32', 0), //evtidnosendflg: K.ITEM('s32', 0) })); + + R.Unhandled(); diff --git a/sdvx@asphyxia/templates/booth/common.pug b/sdvx@asphyxia/templates/booth/common.pug deleted file mode 100644 index 6882290..0000000 --- a/sdvx@asphyxia/templates/booth/common.pug +++ /dev/null @@ -1,16 +0,0 @@ -- let music = 0; -- let event = 0; -- let catalog = 0; - -game - limited - while music < 200 - music(id=music++, flag=2) - - event - while event < 16 - info(id=event++) - - catalog - while catalog < 256 - info(id=catalog++, currency=1, price=1) diff --git a/sdvx@asphyxia/templates/booth/load.pug b/sdvx@asphyxia/templates/booth/load.pug deleted file mode 100644 index 3562737..0000000 --- a/sdvx@asphyxia/templates/booth/load.pug +++ /dev/null @@ -1,23 +0,0 @@ -game - name(__type="str") #{name} - code(__type="str") #{code} - gamecoin_packet(__type="u32") #{packets} - gamecoin_block(__type="u32") #{blocks} - exp_point(__type="u32") #{expPoint ? expPoint : 0} - m_user_cnt(__type="u32") #{mUserCnt ? mUserCnt : 0} - have_item(__type="bool" __count=512) #{Array(512).fill(1).join(" ")} - have_note(__type="bool" __count=512) #{Array(512).fill(1).join(" ")} - - last( - music_id=musicID, - music_type=musicType, - sort_type=sortType, - headphone=headphone, - hispeed=hiSpeed, - appeal_id=appeal, - frame0=boothFrame ? boothFrame[0] : 0, - frame1=boothFrame ? boothFrame[1] : 0, - frame2=boothFrame ? boothFrame[2] : 0, - frame3=boothFrame ? boothFrame[3] : 0, - frame4=boothFrame ? boothFrame[4] : 0, - ) diff --git a/sdvx@asphyxia/templates/infiniteinfection/common.pug b/sdvx@asphyxia/templates/infiniteinfection/common.pug deleted file mode 100644 index fc92bf9..0000000 --- a/sdvx@asphyxia/templates/infiniteinfection/common.pug +++ /dev/null @@ -1,38 +0,0 @@ -- let music = 0; -- let event = 0; -- let catalog = 0; - - -game - music_limited - while music < 23 - each type in [0,1,2,3] - info - music_id(__type="s32") #{music++} - music_type(__type="u8") #{type} - limited(__type="u8") 3 - - event - while event < 41 - info - event_id(__type="u32") #{event++} - - skill_course - each course in courses - info - course_id(__type="s16") #{course.id} - level(__type="s16") #{course.level} - season_id(__type="s16") #{course.season_id} - season_name(__type="str") #{course.season_name} - season_new_flg(__type="bool") #{course.new_flg} - course_name(_type="str") #{course.name} - course_type(__type="s16") #{course.type} - skill_name_id(__type="s16") #{course.name_id} - matching_assist(__type="bool") #{course.matching_assist} - guage_type(__type="s16") #{course.guage_type} - paseli_type(type="s16") #{course.paseli_type} - each trackinfo in course.tracks - track - track_no(__type="s16") #{trackinfo.no} - music_id(__type="s32") #{trackinfo.id} - music_type(__type="s8") #{trackinfo.type} \ No newline at end of file diff --git a/sdvx@asphyxia/templates/infiniteinfection/load.pug b/sdvx@asphyxia/templates/infiniteinfection/load.pug deleted file mode 100644 index b16f835..0000000 --- a/sdvx@asphyxia/templates/infiniteinfection/load.pug +++ /dev/null @@ -1,105 +0,0 @@ -game - result(__type="u8") 0 - name(__type="str") #{name} - code(__type="str") #{code} - sdvx_id(__type="str") #{code} - gamecoin_packet(__type="u32") #{packets} - gamecoin_block(__type="u32") #{blocks} - - - last - music_id(__type="s32") #{musicID} - music_type(__type="u8") #{musicType} - sort_type(__type="u8") #{sortType} - comment_id(__type="u16") 0 - appeal_id(__type="u16") #{appeal} - headphone(__type="u8") #{headphone} - narrow_down(__type="u8") #{narrowDown} - gauge_option(__type="u8") #{gaugeOption} - blaster_energy(__type="u32") #{blasterEnergy} - blaster_count(__type="u32") #{blasterCount} - extrack_energy(__type="u16") #{extrackEnergy} - - hispeed(__type="s32") #{hiSpeed} - lanespeed(__type="u32") #{laneSpeed} - - ars_option(__type="u8") #{arsOption} - notes_option(__type="u8") #{notesOption} - early_late_disp(__type="u8") #{earlyLateDisp} - draw_adjust(__type="s32") #{drawAdjust} - eff_c_left(__type="u8") #{effCLeft} - eff_c_right(__type="u8") #{effCRight} - - - kac_id(__type="str") #{name} - - skill_level(__type="s16") #{skill.level} - skill_base_id(__type="s16") #{skill.base} - skill_name_id(__type="s16") #{skill.name} - - ea_shop - packet_booster(__type="s32") 1 - if version < 5 - block_booster(__type="s32") 1 - if version >= 5 - blaster_pass_enable(__type="bool") 1 - blaster_pass_limit_date(__type="u64") #{currentTime} - - eaappli - relation(__type="s8") 1 - cloud - relation(__type="s8") 1 - block_no(__type="s32") 0 - - skill - course - each course in courses - d - ssnid(__type="s16") #{course.sid} - crsid(__type="s16") #{course.cid} - sc(__type="s32") #{course.score} - ex(__type="s32") 0 - ct(__type="s16") #{course.clear} - gr(__type="s16") #{course.grade} - ar(__type="s16") #{course.rate} - cnt(__type="s16") #{course.count} - course_total - each course in courses - d - ssnid(__type="s16") #{course.sid} - crsid(__type="s16") #{course.cid} - sc(__type="s32") #{course.score} - ex(__type="s32") 0 - ct(__type="s16") #{course.clear} - gr(__type="s16") #{course.grade} - ar(__type="s16") #{course.rate} - cnt(__type="s16") #{course.count} - course_all - each course in courses - d - ssnid(__type="s16") #{course.sid} - crsid(__type="s16") #{course.cid} - sc(__type="s32") #{course.score} - ex(__type="s32") 0 - ct(__type="s16") #{course.clear} - gr(__type="s16") #{course.grade} - ar(__type="s16") #{course.rate} - cnt(__type="s16") #{course.count} - - item - each item in tempItem - info - type(__type="u8") #{item.type} - id(__type="u32") #{item.id} - param(__type="u32") #{item.param} - - - play_count(__type="u32") 1001 - day_count(__type="u32") 301 - today_count(__type="u32") 21 - play_chain(__type="u32") 31 - max_play_chain(__type="u32") 31 - week_count(__type="u32") 9 - week_play_count(__type="u32") 101 - week_chain(__type="u32") 31 - max_week_chain(__type="u32") 31 \ No newline at end of file diff --git a/sdvx@asphyxia/templates/infiniteinfection/score.pug b/sdvx@asphyxia/templates/infiniteinfection/score.pug deleted file mode 100644 index 78acb76..0000000 --- a/sdvx@asphyxia/templates/infiniteinfection/score.pug +++ /dev/null @@ -1,14 +0,0 @@ -game - new - each music in temp - music - music_id (__type="u32")#{music.mid} - music_type (__type="u32")#{music.type} - score (__type="u32")#{music.score} - cnt (__type="u32")1 - clear_type (__type="u32")#{music.clear} - score_grade (__type="u32")#{music.grade} - btn_rate (__type="u32")#{music.buttonRate} - long_rate (__type="u32")#{music.longRate} - vol_rate (__type="u32")#{music.volRate} - old \ No newline at end of file From fd9866d483faa1d087f713472d638aec32d02b40 Mon Sep 17 00:00:00 2001 From: dannylin0711 Date: Mon, 21 Oct 2024 13:06:34 +0800 Subject: [PATCH 6/8] Create exg_data.json --- sdvx@asphyxia/data/exg_data.json | 3522 ++++++++++++++++++++++++++++++ 1 file changed, 3522 insertions(+) create mode 100644 sdvx@asphyxia/data/exg_data.json diff --git a/sdvx@asphyxia/data/exg_data.json b/sdvx@asphyxia/data/exg_data.json new file mode 100644 index 0000000..d76b632 --- /dev/null +++ b/sdvx@asphyxia/data/exg_data.json @@ -0,0 +1,3522 @@ +{ + "extends_data":[ + { + "id":4, + "type":4, + "params":[ + 0, + 1, + 0, + 0, + 0, + "", + "13,-1, 天 晴,[sz:40][sx:120][pos:0,2],[sz:40][sx:120][pos:0,2]", + "", + "", + "" + ] + }, + { + "id":5, + "type":4, + "params":[ + 0, + 1, + 0, + 0, + 0, + "", + "14,-1,詠鰤琉,[sz:40][sx:120][pos:10,2],[sz:40][sx:120][pos:10,2]", + "", + "", + "" + ] + }, + { + "id":6, + "type":4, + "params":[ + 0, + 1, + 0, + 0, + 0, + "", + "15,-1,Red Bull,[sz:40][sx:90][pos:10,2],[sz:40][sx:90][pos:10,2]", + "", + "", + "" + ] + }, + { + "id":7, + "type":4, + "params":[ + 0, + 1, + 0, + 0, + 0, + "", + "16,-1, 完 喰,[sz:40][sx:90][pos:10,2],[sz:40][sx:90][pos:10,2]", + "", + "", + "" + ] + } + ], + "automation_songs":[ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 21, + 22, + 23, + 24, + 30, + 36, + 39, + 47, + 60, + 63, + 71, + 73, + 75, + 86, + 87, + 88, + 89, + 90, + 91, + 94, + 101, + 109, + 115, + 116, + 117, + 118, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 128, + 130, + 131, + 134, + 135, + 151, + 165, + 166, + 180, + 183, + 198, + 208, + 211, + 213, + 214, + 216, + 220, + 221, + 223, + 228, + 229, + 239, + 247, + 250, + 251, + 252, + 253, + 255, + 256, + 258, + 259, + 267, + 269, + 271, + 272, + 282, + 289, + 295, + 299, + 304, + 324, + 332, + 333, + 339, + 341, + 342, + 344, + 348, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 372, + 373, + 374, + 375, + 376, + 377, + 381, + 393, + 398, + 408, + 413, + 414, + 418, + 420, + 432, + 437, + 444, + 459, + 479, + 495, + 499, + 506, + 507, + 508, + 510, + 522, + 525, + 529, + 532, + 535, + 537, + 538, + 540, + 542, + 543, + 546, + 547, + 548, + 550, + 551, + 553, + 581, + 583, + 587, + 597, + 598, + 600, + 606, + 607, + 610, + 615, + 623, + 625, + 626, + 629, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 673, + 679, + 680, + 681, + 689, + 692, + 693, + 694, + 698, + 699, + 704, + 708, + 709, + 715, + 716, + 717, + 718, + 720, + 722, + 725, + 730, + 731, + 733, + 735, + 740, + 741, + 743, + 746, + 783, + 784, + 785, + 786, + 787, + 788, + 789, + 790, + 791, + 792, + 793, + 794, + 795, + 796, + 797, + 798, + 799, + 800, + 801, + 802, + 803, + 804, + 805, + 806, + 807, + 808, + 809, + 810, + 811, + 812, + 813, + 814, + 815, + 816, + 817, + 818, + 819, + 823, + 825, + 827, + 828, + 829, + 830, + 831, + 837, + 842, + 866, + 883, + 888, + 889, + 895, + 900, + 902, + 907, + 908, + 909, + 910, + 911, + 912, + 913, + 914, + 915, + 925, + 927, + 929, + 939, + 961, + 963, + 964, + 965, + 966, + 967, + 968, + 969, + 970, + 971, + 977, + 978, + 979, + 982, + 983, + 985, + 986, + 992, + 993, + 994, + 995, + 998, + 999, + 1000, + 1008, + 1009, + 1010, + 1011, + 1012, + 1013, + 1015, + 1017, + 1018, + 1021, + 1022, + 1023, + 1024, + 1025, + 1026, + 1027, + 1028, + 1029, + 1030, + 1031, + 1032, + 1033, + 1034, + 1035, + 1036, + 1037, + 1038, + 1039, + 1040, + 1041, + 1042, + 1043, + 1044, + 1045, + 1046, + 1047, + 1048, + 1049, + 1052, + 1055, + 1072, + 1099, + 1100, + 1101, + 1102, + 1103, + 1104, + 1105, + 1106, + 1107, + 1108, + 1117, + 1121, + 1140, + 1141, + 1142, + 1143, + 1144, + 1145, + 1146, + 1147, + 1148, + 1149, + 1152, + 1158, + 1176, + 1177, + 1178, + 1179, + 1180, + 1181, + 1183, + 1184, + 1185, + 1186, + 1187, + 1188, + 1189, + 1190, + 1191, + 1192, + 1193, + 1194, + 1195, + 1196, + 1197, + 1198, + 1199, + 1200, + 1201, + 1202, + 1203, + 1204, + 1205, + 1206, + 1207, + 1208, + 1209, + 1210, + 1211, + 1212, + 1213, + 1214, + 1215, + 1216, + 1217, + 1218, + 1220, + 1221, + 1226, + 1228, + 1230, + 1231, + 1235, + 1237, + 1238, + 1239, + 1240, + 1243, + 1244, + 1246, + 1247, + 1248, + 1250, + 1251, + 1252, + 1253, + 1254, + 1255, + 1257, + 1258, + 1260, + 1261, + 1269, + 1270, + 1271, + 1272, + 1273, + 1274, + 1275, + 1276, + 1277, + 1278, + 1279, + 1280, + 1281, + 1282, + 1300, + 1301, + 1302, + 1304, + 1306, + 1307, + 1308, + 1309, + 1310, + 1311, + 1312, + 1313, + 1314, + 1315, + 1329, + 1345, + 1346, + 1347, + 1348, + 1361, + 1362, + 1363, + 1364, + 1365, + 1366, + 1367, + 1368, + 1369, + 1370, + 1371, + 1372, + 1373, + 1374, + 1375, + 1376, + 1377, + 1378, + 1379, + 1380, + 1381, + 1382, + 1383, + 1384, + 1385, + 1386, + 1388, + 1389, + 1397, + 1402, + 1416, + 1433, + 1434, + 1435, + 1436, + 1437, + 1459, + 1460, + 1461, + 1462, + 1463, + 1464, + 1465, + 1466, + 1467, + 1468, + 1490, + 1491, + 1495, + 1496, + 1497, + 1498, + 1499, + 1500, + 1501, + 1509, + 1580, + 1581, + 1582, + 1583, + 1584, + 1585, + 1586, + 1587, + 1588, + 1589, + 1590, + 1591, + 1592, + 1593, + 1594, + 1595, + 1596, + 1597, + 1598, + 1599, + 1600, + 1601, + 1602, + 1603, + 1604, + 1605, + 1606, + 1607, + 1608, + 1609, + 1610, + 1611, + 1660, + 1661, + 1662, + 1663, + 1664, + 1665, + 1666, + 1766, + 1767, + 1768, + 1769, + 1770, + 1771, + 1772, + 1773, + 1774, + 1775, + 1776, + 1777, + 1778, + 1779, + 1780, + 1781, + 1782, + 1783, + 1784, + 1785, + 1786, + 1787, + 1788, + 1789, + 1790, + 1791, + 1792, + 1793, + 1794, + 1795, + 1796, + 1797, + 1798, + 1799, + 1800, + 1801, + 1838, + 1839, + 1840, + 1841, + 1842, + 1843, + 1844, + 1888, + 1889, + 1890, + 1891, + 1892, + 1893, + 1894, + 1895, + 1896, + 1897, + 1898, + 1899, + 1900, + 1901, + 1919, + 1920, + 1921, + 1922, + 1923, + 1924, + 1925, + 1926, + 1927, + 1928, + 1929, + 1930, + 1931, + 1932, + 1933, + 1934, + 1935, + 1936, + 1937, + 1938, + 1939, + 1940, + 1941, + 1942, + 1943, + 1944, + 1945, + 1946, + 1947, + 1948, + 1949, + 1950, + 1951, + 1952, + 1953, + 1954, + 1955, + 1956, + 1957, + 1958, + 99001, + 99002, + 99003, + 99004 + ], + "skill_courses":[ + { + "id":1, + "name":"SKILL ANALYZER 第1回 Aコース", + "isNew":0, + "courses":[ + { + "id":1, + "type":0, + "name":"SKILL ANALYZER Level.01", + "level":1, + "nameID":1, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1383, + "mty":0 + }, + { + "no":1, + "mid":334, + "mty":1 + }, + { + "no":2, + "mid":774, + "mty":1 + } + ] + }, + { + "id":2, + "type":0, + "name":"SKILL ANALYZER Level.02", + "level":2, + "nameID":2, + "assist":0, + "tracks":[ + { + "no":0, + "mid":74, + "mty":0 + }, + { + "no":1, + "mid":771, + "mty":1 + }, + { + "no":2, + "mid":1125, + "mty":1 + } + ] + }, + { + "id":3, + "type":0, + "name":"SKILL ANALYZER Level.03", + "level":3, + "nameID":3, + "assist":0, + "tracks":[ + { + "no":0, + "mid":784, + "mty":1 + }, + { + "no":1, + "mid":1126, + "mty":1 + }, + { + "no":2, + "mid":1075, + "mty":1 + } + ] + }, + { + "id":4, + "type":0, + "name":"SKILL ANALYZER Level.04", + "level":4, + "nameID":4, + "assist":0, + "tracks":[ + { + "no":0, + "mid":505, + "mty":1 + }, + { + "no":1, + "mid":1403, + "mty":1 + }, + { + "no":2, + "mid":609, + "mty":1 + } + ] + }, + { + "id":5, + "type":0, + "name":"SKILL ANALYZER Level.05", + "level":5, + "nameID":5, + "assist":0, + "tracks":[ + { + "no":0, + "mid":630, + "mty":1 + }, + { + "no":1, + "mid":1598, + "mty":1 + }, + { + "no":2, + "mid":1475, + "mty":1 + } + ] + }, + { + "id":6, + "type":0, + "name":"SKILL ANALYZER Level.06", + "level":6, + "nameID":6, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1154, + "mty":2 + }, + { + "no":1, + "mid":1238, + "mty":2 + }, + { + "no":2, + "mid":590, + "mty":2 + } + ] + }, + { + "id":7, + "type":0, + "name":"SKILL ANALYZER Level.07", + "level":7, + "nameID":7, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1606, + "mty":2 + }, + { + "no":1, + "mid":834, + "mty":2 + }, + { + "no":2, + "mid":820, + "mty":4 + } + ] + }, + { + "id":8, + "type":0, + "name":"SKILL ANALYZER Level.08", + "level":8, + "nameID":8, + "assist":0, + "tracks":[ + { + "no":0, + "mid":183, + "mty":2 + }, + { + "no":1, + "mid":1602, + "mty":2 + }, + { + "no":2, + "mid":173, + "mty":2 + } + ] + }, + { + "id":9, + "type":0, + "name":"SKILL ANALYZER Level.09", + "level":9, + "nameID":9, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1418, + "mty":4 + }, + { + "no":1, + "mid":469, + "mty":2 + }, + { + "no":2, + "mid":1413, + "mty":4 + } + ] + }, + { + "id":10, + "type":0, + "name":"SKILL ANALYZER Level.10", + "level":10, + "nameID":10, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1596, + "mty":4 + }, + { + "no":1, + "mid":1649, + "mty":4 + }, + { + "no":2, + "mid":229, + "mty":2 + } + ] + }, + { + "id":11, + "type":0, + "name":"SKILL ANALYZER Level.11", + "level":11, + "nameID":11, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1651, + "mty":4 + }, + { + "no":1, + "mid":1105, + "mty":4 + }, + { + "no":2, + "mid":1152, + "mty":4 + } + ] + }, + { + "id":12, + "type":0, + "name":"SKILL ANALYZER Level.∞", + "level":12, + "nameID":12, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1664, + "mty":4 + }, + { + "no":1, + "mid":1528, + "mty":4 + }, + { + "no":2, + "mid":1185, + "mty":4 + } + ] + } + ] + }, + { + "id":2, + "name":"SKILL ANALYZER 第1回 Bコース", + "isNew":0, + "courses":[ + { + "id":1, + "type":0, + "name":"SKILL ANALYZER Level.01", + "level":1, + "nameID":1, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1066, + "mty":0 + }, + { + "no":1, + "mid":1054, + "mty":1 + }, + { + "no":2, + "mid":1055, + "mty":0 + } + ] + }, + { + "id":2, + "type":0, + "name":"SKILL ANALYZER Level.02", + "level":2, + "nameID":2, + "assist":0, + "tracks":[ + { + "no":0, + "mid":768, + "mty":1 + }, + { + "no":1, + "mid":948, + "mty":1 + }, + { + "no":2, + "mid":755, + "mty":1 + } + ] + }, + { + "id":3, + "type":0, + "name":"SKILL ANALYZER Level.03", + "level":3, + "nameID":3, + "assist":0, + "tracks":[ + { + "no":0, + "mid":401, + "mty":1 + }, + { + "no":1, + "mid":1320, + "mty":1 + }, + { + "no":2, + "mid":485, + "mty":1 + } + ] + }, + { + "id":4, + "type":0, + "name":"SKILL ANALYZER Level.04", + "level":4, + "nameID":4, + "assist":0, + "tracks":[ + { + "no":0, + "mid":295, + "mty":1 + }, + { + "no":1, + "mid":255, + "mty":1 + }, + { + "no":2, + "mid":1029, + "mty":1 + } + ] + }, + { + "id":5, + "type":0, + "name":"SKILL ANALYZER Level.05", + "level":5, + "nameID":5, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1420, + "mty":1 + }, + { + "no":1, + "mid":1001, + "mty":2 + }, + { + "no":2, + "mid":1611, + "mty":1 + } + ] + }, + { + "id":6, + "type":0, + "name":"SKILL ANALYZER Level.06", + "level":6, + "nameID":6, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1338, + "mty":2 + }, + { + "no":1, + "mid":79, + "mty":2 + }, + { + "no":2, + "mid":1151, + "mty":2 + } + ] + }, + { + "id":7, + "type":0, + "name":"SKILL ANALYZER Level.07", + "level":7, + "nameID":7, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1047, + "mty":2 + }, + { + "no":1, + "mid":982, + "mty":2 + }, + { + "no":2, + "mid":1042, + "mty":2 + } + ] + }, + { + "id":8, + "type":0, + "name":"SKILL ANALYZER Level.08", + "level":8, + "nameID":8, + "assist":0, + "tracks":[ + { + "no":0, + "mid":664, + "mty":2 + }, + { + "no":1, + "mid":1370, + "mty":2 + }, + { + "no":2, + "mid":838, + "mty":2 + } + ] + }, + { + "id":9, + "type":0, + "name":"SKILL ANALYZER Level.09", + "level":9, + "nameID":9, + "assist":0, + "tracks":[ + { + "no":0, + "mid":624, + "mty":2 + }, + { + "no":1, + "mid":1113, + "mty":4 + }, + { + "no":2, + "mid":1629, + "mty":4 + } + ] + }, + { + "id":10, + "type":0, + "name":"SKILL ANALYZER Level.10", + "level":10, + "nameID":10, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1595, + "mty":4 + }, + { + "no":1, + "mid":1657, + "mty":4 + }, + { + "no":2, + "mid":658, + "mty":2 + } + ] + }, + { + "id":11, + "type":0, + "name":"SKILL ANALYZER Level.11", + "level":11, + "nameID":11, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1647, + "mty":4 + }, + { + "no":1, + "mid":1587, + "mty":4 + }, + { + "no":2, + "mid":333, + "mty":3 + } + ] + }, + { + "id":12, + "type":0, + "name":"SKILL ANALYZER Level.∞", + "level":12, + "nameID":12, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1363, + "mty":4 + }, + { + "no":1, + "mid":692, + "mty":3 + }, + { + "no":2, + "mid":1270, + "mty":4 + } + ] + } + ] + }, + { + "id":3, + "name":"SKILL ANALYZER 第1回 Cコース", + "isNew":0, + "courses":[ + { + "id":1, + "type":0, + "name":"SKILL ANALYZER Level.01", + "level":1, + "nameID":1, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1376, + "mty":0 + }, + { + "no":1, + "mid":564, + "mty":1 + }, + { + "no":2, + "mid":87, + "mty":1 + } + ] + }, + { + "id":2, + "type":0, + "name":"SKILL ANALYZER Level.02", + "level":2, + "nameID":2, + "assist":0, + "tracks":[ + { + "no":0, + "mid":34, + "mty":1 + }, + { + "no":1, + "mid":932, + "mty":1 + }, + { + "no":2, + "mid":945, + "mty":1 + } + ] + }, + { + "id":3, + "type":0, + "name":"SKILL ANALYZER Level.03", + "level":3, + "nameID":3, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1132, + "mty":1 + }, + { + "no":1, + "mid":1549, + "mty":1 + }, + { + "no":2, + "mid":380, + "mty":1 + } + ] + }, + { + "id":4, + "type":0, + "name":"SKILL ANALYZER Level.04", + "level":4, + "nameID":4, + "assist":0, + "tracks":[ + { + "no":0, + "mid":130, + "mty":1 + }, + { + "no":1, + "mid":1204, + "mty":1 + }, + { + "no":2, + "mid":1424, + "mty":1 + } + ] + }, + { + "id":5, + "type":0, + "name":"SKILL ANALYZER Level.05", + "level":5, + "nameID":5, + "assist":0, + "tracks":[ + { + "no":0, + "mid":48, + "mty":2 + }, + { + "no":1, + "mid":565, + "mty":2 + }, + { + "no":2, + "mid":1109, + "mty":2 + } + ] + }, + { + "id":6, + "type":0, + "name":"SKILL ANALYZER Level.06", + "level":6, + "nameID":6, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1534, + "mty":2 + }, + { + "no":1, + "mid":1398, + "mty":2 + }, + { + "no":2, + "mid":1312, + "mty":2 + } + ] + }, + { + "id":7, + "type":0, + "name":"SKILL ANALYZER Level.07", + "level":7, + "nameID":7, + "assist":0, + "tracks":[ + { + "no":0, + "mid":962, + "mty":2 + }, + { + "no":1, + "mid":1560, + "mty":2 + }, + { + "no":2, + "mid":357, + "mty":2 + } + ] + }, + { + "id":8, + "type":0, + "name":"SKILL ANALYZER Level.08", + "level":8, + "nameID":8, + "assist":0, + "tracks":[ + { + "no":0, + "mid":965, + "mty":2 + }, + { + "no":1, + "mid":906, + "mty":2 + }, + { + "no":2, + "mid":579, + "mty":2 + } + ] + }, + { + "id":9, + "type":0, + "name":"SKILL ANALYZER Level.09", + "level":9, + "nameID":9, + "assist":0, + "tracks":[ + { + "no":0, + "mid":332, + "mty":2 + }, + { + "no":1, + "mid":36, + "mty":2 + }, + { + "no":2, + "mid":1476, + "mty":4 + } + ] + }, + { + "id":10, + "type":0, + "name":"SKILL ANALYZER Level.10", + "level":10, + "nameID":10, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1533, + "mty":4 + }, + { + "no":1, + "mid":1597, + "mty":4 + }, + { + "no":2, + "mid":1541, + "mty":4 + } + ] + } + ] + }, + { + "id":4, + "name":"BEMANI MASTER KOREA 2021", + "isNew":0, + "courses":[ + { + "id":1, + "type":0, + "name":"BEMANI MASTER KOREA 2021 ENJOY COURSE", + "level":0, + "nameID":13, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1641, + "mty":1 + }, + { + "no":1, + "mid":1646, + "mty":1 + }, + { + "no":2, + "mid":1642, + "mty":1 + } + ] + }, + { + "id":2, + "type":0, + "name":"BEMANI MASTER KOREA 2021 ENTRY COURSE", + "level":0, + "nameID":13, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1641, + "mty":4 + }, + { + "no":1, + "mid":1646, + "mty":4 + }, + { + "no":2, + "mid":1642, + "mty":4 + } + ] + } + ] + }, + { + "id":5, + "name":"SKILL ANALYZER 第2回", + "isNew":0, + "courses":[ + { + "id":1, + "type":0, + "name":"SKILL ANALYZER Level.01", + "level":1, + "nameID":1, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1374, + "mty":0 + }, + { + "no":1, + "mid":936, + "mty":1 + }, + { + "no":2, + "mid":314, + "mty":1 + } + ] + }, + { + "id":2, + "type":0, + "name":"SKILL ANALYZER Level.02", + "level":2, + "nameID":2, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1221, + "mty":0 + }, + { + "no":1, + "mid":169, + "mty":1 + }, + { + "no":2, + "mid":254, + "mty":1 + } + ] + }, + { + "id":3, + "type":0, + "name":"SKILL ANALYZER Level.03", + "level":3, + "nameID":3, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1429, + "mty":1 + }, + { + "no":1, + "mid":462, + "mty":1 + }, + { + "no":2, + "mid":237, + "mty":1 + } + ] + }, + { + "id":4, + "type":0, + "name":"SKILL ANALYZER Level.04", + "level":4, + "nameID":4, + "assist":0, + "tracks":[ + { + "no":0, + "mid":449, + "mty":1 + }, + { + "no":1, + "mid":329, + "mty":1 + }, + { + "no":2, + "mid":1293, + "mty":1 + } + ] + }, + { + "id":5, + "type":0, + "name":"SKILL ANALYZER Level.05", + "level":5, + "nameID":5, + "assist":0, + "tracks":[ + { + "no":0, + "mid":486, + "mty":2 + }, + { + "no":1, + "mid":920, + "mty":2 + }, + { + "no":2, + "mid":1318, + "mty":2 + } + ] + }, + { + "id":6, + "type":0, + "name":"SKILL ANALYZER Level.06", + "level":6, + "nameID":6, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1288, + "mty":2 + }, + { + "no":1, + "mid":256, + "mty":2 + }, + { + "no":2, + "mid":1445, + "mty":2 + } + ] + }, + { + "id":7, + "type":0, + "name":"SKILL ANALYZER Level.07", + "level":7, + "nameID":7, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1129, + "mty":2 + }, + { + "no":1, + "mid":1349, + "mty":2 + }, + { + "no":2, + "mid":1608, + "mty":2 + } + ] + }, + { + "id":8, + "type":0, + "name":"SKILL ANALYZER Level.08", + "level":8, + "nameID":8, + "assist":0, + "tracks":[ + { + "no":0, + "mid":492, + "mty":2 + }, + { + "no":1, + "mid":930, + "mty":4 + }, + { + "no":2, + "mid":651, + "mty":2 + } + ] + }, + { + "id":9, + "type":0, + "name":"SKILL ANALYZER Level.09", + "level":9, + "nameID":9, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1607, + "mty":2 + }, + { + "no":1, + "mid":1240, + "mty":2 + }, + { + "no":2, + "mid":510, + "mty":2 + } + ] + }, + { + "id":10, + "type":0, + "name":"SKILL ANALYZER Level.10", + "level":10, + "nameID":10, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1251, + "mty":4 + }, + { + "no":1, + "mid":1540, + "mty":4 + }, + { + "no":2, + "mid":1712, + "mty":4 + } + ] + }, + { + "id":11, + "type":0, + "name":"SKILL ANALYZER Level.11", + "level":11, + "nameID":11, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1143, + "mty":4 + }, + { + "no":1, + "mid":1298, + "mty":4 + }, + { + "no":2, + "mid":1619, + "mty":4 + } + ] + }, + { + "id":12, + "type":0, + "name":"SKILL ANALYZER Level.∞", + "level":12, + "nameID":12, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1639, + "mty":4 + }, + { + "no":1, + "mid":1496, + "mty":4 + }, + { + "no":2, + "mid":1766, + "mty":4 + } + ] + } + ] + }, + { + "id":6, + "name":"SKILL ANALYZER 第3回", + "isNew":0, + "courses":[ + { + "id":1, + "type":0, + "name":"SKILL ANALYZER Level.01", + "level":1, + "nameID":1, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1718, + "mty":0 + }, + { + "no":1, + "mid":144, + "mty":1 + }, + { + "no":2, + "mid":568, + "mty":1 + } + ] + }, + { + "id":2, + "type":0, + "name":"SKILL ANALYZER Level.02", + "level":2, + "nameID":2, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1659, + "mty":0 + }, + { + "no":1, + "mid":739, + "mty":1 + }, + { + "no":2, + "mid":561, + "mty":1 + } + ] + }, + { + "id":3, + "type":0, + "name":"SKILL ANALYZER Level.03", + "level":3, + "nameID":3, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1110, + "mty":1 + }, + { + "no":1, + "mid":1513, + "mty":1 + }, + { + "no":2, + "mid":732, + "mty":1 + } + ] + }, + { + "id":4, + "type":0, + "name":"SKILL ANALYZER Level.04", + "level":4, + "nameID":4, + "assist":0, + "tracks":[ + { + "no":0, + "mid":174, + "mty":1 + }, + { + "no":1, + "mid":1217, + "mty":1 + }, + { + "no":2, + "mid":617, + "mty":1 + } + ] + }, + { + "id":5, + "type":0, + "name":"SKILL ANALYZER Level.05", + "level":5, + "nameID":5, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1564, + "mty":1 + }, + { + "no":1, + "mid":1679, + "mty":1 + }, + { + "no":2, + "mid":285, + "mty":2 + } + ] + }, + { + "id":6, + "type":0, + "name":"SKILL ANALYZER Level.06", + "level":6, + "nameID":6, + "assist":0, + "tracks":[ + { + "no":0, + "mid":545, + "mty":2 + }, + { + "no":1, + "mid":1563, + "mty":2 + }, + { + "no":2, + "mid":916, + "mty":2 + } + ] + }, + { + "id":7, + "type":0, + "name":"SKILL ANALYZER Level.07", + "level":7, + "nameID":7, + "assist":0, + "tracks":[ + { + "no":0, + "mid":866, + "mty":2 + }, + { + "no":1, + "mid":330, + "mty":2 + }, + { + "no":2, + "mid":669, + "mty":2 + } + ] + }, + { + "id":8, + "type":0, + "name":"SKILL ANALYZER Level.08", + "level":8, + "nameID":8, + "assist":0, + "tracks":[ + { + "no":0, + "mid":399, + "mty":2 + }, + { + "no":1, + "mid":1166, + "mty":2 + }, + { + "no":2, + "mid":1305, + "mty":4 + } + ] + }, + { + "id":9, + "type":0, + "name":"SKILL ANALYZER Level.09", + "level":9, + "nameID":9, + "assist":0, + "tracks":[ + { + "no":0, + "mid":882, + "mty":4 + }, + { + "no":1, + "mid":1759, + "mty":4 + }, + { + "no":2, + "mid":993, + "mty":4 + } + ] + }, + { + "id":10, + "type":0, + "name":"SKILL ANALYZER Level.10", + "level":10, + "nameID":10, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1644, + "mty":4 + }, + { + "no":1, + "mid":1331, + "mty":4 + }, + { + "no":2, + "mid":1625, + "mty":4 + } + ] + }, + { + "id":11, + "type":0, + "name":"SKILL ANALYZER Level.11", + "level":11, + "nameID":11, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1550, + "mty":3 + }, + { + "no":1, + "mid":1366, + "mty":4 + }, + { + "no":2, + "mid":1722, + "mty":4 + } + ] + }, + { + "id":12, + "type":0, + "name":"SKILL ANALYZER Level.∞", + "level":12, + "nameID":12, + "assist":0, + "tracks":[ + { + "no":0, + "mid":495, + "mty":3 + }, + { + "no":1, + "mid":1464, + "mty":4 + }, + { + "no":2, + "mid":1767, + "mty":4 + } + ] + } + ] + }, + { + "id":8, + "name":"SKILL ANALYZER 第4回 Aコース", + "isNew":0, + "courses":[ + { + "id":1, + "type":0, + "name":"SKILL ANALYZER Level.01", + "level":1, + "nameID":1, + "assist":0, + "tracks":[ + { + "no":0, + "mid":271, + "mty":0 + }, + { + "no":1, + "mid":209, + "mty":1 + }, + { + "no":2, + "mid":1083, + "mty":1 + } + ] + }, + { + "id":2, + "type":0, + "name":"SKILL ANALYZER Level.02", + "level":2, + "nameID":2, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1088, + "mty":1 + }, + { + "no":1, + "mid":973, + "mty":1 + }, + { + "no":2, + "mid":22, + "mty":1 + } + ] + }, + { + "id":3, + "type":0, + "name":"SKILL ANALYZER Level.03", + "level":3, + "nameID":3, + "assist":0, + "tracks":[ + { + "no":0, + "mid":157, + "mty":1 + }, + { + "no":1, + "mid":1039, + "mty":1 + }, + { + "no":2, + "mid":972, + "mty":1 + } + ] + }, + { + "id":4, + "type":0, + "name":"SKILL ANALYZER Level.04", + "level":4, + "nameID":4, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1395, + "mty":1 + }, + { + "no":1, + "mid":238, + "mty":2 + }, + { + "no":2, + "mid":1342, + "mty":1 + } + ] + }, + { + "id":5, + "type":0, + "name":"SKILL ANALYZER Level.05", + "level":5, + "nameID":5, + "assist":0, + "tracks":[ + { + "no":0, + "mid":283, + "mty":2 + }, + { + "no":1, + "mid":1551, + "mty":1 + }, + { + "no":2, + "mid":573, + "mty":2 + } + ] + }, + { + "id":6, + "type":0, + "name":"SKILL ANALYZER Level.06", + "level":6, + "nameID":6, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1565, + "mty":2 + }, + { + "no":1, + "mid":1409, + "mty":2 + }, + { + "no":2, + "mid":202, + "mty":2 + } + ] + }, + { + "id":7, + "type":0, + "name":"SKILL ANALYZER Level.07", + "level":7, + "nameID":7, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1250, + "mty":2 + }, + { + "no":1, + "mid":434, + "mty":2 + }, + { + "no":2, + "mid":690, + "mty":2 + } + ] + }, + { + "id":8, + "type":0, + "name":"SKILL ANALYZER Level.08", + "level":8, + "nameID":8, + "assist":0, + "tracks":[ + { + "no":0, + "mid":460, + "mty":2 + }, + { + "no":1, + "mid":772, + "mty":2 + }, + { + "no":2, + "mid":891, + "mty":4 + } + ] + }, + { + "id":9, + "type":0, + "name":"SKILL ANALYZER Level.09", + "level":9, + "nameID":9, + "assist":0, + "tracks":[ + { + "no":0, + "mid":234, + "mty":2 + }, + { + "no":1, + "mid":886, + "mty":4 + }, + { + "no":2, + "mid":1716, + "mty":4 + } + ] + }, + { + "id":10, + "type":0, + "name":"SKILL ANALYZER Level.10", + "level":10, + "nameID":10, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1760, + "mty":4 + }, + { + "no":1, + "mid":730, + "mty":2 + }, + { + "no":2, + "mid":1405, + "mty":4 + } + ] + }, + { + "id":11, + "type":0, + "name":"SKILL ANALYZER Level.11", + "level":11, + "nameID":11, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1776, + "mty":4 + }, + { + "no":1, + "mid":1365, + "mty":4 + }, + { + "no":2, + "mid":911, + "mty":3 + } + ] + }, + { + "id":12, + "type":0, + "name":"SKILL ANALYZER Level.∞", + "level":12, + "nameID":12, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1364, + "mty":4 + }, + { + "no":1, + "mid":1661, + "mty":4 + }, + { + "no":2, + "mid":1099, + "mty":4 + } + ] + } + ] + }, + { + "id":9, + "name":"SKILL ANALYZER 第4回 Bコース", + "isNew":0, + "courses":[ + { + "id":1, + "type":0, + "name":"SKILL ANALYZER Level.01", + "level":1, + "nameID":1, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1526, + "mty":0 + }, + { + "no":1, + "mid":84, + "mty":1 + }, + { + "no":2, + "mid":76, + "mty":1 + } + ] + }, + { + "id":2, + "type":0, + "name":"SKILL ANALYZER Level.02", + "level":2, + "nameID":2, + "assist":0, + "tracks":[ + { + "no":0, + "mid":171, + "mty":1 + }, + { + "no":1, + "mid":474, + "mty":1 + }, + { + "no":2, + "mid":18, + "mty":1 + } + ] + }, + { + "id":3, + "type":0, + "name":"SKILL ANALYZER Level.03", + "level":3, + "nameID":3, + "assist":0, + "tracks":[ + { + "no":0, + "mid":281, + "mty":1 + }, + { + "no":1, + "mid":1254, + "mty":1 + }, + { + "no":2, + "mid":997, + "mty":1 + } + ] + }, + { + "id":4, + "type":0, + "name":"SKILL ANALYZER Level.04", + "level":4, + "nameID":4, + "assist":0, + "tracks":[ + { + "no":0, + "mid":417, + "mty":1 + }, + { + "no":1, + "mid":1572, + "mty":1 + }, + { + "no":2, + "mid":539, + "mty":1 + } + ] + }, + { + "id":5, + "type":0, + "name":"SKILL ANALYZER Level.05", + "level":5, + "nameID":5, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1701, + "mty":1 + }, + { + "no":1, + "mid":523, + "mty":2 + }, + { + "no":2, + "mid":477, + "mty":2 + } + ] + }, + { + "id":6, + "type":0, + "name":"SKILL ANALYZER Level.06", + "level":6, + "nameID":6, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1412, + "mty":2 + }, + { + "no":1, + "mid":1417, + "mty":2 + }, + { + "no":2, + "mid":1081, + "mty":2 + } + ] + }, + { + "id":7, + "type":0, + "name":"SKILL ANALYZER Level.07", + "level":7, + "nameID":7, + "assist":0, + "tracks":[ + { + "no":0, + "mid":315, + "mty":2 + }, + { + "no":1, + "mid":861, + "mty":4 + }, + { + "no":2, + "mid":1303, + "mty":2 + } + ] + }, + { + "id":8, + "type":0, + "name":"SKILL ANALYZER Level.08", + "level":8, + "nameID":8, + "assist":0, + "tracks":[ + { + "no":0, + "mid":484, + "mty":2 + }, + { + "no":1, + "mid":905, + "mty":2 + }, + { + "no":2, + "mid":1539, + "mty":4 + } + ] + }, + { + "id":9, + "type":0, + "name":"SKILL ANALYZER Level.09", + "level":9, + "nameID":9, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1019, + "mty":4 + }, + { + "no":1, + "mid":943, + "mty":4 + }, + { + "no":2, + "mid":1208, + "mty":4 + } + ] + }, + { + "id":10, + "type":0, + "name":"SKILL ANALYZER Level.10", + "level":10, + "nameID":10, + "assist":0, + "tracks":[ + { + "no":0, + "mid":786, + "mty":2 + }, + { + "no":1, + "mid":837, + "mty":2 + }, + { + "no":2, + "mid":1200, + "mty":4 + } + ] + }, + { + "id":11, + "type":0, + "name":"SKILL ANALYZER Level.11", + "level":11, + "nameID":11, + "assist":0, + "tracks":[ + { + "no":0, + "mid":979, + "mty":3 + }, + { + "no":1, + "mid":1459, + "mty":4 + }, + { + "no":2, + "mid":1774, + "mty":4 + } + ] + }, + { + "id":12, + "type":0, + "name":"SKILL ANALYZER Level.∞", + "level":12, + "nameID":12, + "assist":0, + "tracks":[ + { + "no":0, + "mid":914, + "mty":3 + }, + { + "no":1, + "mid":376, + "mty":3 + }, + { + "no":2, + "mid":1362, + "mty":4 + } + ] + } + ] + }, + { + "id":10, + "name":"SKILL ANALYZER 第5回 Aコース", + "isNew":1, + "courses":[ + { + "id":1, + "type":0, + "name":"SKILL ANALYZER Level.01", + "level":1, + "nameID":1, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1441, + "mty":0 + }, + { + "no":1, + "mid":274, + "mty":1 + }, + { + "no":2, + "mid":569, + "mty":1 + } + ] + }, + { + "id":2, + "type":0, + "name":"SKILL ANALYZER Level.02", + "level":2, + "nameID":2, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1057, + "mty":1 + }, + { + "no":1, + "mid":865, + "mty":1 + }, + { + "no":2, + "mid":721, + "mty":1 + } + ] + }, + { + "id":3, + "type":0, + "name":"SKILL ANALYZER Level.03", + "level":3, + "nameID":3, + "assist":0, + "tracks":[ + { + "no":0, + "mid":673, + "mty":1 + }, + { + "no":1, + "mid":954, + "mty":1 + }, + { + "no":2, + "mid":1867, + "mty":1 + } + ] + }, + { + "id":4, + "type":0, + "name":"SKILL ANALYZER Level.04", + "level":4, + "nameID":4, + "assist":0, + "tracks":[ + { + "no":0, + "mid":461, + "mty":1 + }, + { + "no":1, + "mid":538, + "mty":2 + }, + { + "no":2, + "mid":1510, + "mty":1 + } + ] + }, + { + "id":5, + "type":0, + "name":"SKILL ANALYZER Level.05", + "level":5, + "nameID":5, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1300, + "mty":1 + }, + { + "no":1, + "mid":1697, + "mty":2 + }, + { + "no":2, + "mid":476, + "mty":2 + } + ] + }, + { + "id":6, + "type":0, + "name":"SKILL ANALYZER Level.06", + "level":6, + "nameID":6, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1115, + "mty":2 + }, + { + "no":1, + "mid":1425, + "mty":2 + }, + { + "no":2, + "mid":756, + "mty":2 + } + ] + }, + { + "id":7, + "type":0, + "name":"SKILL ANALYZER Level.07", + "level":7, + "nameID":7, + "assist":0, + "tracks":[ + { + "no":0, + "mid":411, + "mty":2 + }, + { + "no":1, + "mid":990, + "mty":4 + }, + { + "no":2, + "mid":514, + "mty":2 + } + ] + }, + { + "id":8, + "type":0, + "name":"SKILL ANALYZER Level.08", + "level":8, + "nameID":8, + "assist":0, + "tracks":[ + { + "no":0, + "mid":778, + "mty":2 + }, + { + "no":1, + "mid":1727, + "mty":2 + }, + { + "no":2, + "mid":1127, + "mty":4 + } + ] + }, + { + "id":9, + "type":0, + "name":"SKILL ANALYZER Level.09", + "level":9, + "nameID":9, + "assist":0, + "tracks":[ + { + "no":0, + "mid":737, + "mty":2 + }, + { + "no":1, + "mid":1485, + "mty":2 + }, + { + "no":2, + "mid":1262, + "mty":4 + } + ] + }, + { + "id":10, + "type":0, + "name":"SKILL ANALYZER Level.10", + "level":10, + "nameID":10, + "assist":0, + "tracks":[ + { + "no":0, + "mid":832, + "mty":2 + }, + { + "no":1, + "mid":1749, + "mty":4 + }, + { + "no":2, + "mid":633, + "mty":2 + } + ] + }, + { + "id":11, + "type":0, + "name":"SKILL ANALYZER Level.11", + "level":11, + "nameID":11, + "assist":0, + "tracks":[ + { + "no":0, + "mid":725, + "mty":2 + }, + { + "no":1, + "mid":1201, + "mty":4 + }, + { + "no":2, + "mid":654, + "mty":2 + } + ] + }, + { + "id":12, + "type":0, + "name":"SKILL ANALYZER Level.∞", + "level":12, + "nameID":12, + "assist":0, + "tracks":[ + { + "no":0, + "mid":704, + "mty":3 + }, + { + "no":1, + "mid":1176, + "mty":4 + }, + { + "no":2, + "mid":1889, + "mty":4 + } + ] + } + ] + }, + { + "id":11, + "name":"SKILL ANALYZER 第5回 Aコース", + "isNew":1, + "courses":[ + { + "id":1, + "type":0, + "name":"SKILL ANALYZER Level.01", + "level":1, + "nameID":1, + "assist":0, + "tracks":[ + { + "no":0, + "mid":698, + "mty":0 + }, + { + "no":1, + "mid":159, + "mty":1 + }, + { + "no":2, + "mid":671, + "mty":1 + } + ] + }, + { + "id":2, + "type":0, + "name":"SKILL ANALYZER Level.02", + "level":2, + "nameID":2, + "assist":0, + "tracks":[ + { + "no":0, + "mid":388, + "mty":1 + }, + { + "no":1, + "mid":1084, + "mty":1 + }, + { + "no":2, + "mid":1755, + "mty":1 + } + ] + }, + { + "id":3, + "type":0, + "name":"SKILL ANALYZER Level.03", + "level":3, + "nameID":3, + "assist":0, + "tracks":[ + { + "no":0, + "mid":854, + "mty":1 + }, + { + "no":1, + "mid":321, + "mty":1 + }, + { + "no":2, + "mid":512, + "mty":1 + } + ] + }, + { + "id":4, + "type":0, + "name":"SKILL ANALYZER Level.04", + "level":4, + "nameID":4, + "assist":0, + "tracks":[ + { + "no":0, + "mid":412, + "mty":1 + }, + { + "no":1, + "mid":992, + "mty":1 + }, + { + "no":2, + "mid":1315, + "mty":1 + } + ] + }, + { + "id":5, + "type":0, + "name":"SKILL ANALYZER Level.05", + "level":5, + "nameID":5, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1085, + "mty":2 + }, + { + "no":1, + "mid":1229, + "mty":2 + }, + { + "no":2, + "mid":212, + "mty":2 + } + ] + }, + { + "id":6, + "type":0, + "name":"SKILL ANALYZER Level.06", + "level":6, + "nameID":6, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1616, + "mty":2 + }, + { + "no":1, + "mid":1815, + "mty":2 + }, + { + "no":2, + "mid":813, + "mty":2 + } + ] + }, + { + "id":7, + "type":0, + "name":"SKILL ANALYZER Level.07", + "level":7, + "nameID":7, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1719, + "mty":2 + }, + { + "no":1, + "mid":344, + "mty":2 + }, + { + "no":2, + "mid":1322, + "mty":2 + } + ] + }, + { + "id":8, + "type":0, + "name":"SKILL ANALYZER Level.08", + "level":8, + "nameID":8, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1410, + "mty":2 + }, + { + "no":1, + "mid":1761, + "mty":2 + }, + { + "no":2, + "mid":63, + "mty":2 + } + ] + }, + { + "id":9, + "type":0, + "name":"SKILL ANALYZER Level.09", + "level":9, + "nameID":9, + "assist":0, + "tracks":[ + { + "no":0, + "mid":96, + "mty":2 + }, + { + "no":1, + "mid":976, + "mty":3 + }, + { + "no":2, + "mid":801, + "mty":2 + } + ] + }, + { + "id":10, + "type":0, + "name":"SKILL ANALYZER Level.10", + "level":10, + "nameID":10, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1729, + "mty":4 + }, + { + "no":1, + "mid":985, + "mty":4 + }, + { + "no":2, + "mid":900, + "mty":3 + } + ] + }, + { + "id":11, + "type":0, + "name":"SKILL ANALYZER Level.11", + "level":11, + "nameID":11, + "assist":0, + "tracks":[ + { + "no":0, + "mid":1517, + "mty":4 + }, + { + "no":1, + "mid":1335, + "mty":4 + }, + { + "no":2, + "mid":367, + "mty":2 + } + ] + }, + { + "id":12, + "type":0, + "name":"SKILL ANALYZER Level.∞", + "level":12, + "nameID":12, + "assist":0, + "tracks":[ + { + "no":0, + "mid":273, + "mty":3 + }, + { + "no":1, + "mid":1581, + "mty":4 + }, + { + "no":2, + "mid":1888, + "mty":4 + } + ] + } + ] + } + ], + "valk_generators":{ + + } + } \ No newline at end of file From ee0ae068f6a512953cd935ca23f10612205d447a Mon Sep 17 00:00:00 2001 From: cracrayol Date: Wed, 24 Sep 2025 16:13:34 +0200 Subject: [PATCH 7/8] Add Unilab support Remove non-core Asphyxia data import Send correct number of Goods --- popn@asphyxia/README.md | 15 +- popn@asphyxia/handler/usaneko.ts | 273 ++++++++++++++++++------- popn@asphyxia/handler/webui.ts | 32 --- popn@asphyxia/index.ts | 3 - popn@asphyxia/models/achievements.ts | 16 ++ popn@asphyxia/webui/js/profile_page.js | 11 - popn@asphyxia/webui/profile_page.pug | 24 +-- 7 files changed, 226 insertions(+), 148 deletions(-) delete mode 100644 popn@asphyxia/handler/webui.ts delete mode 100644 popn@asphyxia/webui/js/profile_page.js diff --git a/popn@asphyxia/README.md b/popn@asphyxia/README.md index 5680d79..fc4d3e7 100644 --- a/popn@asphyxia/README.md +++ b/popn@asphyxia/README.md @@ -11,11 +11,18 @@ Plugin Version: **v3.0.0** - pop'n music Usagi to Neko to Shōnen no Yume - pop'n music peace - pop'n music Kaimei riddles +- pop'n music Unilab Important : require minimum Asphyxia Core **v1.31** ## Changelog +### 4.0.0 +* Unilab: Support added +* Lapistoria+ : Add Force Unlock +* Remove non-core Asphyxia data import +* Bugfix: Send correct number of Goods + ### 3.0.0 * Kaimei riddles: Support added * Usaneko: Add Daily Missions support @@ -57,14 +64,6 @@ Update phase data : All versions are on latest phase. #### 1.0.0 Initial Release. -## How to import data from non-core Asphyxia -To import data, you have to : -* Create your popn profile in Asphyxia-core. You just have to insert your card in the game and follow the process until coming to the select mode select screen. Once here, quit the game. -* Create a backup of your savedata.db file (in case something goes wrong). -* In the web UI of Asphyxia, go to POPN -> Profile and click detail on your profile -* Put the content of your non-core asphyxia popn music files in the text fields (pop.json and popn_scores.json) and click Import. -* Data is imported. Run the game, insert your card and your scores are available. - ## Known limitations * No rival support for Tune Street * Some stats are not implemented \ No newline at end of file diff --git a/popn@asphyxia/handler/usaneko.ts b/popn@asphyxia/handler/usaneko.ts index 5354670..43f12ba 100644 --- a/popn@asphyxia/handler/usaneko.ts +++ b/popn@asphyxia/handler/usaneko.ts @@ -1,5 +1,5 @@ import { AchievementsUsaneko } from "../models/achievements"; -import { ExtraData, Params, Phase } from "../models/common"; +import { ExtraData, Phase } from "../models/common"; import * as utils from "./utils"; export const setRoutes = () => { @@ -37,7 +37,7 @@ const getInfoCommon = (req: EamuseInfo) => { } // Choco - for (let i = 1; i <= 5; ++i) { + for (let i = 0; i < 5; ++i) { result.choco.push({ choco_id: K.ITEM('s16', i), param: K.ITEM('s32', -1), @@ -45,8 +45,8 @@ const getInfoCommon = (req: EamuseInfo) => { } // Goods - for (let i = 1; i <= 98; ++i) { - let price = 200; + for (let i = 0; i < GAME_MAX_DECO_ID[version]; ++i) { + let price = 250; if (i < 15) { price = 30; } else if (i < 30) { @@ -55,10 +55,12 @@ const getInfoCommon = (req: EamuseInfo) => { price = 60; } else if (i < 60) { price = 80; + } else if (i < 98) { + price = 200; } result.goods.push({ - item_id: K.ITEM('s32', i), + item_id: K.ITEM('s32', i + 1), item_type: K.ITEM('s16', 3), price: K.ITEM('s32', price), goods_type: K.ITEM('s16', 0), @@ -66,13 +68,15 @@ const getInfoCommon = (req: EamuseInfo) => { } // Area - for (let i = 1; i <= 16; ++i) { - result.area.push({ - area_id: K.ITEM('s16', i), - end_date: K.ITEM('u64', BigInt(0)), - medal_id: K.ITEM('s16', i), - is_limit: K.ITEM('bool', 0), - }); + if(version == 'v24') { + for (let i = 0; i < 16; ++i) { + result.area.push({ + area_id: K.ITEM('s16', i), + end_date: K.ITEM('u64', BigInt(0)), + medal_id: K.ITEM('s16', i), + is_limit: K.ITEM('bool', 0), + }); + } } // TODO : Course ranking @@ -388,7 +392,7 @@ const getProfile = async (refid: string, version: string, name?: string) => { // Add version specific datas let params = await utils.readParams(refid, version); - utils.addExtraData(player, params, EXTRA_DATA); + utils.addExtraData(player, params, getExtraData(version)); const achievements = await utils.readAchievements(refid, version, { ...defaultAchievements, version }); @@ -554,6 +558,34 @@ const getProfile = async (refid: string, version: string, name?: string) => { } } + // Unilab events + if (version == 'v27') { + const teams = achievements.team || []; + const batteries = achievements.battery || []; + + player.event_p27.first_play = K.ITEM('bool', teams.length != 0); + player.event_p27.elem_first_play = K.ITEM('bool', batteries.length != 0); + + player.event_p27.team = []; + for (const team of teams) { + player.event_p27.team.push({ + team_id: K.ITEM('s16', team.team_id || 0), + ex_no: K.ITEM('s16', team.ex_no || 0), + point: K.ITEM('u32', team.point || 0), + is_cleared: K.ITEM('bool', team.is_cleared || false), + }); + }; + + player.event_p27.battery = []; + for (const battery of batteries) { + player.event_p27.battery.push({ + battery_id: K.ITEM('s16', battery.battery_id || 0), + energy: K.ITEM('u32', battery.energy || 0), + is_cleared: K.ITEM('bool', battery.is_cleared || false), + }); + }; + } + return player; } @@ -569,7 +601,7 @@ const write = async (req: EamuseInfo, data: any, send: EamuseSend): Promise const params = await utils.readParams(refid, version); const achievements = await utils.readAchievements(refid, version, { ...defaultAchievements, version }); - utils.getExtraData(data, params, EXTRA_DATA); + utils.getExtraData(data, params, getExtraData(version, true)); // areas let areas = _.get(data, 'area', []); @@ -765,6 +797,59 @@ const write = async (req: EamuseInfo, data: any, send: EamuseSend): Promise } } + // Unilab (v27) + if (version == 'v27') { + let eventData = _.get(data, 'event_p27', []); + let team = _.get(eventData, 'team', null); + if(_.isPlainObject(team)) { + if (_.isNil(achievements.team)) { + achievements.team = []; + } + + const team_id = $(team).number('team_id'); + const ex_no = $(team).number('ex_no'); + const point = $(team).number('point'); + const is_cleared = $(team).bool('is_cleared'); + + let savedTeam = _.find(achievements.team, {'team_id': team_id}); + if(_.isUndefined(savedTeam)) { + achievements.team.push({ + team_id, + ex_no, + point, + is_cleared + }); + } else { + savedTeam.ex_no = ex_no; + savedTeam.point = point; + savedTeam.is_cleared = is_cleared; + } + } + + let battery = _.get(eventData, 'battery', null); + if(_.isPlainObject(battery)) { + if (_.isNil(achievements.battery)) { + achievements.battery = []; + } + + const battery_id = $(battery).number('battery_id'); + const energy = $(battery).number('energy'); + const is_cleared = $(battery).bool('is_cleared'); + + let savedBattery = _.find(achievements.battery, {'battery_id': battery_id}); + if(_.isUndefined(savedBattery)) { + achievements.battery.push({ + battery_id, + energy, + is_cleared + }); + } else { + savedBattery.energy = energy; + savedBattery.is_cleared = is_cleared; + } + } + } + await utils.writeParams(refid, version, params); await utils.writeAchievements(refid, version, achievements); @@ -806,6 +891,9 @@ const friend = async (req: EamuseInfo, data: any, send: EamuseSend): Promise { let phase = []; switch(version) { + case 'v27': + phase = PHASE['v27']; + break; case 'v26': phase = PHASE['v26']; case 'v25': @@ -816,6 +904,23 @@ const getPhase = (version: String): Phase[] => { return _.sortBy(phase, 'id'); } +const getExtraData = (version: String, full: boolean = false): ExtraData => { + let extraData = EXTRA_DATA_COMMON; + if (full) { + extraData = _.merge(extraData, EXTRA_DATA_V27, EXTRA_DATA_V26); + } else { + switch(version) { + case 'v27': + extraData = _.merge(extraData, EXTRA_DATA_V27); + break; + case 'v26': + extraData = _.merge(extraData, EXTRA_DATA_V26); + break; + } + } + return extraData; +} + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// let isOmni = false; @@ -826,9 +931,11 @@ const getVersion = (req: EamuseInfo): string => { } const date: number = parseInt(req.model.match(/:(\d*)$/)[1]); - if (date > 2020120900) { + if (date >= 2022091300) { + return 'v27'; + } else if (date >= 2021042600 && date < 2022091300) { return 'v26'; - } else if (date >= 2018101700 && date <= 2020120900) { + } else if (date >= 2018101700 && date < 2021042600 ) { return 'v25'; } else { return 'v24'; @@ -838,7 +945,15 @@ const getVersion = (req: EamuseInfo): string => { const GAME_MAX_MUSIC_ID = { v24: 1704, v25: 1877, - v26: 2019 + v26: 2019, + v27: 2188 +} + +const GAME_MAX_DECO_ID = { + v24: 97, + v25: 133, + v26: 133, + v27: 81 } const defaultAchievements: AchievementsUsaneko = { @@ -852,64 +967,71 @@ const defaultAchievements: AchievementsUsaneko = { stamps: {}, riddles: {}, missions: {}, + team: [], + battery: [] } const PHASE = { v24: [ - { id: 0, p: 11 }, // Default song phase availability (0-11) - { id: 1, p: 2 }, - { id: 2, p: 2 }, - { id: 3, p: 4 }, - { id: 4, p: 1 }, - { id: 5, p: 0 }, // Enable Net Taisen (0-1) - { id: 6, p: 1 }, // Enable NAVI-kun shunkyoku toujou, allows song 1608 to be unlocked (0-1) - { id: 7, p: 1 }, - { id: 8, p: 2 }, - { id: 9, p: 2 }, // Daily Mission (0-2) + { id: 0, p: 11 }, // Default song phase availability (0-11) + { id: 1, p: 2 }, // Unknown event (0-2) + { id: 2, p: 2 }, // Holiday Greeting (0-2) + { id: 3, p: 4 }, // Unknown event (0-2) + { id: 4, p: 1 }, // Unknown event (0-1) + { id: 5, p: 0 }, // Enable Net Taisen (0-1) + { id: 6, p: 1 }, // Enable NAVI-kun shunkyoku toujou, allows song 1608 to be unlocked (0-1) + { id: 7, p: 1 }, // Unknown event (0-1) + { id: 8, p: 2 }, // Unknown event (0-2) + { id: 9, p: 2 }, // Daily Mission (0-2) { id: 10, p: 15 }, // NAVI-kun Song phase availability (0-15) - { id: 11, p: 1 }, - { id: 12, p: 2 }, - { id: 13, p: 1 }, // Enable Pop'n Peace preview song (0-1) + { id: 11, p: 1 }, // Unknown event (0-1) + { id: 12, p: 2 }, // Unknown event (0-2) + { id: 13, p: 1 }, // Enable Pop'n Peace preview song (0-1) ], v25: [ - { id: 0, p: 23 }, - { id: 1, p: 4 }, - { id: 10, p: 30 }, - // New params - { id: 14, p: 39 }, - { id: 15, p: 2 }, - { id: 16, p: 3 }, - { id: 17, p: 8 }, - { id: 18, p: 1 }, - { id: 19, p: 1 }, - { id: 20, p: 13 }, - { id: 21, p: 20 }, // pop'n event archive - { id: 22, p: 2 }, - { id: 23, p: 1 }, - { id: 24, p: 1 }, + { id: 0, p: 23 }, // Default song phase availability (0-23) + { id: 1, p: 4 }, // Unknown event (0-4) + { id: 10, p: 30 }, // NAVI-kun Song phase availability (0-30) + { id: 14, p: 39 }, // Stamp Card Rally (0-39) + { id: 15, p: 2 }, // Unknown event (0-2) + { id: 16, p: 3 }, // Unknown event (0-3) + { id: 17, p: 8 }, // Unknown event (0-8) + { id: 18, p: 1 }, // FLOOR INFECTION event (0-1) + { id: 19, p: 1 }, // Pop'n music × NOSTALGIA kyouenkai (0-1) + { id: 20, p: 13 }, // Event archive (0-13) + { id: 21, p: 20 }, // Pop'n event archive (0-20) + { id: 22, p: 2 }, // バンめし♪ ふるさとグランプリ (0-2) + { id: 23, p: 1 }, // いちかのBEMANI投票選抜戦2019 (0-1) + { id: 24, p: 1 }, // ダンキラ!!! × pop'n music (0-1) ], v26: [ - // Music phase - // Phase 24: Seize The Day, 知りたい - // Phase 25: Triple Cross - // Phase 26: GO²TOS, Jailbreaker - // Phase 27: Aftermath - // Phase 28: 「Sweet Love」 - // Phase 29: GET WILD (UPPER), シュガーソングとビターステップ (UPPER) - // Phase 30 (MAX): 群像夏 - { id: 0, p: 30 }, - // New params + { id: 0, p: 30 }, // Music phase (0: No unlock, 1-30: steps) { id: 25, p: 62 }, // M&N event (0: disable, 62: all characters) - { id: 26, p: 3 }, // Unknown event (0-3) - { id: 27, p: 2 }, // peace soundtrack hatsubai kinen SP (0: not started, 1: enabled, 2: ended) - { id: 28, p: 2 }, // MZD no kimagure tanteisha joshu (0: not started, 1: enabled, 2: ended) - { id: 29, p: 5 }, // Shutchou! pop'n quest Lively (0: not started, 1-4: step enabled, 5: ended) - { id: 30, p: 6 }, // Shutchou! pop'n quest Lively II (0: not started, 1-5: step enabled, 6: ended) + { id: 26, p: 3 }, // Unknown event (0-3) + { id: 27, p: 2 }, // peace soundtrack hatsubai kinen SP (0: not started, 1: enabled, 2: ended) + { id: 28, p: 2 }, // MZD no kimagure tanteisha joshu (0: not started, 1: enabled, 2: ended) + { id: 29, p: 5 }, // Shutchou! pop'n quest Lively (0: not started, 1-4: step enabled, 5: ended) + { id: 30, p: 6 }, // Shutchou! pop'n quest Lively II (0: not started, 1-5: step enabled, 6: ended) + ], + v27: [ + { id: 0, p: 6 }, // Music phase (0: No unlock, 1-6: steps) + { id: 1, p: 6 }, // Shutchou! pop'n quest Lively II (0: not started, 1-5: steps, 6: ended) + { id: 2, p: 4 }, // KAC 2023 (0/2/4: disabled, 1: Caldwell 99, 3: Hexer / mathematical good-bye) + { id: 3, p: 0 }, // Net Taisen (0: diabled, 1: enabled, 2: enabled + local) + { id: 4, p: 7 }, // Unknown event (0-7) + { id: 5, p: 48 }, // Narunaru♪ UniLab jikkenshitsu! event (0: not started, 1-47: steps, 48: ended) + { id: 6, p: 2 }, // Super Unilab BOOST! (0: disabled, 1: enabled, 2: ended) + { id: 7, p: 6 }, // Unknown event (0-6) + { id: 8, p: 2 }, // Unknown event (0-2) + { id: 9, p: 44 }, // Kakusei no Elem event (0: not started, 1-44: steps) + { id: 10, p: 1 }, // Awakening Elem (0: disabled, 1: enabled) + { id: 11, p: 2 }, // CanCan's Super Awakening Boost (0: disabled, 1: enabled, 2: ended) + { id: 12, p: 2 }, // Unknown event (0-2) + { id: 13, p: 2 }, // Unknown event (0-2) ] } -const EXTRA_DATA: ExtraData = { - +const EXTRA_DATA_COMMON: ExtraData = { play_id: { type: 's32', path: 'account', default: 0 }, start_type: { type: 's8', path: 'account', default: 0 }, tutorial: { type: 's16', path: 'account', default: -1 }, @@ -935,15 +1057,6 @@ const EXTRA_DATA: ExtraData = { player_point: { type: 's32', path: 'account', default: 300 }, power_point_list: { type: 's32', path: 'account', default: [0], isArray: true }, - //v26 - card_again_count: { type: 's16', path: 'account', default: 0 }, - sp_riddles_id: { type: 's16', path: 'account', default: -1 }, - point: { type: 'u32', path: 'event2021', default: 0 }, // for peace soundtrack hatsubai kinen SP - step: { type: 'u8', path: 'event2021', default: 0 }, // for Shutchou! pop'n quest Lively - quest_point: { type: 'u32', path: 'event2021', default: Array(8).fill(0), isArray: true }, // for Shutchou! pop'n quest Lively - step_nos: { type: 'u8', path: 'event2021', default: 0 }, // for Shutchou! pop'n quest Lively II - quest_point_nos: { type: 'u32', path: 'event2021', default: Array(13).fill(0), isArray: true }, // for Shutchou! pop'n quest Lively II - mode: { type: 'u8', path: 'config', default: 0 }, chara: { type: 's16', path: 'config', default: 0 }, music: { type: 's16', path: 'config', default: 0 }, @@ -985,3 +1098,21 @@ const EXTRA_DATA: ExtraData = { comment_1: { type: 'u16', path: 'customize', default: 0 }, comment_2: { type: 'u16', path: 'customize', default: 0 }, } + +const EXTRA_DATA_V26: ExtraData = { + card_again_count: { type: 's16', path: 'account', default: 0 }, + sp_riddles_id: { type: 's16', path: 'account', default: -1 }, + point: { type: 'u32', path: 'event2021', default: 0 }, // for peace soundtrack hatsubai kinen SP + step: { type: 'u8', path: 'event2021', default: 0 }, // for Shutchou! pop'n quest Lively + quest_point: { type: 'u32', path: 'event2021', default: Array(8).fill(0), isArray: true }, // for Shutchou! pop'n quest Lively + step_nos: { type: 'u8', path: 'event2021', default: 0 }, // for Shutchou! pop'n quest Lively II + quest_point_nos: { type: 'u32', path: 'event2021', default: Array(13).fill(0), isArray: true }, // for Shutchou! pop'n quest Lively II +} + +const EXTRA_DATA_V27: ExtraData = { + lift: { type: 'bool', path: 'option', default: 0 }, + lift_rate: { type: 's16', path: 'option', default: 0 }, + team_id: { type: 's16', path: 'event_p27', default: 0 }, + select_battery_id: { type: 's16', path: 'event_p27', default: 1 }, + today_first_play: { type: 'bool', path: 'event_p27', default: 1 }, +} diff --git a/popn@asphyxia/handler/webui.ts b/popn@asphyxia/handler/webui.ts deleted file mode 100644 index 5f93701..0000000 --- a/popn@asphyxia/handler/webui.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Profile, Scores } from "../models/common"; - -export const importPnmData = async (data: { - refid: string; - profile: string; - scores: string; -}) => { - const profile = JSON.parse(data.profile); - const scores = JSON.parse(data.scores); - - await DB.Update( - data.refid, - { collection: 'profile' }, - { - $set: { - ...profile - } - } - ); - - await DB.Upsert( - data.refid, - { collection: 'scores' }, - { - $set: { - scores: { - ...scores - } - } - } - ); -}; \ No newline at end of file diff --git a/popn@asphyxia/index.ts b/popn@asphyxia/index.ts index b7d5800..8c9333a 100644 --- a/popn@asphyxia/index.ts +++ b/popn@asphyxia/index.ts @@ -4,7 +4,6 @@ import * as sunny from "./handler/sunny"; import * as lapistoria from "./handler/lapistoria"; import * as eclale from "./handler/eclale"; import * as usaneko from "./handler/usaneko"; -import { importPnmData } from "./handler/webui"; import { Rivals } from "./models/common"; const getVersion = (req: any) => { @@ -37,8 +36,6 @@ export function register() { default: true, }); - R.WebUIEvent('importPnmData', importPnmData); - R.WebUIEvent('updatePnmPlayerInfo', async (data: any) => { await DB.Update(data.refid, { collection: 'profile' }, { $set: { name: data.name } }); }); diff --git a/popn@asphyxia/models/achievements.ts b/popn@asphyxia/models/achievements.ts index afe41d0..bc6c9c7 100644 --- a/popn@asphyxia/models/achievements.ts +++ b/popn@asphyxia/models/achievements.ts @@ -122,4 +122,20 @@ export interface AchievementsUsaneko extends Achievements { other_count: number; }; }; + + team: Team[]; + battery: Battery[] +} + +interface Team { + team_id: number; + ex_no: number; + point: number; + is_cleared: boolean; +} + +interface Battery { + battery_id: number; + energy: number; + is_cleared: boolean; } \ No newline at end of file diff --git a/popn@asphyxia/webui/js/profile_page.js b/popn@asphyxia/webui/js/profile_page.js deleted file mode 100644 index 008af26..0000000 --- a/popn@asphyxia/webui/js/profile_page.js +++ /dev/null @@ -1,11 +0,0 @@ -$('#import-click').on('click', () => { - data = { - refid: $('#refid').val(), - profile: $('#profile').val(), - scores: $('#scores').val() - } - - emit('importPnmData', data).then(() => { - $('#import-success').removeClass("is-hidden"); - }); -}); diff --git a/popn@asphyxia/webui/profile_page.pug b/popn@asphyxia/webui/profile_page.pug index 3cecda4..5180ccb 100644 --- a/popn@asphyxia/webui/profile_page.pug +++ b/popn@asphyxia/webui/profile_page.pug @@ -61,26 +61,4 @@ div div label There is a limit of 4 rivals maximum (only the 2 firsts will be used for Sunny Park and lower). div - label The score sharing option also affect scores get from rivals. - .card - .card-header - p.card-header-title - span.icon - i.mdi.mdi-account-edit - | Import data - .card-content - .field - label.label Import data from previous Asphyxia (non-core) - .field - input.input(type="text" id="profile" name="profile" placeholder="Put content of popn.json") - .field - input.input(type="text" id="scores" name="scores" placeholder="Put content of popn_scores.json") - .field - label.help.is-danger /!\ Please backup your savedata.db before importing data /!\ - .field - button.button.is-primary#import-click - span.icon - i.mdi.mdi-file-import-outline - span Import - -script(src="static/js/profile_page.js") \ No newline at end of file + label The score sharing option also affect scores get from rivals. \ No newline at end of file From 3a215a1314aaf23595870fac55b58599b429d416 Mon Sep 17 00:00:00 2001 From: cracrayol Date: Wed, 24 Sep 2025 16:45:58 +0200 Subject: [PATCH 8/8] Unilab : Fix first play value --- popn@asphyxia/handler/usaneko.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/popn@asphyxia/handler/usaneko.ts b/popn@asphyxia/handler/usaneko.ts index 43f12ba..9f4fe99 100644 --- a/popn@asphyxia/handler/usaneko.ts +++ b/popn@asphyxia/handler/usaneko.ts @@ -563,8 +563,8 @@ const getProfile = async (refid: string, version: string, name?: string) => { const teams = achievements.team || []; const batteries = achievements.battery || []; - player.event_p27.first_play = K.ITEM('bool', teams.length != 0); - player.event_p27.elem_first_play = K.ITEM('bool', batteries.length != 0); + player.event_p27.first_play = K.ITEM('bool', teams.length == 0); + player.event_p27.elem_first_play = K.ITEM('bool', batteries.length == 0); player.event_p27.team = []; for (const team of teams) {