diff --git a/sdvx@asphyxia/README.md b/sdvx@asphyxia/README.md index ced01d2..2e91bdb 100644 --- a/sdvx@asphyxia/README.md +++ b/sdvx@asphyxia/README.md @@ -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) diff --git a/sdvx@asphyxia/data/exg.ts b/sdvx@asphyxia/data/exg.ts index 22f4003..5eb9c16 100644 --- a/sdvx@asphyxia/data/exg.ts +++ b/sdvx@asphyxia/data/exg.ts @@ -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] } ] diff --git a/sdvx@asphyxia/handlers/common.ts b/sdvx@asphyxia/handlers/common.ts index dd1f5ff..1bad061 100644 --- a/sdvx@asphyxia/handlers/common.ts +++ b/sdvx@asphyxia/handlers/common.ts @@ -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'); diff --git a/sdvx@asphyxia/handlers/features.ts b/sdvx@asphyxia/handlers/features.ts index 3ad1637..1f6034e 100644 --- a/sdvx@asphyxia/handlers/features.ts +++ b/sdvx@asphyxia/handlers/features.ts @@ -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( { collection: 'matchmaker', gip: entryData.gip, lip: entryData.lip}, entryData ) } else { + console.log("[" + loglip + " | " + loggip + "] Updating info.") await DB.Upsert( { 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({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({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({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) + }) } } diff --git a/sdvx@asphyxia/index.ts b/sdvx@asphyxia/index.ts index bae81bc..a8901d6 100644 --- a/sdvx@asphyxia/index.ts +++ b/sdvx@asphyxia/index.ts @@ -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) } diff --git a/sdvx@asphyxia/webui/asset/js/preview.js b/sdvx@asphyxia/webui/asset/js/preview.js index aaec179..4cec553 100644 --- a/sdvx@asphyxia/webui/asset/js/preview.js +++ b/sdvx@asphyxia/webui/asset/js/preview.js @@ -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( - $("") - ) - $('#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( + $("") + ) + $('#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); diff --git a/sdvx@asphyxia/webui/asset/json/customize_data_ext.json b/sdvx@asphyxia/webui/asset/json/customize_data_ext.json index fa0fa62..a70d535 100644 --- a/sdvx@asphyxia/webui/asset/json/customize_data_ext.json +++ b/sdvx@asphyxia/webui/asset/json/customize_data_ext.json @@ -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": [ diff --git a/sdvx@asphyxia/webui/asset/json/events.json b/sdvx@asphyxia/webui/asset/json/events.json index 940166e..32d6c3e 100644 --- a/sdvx@asphyxia/webui/asset/json/events.json +++ b/sdvx@asphyxia/webui/asset/json/events.json @@ -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." } ] } diff --git a/sdvx@asphyxia/webui/asset/json/valgene_data.json b/sdvx@asphyxia/webui/asset/json/valgene_data.json index d95b609..80e0167 100644 --- a/sdvx@asphyxia/webui/asset/json/valgene_data.json +++ b/sdvx@asphyxia/webui/asset/json/valgene_data.json @@ -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":[