saucer fulfill support

This commit is contained in:
Kirito 2021-05-25 13:07:44 +09:00
parent c18baaedd6
commit 105c9796bd
9 changed files with 1997 additions and 42 deletions

View File

@ -1,6 +1,6 @@
# Jubeat
Plugin Version: **v1.4.1**
Plugin Version: **v1.5.0**
### Supported Versions
@ -11,11 +11,16 @@ Plugin Version: **v1.4.1**
- copious
- copious APPEND
- saucer
- saucer fulfill
### Changelogs
***
#### 1.5.0
- saucer fulfill support
#### 1.4.1
- saucer support

File diff suppressed because it is too large Load Diff

View File

@ -1,35 +1,39 @@
import {getVersion, VersionRange} from '../utils';
import {getVersion, VersionRange} from "../utils";
export const gameInfo: EPR = (info, data, send) => {
const locId = $(data).content('shop.locationid');
const locId = $(data).content("shop.locationid");
const version = getVersion(info);
if (version === 0) return send.deny();
return send.object({
data: {
...info.module === 'shopinfo' && {
cabid: K.ITEM('u32', _.random(1, 10)),
locationid: K.ITEM('str', locId),
...VersionRange(version, 3, 6) && { is_send: K.ITEM('u8', 1) },
...info.module === "shopinfo" && {
cabid: K.ITEM("u32", _.random(1, 10)),
locationid: K.ITEM("str", locId),
...VersionRange(version, 3, 6) && { is_send: K.ITEM("u8", 1) },
tax_phase: K.ITEM("u8", 0),
facility: {
exist: K.ITEM("u32", 1)
}
},
...VersionRange(version, 5, 6) && {
white_music_list: K.ARRAY('s32', Array(32).fill(-1))
white_music_list: K.ARRAY("s32", Array(32).fill(-1))
}
}
});
};
export const demodata = {
getNews: (_, __, send) => send.object({ data: { officialnews: K.ATTR({ count: '0' }) } }),
getNews: (_, __, send) => send.object({ data: { officialnews: K.ATTR({ count: "0" }) } }),
getData: (_, data, send) => {
const newsId = $(data).number('officialnews.newsid');
const newsId = $(data).number("officialnews.newsid");
return send.object({
data: {
officialnews: {
data: {
newsid: K.ITEM('s16', newsId),
image: K.ITEM('u8', 0, { size: '0' })
newsid: K.ITEM("s16", newsId),
image: K.ITEM("u8", 0, { size: "0" })
}
}
}
@ -38,10 +42,10 @@ export const demodata = {
getHitchart: (_, __, send) => send.object({
data: {
hitchart: {
update: K.ITEM('str', ''),
update: K.ITEM("str", ""),
hitchart_lic: K.ATTR({ count: '0' }),
hitchart_org: K.ATTR({ count: '0' }),
hitchart_lic: K.ATTR({ count: "0" }),
hitchart_org: K.ATTR({ count: "0" }),
}
}
}),

View File

@ -1,6 +1,7 @@
import {getVersion, getVersionName, VersionRange} from "../utils";
import Profile from "../models/profile";
import {Score} from "../models/score";
import {CourseResult} from "../models/course";
export const profile: EPR = async (info, data, send) => {
let refId = $(data).str("data.player.pass.refid");
@ -32,17 +33,20 @@ export const profile: EPR = async (info, data, send) => {
return send.object({
data: {
...VersionRange(version, 5, 5) && require("../templates/gameInfos/saucer.ts")(profile),
...version === 5 && require("../templates/gameInfos/saucer.ts")(profile),
...version === 6 && require("../templates/gameInfos/fulfill.ts")(profile),
player: {
name: K.ITEM("str", profile.name),
jid: K.ITEM("s32", profile.jubeatId),
refid: K.ITEM("str", profile.__refid),
session_id: K.ITEM("s32", 1),
event_flag: K.ITEM("u64", BigInt(0)),
...version === 3 && require("../templates/profiles/knit.ts")(profile),
...version === 4 && require("../templates/profiles/copious.ts")(profile),
...version === 5 && require("../templates/profiles/saucer.ts")(profile),
...version === 6 && require("../templates/profiles/fulfill.ts")(profile),
}
}
});
@ -236,6 +240,62 @@ export const saveProfile: EPR = async (info, { data }, send) => {
profile.saucer.bistro.carry_over = $(data).number("player.bistro.carry_over");
}
if (version === 6) {
if (!profile.fulfill) profile.fulfill = {};
profile.fulfill.jubility = $(data).number("player.info.jubility");
profile.fulfill.jubilityYday = $(data).number("player.info.jubility_yday");
profile.fulfill.tuneCount = $(data).number("player.info.tune_cnt");
profile.fulfill.saveCount = $(data).number("player.info.save_cnt");
profile.fulfill.savedCount = $(data).number("player.info.saved_cnt");
profile.fulfill.fcCount = $(data).number("player.info.fc_cnt");
profile.fulfill.exCount = $(data).number("player.info.exc_cnt");
profile.fulfill.clearCount = $(data).number("player.info.clear_cnt");
profile.fulfill.matchCount = $(data).number("player.info.match_cnt");
profile.fulfill.expertOption = $(data).number("player.info.expert_option");
profile.fulfill.matching = $(data).number("player.info.matching");
profile.fulfill.hazard = $(data).number("player.info.hazard");
profile.fulfill.hard = $(data).number("player.info.hard");
profile.fulfill.extraPoint = $(data).number("player.info.extra_point");
profile.fulfill.isExtraPlayed = $(data).bool("player.info.is_extra_played");
profile.fulfill.totalBestScore = $(data).number("player.info.total_best_score");
profile.fulfill.clearMaxLevel = $(data).number("player.info.clear_max_level");
profile.fulfill.fcMaxLevel = $(data).number("player.info.fc_max_level");
profile.fulfill.exMaxLevel = $(data).number("player.info.exc_max_level");
profile.fulfill.marker = lastMarker;
profile.fulfill.theme = lastTheme;
profile.fulfill.title = lastTitle;
profile.fulfill.parts = lastParts;
profile.fulfill.sort = lastSort;
profile.fulfill.category = lastCategory;
profile.fulfill.secretList = $(data).numbers("player.item.secret_list");
profile.fulfill.themeList = $(data).number("player.item.theme_list");
profile.fulfill.markerList = $(data).numbers("player.item.marker_list");
profile.fulfill.titleList = $(data).numbers("player.item.title_list");
profile.fulfill.partsList = $(data).numbers("player.item.parts_list");
profile.fulfill.secretListNew = $(data).numbers("player.item.secret_new");
profile.fulfill.themeListNew = $(data).number("player.item.theme_new");
profile.fulfill.markerListNew = $(data).numbers("player.item.marker_new");
profile.fulfill.titleListNew = $(data).numbers("player.item.title_new");
const courseNode = $(data).element("course");
if (courseNode) {
profile.fulfill.lastCourseId = courseNode.number("course_id");
await DB.Upsert<CourseResult>(refId, {
collection: "course_results",
courseId: courseNode.number("course_id"),
version: 6
}, {
$set: {
rating: courseNode.number("rating"),
scores: courseNode.elements("music").map(m => m.number("score"))
}
});
}
}
try {
await DB.Update<Profile>(refId, { collection: "profile" }, profile);
@ -340,6 +400,69 @@ const updateScore = async (refId: string, data: any): Promise<boolean> => {
}
};
export const getCourse: EPR = async (info, data, send) => {
const version = getVersion(info);
if (version === 0) return send.deny();
const jubeatId = $(data).number("data.player.jid");
if (!jubeatId) return send.deny();
const profile = await DB.FindOne<Profile>(null, { collection: "profile", jubeatId });
if (!profile) return send.deny();
if (version === 6) {
const results = await DB.Find<CourseResult>(profile.__refid, { collection: "course_results", version: 6 });
const { courses } = require("../data/fulfill_courses.json");
const validCourseIds: number[] = courses.map(course => course.course_id);
return send.object({
data: {
course_list: {
course: courses.map(course => ({
id: K.ITEM("s32", course.course_id),
name: K.ITEM("str", course.course_name),
level: K.ITEM("u8", course.course_level),
norma: {
norma_id: K.ARRAY("s32", course.norma.norma_id),
bronze_value: K.ARRAY("s32", course.norma.bronze),
silver_value: K.ARRAY("s32", course.norma.silver),
gold_value: K.ARRAY("s32", course.norma.gold)
},
music_list: {
music: course.music_list.map(music => (K.ATTR({ index: music.index }, {
music_id: K.ITEM("s32", music.music_id),
seq: K.ITEM("u8", music.seq_id)
})))
}
}))
},
player_list: {
player: {
jid: K.ITEM("s32", jubeatId),
result_list: {
result: results.filter(e => validCourseIds.find(valid => valid === e.courseId)).map(result => ({
id: K.ITEM("s32", result.courseId),
rating: K.ITEM("u8", result.rating),
score: K.ARRAY("s32", result.scores)
}))
}
}
},
last_course_id: K.ITEM("s32", profile.fulfill?.lastCourseId || 0)
}
});
}
return send.deny();
};
export const meeting: EPR = (info, data, send) => {
return send.object({
data: {

View File

@ -1,36 +1,37 @@
import {demodata, gameInfo} from './handlers/common';
import {check, entry, refresh, report} from './handlers/matching';
import {getCollabo, loadScore, meeting, profile, saveProfile} from './handlers/profile';
import {demodata, gameInfo} from "./handlers/common";
import {check, entry, refresh, report} from "./handlers/matching";
import {getCollabo, getCourse, loadScore, meeting, profile, saveProfile} from "./handlers/profile";
export function register() {
if (CORE_VERSION_MAJOR <= 1 && CORE_VERSION_MINOR < 31) {
console.error('The current version of Asphyxia Core is not supported. Requires version \'1.31\' or later.');
console.error("The current version of Asphyxia Core is not supported. Requires version '1.31' or later.");
return;
}
R.GameCode('J44');
R.GameCode('K44');
R.GameCode('L44');
R.GameCode("J44");
R.GameCode("K44");
R.GameCode("L44");
R.Route('gametop.regist', profile);
R.Route('gametop.get_info', gameInfo);
R.Route('gametop.get_pdata', profile);
R.Route('gametop.get_mdata', loadScore);
R.Route('gametop.get_meeting', meeting);
R.Route('gametop.get_collabo', getCollabo);
R.Route("gametop.regist", profile);
R.Route("gametop.get_info", gameInfo);
R.Route("gametop.get_pdata", profile);
R.Route("gametop.get_mdata", loadScore);
R.Route("gametop.get_course", getCourse);
R.Route("gametop.get_meeting", meeting);
R.Route("gametop.get_collabo", getCollabo);
R.Route('gameend.regist', saveProfile);
R.Route('gameend.log', true);
R.Route('gameend.set_collabo', true);
R.Route("gameend.regist", saveProfile);
R.Route("gameend.log", true);
R.Route("gameend.set_collabo", true);
R.Route('shopinfo.regist', gameInfo);
R.Route('demodata.get_news', demodata.getNews);
R.Route('demodata.get_data', demodata.getData);
R.Route('demodata.get_hitchart', demodata.getHitchart);
R.Route('lobby.check', check);
R.Route('lobby.entry', entry);
R.Route('lobby.refresh', refresh);
R.Route('lobby.report', report);
R.Route("shopinfo.regist", gameInfo);
R.Route("demodata.get_news", demodata.getNews);
R.Route("demodata.get_data", demodata.getData);
R.Route("demodata.get_hitchart", demodata.getHitchart);
R.Route("lobby.check", check);
R.Route("lobby.entry", entry);
R.Route("lobby.refresh", refresh);
R.Route("lobby.report", report);
R.Route('netlog.send', true);
R.Route('logger.report', true);
R.Route("netlog.send", true);
R.Route("logger.report", true);
}

View File

@ -0,0 +1,9 @@
export interface CourseResult {
collection: "course_results";
version: number;
courseId: number;
rating: number;
scores: number[];
}

View File

@ -120,4 +120,48 @@ export default interface Profile {
carry_over?: number;
}
};
fulfill?: {
jubility?: number;
jubilityYday?: number;
tuneCount?: number;
clearCount?: number;
saveCount?: number;
savedCount?: number;
fcCount?: number;
exCount?: number;
matchCount?: number;
extraPoint?: number;
isExtraPlayed?: boolean;
totalBestScore?: number;
clearMaxLevel?: number;
fcMaxLevel?: number;
exMaxLevel?: number;
marker?: number;
theme?: number;
title?: number;
parts?: number;
sort?: number;
category?: number;
expertOption?: number;
matching?: number;
hazard?: number;
hard?: number;
secretList?: number[];
themeList?: number;
markerList?: number[];
titleList?: number[];
partsList?: number[];
secretListNew?: number[];
themeListNew?: number;
markerListNew?: number[];
titleListNew?: number[];
lastCourseId?: number;
};
}

View File

@ -0,0 +1,28 @@
module.exports = () => ({
termver: K.ITEM("u8", 0),
season_etime: K.ITEM("u32", 0),
white_music_list: K.ARRAY("s32", Array(32).fill(-1)),
open_music_list: K.ARRAY("s32", Array(32).fill(0)),
collabo_info: {
collabo: [
K.ATTR({ type: "1" }, { state: K.ITEM("u8", 0) }),
K.ATTR({ type: "2" }, { state: K.ITEM("u8", 0) }),
K.ATTR({ type: "3" }, { state: K.ITEM("u8", 0) }),
K.ATTR({ type: "4" }, { state: K.ITEM("u8", 0) }),
K.ATTR({ type: "5" }, { state: K.ITEM("u8", 0) }),
K.ATTR({ type: "8" }, { state: K.ITEM("u8", 0) })
],
policy_break: {
is_report_end: K.ITEM("bool", true)
}
},
lab: {
is_open: K.ITEM("bool", false)
},
share_music: K.ATTR({ count: "0" }),
bonus_music: K.ATTR({ count: "0" })
});

View File

@ -0,0 +1,117 @@
import Profile from "../../models/profile";
module.exports = (data: Profile) => ({
info: {
jubility: K.ITEM("s16", data.fulfill?.jubility || 0),
jubility_yday: K.ITEM("s16", data.fulfill?.jubilityYday || 0),
tune_cnt: K.ITEM("s32", data.fulfill?.tuneCount || 31),
save_cnt: K.ITEM("s32", data.fulfill?.saveCount || 0),
saved_cnt: K.ITEM("s32", data.fulfill?.savedCount || 0),
fc_cnt: K.ITEM("s32", data.fulfill?.fcCount || 0),
ex_cnt: K.ITEM("s32", data.fulfill?.exCount || 0),
clear_cnt: K.ITEM("s32", data.fulfill?.clearCount || 0),
pf_cnt: K.ITEM("s32", 0),
match_cnt: K.ITEM("s32", data.fulfill?.matchCount || 0),
beat_cnt: K.ITEM("s32", 0),
mynews_cnt: K.ITEM("s32", 0),
mtg_entry_cnt: K.ITEM("s32", 0),
mtg_hold_cnt: K.ITEM("s32", 0),
mtg_result: K.ITEM("u8", 0),
extra_point: K.ITEM("s32", data.fulfill?.extraPoint || 0),
is_extra_played: K.ITEM("bool", data.fulfill?.isExtraPlayed || false)
},
last: {
play_time: K.ITEM("s64", BigInt(0)),
shopname: K.ITEM("str", data.lastShopname),
areaname: K.ITEM("str", data.lastAreaname),
title: K.ITEM("s16", data.fulfill?.title || 0),
parts: K.ITEM("s16", data.fulfill?.parts || 0),
theme: K.ITEM("s8", data.fulfill?.theme || 0),
marker: K.ITEM("s8", data.fulfill?.marker || 0),
rank_sort: K.ITEM("s8", data.rankSort || 1),
combo_disp: K.ITEM("s8", data.comboDisp || 1),
music_id: K.ITEM("s32", data.musicId || 0),
seq_id: K.ITEM("s8", data.seqId || 0),
sort: K.ITEM("s8", data.fulfill?.sort || 0),
category: K.ITEM("s8", data.fulfill?.category || 0),
expert_option: K.ITEM("s8", data.fulfill?.category || 0),
matching: K.ITEM("s8", data.fulfill?.category || 1),
hazard: K.ITEM("s8", data.fulfill?.category || 0),
hard: K.ITEM("s8", data.fulfill?.category || 0)
},
item: {
secret_list: K.ARRAY("s32", Array(32).fill(-1)),
theme_list: K.ITEM("s16", -1),
marker_list: K.ARRAY("s32", Array(2).fill(-1)),
title_list: K.ARRAY("s32", Array(96).fill(-1)),
parts_list: K.ARRAY("s32", Array(96).fill(-1)),
new: {
secret_list: K.ARRAY("s32", Array(32).fill(0)),
theme_list: K.ITEM("s16", 0),
marker_list: K.ARRAY("s32", Array(2).fill(0)),
title_list: K.ARRAY("s32", Array(96).fill(0))
}
},
history: K.ATTR({ count: "0" }),
challenge: {
today: {
music_id: K.ITEM("s32", 0),
state: K.ITEM("u8", 0)
}
},
news: {
checked: K.ITEM("s16", 0)
},
macchiato: {
pack_id: K.ITEM("s32", 0),
bean_num: K.ITEM("u16", 0),
daily_milk_num: K.ITEM("s32", 1200),
is_received_daily_milk: K.ITEM("bool", true),
today_tune_cnt: K.ITEM("s32", 0),
daily_milk_bonus: K.ARRAY("s32", [100, 100, 1000, 200, 200, 200, 200, 200, 1000]),
daily_play_burst: K.ITEM("s32", 300),
sub_menu_is_completed: K.ITEM("bool", true),
compensation_milk: K.ITEM("s32", 0),
macchiato_music_list: K.ATTR({ count: "0" }, {
music: []
}),
sub_pack_id: K.ITEM("s32", 0),
sub_macchiato_music_list: K.ATTR({ count: "0" }, {
music: []
}),
season_music_list: K.ATTR({ count: "0" }),
match_cnt: K.ITEM("s32", 0),
achievement_list: K.ATTR({ count: "0" }, {
achievement: []
}),
cow_list: K.ATTR({ count: "0" }),
},
rivallist: K.ATTR({ count: "0" }),
only_now_music: K.ATTR({ count: "0" }),
lab_edit_seq: K.ATTR({ count: "0" }),
kac_music: K.ATTR({ count: "0" }),
memorial: {
latest_event_id: K.ITEM("u8", 1),
player_event_id: K.ITEM("u8", 1),
flag: K.ITEM("u32", 0),
params: K.ARRAY("u32", Array(15).fill(0))
}
});