diff --git a/src/idz/decoder/index.ts b/src/idz/decoder/index.ts index 0979f24..d6f00cd 100644 --- a/src/idz/decoder/index.ts +++ b/src/idz/decoder/index.ts @@ -35,7 +35,10 @@ import { saveTimeAttack1, saveTimeAttack2 } from "./saveTimeAttack"; import { saveTopic } from "./saveTopic"; import { unlockProfile } from "./unlockProfile"; import { updateProvisionalStoreRank } from "./updateProvisionalStoreRank"; -import { updateStoryClearNum } from "./updateStoryClearNum"; +import { + updateStoryClearNum1, + updateStoryClearNum2, +} from "./updateStoryClearNum"; import { RequestCode } from "./_defs"; import { Request } from "../request"; import { updateResult } from "./updateResult"; @@ -93,7 +96,8 @@ const funcList: ReaderFn[] = [ unlockProfile, updateProvisionalStoreRank, updateResult, - updateStoryClearNum, + updateStoryClearNum1, + updateStoryClearNum2, updateTeamPoints, updateUiReport, updateUserLog, diff --git a/src/idz/decoder/updateStoryClearNum.ts b/src/idz/decoder/updateStoryClearNum.ts index 1d703f6..ae5ce8d 100644 --- a/src/idz/decoder/updateStoryClearNum.ts +++ b/src/idz/decoder/updateStoryClearNum.ts @@ -1,11 +1,29 @@ import { RequestCode } from "./_defs"; -import { UpdateStoryClearNumRequest } from "../request/updateStoryClearNum"; +import { + UpdateStoryClearNumRequest1, + UpdateStoryClearNumRequest2, +} from "../request/updateStoryClearNum"; -updateStoryClearNum.msgCode = 0x007f as RequestCode; -updateStoryClearNum.msgLen = 0x0010; +updateStoryClearNum1.msgCode = 0x007f as RequestCode; +updateStoryClearNum1.msgLen = 0x0010; -export function updateStoryClearNum(buf: Buffer): UpdateStoryClearNumRequest { +export function updateStoryClearNum1( + buf: Buffer +): UpdateStoryClearNumRequest1 { return { type: "update_story_clear_num_req", + format: 1, + }; +} + +updateStoryClearNum2.msgCode = 0x013d as RequestCode; +updateStoryClearNum2.msgLen = 0x0010; + +export function updateStoryClearNum2( + buf: Buffer +): UpdateStoryClearNumRequest2 { + return { + type: "update_story_clear_num_req", + format: 2, }; } diff --git a/src/idz/encoder/updateStoryClearNum.ts b/src/idz/encoder/updateStoryClearNum.ts index 83b3039..63333e9 100644 --- a/src/idz/encoder/updateStoryClearNum.ts +++ b/src/idz/encoder/updateStoryClearNum.ts @@ -1,9 +1,36 @@ -import { UpdateStoryClearNumResponse } from "../response/updateStoryClearNum"; +import { + UpdateStoryClearNumResponse, + UpdateStoryClearNumResponse1, + UpdateStoryClearNumResponse2, +} from "../response/updateStoryClearNum"; -export function updateStoryClearNum(res: UpdateStoryClearNumResponse) { +export function updateStoryClearNum(res: UpdateStoryClearNumResponse): Buffer { + switch (res.format) { + case 1: + return updateStoryClearNum1(res); + + case 2: + return updateStoryClearNum2(res); + + default: + const exhaust: never = res; + + throw new Error(`Unsupported data format ${res["format"]}`); + } +} + +function updateStoryClearNum1(res: UpdateStoryClearNumResponse1): Buffer { const buf = Buffer.alloc(0x0220); buf.writeInt16LE(0x0080, 0x0000); return buf; } + +function updateStoryClearNum2(res: UpdateStoryClearNumResponse2): Buffer { + const buf = Buffer.alloc(0x04f0); + + buf.writeInt16LE(0x013e, 0x0000); + + return buf; +} diff --git a/src/idz/handler/updateStoryClearNum.ts b/src/idz/handler/updateStoryClearNum.ts index 2b4970e..29d88ea 100644 --- a/src/idz/handler/updateStoryClearNum.ts +++ b/src/idz/handler/updateStoryClearNum.ts @@ -8,5 +8,6 @@ export function updateStoryClearNum( ): UpdateStoryClearNumResponse { return { type: "update_story_clear_num_res", + format: req.format as any, }; } diff --git a/src/idz/request/updateStoryClearNum.ts b/src/idz/request/updateStoryClearNum.ts index ba28fd8..b3349a1 100644 --- a/src/idz/request/updateStoryClearNum.ts +++ b/src/idz/request/updateStoryClearNum.ts @@ -1,3 +1,17 @@ -export interface UpdateStoryClearNumRequest { +interface UpdateStoryClearNumRequestBase { type: "update_story_clear_num_req"; } + +export interface UpdateStoryClearNumRequest1 + extends UpdateStoryClearNumRequestBase { + format: 1; +} + +export interface UpdateStoryClearNumRequest2 + extends UpdateStoryClearNumRequestBase { + format: 2; +} + +export type UpdateStoryClearNumRequest = + | UpdateStoryClearNumRequest1 + | UpdateStoryClearNumRequest2; diff --git a/src/idz/response/updateStoryClearNum.ts b/src/idz/response/updateStoryClearNum.ts index 190fbfc..ecf3096 100644 --- a/src/idz/response/updateStoryClearNum.ts +++ b/src/idz/response/updateStoryClearNum.ts @@ -1,4 +1,18 @@ -export interface UpdateStoryClearNumResponse { +interface UpdateStoryClearNumResponseBase { type: "update_story_clear_num_res"; // TODO, looks like a table of 9 * 10 u32 fields } + +export interface UpdateStoryClearNumResponse1 + extends UpdateStoryClearNumResponseBase { + format: 1; +} + +export interface UpdateStoryClearNumResponse2 + extends UpdateStoryClearNumResponseBase { + format: 2; +} + +export type UpdateStoryClearNumResponse = + | UpdateStoryClearNumResponse1 + | UpdateStoryClearNumResponse2;