From c18baaedd609c16be6d3b5d14b4fc1c20808919b Mon Sep 17 00:00:00 2001 From: Kirito Date: Sat, 22 May 2021 13:57:07 +0900 Subject: [PATCH] saucer support --- jubeat@asphyxia/README.md | 8 +- jubeat@asphyxia/handlers/profile.ts | 646 +++++++----------- jubeat@asphyxia/index.ts | 1 + jubeat@asphyxia/models/profile.ts | 215 +++--- jubeat@asphyxia/models/score.ts | 19 +- jubeat@asphyxia/templates/copious/profile.pug | 83 --- jubeat@asphyxia/templates/gameInfos/saucer.ts | 27 + jubeat@asphyxia/templates/knit/profile.pug | 89 --- jubeat@asphyxia/templates/profiles/copious.ts | 71 ++ jubeat@asphyxia/templates/profiles/knit.ts | 75 ++ jubeat@asphyxia/templates/profiles/saucer.ts | 101 +++ jubeat@asphyxia/utils.ts | 22 +- 12 files changed, 655 insertions(+), 702 deletions(-) delete mode 100644 jubeat@asphyxia/templates/copious/profile.pug create mode 100644 jubeat@asphyxia/templates/gameInfos/saucer.ts delete mode 100644 jubeat@asphyxia/templates/knit/profile.pug create mode 100644 jubeat@asphyxia/templates/profiles/copious.ts create mode 100644 jubeat@asphyxia/templates/profiles/knit.ts create mode 100644 jubeat@asphyxia/templates/profiles/saucer.ts diff --git a/jubeat@asphyxia/README.md b/jubeat@asphyxia/README.md index bf52113..72a87a4 100644 --- a/jubeat@asphyxia/README.md +++ b/jubeat@asphyxia/README.md @@ -1,6 +1,6 @@ # Jubeat -Plugin Version: **v1.3.0** +Plugin Version: **v1.4.1** ### Supported Versions @@ -10,11 +10,17 @@ Plugin Version: **v1.3.0** - knit APPEND - copious - copious APPEND +- saucer ### Changelogs *** +#### 1.4.1 + +- saucer support +- Change profile structure + #### 1.3.0 - Matching Support (Experimental) diff --git a/jubeat@asphyxia/handlers/profile.ts b/jubeat@asphyxia/handlers/profile.ts index 9f7c9ea..bcdac0e 100644 --- a/jubeat@asphyxia/handlers/profile.ts +++ b/jubeat@asphyxia/handlers/profile.ts @@ -1,6 +1,6 @@ -import {getVersion} from "../utils"; -import Profile from '../models/profile'; -import {Score} from '../models/score'; +import {getVersion, getVersionName, VersionRange} from "../utils"; +import Profile from "../models/profile"; +import {Score} from "../models/score"; export const profile: EPR = async (info, data, send) => { let refId = $(data).str("data.player.pass.refid"); @@ -17,10 +17,12 @@ export const profile: EPR = async (info, data, send) => { if (!name) return send.deny(); const newProfile: Profile = { - collection: 'profile', + collection: "profile", jubeatId: _.random(1, 99999999), name: name, - previous_version: version + + lastShopname: "NONE", + lastAreaname: "NONE" }; await DB.Upsert(refId, { collection: "profile" }, newProfile); @@ -28,393 +30,225 @@ export const profile: EPR = async (info, data, send) => { profile = newProfile; } - let migration = false; - if (profile.previous_version < version) { - migration = true; - profile.name = ""; - } + return send.object({ + data: { + ...VersionRange(version, 5, 5) && require("../templates/gameInfos/saucer.ts")(profile), - if (name) { - profile.name = name; - await DB.Update(refId, { collection: "profile" }, { $set: { name } }); - } + 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), - if (version === 3) { - if (!profile.knit) { - profile.knit = { - collabo: { completed: false, success: false }, - info: { - acvPoint: 0, - acvProg: 0, - acvRouteProg: Array(4).fill(0), - acvWool: 0, - beatCount: 0, - conciergeSelectedCount: 0, - excellentCount: 0, - excellentSeqCount: 0, - fullcomboCount: 0, - fullcomboSeqCount: 0, - jubility: 0, - jubilityYday: 0, - matchCount: 0, - mynewsCount: 0, - saveCount: 0, - savedCount: 0, - tagCount: 0, - tuneCount: 0 - }, - item: { - markerList: Array(2).fill(0), - secretList: Array(2).fill(0), - themeList: 0, - titleList: Array(24).fill(0) - }, - item_new: { - markerList: Array(2).fill(0), - secretList: Array(2).fill(0), - themeList: 0, - titleList: Array(24).fill(0) - }, - last: { - areaname: 'NONE', - conciergeSuggestId: 0, - filter: 0, - marker: 0, - mselStat: 0, - musicId: 0, - playTime: "0", - seqId: 0, - shopname: 'NONE', - showCombo: 1, - showRank: 1, - sort: 0, - theme: 0, - title: 0 - } - }; - await DB.Update(refId, { collection: "profile" }, profile); + ...version === 3 && require("../templates/profiles/knit.ts")(profile), + ...version === 4 && require("../templates/profiles/copious.ts")(profile), + ...version === 5 && require("../templates/profiles/saucer.ts")(profile), + } } - if (U.GetConfig("unlock_all_songs")) { - profile.knit.item = { - secretList: [-1, -1], - themeList: -1, - markerList: [-1, -1], - titleList: [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1] - }; - profile.knit.item_new = { - secretList: [0, 0], - themeList: 0, - markerList: [0, 0], - titleList: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - }; - } - return send.pugFile('templates/knit/profile.pug', { - refId, - migration, - name: profile.name, - jubeatId: profile.jubeatId, - ...profile.knit - }, { compress: true }); - } - - if (version === 4) { - if (!profile.copious) { - profile.copious = { - collabo: { dailyMusicId: 0, served: 0, wonderState: 0, yellowState: 0 }, - info: { - acvOwn: 0, - acvPoint: 0, - acvState: 0, - acvThrow: [0, 0, 0], - beatCount: 0, - excellentCount: 0, - excellentSeqCount: 0, - fullComboCount: 0, - fullComboSeqCount: 0, - jubility: 0, - jubilityYday: 0, - matchCount: 0, - mynewsCount: 0, - saveCount: 0, - savedCount: 0, - tuneCount: 0, - totalBestScore: 0 - }, - item: { - markerList: Array(2).fill(0), - partsList: Array(96).fill(0), - secretList: Array(12).fill(0), - themeList: 0, - titleList: Array(32).fill(0) - }, - item_new: { - markerList: Array(2).fill(0), - secretList: Array(12).fill(0), - themeList: 0, - titleList: Array(32).fill(0) - }, - last: { - areaname: 'NONE', - category: 0, - marker: 0, - mselStat: 0, - musicId: 0, - parts: 0, - playTime: '0', - seqId: 0, - shopname: 'NONE', - showCombo: 1, - showRank: 1, - sort: 0, - theme: 0, - title: 0 - } - }; - await DB.Update(refId, { collection: "profile" }, profile); - } - if (U.GetConfig("unlock_all_songs")) { - profile.copious.item = { - markerList: Array(2).fill(-1), - partsList: Array(96).fill(-1), - secretList: Array(12).fill(-1), - themeList: -1, - titleList: Array(32).fill(-1) - }; - profile.copious.item_new = { - markerList: Array(2).fill(0), - secretList: Array(12).fill(0), - themeList: 0, - titleList: Array(32).fill(0) - }; - } - return send.pugFile('templates/copious/profile.pug', { - refId, - migration, - name: profile.name, - jubeatId: profile.jubeatId, - ...profile.copious - }, { compress: false }); - } - - return send.deny(); + }); }; export const saveProfile: EPR = async (info, { data }, send) => { - console.log(U.toXML(data)); - const player = $(data).element("player"); + console.log(U.toXML({ + call: K.ATTR({ model: info.model }, { + [info.module]: K.ATTR({ method: info.method }, { data }) + }) + })); - const refId = player.str("refid"); + const refId = $(data).str("player.refid"); if (!refId) return send.deny(); const version = getVersion(info); if (version === 0) return send.deny(); const profile = await DB.FindOne(refId, { collection: "profile" }); + if (!profile) return send.deny(); - if (profile.previous_version < version) { - await DB.Update(refId, { collection: "profile" }, { $set: { previous_version: version } }); - } + let lastMarker = 0; + let lastTheme = 0; + let lastTitle = 0; + let lastParts = 0; + let lastSort = 0; + let lastFilter = 0; + let lastCategory = 0; + let lastMselStat = 0; - if (version === 3) { - profile.name = player.str("name"); + const result = $(data).element("result"); - const { info, last, item, item_new, collabo } = profile.knit; + if (result) { + const tunes = result.elements("tune"); + const historys = {}; + const historyNode = $(data).elements("player.history.tune"); - last.shopname = player.str("shopname", last.shopname); - last.areaname = player.str("areaname", last.areaname); - - info.jubility = player.number("info.jubility", info.jubility); - info.jubilityYday = player.number("info.jubility_yday", info.jubilityYday); - info.acvProg = player.number("info.acv_prog", info.acvProg); - info.acvWool = player.number("info.acv_wool", info.acvWool); - info.acvRouteProg = player.numbers("info.acv_route_prog", info.acvRouteProg); - info.acvPoint = player.number("info.acv_point", info.acvPoint); - info.tuneCount = player.number("info.tune_cnt", info.tuneCount); - info.saveCount = player.number("info.save_cnt", info.saveCount); - info.savedCount = player.number("info.saved_cnt", info.savedCount); - info.fullcomboCount = player.number("info.fc_cnt", info.fullcomboCount); - info.fullcomboSeqCount = player.number("info.fc_seq_cnt", info.fullcomboSeqCount); - info.excellentCount = player.number("info.exc_cnt", info.excellentCount); - info.excellentSeqCount = player.number("info.exc_seq_cnt", info.excellentSeqCount); - info.matchCount = player.number("info.match_cnt", info.matchCount); - info.beatCount = player.number('info.beat_cnt', info.beatCount); - info.conciergeSelectedCount = player.number('info.con_sel_cnt', info.conciergeSelectedCount); - info.tagCount = player.number('info.tag_cnt', info.tagCount); - info.mynewsCount = player.number('info.mynews_cnt', info.mynewsCount); - - last.conciergeSuggestId = player.number('info.con_suggest_id', last.conciergeSuggestId); - last.playTime = String(new Date().getTime()); - - if (!U.GetConfig("unlock_all_songs")) { - item.secretList = player.numbers('item.secret_list', item.secretList); - item_new.secretList = player.numbers('item.secret_new', profile.knit.item_new.secretList); - } - item.themeList = player.number('item.theme_list', item.themeList); - item.markerList = player.numbers('item.marker_list', item.markerList); - item.titleList = player.numbers('item.title_list', item.titleList); - - item_new.themeList = player.number('item.theme_new', profile.knit.item_new.themeList); - item_new.markerList = player.numbers('item.marker_new', profile.knit.item_new.markerList); - item_new.titleList = player.numbers('item.title_new', profile.knit.item_new.titleList); - - - // Append - const collaboNode = player.element("collabo"); - if (collaboNode) { - collabo.success = collaboNode.bool("success"); - collabo.completed = collaboNode.bool("completed"); - } - - const result = $(data).element("result"); - if (result) { - const tunes = result.elements("tune"); - for (const tune of tunes) { - const musicId = tune.number("music", 0); - last.musicId = musicId; - last.seqId = parseInt(tune.attr("player.score").seq) || 0; - last.title = tune.number("title", last.title); - last.theme = tune.number("theme", last.theme); - last.marker = tune.number("marker", last.marker); - last.sort = tune.number("sort", last.sort); - last.filter = tune.number("filter", last.filter); - last.showRank = tune.number("combo_disp", last.showRank); - last.showCombo = tune.number("rank_sort", last.showCombo); - last.mselStat = tune.number("msel_stat", last.mselStat); - - const score = tune.number('player.score'); - const seq = parseInt(tune.attr('player.score').seq); - const clear = parseInt(tune.attr('player.score').clear); - const combo = parseInt(tune.attr('player.score').combo); - const bestScore = tune.number('player.best_score'); - const bestClear = tune.number('player.best_clear'); - const playCount = tune.number('player.play_cnt'); - const clearCount = tune.number('player.clear_cnt'); - const fullcomboCount = tune.number('player.fc_cnt'); - const excellentCount = tune.number('player.exc_cnt'); - const mbar = tune.numbers('player.mbar'); - - await updateScore(refId, musicId, seq, score, clear, mbar, { - playCount, - clearCount, - fullcomboCount, - excellentCount - }); + if (historyNode) { + for (const history of historyNode) { + historys[history.attr().log_id] = { + timestamp: history.bigint("timestamp"), + isHard: history.bool("player.result.is_hard_mode") + }; } } - await DB.Update(refId, { collection: "profile" }, profile); + for (const tune of tunes) { + const tuneId = tune.attr().id; - return send.object({ data: { player: { session_id: K.ITEM('s32', 1) } } }); + profile.musicId = tune.number("music"); + profile.seqId = parseInt(tune.attr("player.score").seq); + lastMarker = tune.number("marker"); + lastTheme = tune.number("theme"); + lastTitle = tune.number("title"); + lastParts = tune.number("parts"); + lastSort = tune.number("sort"); + lastFilter = tune.number("filter"); + lastCategory = tune.number("category"); + lastMselStat = tune.number("msel_stat"); + profile.rankSort = tune.number("rank_sort"); + profile.comboDisp = tune.number("combo_disp"); + + await updateScore(refId, { + musicId: tune.number("music"), + seq: parseInt(tune.attr("player.score").seq), + score: tune.number("player.score"), + clear: parseInt(tune.attr("player.score").clear), + isHard: historys[tuneId]?.isHard || false, + bestScore: tune.number("player.best_score"), + bestClear: tune.number("player.best_clear"), + playCount: tune.number("player.play_cnt"), + clearCount: tune.number("player.clear_cnt"), + fullcomboCount: tune.number("player.fc_cnt"), + excellentCount: tune.number("player.exc_cnt"), + ...tune.element("player.mbar") && { mbar: tune.numbers("player.mbar") } + }); + } + } + + profile.lastPlayTime = Number($(data).bigint("player.time_gameend")); + profile.lastShopname = $(data).str("player.shopname"); + profile.lastAreaname = $(data).str("player.areaname"); + + if (version === 3) { + if (!profile.knit) profile.knit = {}; + profile.knit.jubility = $(data).number("player.info.jubility"); + profile.knit.jubilityYday = $(data).number("player.info.jubility_yday"); + profile.knit.acvProg = $(data).number("player.info.acv_prog"); + profile.knit.acvPoint = $(data).number("player.info.acv_point"); + profile.knit.acvWool = $(data).number("player.info.acv_wool"); + profile.knit.acvRouteProg = $(data).numbers("player.info.acv_route_prog"); + profile.knit.tuneCount = $(data).number("player.info.tune_cnt"); + profile.knit.saveCount = $(data).number("player.info.save_cnt"); + profile.knit.savedCount = $(data).number("player.info.saved_cnt"); + profile.knit.fcCount = $(data).number("player.info.fc_cnt"); + profile.knit.fcSeqCount = $(data).number("player.info.fc_seq_cnt"); + profile.knit.exCount = $(data).number("player.info.exc_cnt"); + profile.knit.exSeqCount = $(data).number("player.info.exc_seq_cnt"); + profile.knit.matchCount = $(data).number("player.info.match_cnt"); + profile.knit.conSelCount = $(data).number("player.info.con_sel_cnt"); + + profile.knit.marker = lastMarker; + profile.knit.theme = lastTheme; + profile.knit.title = lastTitle; + profile.knit.sort = lastSort; + profile.knit.filter = lastFilter; + profile.knit.mselStat = lastMselStat; + profile.knit.conSuggestId = $(data).number("player.info.con_suggest_id"); + + profile.knit.secretList = $(data).numbers("player.item.secret_list"); + profile.knit.themeList = $(data).number("player.item.theme_list"); + profile.knit.markerList = $(data).numbers("player.item.marker_list"); + profile.knit.titleList = $(data).numbers("player.item.title_list"); + + profile.knit.secretListNew = $(data).numbers("player.item.secret_new"); + profile.knit.themeListNew = $(data).number("player.item.theme_new"); + profile.knit.markerListNew = $(data).numbers("player.item.marker_new"); + profile.knit.titleListNew = $(data).numbers("player.item.title_new"); } if (version === 4) { - profile.name = player.str("name"); + if (!profile.copious) profile.copious = {}; + profile.copious.jubility = $(data).number("player.info.jubility"); + profile.copious.jubilityYday = $(data).number("player.info.jubility_yday"); + profile.copious.acvState = $(data).number("player.info.acv_state"); + profile.copious.acvPoint = $(data).number("player.info.acv_point"); + profile.copious.acvOwn = $(data).number("player.info.acv_own"); + profile.copious.acvThrow = $(data).numbers("player.info.acv_throw"); + profile.copious.tuneCount = $(data).number("player.info.tune_cnt"); + profile.copious.saveCount = $(data).number("player.info.save_cnt"); + profile.copious.savedCount = $(data).number("player.info.saved_cnt"); + profile.copious.fcCount = $(data).number("player.info.fc_cnt"); + profile.copious.fcSeqCount = $(data).number("player.info.fc_seq_cnt"); + profile.copious.exCount = $(data).number("player.info.exc_cnt"); + profile.copious.exSeqCount = $(data).number("player.info.exc_seq_cnt"); + profile.copious.matchCount = $(data).number("player.info.match_cnt"); + profile.copious.totalBestScore = $(data).number("player.info.total_best_score"); - const { info, last, item, item_new, collabo } = profile.copious; + profile.copious.marker = lastMarker; + profile.copious.theme = lastTheme; + profile.copious.title = lastTitle; + profile.copious.parts = lastParts; + profile.copious.sort = lastSort; + profile.copious.category = lastCategory; + profile.copious.mselStat = lastMselStat; - last.shopname = player.str("shopname", last.shopname); - last.areaname = player.str("areaname", last.areaname); + profile.copious.secretList = $(data).numbers("player.item.secret_list"); + profile.copious.themeList = $(data).number("player.item.theme_list"); + profile.copious.markerList = $(data).numbers("player.item.marker_list"); + profile.copious.titleList = $(data).numbers("player.item.title_list"); + profile.copious.partsList = $(data).numbers("player.item.parts_list"); - const infoNode = player.element("info"); - if (infoNode) { - info.jubility = infoNode.number("jubility", info.jubility); - info.jubilityYday = infoNode.number("jubility_yday", info.jubilityYday); - info.acvState = infoNode.number("acv_state", info.acvState); - info.acvPoint = infoNode.number("acv_point", info.acvPoint); - info.acvOwn = infoNode.number("acv_own", info.acvOwn); - info.acvThrow = infoNode.numbers("acv_throw", info.acvThrow); - info.tuneCount = infoNode.number("tune_cnt", info.tuneCount); - info.saveCount = infoNode.number("save_cnt", info.saveCount); - info.savedCount = infoNode.number("saved_cnt", info.savedCount); - info.fullComboCount = infoNode.number("fc_cnt", info.fullComboCount); - info.fullComboSeqCount = infoNode.number("fc_seq_cnt", info.fullComboSeqCount); - info.excellentCount = infoNode.number("exc_cnt", info.excellentCount); - info.excellentSeqCount = infoNode.number("exc_seq_cnt", info.excellentSeqCount); - info.matchCount = infoNode.number("match_cnt", info.matchCount); - info.beatCount = infoNode.number("beat_cnt", info.beatCount); - info.totalBestScore = infoNode.number("total_best_score", info.totalBestScore); - info.mynewsCount = infoNode.number("mynews_cnt", info.mynewsCount); - } + profile.copious.secretListNew = $(data).numbers("player.item.secret_new"); + profile.copious.themeListNew = $(data).number("player.item.theme_new"); + profile.copious.markerListNew = $(data).numbers("player.item.marker_new"); + profile.copious.titleListNew = $(data).numbers("player.item.title_new"); + } + if (version === 5) { + if (!profile.saucer) profile.saucer = {}; + profile.saucer.jubility = $(data).number("player.info.jubility"); + profile.saucer.jubilityYday = $(data).number("player.info.jubility_yday"); + profile.saucer.tuneCount = $(data).number("player.info.tune_cnt"); + profile.saucer.clearCount = $(data).number("player.info.clear_cnt"); + profile.saucer.saveCount = $(data).number("player.info.save_cnt"); + profile.saucer.savedCount = $(data).number("player.info.saved_cnt"); + profile.saucer.fcCount = $(data).number("player.info.fc_cnt"); + profile.saucer.exCount = $(data).number("player.info.exc_cnt"); + profile.saucer.matchCount = $(data).number("player.info.match_cnt"); + profile.saucer.totalBestScore = $(data).number("player.info.total_best_score"); - const itemNode = player.element("item"); - if (itemNode) { - if (!U.GetConfig("unlock_all_songs")) { - item.secretList = itemNode.numbers("secret_list", item.secretList); - item_new.secretList = itemNode.numbers("secret_new", item_new.secretList); - } - item.themeList = itemNode.number("theme_list", item.themeList); - item.markerList = itemNode.numbers("marker_list", item.markerList); - item.titleList = itemNode.numbers("title_list", item.titleList); - item.partsList = itemNode.numbers("parts_list", item.partsList); - item_new.themeList = itemNode.number("theme_new", item_new.themeList); - item_new.markerList = itemNode.numbers("marker_new", item_new.markerList); - item_new.titleList = itemNode.numbers("title_new", item_new.titleList); - } + profile.saucer.marker = lastMarker; + profile.saucer.theme = lastTheme; + profile.saucer.title = lastTitle; + profile.saucer.parts = lastParts; + profile.saucer.sort = lastSort; + profile.saucer.category = lastCategory; + profile.saucer.secretList = $(data).numbers("player.item.secret_list"); + profile.saucer.themeList = $(data).number("player.item.theme_list"); + profile.saucer.markerList = $(data).numbers("player.item.marker_list"); + profile.saucer.titleList = $(data).numbers("player.item.title_list"); + profile.saucer.partsList = $(data).numbers("player.item.parts_list"); - last.playTime = String(new Date().getTime()); + profile.saucer.secretListNew = $(data).numbers("player.item.secret_new"); + profile.saucer.themeListNew = $(data).number("player.item.theme_new"); + profile.saucer.markerListNew = $(data).numbers("player.item.marker_new"); + profile.saucer.titleListNew = $(data).numbers("player.item.title_new"); - // Append - const collaboNode = $(data).element("collabo"); - if (collaboNode) { - collabo.dailyMusicId = collaboNode.number("daily_music_id"); - collabo.served = collaboNode.number("served"); - collabo.wonderState = collaboNode.number("wonder_state"); - collabo.yellowState = collaboNode.number("yellow_state"); - } - - const resultNode = $(data).element("result"); - if (resultNode) { - const tunes = resultNode.elements('tune'); - for (const tune of tunes) { - const musicId = tune.number("music", 0); - last.musicId = musicId; - last.seqId = parseInt(tune.attr("player.score").seq) || 0; - last.marker = tune.number("marker", last.marker); - last.title = tune.number("title", last.title); - last.parts = tune.number("parts", last.parts); - last.theme = tune.number("theme", last.theme); - last.sort = tune.number("sort", last.sort); - last.category = tune.number("category", last.category); - last.showCombo = tune.number("rank_sort", last.showCombo); - last.showRank = tune.number("combo_disp", last.showRank); - last.mselStat = tune.number("msel_stat", last.mselStat); - - const score = tune.number('player.score'); - const seq = parseInt(tune.attr('player.score').seq); - const clear = parseInt(tune.attr('player.score').clear); - const combo = parseInt(tune.attr('player.score').combo); - const bestScore = tune.number('player.best_score'); - const bestClear = tune.number('player.best_clear'); - const playCount = tune.number('player.play_cnt'); - const clearCount = tune.number('player.clear_cnt'); - const fullcomboCount = tune.number('player.fc_cnt'); - const excellentCount = tune.number('player.exc_cnt'); - const mbar = tune.numbers('player.mbar'); - - await updateScore(refId, musicId, seq, score, clear, mbar, { - playCount, - clearCount, - fullcomboCount, - excellentCount - }); - } - } + if (!profile.saucer.bistro) profile.saucer.bistro = {}; + profile.saucer.bistro.carry_over = $(data).number("player.bistro.carry_over"); + } + try { await DB.Update(refId, { collection: "profile" }, profile); return send.object({ data: { - player: { session_id: K.ITEM('s32', 1) }, - collabo: { - dellar: K.ITEM('s32', 0) - } + player: { session_id: K.ITEM("s32", 1) }, + ...version === 4 && { collabo: { deller: K.ITEM("s32", 0) } } } }); + } catch (e) { + console.error(`Profile save failed: ${e.message}`); + return send.deny(); } - - return send.deny(); }; export const loadScore: EPR = async (info, data, send) => { @@ -428,7 +262,7 @@ export const loadScore: EPR = async (info, data, send) => { if (version === 0) return send.deny(); const scores = await DB.Find(profile.__refid, { collection: "score" }); - const scoreData: { [musicId: number]: any } = {}; + const scoreData: { [musicId: number]: { score: number[], clear: number[], playCnt: number[], clearCnt: number[], fcCnt: number[], exCnt: number[], bar: number[][] } } = {}; for (const score of scores) { if (!scoreData[score.musicId]) { @@ -448,80 +282,74 @@ export const loadScore: EPR = async (info, data, send) => { data.clearCnt[score.seq] = score.clearCount; data.fcCnt[score.seq] = score.fullcomboCount; data.exCnt[score.seq] = score.excellentCount; - data.clear[score.seq] = score.clearType; + data.clear[score.seq] = score.clear; data.score[score.seq] = score.score; data.bar[score.seq] = score.bar; } - if (version === 3 || version === 4) return send.object({ + return send.object({ data: { player: { - playdata: K.ATTR({ count: String(Object.keys(scoreData).length) }, { - musicdata: (() => { - const musicdata = []; - Object.entries(scoreData).forEach(([k, v]) => { - musicdata.push(K.ATTR({ music_id: String(k) }, { - play_cnt: K.ARRAY('s32', v.playCnt), - clear_cnt: K.ARRAY('s32', v.clearCnt), - fc_cnt: K.ARRAY('s32', v.fcCnt), - ex_cnt: K.ARRAY('s32', v.exCnt), - clear: K.ARRAY('s8', v.clear), - score: K.ARRAY('s32', v.score), - bar: v.bar.map((v, i) => K.ARRAY('u8', v, { seq: String(i) })) - })); - }); - return musicdata; - })() - }) + jid: K.ITEM("s32", jubeatId), + + ...version >= 3 && { + playdata: K.ATTR({ count: String(Object.keys(scoreData).length) }, { + musicdata: Object.keys(scoreData).map(musicId => K.ATTR({ music_id: String(musicId) }, { + score: K.ARRAY("s32", scoreData[musicId].score), + clear: K.ARRAY("s8", scoreData[musicId].clear), + play_cnt: K.ARRAY("s32", scoreData[musicId].playCnt), + clear_cnt: K.ARRAY("s32", scoreData[musicId].clearCnt), + fc_cnt: K.ARRAY("s32", scoreData[musicId].fcCnt), + ex_cnt: K.ARRAY("s32", scoreData[musicId].exCnt), + bar: scoreData[musicId].bar.map((bar, seq) => K.ARRAY("u8", bar, { seq: String(seq) })) + })) + }) + } } } }); - - return send.deny(); }; -const updateScore = async (refId: string, musicId: number, seq: number, score: number, clear: number, mbar: number[], data: any) => { - let raised; +const updateScore = async (refId: string, data: any): Promise => { + try { + await DB.Upsert(refId, { + collection: "score", + musicId: data.musicId, + seq: data.seq, + isHardMode: data.isHard + }, { + $set: { + musicId: data.musicId, + seq: data.seq, + score: data.bestScore, + clear: data.bestClear, + musicRate: 0, + ...data.mbar && { bar: data.mbar, }, + playCount: data.playCount, + clearCount: data.clearCount, + fullcomboCount: data.fullcomboCount, + excellentCount: data.excellentCount, + isHardMode: data.isHard + } + }); - const oldScore = await DB.FindOne(refId, { collection: "score", musicId, seq }); - - let scoreData = oldScore; - - if (!oldScore) { - scoreData = new Score(); - scoreData.musicId = musicId; - scoreData.seq = seq; - raised = true; - } else { - raised = score > oldScore.score; - score = Math.max(oldScore.score, score); + return true; + } catch (e) { + console.error("Score saving failed: ", e.stack); + return false; } - - scoreData.clearType = Math.max(scoreData.clearType, clear); - scoreData.playCount = data.playCount; - scoreData.clearCount = data.clearCount; - scoreData.fullcomboCount = data.fullcomboCount; - scoreData.excellentCount = data.excellentCount; - scoreData.isHardmodeClear = false; - - if (mbar && raised) { - scoreData.score = score; - scoreData.bar = mbar; - } - - await DB.Upsert(refId, { collection: "score", musicId, seq }, scoreData); }; export const meeting: EPR = (info, data, send) => { return send.object({ data: { meeting: { - single: K.ATTR({ count: '0' }), - tag: K.ATTR({ count: '0' }), + single: K.ATTR({ count: "0" }), + tag: K.ATTR({ count: "0" }), }, reward: { - total: K.ITEM('s32', 0), - point: K.ITEM('s32', 0) + total: K.ITEM("s32", 0), + point: K.ITEM("s32", 0) } } }); @@ -533,7 +361,6 @@ export const getCollabo: EPR = (info, data, send) => { if (version === 3) { return send.object({ - data: { collabo: { played: { @@ -550,15 +377,14 @@ export const getCollabo: EPR = (info, data, send) => { if (version === 4) { return send.object({ - data: { player: { collabo: { reward: K.ITEM("s32", 0), dellar: K.ITEM("s32", 0), music_id: K.ITEM("s32", 0), - wonder_state: K.ITEM("u32", 0), - yellow_state: K.ITEM("u32", 0), + wonder_state: K.ITEM("u32", 2), + yellow_state: K.ITEM("u32", 2), } } } diff --git a/jubeat@asphyxia/index.ts b/jubeat@asphyxia/index.ts index 967becd..1a1fb95 100644 --- a/jubeat@asphyxia/index.ts +++ b/jubeat@asphyxia/index.ts @@ -9,6 +9,7 @@ export function register() { } R.GameCode('J44'); R.GameCode('K44'); + R.GameCode('L44'); R.Route('gametop.regist', profile); R.Route('gametop.get_info', gameInfo); diff --git a/jubeat@asphyxia/models/profile.ts b/jubeat@asphyxia/models/profile.ts index 5cc4191..7fec747 100644 --- a/jubeat@asphyxia/models/profile.ts +++ b/jubeat@asphyxia/models/profile.ts @@ -4,117 +4,120 @@ export default interface Profile { jubeatId: number; name: string; - previous_version: number; + lastPlayTime?: number; + lastShopname: string; + lastAreaname: string; + + musicId?: number; + seqId?: number; + rankSort?: number; + comboDisp?: number; knit?: { - info: { - jubility: number; - jubilityYday: number; - acvProg: number; - acvWool: number; - acvRouteProg: number[]; - acvPoint: number; - tuneCount: number; - saveCount: number; - savedCount: number; - fullcomboCount: number; - fullcomboSeqCount: number; - excellentCount: number; - excellentSeqCount: number; - matchCount: number; - beatCount: number; - tagCount: number; - mynewsCount: number; - conciergeSelectedCount: number; - }; - last: { - shopname: string; - areaname: string; - playTime: string; - title: number; - theme: number; - marker: number; - showRank: number; - showCombo: number; - musicId: number; - seqId: number; - sort: number; - filter: number; - mselStat: number; - conciergeSuggestId: number; - }; - item: { - secretList: number[]; - themeList: number; - markerList: number[]; - titleList: number[]; - }; - item_new: { - secretList: number[]; - themeList: number; - markerList: number[]; - titleList: number[]; - }, - collabo: { - success: boolean; - completed: boolean; - } + jubility?: number; + jubilityYday?: number; + acvProg?: number; + acvWool?: number; + acvRouteProg?: number[]; + acvPoint?: number; + tuneCount?: number; + saveCount?: number; + savedCount?: number; + fcCount?: number; + fcSeqCount?: number; + exCount?: number; + exSeqCount?: number; + matchCount?: number; + conSelCount?: number; + + marker?: number; + theme?: number; + title?: number; + sort?: number; + filter?: number; + mselStat?: number; + conSuggestId?: number; + + secretList?: number[]; + themeList?: number; + markerList?: number[]; + titleList?: number[]; + + secretListNew?: number[]; + themeListNew?: number; + markerListNew?: number[]; + titleListNew?: number[]; }; copious?: { - info: { - jubility: number; - jubilityYday: number; - acvPoint: number; - acvState: number; - acvThrow: number[]; - acvOwn: number; - tuneCount: number; - saveCount: number; - savedCount: number; - fullComboCount: number; - fullComboSeqCount: number; - excellentCount: number; - excellentSeqCount: number; - matchCount: number; - beatCount: number; - mynewsCount: number; - totalBestScore: number; - }, - last: { - playTime: string; - shopname: string; - areaname: string; - title: number; - parts: number; - theme: number; - marker: number; - showRank: number; - showCombo: number; - musicId: number; - seqId: number; - sort: number; - category: number; - mselStat: number; - }, - item: { - secretList: number[]; - themeList: number; - markerList: number[]; - titleList: number[]; - partsList: number[]; - }, - item_new: { - secretList: number[]; - themeList: number; - markerList: number[]; - titleList: number[]; - }, - collabo: { - dailyMusicId: number; - served: number; - wonderState: number; - yellowState: number; + jubility?: number; + jubilityYday?: number; + acvPoint?: number; + acvState?: number; + acvThrow?: number[]; + acvOwn?: number; + tuneCount?: number; + saveCount?: number; + savedCount?: number; + fcCount?: number; + fcSeqCount?: number; + exCount?: number; + exSeqCount?: number; + matchCount?: number; + totalBestScore?: number; + + marker?: number; + theme?: number; + title?: number; + parts?: number; + sort?: number; + category?: number; + mselStat?: number; + + secretList?: number[]; + themeList?: number; + markerList?: number[]; + titleList?: number[]; + partsList?: number[]; + + secretListNew?: number[]; + themeListNew?: number; + markerListNew?: number[]; + titleListNew?: number[]; + }; + + saucer?: { + jubility?: number; + jubilityYday?: number; + tuneCount?: number; + clearCount?: number; + saveCount?: number; + savedCount?: number; + fcCount?: number; + exCount?: number; + matchCount?: number; + totalBestScore?: number; + + marker?: number; + theme?: number; + title?: number; + parts?: number; + sort?: number; + category?: number; + + secretList?: number[]; + themeList?: number; + markerList?: number[]; + titleList?: number[]; + partsList?: number[]; + + secretListNew?: number[]; + themeListNew?: number; + markerListNew?: number[]; + titleListNew?: number[]; + + bistro?: { + carry_over?: number; } }; } diff --git a/jubeat@asphyxia/models/score.ts b/jubeat@asphyxia/models/score.ts index 440c813..f520cd3 100644 --- a/jubeat@asphyxia/models/score.ts +++ b/jubeat@asphyxia/models/score.ts @@ -1,14 +1,15 @@ -export class Score { - collection: "score" = "score"; +export interface Score { + collection: "score"; musicId: number; seq: number; - score: number = 0; - clearType: number = 0; - playCount: number = 0; - clearCount: number = 0; - fullcomboCount: number = 0; - excellentCount: number = 0; - isHardmodeClear: boolean; + score: number; + clear: number; + musicRate: number; bar: number[]; + playCount: number; + clearCount: number; + fullcomboCount: number; + excellentCount: number; + isHardMode: boolean; } diff --git a/jubeat@asphyxia/templates/copious/profile.pug b/jubeat@asphyxia/templates/copious/profile.pug deleted file mode 100644 index 1716f76..0000000 --- a/jubeat@asphyxia/templates/copious/profile.pug +++ /dev/null @@ -1,83 +0,0 @@ -gametop - data - player - name(__type="str") #{name} - jid(__type="s32") #{jubeatId} - session_id(__type="s32") 1 - - info - inherit(__type="bool") #{migration ? 1 : 0} - jubility(__type="s16") #{info.jubility} - jubility_yday(__type="s16") #{info.jubilityYday} - acv_point(__type="s32") #{info.acvPoint} - acv_state(__type="s8") #{info.acvState} - acv_throw(__type="s32" __count="3") #{info.acvThrow.join(" ")} - acv_own(__type="s32") #{info.acvOwn} - tune_cnt(__type="s32") #{info.tuneCount} - save_cnt(__type="s32") #{info.saveCount} - saved_cnt(__type="s32") #{info.savedCount} - fc_cnt(__type="s32") #{info.fullComboCount} - ex_cnt(__type="s32") #{info.excellentCount} - match_cnt(__type="s32") #{info.matchCount} - beat_cnt(__type="s32") #{info.beatCount} - mynews_cnt(__type="s32") #{info.mynewsCount} - mtg_entry_cnt(__type="s32") 0 - mtg_hold_cnt(__type="s32") 0 - mtg_result(__type="u8") 0 - - last - play_time(__type="s64") #{last.playTime} - shopname(__type="str") #{last.shopname} - areaname(__type="str") #{last.areaname} - title(__type="s16") #{last.title} - parts(__type="s16") #{last.parts} - theme(__type="s8") #{last.theme} - marker(__type="s8") #{last.marker} - rank_sort(__type="s8") #{last.showRank} - combo_disp(__type="s8") #{last.showCombo} - music_id(__type="s32") #{last.musicId} - seq_id(__type="s8") #{last.seqId} - sort(__type="s8") #{last.sort} - category(__type="s8") #{last.category} - msel_stat(__type="s8") #{last.mselStat} - - item - secret_list(__type="s32" __count="12") #{item.secretList.join(" ")} - theme_list(__type="s16") #{item.themeList} - marker_list(__type="s32" __count="2") #{item.markerList.join(" ")} - title_list(__type="s32" __count="32") #{item.titleList.join(" ")} - parts_list(__type="s32" __count="96") #{item.partsList.join(" ")} - new - secret_list(__type="s32" __count="12") #{item_new.secretList.join(" ")} - theme_list(__type="s16") #{item_new.themeList} - marker_list(__type="s32" __count="2") #{item_new.markerList.join(" ")} - title_list(__type="s32" __count="32") #{item_new.titleList.join(" ")} - - challenge - today - music_id(__type="s32") 0 - onlynow - magic_no(__type="s32") 0 - cycle(__type="s16") 0 - group - music_id(__type="s32") 0 - rate(__type="float") 1.0 - reward - total(__type="s32") 0 - point(__type="s32") 0 - - news - checked(__type="s16") 0 - - rivallist(count="0") - - group - group_id(__type="s32") 0 - - bingo - music_id(__type="s32") 0 - reward - total(__type="s32") 0 - point(__type="s32") 0 - - history(count="0") diff --git a/jubeat@asphyxia/templates/gameInfos/saucer.ts b/jubeat@asphyxia/templates/gameInfos/saucer.ts new file mode 100644 index 0000000..28a8a59 --- /dev/null +++ b/jubeat@asphyxia/templates/gameInfos/saucer.ts @@ -0,0 +1,27 @@ +module.exports = () => ({ + termver: K.ITEM("u8", 0), + season_etime: K.ITEM("u32", 0), + bistro_last_music_id: K.ITEM("s32", 0), + white_music_list: K.ARRAY("s32", Array(32).fill(-1)), + old_music_list: K.ARRAY("s32", Array(32).fill(0)), + 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) }) + ], + + run_run_marathon: { + is_report_end: K.ITEM("bool", true) + }, + + policy_break: { + is_report_end: K.ITEM("bool", true) + } + } +}); diff --git a/jubeat@asphyxia/templates/knit/profile.pug b/jubeat@asphyxia/templates/knit/profile.pug deleted file mode 100644 index 3190d83..0000000 --- a/jubeat@asphyxia/templates/knit/profile.pug +++ /dev/null @@ -1,89 +0,0 @@ -gametop - data - player - name(__type="str") #{name} - jid(__type="s32") #{jubeatId} - refid(__type="str") #{refId} - session_id(__type="s32") 1 - - info - inherit(__type="bool") #{migration ? 1 : 0} - jubility(__type="s16") #{info.jubility} - jubility_yday(__type="s16") #{info.jubilityYday} - acv_prog(__type="s8") #{info.acvProg} - acv_wool(__type="s8") #{info.acvWool} - acv_route_prog(__type="s8" __count="4") #{info.acvRouteProg.join(" ")} - acv_point(__type="s32") #{info.acvPoint} - tune_cnt(__type="s32") #{info.tuneCount} - save_cnt(__type="s32") #{info.saveCount} - saved_cnt(__type="s32") #{info.savedCount} - fc_cnt(__type="s32") #{info.fullcomboCount} - ex_cnt(__type="s32") #{info.excellentCount} - match_cnt(__type="s32") #{info.matchCount} - beat_cnt(__type="s32") #{info.beatCount} - mynews_cnt(__type="s32") #{info.mynewsCount} - con_sel_cnt(__type="s32") #{info.conciergeSelectedCount} - tag_cnt(__type="s32") #{info.tagCount} - mtg_entry_cnt(__type="s32") 0 - tag_entry_cnt(__type="s32") 0 - mtg_hold_cnt(__type="s32") 0 - tag_hold_cnt(__type="s32") 0 - mtg_result(__type="u8") 0 - - last - play_time(__type="s64") #{last.playTime} - shopname(__type="str") #{last.shopname} - areaname(__type="str") #{last.areaname} - title(__type="s16") #{last.title} - theme(__type="s8") #{last.theme} - marker(__type="s8") #{last.marker} - rank_sort(__type="s8") #{last.showRank} - combo_disp(__type="s8") #{last.showCombo} - music_id(__type="s32") #{last.musicId} - seq_id(__type="s8") #{last.seqId} - sort(__type="s8") #{last.sort} - filter(__type="s32") #{last.filter} - msel_stat(__type="s8") #{last.mselStat} - con_suggest_id(__type="s8") #{last.conciergeSuggestId} - - item - secret_list(__type="s32" __count="2") #{item.secretList.join(" ")} - theme_list(__type="s16") #{item.themeList} - marker_list(__type="s32" __count="2") #{item.markerList.join(" ")} - title_list(__type="s32" __count="24") #{item.titleList.join(" ")} - - new - secret_list(__type="s32" __count="2") #{item_new.secretList.join(" ")} - theme_list(__type="s16") #{item_new.themeList} - marker_list(__type="s32" __count="2") #{item_new.markerList.join(" ")} - title_list(__type="s32" __count="24") #{item_new.titleList.join(" ")} - - today_music - music_id(__type="s32") 0 - - news - checked(__type="s16") 0 - - friendlist(count="0") - - lucky_music - music_id(__type="s32") 0 - - mylist(count="0") - - group - group_id(__type="s32") 0 - - bingo - reward - total(__type="s32") 0 - point(__type="s32") 0 - - collabo - success(__type="bool") #{collabo.success ? 1 : 0} - completed(__type="bool") #{collabo.completed ? 1 : 0} - - history - play_hist(count="0") - - match_hist(count="0") diff --git a/jubeat@asphyxia/templates/profiles/copious.ts b/jubeat@asphyxia/templates/profiles/copious.ts new file mode 100644 index 0000000..e9a00a6 --- /dev/null +++ b/jubeat@asphyxia/templates/profiles/copious.ts @@ -0,0 +1,71 @@ +import Profile from "../../models/profile"; + +module.exports = (data: Profile) => ({ + info: { + jubility: K.ITEM("s16", data.copious?.jubility || 0), + jubility_yday: K.ITEM("s16", data.copious?.jubilityYday || 0), + acv_point: K.ITEM("s32", data.copious?.acvPoint || 0), + acv_state: K.ITEM("s8", data.copious?.acvState || 0), + acv_throw: K.ARRAY("s32", data.copious?.acvThrow || [0, 0, 0]), + acv_own: K.ITEM("s32", data.copious?.acvOwn || 0), + tune_cnt: K.ITEM("s32", data.copious?.tuneCount || 0), + save_cnt: K.ITEM("s32", data.copious?.saveCount || 0), + saved_cnt: K.ITEM("s32", data.copious?.savedCount || 0), + fc_cnt: K.ITEM("s32", data.copious?.fcCount || 0), + ex_cnt: K.ITEM("s32", data.copious?.exCount || 0), + match_cnt: K.ITEM("s32", data.copious?.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) + }, + + 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.copious?.title || 0), + parts: K.ITEM("s16", data.copious?.parts || 0), + theme: K.ITEM("s8", data.copious?.theme || 0), + marker: K.ITEM("s8", data.copious?.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.copious?.sort || 0), + category: K.ITEM("s8", data.copious?.category || 0), + msel_stat: K.ITEM("s8", data.copious?.mselStat || 0) + }, + + item: { + secret_list: K.ARRAY("s32", data.copious?.secretList || Array(12).fill(0)), + theme_list: K.ITEM("s16", data.copious?.themeList || 0), + marker_list: K.ARRAY("s32", data.copious?.markerList || [0, 0]), + title_list: K.ARRAY("s32", data.copious?.titleList || Array(32).fill(0)), + parts_list: K.ARRAY("s32", data.copious?.partsList || Array(96).fill(0)), + + new: { + secret_list: K.ARRAY("s32", data.copious?.secretListNew || Array(12).fill(0)), + theme_list: K.ITEM("s16", data.copious?.themeListNew || 0), + marker_list: K.ARRAY("s32", data.copious?.markerListNew || [0, 0]), + title_list: K.ARRAY("s32", data.copious?.titleListNew || Array(32).fill(0)) + } + }, + + challenge: { + today: { + music_id: K.ITEM("s32", 0) + }, + onlynow: { + magic_no: K.ITEM("s32", 0), + cycle: K.ITEM("s16", 0) + } + }, + + news: { + checked: K.ITEM("s16", 0) + }, + + rivallist: K.ATTR({ count: "0" }) +}); diff --git a/jubeat@asphyxia/templates/profiles/knit.ts b/jubeat@asphyxia/templates/profiles/knit.ts new file mode 100644 index 0000000..8ebb2aa --- /dev/null +++ b/jubeat@asphyxia/templates/profiles/knit.ts @@ -0,0 +1,75 @@ +import Profile from "../../models/profile"; + +module.exports = (data: Profile) => ({ + info: { + jubility: K.ITEM("s16", data.knit?.jubility || 0), + jubility_yday: K.ITEM("s16", data.knit?.jubilityYday || 0), + acv_prog: K.ITEM("s8", data.knit?.acvProg || 0), + acv_wool: K.ITEM("s8", data.knit?.acvWool || 0), + acv_route_prog: K.ARRAY("s8", data.knit?.acvRouteProg || [0, 0, 0, 0]), + acv_point: K.ITEM("s32", data.knit?.acvPoint || 0), + tune_cnt: K.ITEM("s32", data.knit?.tuneCount || 0), + save_cnt: K.ITEM("s32", data.knit?.saveCount || 0), + saved_cnt: K.ITEM("s32", data.knit?.savedCount || 0), + fc_cnt: K.ITEM("s32", data.knit?.fcCount || 0), + ex_cnt: K.ITEM("s32", data.knit?.exCount || 0), + match_cnt: K.ITEM("s32", data.knit?.matchCount || 0), + beat_cnt: K.ITEM("s32", 0), + mynews_cnt: K.ITEM("s32", 0), + con_sel_cnt: K.ITEM("s32", data.knit?.conSelCount || 0), + tag_cnt: K.ITEM("s32", 0), + mtg_entry_cnt: K.ITEM("s32", 0), + tag_entry_cnt: K.ITEM("s32", 0), + mtg_hold_cnt: K.ITEM("s32", 0), + tag_hold_cnt: K.ITEM("s32", 0), + mtg_result: K.ITEM("u8", 0) + }, + + 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.knit?.title || 0), + theme: K.ITEM("s8", data.knit?.theme || 0), + marker: K.ITEM("s8", data.knit?.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.knit?.sort || 0), + filter: K.ITEM("s32", data.knit?.filter || 0), + msel_stat: K.ITEM("s8", data.knit?.mselStat || 0), + con_suggest_id: K.ITEM("s8", data.knit?.conSuggestId || 0) + }, + + item: { + secret_list: K.ARRAY("s32", data.knit?.secretList || [0, 0]), + theme_list: K.ITEM("s16", data.knit?.themeList || 0), + marker_list: K.ARRAY("s32", data.knit?.markerList || [0, 0]), + title_list: K.ARRAY("s32", data.knit?.titleList || Array(24).fill(0)), + + new: { + secret_list: K.ARRAY("s32", data.knit?.secretListNew || [0, 0]), + theme_list: K.ITEM("s16", data.knit?.themeListNew || 0), + marker_list: K.ARRAY("s32", data.knit?.markerListNew || [0, 0]), + title_list: K.ARRAY("s32", data.knit?.titleListNew || Array(24).fill(0)) + } + }, + + today_music: { + music_id: K.ITEM("s32", 0) + }, + + news: { + checked: K.ITEM("s16", 0) + }, + + friendlist: K.ATTR({ count: "0" }), + + mylist: K.ATTR({ count: "0" }), + + collabo: { + success: K.ITEM("bool", true), + completed: K.ITEM("bool", true) + } +}); diff --git a/jubeat@asphyxia/templates/profiles/saucer.ts b/jubeat@asphyxia/templates/profiles/saucer.ts new file mode 100644 index 0000000..025e844 --- /dev/null +++ b/jubeat@asphyxia/templates/profiles/saucer.ts @@ -0,0 +1,101 @@ +import Profile from "../../models/profile"; + +module.exports = (data: Profile) => ({ + info: { + jubility: K.ITEM("s16", data.saucer?.jubility || 0), + jubility_yday: K.ITEM("s16", data.saucer?.jubilityYday || 0), + tune_cnt: K.ITEM("s32", data.saucer?.tuneCount || 0), + save_cnt: K.ITEM("s32", data.saucer?.saveCount || 0), + saved_cnt: K.ITEM("s32", data.saucer?.savedCount || 0), + fc_cnt: K.ITEM("s32", data.saucer?.fcCount || 0), + ex_cnt: K.ITEM("s32", data.saucer?.exCount || 0), + clear_cnt: K.ITEM("s32", data.saucer?.clearCount || 0), + pf_cnt: K.ITEM("s32", 0), + match_cnt: K.ITEM("s32", data.saucer?.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) + }, + + 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.saucer?.title || 0), + parts: K.ITEM("s16", data.saucer?.parts || 0), + theme: K.ITEM("s8", data.saucer?.theme || 0), + marker: K.ITEM("s8", data.saucer?.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.saucer?.sort || 0), + category: K.ITEM("s8", data.saucer?.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) + }, + + bistro: { + info: { + delicious_rate: K.ITEM("float", 1.0), + favorite_rate: K.ITEM("float", 1.0) + }, + + chef: { + id: K.ITEM("s32", 0), + ability: K.ITEM("u8", 0), + remain: K.ITEM("u8", 0), + rate: K.ARRAY("u8", [0, 0, 0, 0]) + }, + + carry_over: K.ITEM("s32", data.saucer?.bistro?.carry_over || 0), + + route: Array(9).fill(0).map((v, i) => (K.ATTR({ no: String(i) }, { + music: { + id: K.ITEM("s32", 0), + price_s32: K.ITEM("s32", 0) + }, + + gourmates: { + id: K.ITEM("s32", 0), + favorite: K.ARRAY("u8", Array(30).fill(0)), + satisfaction_s32: K.ITEM("s32", 0) + } + }))) + }, + + rivallist: K.ATTR({ count: "0" }), + + only_now_music: K.ATTR({ count: "0" }), + requested_music: K.ATTR({ count: "0" }), + lab_edit_seq: K.ATTR({ count: "0" }), + kac_music: K.ATTR({ count: "0" }), +}); diff --git a/jubeat@asphyxia/utils.ts b/jubeat@asphyxia/utils.ts index 2ebb467..222560c 100644 --- a/jubeat@asphyxia/utils.ts +++ b/jubeat@asphyxia/utils.ts @@ -1,15 +1,29 @@ export function getVersion({ model }: EamuseInfo) { - const dateCode = parseInt(model.split(':')[4]); + const dateCode = parseInt(model.split(":")[4]); - if (model.startsWith('J44')) return 3; - if (model.startsWith('K44')) return 4; - if (model.startsWith('L44')) { + if (model.startsWith("J44")) return 3; + if (model.startsWith("K44")) return 4; + if (model.startsWith("L44")) { + if (dateCode >= 2012082400 && dateCode <= 2014022400) return 5; if (dateCode >= 2014030303 && dateCode <= 2014121802) return 6; return 0; } return 0; } +export function getVersionName({ model }: EamuseInfo) { + const dateCode = parseInt(model.split(":")[4]); + + if (model.startsWith("J44")) return "knit"; + if (model.startsWith("K44")) return "copious"; + if (model.startsWith("L44")) { + if (dateCode >= 2012082400 && dateCode <= 2014022400) return "saucer"; + if (dateCode >= 2014030303 && dateCode <= 2014121802) return "fulfill"; + return null; + } + return null; +} + export function VersionRange(version: number, start: number, end: number = -1) { if (end === -1) return version >= start; return version >= start && version <= end;