From 0fb22f1bc558f3f174d3cd3473dac4c761aac2a1 Mon Sep 17 00:00:00 2001 From: vvo <> Date: Sat, 24 Jun 2023 03:01:05 +0800 Subject: [PATCH] more 0425 stuff --- sdvx@asphyxia/README.md | 32 +- sdvx@asphyxia/data/exg.ts | 340 +++++++++++++++- sdvx@asphyxia/handlers/common.ts | 41 +- sdvx@asphyxia/handlers/features.ts | 364 +++++++++--------- sdvx@asphyxia/handlers/profiles.ts | 6 +- sdvx@asphyxia/webui/asset/js/events.js | 260 ++++++------- sdvx@asphyxia/webui/asset/js/generator.js | 30 +- sdvx@asphyxia/webui/asset/js/preview.js | 19 +- sdvx@asphyxia/webui/asset/json/events.json | 220 ++++++----- .../webui/asset/json/valgene_data.json | 19 + 10 files changed, 868 insertions(+), 463 deletions(-) diff --git a/sdvx@asphyxia/README.md b/sdvx@asphyxia/README.md index b8859c4..591eeba 100644 --- a/sdvx@asphyxia/README.md +++ b/sdvx@asphyxia/README.md @@ -28,7 +28,37 @@ The plugin now mainly maintained versions: Fork Changelog =========== ### Latest supported game version -- 2022122001 +- EG 2023042500 + +## fork-6.0.1.0 + +### New: + +1. Support for EG 2023042500 +2. S-PUC effect enabled (haven't tested yet. couldn't be bothered to try lol) +3. Player Radar enabled +4. Single Battle mode enabled (haven't tested, idk if it works as is) +5. Added stamp events + - 2023 appeal card stamp event + - 11th anniversary appeal card stamp event +6. Added the remaining BPL weekly song toggles +7. Added Valkyrie Generator Vol. 10 and Vol. 11 +8. Added Premium Generator Vol. 2 +9. Valkyrie Generator Volumes 1 to 5 can now be rolled in WebUI +10. Added Arena Station 6 and 7. +11. Updated MISSING_SONGS to include the new licensed songs (HIMEHINA, Synthion, etc.) + +### Fixes: + +1. Updated songNum from 2000 to 3000 since the mdb now passed 2000 music IDs (for use of Unlock All Songs option; otherwise it will base on the music_db.json in the assets file) +2. Updated rival feature to include r.exscore (fixes some crashes in song select screen) + +### Todo: + +1. BPL Season 2 Special Stamp Event Implementation + - All songs on the stamp event selection screen should be completed and unlocked for SuddeИDeath to appear. Still don't know how to implement that. +2. Figure out how to use image (png) files to appear in information/news popup. +3. Implement BPL Supporter banner ## fork-6.0.0.2 diff --git a/sdvx@asphyxia/data/exg.ts b/sdvx@asphyxia/data/exg.ts index 103e761..56f9250 100644 --- a/sdvx@asphyxia/data/exg.ts +++ b/sdvx@asphyxia/data/exg.ts @@ -37,7 +37,9 @@ export const EVENT6 = [ 'VALGENE_ENABLE', 'ARENA_ENABLE', 'DISP_PASELI_BANNER', - 'S_PUC_EFFECT_ENABLE' + 'S_PUC_EFFECT_ENABLE', + 'PLAYER_RADAR_ENABLE', + 'SINGLE_BATTLE_ENABLE' ]; export const INFORMATION6 = { @@ -48,7 +50,8 @@ export const INFORMATION6 = { '2022081600': ['[img:ver06/info_psd.ifs:hexa_diver_220714]', '[img:ver06/info_psd.ifs:hexa_diver_220818]'], '2022083000': ['[img:ver06/info_psd.ifs:hexa_diver_220714]', '[img:ver06/info_psd.ifs:hexa_diver_220818]', '[img:ver06/info_psd.ifs:paseli_present_220901]'], '2022101800': ['[img:ver06/info_psd.ifs:hexa_diver_220714]', '[img:ver06/info_psd.ifs:hexa_diver_220818]', '[img:ver06/info_psd.ifs:paseli_present_220901]'], - '2022122001': ['[img:ver06/info_psd.ifs:hexa_diver_220714]', '[img:ver06/info_psd.ifs:hexa_diver_220818]', '[img:ver06/info_psd.ifs:paseli_present_220901]'] + '2022122001': ['[img:ver06/info_psd.ifs:hexa_diver_220714]', '[img:ver06/info_psd.ifs:hexa_diver_220818]', '[img:ver06/info_psd.ifs:paseli_present_220901]'], + // '2023042500': ['[img:ver06/info_psd.ifs:hexa_diver_220714]', '[img:ver06/info_psd.ifs:hexa_diver_220818]', '[img:ver06/info_psd.ifs:paseli_present_220901]'] } export const MISSINGSONGS6 = [ @@ -59,7 +62,10 @@ export const MISSINGSONGS6 = [ // 0726 - 1018 '1857', '1858', '1860', '1861', '1862', '1856', '1859', '1863', '1864', '1865', - '1903', '1904', '1911', '1916', '1917' + '1903', '1904', '1911', '1916', '1917', + + // 230228 - 230425 + '1960', '1961', '1962', '2028', '2029', '1912', '1913', '2030' ] export const STAMP_EVENTS6 = { @@ -259,13 +265,121 @@ export const STAMP_EVENTS6 = { } ] } - } + }, + '11thanniv': { + 'type': 'main', + 'info': { + 'id': 0, + 'stmpSlHd': '', + 'stmpSlFt': '', + 'stmpHd': '[sz:22]SPECIAL STAMP BONUS', + 'stmpFt': '[sz:22]YOU CAN GET A STAMP AND BONUS! :)[br:5]TERM: 1/1 ~ 1/9', + 'stmpBg': '', + 'data': [ + { + 'stmpid': 13, + 'bnr': '', + 'stps': 1, + 'stprwrd': [ + ['1', 'appeal', '5523', ''] + ] + } + ] + } + }, + 'bpl2022stamp': { + 'type': 'select', + 'info': { + 'id': 3, + 'num2': -1, + 'stmpSlHd': '[sz:22][c:FFA6AA]BEMANI PRO LEAGUE -SEASON 2- SPECIAL STAMP', + 'stmpSlFt': '[sz:23]{TextStamp}[br:5]{TextTerm} 2023/03/30~2023/05/07', + 'stmpHd': '[sz:22][c:DAC491]BEMANI PRO LEAGUE -SEASON 2- SPECIAL STAMP', + 'stmpFt': '[sz:22]YOU CAN GET STAMPS BY PLAYING SDVX!', + 'stmpBg': 'bg_stamp_bpl', + 'data': [ + { + 'stmpid': 14, + 'bnr': 'sheet_track_1919', + 'stps': 15, + 'stprwrd': [ + ['15', 'track', '1919', '23'] + ] + }, + { + 'stmpid': 15, + 'bnr': 'sheet_track_1920', + 'stps': 15, + 'stprwrd': [ + ['15', 'track', '1920', '23'] + ] + }, + { + 'stmpid': 16, + 'bnr': 'sheet_track_1921', + 'stps': 15, + 'stprwrd': [ + ['15', 'track', '1921', '23'] + ] + }, + { + 'stmpid': 17, + 'bnr': 'sheet_track_1922', + 'stps': 15, + 'stprwrd': [ + ['15', 'track', '1922', '23'] + ] + }, + { + 'stmpid': 18, + 'bnr': 'sheet_track_1923', + 'stps': 15, + 'stprwrd': [ + ['15', 'track', '1923', '23'] + ] + }, + { + 'stmpid': 19, + 'bnr': 'sheet_track_1924', + 'stps': 15, + 'stprwrd': [ + ['15', 'track', '1924', '23'] + ] + }, + { + 'stmpid': 20, + 'bnr': 'sheet_track_1925', + 'stps': 15, + 'stprwrd': [ + ['15', 'track', '1925', '23'] + ] + }, + { + 'stmpid': 21, + 'bnr': 'sheet_track_1926', + 'stps': 15, + 'stprwrd': [ + ['15', 'track', '1926', '23'] + ] + }, + { + 'stmpid': 22, + 'bnr': 'sheet_track_1938', + 'stps': 30, + 'stprwrd': [ + ['30', 'track', '1938', '23'] + ] + } + ] + } + }, } export const EVENT_SONGS6 = { // X-Record songs 'xrecord_1': ['1736', '1737', '1738'], - 'xrecord_2': ['1848', '1847', '1849'], + 'xrecord_2': ['1847', '1848', '1849'], + 'xrecord_3': ['1980', '1978', '1979'], // Konaste songs 'konasute_1': ['1762'], 'konasute_2': ['1763'], @@ -288,13 +402,21 @@ export const EVENT_SONGS6 = { "bpl2022_3": ['1956', '1949'], "bpl2022_4": ['1946', '1958'], "bpl2022_5": ['1957', '1955'], - "bpl2022_6": ['1947', '1953'] + "bpl2022_6": ['1947', '1953'], + "bpl2022_7": ['1950', '1944'], + "bpl2022_8": ['1945', '1954'], + "bpl2022_9": ['1942'], + "bpl2022_10": ['1939'], + "bpl2022_11": ['1940'], + "bpl2022_12": ['1941'], + } export const RESTRICTED_SONGS6 = { // X-Record songs 'xrecord_1': ['1736', '1737', '1738'], - 'xrecord_2': ['1848', '1847', '1849'], + 'xrecord_2': ['1847', '1848', '1849'], + 'xrecord_3': ['1980', '1978', '1979'], // Konaste songs 'konasute_1': ['1762'], 'konasute_2': ['1763'], @@ -317,7 +439,13 @@ export const RESTRICTED_SONGS6 = { "bpl2022_3": ['1956', '1949'], "bpl2022_4": ['1946', '1958'], "bpl2022_5": ['1957', '1955'], - "bpl2022_6": ['1947', '1953'] + "bpl2022_6": ['1947', '1953'], + "bpl2022_7": ['1950', '1944'], + "bpl2022_8": ['1945', '1954'], + "bpl2022_9": ['1942'], + "bpl2022_10": ['1939'], + "bpl2022_11": ['1940'], + "bpl2022_12": ['1941'], } export const APRILFOOLSSONGS = [ @@ -327,7 +455,7 @@ export const APRILFOOLSSONGS = [ export const VALKYRIE_SONGS = [ '1744', '1672', // Valk exclusives '1855', '1742', '1743', '1745', // Arena station songs - '1736', '1737', '1738', '1848', '1847', '1849' // X-record + '1736', '1737', '1738', '1847', '1848', '1849', '1980', '1978', '1979' // X-record ] export const ARENA = { @@ -824,6 +952,155 @@ export const ARENA = { param: 8, } ] + }, + 'Set 7 (04/27/23)': { + details: { + // season: 4, + time_start: BigInt(Date.parse('27 Apr 2023 00:00:00 GMT')), + time_end: BigInt(Date.parse('31 Dec 2099 23:59:59 GMT')), + shop_start: BigInt(Date.parse('27 Apr 2023 00:00:00 GMT')), + shop_end: BigInt(Date.parse('31 Dec 2099 23:59:59 GMT')), + is_open: 1, + is_shop: 1 + }, + arena_items: [ + { + catalog_id: 1, + catalog_type: 1, + price: 15000, + item_type: 11, + item_id: 122, + param: 1, + }, + { + catalog_id: 1, + catalog_type: 1, + price: 15000, + item_type: 11, + item_id: 123, + param: 1, + }, + { + catalog_id: 1, + catalog_type: 1, + price: 8000, + item_type: 0, + item_id: 786, + param: 8, + }, + { + catalog_id: 1, + catalog_type: 1, + price: 8000, + item_type: 0, + item_id: 787, + param: 8, + }, + { + catalog_id: 1, + catalog_type: 1, + price: 8000, + item_type: 0, + item_id: 788, + param: 8, + }, + { + catalog_id: 1, + catalog_type: 1, + price: 4000, + item_type: 0, + item_id: 789, + param: 8, + }, + { + catalog_id: 1, + catalog_type: 1, + price: 4000, + item_type: 0, + item_id: 790, + param: 8, + }, + { + catalog_id: 1, + catalog_type: 1, + price: 8000, + item_type: 0, + item_id: 610, + param: 8, + }, + { + catalog_id: 1, + catalog_type: 1, + price: 8000, + item_type: 0, + item_id: 1902, + param: 23, + }, + { + catalog_id: 1, + catalog_type: 1, + price: 8000, + item_type: 0, + item_id: 381, + param: 8, + }, + { + catalog_id: 1, + catalog_type: 1, + price: 8000, + item_type: 0, + item_id: 633, + param: 8, + }, + { + catalog_id: 1, + catalog_type: 1, + price: 4000, + item_type: 0, + item_id: 332, + param: 8, + }, + { + catalog_id: 1, + catalog_type: 1, + price: 4000, + item_type: 0, + item_id: 711, + param: 8, + }, + { + catalog_id: 1, + catalog_type: 1, + price: 4000, + item_type: 0, + item_id: 871, + param: 8, + }, + { + catalog_id: 1, + catalog_type: 1, + price: 2000, + item_type: 0, + item_id: 872, + param: 8, + }, + { + catalog_id: 1, + catalog_type: 1, + price: 2000, + item_type: 0, + item_id: 64, + param: 8, + }, + { + catalog_id: 1, + catalog_type: 1, + price: 2000, + item_type: 0, + item_id: 88, + param: 8, + } + ] } // 'debug': { // details: { @@ -906,7 +1183,12 @@ export const VALGENE = { { valgene_name: "ヴァルキリージェネレーター 第10弾", valgene_name_english: "Valkyrie Generator Vol. 10", - valgene_id: 9 + valgene_id: 10 + }, + { + valgene_name: "ヴァルキリージェネレーター 第11弾", + valgene_name_english: "Valkyrie Generator Vol. 11", + valgene_id: 11 } ], rarity: { @@ -1142,23 +1424,44 @@ export const VALGENE = { volume: 10, items: [ { - type: 17, // chat stamp + type: 17, item_ids: [120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150] }, { - type: 18, // submonitor bg + type: 18, item_ids: [224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237] }, { - type: 19, // bgm + type: 19, item_ids: [48, 49, 50, 51] }, { - type: 20, // nemsys + type: 20, item_ids: [33, 34] } ] }, + { + volume: 11, + items: [ + { + type: 17, + item_ids: [163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193] + }, + { + type: 18, + item_ids: [273, 274, 275, 276, 277, 278, 279, 280] + }, + { + type: 19, + item_ids: [52, 53, 54, 55, 56, 57, 58, 59] + }, + { + type: 20, + item_ids: [35, 36, 37, 38, 39, 40, 41, 42] + } + ] + } ] } @@ -1180,6 +1483,15 @@ export const PREGENE = [ 'subbg': [200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223] }, probability: [0.01, 0.39, 0.6] + }, + { + id: 3, + items: { + 'crew': [136, 137, 138], + 'stamp': [151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162], + 'subbg': [238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272] + }, + probability: [0.01, 0.39, 0.6] } ] diff --git a/sdvx@asphyxia/handlers/common.ts b/sdvx@asphyxia/handlers/common.ts index 37f0b01..04de19b 100644 --- a/sdvx@asphyxia/handlers/common.ts +++ b/sdvx@asphyxia/handlers/common.ts @@ -97,10 +97,12 @@ export const common: EPR = async (info, data, send) => { EVENT_SONGS = EVENT_SONGS.concat(EVENT_SONGS6[Object.keys(EVENT_SONGS6)[keyIter]]) } - let mdb = JSON.parse(music_db); + let mdb = JSON.parse(music_db.toString()); let limitedNo = 2; - for (let i = 0; i < songNum; i++) { + songNum = parseInt(mdb.mdb.music[mdb.mdb.music.length - 1]['@id']) + console.log("Latest song id in mdb: " + songNum) + for (let i = 0; i <= songNum; i++) { var foundSongIndex = mdb.mdb.music.map(function(x) {return x['@id']; }).indexOf(i.toString()); if(foundSongIndex != -1) { var songData = mdb.mdb.music[foundSongIndex]; @@ -192,24 +194,27 @@ export const common: EPR = async (info, data, send) => { } } - if(IO.Exists('handlers/test.json')) { - let testExtend = JSON.parse(await IO.ReadFile('handlers/test.json')) - if(testExtend.length > 0) { - testExtend.forEach(td => { - console.log("testExtend: " + JSON.stringify(td)) - extend.push({ - id: td['id'], - type: td['type'], - params: td['params'] - }); - }) - } - } + // if(IO.Exists('handlers/test.json')) { + // let bufExtend = await IO.ReadFile('handlers/test.json') + // let testExtend = JSON.parse(bufExtend.toString()) + // if(testExtend.length > 0) { + // testExtend.forEach(td => { + // console.log("testExtend: " + JSON.stringify(td)) + // extend.push({ + // id: td['id'], + // type: td['type'], + // params: td['params'] + // }); + // }) + // } + // } if(IO.Exists('webui/asset/config/events.json')) { const itemTypeList = {"track": 'e', "appeal": 'a', "crew": 'c', "pcb": 'b'} - let eventData = JSON.parse(await IO.ReadFile('webui/asset/json/events.json')) - let eventConfig = JSON.parse(await IO.ReadFile('webui/asset/config/events.json')) + let bufEventData = await IO.ReadFile('webui/asset/json/events.json') + let bufEventConfig = await IO.ReadFile('webui/asset/config/events.json') + let eventData = JSON.parse(bufEventData.toString()) + let eventConfig = JSON.parse(bufEventConfig.toString()) for(const eventIter in eventData['events']) { if(eventData['events'][eventIter]['type'] === 'stamp' && eventConfig[eventData['events'][eventIter]['id']]['toggle']) { let stmpEvntInfo = STAMP_EVENTS6[eventData['events'][eventIter]['id']] @@ -251,7 +256,7 @@ export const common: EPR = async (info, data, send) => { 'id': stmpEvntInfo['info']['id'], 'params': [ 9, - 0, + stmpEvntInfo['info']['num'], 0, 0, 0, diff --git a/sdvx@asphyxia/handlers/features.ts b/sdvx@asphyxia/handlers/features.ts index 50126d9..a57c7d4 100644 --- a/sdvx@asphyxia/handlers/features.ts +++ b/sdvx@asphyxia/handlers/features.ts @@ -1,182 +1,182 @@ -import { Profile } from '../models/profile'; -import { MusicRecord } from '../models/music_record'; -import { getVersion, IDToCode, GetCounter } from '../utils'; -import { Mix } from '../models/mix'; - -export const hiscore: EPR = async (info, data, send) => { - const records = await DB.Find(null, { collection: 'music' }); - - const version = getVersion(info); - - const profiles = _.groupBy( - await DB.Find(null, { collection: 'profile' }), - '__refid' - ); - - if (version === 1) { - return send.object({ - hiscore: K.ATTR({ type: "1" }, { - music: _.map( - _.groupBy(records, r => { - return `${r.mid}:${r.type}`; - }), - r => _.maxBy(r, 'score') - ).map(r => (K.ATTR({ id: String(r.mid) }, { - note: (() => { - const notes = []; - - for (let i = 1; i <= 3; i++) { - if (r.type !== i) continue; - notes.push(K.ATTR({ type: String(r.type) }, { - name: K.ITEM('str', profiles[r.__refid][0].name), - score: K.ITEM('u32', r.score) - })) - } - - return notes; - })() - }))), - }) - }) - } - - return send.object({ - sc: { - d: _.map( - _.groupBy(records, r => { - return `${r.mid}:${r.type}`; - }), - r => _.maxBy(r, 'score') - ).map(r => ({ - id: K.ITEM('u32', r.mid), - ty: K.ITEM('u32', r.type), - a_sq: K.ITEM('str', IDToCode(profiles[r.__refid][0].id)), - a_nm: K.ITEM('str', profiles[r.__refid][0].name), - a_sc: K.ITEM('u32', r.score), - l_sq: K.ITEM('str', IDToCode(profiles[r.__refid][0].id)), - l_nm: K.ITEM('str', profiles[r.__refid][0].name), - l_sc: K.ITEM('u32', r.score), - })), - }, - }); -}; - -export const rival: EPR = async (info, data, send) => { - const refid = $(data).str('refid'); - const version = parseInt(info.model.split(":")[4]); - if (!refid) return send.deny(); - - const rivals = ( - await DB.Find(null, { collection: 'profile' }) - ).filter(p => p.__refid != refid); - - return send.object({ - rival: await Promise.all( - rivals.map(async (p, index) => { - return { - no: K.ITEM('s16', index), - seq: K.ITEM('str', IDToCode(p.id)), - name: K.ITEM('str', p.name), - music: ( - await DB.Find(p.__refid, { collection: 'music' }) - ).map(r => ({ - // Changes were somehow made in the order of the field for the version 2023042500 - param: K.ARRAY('u32', version < 2023042500 ? [r.mid, r.type, r.score, r.clear, r.grade] : [r.mid, r.type, r.score, r.grade, r.clear]), - })), - }; - }) - ), - }); -}; - -export const saveMix: EPR = async (info, data, send) => { - const refid = $(data).str('ref_id'); - if (!refid) return send.deny(); - - const profile = await DB.FindOne(refid, { collection: 'profile' }); - if (!profile) return send.deny(); - - const mix = $(data).element('automation'); - - const id = await GetCounter('mix'); - let code = _.padStart(_.random(0, 999999999999).toString(), 12, '0'); - while (await DB.FindOne({ collection: 'mix', code })) { - code = _.padStart(_.random(0, 999999999999).toString(), 12, '0'); - } - - const doc = await DB.Insert({ - collection: 'mix', - id, - code, - name: mix.str('mix_name'), - creator: profile.name, - param: mix.str('generate_param'), - tag: mix.number('tag_bit'), - jacket: mix.number('jacket_id'), - }); - - return send.object({ - automation: { - mix_id: K.ITEM('s32', id), - mix_code: K.ITEM('str', doc.code), - seq: K.ITEM('str', doc.code), - mix_name: K.ITEM('str', doc.name), - player_name: K.ITEM('str', doc.creator), - generate_param: K.ITEM('str', doc.param), - distribution_date: K.ITEM('u32', 19990101), - jacket_id: K.ITEM('s32', doc.jacket), - tag_bit: K.ITEM('s32', doc.tag), - like_flg: K.ITEM('bool', 0), - }, - }); -}; - -export const loadMix: EPR = async (info, data, send) => { - const code = $(data).str('mix_code'); - - const mix = await DB.FindOne({ collection: 'mix', code }); - if (!mix) { - return send.object({ result: K.ITEM('s32', 1) }); - } - - return send.object({ - automation: { - mix_id: K.ITEM('s32', mix.id), - mix_code: K.ITEM('str', mix.code), - seq: K.ITEM('str', mix.code), - mix_name: K.ITEM('str', mix.name), - player_name: K.ITEM('str', mix.creator), - generate_param: K.ITEM('str', mix.param), - distribution_date: K.ITEM('u32', 19990101), - jacket_id: K.ITEM('s32', mix.jacket), - tag_bit: K.ITEM('s32', mix.tag), - like_flg: K.ITEM('bool', 0), - }, - }); -}; - -export const globalMatch: EPR = async (info, data, send) => { - // console.log("Current MID: "+$(data).number('mid')); - // console.log("Port: "+$(data).number('port')); - // console.log("Global IP: "+$(data).numbers('gip')); - // console.log("Private IP: "+$(data).numbers('lip')); - - // var mid = $(data).number('mid'); - // var port = $(data).number('port'); - // var gip = $(data).str('gip'); - // var lip = $(data).str('lip'); - // var testArray = [{ - // port: port, - // gip:gip, - // lip:lip, - // }]; - // return send.object({ - // entry_id: K.ITEM('str', '123456789'), - // entry: testArray.map(a=>{ - // port: K.ITEM('u16',a.port); - // gip: K.ITEM('ip4',a.gip); - // lip: K.ITEM('ip4',a.lip); - // }) - // }); - send.success(); -} \ No newline at end of file +import { Profile } from '../models/profile'; +import { MusicRecord } from '../models/music_record'; +import { getVersion, IDToCode, GetCounter } from '../utils'; +import { Mix } from '../models/mix'; + +export const hiscore: EPR = async (info, data, send) => { + const records = await DB.Find(null, { collection: 'music' }); + + const version = getVersion(info); + + const profiles = _.groupBy( + await DB.Find(null, { collection: 'profile' }), + '__refid' + ); + + if (version === 1) { + return send.object({ + hiscore: K.ATTR({ type: "1" }, { + music: _.map( + _.groupBy(records, r => { + return `${r.mid}:${r.type}`; + }), + r => _.maxBy(r, 'score') + ).map(r => (K.ATTR({ id: String(r.mid) }, { + note: (() => { + const notes = []; + + for (let i = 1; i <= 3; i++) { + if (r.type !== i) continue; + notes.push(K.ATTR({ type: String(r.type) }, { + name: K.ITEM('str', profiles[r.__refid][0].name), + score: K.ITEM('u32', r.score) + })) + } + + return notes; + })() + }))), + }) + }) + } + + return send.object({ + sc: { + d: _.map( + _.groupBy(records, r => { + return `${r.mid}:${r.type}`; + }), + r => _.maxBy(r, 'score') + ).map(r => ({ + id: K.ITEM('u32', r.mid), + ty: K.ITEM('u32', r.type), + a_sq: K.ITEM('str', IDToCode(profiles[r.__refid][0].id)), + a_nm: K.ITEM('str', profiles[r.__refid][0].name), + a_sc: K.ITEM('u32', r.score), + l_sq: K.ITEM('str', IDToCode(profiles[r.__refid][0].id)), + l_nm: K.ITEM('str', profiles[r.__refid][0].name), + l_sc: K.ITEM('u32', r.score), + })), + }, + }); +}; + +export const rival: EPR = async (info, data, send) => { + const refid = $(data).str('refid'); + const version = parseInt(info.model.split(":")[4]); + if (!refid) return send.deny(); + + const rivals = ( + await DB.Find(null, { collection: 'profile' }) + ).filter(p => p.__refid != refid); + + return send.object({ + rival: await Promise.all( + rivals.map(async (p, index) => { + return { + no: K.ITEM('s16', index), + seq: K.ITEM('str', IDToCode(p.id)), + name: K.ITEM('str', p.name), + music: ( + await DB.Find(p.__refid, { collection: 'music' }) + ).map(r => ({ + // Changes were somehow made in the order of the field for the version 2023042500 + param: K.ARRAY('u32', version < 2023042500 ? [r.mid, r.type, r.score, r.clear, r.grade] : [r.mid, r.type, r.score, r.exscore, r.clear, r.grade]), + })), + }; + }) + ), + }); +}; + +export const saveMix: EPR = async (info, data, send) => { + const refid = $(data).str('ref_id'); + if (!refid) return send.deny(); + + const profile = await DB.FindOne(refid, { collection: 'profile' }); + if (!profile) return send.deny(); + + const mix = $(data).element('automation'); + + const id = await GetCounter('mix'); + let code = _.padStart(_.random(0, 999999999999).toString(), 12, '0'); + while (await DB.FindOne({ collection: 'mix', code })) { + code = _.padStart(_.random(0, 999999999999).toString(), 12, '0'); + } + + const doc = await DB.Insert({ + collection: 'mix', + id, + code, + name: mix.str('mix_name'), + creator: profile.name, + param: mix.str('generate_param'), + tag: mix.number('tag_bit'), + jacket: mix.number('jacket_id'), + }); + + return send.object({ + automation: { + mix_id: K.ITEM('s32', id), + mix_code: K.ITEM('str', doc.code), + seq: K.ITEM('str', doc.code), + mix_name: K.ITEM('str', doc.name), + player_name: K.ITEM('str', doc.creator), + generate_param: K.ITEM('str', doc.param), + distribution_date: K.ITEM('u32', 19990101), + jacket_id: K.ITEM('s32', doc.jacket), + tag_bit: K.ITEM('s32', doc.tag), + like_flg: K.ITEM('bool', 0), + }, + }); +}; + +export const loadMix: EPR = async (info, data, send) => { + const code = $(data).str('mix_code'); + + const mix = await DB.FindOne({ collection: 'mix', code }); + if (!mix) { + return send.object({ result: K.ITEM('s32', 1) }); + } + + return send.object({ + automation: { + mix_id: K.ITEM('s32', mix.id), + mix_code: K.ITEM('str', mix.code), + seq: K.ITEM('str', mix.code), + mix_name: K.ITEM('str', mix.name), + player_name: K.ITEM('str', mix.creator), + generate_param: K.ITEM('str', mix.param), + distribution_date: K.ITEM('u32', 19990101), + jacket_id: K.ITEM('s32', mix.jacket), + tag_bit: K.ITEM('s32', mix.tag), + like_flg: K.ITEM('bool', 0), + }, + }); +}; + +export const globalMatch: EPR = async (info, data, send) => { + // console.log("Current MID: "+$(data).number('mid')); + // console.log("Port: "+$(data).number('port')); + // console.log("Global IP: "+$(data).numbers('gip')); + // console.log("Private IP: "+$(data).numbers('lip')); + + // var mid = $(data).number('mid'); + // var port = $(data).number('port'); + // var gip = $(data).str('gip'); + // var lip = $(data).str('lip'); + // var testArray = [{ + // port: port, + // gip:gip, + // lip:lip, + // }]; + // return send.object({ + // entry_id: K.ITEM('str', '123456789'), + // entry: testArray.map(a=>{ + // port: K.ITEM('u16',a.port); + // gip: K.ITEM('ip4',a.gip); + // lip: K.ITEM('ip4',a.lip); + // }) + // }); + send.success(); +} diff --git a/sdvx@asphyxia/handlers/profiles.ts b/sdvx@asphyxia/handlers/profiles.ts index 48b42b9..0a4dd45 100644 --- a/sdvx@asphyxia/handlers/profiles.ts +++ b/sdvx@asphyxia/handlers/profiles.ts @@ -644,8 +644,10 @@ export const load: EPR = async (info, data, send) => { let presents = [] if(version === 6) { if(IO.Exists('webui/asset/config/events.json')) { - let eventData = JSON.parse(await IO.ReadFile('webui/asset/json/events.json')) - let eventConfig = JSON.parse(await IO.ReadFile('webui/asset/config/events.json')) + let bufEventData = await IO.ReadFile('webui/asset/json/events.json') + let bufEventConfig = await IO.ReadFile('webui/asset/config/events.json') + let eventData = JSON.parse(bufEventData.toString()) + let eventConfig = JSON.parse(bufEventConfig.toString()) for(const eventIter in eventData['events']) { if(eventData['events'][eventIter]['type'] === 'gift') { if(typeof eventConfig[eventData['events'][eventIter]['id']]['toggle'] === "boolean") { diff --git a/sdvx@asphyxia/webui/asset/js/events.js b/sdvx@asphyxia/webui/asset/js/events.js index 2d8af8a..141ca0c 100644 --- a/sdvx@asphyxia/webui/asset/js/events.js +++ b/sdvx@asphyxia/webui/asset/js/events.js @@ -1,130 +1,130 @@ -function generateEventToggles(eventInfo, eventConfig, eventEnabled) { - let cardContent = $('
') - if(typeof eventInfo['info'] === 'string') { - cardContent.append( - $('
').append( - $('
') - ).append( - $('

