This commit is contained in:
duel0213 2025-10-04 17:38:45 +09:00
commit ebf56f009d
20 changed files with 4091 additions and 373 deletions

View File

@ -11,11 +11,18 @@ Plugin Version: **v3.0.0**
- pop'n music Usagi to Neko to Shōnen no Yume - pop'n music Usagi to Neko to Shōnen no Yume
- pop'n music peace - pop'n music peace
- pop'n music Kaimei riddles - pop'n music Kaimei riddles
- pop'n music Unilab
Important : require minimum Asphyxia Core **v1.31** Important : require minimum Asphyxia Core **v1.31**
## Changelog ## Changelog
### 4.0.0
* Unilab: Support added
* Lapistoria+ : Add Force Unlock
* Remove non-core Asphyxia data import
* Bugfix: Send correct number of Goods
### 3.0.0 ### 3.0.0
* Kaimei riddles: Support added * Kaimei riddles: Support added
* Usaneko: Add Daily Missions support * Usaneko: Add Daily Missions support
@ -57,14 +64,6 @@ Update phase data : All versions are on latest phase.
#### 1.0.0 #### 1.0.0
Initial Release. Initial Release.
## How to import data from non-core Asphyxia
To import data, you have to :
* Create your popn profile in Asphyxia-core. You just have to insert your card in the game and follow the process until coming to the select mode select screen. Once here, quit the game.
* Create a backup of your savedata.db file (in case something goes wrong).
* In the web UI of Asphyxia, go to POPN -> Profile and click detail on your profile
* Put the content of your non-core asphyxia popn music files in the text fields (pop.json and popn_scores.json) and click Import.
* Data is imported. Run the game, insert your card and your scores are available.
## Known limitations ## Known limitations
* No rival support for Tune Street * No rival support for Tune Street
* Some stats are not implemented * Some stats are not implemented

View File

@ -369,6 +369,18 @@ const getProfile = async (refid: string, name?: string) => {
player.item.push(item); player.item.push(item);
} }
if(U.GetConfig("enable_force_unlock")) {
for(let i = 1; i <= GAME_MAX_MUSIC_ID; i++) {
player.item.push({
type: K.ITEM('u8', 0),
id: K.ITEM('u16', i),
param: K.ITEM('u16', 15),
is_new: K.ITEM('bool', 0),
get_time: K.ITEM('u64', BigInt(0)),
});
}
}
// Add version specific datas // Add version specific datas
const params = await utils.readParams(refid, version); const params = await utils.readParams(refid, version);
utils.addExtraData(player, params, extraData); utils.addExtraData(player, params, extraData);

View File

@ -275,6 +275,18 @@ const getProfile = async (refid: string, name?: string) => {
player.item.push(item); player.item.push(item);
} }
if(U.GetConfig("enable_force_unlock")) {
for(let i = 1; i <= GAME_MAX_MUSIC_ID; i++) {
player.item.push({
type: K.ITEM('u8', 0),
id: K.ITEM('u16', i),
param: K.ITEM('u16', 15),
is_new: K.ITEM('bool', 0),
get_time: K.ITEM('u64', BigInt(0)),
});
}
}
// Add version specific datas // Add version specific datas
const params = await utils.readParams(refid, version); const params = await utils.readParams(refid, version);
utils.addExtraData(player, params, extraData); utils.addExtraData(player, params, extraData);

View File

