more 0425 stuff
This commit is contained in:
+31
-1
@@ -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
|
||||
|
||||
|
||||
+326
-14
@@ -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]
|
||||
}
|
||||
]
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
+182
-182
@@ -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<MusicRecord>(null, { collection: 'music' });
|
||||
|
||||
const version = getVersion(info);
|
||||
|
||||
const profiles = _.groupBy(
|
||||
await DB.Find<Profile>(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<Profile>(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<MusicRecord>(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<Profile>(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<Mix>({ collection: 'mix', code })) {
|
||||
code = _.padStart(_.random(0, 999999999999).toString(), 12, '0');
|
||||
}
|
||||
|
||||
const doc = await DB.Insert<Mix>({
|
||||
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<Mix>({ 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();
|
||||
}
|
||||
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<MusicRecord>(null, { collection: 'music' });
|
||||
|
||||
const version = getVersion(info);
|
||||
|
||||
const profiles = _.groupBy(
|
||||
await DB.Find<Profile>(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<Profile>(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<MusicRecord>(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<Profile>(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<Mix>({ collection: 'mix', code })) {
|
||||
code = _.padStart(_.random(0, 999999999999).toString(), 12, '0');
|
||||
}
|
||||
|
||||
const doc = await DB.Insert<Mix>({
|
||||
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<Mix>({ 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();
|
||||
}
|
||||
|
||||
@@ -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") {
|
||||
|
||||
@@ -1,130 +1,130 @@
|
||||
function generateEventToggles(eventInfo, eventConfig, eventEnabled) {
|
||||
let cardContent = $('<div class="card-content">')
|
||||
if(typeof eventInfo['info'] === 'string') {
|
||||
cardContent.append(
|
||||
$('<div class="field is-horizontal">').append(
|
||||
$('<div class="field-label is-normal"><label class="label" for="' + eventInfo['id'] + '">Enable</label></div>')
|
||||
).append(
|
||||
$('<div class="field-body"><div class="field"><div class="control"><label class="switch is-rounded"><input type="checkbox" ' + (eventConfig['toggle'] ? 'checked' : '') + ' name="' + eventInfo['id'] + '"><span class="check"></span></label></div><p class="help">' + eventInfo['info'] + '</p></div></div>')
|
||||
)
|
||||
)
|
||||
} else {
|
||||
for(const infoIter in eventInfo['info']) {
|
||||
cardContent.append(
|
||||
$('<div class="field is-horizontal">').append(
|
||||
$('<div class="field-label is-normal"><label class="label" for="' + eventInfo['id'] + '_' + (parseInt(infoIter) + 1).toString() + '">Enable Set ' + (parseInt(infoIter) + 1).toString() + '</label></div>')
|
||||
).append(
|
||||
$('<div class="field-body"><div class="field"><div class="control"><label class="switch is-rounded"><input type="checkbox" ' + (eventConfig['toggle'][eventInfo['id'] + '_' + (parseInt(infoIter) + 1).toString()] ? 'checked' : '') + ' name="' + eventInfo['id'] + '_' + (parseInt(infoIter) + 1).toString() + '"><span class="check"></span></label></div><p class="help">' + eventInfo['info'][infoIter] + '</p></div></div>')
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
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(
|
||||
'<option value=' + eventData['events'][eventIter]['id'] + '>' + eventData['events'][eventIter]['name'] + '</option>'
|
||||
)
|
||||
} else if(eventData['events'][eventIter]['type'] === 'gift') {
|
||||
$('#giftevent_select').append(
|
||||
'<option value=' + eventData['events'][eventIter]['id'] + '>' + eventData['events'][eventIter]['name'] + '</option>'
|
||||
)
|
||||
} else if(eventData['events'][eventIter]['type'] === 'cross_online') {
|
||||
$('#crossevent_select').append(
|
||||
'<option value=' + eventData['events'][eventIter]['id'] + '>' + eventData['events'][eventIter]['name'] + '</option>'
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$('#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(
|
||||
$('<div class="field is-grouped"><div class="control is-expanded"></div><div class="control"><button class="button is-link" id="event-submit">Apply</button></div></div>')
|
||||
)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
})
|
||||
function generateEventToggles(eventInfo, eventConfig, eventEnabled) {
|
||||
let cardContent = $('<div class="card-content">')
|
||||
if(typeof eventInfo['info'] === 'string') {
|
||||
cardContent.append(
|
||||
$('<div class="field is-horizontal">').append(
|
||||
$('<div class="field-label is-normal"><label class="label" for="' + eventInfo['id'] + '">Enable</label></div>')
|
||||
).append(
|
||||
$('<div class="field-body"><div class="field"><div class="control"><label class="switch is-rounded"><input type="checkbox" ' + (eventConfig['toggle'] ? 'checked' : '') + ' name="' + eventInfo['id'] + '"><span class="check"></span></label></div><p class="help">' + eventInfo['info'] + '</p></div></div>')
|
||||
)
|
||||
)
|
||||
} else {
|
||||
for(const infoIter in eventInfo['info']) {
|
||||
cardContent.append(
|
||||
$('<div class="field is-horizontal">').append(
|
||||
$('<div class="field-label is-normal"><label class="label" for="' + eventInfo['id'] + '_' + (parseInt(infoIter) + 1).toString() + '">Enable Set ' + (parseInt(infoIter) + 1).toString() + '</label></div>')
|
||||
).append(
|
||||
$('<div class="field-body"><div class="field"><div class="control"><label class="switch is-rounded"><input type="checkbox" ' + (eventConfig['toggle'][eventInfo['id'] + '_' + (parseInt(infoIter) + 1).toString()] ? 'checked' : '') + ' name="' + eventInfo['id'] + '_' + (parseInt(infoIter) + 1).toString() + '"><span class="check"></span></label></div><p class="help">' + eventInfo['info'][infoIter] + '</p></div></div>')
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
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(
|
||||
'<option value=' + eventData['events'][eventIter]['id'] + '>' + eventData['events'][eventIter]['name'] + '</option>'
|
||||
)
|
||||
} else if(eventData['events'][eventIter]['type'] === 'gift') {
|
||||
$('#giftevent_select').append(
|
||||
'<option value=' + eventData['events'][eventIter]['id'] + '>' + eventData['events'][eventIter]['name'] + '</option>'
|
||||
)
|
||||
} else if(eventData['events'][eventIter]['type'] === 'cross_online') {
|
||||
$('#crossevent_select').append(
|
||||
'<option value=' + eventData['events'][eventIter]['id'] + '>' + eventData['events'][eventIter]['name'] + '</option>'
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$('#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(
|
||||
$('<div class="field is-grouped"><div class="control is-expanded"></div><div class="control"><button class="button is-link" id="event-submit">Apply</button></div></div>')
|
||||
)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
})
|
||||
|
||||
@@ -75,31 +75,51 @@ async function loadItems(itemSet, gene_edition, items_crew, items_stamp, items_s
|
||||
if('crew' in geneItems.items) {
|
||||
$('.item_banners').append('<div style="padding: 5px"><h3>Nemsys Crew</h3></div>')
|
||||
$('.item_banners').append('<div class=crew-items style="text-align: center; background-color: #3a3a3a; padding: 20px; border-radius: 6px;"></div><br>')
|
||||
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('<div style="padding: 5px"><h3>Appeal Stamp</h3></div>')
|
||||
$('.item_banners').append('<div class=stamp-items style="text-align: center; background-color: #3a3a3a; padding: 20px; border-radius: 6px;"></div><br>')
|
||||
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('<div style="padding: 5px"><h3>Submonitor BG</h3></div>')
|
||||
$('.item_banners').append('<div class=bg-items style="text-align: center; background-color: #3a3a3a; padding: 20px; border-radius: 6px;"></div><br>')
|
||||
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('<div style="padding: 5px"><h3>BGM</h3></div>')
|
||||
$('.item_banners').append('<div class=bgm-items style="text-align: center; background-color: #3a3a3a; padding: 20px; border-radius: 6px;"></div><br>')
|
||||
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('<div style="padding: 5px"><h3>Nemsys</h3></div>')
|
||||
$('.item_banners').append('<div class=nemsys-items style="text-align: center; background-color: #3a3a3a; padding: 20px; border-radius: 6px;"></div><br>')
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
|
||||
@@ -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.<br>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.<br>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.<br>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.<br>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.<br>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.<br>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.<br>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.<br>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.<br>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.<br>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.<br>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.<br><br>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'<br>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'<br>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'<br>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'<br>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 '灼ナル刃、破カヰ譜'<br>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'<br>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 'イグノアザーズ'<br>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'<br>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'<br>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Ā'<br>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!!!'<br>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.<br>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.<br>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.<br>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.<br>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.<br>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.<br>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.<br>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.<br>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.<br>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.<br>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.<br>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.<br>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.<br>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.<br>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.<br>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.<br><br>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.<br>Otherwise, the songs are still unlockable through BLASTER GATE.<br>Songs: 'Chat perché' and 'WINNING ROAD'",
|
||||
"Toggle to have the songs from the 2nd week unlocked on the next login.<br>Otherwise, the songs are still unlockable through BLASTER GATE.<br>Songs: 'ENDGAME' and 'ИADIR'",
|
||||
"Toggle to have the songs from the 3rd week unlocked on the next login.<br>Otherwise, the songs are still unlockable through BLASTER GATE.<br>Songs: 'Ice Fortress' and 'MURASAME'",
|
||||
"Toggle to have the songs from the 4th week unlocked on the next login.<br>Otherwise, the songs are still unlockable through BLASTER GATE.<br>Songs: 'Initiating League' and 'Scat Jazz Dance'",
|
||||
"Toggle to have the songs from the 5th week unlocked on the next login.<br>Otherwise, the songs are still unlockable through BLASTER GATE.<br>Songs: '最果ての勇者にラブソングを' and '灼ナル刃、破カヰ譜'",
|
||||
"Toggle to have the songs from the 6th week unlocked on the next login.<br>Otherwise, the songs are still unlockable through BLASTER GATE.<br>Songs: 'Fl0ating:' and 'Petit espoir'",
|
||||
"Toggle to have the songs from the 7th week unlocked on the next login.<br>Otherwise, the songs are still unlockable through BLASTER GATE.<br>Songs: 'Paradigm Shift' and 'イグノアザーズ'",
|
||||
"Toggle to have the songs from the 8th week unlocked on the next login.<br>Otherwise, the songs are still unlockable through BLASTER GATE.<br>Songs: 'Thousand Triggers' and 'trea→journey'",
|
||||
"Toggle to have the song from the 9th week unlocked on the next login.<br>Otherwise, the songs are still unlockable through BLASTER GATE.<br>Song: 'MILITARY R04D'",
|
||||
"Toggle to have the song from the 10th week unlocked on the next login.<br>Otherwise, the songs are still unlockable through BLASTER GATE.<br>Song: 'DEUX EX MĀXHINĀ'",
|
||||
"Toggle to have the song from the 11th week unlocked on the next login.<br>Otherwise, the songs are still unlockable through BLASTER GATE.<br>Song: 'All We Need is HAPPY END!!!'",
|
||||
"Toggle to have the song from the 12th week unlocked on the next login.<br>Otherwise, the songs are still unlockable through BLASTER GATE.<br>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.<br>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.<br>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.<br>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.<br>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.<br>Toggle this on to enable this stamp event."
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user