' + eventInfo['info'] + '

') - ) - ) - } else { - for(const infoIter in eventInfo['info']) { - cardContent.append( - $('
').append( - $('
') - ).append( - $('

' + eventInfo['info'][infoIter] + '

') - ) - ) - } - } - return cardContent -} - -async function generateNewEventsConfigFile(eventData) { - let eventConfig = {} - for(const eventIter in eventData['events']) { - eventConfig[eventData['events'][eventIter]['id']] = await insertNewEventConfig(eventData, eventIter, eventData['events'][eventIter]['id']) - } - return eventConfig -} - -async function insertNewEventConfig(eventData, eventIter, eventID) { - let toggle = false - if(typeof eventData['events'][eventIter]['info'] !== 'string') { - toggle = {} - for(const toggleIter in eventData['events'][eventIter]['info']) { - toggle[eventData['events'][eventIter]['id'] + '_' + (parseInt(toggleIter) + 1)] = false - } - } - return { - 'toggle': toggle - } -} - -async function readEventsConfigFile(eventData) { - try { - return await $.getJSON("static/asset/config/events.json", function(data) { - return data - }) - } catch { - return await generateNewEventsConfigFile(eventData) - } -} - -async function readEventsJsonFile() { - return await $.getJSON("static/asset/json/events.json", function(data) { - return data - }) -} - -$(document).ready(async function() { - let eventData = await readEventsJsonFile() - let eventConfig = await readEventsConfigFile(eventData) - for(const eventIter in eventData['events']) { - if(eventConfig[eventData['events'][eventIter]['id']] === undefined) { - eventConfig[eventData['events'][eventIter]['id']] = await insertNewEventConfig(eventData, eventIter, eventData['events'][eventIter]['id']) - } - - if(eventData['events'][eventIter]['enabled']) { - if(eventData['events'][eventIter]['type'] === 'stamp') { - $('#stampevent_select').append( - '' - ) - } else if(eventData['events'][eventIter]['type'] === 'gift') { - $('#giftevent_select').append( - '' - ) - } else if(eventData['events'][eventIter]['type'] === 'cross_online') { - $('#crossevent_select').append( - '' - ) - } - } - } - - $('#event-submit').on('click', async function() { - $.each($('span.check'), function(index, value) { - for(const eventIter in eventData['events']) { - let toggle = true - if($(value).css('background-color').includes("54, 54, 54")) { - toggle = false - } - - if(eventData['events'][eventIter]['id'] === $(value).parent().children('input').attr('name')) { - eventConfig[eventData['events'][eventIter]['id']]['toggle'] = toggle - } else if ($(value).parent().children('input').attr('name').includes(eventData['events'][eventIter]['id'])) { - eventConfig[eventData['events'][eventIter]['id']]['toggle'][[$(value).parent().children('input').attr('name')]] = toggle - } - } - }) - - await emit("manageEvents", {eventConfig: eventConfig}).then( - function(response) { - alert('Saved.') - }, - function(error) { - console.log(error) - } - ) - }) - - $('select').change(async function(event) { - let selectClass = '#' + $(this).attr('id') - let listClasses = {'#stampevent_select': 'stamp', '#giftevent_select': 'gift', '#crossevent_select': 'cross'} - $('.' + listClasses[selectClass] + '.list').empty() - for(const eventIter in eventData['events']) { - if(eventData['events'][eventIter]['id'] === $(selectClass).val()) { - $('.' + listClasses[selectClass] + '.list').append( - generateEventToggles(eventData['events'][eventIter], eventConfig[eventData['events'][eventIter]['id']], eventData['events'][eventIter]['enabled']) - ) - $('div.main').append( - $('
') - ) - } - } - }) - - -}) +function generateEventToggles(eventInfo, eventConfig, eventEnabled) { + let cardContent = $('
') + if(typeof eventInfo['info'] === 'string') { + cardContent.append( + $('
').append( + $('
') + ).append( + $('

