diff --git a/src/idz/decoder/checkTeamName.ts b/src/idz/decoder/checkTeamName.ts new file mode 100644 index 0000000..78ab285 --- /dev/null +++ b/src/idz/decoder/checkTeamName.ts @@ -0,0 +1,9 @@ +import { RequestCode } from "./_defs"; +import { CheckTeamNameRequest } from "../request/checkTeamName"; + +checkTeamName.msgCode = 0x00a2 as RequestCode; +checkTeamName.msgLen = 0x0040; + +export function checkTeamName(buf: Buffer): CheckTeamNameRequest { + return { type: "check_team_name_req" }; +} diff --git a/src/idz/decoder/createTeam.ts b/src/idz/decoder/createTeam.ts new file mode 100644 index 0000000..8962876 --- /dev/null +++ b/src/idz/decoder/createTeam.ts @@ -0,0 +1,23 @@ +import iconv = require("iconv-lite"); + +import { RequestCode } from "./_defs"; +import { Id } from "../model/base"; +import { Profile } from "../model/profile"; +import { CreateTeamRequest } from "../request/createTeam"; + +createTeam.msgCode = 0x0071 as RequestCode; +createTeam.msgLen = 0x0050; + +export function createTeam(buf: Buffer): CreateTeamRequest { + return { + type: "create_team_req", + profileId: buf.readUInt32LE(0x0004) as Id, + teamName: iconv.decode(buf.slice(0x0008, 0x0028), "shift_jis"), + field_0028: buf.readUInt16LE(0x0028), + field_002C: buf.readUInt32LE(0x002c), + field_0030: buf.readUInt8(0x0030), + field_0032: buf.readUInt16LE(0x0032), + prevTeamId: buf.readUInt32LE(0x0034), + field_0038: buf.slice(0x0038, 0x0045), + }; +} diff --git a/src/idz/decoder/index.ts b/src/idz/decoder/index.ts index 2cd6f5e..5b46647 100644 --- a/src/idz/decoder/index.ts +++ b/src/idz/decoder/index.ts @@ -1,7 +1,8 @@ import { Transform } from "stream"; -import { saveTimeAttack } from "./saveTimeAttack"; +import { checkTeamName } from "./checkTeamName"; import { createProfile } from "./createProfile"; +import { createTeam } from "./createTeam"; import { joinAutoTeam } from "./joinAutoTeam"; import { discoverProfile } from "./discoverProfile"; import { load2on2 } from "./load2on2"; @@ -23,6 +24,7 @@ import { saveGarage } from "./saveGarage"; import { saveProfile } from "./saveProfile"; import { saveSettings } from "./saveSettings"; import { saveStocker } from "./saveStocker"; +import { saveTimeAttack } from "./saveTimeAttack"; import { saveTopic } from "./saveTopic"; import { unlockProfile } from "./unlockProfile"; import { updateProvisionalStoreRank } from "./updateProvisionalStoreRank"; @@ -41,7 +43,9 @@ export type ReaderFn = ((buf: Buffer) => Request) & { }; const funcList: ReaderFn[] = [ + checkTeamName, createProfile, + createTeam, joinAutoTeam, discoverProfile, load2on2, diff --git a/src/idz/encoder/checkTeamName.ts b/src/idz/encoder/checkTeamName.ts new file mode 100644 index 0000000..0ae229e --- /dev/null +++ b/src/idz/encoder/checkTeamName.ts @@ -0,0 +1,10 @@ +import { CheckTeamNameResponse } from "../response/checkTeamName"; + +export function checkTeamName(res: CheckTeamNameResponse): Buffer { + const buf = Buffer.alloc(0x0010); + + buf.writeUInt16LE(0x00a3, 0x0000); + buf.writeUInt32LE(res.status, 0x0004); + + return buf; +} diff --git a/src/idz/encoder/createTeam.ts b/src/idz/encoder/createTeam.ts new file mode 100644 index 0000000..0f48984 --- /dev/null +++ b/src/idz/encoder/createTeam.ts @@ -0,0 +1,11 @@ +import { CreateTeamResponse } from "../response/createTeam"; + +export function createTeam(res: CreateTeamResponse): Buffer { + const buf = Buffer.alloc(0x0010); + + buf.writeUInt16LE(0x0072, 0x0000); + buf.writeUInt32LE(res.status, 0x0004); + buf.writeUInt32LE(res.teamId, 0x0008); + + return buf; +} diff --git a/src/idz/encoder/index.ts b/src/idz/encoder/index.ts index b580a54..f3f6daf 100644 --- a/src/idz/encoder/index.ts +++ b/src/idz/encoder/index.ts @@ -1,6 +1,8 @@ import { Transform } from "stream"; import { _team } from "./_team"; +import { checkTeamName } from "./checkTeamName"; +import { createTeam } from "./createTeam"; import { discoverProfile } from "./discoverProfile"; import { generic } from "./generic"; import { lockProfile } from "./lockProfile"; @@ -27,6 +29,12 @@ import { Response } from "../response"; function encode(res: Response): Buffer { switch (res.type) { + case "check_team_name_res": + return checkTeamName(res); + + case "create_team_res": + return createTeam(res); + case "discover_profile_res": return discoverProfile(res); diff --git a/src/idz/handler/checkTeamName.ts b/src/idz/handler/checkTeamName.ts new file mode 100644 index 0000000..934d766 --- /dev/null +++ b/src/idz/handler/checkTeamName.ts @@ -0,0 +1,13 @@ +import { CheckTeamNameRequest } from "../request/checkTeamName"; +import { CheckTeamNameResponse } from "../response/checkTeamName"; +import { World } from "../world"; + +export function checkTeamName( + w: World, + req: CheckTeamNameRequest +): CheckTeamNameResponse { + return { + type: "check_team_name_res", + status: 0, + }; +} diff --git a/src/idz/handler/createTeam.ts b/src/idz/handler/createTeam.ts new file mode 100644 index 0000000..14f7315 --- /dev/null +++ b/src/idz/handler/createTeam.ts @@ -0,0 +1,16 @@ +import { Id } from "../model/base"; +import { Team } from "../model/team"; +import { CreateTeamRequest } from "../request/createTeam"; +import { CreateTeamResponse } from "../response/createTeam"; +import { World } from "../world"; + +export function createTeam( + w: World, + req: CreateTeamRequest +): CreateTeamResponse { + return { + type: "create_team_res", + status: 0, + teamId: 3 as Id, + }; +} diff --git a/src/idz/handler/index.ts b/src/idz/handler/index.ts index 13c825d..2dd7379 100644 --- a/src/idz/handler/index.ts +++ b/src/idz/handler/index.ts @@ -1,6 +1,7 @@ import { _team } from "./_team"; -import { saveTimeAttack } from "./saveTimeAttack"; +import { checkTeamName } from "./checkTeamName"; import { createProfile } from "./createProfile"; +import { createTeam } from "./createTeam"; import { discoverProfile } from "./discoverProfile"; import { load2on2 } from "./load2on2"; import { loadConfig } from "./loadConfig"; @@ -21,6 +22,7 @@ import { saveGarage } from "./saveGarage"; import { saveProfile } from "./saveProfile"; import { saveSettings } from "./saveSettings"; import { saveStocker } from "./saveStocker"; +import { saveTimeAttack } from "./saveTimeAttack"; import { saveTopic } from "./saveTopic"; import { unlockProfile } from "./unlockProfile"; import { updateProvisionalStoreRank } from "./updateProvisionalStoreRank"; @@ -35,9 +37,15 @@ import { World } from "../world"; export async function dispatch(w: World, req: Request): Promise { switch (req.type) { + case "check_team_name_req": + return checkTeamName(w, req); + case "create_profile_req": return createProfile(w, req); + case "create_team_req": + return createTeam(w, req); + case "join_auto_team_req": return _team(w, req); diff --git a/src/idz/request/checkTeamName.ts b/src/idz/request/checkTeamName.ts new file mode 100644 index 0000000..c80dd09 --- /dev/null +++ b/src/idz/request/checkTeamName.ts @@ -0,0 +1,3 @@ +export interface CheckTeamNameRequest { + type: "check_team_name_req"; +} diff --git a/src/idz/request/createTeam.ts b/src/idz/request/createTeam.ts new file mode 100644 index 0000000..b0e18e4 --- /dev/null +++ b/src/idz/request/createTeam.ts @@ -0,0 +1,14 @@ +import { Id } from "../model/base"; +import { Profile } from "../model/profile"; + +export interface CreateTeamRequest { + type: "create_team_req"; + profileId: Id; // u32 + teamName: string; // len 0x20 + field_0028: number; // u16 + field_002C: number; // u32 (but only holds a u8) + field_0030: number; // u8 + field_0032: number; // u16 + prevTeamId: number; // u32 + field_0038: Buffer; // len 0x0D ..? weird length +} diff --git a/src/idz/request/index.ts b/src/idz/request/index.ts index b724ab0..5419934 100644 --- a/src/idz/request/index.ts +++ b/src/idz/request/index.ts @@ -1,4 +1,6 @@ +import { CheckTeamNameRequest } from "./checkTeamName"; import { CreateProfileRequest } from "./createProfile"; +import { CreateTeamRequest } from "./createTeam"; import { DiscoverProfileRequest } from "./discoverProfile"; import { JoinAutoTeamRequest } from "./joinAutoTeam"; import { Load2on2Request } from "./load2on2"; @@ -32,7 +34,9 @@ import { UpdateUiReportRequest } from "./updateUiReport"; import { UpdateUserLogRequest } from "./updateUserLog"; export type Request = + | CheckTeamNameRequest | CreateProfileRequest + | CreateTeamRequest | DiscoverProfileRequest | JoinAutoTeamRequest | Load2on2Request diff --git a/src/idz/response/checkTeamName.ts b/src/idz/response/checkTeamName.ts new file mode 100644 index 0000000..7143835 --- /dev/null +++ b/src/idz/response/checkTeamName.ts @@ -0,0 +1,4 @@ +export interface CheckTeamNameResponse { + type: "check_team_name_res"; + status: number; // Anything other than 4 is success +} diff --git a/src/idz/response/createTeam.ts b/src/idz/response/createTeam.ts new file mode 100644 index 0000000..aa2d886 --- /dev/null +++ b/src/idz/response/createTeam.ts @@ -0,0 +1,8 @@ +import { Id } from "../model/base"; +import { Team } from "../model/team"; + +export interface CreateTeamResponse { + type: "create_team_res"; + status: number; // 0 is success, 1 is failure + teamId: Id; +} diff --git a/src/idz/response/index.ts b/src/idz/response/index.ts index d708123..836b412 100644 --- a/src/idz/response/index.ts +++ b/src/idz/response/index.ts @@ -1,3 +1,5 @@ +import { CheckTeamNameResponse } from "./checkTeamName"; +import { CreateTeamResponse } from "./createTeam"; import { DiscoverProfileResponse } from "./discoverProfile"; import { GenericResponse } from "./generic"; import { JoinAutoTeamResponse } from "./joinAutoTeam"; @@ -24,6 +26,8 @@ import { UpdateStoryClearNumResponse } from "./updateStoryClearNum"; import { UnlockProfileResponse } from "./unlockProfile"; export type Response = + | CheckTeamNameResponse + | CreateTeamResponse | DiscoverProfileResponse | GenericResponse | JoinAutoTeamResponse