diff --git a/iidx@asphyxia/README.md b/iidx@asphyxia/README.md index 25c214b..af0d1be 100644 --- a/iidx@asphyxia/README.md +++ b/iidx@asphyxia/README.md @@ -1,11 +1,11 @@ # beatmaniaIIDX -Plugin Version: **v0.1.14** +Plugin Version: **v0.1.15** --- Supported Versions - + - beatmaniaIIDX 14 GOLD - beatmaniaIIDX 15 DJ TROOPERS - beatmaniaIIDX 16 EMPRESS - beatmaniaIIDX 17 SIRIUS @@ -130,3 +130,7 @@ Changelogs - Reworked on SINOBUZ ~ Rootage responses - Fixed where Base64toBuffer returns invalid value sometimes - Fixed where timing display option isn't saving on certain versions + +**v0.1.15** + - Added Initial support for GOLD + - Fixed where plugin may fail to register due to missing types in dev mode diff --git a/iidx@asphyxia/handlers/music.ts b/iidx@asphyxia/handlers/music.ts index a532c5c..39a3979 100644 --- a/iidx@asphyxia/handlers/music.ts +++ b/iidx@asphyxia/handlers/music.ts @@ -1,4 +1,4 @@ -import { IDtoRef, Base64toNumArray, GetVersion, OldMidToNewMid, NewMidToOldMid, ReftoProfile, ReftoPcdata, ClidToPlaySide, ReftoQPRO, NumArrayToString, OldMidToVerMid, HextoBase64 } from "../util"; +import { IDtoRef, Base64toNumArray, GetVersion, OldMidToNewMid, NewMidToOldMid, ReftoProfile, ReftoPcdata, ClidToPlaySide, ReftoQPRO, NumArrayToString, OldMidToVerMid, HextoBase64, NumArraytoBase64 } from "../util"; import { score, score_top } from "../models/score"; import { profile } from "../models/profile"; import { shop_data } from "../models/shop"; @@ -25,7 +25,7 @@ export const musicgetrank: EPR = async (info, data, send) => { let m = [], top = [], b = [], t = []; let score_data: number[]; let indices, temp_mid = 0; - if (version == 15) { + if (version == 14 || version == 15) { let result = { r: [], // v - (-1, beginner/-2, tutorial) // }; @@ -33,12 +33,13 @@ export const musicgetrank: EPR = async (info, data, send) => { music_data.forEach((res: score) => { temp_mid = NewMidToOldMid(res.mid); let verMid = OldMidToVerMid(temp_mid); - let rank_id = -1; // TODO:: determine whether use rid,dj_level from music.reg or make a database that has max exscore of all songs for rid // if (verMid[0] > version) return; for (let a = 0; a < 3; a++) { if (res.esArray[indices[a]] == 0) continue; + let rank_id = _.isNil(res.rArray) ? -1 : res.rArray[indices[a]]; + result.r.push( K.ITEM("str", NumArrayToString( [7, 4, 13, 3, 3], @@ -316,10 +317,9 @@ export const musicappoint: EPR = async (info, data, send) => { option = music_data.optArray[clid]; option2 = music_data.opt2Array[clid]; } - - mydata = Base64toNumArray(music_data[clid]); } - else mydata = K.ITEM("bin", Base64toNumArray(music_data[clid])); + + mydata = K.ITEM("bin", Base64toNumArray(music_data[clid])); } /*** ctype @@ -468,7 +468,7 @@ export const musicreg: EPR = async (info, data, send) => { let gArray = Array(10).fill(0); // GREAT // let mArray = Array(10).fill(0); // MISS // let cArray = Array(10).fill(0); // CLEAR FLAGS // - let rArray = Array(10).fill(0); // RANK ID // + let rArray = Array(10).fill(-1); // RANK ID // let esArray = Array(10).fill(0); // EXSCORE // let optArray = Array(10).fill(0); // USED OPTION (CastHour) // let opt2Array = Array(10).fill(0); // USED OPTION (CastHour) // @@ -478,13 +478,11 @@ export const musicreg: EPR = async (info, data, send) => { else if (!_.isNil($(data).attr().dj_level)) rid = parseInt($(data).attr().dj_level); if (rid > -1) console.log(`[music.reg] rank_id : ${rid}`); - if (version == 15) ghost = HextoBase64($(data).str("ghost")); - else ghost = $(data).buffer("ghost").toString("base64"); - - console.log(ghost); + if (version == 14 || version == 15) ghost = HextoBase64($(data).str("ghost")); + else ghost = NumArraytoBase64($(data).buffer("ghost")); if (version >= 27) { - ghost_gauge = $(data).buffer("ghost_gauge").toString("base64"); + ghost_gauge = NumArraytoBase64($(data).buffer("ghost_gauge")); style = parseInt($(data).element("music_play_log").attr().play_style); if (version >= 29) { @@ -841,7 +839,7 @@ export const musiccrate: EPR = async (info, data, send) => { } let indices = [1, 2, 3, 6, 7, 8]; - if (version == 15) { + if (version == 14 || version == 15) { let verMid = OldMidToVerMid(parseInt(key)); let str = cltype == 0 ? @@ -864,7 +862,7 @@ export const musiccrate: EPR = async (info, data, send) => { } } - if (version == 15) result = { cdata }; + if (version == 14 || version == 15) result = { cdata }; else result = { c }; return send.object(result); diff --git a/iidx@asphyxia/handlers/pc.ts b/iidx@asphyxia/handlers/pc.ts index dc38987..2669464 100644 --- a/iidx@asphyxia/handlers/pc.ts +++ b/iidx@asphyxia/handlers/pc.ts @@ -1,7 +1,7 @@ -import { pcdata, KDZ_pcdata, IIDX27_pcdata, IIDX28_pcdata, IIDX29_pcdata, IIDX30_pcdata, JDZ_pcdata, LDJ_pcdata, IIDX21_pcdata, IIDX22_pcdata, IIDX23_pcdata, IIDX24_pcdata, IIDX25_pcdata, IIDX26_pcdata, JDJ_pcdata, HDD_pcdata, I00_pcdata } from "../models/pcdata"; +import { pcdata, KDZ_pcdata, IIDX27_pcdata, IIDX28_pcdata, IIDX29_pcdata, IIDX30_pcdata, JDZ_pcdata, LDJ_pcdata, IIDX21_pcdata, IIDX22_pcdata, IIDX23_pcdata, IIDX24_pcdata, IIDX25_pcdata, IIDX26_pcdata, JDJ_pcdata, HDD_pcdata, I00_pcdata, GLD_pcdata } from "../models/pcdata"; import { grade } from "../models/grade"; import { custom, default_custom } from "../models/custom"; -import { IDtoCode, IDtoRef, Base64toNumArray, GetVersion, ReftoProfile, ReftoPcdata, ReftoQPRO, appendSettingConverter, NumArrayToString, NumArraytoHex } from "../util"; +import { IDtoCode, IDtoRef, Base64toNumArray, GetVersion, ReftoProfile, ReftoPcdata, ReftoQPRO, appendSettingConverter, NumArrayToString, NumArraytoHex, NumArraytoBase64 } from "../util"; import { eisei_grade, eisei_grade_data, lightning_musicmemo, lightning_musicmemo_new, lightning_playdata, lightning_settings, lm_playdata, lm_settings, lm_settings_new, musicmemo_data, musicmemo_data_new } from "../models/lightning"; import { profile, default_profile } from "../models/profile"; import { rival, rival_data } from "../models/rival"; @@ -290,6 +290,9 @@ export const pcreg: EPR = async (info, data, send) => { let lightning_settings: object; let lightning_playdata: object; switch (version) { + case 14: + pcdata = GLD_pcdata; + break; case 15: pcdata = HDD_pcdata; break; @@ -495,6 +498,7 @@ export const pcget: EPR = async (info, data, send) => { rArray.push(rival_data); } + rArray.sort((a: rival_data, b: rival_data): number => a.play_style - b.play_style || a.index - b.index); } @@ -512,7 +516,32 @@ export const pcget: EPR = async (info, data, send) => { } let event, gradeStr = "", exStr = "", skinStr = ""; - if (version == 15) { + if (version == 14) { + dArray.forEach((res) => { + gradeStr += NumArrayToString([6, 3, 2, 7], [res[1], res[2], res[0], res[3]]); + }); + + expert.sort((a: expert, b: expert) => a.coid - b.coid); + expert.forEach((res) => { + for (let a = 0; a < 6; a++) { + exStr += NumArrayToString([6, 5, 1], [res.coid, a, res.cArray[a]]); + exStr += NumArrayToString([18], [res.pgArray[a]]); + exStr += NumArrayToString([18], [res.gArray[a]]); + } + }); + + skinStr += NumArrayToString([12], [custom.frame, custom.turntable, custom.note_burst, custom.menu_music, appendsettings, custom.lane_cover, 0, custom.category_vox]); + + return send.pugFile("pug/GLD/pcget.pug", { + profile, + pcdata, + gradeStr, + exStr, + skinStr, + rArray, + }); + } + else if (version == 15) { dArray.forEach((res) => { gradeStr += NumArrayToString([6, 3, 2, 7], [res[1], res[2], res[0], res[3]]); }); @@ -975,6 +1004,9 @@ export const pctakeover: EPR = async (info, data, send) => { let lightning_settings: object; let lightning_playdata: object; switch (version) { + case 14: + pcdata = GLD_pcdata; + break; case 15: pcdata = HDD_pcdata; break; @@ -1147,7 +1179,32 @@ export const pcsave: EPR = async (info, data, send) => { pcdata.mode = parseInt($(data).attr().mode); pcdata.pmode = parseInt($(data).attr().pmode); - if (version == 15) { + if (version == 14) { + if (cltype == 0) { + pcdata.sach = parseInt($(data).attr().achi); + pcdata.sp_opt = parseInt($(data).attr().opt); + } + else { + pcdata.dach = parseInt($(data).attr().achi); + pcdata.dp_opt = parseInt($(data).attr().opt); + pcdata.dp_opt2 = parseInt($(data).attr().opt2); + } + + pcdata.gno = parseInt($(data).attr().gno); + pcdata.sflg0 = parseInt($(data).attr().sflg0); + pcdata.sflg1 = parseInt($(data).attr().sflg1); + pcdata.sflg2 = parseInt($(data).attr().sflg2); + pcdata.sdhd = parseInt($(data).attr().sdhd); + pcdata.ncomb = parseInt($(data).attr().ncomb); + pcdata.mcomb = parseInt($(data).attr().mcomb); + + if (!_.isNil($(data).attr().now_g)) { + pcdata.gold_now = parseInt($(data).attr().now_g); + pcdata.gold_all = parseInt($(data).attr().all_g); + pcdata.gold_use = parseInt($(data).attr().use_g); + } + } + else if (version == 15) { if (cltype == 0) { pcdata.sach = parseInt($(data).attr().achi); pcdata.sp_opt = parseInt($(data).attr().opt); @@ -1447,8 +1504,8 @@ export const pcsave: EPR = async (info, data, send) => { pcdata.st_dp_mplay = parseInt($(data).attr("step").dp_mplay); } pcdata.st_review = parseInt($(data).attr("step").review); - pcdata.st_stamp = $(data).buffer("step").toString("base64"); // TODO:: verify // - pcdata.st_help = $(data).element("step").buffer("help").toString("base64"); + pcdata.st_stamp = NumArraytoBase64($(data).buffer("step")); // TODO:: verify // + pcdata.st_help = NumArraytoBase64($(data).element("step").buffer("help")); } if (!_.isNil($(data).element("achievements"))) { @@ -1725,10 +1782,10 @@ export const pcsave: EPR = async (info, data, send) => { } if (!_.isNil($(data).element("favorite"))) { - pcdata.sp_mlist = $(data).element("favorite").buffer("sp_mlist").toString("base64"); - pcdata.sp_clist = $(data).element("favorite").buffer("sp_clist").toString("base64"); - pcdata.dp_mlist = $(data).element("favorite").buffer("dp_mlist").toString("base64"); - pcdata.dp_clist = $(data).element("favorite").buffer("dp_clist").toString("base64"); + pcdata.sp_mlist = NumArraytoBase64($(data).element("favorite").buffer("sp_mlist")); + pcdata.sp_clist = NumArraytoBase64($(data).element("favorite").buffer("sp_clist")); + pcdata.dp_mlist = NumArraytoBase64($(data).element("favorite").buffer("dp_mlist")); + pcdata.dp_clist = NumArraytoBase64($(data).element("favorite").buffer("dp_clist")); } if (!_.isNil($(data).element("qpro_secret"))) { @@ -1760,7 +1817,7 @@ export const pcsave: EPR = async (info, data, send) => { pcdata.st_sp_mplay = parseInt($(data).attr("step").sp_mplay); pcdata.st_dp_mplay = parseInt($(data).attr("step").dp_mplay); pcdata.st_last_select = parseInt($(data).attr("step").last_select); - pcdata.st_album = $(data).buffer("step").toString("base64"); // TODO:: verify // + pcdata.st_album = NumArraytoBase64($(data).buffer("step")); // TODO:: verify // } if (!_.isNil($(data).element("deller"))) pcdata.deller += parseInt($(data).attr("deller").deller); @@ -1990,10 +2047,10 @@ export const pcsave: EPR = async (info, data, send) => { } if (!_.isNil($(data).element("favorite"))) { - pcdata.sp_mlist = $(data).element("favorite").buffer("sp_mlist").toString("base64"); - pcdata.sp_clist = $(data).element("favorite").buffer("sp_clist").toString("base64"); - pcdata.dp_mlist = $(data).element("favorite").buffer("dp_mlist").toString("base64"); - pcdata.dp_clist = $(data).element("favorite").buffer("dp_clist").toString("base64"); + pcdata.sp_mlist = NumArraytoBase64($(data).element("favorite").buffer("sp_mlist")); + pcdata.sp_clist = NumArraytoBase64($(data).element("favorite").buffer("sp_clist")); + pcdata.dp_mlist = NumArraytoBase64($(data).element("favorite").buffer("dp_mlist")); + pcdata.dp_clist = NumArraytoBase64($(data).element("favorite").buffer("dp_clist")); } if (!_.isNil($(data).element("qpro_secret"))) { @@ -2033,7 +2090,7 @@ export const pcsave: EPR = async (info, data, send) => { pcdata.st_sp_mplay = parseInt($(data).attr("step").sp_mplay); pcdata.st_dp_mplay = parseInt($(data).attr("step").dp_mplay); pcdata.st_age_list = parseInt($(data).attr("step").age_list); - pcdata.st_album = $(data).buffer("step").toString("base64"); // TODO:: verify // + pcdata.st_album = NumArraytoBase64($(data).buffer("step")); // TODO:: verify // pcdata.st_is_present = parseInt($(data).attr("step").is_present); pcdata.st_is_future = parseInt($(data).attr("step").is_future); } @@ -2225,10 +2282,10 @@ export const pcsave: EPR = async (info, data, send) => { } if (!_.isNil($(data).element("favorite"))) { - pcdata.sp_mlist = $(data).element("favorite").buffer("sp_mlist").toString("base64"); - pcdata.sp_clist = $(data).element("favorite").buffer("sp_clist").toString("base64"); - pcdata.dp_mlist = $(data).element("favorite").buffer("dp_mlist").toString("base64"); - pcdata.dp_clist = $(data).element("favorite").buffer("dp_clist").toString("base64"); + pcdata.sp_mlist = NumArraytoBase64($(data).element("favorite").buffer("sp_mlist")); + pcdata.sp_clist = NumArraytoBase64($(data).element("favorite").buffer("sp_clist")); + pcdata.dp_mlist = NumArraytoBase64($(data).element("favorite").buffer("dp_mlist")); + pcdata.dp_clist = NumArraytoBase64($(data).element("favorite").buffer("dp_clist")); } if (!_.isNil($(data).element("qpro_secret"))) { @@ -2268,7 +2325,7 @@ export const pcsave: EPR = async (info, data, send) => { pcdata.st_sp_mplay = parseInt($(data).attr("step").sp_mplay); pcdata.st_dp_mplay = parseInt($(data).attr("step").dp_mplay); pcdata.st_mission_gauge = parseInt($(data).attr("step").mission_gauge); - pcdata.st_tokimeki = $(data).buffer("step").toString("base64"); // TODO:: verify // + pcdata.st_tokimeki = NumArraytoBase64($(data).buffer("step")); // TODO:: verify // } if (!_.isNil($(data).element("deller"))) pcdata.deller += parseInt($(data).attr("deller").deller); @@ -2395,10 +2452,10 @@ export const pcsave: EPR = async (info, data, send) => { } if (!_.isNil($(data).element("favorite"))) { - pcdata.sp_mlist = $(data).element("favorite").buffer("sp_mlist").toString("base64"); - pcdata.sp_clist = $(data).element("favorite").buffer("sp_clist").toString("base64"); - pcdata.dp_mlist = $(data).element("favorite").buffer("dp_mlist").toString("base64"); - pcdata.dp_clist = $(data).element("favorite").buffer("dp_clist").toString("base64"); + pcdata.sp_mlist = NumArraytoBase64($(data).element("favorite").buffer("sp_mlist")); + pcdata.sp_clist = NumArraytoBase64($(data).element("favorite").buffer("sp_clist")); + pcdata.dp_mlist = NumArraytoBase64($(data).element("favorite").buffer("dp_mlist")); + pcdata.dp_clist = NumArraytoBase64($(data).element("favorite").buffer("dp_clist")); } if (!_.isNil($(data).element("qpro_secret"))) { @@ -2582,10 +2639,10 @@ export const pcsave: EPR = async (info, data, send) => { } if (!_.isNil($(data).element("favorite"))) { - pcdata.sp_mlist = $(data).element("favorite").buffer("sp_mlist").toString("base64"); - pcdata.sp_clist = $(data).element("favorite").buffer("sp_clist").toString("base64"); - pcdata.dp_mlist = $(data).element("favorite").buffer("dp_mlist").toString("base64"); - pcdata.dp_clist = $(data).element("favorite").buffer("dp_clist").toString("base64"); + pcdata.sp_mlist = NumArraytoBase64($(data).element("favorite").buffer("sp_mlist")); + pcdata.sp_clist = NumArraytoBase64($(data).element("favorite").buffer("sp_clist")); + pcdata.dp_mlist = NumArraytoBase64($(data).element("favorite").buffer("dp_mlist")); + pcdata.dp_clist = NumArraytoBase64($(data).element("favorite").buffer("dp_clist")); } if (!_.isNil($(data).element("qpro_secret"))) { @@ -2755,10 +2812,10 @@ export const pcsave: EPR = async (info, data, send) => { } if (!_.isNil($(data).element("favorite"))) { - pcdata.sp_mlist = $(data).element("favorite").buffer("sp_mlist").toString("base64"); - pcdata.sp_clist = $(data).element("favorite").buffer("sp_clist").toString("base64"); - pcdata.dp_mlist = $(data).element("favorite").buffer("dp_mlist").toString("base64"); - pcdata.dp_clist = $(data).element("favorite").buffer("dp_clist").toString("base64"); + pcdata.sp_mlist = NumArraytoBase64($(data).element("favorite").buffer("sp_mlist")); + pcdata.sp_clist = NumArraytoBase64($(data).element("favorite").buffer("sp_clist")); + pcdata.dp_mlist = NumArraytoBase64($(data).element("favorite").buffer("dp_mlist")); + pcdata.dp_clist = NumArraytoBase64($(data).element("favorite").buffer("dp_clist")); } if (!_.isNil($(data).element("qpro_secret"))) { diff --git a/iidx@asphyxia/index.ts b/iidx@asphyxia/index.ts index 847b2b9..e517015 100644 --- a/iidx@asphyxia/index.ts +++ b/iidx@asphyxia/index.ts @@ -15,6 +15,7 @@ export function register() { R.Contributor("duel0213"); + R.GameCode("GLD"); R.GameCode("HDD"); R.GameCode("I00"); R.GameCode("JDJ"); diff --git a/iidx@asphyxia/models/pcdata.ts b/iidx@asphyxia/models/pcdata.ts index 59633bf..6fd3a10 100644 --- a/iidx@asphyxia/models/pcdata.ts +++ b/iidx@asphyxia/models/pcdata.ts @@ -120,6 +120,10 @@ export interface pcdata { sgid: number; // grade // dgid: number; + gold_now: number; + gold_all: number; + gold_use: number; + jewel_num: string; jewel_bnum: number[]; party: number[]; @@ -220,6 +224,34 @@ export interface pcdata { tourism_secret_flg2: string[]; } +export const GLD_pcdata = { + version: 14, + + spnum: 0, + dpnum: 0, + sach: 0, + dach: 0, + sflg0: 0, + sflg1: 0, + sflg2: 0, + gno: 0, + sdhd: 0, + sp_opt: 0, + dp_opt: 0, + dp_opt2: 0, + mcomb: 0, + ncomb: 0, + mode: 0, + pmode: 0, + + sgid: -1, + dgid: -1, + + gold_now: 0, + gold_all: 0, + gold_use: 0, +} + export const HDD_pcdata = { version: 15, diff --git a/iidx@asphyxia/pug/GLD/pcget.pug b/iidx@asphyxia/pug/GLD/pcget.pug new file mode 100644 index 0000000..01ace8d --- /dev/null +++ b/iidx@asphyxia/pug/GLD/pcget.pug @@ -0,0 +1,9 @@ +pc(status="0") + pcdata(id=profile.id idstr=profile.idstr name=profile.name pid=profile.pid spnum=pcdata.spnum dpnum=pcdata.dpnum sach=pcdata.sach dach=pcdata.dach sflg0=pcdata.sflg0 sflg1=pcdata.sflg1 sflg2=pcdata.sflg2 gno=pcdata.gno sdhd=pcdata.sdhd sp_opt=pcdata.sp_opt dp_opt=pcdata.dp_opt dp_opt2=pcdata.dp_opt2 mcomb=pcdata.mcomb ncomb=pcdata.ncomb mode=pcdata.mode pmode=pcdata.pmode) + grade(sgid=pcdata.sgid dgid=pcdata.dgid __type="str") #{gradeStr} + ex(__type="str") #{exStr} + skin(__type="str") #{skinStr} + rlist + - for (let rd of rArray) + rival(rno=rd.index id=rd.profile[2] id_str=rd.profile[3] djname=rd.profile[0] pid=rd.profile[1] sg=rd.pcdata[0] dg=rd.pcdata[1] sa=rd.pcdata[2] da=rd.pcdata[3]) + gold(now_g=pcdata.gold_now all_g=pcdata.gold_all use_g=pcdata.gold_use) diff --git a/iidx@asphyxia/util.ts b/iidx@asphyxia/util.ts index b5e73f5..ee8df6f 100644 --- a/iidx@asphyxia/util.ts +++ b/iidx@asphyxia/util.ts @@ -40,6 +40,28 @@ export function ClidToPlaySide(clid: number) { return clid < 5 ? 0 : 1; } +export function NumArraytoBase64(buff: number[]) { + const base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + let result = ""; + + for (let i = 0; i < buff.length; i += 3) { + const chunk = (buff[i] << 16) | (buff[i + 1] << 8) | buff[i + 2]; + result += base64Chars[(chunk >> 18) & 63] + + base64Chars[(chunk >> 12) & 63] + + base64Chars[(chunk >> 6) & 63] + + base64Chars[chunk & 63]; + } + + const padding = buff.length % 3; + if (padding === 1) { + result = result.slice(0, -2) + "=="; + } else if (padding === 2) { + result = result.slice(0, -1) + "="; + } + + return result; +} + export function Base64toNumArray(s: string) { const base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; let p = -8, @@ -48,6 +70,8 @@ export function Base64toNumArray(s: string) { d: number, buffer: number[] = []; + if (_.isNil(s)) return buffer; + for (let i = 0; i < s.length; i++) { if ((c = base64Chars.indexOf(s.charAt(i))) < 0) continue; a = (a << 6) | (c & 63); @@ -158,6 +182,7 @@ export function NumArrayToString(bits: number[], numArray: number[]): string { export function GetVersion(info: EamuseInfo) { let version = -1; switch (info.model.substring(0, 3)) { + case "GLD": return 14; case "HDD": return 15; case "I00": return 16; case "JDJ": return 17;