' + eventInfo['info'] + '

') + ) + ) + } else { + for(const infoIter in eventInfo['info']) { + cardContent.append( + $('
').append( + $('
') + ).append( + $('

' + eventInfo['info'][infoIter] + '

') + ) + ) + } + } + return cardContent +} + +async function generateNewEventsConfigFile(eventData) { + let eventConfig = {} + for(const eventIter in eventData['events']) { + eventConfig[eventData['events'][eventIter]['id']] = await insertNewEventConfig(eventData, eventIter, eventData['events'][eventIter]['id']) + } + return eventConfig +} + +async function insertNewEventConfig(eventData, eventIter, eventID) { + let toggle = false + if(typeof eventData['events'][eventIter]['info'] !== 'string') { + toggle = {} + for(const toggleIter in eventData['events'][eventIter]['info']) { + toggle[eventData['events'][eventIter]['id'] + '_' + (parseInt(toggleIter) + 1)] = false + } + } + return { + 'toggle': toggle + } +} + +async function readEventsConfigFile(eventData) { + try { + return await $.getJSON("static/asset/config/events.json", function(data) { + return data + }) + } catch { + return await generateNewEventsConfigFile(eventData) + } +} + +async function readEventsJsonFile() { + return await $.getJSON("static/asset/json/events.json", function(data) { + return data + }) +} + +$(document).ready(async function() { + let eventData = await readEventsJsonFile() + let eventConfig = await readEventsConfigFile(eventData) + for(const eventIter in eventData['events']) { + if(eventConfig[eventData['events'][eventIter]['id']] === undefined) { + eventConfig[eventData['events'][eventIter]['id']] = await insertNewEventConfig(eventData, eventIter, eventData['events'][eventIter]['id']) + } + + if(eventData['events'][eventIter]['enabled']) { + if(eventData['events'][eventIter]['type'] === 'stamp') { + $('#stampevent_select').append( + '' + ) + } else if(eventData['events'][eventIter]['type'] === 'gift') { + $('#giftevent_select').append( + '' + ) + } else if(eventData['events'][eventIter]['type'] === 'cross_online') { + $('#crossevent_select').append( + '' + ) + } + } + } + + $('#event-submit').on('click', async function() { + $.each($('span.check'), function(index, value) { + for(const eventIter in eventData['events']) { + let toggle = true + if($(value).css('background-color').includes("54, 54, 54")) { + toggle = false + } + + if(eventData['events'][eventIter]['id'] === $(value).parent().children('input').attr('name')) { + eventConfig[eventData['events'][eventIter]['id']]['toggle'] = toggle + } else if ($(value).parent().children('input').attr('name').includes(eventData['events'][eventIter]['id'] + "_")) { + eventConfig[eventData['events'][eventIter]['id']]['toggle'][[$(value).parent().children('input').attr('name')]] = toggle + } + } + }) + + await emit("manageEvents", {eventConfig: eventConfig}).then( + function(response) { + alert('Saved.') + }, + function(error) { + console.log(error) + } + ) + }) + + $('select').change(async function(event) { + let selectClass = '#' + $(this).attr('id') + let listClasses = {'#stampevent_select': 'stamp', '#giftevent_select': 'gift', '#crossevent_select': 'cross'} + $('.' + listClasses[selectClass] + '.list').empty() + for(const eventIter in eventData['events']) { + if(eventData['events'][eventIter]['id'] === $(selectClass).val()) { + $('.' + listClasses[selectClass] + '.list').append( + generateEventToggles(eventData['events'][eventIter], eventConfig[eventData['events'][eventIter]['id']], eventData['events'][eventIter]['enabled']) + ) + $('div.main').append( + $('
') + ) + } + } + }) + + +}) diff --git a/sdvx@asphyxia/webui/asset/js/generator.js b/sdvx@asphyxia/webui/asset/js/generator.js index f5325be..e1264c7 100644 --- a/sdvx@asphyxia/webui/asset/js/generator.js +++ b/sdvx@asphyxia/webui/asset/js/generator.js @@ -75,31 +75,51 @@ async function loadItems(itemSet, gene_edition, items_crew, items_stamp, items_s if('crew' in geneItems.items) { $('.item_banners').append('

