230912 support

This commit is contained in:
vvo
2023-09-22 21:56:24 +08:00
parent 7895fadb3c
commit ec195f1187
19 changed files with 2364 additions and 740 deletions
+54 -94
View File
@@ -1,109 +1,69 @@
# SOUND VOLTEX
Plugin Version: **v6.0.0**
**Plugin Version:** fork-6.0.2.1
Message from repo fork:
**Supported game versions:** EXCEED GEAR
**Latest supported game datacode:** 2023091200
**Unsupported game versions:** Every other game, as they're untested.
**Required Asphyxia Core version** [1.50c](https://github.com/asphyxia-core/asphyxia-core.github.io/releases/tag/v1.50)
**Notes:**
- This fork enables a few of the features that are added in the later updates of Exceed Gear. However, I still highly recommend using the official stable version of the plugin.
- Most importantly, run the [WebUI Asset Update](/plugin/sdvx@asphyxia/update%20webui%20assets) for everything to properly work.
- Don't expect stability, there might be some bugs. Please back up your data to prevent unwanted issues (just in case)
- Most importantly, for everything to properly work:
- run the [WebUI Asset Update](/plugin/sdvx@asphyxia/update%20webui%20assets). Do this every data update.
- go to [Unlocking Events](/plugin/sdvx@asphyxia/unlocking%20events) and click "Apply" at least once. Check out the many options available while you're there.
- Don't expect stability, there might be some bugs. Please back up your save data to prevent unwanted issues (just in case)
Supported Versions:
- BOOTH
- HEAVENLY HAVEN
- VIVIDWAVE
- EXCEED GEAR
Versions Not Supported:
- INFINITE INFECTION
- GRAVITY WARS
The plugin now mainly maintained versions:
- VIVIDWAVE
- EXCEED GEAR
Fork Changelog
Changelog
===========
### Latest supported game version
- 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.)
## fork-6.0.2.1
### 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)
1. Fixed missing Megamix songs (extend string param getting cut off)
## fork-6.0.2.0
### New:
1. Support for EG 2023091200
2. Added Arena Station 8, 9 and 10.
3. Added Valkyrie Generator Vol. 12
4. Added Premium Generator
- Re:Zero Set 1
- Re:Zero Set 2
- Vol. 3
5. Enabled HEXADIVER 8 and 9
6. Added option for BPL Team Supporter banner
7. Added support for System Backgrounds
8. Added event data:
- BPL S3 Triple Tribe songs unlock toggle (suspicions, etc.)
- KAC 2023 song unlock toggle (Perfect Eater)
- KAC 2023 song stamp event (for 累乗のカルマ)
- KAC 2023 song stamp event (for Stylus & QQ)
9. Updated licensed songs and valk-exclusive songs list
10. Skill Analyzer God Mode implementation.
- Special courses (Red Bull courses, etc.) do not have God Mode courses.
11. Added and fixed Skill Analyzer course data:
- Sets 6 and 7
- BMK2021 courses
- Spring 2023 courses
- KAC 2023 Qualifier course sets 1 & 2
12. Megamix Battle song list update
### Fixes:
1. Reduced songNum value from 3000 to 2100. Potential fix for some users with "unlock all songs" enabled who are experiencing request timeouts resulting in missing features and songs.
2. Fixed bug in stamp select data.
3. Fixed bug for when common.ts or profiles.ts is looking for a specific event key but it is undefined.
3. Skill Analyzer: skill level requirement for Lv.11 and ∞. Song input/unlock status must be met as well, or just use the unlock all songs option in the WebUI.
### 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
### New:
1. Enabled stamp events. Check the Stamp Events dropdown at the [Unlocking Events](/plugin/sdvx@asphyxia/unlocking%20events) page to see which stamp events are available to toggle for now.
### Fixes:
1. Various event-related fixes
- Re-did the Unlocking Events functionalities (categorized events by type, etc.)
- Rewrote handling of these events in common.ts and profiles.ts
## fork-6.0.0.1
### New:
1. Support for 221220
2. Arena Station
3. Valkyrie Generator support -- requires Valkyrie mode
4. WebUI features:
- [WebUI asset update](/plugin/sdvx@asphyxia/update%20webui%20assets) -- retrieves assets from sdvx data to update various webui assets such as the music db, bgm, submonitor bg, nemsys, crew, etc. Necessary to run for this plugin to properly work, and after updating arcade data.
- [Unlocking Events page](/plugin/sdvx@asphyxia/unlocking%20events) -- a page to toggle unlocking of songs and other items unlocked by previous events (stamp events, etc.)
- [Profile pages](/plugin/sdvx@asphyxia/profiles):
- Valkyrie Generator item list -- displays a profile's valkyrie/premium generator items that they've already unlocked
- Gacha feature for Premium Generator
- [Songs List](/plugin/sdvx@asphyxia/songs%20list)
5. Handler for showing unlocked items on card entry.
### Fixes:
1. Various generator issues:
- Incorrect valkyrie/premium generator volume data fixed
- Generator code bug fixes.
2. April fools event trigger:
- Code checks if date has "4/1" in it anywhere, which means it will trigger on dates like 4/10, and 4/15. This has been fixed.
Change Log
===========
## 6.0.0
1. Plugin version now follows the pattern (MAX SDVX VER,Plugin VER of supporting the MAX version of SDVX,hotfix).
2. Initial support for EXCEED GEAR.
## 1.1
1. Support VIVIDWAVE
2. Figure out how to use image (png) files to appear in information/news popup and in demo_info.
3. Megamix Battle song list updated but I cannot make a lot of them appear in the list.
+1865 -397
View File
File diff suppressed because it is too large Load Diff
+75 -102
View File
@@ -1,8 +1,7 @@
import { EVENT4, COURSES4, EXTENDS4 } from '../data/hvn';
import { EVENT5, COURSES5, EXTENDS5 } from '../data/vvw';
import { EVENT6, COURSES6, EXTENDS6, APRILFOOLSSONGS, VALKYRIE_SONGS,
MISSINGSONGS6, ARENA, VALGENE, INFORMATION6, RESTRICTED_SONGS6, EVENT_SONGS6,
STAMP_EVENTS6
LICENSED_SONGS6, ARENA, VALGENE, INFORMATION6, STAMP_EVENTS6
} from '../data/exg';
import { COURSE2 } from '../data/inf';
import {getVersion, getRandomIntInclusive} from '../utils';
@@ -56,22 +55,13 @@ export const common: EPR = async (info, data, send) => {
//events = EVENT6;
EVENT6.forEach(val => events.push(val));
courses = COURSES6;
// IO.ReadFile('webui\\asset\\json\\course_data.json').then(
// function(yesData){
// console.log('yes')
// let courseData = JSON.parse(yesData)
// courses = courseData.courseData.find(data => data.version == 6).info;
// },
// function(noData){
// console.log(noData)
// })
EXTENDS6.forEach(val => extend.push(Object.assign({}, val)));
break;
}
}
let songs = [];
const gameVersion = getVersion(info);
let songNum = 3000;
let songNum = 2100;
if(gameVersion === 2) songNum = 554;
if(gameVersion === 3) songNum = 954;
if(gameVersion === 4) songNum = 1368;
@@ -87,16 +77,7 @@ export const common: EPR = async (info, data, send) => {
});
}
}
} else {
let RESTRICT_SONGS = [] //KONASTESONGS.concat(BEMANI2021EVENTSONGS, BPLSTAMPRALLYSONGS, SDVX10THSTAMPSONGS, REFLECBEATSTAMPSONGS);
let EVENT_SONGS = []
for(const keyIter in Object.keys(RESTRICTED_SONGS6)) {
RESTRICT_SONGS = RESTRICT_SONGS.concat(RESTRICTED_SONGS6[Object.keys(RESTRICTED_SONGS6)[keyIter]])
}
for(const keyIter in Object.keys(EVENT_SONGS6)) {
EVENT_SONGS = EVENT_SONGS.concat(EVENT_SONGS6[Object.keys(EVENT_SONGS6)[keyIter]])
}
} else {
let mdb = JSON.parse(music_db.toString());
let limitedNo = 2;
@@ -107,10 +88,15 @@ export const common: EPR = async (info, data, send) => {
if(foundSongIndex != -1) {
var songData = mdb.mdb.music[foundSongIndex];
if(gameVersion === 6 || gameVersion === -6) {
if((!RESTRICT_SONGS.includes(i.toString()) || EVENT_SONGS.includes(i.toString())) && parseInt(songData['info']['distribution_date']['#text']) <= currentYMDDate) {
if(parseInt(songData['info']['distribution_date']['#text']) >= currentYMDDate) {
console.log("Unreleased song: " + songData.info.title_name)
}
else {
limitedNo = 2;
if(songData.info.version['#text'] === '6') { // if song is released during exceed gear
if(MISSINGSONGS6.includes(i.toString())) {
// if song is released during exceed gear
if(songData.info.version['#text'] === '6') {
// Licensed songs released in Exceed Gear needs limited=3 to appear
if(LICENSED_SONGS6.includes(i.toString())) {
limitedNo += 1;
}
else if(VALKYRIE_SONGS.includes(i.toString()) && (!U.GetConfig('enable_valk_songs') && info.model.split(":")[2].match(/^(G|H)$/g) == null)){
@@ -123,15 +109,15 @@ export const common: EPR = async (info, data, send) => {
limited: K.ITEM('u8', limitedNo),
});
}
} else if (songData.info.inf_ver['#text'] === '6') { // if song has new XCD track; wouldn't work without updated webui asset
}
// if song has new XCD track
else if (songData.info.inf_ver['#text'] === '6') {
songs.push({
music_id: K.ITEM('s32', i),
music_type: K.ITEM('u8', 3),
limited: K.ITEM('u8', limitedNo),
});
}
} else {
console.log("Restricted song: " + songData.info.title_name)
}
}
}
@@ -194,21 +180,6 @@ export const common: EPR = async (info, data, send) => {
}
}
// 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 bufEventData = await IO.ReadFile('webui/asset/json/events.json')
@@ -216,7 +187,7 @@ export const common: EPR = async (info, data, send) => {
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']) {
if(eventData['events'][eventIter]['type'] === 'stamp' && eventConfig[eventData['events'][eventIter]['id']] !== undefined && eventConfig[eventData['events'][eventIter]['id']]['toggle']) {
let stmpEvntInfo = STAMP_EVENTS6[eventData['events'][eventIter]['id']]
let prmStr1Sel = ''
@@ -230,22 +201,21 @@ export const common: EPR = async (info, data, send) => {
if (stmpRwrd[stmpRwrdIter][1] === 'track') iID += stmpRwrd[stmpRwrdIter][3]
prmStr5 += stmpRwrd[stmpRwrdIter][0] + ':' + itemTypeList[stmpRwrd[stmpRwrdIter][1]] + ':' + iID + (stmpRwrd.length - 1 === parseInt(stmpRwrdIter) ? '' : ' ')
}
let prmStep = [
5,
stmpEvntInfo['info']['data'][stmpDataIter]['stps'],
0,
stmpEvntInfo['info']['data'][stmpDataIter]['stps'],
0,
'',
stmpEvntInfo['info']['stmpHd'],
'',
stmpEvntInfo['info']['stmpFt'],
prmStr5
]
let newSelMainExtend = {
'type': 3,
'id': stmpEvntInfo['info']['data'][stmpDataIter]['stmpid'],
'params': prmStep
'params': [
5,
stmpEvntInfo['info']['data'][stmpDataIter]['stps'],
0,
stmpEvntInfo['info']['data'][stmpDataIter]['stps'],
0,
'',
stmpEvntInfo['info']['stmpHd'],
'',
stmpEvntInfo['info']['stmpFt'],
prmStr5
]
}
extend.push(newSelMainExtend)
}
@@ -256,7 +226,7 @@ export const common: EPR = async (info, data, send) => {
'id': stmpEvntInfo['info']['id'],
'params': [
9,
stmpEvntInfo['info']['num'],
(stmpEvntInfo['info']['textstampval'] !== undefined) ? stmpEvntInfo['info']['textstampval'] : 0,
0,
0,
0,
@@ -377,19 +347,6 @@ export const common: EPR = async (info, data, send) => {
let catalog = []
let campaign = []
// if(U.GetConfig('arena_szn') == 'debug') {
// for(let xxx = 1; xxx<=150; xxx++){
// arena_catalog_items.push({
// catalog_id: K.ITEM('s32', 1),
// catalog_type: K.ITEM('s32', 1),
// price: K.ITEM('s32', 1000),
// item_type: K.ITEM('s32', 11),
// item_id: K.ITEM('s32', xxx),
// param: K.ITEM('s32', 1),
// })
// }
// }
// else{
for (let catalog_item in ARENA[U.GetConfig('arena_szn')].arena_items) {
arena_catalog_items.push({
catalog_id: K.ITEM('s32', ARENA[U.GetConfig('arena_szn')].arena_items[catalog_item].catalog_id),
@@ -400,7 +357,6 @@ export const common: EPR = async (info, data, send) => {
param: K.ITEM('s32', ARENA[U.GetConfig('arena_szn')].arena_items[catalog_item].param),
})
}
// }
let valgene_info = []
let valgene_items = []
@@ -477,27 +433,53 @@ export const common: EPR = async (info, data, send) => {
music_limited: { info: songs },
skill_course: {
info: courses.reduce(
(acc, s) =>
acc.concat(
s.courses.map(c => ({
season_id: K.ITEM('s32', s.id),
season_name: K.ITEM('str', s.name),
season_new_flg: K.ITEM('bool', s.isNew),
course_type: K.ITEM('s16', 0),
course_id: K.ITEM('s16', c.id),
course_name: K.ITEM('str', c.name),
skill_level: K.ITEM('s16', c.level),
skill_name_id: K.ITEM('s16', c.nameID),
matching_assist: K.ITEM('bool', c.assist),
clear_rate: K.ITEM('s32', 5000),
avg_score: K.ITEM('u32', 15000000),
track: c.tracks.map(t => ({
track_no: K.ITEM('s16', t.no),
music_id: K.ITEM('s32', t.mid),
music_type: K.ITEM('s8', t.mty),
})),
}))
),
(acc, s) => {
let courseData = s.courses.map(c => ({
season_id: K.ITEM('s32', s.id),
season_name: K.ITEM('str', s.name),
season_new_flg: K.ITEM('bool', s.isNew),
course_type: K.ITEM('s16', c.type),
course_id: K.ITEM('s16', c.id),
course_name: K.ITEM('str', c.name),
skill_level: K.ITEM('s16', c.level),
skill_type: K.ITEM('s16', 0),
skill_name_id: K.ITEM('s16', c.nameID),
matching_assist: K.ITEM('bool', c.assist),
clear_rate: K.ITEM('s32', 5000),
avg_score: K.ITEM('u32', 15000000),
track: c.tracks.map(t => ({
track_no: K.ITEM('s16', t.no),
music_id: K.ITEM('s32', t.mid),
music_type: K.ITEM('s8', t.mty),
})),
}))
acc = acc.concat(courseData)
if((info.model.split(":")[2] === 'G' || info.model.split(":")[2] === 'H') && s.hasGod !== undefined && s.hasGod === 1) {
courseData = courseData.concat(
s.courses.map(c => ({
season_id: K.ITEM('s32', s.id),
season_name: K.ITEM('str', s.name),
season_new_flg: K.ITEM('bool', s.isNew),
course_type: K.ITEM('s16', c.type),
course_id: K.ITEM('s16', c.id),
course_name: K.ITEM('str', c.name),
skill_level: K.ITEM('s16', c.level),
skill_type: K.ITEM('s16', s.hasGod),
skill_name_id: K.ITEM('s16', c.nameID),
matching_assist: K.ITEM('bool', c.assist),
clear_rate: K.ITEM('s32', 5000),
avg_score: K.ITEM('u32', 15000000),
track: c.tracks.map(t => ({
track_no: K.ITEM('s16', t.no),
music_id: K.ITEM('s32', t.mid),
music_type: K.ITEM('s8', t.mty),
})),
}))
)
acc = acc.concat(courseData)
}
return acc
},
[]
),
},
@@ -512,12 +494,3 @@ export const common: EPR = async (info, data, send) => {
export const log: EPR = async (info, data, send) => {
send.success();
}
export const unhandledt: EPR = async (info, data, send) => {
console.log("")
console.log("Unhandled: " + info.method + " | " + info.model + " | " + info.module)
console.log(JSON.stringify(info))
console.log(JSON.stringify(data))
console.log("")
return send.success()
}
+23 -6
View File
@@ -8,7 +8,7 @@ import { CourseRecord } from '../models/course_record';
import { Profile } from '../models/profile';
import { getVersion, IDToCode } from '../utils';
import { Mix } from '../models/mix';
import { ARENA, EVENT_SONGS6, RESTRICTED_SONGS6 } from '../data/exg';
import { ARENA, EVENT_SONGS6 } from '../data/exg';
async function getAutomationMixes(params: Param[]) {
const mixids = params
@@ -513,18 +513,21 @@ export const save: EPR = async (info, data, send) => {
}
// New course saving function found in sdvx 20220214
// Updated for God mode
const course = $(data).element('course');
if(!_.isNil(course)){
const sid = course.number('ssnid');
const cid = course.number('crsid');
const stype = course.number('st');
if (!(_.isNil(sid) || _.isNil(cid))){
await DB.Upsert<CourseRecord>(
refid,
{ collection: 'course', sid, cid, version },
{ collection: 'course', sid, cid, stype, version },
{
$max: {
score: course.number('sc', 0),
exscore: course.number('ex', 0),
clear: course.number('ct', 0),
grade: course.number('gr', 0),
rate: course.number('ar', 0),
@@ -582,6 +585,7 @@ export const save: EPR = async (info, data, send) => {
base: $(data).number('skill_base_id'),
level: $(data).number('skill_level'),
name: $(data).number('skill_name_id'),
type: $(data).number('skill_type'),
},
}
);
@@ -649,7 +653,7 @@ export const load: EPR = async (info, data, send) => {
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(eventData['events'][eventIter]['type'] === 'gift' && eventConfig[eventData['events'][eventIter]['id']] !== undefined) {
if(typeof eventConfig[eventData['events'][eventIter]['id']]['toggle'] === "boolean") {
if(eventConfig[eventData['events'][eventIter]['id']]['toggle']) {
for(const itemIter in EVENT_SONGS6[eventData['events'][eventIter]['id']]) {
@@ -735,10 +739,12 @@ export const load: EPR = async (info, data, send) => {
const stampB = profile.stampB ? profile.stampB : 0;
const stampC = profile.stampC ? profile.stampC : 0;
const stampD = profile.stampD ? profile.stampD : 0;
const sysBG = profile.sysBG ? profile.sysBG : 0;
const bplSupport = profile.bplSupport ? profile.bplSupport : 0;
const customize = [];
customize.push(bgm, subbg, nemsys, stampA, stampB, stampC, stampD);
customize.push(bgm, subbg, nemsys, stampA, stampB, stampC, stampD, 0, 0, 0, 0, sysBG);
var tempCustom = params.findIndex((e) => (e.type == 2 && e.id == 2))
@@ -752,7 +758,6 @@ export const load: EPR = async (info, data, send) => {
params[tempCustom].param = customize;
}
let blasterpass = U.GetConfig('use_blasterpass') ? 1 : 0;
var tempItem = U.GetConfig('unlock_all_navigators') ? unlockNavigators(items) : items;
@@ -824,6 +829,8 @@ export const create: EPR = async (info, data, send) => {
stampC: 0,
stampD: 0,
sysBG: 0,
headphone: 0,
musicID: 0,
musicType: 0,
@@ -832,7 +839,17 @@ export const create: EPR = async (info, data, send) => {
mUserCnt: 0,
boothFrame: [0, 0, 0, 0, 0],
playCount: 0
playCount: 0,
dayCount: 0,
todayCount: 0,
playchain: 0,
maxPlayChain: 0,
weekCount: 0,
weekPlayCount: 0,
weekChain: 0,
maxWeekChain: 0,
bplSupport: 0
};
await DB.Upsert(refid, { collection: 'profile' }, profile);
+29 -10
View File
@@ -9,6 +9,7 @@ export const updateProfile = async (data: {
name?: string;
appeal?: string;
akaname?: string;
bplSupport?: string;
nemsys?: string;
bgm?: string;
subbg?: string;
@@ -16,6 +17,7 @@ export const updateProfile = async (data: {
stampB?: string;
stampC?: string;
stampD?: string;
sysBG?: string;
}) => {
if (data.refid == null) return;
@@ -44,6 +46,11 @@ export const updateProfile = async (data: {
if (!_.isNaN(validNemsys)) update.nemsys = validNemsys;
}
if (data.bplSupport && data.bplSupport.length > 0) {
const validBplSupport = parseInt(data.bplSupport);
if (!_.isNaN(validBplSupport)) update.bplSupport = validBplSupport;
}
if (data.subbg && data.subbg.length > 0) {
const validSubbg = parseInt(data.subbg);
if (!_.isNaN(validSubbg)) update.subbg = validSubbg;
@@ -74,6 +81,12 @@ export const updateProfile = async (data: {
if (!_.isNaN(validStampD)) update.stampD = validStampD;
}
if (data.sysBG && data.sysBG.length > 0) {
console.log(data.sysBG)
const validSysBG = parseInt(data.sysBG);
if (!_.isNaN(validSysBG)) update.sysBG = validSysBG;
}
await DB.Update<Profile>(
data.refid,
{ collection: 'profile' },
@@ -157,7 +170,7 @@ export const deleteMix = async (data: { code: string }) => {
};
export const copyResourcesFromGame = async (data: {}) => {
export const copyResourcesFromGame = async (data: {}, send: WebUISend) => {
let mdbJsonFix = [];
let mdbJsonFixFinal;
let newJsonSongs = [];
@@ -281,10 +294,6 @@ export const copyResourcesFromGame = async (data: {}) => {
}
};
IO.WriteFile('webui/asset/json/music_db.json', JSON.stringify(mdbJsonFixFinal, null, 4));
if(!IO.Exists('webui/asset/json/music_db_' + version + '.json')){
IO.WriteFile('webui/asset/json/music_db_' + version + '.json', JSON.stringify(mdbJsonFixFinal, null, 4));
}
} else {
console.log('Error reading music_db.xml. Check your "Exceed Gear Data Directory" config.')
runErrors.push('[music_db] Error reading music_db.xml. Check your "Exceed Gear Data Directory" config.')
@@ -456,7 +465,9 @@ export const copyResourcesFromGame = async (data: {}) => {
await IO.WriteFile('webui/asset/json/data.json', JSON.stringify(resourceJsonData, null, 4))
await IO.WriteFile('webui/asset/json/appeal.json', JSON.stringify(apCardJsonData, null, 4))
await IO.WriteFile('webui/asset/logs/copyResourcesFromGame.json', JSON.stringify({
send.json(
{
status: 'ok',
akaname: newAkanames,
nemsys: newNemsysData,
apCard: newAPCardData,
@@ -468,21 +479,23 @@ export const copyResourcesFromGame = async (data: {}) => {
jsonSongs: newJsonSongs.sort((a, b) => a[0] - b[0]),
xcdSongs: newXCDSongs.sort((a, b) => a[0] - b[0]),
errors: runErrors
}, null, 4))
}
)
}
export const preGeneRoll = async (data: {
set: number,
refid: string,
items: []
}) => {
}, send: WebUISend) => {
let itemId = {
'crew': 11,
'stamp': 17,
'subbg': 18,
'bgm': 19,
'nemsys': 20
'nemsys': 20,
'sysbg': 21
}
let preGeneSet = PREGENE.find(itemSet => itemSet.id === data.set)
let finishedRolling = false
@@ -529,8 +542,14 @@ export const preGeneRoll = async (data: {
)
}
let finalItemType = (Object.keys(preGeneSet.items)[rollWhat] === 'subbg') ? 'bg' : Object.keys(preGeneSet.items)[rollWhat]
await IO.WriteFile('webui/asset/logs/preGeneRollResult.json', JSON.stringify({'id': unobtainedItems[randomItemIndex], 'type': finalItemType}))
finishedRolling = true
send.json(
{
status: 'ok',
id: unobtainedItems[randomItemIndex],
type: finalItemType
}
)
} else {
console.log("No more " + Object.keys(preGeneSet.items)[rollWhat] + " items to get, will re-roll.")
}
+3 -17
View File
@@ -1,4 +1,4 @@
import {common,log,unhandledt} from './handlers/common';
import {common, log} from './handlers/common';
import {hiscore, rival, saveMix, loadMix, globalMatch} from './handlers/features';
import {
updateProfile,
@@ -36,12 +36,12 @@ export function register() {
// 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 and Stamp Items (Valk crews not included; check \'unlock all navigators\' option)'});
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'});
R.Config('unlock_all_navigators', { type: 'boolean', default: false, name:'Unlock All Navigators'} );
R.Config('unlock_all_appeal_cards', { type: 'boolean', default: false, name:'Unlock All Appeal Cards'});
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 Information', desc:'Enable the information section after entry.'});
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.WebUIEvent('copyResourcesFromGame', copyResourcesFromGame);
@@ -98,16 +98,6 @@ export function register() {
MultiRoute('entry_e', true);
MultiRoute('exception', true);
MultiRoute('log',log);
/*
print_h
sample
save_campaign
save_fi
save_pb
save_valgene - DONE
serial
*/
R.Route('eventlog.write', (_, __, send) => send.object({
gamesession: K.ITEM('s64', BigInt(1)),
@@ -126,8 +116,4 @@ export function register() {
//logerrlevel: K.ITEM('s32', 0),
//evtidnosendflg: K.ITEM('s32', 0)
}));
// R.Unhandled();
R.Unhandled(unhandledt);
}
+2
View File
@@ -5,7 +5,9 @@ export interface CourseRecord {
sid: number;
cid: number;
stype: number;
score: number;
exscore: number;
clear: number;
grade: number;
rate: number;
+11
View File
@@ -41,8 +41,19 @@ export interface Profile {
stampB: number;
stampC: number;
stampD: number;
sysBG: number;
boothFrame: number[];
playCount: number;
dayCount: number;
todayCount: number;
playchain: number;
maxPlayChain: number;
weekCount: number;
weekPlayCount: number;
weekChain: number;
maxWeekChain: number;
bplSupport: number;
}
+1
View File
@@ -6,4 +6,5 @@ export interface Skill {
level: number;
base: number;
name: number;
type: number;
}
+6 -1
View File
@@ -31,6 +31,10 @@ game
skill_level(__type="s16") #{skill.level}
skill_base_id(__type="s16") #{skill.base}
skill_name_id(__type="s16") #{skill.name}
skill_type(__type="s16") #{skill.type !== undefined ? skill.type : 0}
if bplSupport
support_team_id(__type="s32") #{bplSupport}
ea_shop
packet_booster(__type="s32") 1
@@ -51,8 +55,9 @@ game
course
ssnid(__type="s16") #{course.sid}
crsid(__type="s16") #{course.cid}
st(__type="s16") #{course.stype !== undefined ? course.stype : 0}
sc(__type="s32") #{course.score}
ex(__type="s32") 0
ex(__type="s32") #{course.exscore !== undefined ? course.exscore : 0}
ct(__type="s16") #{course.clear}
gr(__type="s16") #{course.grade}
ar(__type="s16") #{course.rate}
+40 -25
View File
@@ -1,4 +1,4 @@
function countGeneItems(geneItems, items_crew, items_stamp, items_subbg, items_bgm, items_nemsys) {
function countGeneItems(geneItems, items_crew, items_stamp, items_subbg, items_bgm, items_nemsys, items_sysbg) {
let obtained = 0, total = 0;
if('crew' in geneItems.items) {
obtained += items_crew.filter(crew => geneItems.items.crew.includes(crew['id'])).length
@@ -20,6 +20,10 @@ function countGeneItems(geneItems, items_crew, items_stamp, items_subbg, items_b
obtained += items_nemsys.filter(nemsys => geneItems.items.nemsys.includes(nemsys['id'])).length
total += geneItems.items['nemsys'].length
}
if('sysbg' in geneItems.items) {
obtained += items_sysbg.filter(sysbg => geneItems.items.sysbg.includes(sysbg['id'])).length
total += geneItems.items['sysbg'].length
}
return [obtained, total]
}
@@ -47,18 +51,14 @@ async function getGeneratorEditionItems(gene_edition, itemSet) {
}
}
async function loadItems(itemSet, gene_edition, items_crew, items_stamp, items_subbg, items_bgm, items_nemsys) {
console.log(gene_edition)
async function loadItems(itemSet, gene_edition, items_crew, items_stamp, items_subbg, items_bgm, items_nemsys, items_sysbg) {
let geneItems = await getGeneratorEditionItems(gene_edition, itemSet)
let itemCounts = countGeneItems(geneItems, items_crew, items_stamp, items_subbg, items_bgm, items_nemsys)
let itemCounts = countGeneItems(geneItems, items_crew, items_stamp, items_subbg, items_bgm, items_nemsys, items_sysbg)
if(gene_edition === 'premium') {
console.log('naur')
if(itemCounts[0] >= itemCounts[1]) $('#pregene-roll').attr('disabled', 'disabled')
else $('#pregene-roll').removeAttr('disabled')
} else if(gene_edition === 'valkyrie') {
console.log('yes1')
if(itemSet >= 1 && itemSet <= 5) {
console.log('yes2')
if([1,2,3,4,5,6,8,9,10].includes(itemSet)) { // available valgene sets in webui
if(itemCounts[0] >= itemCounts[1]) $('#valgene-roll').attr('disabled', 'disabled')
else $('#valgene-roll').removeAttr('disabled')
} else $('#valgene-roll').attr('disabled', 'disabled')
@@ -121,6 +121,16 @@ async function loadItems(itemSet, gene_edition, items_crew, items_stamp, items_s
return 0;
}), 'nemsys', items_nemsys)
}
if('sysbg' in geneItems.items) {
$('.item_banners').append('<div style="padding: 5px"><h3>System BG</h3></div>')
$('.item_banners').append('<div class=sysbg-items style="text-align: center; background-color: #3a3a3a; padding: 20px; border-radius: 6px;"></div><br>')
loadImages(geneItems.items['sysbg'].sort(function(a, b) {
if(a.id < b.id) { return -1; }
if(a.id > b.id) { return 1; }
return 0;
}), 'sysbg', items_sysbg)
}
}
async function loadValgeneData(gene_edition) {
@@ -136,7 +146,14 @@ async function loadValgeneData(gene_edition) {
$('#set_select').append('<option value=' + valGeneData.pregene[pregeneDataIndex].id + '>' + valGeneData.pregene[pregeneDataIndex].name + '</option>')
}
}
$('#set_select').val($("#set_select option").length)
let urlParams = new URLSearchParams(window.location.search);
return (urlParams.has('set') && urlParams.get('set') !== "") ? urlParams.get('set') : $("#set_select option").length
}
function redirectAfterRoll() {
const urlParams = new URLSearchParams(location.search);
urlParams.set('set', $('#set_select').val());
location.search = urlParams;
}
$(document).ready(async function() {
@@ -146,14 +163,12 @@ $(document).ready(async function() {
return 0;
}
$('#roll-result').on('click', function(){location.reload()})
$('html').keypress(function(e){
if([13, 27, 32].includes(e.keyCode) && $('.modal.is-active').length > 0) {
location.reload()
redirectAfterRoll()
}
})
$('.input').hide()
$('.button').addClass('is-link')
let refid = document.getElementsByName("refid")[0].value
@@ -162,14 +177,16 @@ $(document).ready(async function() {
let items_subbg = JSON.parse(document.getElementById("data-pass-subbg").innerText);
let items_bgm = JSON.parse(document.getElementById("data-pass-bgm").innerText);
let items_nemsys = JSON.parse(document.getElementById("data-pass-nemsys").innerText);
let items_sysbg = JSON.parse(document.getElementById("data-pass-sysbg").innerText);
let gene_edition = document.getElementById("generator-edition").innerText;
await loadValgeneData(gene_edition)
loadItems($('#set_select').val(), gene_edition, items_crew, items_stamp, items_subbg, items_bgm, items_nemsys)
let currentSet = await loadValgeneData(gene_edition)
$('#set_select').val(currentSet)
loadItems(currentSet, gene_edition, items_crew, items_stamp, items_subbg, items_bgm, items_nemsys, items_sysbg)
$('#set_select').change(function() {
$('.count').text('')
$('.item_banners').empty()
loadItems(parseInt($('#set_select').val()), gene_edition, items_crew, items_stamp, items_subbg, items_bgm, items_nemsys)
loadItems(parseInt($('#set_select').val()), gene_edition, items_crew, items_stamp, items_subbg, items_bgm, items_nemsys, items_sysbg)
})
$('#pregene-roll, #valgene-roll').on('click', async function() {
@@ -177,22 +194,20 @@ $(document).ready(async function() {
$('#pregene-roll, #valgene-roll').attr('disabled', 'disabled')
if(gene_edition === 'premium' && window.location.search.match(/(premium)/g) != undefined) {
let geneItems = await getGeneratorEditionItems(gene_edition, parseInt($('#set_select').val()))
if(countGeneItems(geneItems, items_crew, items_stamp, items_subbg, items_bgm, items_nemsys)[0] >= countGeneItems(geneItems, items_crew, items_stamp, items_subbg, items_bgm, items_nemsys)[1]) {
if(countGeneItems(geneItems, items_crew, items_stamp, items_subbg, items_bgm, items_nemsys, items_sysbg)[0] >= countGeneItems(geneItems, items_crew, items_stamp, items_subbg, items_bgm, items_nemsys, items_sysbg)[1]) {
alert("All items have been unlocked already.")
} else {
emit('preGeneRoll', {
set: parseInt(document.getElementById('set_select').value),
refid: refid,
geneEdition: gene_edition,
items: items_crew.concat(items_stamp, items_subbg, items_bgm, items_nemsys)
items: items_crew.concat(items_stamp, items_subbg, items_bgm, items_nemsys, items_sysbg)
}).then(
function() {
$.getJSON("static/asset/logs/preGeneRollResult.json", function(data) {
$('.modal-card-head').append('<p class="modal-card-title">Rolled item!</p>')
$('.modal-card-body').append('<img style="width: 400px; padding: 10px;" src="static/asset/valgene_item/item_' + data.type + '_' + data.id + '.png">')
$('.modal-card-foot').append('<button onclick=location.reload(); class="button is-primary">Close</button>')
$('.modal').addClass('is-active')
})
function(response) {
$('.modal-card-head').append('<p class="modal-card-title">Rolled item!</p>')
$('.modal-card-body').append('<img style="width: 400px; padding: 10px;" src="static/asset/valgene_item/item_' + response['data'].type + '_' + response['data'].id + '.png">')
$('.modal-card-foot').append('<button onclick=redirectAfterRoll(); class="button is-primary">Close</button>')
$('.modal').addClass('is-active')
})
}
} else {
+25 -1
View File
@@ -146,8 +146,32 @@ $(document).ready(function() {
items_subbg = JSON.parse(document.getElementById("data-pass-subbg").innerText);
items_bgm = JSON.parse(document.getElementById("data-pass-bgm").innerText);
items_nemsys = JSON.parse(document.getElementById("data-pass-nemsys").innerText);
items_sysbg = JSON.parse(document.getElementById("data-pass-sysbg").innerText);
unlock_all = (document.getElementById("data-pass-unlock-all").innerText === 'true');
$.getJSON("static/asset/json/customize_data_ext.json", function(json) {
database = json;
for (var i in json["supportTeams"]) {
$('[name="bplSupport"]').append($('<option>', {
value: json["supportTeams"][i].id,
text: json["supportTeams"][i].name,
}));
}
$('[name="bplSupport"]').val(profile_data["bplSupport"] ? profile_data["bplSupport"] : 0);
for (var i in json["sysbg"]) {
console.log(json["sysbg"][i].id)
if(unlock_all || (items_sysbg.find(x => x.id === json["sysbg"][i].id) || json["sysbg"][i].id === 0)) {
$('[name="sysBG"]').append($('<option>', {
value: json["sysbg"][i].id,
text: json["sysbg"][i].name,
}));
}
}
$('[name="sysBG"]').val(profile_data["sysBG"] ? profile_data["sysBG"] : 0);
});
$.getJSON("static/asset/json/data.json", function(json) {
database = json;
+81 -86
View File
@@ -16,106 +16,101 @@ $(document).ready(async function() {
document.getElementById("logtextarea").textContent = 'Running....\n'
await emit("copyResourcesFromGame").then(
function(response){
document.getElementById("logtextarea").textContent += 'Done.\n'
$.getJSON( "static/asset/logs/copyResourcesFromGame.json", function( data ) {
document.getElementById("logtextarea").textContent += 'NOTE:\n- labels for these new files (nemsys, bgm, submonitor bg, chat stamps) in the asset/json/data.json file needs to be updated.\n'
document.getElementById("logtextarea").textContent += '- for converting s3p files to mp3, check guide in the notes section above.\n'
document.getElementById("logtextarea").textContent = 'Done.\n\n'
document.getElementById("logtextarea").textContent += 'NOTE:\n- labels for these new files (nemsys, bgm, submonitor bg, chat stamps) in the asset/json/data.json file needs to be updated.\n'
document.getElementById("logtextarea").textContent += '- for converting s3p files to mp3, check guide in the notes section above.\n\n\n\n'
if(data['errors'].length > 0) {
document.getElementById("logtextarea").textContent += 'Errors: \n'
$.each(data['errors'], function(key, val) {
document.getElementById("logtextarea").textContent += "- " + val + '\n'
})
document.getElementById("logtextarea").textContent += '\n\n'
}
if(response['data']['errors'].length > 0) {
document.getElementById("logtextarea").textContent += 'Errors: \n'
$.each(response['data']['errors'], function(key, val) {
document.getElementById("logtextarea").textContent += "- " + val + '\n'
})
document.getElementById("logtextarea").textContent += '\n\n'
}
if(data['versionSongs'].length > 0) {
document.getElementById("logtextarea").textContent += 'New songs in latest version data: \n'
$.each(data['versionSongs'], function(key, val) {
document.getElementById("logtextarea").textContent += "- " + val[1] + '\n'
})
document.getElementById("logtextarea").textContent += '\n\n'
}
if(response['data']['versionSongs'].length > 0) {
document.getElementById("logtextarea").textContent += 'New songs in latest version data: \n'
$.each(response['data']['versionSongs'], function(key, val) {
document.getElementById("logtextarea").textContent += "- " + val[1] + '\n'
})
document.getElementById("logtextarea").textContent += '\n\n'
}
if(data['jsonSongs'].length > 0) {
document.getElementById("logtextarea").textContent += 'New songs added to mdb asset: \n'
$.each(data['jsonSongs'], function(key, val) {
document.getElementById("logtextarea").textContent += "- " + val[1] + '\n'
})
document.getElementById("logtextarea").textContent += '\n\n'
}
if(response['data']['jsonSongs'].length > 0) {
document.getElementById("logtextarea").textContent += 'New songs added to mdb asset: \n'
$.each(response['data']['jsonSongs'], function(key, val) {
document.getElementById("logtextarea").textContent += "- " + val[1] + '\n'
})
document.getElementById("logtextarea").textContent += '\n\n'
}
if(data['xcdSongs'].length > 0) {
document.getElementById("logtextarea").textContent += 'XCD songs: \n'
$.each(data['xcdSongs'], function(key, val) {
document.getElementById("logtextarea").textContent += "- " + val[1] + '\n'
})
document.getElementById("logtextarea").textContent += '\n\n'
}
if(response['data']['xcdSongs'].length > 0) {
document.getElementById("logtextarea").textContent += 'XCD songs: \n'
$.each(response['data']['xcdSongs'], function(key, val) {
document.getElementById("logtextarea").textContent += "- " + val[1] + '\n'
})
document.getElementById("logtextarea").textContent += '\n\n'
}
if(data['nemsys'].length > 0) {
document.getElementById("logtextarea").textContent += 'New nemsys: \n'
$.each(data['nemsys'], function(key, val) {
document.getElementById("logtextarea").textContent += "- " + val + '\n'
})
document.getElementById("logtextarea").textContent += '\n\n'
}
if(response['data']['nemsys'].length > 0) {
document.getElementById("logtextarea").textContent += 'New nemsys: \n'
$.each(response['data']['nemsys'], function(key, val) {
document.getElementById("logtextarea").textContent += "- " + val + '\n'
})
document.getElementById("logtextarea").textContent += '\n\n'
}
if(data['bgm'].length > 0) {
document.getElementById("logtextarea").textContent += 'New bgm: \n'
$.each(data['bgm'], function(key, val) {
document.getElementById("logtextarea").textContent += "- " + val + '\n'
})
document.getElementById("logtextarea").textContent += '\n\n'
}
if(response['data']['bgm'].length > 0) {
document.getElementById("logtextarea").textContent += 'New bgm: \n'
$.each(response['data']['bgm'], function(key, val) {
document.getElementById("logtextarea").textContent += "- " + val + '\n'
})
document.getElementById("logtextarea").textContent += '\n\n'
}
if(data['apCard'].length > 0) {
document.getElementById("logtextarea").textContent += 'New appeal cards: \n'
$.each(data['apCard'], function(key, val) {
document.getElementById("logtextarea").textContent += "- " + val + '\n'
})
document.getElementById("logtextarea").textContent += '\n\n'
}
if(response['data']['apCard'].length > 0) {
document.getElementById("logtextarea").textContent += 'New appeal cards: \n'
$.each(response['data']['apCard'], function(key, val) {
document.getElementById("logtextarea").textContent += "- " + val + '\n'
})
document.getElementById("logtextarea").textContent += '\n\n'
}
if(data['subbg'].length > 0) {
document.getElementById("logtextarea").textContent += 'New submonitor backgrounds: \n'
$.each(data['subbg'], function(key, val) {
document.getElementById("logtextarea").textContent += "- " + val + '\n'
})
document.getElementById("logtextarea").textContent += '\n\n'
}
if(response['data']['subbg'].length > 0) {
document.getElementById("logtextarea").textContent += 'New submonitor backgrounds: \n'
$.each(response['data']['subbg'], function(key, val) {
document.getElementById("logtextarea").textContent += "- " + val + '\n'
})
document.getElementById("logtextarea").textContent += '\n\n'
}
if(data['chatStamp'].length > 0) {
document.getElementById("logtextarea").textContent += 'New chat stamps: \n'
$.each(data['chatStamp'], function(key, val) {
document.getElementById("logtextarea").textContent += "- " + val + '\n'
})
document.getElementById("logtextarea").textContent += '\n\n'
}
if(response['data']['chatStamp'].length > 0) {
document.getElementById("logtextarea").textContent += 'New chat stamps: \n'
$.each(response['data']['chatStamp'], function(key, val) {
document.getElementById("logtextarea").textContent += "- " + val + '\n'
})
document.getElementById("logtextarea").textContent += '\n\n'
}
if(data['valgeneItemFiles'].length > 0) {
document.getElementById("logtextarea").textContent += 'New valgene_item files: \n'
$.each(data['valgeneItemFiles'], function(key, val) {
document.getElementById("logtextarea").textContent += "- " + val + '\n'
})
document.getElementById("logtextarea").textContent += '\n\n'
}
if(response['data']['valgeneItemFiles'].length > 0) {
document.getElementById("logtextarea").textContent += 'New valgene_item files: \n'
$.each(response['data']['valgeneItemFiles'], function(key, val) {
document.getElementById("logtextarea").textContent += "- " + val + '\n'
})
document.getElementById("logtextarea").textContent += '\n\n'
}
// console.log(JSON.stringify(data))
if(data['akaname'].length > 0) {
document.getElementById("logtextarea").textContent += 'New akanames: \n'
$.each(data['akaname'], function(key, val) {
document.getElementById("logtextarea").textContent += "- " + val + '\n'
})
document.getElementById("logtextarea").textContent += '\n\n'
}
})
},
function(error){
console.log(error);
// console.log(JSON.stringify(data))
if(response['data']['akaname'].length > 0) {
document.getElementById("logtextarea").textContent += 'New akanames: \n'
$.each(response['data']['akaname'], function(key, val) {
document.getElementById("logtextarea").textContent += "- " + val + '\n'
})
document.getElementById("logtextarea").textContent += '\n\n'
}
}
)
}
@@ -0,0 +1,58 @@
{
"supportTeams": [
{
"id": 0,
"name": "None"
},
{
"id": 1,
"name": "APINA VRAMeS"
},
{
"id": 2,
"name": "GiGO"
},
{
"id": 3,
"name": "GamePanic"
},
{
"id": 4,
"name": "Silk Hat"
},
{
"id": 5,
"name": "SUPERNOVA Tohoku"
},
{
"id": 6,
"name": "TAITO STATION Tradz"
},
{
"id": 7,
"name": "ROUND1"
},
{
"id": 8,
"name": "Leisureland"
}
],
"sysbg": [
{
"id": 0,
"name": "Default"
},
{
"id": 1,
"name": "BOOTH"
},
{
"id": 2,
"name": "Infinite Infection"
},
{
"id": 3,
"name": "Gravity Wars"
}
]
}
@@ -113,6 +113,38 @@
"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."
},
{
"id": "kac2023perfecteater",
"type": "gift",
"enabled": true,
"name": "KONAMI Arcade Championship (2023) Entry Song",
"info": "Unlocks パーフェクトイーター / Perfect Eater."
},
{
"id": "kac2023stamp",
"type": "stamp",
"enabled": true,
"name": "KAC 2023 Special Stamp Event (累乗のカルマ)",
"info": "Stamp event to unlock 累乗のカルマ. Collect 10 stamps."
},
{
"id": "bpls3songs",
"type": "gift",
"enabled": true,
"name": "BEMANI PRO LEAGUE -SEASON 3- Triple Tribe",
"info": [
"Unlocks 'stellar rain.'",
"Unlocks 'THE PEERLESS UNDER HEAVEN.'",
"Unlocks 'suspicions.'"
]
},
{
"id": "kac2023stamp2",
"type": "stamp",
"enabled": true,
"name": "KAC 2023 Special Stamp Event (Stylus and QQ)",
"info": "Stamp select event to unlock Stylus and QQ and can be unlocked in any order. Collect 10 stamps for each song."
}
]
}
@@ -2,7 +2,7 @@
"pregene": [
{
"id": 1,
"name": "Premium Generator (Aqua Set)",
"name": "Premium Generator(この素晴らしい世界に祝福を!)- KonoSuba",
"items": {
"crew": [131],
"stamp": [69, 70, 71, 72, 73, 74, 75, 76, 77, 78],
@@ -26,6 +26,34 @@
"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]
}
},
{
"id": 4,
"name": "Premium Generator (Re:ゼロから始める異世界生活)前半",
"items": {
"crew": [139],
"stamp": [194, 195, 196, 197, 198, 199],
"subbg": [281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313]
}
},
{
"id": 5,
"name": "Premium Generator (Re:ゼロから始める異世界生活)後半",
"items": {
"crew": [140],
"stamp": [200, 201, 202, 203, 204, 205],
"subbg": [314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346]
}
},
{
"id": 6,
"name": "Premium Generator Vol. 3",
"items": {
"crew": [142],
"stamp": [239, 240, 241, 242, 243, 244, 245, 246, 247, 248],
"subbg": [359, 360, 361, 362, 363, 364, 365, 366, 367, 368],
"sysbg": [1, 2, 3]
}
}
],
"valgene":[
@@ -146,6 +174,17 @@
"bgm": [52, 53, 54, 55, 56, 57, 58, 59],
"nemsys": [35, 36, 37, 38, 39, 40, 41, 42]
}
},
{
"id": 12,
"name": "Valkyrie Generator Vol. 12",
"items":{
"crew": [141],
"stamp": [206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238],
"subbg": [347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358],
"bgm": [60, 61, 62, 63],
"nemsys": [43]
}
}
]
}
+13
View File
@@ -11,6 +11,8 @@
items_nemsys: DB.Find(refid, { collection:"item",type:20 })
items_sysbg: DB.Find(refid, { collection:"item",type:21 })
unlock_all: U.GetConfig('unlock_all_valk_items')
-
@@ -57,6 +59,11 @@ div
select(name="akaname" id="akaname_select")
//.control
input.input(type="number" step=1 name="akaname", placeholder=profile.akaname)//
.field
label.label BPL Team Supporter
.control.is-expanded
.select.is-fullwidth
select(name="bplSupport" id="bplsupport_select")
br
div(style="font-size:26px;font-weight:bold;vertical-align:top; overflow-wrap: break-word;word-break: break-all;") EXCEED GEAR VALKYRIE GENERATOR CUSTOMIZATION
.tile.is-ancestor
@@ -87,6 +94,11 @@ div
.select.is-fullwidth
select(name="bgm")
//input.input(type="number" step=1 name="bgm", placeholder=profile.bgm)
.field
label.label System Background
.control
.select.is-fullwidth
select(name="sysBG" id="sysbg_select")
.field
label.label AStamp
//span.icon.has-tooltip-right(data-tooltip="Check \"data/graphics/chat_stamp\" 000X_0Y => 4*(X-1)+Y=StampID stamp_0000_01~04 is not usable!!!")
@@ -177,5 +189,6 @@ div(hidden id='data-pass-stamp') !{JSON.stringify(items_stamp)}
div(hidden id='data-pass-subbg') !{JSON.stringify(items_subbg)}
div(hidden id='data-pass-bgm') !{JSON.stringify(items_bgm)}
div(hidden id='data-pass-nemsys') !{JSON.stringify(items_nemsys)}
div(hidden id='data-pass-sysbg') !{JSON.stringify(items_sysbg)}
div(hidden id='data-pass-unlock-all') !{unlock_all}
script(src="static/asset/js/preview.js")
@@ -9,6 +9,8 @@
prem_items_nemsys: DB.Find(refid, { collection:"item",type:20 })
prem_items_sysbg: DB.Find(refid, { collection:"item",type:21 })
unlock_all: U.GetConfig('unlock_all_valk_items')
-
@@ -48,6 +50,7 @@ div(hidden id='data-pass-stamp') !{JSON.stringify(prem_items_stamp)}
div(hidden id='data-pass-subbg') !{JSON.stringify(prem_items_subbg)}
div(hidden id='data-pass-bgm') !{JSON.stringify(prem_items_bgm)}
div(hidden id='data-pass-nemsys') !{JSON.stringify(prem_items_nemsys)}
div(hidden id='data-pass-sysbg') !{JSON.stringify(prem_items_sysbg)}
div(hidden id='data-pass-unlock-all') !{unlock_all}
div(hidden id='generator-edition') premium
script(src="static/asset/js/generator.js")
@@ -9,6 +9,8 @@
prem_items_nemsys: DB.Find(refid, { collection:"item",type:20 })
prem_items_sysbg: DB.Find(refid, { collection:"item",type:21 })
unlock_all: U.GetConfig('unlock_all_valk_items')
-
@@ -41,6 +43,7 @@ div(hidden id='data-pass-stamp') !{JSON.stringify(prem_items_stamp)}
div(hidden id='data-pass-subbg') !{JSON.stringify(prem_items_subbg)}
div(hidden id='data-pass-bgm') !{JSON.stringify(prem_items_bgm)}
div(hidden id='data-pass-nemsys') !{JSON.stringify(prem_items_nemsys)}
div(hidden id='data-pass-sysbg') !{JSON.stringify(prem_items_sysbg)}
div(hidden id='data-pass-unlock-all') !{unlock_all}
div(hidden id='generator-edition') valkyrie
script(src="static/asset/js/generator.js")