240318
This commit is contained in:
+22
-13
@@ -1,8 +1,8 @@
|
||||
# SOUND VOLTEX
|
||||
|
||||
**Plugin Version:** fork-6.0.2.9
|
||||
**Plugin Version:** fork-6.0.3.0
|
||||
|
||||
**Supported game versions:** EXCEED GEAR (2024022000)
|
||||
**Supported game versions:** EXCEED GEAR (2024031801)
|
||||
|
||||
**Unsupported game versions:** Every other game, as they're untested.
|
||||
|
||||
@@ -16,6 +16,24 @@
|
||||
|
||||
Changelog
|
||||
===========
|
||||
## fork-6.0.3.0
|
||||
|
||||
### New:
|
||||
|
||||
1. Main:
|
||||
- Added Premium Generator Set 4 (BPL S3)
|
||||
- Updated events.json to add weeks 6 & 7 of BPL event songs
|
||||
2. Misc:
|
||||
- Fixed ARENA Season 12 rule from 1 (point system) to 2 (voting system)
|
||||
- Added ARENA-related startup flags to exg.ts (arena room id input, online/local match rule voting system, etc.)
|
||||
- Updated system backgrounds list in customize\_data\_ext.json (forgot to update it as it's manual, sorry...)
|
||||
- Added new APRIL\_RAINBOW\_LINE\_ACTIVE to startup flags toggle list. Don't know what it does currently.
|
||||
- Edit: Enables April Fools 2024 Effect: Rainbow lasers. Type V-RAN on search bar to enable.
|
||||
- Added lounge code (checks for active matches to toggle 'matching' indicator in lounge)
|
||||
- Fixes to profile customization WebUI js where 1: subbg selection doesn't match the one previewed, and 2: it provides the incorrect subbg file format.
|
||||
- Some online matchmaking experimentations (still can't make it work though)
|
||||
|
||||
|
||||
## fork-6.0.2.9
|
||||
|
||||
### New:
|
||||
@@ -25,7 +43,7 @@ Changelog
|
||||
- Added Premium Generator (Nekomata Okayu) set.
|
||||
- Updated licensed songs list (Okayu songs)
|
||||
2. Misc:
|
||||
- Added crew id 149 to CHARACTER_IGNORE_DISABLE
|
||||
- Added crew id 149 to CHARACTER\_IGNORE\_DISABLE
|
||||
- Tweaked Premium Generator odds (1% chance for a crew is a bit unfair lol, changed to 5%)
|
||||
|
||||
|
||||
@@ -37,16 +55,7 @@ Changelog
|
||||
- Updated events.json to add startup flags for Valentines Day 2024 and White Day 2024.
|
||||
|
||||
|
||||
## fork-6.0.2.8c
|
||||
|
||||
### New:
|
||||
|
||||
1. Main:
|
||||
- Updated events.json to enable this week's BPL S3 SDVX songs unlock event, and the Triple Tribe songs.
|
||||
|
||||
|
||||
### Todo:
|
||||
|
||||
1. Figure out how to use image (png) files to appear in information/news popup.
|
||||
2. More work on online matchmaking (globalMatch.) I can't seem to make clients establish a connection.
|
||||
|
||||
2. More work on online matchmaking (idk if this is possible)
|
||||
|
||||
@@ -34,6 +34,13 @@ export const EVENT6 = [
|
||||
'PREMIUM_TIME_ENABLE',
|
||||
'MEGAMIX_ENABLE',
|
||||
'ARENA_ENABLE',
|
||||
'ARENA_LOCAL_TO_ONLINE_ENABLE',
|
||||
'ARENA_ALTER_MODE_WINDOW_ENABLE',
|
||||
'ARENA_PASS_MATCH_WINDOW_ENABLE',
|
||||
'ARENA_VOTE_MODE_ENABLE',
|
||||
'ARENA_LOCAL_ULTIMATE_MATCH_ALWAYS',
|
||||
'MEGAMIX_BATTLE_MATCH_ENABLE',
|
||||
'DISABLED_MUSIC_IN_ARENA_ONLINE',
|
||||
'SINGLE_BATTLE_ENABLE',
|
||||
'GENERATOR_ABLE',
|
||||
'CREW_SELECT_ABLE',
|
||||
@@ -591,6 +598,8 @@ export const EVENT_SONGS6 = {
|
||||
"bpls3sdvx_3": ['2135', '2136', '2137'],
|
||||
"bpls3sdvx_4": ['2138', '2139', '2140'],
|
||||
"bpls3sdvx_5": ['2141', '2142', '2143'],
|
||||
"bpls3sdvx_6": ['2144', '2145', '2146'],
|
||||
"bpls3sdvx_7": ['2131', '2147', '2148', '2149'],
|
||||
// BPL S3 Triple Tribe 2
|
||||
"bpls3tripletribe2_1": ['2162'],
|
||||
"bpls3tripletribe2_2": ['2163'],
|
||||
@@ -1745,7 +1754,7 @@ export const ARENA = {
|
||||
'Season 12 (ARENA BATTLE 2023/12/21~2024/01/15)': {
|
||||
details: {
|
||||
season: 12,
|
||||
rule: 1,
|
||||
rule: 2,
|
||||
rank_match_target: 0,
|
||||
time_start: BigInt(Date.parse('21 Dec 2023 00:00:00 GMT')),
|
||||
time_end: BigInt(Date.parse('31 Dec 2099 23:59:59 GMT')),
|
||||
@@ -2322,6 +2331,16 @@ export const PREGENE = [
|
||||
"subbg": [419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438]
|
||||
},
|
||||
probability: [0.05, 0.39, 0.6]
|
||||
},
|
||||
{
|
||||
id: 10,
|
||||
items: {
|
||||
"crew": [150, 151, 152],
|
||||
"stamp": [322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333],
|
||||
"subbg": [439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455],
|
||||
"sysbg": [17, 18, 19]
|
||||
},
|
||||
probability: [0.05, 0.39, 0.6, 0.9]
|
||||
}
|
||||
]
|
||||
|
||||
|
||||
@@ -373,7 +373,6 @@ export const common: EPR = async (info, data, send) => {
|
||||
valgene_id: K.ITEM('s32', val.valgene_id)
|
||||
}))
|
||||
|
||||
|
||||
VALGENE.catalog.forEach((val) => {
|
||||
val.items.forEach((itemVal) => {
|
||||
itemVal.item_ids.forEach((item_id) => {
|
||||
@@ -387,7 +386,7 @@ export const common: EPR = async (info, data, send) => {
|
||||
})
|
||||
})
|
||||
|
||||
if(currentDate.substring(0,4) === '4/1/') {
|
||||
if(currentDate.substring(0,4) === '4/1/' || U.GetConfig('april_fools')) {
|
||||
console.log('Using April Fools Event')
|
||||
events.push('APRIL_GRACE');
|
||||
events.push('EVENTDATE_APRILFOOL');
|
||||
|
||||
@@ -156,7 +156,12 @@ export const loadMix: EPR = async (info, data, send) => {
|
||||
});
|
||||
};
|
||||
|
||||
export const globalMatch: EPR = async (info, data, send) => {
|
||||
export const entryE: EPR = async (info, data, send) => {
|
||||
console.log("entry_e id: " + $(data).number('eid'))
|
||||
send.success()
|
||||
}
|
||||
|
||||
export const globalMatch: EPR = async (info, data, send) => {
|
||||
let entryData: Matchmaker = {
|
||||
collection: 'matchmaker',
|
||||
timestamp: Date.now(),
|
||||
@@ -177,14 +182,6 @@ export const globalMatch: EPR = async (info, data, send) => {
|
||||
let loglip = entryData.lip.join(".")
|
||||
|
||||
console.log("====================================")
|
||||
console.log("[" + loglip + " | " + loggip + "] Searching for online match opponents")
|
||||
console.log("[" + loglip + " | " + loggip + "] Removed " + await DB.Remove({collection:'matchmaker', timestamp: {$lt: Date.now() - 100000}}) + " expired match data.")
|
||||
|
||||
if(entryData.p_rest < 1) {
|
||||
console.log("[" + loglip + " | " + loggip + "] Room is full. Halting.")
|
||||
return send.deny();
|
||||
}
|
||||
|
||||
// console.log(" c_ver: " + entryData.c_ver)
|
||||
// console.log(" p_num: " + entryData.p_num) // current match player count
|
||||
// console.log(" p_rest: " + entryData.p_rest) // remaining player spaces
|
||||
@@ -196,14 +193,18 @@ export const globalMatch: EPR = async (info, data, send) => {
|
||||
// console.log(" lip: " + entryData.lip)
|
||||
// console.log(" claim: " + entryData.claim)
|
||||
// console.log("entry_id: " + entryData.entry_id)
|
||||
console.log("[" + loglip + " | " + loggip + "] Searching for online match opponents")
|
||||
let expCnt = await DB.Remove({collection: 'matchmaker', timestamp: {$lt: Date.now() - 100000}})
|
||||
console.log("[" + loglip + " | " + loggip + "] Removed " + expCnt + " expired match data.")
|
||||
|
||||
console.log("[" + loglip + " | " + loggip + "] Adding/updating your match data")
|
||||
if(await DB.Count({collection: 'matchmaker', lip: entryData.lip}) === 0) {
|
||||
console.log("[" + loglip + " | " + loggip + "] Adding your info.")
|
||||
await DB.Upsert<Matchmaker>(
|
||||
{ collection: 'matchmaker', gip: entryData.gip, lip: entryData.lip},
|
||||
entryData
|
||||
)
|
||||
} else {
|
||||
console.log("[" + loglip + " | " + loggip + "] Updating info.")
|
||||
await DB.Upsert<Matchmaker>(
|
||||
{ collection: 'matchmaker', gip: entryData.gip, lip: entryData.lip},
|
||||
{ $set: {
|
||||
@@ -218,24 +219,41 @@ export const globalMatch: EPR = async (info, data, send) => {
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
if(entryData.p_rest < 1) {
|
||||
console.log("[" + loglip + " | " + loggip + "] Room is full. Halting.")
|
||||
return send.deny();
|
||||
}
|
||||
|
||||
console.log("[" + loglip + " | " + loggip + "] Searching...")
|
||||
let filteredDB = await DB.Find<Matchmaker>({collection: "matchmaker", entry_id: entryData.entry_id, filter: entryData.filter, $not: {lip: entryData.lip}})
|
||||
|
||||
let opponents = filteredDB.length === 0 ? null : {
|
||||
let opData = await DB.Find<Matchmaker>({collection: 'matchmaker', filter: entryData.filter, mid: entryData.mid, claim: entryData.claim, entry_id: entryData.entry_id})
|
||||
let opponents = {
|
||||
entry_id: K.ITEM('u32', entryData.entry_id),
|
||||
entry: filteredDB.map(e => ({
|
||||
entry: opData.map(e => ({
|
||||
port: K.ITEM('u16', e.port),
|
||||
gip: K.ITEM('4u8', e.gip),
|
||||
lip: K.ITEM('4u8', e.lip)
|
||||
}))
|
||||
}
|
||||
if(opponents !== null) {
|
||||
console.log("[" + loglip + " | " + loggip + "] Opponent/s found.")
|
||||
send.object(opponents)
|
||||
}
|
||||
else {
|
||||
console.log("[" + loglip + " | " + loggip + "] No found opponents.")
|
||||
send.deny()
|
||||
console.log("[" + loglip + " | " + loggip + "] Players found: " + (opponents.entry.length - 1) + "")
|
||||
if(opponents.entry.length === 1) send.deny()
|
||||
else send.object(opponents)
|
||||
}
|
||||
|
||||
export const lounge: EPR = async (info, data, send) => {
|
||||
let filter = $(data).number('filter')
|
||||
await DB.Remove({collection: 'matchmaker', timestamp: {$lt: Date.now() - 100000}})
|
||||
let matches = await DB.Find<Matchmaker>({collection: 'matchmaker', filter: filter})
|
||||
if(matches.length < 1) {
|
||||
send.object({
|
||||
interval: K.ITEM('u32', 5)
|
||||
})
|
||||
} else {
|
||||
let longestWait = Math.max(...matches.map(m => m.sec))
|
||||
send.object({
|
||||
interval: K.ITEM('u32', 10),
|
||||
wait: K.ITEM('u32', longestWait)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import {common, log} from './handlers/common';
|
||||
import {hiscore, rival, saveMix, loadMix, globalMatch} from './handlers/features';
|
||||
import {hiscore, rival, saveMix, loadMix, globalMatch, lounge, entryE} from './handlers/features';
|
||||
import {
|
||||
updateProfile,
|
||||
updateMix,
|
||||
@@ -34,8 +34,6 @@ export function register() {
|
||||
|
||||
R.Config('arena_szn',{ type: 'string', options: Object.keys(ARENA), default: 'None', name: 'Ranked Match Season', desc: 'Current ARENA/SINGLE BATTLE ranked season. Also sets ARENA STATION catalog corresponding to that season.'});
|
||||
R.Config('enable_valk_songs' ,{ type: 'boolean', default: false, name:'Enable Valkyrie Model Songs', desc:'Enable the valkyrie model songs on non-valkyrie mode.'});
|
||||
// R.Config('new_year_special',{ type: 'boolean', default: false, name:'Use New Year Special', desc:'Enable New Year Special BGM for login (doesn\'t work right now)'});
|
||||
// R.Config('april_fools',{ type: 'boolean', default: false, name:'April Fools', desc:'Enable April Fools Event (doesn\'t work properly right now)'});
|
||||
R.Config('use_blasterpass',{ type: 'boolean', default: true, name:'Use Blaster Pass', desc:'Enable Blaster Pass for VW and EG'});
|
||||
R.Config('unlock_all_valk_items', { type: 'boolean', default: false, name:'Unlock All Valkyrie and Premium Items', desc: 'Unlock Nemsys, BGM, Submonitor BG, System BG and Stamp Items (Valk crews not included; check \'unlock all navigators\' option)'});
|
||||
R.Config('unlock_all_songs', { type: 'boolean', default: false, name:'Unlock All Songs'});
|
||||
@@ -44,6 +42,8 @@ export function register() {
|
||||
R.Config('sdvx_eg_root_dir', { type: 'string', needRestart: true, default: '', name: 'Exceed Gear Data Directory', desc: 'The root directory of your SDVX Exceed Gear game files (for asset copying)'});
|
||||
R.Config('use_information' ,{ type: 'boolean', default: true, name:'Use Asphyxia Information', desc:'Enable the Asphyxia information section after entry. Otherwise, it will try to look for official information data and display them.'});
|
||||
R.Config('use_asphyxia_gameover',{ type: 'boolean', default: true, name:'Use Asphyxia Gameover', desc:'Enable the Asphyxia gameover message after ending the game.'})
|
||||
R.Config('april_fools',{ type: 'boolean', default: false, name:'April Fools', desc:'Enable April Fools Event (toggles Grace crew + April Fools songs)'});
|
||||
// R.Config('new_year_special',{ type: 'boolean', default: false, name:'Use New Year Special', desc:'Enable New Year Special BGM for login.'});
|
||||
|
||||
R.WebUIEvent('copyResourcesFromGame', copyResourcesFromGame);
|
||||
R.WebUIEvent('preGeneRoll', preGeneRoll);
|
||||
@@ -86,9 +86,7 @@ export function register() {
|
||||
MultiRoute('load_ap', loadMix);
|
||||
|
||||
// Lazy
|
||||
MultiRoute('lounge', (_, __, send) => send.object({
|
||||
interval: K.ITEM('u32', 30)
|
||||
}));
|
||||
MultiRoute('lounge', lounge);
|
||||
MultiRoute('shop', (_, __, send) => send.object({
|
||||
nxt_time: K.ITEM('u32', 1000 * 5 * 60)
|
||||
}));
|
||||
@@ -97,7 +95,7 @@ export function register() {
|
||||
MultiRoute('play_e', true);
|
||||
MultiRoute('play_s', true);
|
||||
MultiRoute('entry_s', globalMatch);
|
||||
MultiRoute('entry_e', true);
|
||||
MultiRoute('entry_e', entryE);
|
||||
MultiRoute('exception', true);
|
||||
MultiRoute('log',log);
|
||||
|
||||
@@ -118,4 +116,6 @@ export function register() {
|
||||
//logerrlevel: K.ITEM('s32', 0),
|
||||
//evtidnosendflg: K.ITEM('s32', 0)
|
||||
}));
|
||||
|
||||
R.Unhandled(undefined)
|
||||
}
|
||||
|
||||
@@ -5,12 +5,7 @@ function zeroPad(num, places) {
|
||||
|
||||
function getImageFileFormat(assetType, id) {
|
||||
if(assetType == 0) {
|
||||
if (id >= 103) {
|
||||
if (id >= 359 && id <= 368) {
|
||||
return '.mp4'
|
||||
}
|
||||
return '.png'
|
||||
}
|
||||
if (id >= 103) return '.png'
|
||||
return '.jpg'
|
||||
}
|
||||
}
|
||||
@@ -41,11 +36,12 @@ $('#nemsys_select').change(function() {
|
||||
});
|
||||
|
||||
$('[name="subbg"]').change(async function() {
|
||||
let isSubbgSlideshow = (database['subbg'][$('[name="subbg"]').val()]['type'] === 'slideshow')
|
||||
let subbgType = database['subbg'].filter((e => e.value === parseInt($('[name="subbg"]').val())))[0]['type']
|
||||
let isSubbgSlideshow = (subbgType === 'slideshow')
|
||||
$('#sub_pre').fadeOut(200)
|
||||
$('#sub_pre_vid').fadeOut(200)
|
||||
if(getImageFileFormat(0, parseInt(zeroPad($('[name="subbg"]').val(), 4))) === '.mp4') {
|
||||
$('#sub_pre_vid_src').attr('src', "static/asset/submonitor_bg/subbg_" + zeroPad($('[name="subbg"]').val(), 4) + getImageFileFormat(0, parseInt(zeroPad($('[name="subbg"]').val(), 4))))
|
||||
if(subbgType === 'video') {
|
||||
$('#sub_pre_vid_src').attr('src', "static/asset/submonitor_bg/subbg_" + zeroPad($('[name="subbg"]').val(), 4) + '.mp4')
|
||||
document.getElementById('sub_pre_vid').load()
|
||||
$('#sub_pre_vid').fadeIn(200)
|
||||
} else {
|
||||
@@ -392,15 +388,23 @@ $(document).ready(function() {
|
||||
|
||||
$('#sub_pre').fadeOut(200)
|
||||
$('#sub_pre_vid').fadeOut(200)
|
||||
if(getImageFileFormat(0, parseInt(zeroPad(profile_data["subbg"], 4))) === '.mp4') {
|
||||
$('#sub_pre_vid').empty().append(
|
||||
$("<source id='sub_pre_vid_src' src='static/asset/submonitor_bg/subbg_" + zeroPad(profile_data["subbg"], 4) + getImageFileFormat(0, parseInt(zeroPad(profile_data["subbg"], 4))) + "'>")
|
||||
)
|
||||
$('#sub_pre_vid').fadeIn(200)
|
||||
} else {
|
||||
$('#sub_pre').attr("src", "static/asset/submonitor_bg/subbg_" + zeroPad(profile_data["subbg"], 4) + getImageFileFormat(0, parseInt(zeroPad(profile_data["subbg"], 4))));
|
||||
$('#sub_pre').fadeIn(200)
|
||||
}
|
||||
|
||||
$.getJSON("static/asset/json/data.json", function(json) {
|
||||
database = json
|
||||
let subbgType = database['subbg'].filter((e => e.value === parseInt(profile_data["subbg"])))[0]['type']
|
||||
let isSubbgSlideshow = (subbgType === 'slideshow')
|
||||
|
||||
if(subbgType === 'video') {
|
||||
$('#sub_pre_vid').empty().append(
|
||||
$("<source id='sub_pre_vid_src' src='static/asset/submonitor_bg/subbg_" + zeroPad(profile_data["subbg"], 4) + ".mp4'>")
|
||||
)
|
||||
$('#sub_pre_vid').fadeIn(200)
|
||||
} else {
|
||||
$('#sub_pre').attr("src", isSubbgSlideshow ? "static/asset/submonitor_bg/subbg_" + zeroPad(profile_data["subbg"], 4) + "_0" + (Math.floor(Math.random() * 3) + 1) + getImageFileFormat(0, parseInt(zeroPad($('[name="subbg"]').val(), 4))) : "static/asset/submonitor_bg/subbg_" + zeroPad(profile_data["subbg"], 4) + getImageFileFormat(0, parseInt(zeroPad(profile_data["subbg"], 4))));
|
||||
$('#sub_pre').fadeIn(200)
|
||||
}
|
||||
})
|
||||
// console.log(database)
|
||||
$('#custom_0').attr("src", "static/asset/audio/custom_" + zeroPad(profile_data["bgm"], 2) + "/0.mp3");
|
||||
$('#custom_1').attr("src", "static/asset/audio/custom_" + zeroPad(profile_data["bgm"], 2) + "/1.mp3");
|
||||
$('#custom_0').prop("volume", 0.5);
|
||||
|
||||
@@ -48,11 +48,75 @@
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"name": "Infinite Infection"
|
||||
"name": "infinite infection"
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"name": "Gravity Wars"
|
||||
"name": "GRAVITY WARS"
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"name": "サウダージ・店内"
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"name": "サウダージ・外観"
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"name": "いずみ洋裁店・店内"
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"name": "いずみ洋裁店・外観"
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
"name": "兎月堂・店内"
|
||||
},
|
||||
{
|
||||
"id": 9,
|
||||
"name": "兎月堂・外観"
|
||||
},
|
||||
{
|
||||
"id": 10,
|
||||
"name": "シャノワール・店内"
|
||||
},
|
||||
{
|
||||
"id": 11,
|
||||
"name": "シャノワール・外観"
|
||||
},
|
||||
{
|
||||
"id": 12,
|
||||
"name": "霜月書林・店内"
|
||||
},
|
||||
{
|
||||
"id": 13,
|
||||
"name": "霜月書林・外観"
|
||||
},
|
||||
{
|
||||
"id": 14,
|
||||
"name": "日向美商店街"
|
||||
},
|
||||
{
|
||||
"id": 15,
|
||||
"name": "倉野川城址公園"
|
||||
},
|
||||
{
|
||||
"id": 16,
|
||||
"name": "やまもり温泉"
|
||||
},
|
||||
{
|
||||
"id": 17,
|
||||
"name": "GRAVITY WARS 2nd Season"
|
||||
},
|
||||
{
|
||||
"id": 18,
|
||||
"name": "HEAVENLY HAVEN"
|
||||
},
|
||||
{
|
||||
"id": 19,
|
||||
"name": "VIVID WAVE"
|
||||
}
|
||||
],
|
||||
"skilltitle": [
|
||||
|
||||
@@ -246,7 +246,9 @@
|
||||
"Week 2 songs: 'トリコエリヌム▽コンチェルト,' '群青纏う朱の槍,' and 'CHOVERY GOOSE!!!'",
|
||||
"Week 3 songs: 'V!LLA!N,' 'TOYBOX CANNØN=墸Σ≡=。゚:*.:+。.☆,' and 'ON THE WORLD'",
|
||||
"Week 4 songs: '花火のおもちゃ箱,' 'イグジスター,' and 'La Nostra Storia!'",
|
||||
"Week 5 songs: 'グリーディ・スターズ!,' 'Di-Da-De-Doo,' and 'Break Through Δpex'"
|
||||
"Week 5 songs: 'グリーディ・スターズ!,' 'Di-Da-De-Doo,' and 'Break Through Δpex'",
|
||||
"Week 6 songs: 'Ars Magna,' 'Inevitable Magic,' and 'LOVE TONIC'",
|
||||
"Week 7 songs: 'Crawl Out Immortal,' 'MΔX FLAVØR,' 'SΛMVICΛ,' and '異次元の孤独~カナタノキミヘ~'"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -310,6 +312,12 @@
|
||||
"key": "WHITE_DAY_2024",
|
||||
"str": "WHITE_DAY_2024",
|
||||
"explain": "Enables Navigator White Day greeting."
|
||||
},
|
||||
{
|
||||
"id": "aprilrainbowline",
|
||||
"key": "APRIL_RAINBOW_LINE_ACTIVE",
|
||||
"str": "APRIL_RAINBOW_LINE_ACTIVE",
|
||||
"explain": "Enables April Fools 2024 Effect: rainbow lasers. Type V-RAN on song search bar to enable."
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -91,6 +91,17 @@
|
||||
"stamp": [312, 313, 314, 315, 316, 317, 318, 319, 320, 321],
|
||||
"subbg": [419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 10,
|
||||
"name": "Premium Generator Vol. 4",
|
||||
"jpn_exc": false,
|
||||
"items": {
|
||||
"crew": [150, 151, 152],
|
||||
"stamp": [322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333],
|
||||
"subbg": [439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455],
|
||||
"sysbg": [17, 18, 19]
|
||||
}
|
||||
}
|
||||
],
|
||||
"valgene":[
|
||||
|
||||
Reference in New Issue
Block a user