Nemsys Crew

') $('.item_banners').append('

') - loadImages(geneItems.items['crew'].sort(function(a, b){return parseInt(a.id) - parseInt(b.id)}), 'crew', items_crew) + loadImages(geneItems.items['crew'].sort(function(a, b) { + if(a.id < b.id) { return -1; } + if(a.id > b.id) { return 1; } + return 0; + }), 'crew', items_crew) } if('stamp' in geneItems.items) { $('.item_banners').append('

Appeal Stamp

') $('.item_banners').append('

') - loadImages(geneItems.items['stamp'].sort(function(a, b){return parseInt(a.id) - parseInt(b.id)}), 'stamp', items_stamp) + loadImages(geneItems.items['stamp'].sort(function(a, b) { + if(a.id < b.id) { return -1; } + if(a.id > b.id) { return 1; } + return 0; + }), 'stamp', items_stamp) } if('subbg' in geneItems.items) { $('.item_banners').append('

Submonitor BG

') $('.item_banners').append('

') - loadImages(geneItems.items['subbg'].sort(function(a, b){return parseInt(a.id) - parseInt(b.id)}), 'bg', items_subbg) + loadImages(geneItems.items['subbg'].sort(function(a, b) { + if(a.id < b.id) { return -1; } + if(a.id > b.id) { return 1; } + return 0; + }), 'bg', items_subbg) } if('bgm' in geneItems.items) { $('.item_banners').append('

