This commit is contained in:
vvo
2024-03-31 23:15:24 +08:00
parent a577c84781
commit 8c2dad62c7
9 changed files with 196 additions and 64 deletions
+22 -13
View File
@@ -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)
+20 -1
View File
@@ -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]
}
]
+1 -2
View File
@@ -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');
+38 -20
View File
@@ -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)
})
}
}
+7 -7
View File
@@ -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)
}
+22 -18
View File
@@ -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": [
+9 -1
View File
@@ -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":[