@ -1,5 +1,5 @@
import { AchievementsUsaneko } from "../models/achievements"; import { AchievementsUsaneko } from "../models/achievements";
import { ExtraData, Params, Phase } from "../models/common"; import { ExtraData, Phase } from "../models/common";
import * as utils from "./utils"; import * as utils from "./utils";
export const setRoutes = () => { export const setRoutes = () => {
@ -37,7 +37,7 @@ const getInfoCommon = (req: EamuseInfo) => {
} }
// Choco // Choco
for (let i = 1; i <= 5; ++i) { for (let i = 0; i < 5; ++i) {
result.choco.push({ result.choco.push({
choco_id: K.ITEM('s16', i), choco_id: K.ITEM('s16', i),
param: K.ITEM('s32', -1), param: K.ITEM('s32', -1),
@ -45,8 +45,8 @@ const getInfoCommon = (req: EamuseInfo) => {
} }
// Goods // Goods
for (let i = 1; i <= 98; ++i) { for (let i = 0; i < GAME_MAX_DECO_ID[version]; ++i) {
let price = 200; let price = 250;
if (i < 15) { if (i < 15) {
price = 30; price = 30;
} else if (i < 30) { } else if (i < 30) {
@ -55,10 +55,12 @@ const getInfoCommon = (req: EamuseInfo) => {
price = 60; price = 60;
} else if (i < 60) { } else if (i < 60) {
price = 80; price = 80;
} else if (i < 98) {
price = 200;
} }
result.goods.push({ result.goods.push({
item_id: K.ITEM('s32', i), item_id: K.ITEM('s32', i + 1),
item_type: K.ITEM('s16', 3), item_type: K.ITEM('s16', 3),
price: K.ITEM('s32', price), price: K.ITEM('s32', price),
goods_type: K.ITEM('s16', 0), goods_type: K.ITEM('s16', 0),
@ -66,13 +68,15 @@ const getInfoCommon = (req: EamuseInfo) => {
} }
// Area // Area
for (let i = 1; i <= 16; ++i) { if(version == 'v24') {
result.area.push({ for (let i = 0; i < 16; ++i) {
area_id: K.ITEM('s16', i), result.area.push({
end_date: K.ITEM('u64', BigInt(0)), area_id: K.ITEM('s16', i),
medal_id: K.ITEM('s16', i), end_date: K.ITEM('u64', BigInt(0)),
is_limit: K.ITEM('bool', 0), medal_id: K.ITEM('s16', i),
}); is_limit: K.ITEM('bool', 0),
});
}
} }
// TODO : Course ranking // TODO : Course ranking
@ -388,7 +392,7 @@ const getProfile = async (refid: string, version: string, name?: string) => {
// Add version specific datas // Add version specific datas
let params = await utils.readParams(refid, version); let params = await utils.readParams(refid, version);
utils.addExtraData(player, params, EXTRA_DATA); utils.addExtraData(player, params, getExtraData(version));
const achievements = <AchievementsUsaneko>await utils.readAchievements(refid, version, { ...defaultAchievements, version }); const achievements = <AchievementsUsaneko>await utils.readAchievements(refid, version, { ...defaultAchievements, version });
@ -462,6 +466,18 @@ const getProfile = async (refid: string, version: string, name?: string) => {
}); });
} }
if(U.GetConfig("enable_force_unlock")) {
for(let i = 1; i <= GAME_MAX_MUSIC_ID[version]; i++) {
player.item.push({
type: K.ITEM('u8', 0),
id: K.ITEM('u16', i),
param: K.ITEM('u16', 15),
is_new: K.ITEM('bool', 0),
get_time: K.ITEM('u64', BigInt(0)),
});
}
}
// Usaneko events // Usaneko events
if (version == 'v24') { if (version == 'v24') {
const date = new Date(); const date = new Date();
@ -542,6 +558,34 @@ const getProfile = async (refid: string, version: string, name?: string) => {
} }
} }
// Unilab events
if (version == 'v27') {
const teams = achievements.team || [];
const batteries = achievements.battery || [];
player.event_p27.first_play = K.ITEM('bool', teams.length == 0);
player.event_p27.elem_first_play = K.ITEM('bool', batteries.length == 0);
player.event_p27.team = [];
for (const team of teams) {
player.event_p27.team.push({
team_id: K.ITEM('s16', team.team_id || 0),
ex_no: K.ITEM('s16', team.ex_no || 0),
point: K.ITEM('u32', team.point || 0),
is_cleared: K.ITEM('bool', team.is_cleared || false),
});
};
player.event_p27.battery = [];
for (const battery of batteries) {
player.event_p27.battery.push({
battery_id: K.ITEM('s16', battery.battery_id || 0),
energy: K.ITEM('u32', battery.energy || 0),
is_cleared: K.ITEM('bool', battery.is_cleared || false),
});
};
}
return player; return player;
} }
@ -557,7 +601,7 @@ const write = async (req: EamuseInfo, data: any, send: EamuseSend): Promise<any>
const params = await utils.readParams(refid, version); const params = await utils.readParams(refid, version);
const achievements = <AchievementsUsaneko>await utils.readAchievements(refid, version, { ...defaultAchievements, version }); const achievements = <AchievementsUsaneko>await utils.readAchievements(refid, version, { ...defaultAchievements, version });
utils.getExtraData(data, params, EXTRA_DATA); utils.getExtraData(data, params, getExtraData(version, true));
// areas // areas
let areas = _.get(data, 'area', []); let areas = _.get(data, 'area', []);
@ -753,6 +797,59 @@ const write = async (req: EamuseInfo, data: any, send: EamuseSend): Promise<any>
} }
} }
// Unilab (v27)
if (version == 'v27') {
let eventData = _.get(data, 'event_p27', []);
let team = _.get(eventData, 'team', null);
if(_.isPlainObject(team)) {
if (_.isNil(achievements.team)) {
achievements.team = [];
}
const team_id = $(team).number('team_id');
const ex_no = $(team).number('ex_no');
const point = $(team).number('point');
const is_cleared = $(team).bool('is_cleared');
let savedTeam = _.find(achievements.team, {'team_id': team_id});
if(_.isUndefined(savedTeam)) {
achievements.team.push({
team_id,
ex_no,
point,
is_cleared
});
} else {
savedTeam.ex_no = ex_no;
savedTeam.point = point;
savedTeam.is_cleared = is_cleared;
}
}
let battery = _.get(eventData, 'battery', null);
if(_.isPlainObject(battery)) {
if (_.isNil(achievements.battery)) {
achievements.battery = [];
}
const battery_id = $(battery).number('battery_id');
const energy = $(battery).number('energy');
const is_cleared = $(battery).bool('is_cleared');
let savedBattery = _.find(achievements.battery, {'battery_id': battery_id});
if(_.isUndefined(savedBattery)) {
achievements.battery.push({
battery_id,
energy,
is_cleared
});
} else {
savedBattery.energy = energy;
savedBattery.is_cleared = is_cleared;
}
}
}
await utils.writeParams(refid, version, params); await utils.writeParams(refid, version, params);
await utils.writeAchievements(refid, version, achievements); await utils.writeAchievements(refid, version, achievements);
@ -794,6 +891,9 @@ const friend = async (req: EamuseInfo, data: any, send: EamuseSend): Promise<any
const getPhase = (version: String): Phase[] => { const getPhase = (version: String): Phase[] => {
let phase = []; let phase = [];
switch(version) { switch(version) {
case 'v27':
phase = PHASE['v27'];
break;
case 'v26': case 'v26':
phase = PHASE['v26']; phase = PHASE['v26'];
case 'v25': case 'v25':
@ -804,6 +904,23 @@ const getPhase = (version: String): Phase[] => {
return _.sortBy(phase, 'id'); return _.sortBy(phase, 'id');
} }
const getExtraData = (version: String, full: boolean = false): ExtraData => {
let extraData = EXTRA_DATA_COMMON;
if (full) {
extraData = _.merge(extraData, EXTRA_DATA_V27, EXTRA_DATA_V26);
} else {
switch(version) {
case 'v27':
extraData = _.merge(extraData, EXTRA_DATA_V27);
break;
case 'v26':
extraData = _.merge(extraData, EXTRA_DATA_V26);
break;
}
}
return extraData;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
let isOmni = false; let isOmni = false;
@ -814,9 +931,11 @@ const getVersion = (req: EamuseInfo): string => {
} }
const date: number = parseInt(req.model.match(/:(\d*)$/)[1]); const date: number = parseInt(req.model.match(/:(\d*)$/)[1]);
if (date > 2020120900) { if (date >= 2022091300) {
return 'v27';
} else if (date >= 2021042600 && date < 2022091300) {
return 'v26'; return 'v26';
} else if (date >= 2018101700 && date <= 2020120900) { } else if (date >= 2018101700 && date < 2021042600 ) {
return 'v25'; return 'v25';
} else { } else {
return 'v24'; return 'v24';
@ -826,7 +945,15 @@ const getVersion = (req: EamuseInfo): string => {
const GAME_MAX_MUSIC_ID = { const GAME_MAX_MUSIC_ID = {
v24: 1704, v24: 1704,
v25: 1877, v25: 1877,
v26: 2019 v26: 2019,
v27: 2188
}
const GAME_MAX_DECO_ID = {
v24: 97,
v25: 133,
v26: 133,
v27: 81
} }
const defaultAchievements: AchievementsUsaneko = { const defaultAchievements: AchievementsUsaneko = {
@ -840,64 +967,71 @@ const defaultAchievements: AchievementsUsaneko = {
stamps: {}, stamps: {},
riddles: {}, riddles: {},
missions: {}, missions: {},
team: [],
battery: []
} }
const PHASE = { const PHASE = {
v24: [ v24: [
{ id: 0, p: 11 }, // Default song phase availability (0-11) { id: 0, p: 11 }, // Default song phase availability (0-11)
{ id: 1, p: 2 }, { id: 1, p: 2 }, // Unknown event (0-2)
{ id: 2, p: 2 }, { id: 2, p: 2 }, // Holiday Greeting (0-2)
{ id: 3, p: 4 }, { id: 3, p: 4 }, // Unknown event (0-2)
{ id: 4, p: 1 }, { id: 4, p: 1 }, // Unknown event (0-1)
{ id: 5, p: 0 }, // Enable Net Taisen (0-1) { id: 5, p: 0 }, // Enable Net Taisen (0-1)
{ id: 6, p: 1 }, // Enable NAVI-kun shunkyoku toujou, allows song 1608 to be unlocked (0-1) { id: 6, p: 1 }, // Enable NAVI-kun shunkyoku toujou, allows song 1608 to be unlocked (0-1)
{ id: 7, p: 1 }, { id: 7, p: 1 }, // Unknown event (0-1)
{ id: 8, p: 2 }, { id: 8, p: 2 }, // Unknown event (0-2)
{ id: 9, p: 2 }, // Daily Mission (0-2) { id: 9, p: 2 }, // Daily Mission (0-2)
{ id: 10, p: 15 }, // NAVI-kun Song phase availability (0-15) { id: 10, p: 15 }, // NAVI-kun Song phase availability (0-15)
{ id: 11, p: 1 }, { id: 11, p: 1 }, // Unknown event (0-1)
{ id: 12, p: 2 }, { id: 12, p: 2 }, // Unknown event (0-2)
{ id: 13, p: 1 }, // Enable Pop'n Peace preview song (0-1) { id: 13, p: 1 }, // Enable Pop'n Peace preview song (0-1)
], ],
v25: [ v25: [
{ id: 0, p: 23 }, { id: 0, p: 23 }, // Default song phase availability (0-23)
{ id: 1, p: 4 }, { id: 1, p: 4 }, // Unknown event (0-4)
{ id: 10, p: 30 }, { id: 10, p: 30 }, // NAVI-kun Song phase availability (0-30)
// New params { id: 14, p: 39 }, // Stamp Card Rally (0-39)
{ id: 14, p: 39 }, { id: 15, p: 2 }, // Unknown event (0-2)
{ id: 15, p: 2 }, { id: 16, p: 3 }, // Unknown event (0-3)
{ id: 16, p: 3 }, { id: 17, p: 8 }, // Unknown event (0-8)
{ id: 17, p: 8 }, { id: 18, p: 1 }, // FLOOR INFECTION event (0-1)
{ id: 18, p: 1 }, { id: 19, p: 1 }, // Pop'n music × NOSTALGIA kyouenkai (0-1)
{ id: 19, p: 1 }, { id: 20, p: 13 }, // Event archive (0-13)
{ id: 20, p: 13 }, { id: 21, p: 20 }, // Pop'n event archive (0-20)
{ id: 21, p: 20 }, // pop'n event archive { id: 22, p: 2 }, // バンめし♪ ふるさとグランプリ (0-2)
{ id: 22, p: 2 }, { id: 23, p: 1 }, // いちかのBEMANI投票選抜戦2019 (0-1)
{ id: 23, p: 1 }, { id: 24, p: 1 }, // ダンキラ!!! × pop'n music (0-1)
{ id: 24, p: 1 },
], ],
v26: [ v26: [
// Music phase { id: 0, p: 30 }, // Music phase (0: No unlock, 1-30: steps)
// Phase 24: Seize The Day, 知りたい
// Phase 25: Triple Cross
// Phase 26: GO²TOS, Jailbreaker
// Phase 27: Aftermath
// Phase 28: 「Sweet Love」
// Phase 29: GET WILD (UPPER), シュガーソングとビターステップ (UPPER)
// Phase 30 (MAX): 群像夏
{ id: 0, p: 30 },
// New params
{ id: 25, p: 62 }, // M&N event (0: disable, 62: all characters) { id: 25, p: 62 }, // M&N event (0: disable, 62: all characters)
{ id: 26, p: 3 }, // Unknown event (0-3) { id: 26, p: 3 }, // Unknown event (0-3)
{ id: 27, p: 2 }, // peace soundtrack hatsubai kinen SP (0: not started, 1: enabled, 2: ended) { id: 27, p: 2 }, // peace soundtrack hatsubai kinen SP (0: not started, 1: enabled, 2: ended)
{ id: 28, p: 2 }, // MZD no kimagure tanteisha joshu (0: not started, 1: enabled, 2: ended) { id: 28, p: 2 }, // MZD no kimagure tanteisha joshu (0: not started, 1: enabled, 2: ended)
{ id: 29, p: 5 }, // Shutchou! pop'n quest Lively (0: not started, 1-4: step enabled, 5: ended) { id: 29, p: 5 }, // Shutchou! pop'n quest Lively (0: not started, 1-4: step enabled, 5: ended)
{ id: 30, p: 6 }, // Shutchou! pop'n quest Lively II (0: not started, 1-5: step enabled, 6: ended) { id: 30, p: 6 }, // Shutchou! pop'n quest Lively II (0: not started, 1-5: step enabled, 6: ended)
],
v27: [
{ id: 0, p: 6 }, // Music phase (0: No unlock, 1-6: steps)
{ id: 1, p: 6 }, // Shutchou! pop'n quest Lively II (0: not started, 1-5: steps, 6: ended)
{ id: 2, p: 4 }, // KAC 2023 (0/2/4: disabled, 1: Caldwell 99, 3: Hexer / mathematical good-bye)
{ id: 3, p: 0 }, // Net Taisen (0: diabled, 1: enabled, 2: enabled + local)
{ id: 4, p: 7 }, // Unknown event (0-7)
{ id: 5, p: 48 }, // Narunaru♪ UniLab jikkenshitsu! event (0: not started, 1-47: steps, 48: ended)
{ id: 6, p: 2 }, // Super Unilab BOOST! (0: disabled, 1: enabled, 2: ended)
{ id: 7, p: 6 }, // Unknown event (0-6)
{ id: 8, p: 2 }, // Unknown event (0-2)
{ id: 9, p: 44 }, // Kakusei no Elem event (0: not started, 1-44: steps)
{ id: 10, p: 1 }, // Awakening Elem (0: disabled, 1: enabled)
{ id: 11, p: 2 }, // CanCan's Super Awakening Boost (0: disabled, 1: enabled, 2: ended)
{ id: 12, p: 2 }, // Unknown event (0-2)
{ id: 13, p: 2 }, // Unknown event (0-2)
] ]
} }
const EXTRA_DATA: ExtraData = { const EXTRA_DATA_COMMON: ExtraData = {
play_id: { type: 's32', path: 'account', default: 0 }, play_id: { type: 's32', path: 'account', default: 0 },
start_type: { type: 's8', path: 'account', default: 0 }, start_type: { type: 's8', path: 'account', default: 0 },
tutorial: { type: 's16', path: 'account', default: -1 }, tutorial: { type: 's16', path: 'account', default: -1 },
@ -923,15 +1057,6 @@ const EXTRA_DATA: ExtraData = {
player_point: { type: 's32', path: 'account', default: 300 }, player_point: { type: 's32', path: 'account', default: 300 },
power_point_list: { type: 's32', path: 'account', default: [0], isArray: true }, power_point_list: { type: 's32', path: 'account', default: [0], isArray: true },
//v26
card_again_count: { type: 's16', path: 'account', default: 0 },
sp_riddles_id: { type: 's16', path: 'account', default: -1 },
point: { type: 'u32', path: 'event2021', default: 0 }, // for peace soundtrack hatsubai kinen SP
step: { type: 'u8', path: 'event2021', default: 0 }, // for Shutchou! pop'n quest Lively
quest_point: { type: 'u32', path: 'event2021', default: Array(8).fill(0), isArray: true }, // for Shutchou! pop'n quest Lively
step_nos: { type: 'u8', path: 'event2021', default: 0 }, // for Shutchou! pop'n quest Lively II
quest_point_nos: { type: 'u32', path: 'event2021', default: Array(13).fill(0), isArray: true }, // for Shutchou! pop'n quest Lively II
mode: { type: 'u8', path: 'config', default: 0 }, mode: { type: 'u8', path: 'config', default: 0 },
chara: { type: 's16', path: 'config', default: 0 }, chara: { type: 's16', path: 'config', default: 0 },
music: { type: 's16', path: 'config', default: 0 }, music: { type: 's16', path: 'config', default: 0 },
@ -973,3 +1098,21 @@ const EXTRA_DATA: ExtraData = {
comment_1: { type: 'u16', path: 'customize', default: 0 }, comment_1: { type: 'u16', path: 'customize', default: 0 },
comment_2: { type: 'u16', path: 'customize', default: 0 }, comment_2: { type: 'u16', path: 'customize', default: 0 },
} }
const EXTRA_DATA_V26: ExtraData = {
card_again_count: { type: 's16', path: 'account', default: 0 },
sp_riddles_id: { type: 's16', path: 'account', default: -1 },
point: { type: 'u32', path: 'event2021', default: 0 }, // for peace soundtrack hatsubai kinen SP
step: { type: 'u8', path: 'event2021', default: 0 }, // for Shutchou! pop'n quest Lively
quest_point: { type: 'u32', path: 'event2021', default: Array(8).fill(0), isArray: true }, // for Shutchou! pop'n quest Lively
step_nos: { type: 'u8', path: 'event2021', default: 0 }, // for Shutchou! pop'n quest Lively II
quest_point_nos: { type: 'u32', path: 'event2021', default: Array(13).fill(0), isArray: true }, // for Shutchou! pop'n quest Lively II
}
const EXTRA_DATA_V27: ExtraData = {
lift: { type: 'bool', path: 'option', default: 0 },
lift_rate: { type: 's16', path: 'option', default: 0 },
team_id: { type: 's16', path: 'event_p27', default: 0 },
select_battery_id: { type: 's16', path: 'event_p27', default: 1 },
today_first_play: { type: 'bool', path: 'event_p27', default: 1 },
}

View File

@ -1,32 +0,0 @@
import { Profile, Scores } from "../models/common";
export const importPnmData = async (data: {
refid: string;
profile: string;
scores: string;
}) => {
const profile = JSON.parse(data.profile);
const scores = JSON.parse(data.scores);
await DB.Update<Profile>(
data.refid,
{ collection: 'profile' },
{
$set: {
...profile
}
}
);
await DB.Upsert<Scores>(
data.refid,
{ collection: 'scores' },
{
$set: {
scores: {
...scores
}
}
}
);
};

View File

@ -4,7 +4,6 @@ import * as sunny from "./handler/sunny";
import * as lapistoria from "./handler/lapistoria"; import * as lapistoria from "./handler/lapistoria";
import * as eclale from "./handler/eclale"; import * as eclale from "./handler/eclale";
import * as usaneko from "./handler/usaneko"; import * as usaneko from "./handler/usaneko";
import { importPnmData } from "./handler/webui";
import { Rivals } from "./models/common"; import { Rivals } from "./models/common";
const getVersion = (req: any) => { const getVersion = (req: any) => {
@ -30,7 +29,12 @@ export function register() {
default: true, default: true,
}); });
R.WebUIEvent('importPnmData', importPnmData); R.Config("enable_force_unlock", {
name: "Unlock all songs",
desc: "Force unlocking all songs (Lapistoria and later).",
type: "boolean",
default: true,
});
R.WebUIEvent('updatePnmPlayerInfo', async (data: any) => { R.WebUIEvent('updatePnmPlayerInfo', async (data: any) => {
await DB.Update(data.refid, { collection: 'profile' }, { $set: { name: data.name } }); await DB.Update(data.refid, { collection: 'profile' }, { $set: { name: data.name } });

View File

@ -122,4 +122,20 @@ export interface AchievementsUsaneko extends Achievements {
other_count: number; other_count: number;
}; };
}; };
team: Team[];
battery: Battery[]
}
interface Team {
team_id: number;
ex_no: number;
point: number;
is_cleared: boolean;
}
interface Battery {
battery_id: number;
energy: number;
is_cleared: boolean;
} }

View File

@ -1,11 +0,0 @@
$('#import-click').on('click', () => {
data = {
refid: $('#refid').val(),
profile: $('#profile').val(),
scores: $('#scores').val()
}
emit('importPnmData', data).then(() => {
$('#import-success').removeClass("is-hidden");
});
});

View File

@ -61,26 +61,4 @@ div
div div
label There is a limit of 4 rivals maximum (only the 2 firsts will be used for Sunny Park and lower). label There is a limit of 4 rivals maximum (only the 2 firsts will be used for Sunny Park and lower).
div div
label The score sharing option also affect scores get from rivals. label The score sharing option also affect scores get from rivals.
.card
.card-header
p.card-header-title
span.icon
i.mdi.mdi-account-edit
| Import data
.card-content
.field
label.label Import data from previous Asphyxia (non-core)
.field
input.input(type="text" id="profile" name="profile" placeholder="Put content of popn.json")
.field
input.input(type="text" id="scores" name="scores" placeholder="Put content of popn_scores.json")
.field
label.help.is-danger /!\ Please backup your savedata.db before importing data /!\
.field
button.button.is-primary#import-click
span.icon
i.mdi.mdi-file-import-outline
span Import
script(src="static/js/profile_page.js")

View File

@ -1,4 +1,5 @@
export const EVENT6 = [ export let EVENT6 = [
'SERIALCODE_JP',
'DEMOGAME_PLAY', 'DEMOGAME_PLAY',
'MATCHING_MODE', 'MATCHING_MODE',
'MATCHING_MODE_FREE_IP', 'MATCHING_MODE_FREE_IP',
@ -39,13 +40,25 @@ export const EVENT6 = [
'SUBBG_DISABLE', 'SUBBG_DISABLE',
'NEMSYS_DISABLE', 'NEMSYS_DISABLE',
'S_PUC_EFFECT_ENABLE', 'S_PUC_EFFECT_ENABLE',
'BEGINNER_MUSIC_FOLDER', 'BEGINNER_MUSIC_FOLDER\t56,78,80,86,87,91,111,135,128,134,275,278,180,469,697,770,769,779,842,948,940,1057',
'BEGINNER_MUSIC_FOLDER\t1056,1096,1062,932,1222,1136,1341,1297,1441,1472,1446,1455,1469,1475,1454,1449,1448,1540,1453,1456,1447,1451,1452,1480,1458,1457,1450,1657,1649,1471',
'BEGINNER_MUSIC_FOLDER\t1735,1658,1756,1757,1754,1755,1758,1753,1749,1812,1820,1817,1741,1739,1740,1867,1871,1866,1872,1861,1858,1860,1862,1857,1903,1904,1859,1863,1856,1864,1865,1911,1916,1917,1914,1915,1918,1960',
'PLAYER_RADAR_ENABLE', 'PLAYER_RADAR_ENABLE',
'SINGLE_BATTLE_ENABLE', 'SINGLE_BATTLE_ENABLE',
// 'USE_CUDA_VIDEO_PRESENTER' // 'SUBMONITOR_VSYNC_ENABLE',
'USE_CUDA_VIDEO_PRESENTER',
'CHARACTER_IGNORE_DISABLE\t122,123,131,139,140,143,149,160,162,163',
'SUBBG_IGNORE_DISABLE\t166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,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',
'SUBBG_IGNORE_DISABLE\t312,313,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,369,370,371,372,373,374,375,376,377,378,379,380,381,419,420,421',
'SUBBG_IGNORE_DISABLE\t422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482',
'STAMP_IGNORE_DISABLE\t273~312,773~820,993~1032,1245~1284,1469~1508',
'HEXA_OVERDRIVE_ENABLE\t1,2,3,4,5,6,7,8,9,10,11,12',
'TAMAADV_ENABLE',
'CAMERA_CALIBRATION_TEST_MENU_ENABLE',
'APRIL_RAINBOW_LINE_ACTIVE'
]; ];
export const COURSES6 = [ export let COURSES6 = [
{ {
id: 1, id: 1,
name: 'SKILL ANALYZER 第1回 Aコース', name: 'SKILL ANALYZER 第1回 Aコース',
@ -2818,7 +2831,7 @@ export const COURSES6 = [
} }
]; ];
export const SDVX_AUTOMATION_SONGS = [ export let SDVX_AUTOMATION_SONGS = [
1, 1,
2, 2,
3, 3,
@ -2893,6 +2906,7 @@ export const SDVX_AUTOMATION_SONGS = [
228, 228,
229, 229,
239, 239,
241,
247, 247,
250, 250,
251, 251,
@ -2940,6 +2954,7 @@ export const SDVX_AUTOMATION_SONGS = [
376, 376,
377, 377,
381, 381,
390,
393, 393,
398, 398,
408, 408,
@ -3051,7 +3066,7 @@ export const SDVX_AUTOMATION_SONGS = [
787, 787,
]; ];
export const SDVX_AUTOMATION_SONGS_2 = [ export let SDVX_AUTOMATION_SONGS_2 = [
788, 788,
789, 789,
790, 790,
@ -3284,7 +3299,7 @@ export const SDVX_AUTOMATION_SONGS_2 = [
1280, 1280,
] ]
const SDVX_AUTOMATION_SONGS_3 = [ export let SDVX_AUTOMATION_SONGS_3 = [
1281, 1281,
1282, 1282,
1300, 1300,
@ -3504,8 +3519,7 @@ const SDVX_AUTOMATION_SONGS_3 = [
99004, 99004,
] ]
export let EXTENDS6 = [
export const EXTENDS6 = [
{ {
id: 91, id: 91,
type: 17, type: 17,
@ -3553,9 +3567,26 @@ export const EXTENDS6 = [
'', '',
'', '',
], ],
},
{
id: 94,
type: 20,
params: [
0,
0,
0,
0,
0,
'0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19',
'',
'',
'',
'',
],
} }
]; ];
var ITEM_TYPE_CREW = 11 var ITEM_TYPE_CREW = 11
var ITEM_TYPE_APPEAL = 15 var ITEM_TYPE_APPEAL = 15
var ITEM_TYPE_STAMP = 17 var ITEM_TYPE_STAMP = 17

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,6 @@
import { EVENT6, COURSES6, EXTENDS6, VALGENE6 } from '../data/exg'; import { EVENT6, COURSES6, EXTENDS6, VALGENE6 } from '../data/exg';
import {getVersion, getRandomIntInclusive} from '../utils'; import {getVersion, getRandomIntInclusive} from '../utils';
import fs from 'fs';
export const informationString = export const informationString =
`[sz:120] [olc:555555][ol:4][c:ff3333,3333ff,77ff77]Asphyxia `[sz:120] [olc:555555][ol:4][c:ff3333,3333ff,77ff77]Asphyxia
@ -32,17 +33,15 @@ export const common: EPR = async (info, data, send) => {
let courses = []; let courses = [];
let extend = []; let extend = [];
console.log("Calling common function"); console.log("Calling common function");
let exg_data_json = JSON.parse(fs.readFileSync('./plugins/sdvx@asphyxia/data/exg_data.json', 'utf8'));
const version = parseInt(info.model.split(":")[4]);
events = EVENT6;
courses = COURSES6;
// EXTENDS6.forEach(val => extend.push(Object.assign({}, val)));
extend = EXTENDS6;
extend = extend.concat(exg_data_json.extends_data);
// extend = extend.concat(exg_data.extends_data);
switch (info.method) {
case 'sv6_common': {
events = EVENT6;
courses = COURSES6;
EXTENDS6.forEach(val => extend.push(Object.assign({}, val)));
break;
}
}
let songs = []; let songs = [];
if (U.GetConfig('unlock_all_songs')) { if (U.GetConfig('unlock_all_songs')) {
@ -258,8 +257,8 @@ export const common: EPR = async (info, data, send) => {
season: K.ITEM('s32',3), season: K.ITEM('s32',3),
rule: K.ITEM('s32',0), rule: K.ITEM('s32',0),
rank_match_target: K.ARRAY('s32', [ rank_match_target: K.ARRAY('s32', [
1,1,1,1, 2,2,2,2,
1,1,1,1, 2,2,2,2,
1,1,1,1, 1,1,1,1,
1,1,1,1, 1,1,1,1,
0,0,0,0, 0,0,0,0,
@ -286,6 +285,9 @@ export const common: EPR = async (info, data, send) => {
item_type: K.ITEM('s32', c.item_type), item_type: K.ITEM('s32', c.item_type),
item_id: K.ITEM('s32', c.item_id), item_id: K.ITEM('s32', c.item_id),
})), })),
},
invest:{
limit_date: K.ITEM('u64',BigInt(newTime)),
} }
}, },
{ encoding: 'utf8' } { encoding: 'utf8' }

View File

@ -19,6 +19,7 @@ function unlockNavigators(items: Partial<Item>[]) {
console.log("Unlocking Navigators"); console.log("Unlocking Navigators");
// 10 genesis card for MITSURU's voice // 10 genesis card for MITSURU's voice
items.push({ type: 4, id: 599, param: 10 }); items.push({ type: 4, id: 599, param: 10 });
// items.push({ type: 21, id: 1, param: 1 });
return items; return items;
} }
@ -29,6 +30,16 @@ function unlockAppealCards(items: Partial<Item>[]) {
return items; return items;
} }
function unlock_all_valkgen(items: Partial<Item>[]) {
// for (let i = 0; i < 500; ++i) items.push({ type: 17, id: i, param: 1 }); // stamp
// for (let i = 0; i < 600; ++i) items.push({ type: 18, id: i, param: 1 }); // subbg
// for (let i = 0; i < 100; ++i) items.push({ type: 19, id: i, param: 1 }); // bgm
// for (let i = 0; i < 100; ++i) items.push({ type: 20, id: i, param: 1 }); // nemsys
// for (let i = 0; i < 30; ++i) items.push({ type: 21, id: i, param: 1 }); // mainbg
return items;
}
export const loadScore: EPR = async (info, data, send) => { export const loadScore: EPR = async (info, data, send) => {
console.log("Now loading score"); console.log("Now loading score");
const version = Math.abs(getVersion(info)); const version = Math.abs(getVersion(info));
@ -364,6 +375,7 @@ export const load: EPR = async (info, data, send) => {
let tempItem = U.GetConfig('unlock_all_navigators') ? unlockNavigators(items) : items; let tempItem = U.GetConfig('unlock_all_navigators') ? unlockNavigators(items) : items;
tempItem = U.GetConfig('unlock_all_appeal_cards') ? unlockAppealCards(tempItem) : tempItem; tempItem = U.GetConfig('unlock_all_appeal_cards') ? unlockAppealCards(tempItem) : tempItem;
tempItem = unlock_all_valkgen(tempItem);
// Make generator power always 100%, // Make generator power always 100%,
for (let i = 0; i < 50; i++) { for (let i = 0; i < 50; i++) {

View File

@ -6,6 +6,8 @@ import { Mix } from '../models/mix';
import { fstat } from 'fs'; import { fstat } from 'fs';
import { error } from 'console'; import { error } from 'console';
import { setMaxIdleHTTPParsers } from 'http'; import { setMaxIdleHTTPParsers } from 'http';
import { unpackS3P } from '../s3p';
import { secureHeapUsed } from 'crypto';
export const updateProfile = async (data: { export const updateProfile = async (data: {
refid: string; refid: string;
@ -203,7 +205,7 @@ export const deleteMix = async (data: { code: string }) => {
export const make_hexa_easier = async(data:{ export const make_hexa_easier = async(data:{
refid:string; refid:string;
}) => { }, send: WebUISend) => {
let all_hexa = await DB.Find<Item>(data.refid, { collection: 'item' ,type:16 }) let all_hexa = await DB.Find<Item>(data.refid, { collection: 'item' ,type:16 })
let playedNum = [] // Prevent previous unlocked hexa from being locked again let playedNum = [] // Prevent previous unlocked hexa from being locked again
all_hexa.forEach((item:Item)=>{ all_hexa.forEach((item:Item)=>{
@ -213,7 +215,7 @@ export const make_hexa_easier = async(data:{
} }
}); });
for(let i = 1; i <= 50; i++){ // Hexa Diver 7, up to id = 50 for(let i = 1; i <= 71; i++){ // Hexa Diver 7, up to id = 50
if(!playedNum.includes(i)){ if(!playedNum.includes(i)){
await DB.Upsert<Item>( await DB.Upsert<Item>(
data.refid, data.refid,
@ -222,19 +224,29 @@ export const make_hexa_easier = async(data:{
) )
} }
} }
send.json({status:"ok"})
} }
export const converted_received = async (data: { zip_file:any }, send: WebUISend) => {
}
export const import_assets = async (data: { path: string }, send: WebUISend) => { export const import_assets = async (data: { path: string }, send: WebUISend) => {
// await init(wasmUrl);
// let ffmpeg = await Wasmer.fromRegistry("wasmer/ffmpeg");
let Admzip = require('../../_shared/lib/adm-zip')
let path = data.path let path = data.path
console.log(path) console.log(path)
let fs = require('fs') let fs = require('fs')
if (!fs.existsSync(path + '/data/graphics/')) { if (!fs.existsSync(path + '/data/graphics/')) {
console.log('Path does not exist.') console.log('Path for Graphics does not exist.')
send.error(400,'Path does not exist.') send.error(400,'Path for Graphics does not exist.')
return return
} }
await fs.promises.cp(path + "/data/graphics/ap_card", './plugins/sdvx@asphyxia/webui/asset/ap_card', {recursive: true}).catch((err: any) => { await fs.promises.cp(path + "/data/graphics/ap_card", './plugins/sdvx@asphyxia/webui/asset/ap_card', {recursive: true}).catch((err: any) => {
console.log(err) console.log(err)
}) })
@ -247,6 +259,210 @@ export const import_assets = async (data: { path: string }, send: WebUISend) =>
await fs.promises.cp(path + "/data/graphics/submonitor_bg", './plugins/sdvx@asphyxia/webui/asset/submonitor_bg', {recursive: true}).catch((err: any) => { await fs.promises.cp(path + "/data/graphics/submonitor_bg", './plugins/sdvx@asphyxia/webui/asset/submonitor_bg', {recursive: true}).catch((err: any) => {
console.log(err) console.log(err)
}) })
console.log('Assets imported.')
send.json({status:"ok"}) if (!fs.existsSync(path + '/data/sound/')) {
console.log('Path for sound does not exist.')
send.error(400,'Path for sound does not exist.')
return
}
let zip = new Admzip()
await fs.promises.readdir(path + "/data/sound/custom").then((files: any) => {
// let file = files[0]
console.log(files)
for(let i in files){
let file = files[i]
if(file.endsWith('.s3p')){
fs.mkdirSync('./plugins/sdvx@asphyxia/webui/asset/temp/'+file, { recursive: true });
// fs.mkdirSync('./plugins/sdvx@asphyxia/webui/asset/audio/'+file.substring(0, 9), { recursive: true });
unpackS3P('./plugins/sdvx@asphyxia/webui/asset/temp/'+file, path + "/data/sound/custom/" + file, {})
// fs.promises.readFileSync('./plugins/sdvx@asphyxia/webui/asset/temp/'+file+'/0.wma').then(async (data: any) => {
// const instance = await ffmpeg.entrypoint.run({
// args: ["-i", "-", "-f", "wav", "-"],
// stdin: new Uint8Array(data),
// });
// const { stdout } = await instance.wait();
// fs.writeFileSync('./plugins/sdvx@asphyxia/webui/asset/audio/'+file.substring(0, 9)+'/0.wav', stdout);
// })
// exec(shell([ffmpeg, '-i', './plugins/sdvx@asphyxia/webui/asset/temp/'+file+'/0.wma', './plugins/sdvx@asphyxia/webui/asset/audio/'+file.substring(0, 9)+'/0.mp3']), (err: any, stdout: any, stderr: any) => {
// console.log(err)
// })
// exec(shell([ffmpeg, '-i', './plugins/sdvx@asphyxia/webui/asset/temp/'+file+'/1.wma', './plugins/sdvx@asphyxia/webui/asset/audio/'+file.substring(0, 9)+'/1.mp3']), (err: any, stdout: any, stderr: any) => {
// console.log(err)
// })
// if(fs.existsSync('./plugins/sdvx@asphyxia/webui/asset/temp/'+file+'/2.wma')){
// exec(shell([ffmpeg, '-i', './plugins/sdvx@asphyxia/webui/asset/temp/'+file+'/2.wma', './plugins/sdvx@asphyxia/webui/asset/audio/'+file.substring(0, 9)+'/2.mp3']), (err: any, stdout: any, stderr: any) => {
// console.log(err)
// })
// }
}
}
}).finally(() => {
zip.addLocalFolder('./plugins/sdvx@asphyxia/webui/asset/temp', 'temp')
zip.writeZip('./plugins/sdvx@asphyxia/webui/asset/temp.zip')
})
await fs.promises.rm('./plugins/sdvx@asphyxia/webui/asset/temp', { recursive: true, force: true }).catch((err: any) => {
console.log(err)
})
console.log('Assets imported. Now converting audio files on browser...')
send.file('webui/asset/temp.zip')
// fs.promises.rm('./plugins/sdvx@asphyxia/webui/asset/temp.zip', { force: true }).catch((err: any) => {
// console.log(err)
// })
// send.json({status:"ok"})
}; };
export const update_webui_nemsys_data = async (data: any, send: WebUISend) => {
let string = data.file
let nemsys_xml = U.parseXML(string)
const fs = require('fs')
const filename = "../webui/asset/json/data.json"
const datajson = require(filename)
nemsys_xml.custom_nemsys_data.info.filter((e: any) => e.id != 8 && e.id != 9 && e.id != 10 && e.id != 11).forEach((item: any) => {
if(datajson.nemsys.filter((e: any) => e.value == item.id).length == 0){
datajson.nemsys.push({
value: item.id,
name: item.texture_name
})
}
})
fs.writeFileSync("./plugins/sdvx@asphyxia/webui/asset/json/data.json", JSON.stringify(datajson, null, 2))
send.json({status:"ok"})
}
export const update_webui_stamp_data = async (data: any, send: WebUISend) => {
let string = data.file
let chat_stamp_xml = U.parseXML(string)
const fs = require('fs')
const filename = "../webui/asset/json/data.json"
const datajson = require(filename)
chat_stamp_xml.chat_stamp_data.info.forEach((item: any) => {
if(datajson.stamp.filter((e: any) => e.value == item.id).length == 0){
let addition = ""
if(item.filename != ""){
addition = item.filename.substring(item.filename.length - 2)
}
datajson.stamp.push({
value: item.id,
name: item.title + " " +addition
})
}
})
fs.writeFileSync("./plugins/sdvx@asphyxia/webui/asset/json/data.json", JSON.stringify(datajson, null, 2))
send.json({status:"ok"})
}
export const update_webui_subbg_data = async (data: any, send: WebUISend) => {
const fs = require('fs')
const filename = "../webui/asset/json/data.json"
const datajson = require(filename)
let subbg_folder = fs.readdirSync("./plugins/sdvx@asphyxia/webui/asset/submonitor_bg")
let subbg_entry = {}
subbg_folder.forEach((item: any) => {
if(item.endsWith(".png")||item.endsWith(".mp4")){
if(subbg_entry[item.substring(6, 10)] == undefined){
subbg_entry[item.substring(6, 10)] = {"count":1, "video":false}
}else{
subbg_entry[item.substring(6, 10)]["count"] += 1
}
}
if(item.endsWith(".mp4")){
subbg_entry[item.substring(6, 10)]["video"] = true
}
})
console.log(JSON.stringify(subbg_entry, null, 2))
Object.keys(subbg_entry).forEach((item: any) => {
if(datajson.subbg.filter((e: any) => e.value == item).length == 0){
if(subbg_entry[item]["video"]){
datajson.subbg.push({
value: parseInt(item),
name: "SubBG "+ item,
video: true,
})
}else if(subbg_entry[item]["count"] > 1){
datajson.subbg.push({
value: parseInt(item),
name: "SubBG "+ item,
multi: true,
})
}else{
datajson.subbg.push({
value: parseInt(item),
name: "SubBG "+ item,
})
}
}else{
if(subbg_entry[item]["video"]){
datajson.subbg.forEach((e: any) => {
if(e.value == parseInt(item)){
e.video = true
}
})
}else if(subbg_entry[item]["count"] > 1){
datajson.subbg.forEach((e: any) => {
if(e.value == parseInt(item)){
e.multi = true
}
})
}
}
})
fs.writeFileSync("./plugins/sdvx@asphyxia/webui/asset/json/data.json", JSON.stringify(datajson, null, 2))
send.json({status:"ok"})
}
export const update_webui_bgm_data = async (data: any, send: WebUISend) => {
const fs = require('fs')
const filename = "../webui/asset/json/data.json"
const datajson = require(filename)
let bgm_folder = fs.readdirSync("./plugins/sdvx@asphyxia/webui/asset/audio")
let bgm_entry = []
bgm_folder.forEach((item: any) => {
if(item.substring(0, 6) == "custom"){
bgm_entry.push(parseInt(item.substring(item.length - 2)))
}
})
console.log(bgm_entry)
bgm_entry.forEach((item: any) => {
if(datajson.bgm.filter((e: any) => e.value == item).length == 0){
datajson.bgm.push({
value: parseInt(item),
name: "BGM "+ item,
})
}
})
fs.writeFileSync("./plugins/sdvx@asphyxia/webui/asset/json/data.json", JSON.stringify(datajson, null, 2))
send.json({status:"ok"})
}

View File

@ -9,7 +9,11 @@ import {
importMix, importMix,
deleteMix, deleteMix,
make_hexa_easier, make_hexa_easier,
import_assets import_assets,
update_webui_nemsys_data,
update_webui_stamp_data,
update_webui_subbg_data,
update_webui_bgm_data
// sendImg, // sendImg,
// sendImgWithID, // sendImgWithID,
// getScore, // getScore,
@ -59,7 +63,7 @@ export function register() {
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('use_asphyxia_gameover',{ type: 'boolean', default: true, name:'Use Asphyxia Gameover', desc:'Enable the Asphyxia gameover message after ending the game.'})
R.Config('use_blasterpass',{ type: 'boolean', default: true, name:'Use Blaster Pass', desc:'Enable Blaster Pass for VW and EG'}); R.Config('use_blasterpass',{ type: 'boolean', default: true, name:'Use Blaster Pass', desc:'Enable Blaster Pass for VW and EG'});
R.Config('new_year_special',{ type: 'boolean', default: true, name:'Use New Year Special', desc:'Enable New Year Special BGM for login'}); R.Config('new_year_special',{ type: 'boolean', default: true, name:'Use New Year Special', desc:'Enable New Year Special BGM for login'});
R.Config('music_count',{ type: 'integer', default: 2200, name:'Music Count', desc:'The total number of music in the game.'}); R.Config('music_count',{ type: 'integer', default: 2200, name:'Music Count', desc:'The maximum id of music in the game.'});
R.WebUIEvent('updateProfile', updateProfile); R.WebUIEvent('updateProfile', updateProfile);
R.WebUIEvent('updateMix', updateMix); R.WebUIEvent('updateMix', updateMix);
@ -67,6 +71,10 @@ export function register() {
R.WebUIEvent('deleteMix', deleteMix); R.WebUIEvent('deleteMix', deleteMix);
R.WebUIEvent('easyHexa', make_hexa_easier); R.WebUIEvent('easyHexa', make_hexa_easier);
R.WebUIEvent('import_assets', import_assets); R.WebUIEvent('import_assets', import_assets);
R.WebUIEvent('update_webui_nemsys', update_webui_nemsys_data);
R.WebUIEvent('update_webui_chat_stamp', update_webui_stamp_data);
R.WebUIEvent('update_webui_subbg', update_webui_subbg_data);
R.WebUIEvent('update_webui_bgm', update_webui_bgm_data);
const MultiRoute = (method: string, handler: EPR | boolean) => { const MultiRoute = (method: string, handler: EPR | boolean) => {
R.Route(`game.sv6_${method}`, handler); R.Route(`game.sv6_${method}`, handler);
@ -127,6 +135,8 @@ export function register() {
//logerrlevel: K.ITEM('s32', 0), //logerrlevel: K.ITEM('s32', 0),
//evtidnosendflg: K.ITEM('s32', 0) //evtidnosendflg: K.ITEM('s32', 0)
})); }));
R.Unhandled(); R.Unhandled();

View File

@ -1,16 +0,0 @@
- let music = 0;
- let event = 0;
- let catalog = 0;
game
limited
while music < 200
music(id=music++, flag=2)
event
while event < 16
info(id=event++)
catalog
while catalog < 256
info(id=catalog++, currency=1, price=1)

View File

@ -1,23 +0,0 @@
game
name(__type="str") #{name}
code(__type="str") #{code}
gamecoin_packet(__type="u32") #{packets}
gamecoin_block(__type="u32") #{blocks}
exp_point(__type="u32") #{expPoint ? expPoint : 0}
m_user_cnt(__type="u32") #{mUserCnt ? mUserCnt : 0}
have_item(__type="bool" __count=512) #{Array(512).fill(1).join(" ")}
have_note(__type="bool" __count=512) #{Array(512).fill(1).join(" ")}
last(
music_id=musicID,
music_type=musicType,
sort_type=sortType,
headphone=headphone,
hispeed=hiSpeed,
appeal_id=appeal,
frame0=boothFrame ? boothFrame[0] : 0,
frame1=boothFrame ? boothFrame[1] : 0,
frame2=boothFrame ? boothFrame[2] : 0,
frame3=boothFrame ? boothFrame[3] : 0,
frame4=boothFrame ? boothFrame[4] : 0,
)

View File

@ -1,38 +0,0 @@
- let music = 0;
- let event = 0;
- let catalog = 0;
game
music_limited
while music < 23
each type in [0,1,2,3]
info
music_id(__type="s32") #{music++}
music_type(__type="u8") #{type}
limited(__type="u8") 3
event
while event < 41
info
event_id(__type="u32") #{event++}
skill_course
each course in courses
info
course_id(__type="s16") #{course.id}
level(__type="s16") #{course.level}
season_id(__type="s16") #{course.season_id}
season_name(__type="str") #{course.season_name}
season_new_flg(__type="bool") #{course.new_flg}
course_name(_type="str") #{course.name}
course_type(__type="s16") #{course.type}
skill_name_id(__type="s16") #{course.name_id}
matching_assist(__type="bool") #{course.matching_assist}
guage_type(__type="s16") #{course.guage_type}
paseli_type(type="s16") #{course.paseli_type}
each trackinfo in course.tracks
track
track_no(__type="s16") #{trackinfo.no}
music_id(__type="s32") #{trackinfo.id}
music_type(__type="s8") #{trackinfo.type}

View File

@ -1,105 +0,0 @@
game
result(__type="u8") 0
name(__type="str") #{name}
code(__type="str") #{code}
sdvx_id(__type="str") #{code}
gamecoin_packet(__type="u32") #{packets}
gamecoin_block(__type="u32") #{blocks}
last
music_id(__type="s32") #{musicID}
music_type(__type="u8") #{musicType}
sort_type(__type="u8") #{sortType}
comment_id(__type="u16") 0
appeal_id(__type="u16") #{appeal}
headphone(__type="u8") #{headphone}
narrow_down(__type="u8") #{narrowDown}
gauge_option(__type="u8") #{gaugeOption}
blaster_energy(__type="u32") #{blasterEnergy}
blaster_count(__type="u32") #{blasterCount}
extrack_energy(__type="u16") #{extrackEnergy}
hispeed(__type="s32") #{hiSpeed}
lanespeed(__type="u32") #{laneSpeed}
ars_option(__type="u8") #{arsOption}
notes_option(__type="u8") #{notesOption}
early_late_disp(__type="u8") #{earlyLateDisp}
draw_adjust(__type="s32") #{drawAdjust}
eff_c_left(__type="u8") #{effCLeft}
eff_c_right(__type="u8") #{effCRight}
kac_id(__type="str") #{name}
skill_level(__type="s16") #{skill.level}
skill_base_id(__type="s16") #{skill.base}
skill_name_id(__type="s16") #{skill.name}
ea_shop
packet_booster(__type="s32") 1
if version < 5
block_booster(__type="s32") 1
if version >= 5
blaster_pass_enable(__type="bool") 1
blaster_pass_limit_date(__type="u64") #{currentTime}
eaappli
relation(__type="s8") 1
cloud
relation(__type="s8") 1
block_no(__type="s32") 0
skill
course
each course in courses
d
ssnid(__type="s16") #{course.sid}
crsid(__type="s16") #{course.cid}
sc(__type="s32") #{course.score}
ex(__type="s32") 0
ct(__type="s16") #{course.clear}
gr(__type="s16") #{course.grade}
ar(__type="s16") #{course.rate}
cnt(__type="s16") #{course.count}
course_total
each course in courses
d
ssnid(__type="s16") #{course.sid}
crsid(__type="s16") #{course.cid}
sc(__type="s32") #{course.score}
ex(__type="s32") 0
ct(__type="s16") #{course.clear}
gr(__type="s16") #{course.grade}
ar(__type="s16") #{course.rate}
cnt(__type="s16") #{course.count}
course_all
each course in courses
d
ssnid(__type="s16") #{course.sid}
crsid(__type="s16") #{course.cid}
sc(__type="s32") #{course.score}
ex(__type="s32") 0
ct(__type="s16") #{course.clear}
gr(__type="s16") #{course.grade}
ar(__type="s16") #{course.rate}
cnt(__type="s16") #{course.count}
item
each item in tempItem
info
type(__type="u8") #{item.type}
id(__type="u32") #{item.id}
param(__type="u32") #{item.param}
play_count(__type="u32") 1001
day_count(__type="u32") 301
today_count(__type="u32") 21
play_chain(__type="u32") 31
max_play_chain(__type="u32") 31
week_count(__type="u32") 9
week_play_count(__type="u32") 101
week_chain(__type="u32") 31
max_week_chain(__type="u32") 31

View File

@ -1,14 +0,0 @@
game
new
each music in temp
music
music_id (__type="u32")#{music.mid}
music_type (__type="u32")#{music.type}
score (__type="u32")#{music.score}
cnt (__type="u32")1
clear_type (__type="u32")#{music.clear}
score_grade (__type="u32")#{music.grade}
btn_rate (__type="u32")#{music.buttonRate}
long_rate (__type="u32")#{music.longRate}
vol_rate (__type="u32")#{music.volRate}
old