BGM

') $('.item_banners').append('

') - loadImages(geneItems.items['bgm'].sort(function(a, b){return parseInt(a.id) - parseInt(b.id)}), 'bgm', items_bgm) + loadImages(geneItems.items['bgm'].sort(function(a, b) { + if(a.id < b.id) { return -1; } + if(a.id > b.id) { return 1; } + return 0; + }), 'bgm', items_bgm) } if('nemsys' in geneItems.items) { $('.item_banners').append('

Nemsys

') $('.item_banners').append('

') - loadImages(geneItems.items['nemsys'].sort(function(a, b){return parseInt(a.id) - parseInt(b.id)}), 'nemsys', items_nemsys) + loadImages(geneItems.items['nemsys'].sort(function(a, b) { + if(a.id < b.id) { return -1; } + if(a.id > b.id) { return 1; } + return 0; + }), 'nemsys', items_nemsys) } } diff --git a/sdvx@asphyxia/webui/asset/js/preview.js b/sdvx@asphyxia/webui/asset/js/preview.js index e5bcd51..b6cf8da 100644 --- a/sdvx@asphyxia/webui/asset/js/preview.js +++ b/sdvx@asphyxia/webui/asset/js/preview.js @@ -10,13 +10,13 @@ function getImageFileFormat(assetType, id) { } function checkPregeneSubbg(subbg) { - pregeneSlideshows = [ - // pregene aqua - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, - // pregene 1 - 214, 215, 216, 217, 218, 219, 220, 221, 222, 223 - ] - return pregeneSlideshows.includes(parseInt(subbg)) + let stat = $.ajax({ + url:'static/asset/submonitor_bg/subbg_' + zeroPad(subbg, 4) + getImageFileFormat(0, parseInt(zeroPad(subbg, 4))), + type:'HEAD', + async: false + }).status; + if(stat === 200) return false + else return true } ; @@ -45,8 +45,9 @@ $('#nemsys_select').change(function() { $('#nemsys_pre').fadeIn(200); }); -$('[name="subbg"]').change(function() { - $('#sub_pre').fadeOut(200, () => { $('#sub_pre').attr("src", checkPregeneSubbg($('[name="subbg"]').val()) ? "static/asset/submonitor_bg/subbg_" + zeroPad($('[name="subbg"]').val(), 4) + "_0" + (Math.floor(Math.random() * 3) + 1) + getImageFileFormat(0, parseInt(zeroPad($('[name="subbg"]').val(), 4))) : "static/asset/submonitor_bg/subbg_" + zeroPad($('[name="subbg"]').val(), 4) + getImageFileFormat(0, parseInt(zeroPad($('[name="subbg"]').val(), 4)) )); }); +$('[name="subbg"]').change(async function() { + let isSubbgSlideshow = checkPregeneSubbg($('[name="subbg"]').val()) + $('#sub_pre').fadeOut(200, () => { $('#sub_pre').attr("src", isSubbgSlideshow ? "static/asset/submonitor_bg/subbg_" + zeroPad($('[name="subbg"]').val(), 4) + "_0" + (Math.floor(Math.random() * 3) + 1) + getImageFileFormat(0, parseInt(zeroPad($('[name="subbg"]').val(), 4))) : "static/asset/submonitor_bg/subbg_" + zeroPad($('[name="subbg"]').val(), 4) + getImageFileFormat(0, parseInt(zeroPad($('[name="subbg"]').val(), 4)) )); }); $('#sub_pre').fadeIn(200); }); diff --git a/sdvx@asphyxia/webui/asset/json/events.json b/sdvx@asphyxia/webui/asset/json/events.json index 057d533..b6c41c1 100644 --- a/sdvx@asphyxia/webui/asset/json/events.json +++ b/sdvx@asphyxia/webui/asset/json/events.json @@ -1,102 +1,118 @@ -{ - "events": [ - { - "id": "xrecord", - "type": "cross_online", - "enabled": false, - "name": "X-record", - "info": [ - "1st set of songs from X-record; originally unlocked by playing either SOUND VOLTEX on the Valkyrie model, or beatmaniaIIDX on the Lightning model.
Enable this option to have them automatically unlocked and saved to your account.", - "2nd set of songs from X-record; originally unlocked by playing either SOUND VOLTEX on the Valkyrie model, or beatmaniaIIDX on the Lightning model.
Enable this option to have them automatically unlocked and saved to your account." - ] - }, - { - "id": "konasute", - "type": "gift", - "enabled": true, - "name": "グレイスからの挑戦状!! (GRACE kara no chousenjou!!)", - "info": [ - "Enables unlock for the song 'ドゥサンコオデッセイ!!' by cosMo@暴走P upon logging in.
This song is originally unlocked by having played it first on the コナステ (Konasute) version of Sound Voltex.", - "Enables unlock for the song 'αzalea' by BlackY upon logging in.
This song is originally unlocked by having played it first on the コナステ (Konasute) version of Sound Voltex.", - "Enables unlock for the song 'BAYONEX' by かめりあ as \"Revenge of Riot\" upon logging in.
This song is originally unlocked by having played it first on the コナステ (Konasute) version of Sound Voltex.", - "Enables unlock for the song 'Reverenced Flower' by ぺのれり upon logging in.
This song is originally unlocked by having played it first on the コナステ (Konasute) version of Sound Voltex.", - "Enables unlock for the song '《Re:miniscence》' by かねこちはる upon logging in.
This song is originally unlocked by having played it first on the コナステ (Konasute) version of Sound Voltex." - ] - }, - { - "id": "bpl2021", - "type": "cross_online", - "enabled": false, - "name": "BPL応援 楽曲解禁スタンプラリー (BPL ouen gakkyoku kaikin stamp rally)", - "info": "Songs in this event are originally unlocked by accessing the official BEMANI PRO LEAGUE 2021 website and obtaining the stamp by watching VODs of the BPL competition.
Enable this option to activate this event." - }, - { - "id": "bsb2021", - "type": "cross_online", - "enabled": false, - "name": "BEMANI 2021真夏の歌合戦5番勝負 (BEMANI 2021 manatsu no utagassen 5 ban shoubu)", - "info": "This is a cross-BEMANI event. Songs are originally unlocked by playing participating BEMANI games and earn 'Yell' points.
Enable this option to activate this event." - }, - { - "id": "sdvx10thstamp", - "type": "stamp", - "enabled": true, - "name": "SOUND VOLTEX 10th Anniversary", - "info": "Stamp event to unlock 7 songs.
Toggle this on to enable this stamp event." - }, - { - "id": "reflecstamp", - "type": "stamp", - "enabled": true, - "name": "REFLEC BEAT Song Stamp Event", - "info": "Stamp event to unlock 5 songs originally from the REFLEC BEAT game series.
Toggle this on to enable this stamp event." - }, - { - "id": "gmz2022", - "type": "cross_online", - "enabled": false, - "name": "いちかのごちゃまぜMix UP! (Ichika no gochamaze Mix UP! )", - "info": "This is a cross-BEMANI event. Songs include some that are shared from other BEMANI games and some that are mashup/remixes of the shared songs. These are originally unlocked by playing participating BEMANI games and earning points to fill different gauges.

Enable this option to activate this event." - }, - { - "id": "bpl2022", - "type": "gift", - "enabled": true, - "name": "BEMANI PRO LEAGUE -SEASON 2-! Original Song", - "info": [ - "Week 1 songs: 'Chat perché' and 'WINNING ROAD'
Enable this option to have these songs unlocked on the next login. Otherwise, the songs are still unlockable through BLASTER GATE.", - "Week 2 songs: 'ENDGAME' and 'ИADIR'
Enable this option to have these songs unlocked on the next login. Otherwise, the songs are still unlockable through BLASTER GATE.", - "Week 3 songs: 'Ice Fortress' and 'MURASAME'
Enable this option to have these songs unlocked on the next login. Otherwise, the songs are still unlockable through BLASTER GATE.", - "Week 4 songs: 'Initiating League' and 'Scat Jazz Dance'
Enable this option to have these songs unlocked on the next login. Otherwise, the songs are still unlockable through BLASTER GATE.", - "Week 5 songs: '最果ての勇者にラブソングを' and '灼ナル刃、破カヰ譜'
Enable this option to have these songs unlocked on the next login. Otherwise, the songs are still unlockable through BLASTER GATE.", - "Week 6 songs: 'Fl0ating:' and 'Petit espoir'
Enable this option to have these songs unlocked on the next login. Otherwise, the songs are still unlockable through BLASTER GATE.", - "Week 7 songs: 'Paradigm Shift' and 'イグノアザーズ'
Enable this option to have these songs unlocked on the next login. Otherwise, the songs are still unlockable through BLASTER GATE.", - "Week 8 songs: 'Thousand Triggers' and 'trea→journey'
Enable this option to have these songs unlocked on the next login. Otherwise, the songs are still unlockable through BLASTER GATE.", - "Week 9 songs: 'MILITARY R04D'
Enable this option to have this song unlocked on the next login. Otherwise, the songs are still unlockable through BLASTER GATE.", - "Week 10 songs: 'DEUX EX MĀXHINĀ'
Enable this option to have this song unlocked on the next login. Otherwise, the songs are still unlockable through BLASTER GATE.", - "Week 11 songs: 'All We Need is HAPPY END!!!'
Enable this option to have this song unlocked on the next login. Otherwise, the songs are still unlockable through BLASTER GATE." - ] - }, - { - "id": "pcbevent", - "type": "stamp", - "enabled": false, - "name": "PCBおかわりスタンプイベント | PCB Refill Stamp Event", - "info": "Stamp event to earn PCB. Once the stamp goal is complete, it will start over and you can earn more PCB.
Toggle this on to enable this stamp event." - }, - { - "id": "2023stamp", - "type": "stamp", - "enabled": true, - "name": "んだんだぺったん☆二〇二三 | New Year 2023 Stamp Event", - "info": "Stamp event to unlock the んだんだぺったん☆二〇二三 appeal card.
Toggle this on to enable this stamp event." - }, - { - "id": "himehina", - "type": "stamp", - "enabled": true, - "name": "HIMEHINAコラボイベント | HIMEHINA Collab Stamp Event", - "info": "Stamp event to unlock the HIMEHINA crew.
Toggle this on to enable this stamp event." - } - ] -} +{ + "events": [ + { + "id": "xrecord", + "type": "cross_online", + "enabled": false, + "name": "X-record", + "info": [ + "1st set of songs from X-record; originally unlocked by playing either SOUND VOLTEX on the Valkyrie model, or beatmaniaIIDX on the Lightning model.
Not implemented yet", + "2nd set of songs from X-record; originally unlocked by playing either SOUND VOLTEX on the Valkyrie model, or beatmaniaIIDX on the Lightning model.
Not implemented yet", + "2nd set of songs from X-record; originally unlocked by playing either SOUND VOLTEX on the Valkyrie model, or beatmaniaIIDX on the Lightning model.
Not implemented yet" + ] + }, + { + "id": "konasute", + "type": "gift", + "enabled": true, + "name": "グレイスからの挑戦状!! (GRACE kara no chousenjou!!)", + "info": [ + "Enables unlock for the song 'ドゥサンコオデッセイ!!' by cosMo@暴走P upon logging in.
This song is originally unlocked by having played it first on the コナステ (Konasute) version of Sound Voltex.", + "Enables unlock for the song 'αzalea' by BlackY upon logging in.
This song is originally unlocked by having played it first on the コナステ (Konasute) version of Sound Voltex.", + "Enables unlock for the song 'BAYONEX' by かめりあ as \"Revenge of Riot\" upon logging in.
This song is originally unlocked by having played it first on the コナステ (Konasute) version of Sound Voltex.", + "Enables unlock for the song 'Reverenced Flower' by ぺのれり upon logging in.
This song is originally unlocked by having played it first on the コナステ (Konasute) version of Sound Voltex.", + "Enables unlock for the song '《Re:miniscence》' by かねこちはる upon logging in.
This song is originally unlocked by having played it first on the コナステ (Konasute) version of Sound Voltex." + ] + }, + { + "id": "bpl2021", + "type": "cross_online", + "enabled": false, + "name": "BPL応援 楽曲解禁スタンプラリー (BPL ouen gakkyoku kaikin stamp rally)", + "info": "Songs in this event are originally unlocked by accessing the official BEMANI PRO LEAGUE 2021 website and obtaining the stamp by watching VODs of the BPL competition.
Enable this option to activate this event." + }, + { + "id": "bsb2021", + "type": "cross_online", + "enabled": false, + "name": "BEMANI 2021真夏の歌合戦5番勝負 (BEMANI 2021 manatsu no utagassen 5 ban shoubu)", + "info": "This is a cross-BEMANI event. Songs are originally unlocked by playing participating BEMANI games and earn 'Yell' points.
Enable this option to activate this event." + }, + { + "id": "sdvx10thstamp", + "type": "stamp", + "enabled": true, + "name": "SOUND VOLTEX 10th Anniversary", + "info": "Stamp event to unlock 7 songs in any order.
Toggle this on to enable this stamp event." + }, + { + "id": "reflecstamp", + "type": "stamp", + "enabled": true, + "name": "REFLEC BEAT Song Stamp Event", + "info": "Stamp event to unlock 5 songs originally from the REFLEC BEAT game series.
Toggle this on to enable this stamp event." + }, + { + "id": "gmz2022", + "type": "cross_online", + "enabled": false, + "name": "いちかのごちゃまぜMix UP! (Ichika no gochamaze Mix UP! )", + "info": "This is a cross-BEMANI event. Songs include some that are shared from other BEMANI games and some that are mashup/remixes of the shared songs. These are originally unlocked by playing participating BEMANI games and earning points to fill different gauges.

Enable this option to activate this event." + }, + { + "id": "bpl2022", + "type": "gift", + "enabled": true, + "name": "BEMANI PRO LEAGUE -SEASON 2-! Original Song", + "info": [ + "Toggle to have the songs from the 1st week unlocked on the next login.
Otherwise, the songs are still unlockable through BLASTER GATE.
Songs: 'Chat perché' and 'WINNING ROAD'", + "Toggle to have the songs from the 2nd week unlocked on the next login.
Otherwise, the songs are still unlockable through BLASTER GATE.
Songs: 'ENDGAME' and 'ИADIR'", + "Toggle to have the songs from the 3rd week unlocked on the next login.
Otherwise, the songs are still unlockable through BLASTER GATE.
Songs: 'Ice Fortress' and 'MURASAME'", + "Toggle to have the songs from the 4th week unlocked on the next login.
Otherwise, the songs are still unlockable through BLASTER GATE.
Songs: 'Initiating League' and 'Scat Jazz Dance'", + "Toggle to have the songs from the 5th week unlocked on the next login.
Otherwise, the songs are still unlockable through BLASTER GATE.
Songs: '最果ての勇者にラブソングを' and '灼ナル刃、破カヰ譜'", + "Toggle to have the songs from the 6th week unlocked on the next login.
Otherwise, the songs are still unlockable through BLASTER GATE.
Songs: 'Fl0ating:' and 'Petit espoir'", + "Toggle to have the songs from the 7th week unlocked on the next login.
Otherwise, the songs are still unlockable through BLASTER GATE.
Songs: 'Paradigm Shift' and 'イグノアザーズ'", + "Toggle to have the songs from the 8th week unlocked on the next login.
Otherwise, the songs are still unlockable through BLASTER GATE.
Songs: 'Thousand Triggers' and 'trea→journey'", + "Toggle to have the song from the 9th week unlocked on the next login.
Otherwise, the songs are still unlockable through BLASTER GATE.
Song: 'MILITARY R04D'", + "Toggle to have the song from the 10th week unlocked on the next login.
Otherwise, the songs are still unlockable through BLASTER GATE.
Song: 'DEUX EX MĀXHINĀ'", + "Toggle to have the song from the 11th week unlocked on the next login.
Otherwise, the songs are still unlockable through BLASTER GATE.
Song: 'All We Need is HAPPY END!!!'", + "Toggle to have the song from the 12th week unlocked on the next login.
Otherwise, the songs are still unlockable through BLASTER GATE.
Song: 'Glory of Fighters'" + ] + }, + { + "id": "pcbevent", + "type": "stamp", + "enabled": false, + "name": "PCBおかわりスタンプイベント | PCB Refill Stamp Event", + "info": "Stamp event to earn PCB. Once the stamp goal is complete, it will start over and you can earn more PCB.
Toggle this on to enable this stamp event." + }, + { + "id": "2023stamp", + "type": "stamp", + "enabled": true, + "name": "んだんだぺったん☆二〇二三 | New Year 2023 Stamp Event", + "info": "Stamp event to unlock the んだんだぺったん☆二〇二三 appeal card.
Toggle this on to enable this stamp event." + }, + { + "id": "himehina", + "type": "stamp", + "enabled": true, + "name": "HIMEHINAコラボイベント | HIMEHINA Collab Stamp Event", + "info": "Stamp event to unlock the HIMEHINA crew.
Toggle this on to enable this stamp event." + }, + { + "id": "11thanniv", + "type": "stamp", + "enabled": true, + "name": "ボルテ11周年★記念限定カード | SOUND VOLTEX 11th Anniversary Stamp Event", + "info": "Stamp event to unlock the ボルテ11周年★記念限定カード appeal card to commemorate 11 years of SOUND VOLTEX.
Toggle this on to enable this stamp event." + }, + { + "id": "bpl2022stamp", + "type": "stamp", + "enabled": false, + "name": "Commemorating BEMANI PRO LEAGUE -SEASON 2-! Original Song Contest Special Stamp Event", + "info": "Stamp event to unlock 9 songs, including SuddeИDeath. Songs can be unlocked in any order, except for SuddeИDeath, which will be available to unlock once all the other songs are unlocked.
Toggle this on to enable this stamp event." + } + ] +} diff --git a/sdvx@asphyxia/webui/asset/json/valgene_data.json b/sdvx@asphyxia/webui/asset/json/valgene_data.json index 6a68dae..208524e 100644 --- a/sdvx@asphyxia/webui/asset/json/valgene_data.json +++ b/sdvx@asphyxia/webui/asset/json/valgene_data.json @@ -17,6 +17,15 @@ "stamp": [110, 111, 112, 113, 114, 115, 116, 117, 118, 119], "subbg": [200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223] } + }, + { + "id": 3, + "name": "Premium Generator Vol. 2", + "items": { + "crew": [136, 137, 138], + "stamp": [151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162], + "subbg": [238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272] + } } ], "valgene":[ @@ -127,6 +136,16 @@ "bgm": [48, 49, 50, 51], "nemsys": [33, 34] } + }, + { + "id": 11, + "name": "Valkyrie Generator Vol. 11", + "items":{ + "stamp": [163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193], + "subbg": [273, 274, 275, 276, 277, 278, 279, 280], + "bgm": [52, 53, 54, 55, 56, 57, 58, 59], + "nemsys": [35, 36, 37, 38, 39, 40, 41, 42] + } } ] }