idz: Dispatch on declared protocol version
This commit is contained in:
+137
-11
@@ -7,7 +7,7 @@ import { discoverProfile } from "./discoverProfile";
|
||||
import { generic } from "./generic";
|
||||
import { lockProfile } from "./lockProfile";
|
||||
import { lockProfileExtend } from "./lockProfileExtend";
|
||||
import { load2on2 } from "./load2on2";
|
||||
import { load2on2_v1, load2on2_v2 } from "./load2on2";
|
||||
import { loadConfig } from "./loadConfig";
|
||||
import { loadConfig2 } from "./loadConfig2";
|
||||
import { loadEventInfo } from "./loadEventInfo";
|
||||
@@ -15,27 +15,32 @@ import { loadGacha } from "./loadGacha";
|
||||
import { loadGarage } from "./loadGarage";
|
||||
import { loadGeneralReward } from "./loadGeneralReward";
|
||||
import { loadGhost } from "./loadGhost";
|
||||
import { loadProfile } from "./loadProfile";
|
||||
import { loadProfile2 } from "./loadProfile2";
|
||||
import { loadProfile3 } from "./loadProfile3";
|
||||
import { loadRewardTable } from "./loadRewardTable";
|
||||
import { loadServerList } from "./loadServerList";
|
||||
import { loadStocker } from "./loadStocker";
|
||||
import { loadTeamRanking } from "./loadTeamRanking";
|
||||
import { loadTopTen } from "./loadTopTen";
|
||||
import { saveExpedition } from "./saveExpedition";
|
||||
import { saveExpedition1, saveExpedition2 } from "./saveExpedition";
|
||||
import { saveGarage } from "./saveGarage";
|
||||
import { saveNewCar } from "./saveNewCar";
|
||||
import { saveTimeAttack } from "./saveTimeAttack";
|
||||
import { saveTopic } from "./saveTopic";
|
||||
import { unlockProfile } from "./unlockProfile";
|
||||
import { updateProvisionalStoreRank } from "./updateProvisionalStoreRank";
|
||||
import { updateStoryClearNum } from "./updateStoryClearNum";
|
||||
import {
|
||||
updateStoryClearNum1,
|
||||
updateStoryClearNum2,
|
||||
} from "./updateStoryClearNum";
|
||||
import { updateTeamLeader } from "./updateTeamLeader";
|
||||
import { updateTeamMember } from "./updateTeamMember";
|
||||
import { Response } from "../response";
|
||||
import { ClientHello } from "../../common";
|
||||
|
||||
const debug = logger("app:idz:userdb:encoder");
|
||||
|
||||
function encode(res: Response): Buffer {
|
||||
function encode110(res: Response): Buffer {
|
||||
switch (res.type) {
|
||||
case "check_team_name_res":
|
||||
return checkTeamName(res);
|
||||
@@ -53,7 +58,7 @@ function encode(res: Response): Buffer {
|
||||
return generic(res);
|
||||
|
||||
case "load_2on2_res":
|
||||
return load2on2(res);
|
||||
return load2on2_v1(res);
|
||||
|
||||
case "load_config_res":
|
||||
return loadConfig(res);
|
||||
@@ -77,7 +82,7 @@ function encode(res: Response): Buffer {
|
||||
return loadGhost(res);
|
||||
|
||||
case "load_profile_res":
|
||||
return loadProfile(res);
|
||||
return loadProfile2(res);
|
||||
|
||||
case "load_reward_table_res":
|
||||
return loadRewardTable(res);
|
||||
@@ -104,7 +109,7 @@ function encode(res: Response): Buffer {
|
||||
return lockProfile(res);
|
||||
|
||||
case "save_expedition_res":
|
||||
return saveExpedition(res);
|
||||
return saveExpedition1(res);
|
||||
|
||||
case "save_garage_res":
|
||||
return saveGarage(res);
|
||||
@@ -122,7 +127,7 @@ function encode(res: Response): Buffer {
|
||||
return updateProvisionalStoreRank(res);
|
||||
|
||||
case "update_story_clear_num_res":
|
||||
return updateStoryClearNum(res);
|
||||
return updateStoryClearNum1(res);
|
||||
|
||||
case "update_team_leader_res":
|
||||
return updateTeamLeader(res);
|
||||
@@ -140,10 +145,131 @@ function encode(res: Response): Buffer {
|
||||
}
|
||||
}
|
||||
|
||||
export default function writeResponse(res: Response) {
|
||||
function encode130(res: Response): Buffer {
|
||||
switch (res.type) {
|
||||
case "check_team_name_res":
|
||||
return checkTeamName(res);
|
||||
|
||||
case "create_auto_team_res":
|
||||
return _team(res);
|
||||
|
||||
case "create_team_res":
|
||||
return createTeam(res);
|
||||
|
||||
case "discover_profile_res":
|
||||
return discoverProfile(res);
|
||||
|
||||
case "generic_res":
|
||||
return generic(res);
|
||||
|
||||
case "load_2on2_res":
|
||||
return load2on2_v2(res);
|
||||
|
||||
case "load_config_res":
|
||||
return loadConfig(res);
|
||||
|
||||
case "load_config_v2_res":
|
||||
return loadConfig2(res);
|
||||
|
||||
case "load_event_info_res":
|
||||
return loadEventInfo(res);
|
||||
|
||||
case "load_gacha_res":
|
||||
return loadGacha(res);
|
||||
|
||||
case "load_garage_res":
|
||||
return loadGarage(res);
|
||||
|
||||
case "load_general_reward_res":
|
||||
return loadGeneralReward(res);
|
||||
|
||||
case "load_ghost_res":
|
||||
return loadGhost(res);
|
||||
|
||||
case "load_profile_res":
|
||||
return loadProfile3(res);
|
||||
|
||||
case "load_reward_table_res":
|
||||
return loadRewardTable(res);
|
||||
|
||||
case "load_server_list_res":
|
||||
return loadServerList(res);
|
||||
|
||||
case "load_stocker_res":
|
||||
return loadStocker(res);
|
||||
|
||||
case "load_team_res":
|
||||
return _team(res);
|
||||
|
||||
case "load_team_ranking_res":
|
||||
return loadTeamRanking(res);
|
||||
|
||||
case "load_top_ten_res":
|
||||
return loadTopTen(res);
|
||||
|
||||
case "lock_profile_extend_res":
|
||||
return lockProfileExtend(res);
|
||||
|
||||
case "lock_profile_res":
|
||||
return lockProfile(res);
|
||||
|
||||
case "save_expedition_res":
|
||||
return saveExpedition2(res);
|
||||
|
||||
case "save_garage_res":
|
||||
return saveGarage(res);
|
||||
|
||||
case "save_new_car_res":
|
||||
return saveNewCar(res);
|
||||
|
||||
case "save_time_attack_res":
|
||||
return saveTimeAttack(res);
|
||||
|
||||
case "unlock_profile_res":
|
||||
return unlockProfile(res);
|
||||
|
||||
case "update_provisional_store_rank_res":
|
||||
return updateProvisionalStoreRank(res);
|
||||
|
||||
case "update_story_clear_num_res":
|
||||
return updateStoryClearNum2(res);
|
||||
|
||||
case "update_team_leader_res":
|
||||
return updateTeamLeader(res);
|
||||
|
||||
case "update_team_member_res":
|
||||
return updateTeamMember(res);
|
||||
|
||||
case "save_topic_res":
|
||||
return saveTopic(res);
|
||||
|
||||
default:
|
||||
const exhaustCheck: never = res;
|
||||
|
||||
throw new Error(`No writer fn for ${res["type"]}`);
|
||||
}
|
||||
}
|
||||
|
||||
function encode(res: Response, clientHello: ClientHello) {
|
||||
switch (clientHello.protocol) {
|
||||
case "110":
|
||||
return encode110(res);
|
||||
|
||||
case "130":
|
||||
return encode130(res);
|
||||
|
||||
default:
|
||||
throw new Error(`Unsupported protocol version ${clientHello.protocol}`);
|
||||
}
|
||||
}
|
||||
|
||||
export default function writeResponse(
|
||||
res: Response,
|
||||
clientHello: ClientHello
|
||||
) {
|
||||
debug("Object: %j", res);
|
||||
|
||||
const buf = encode(res);
|
||||
const buf = encode(res, clientHello);
|
||||
|
||||
if (debug.enabled) {
|
||||
debug("Encoded: %s", buf.toString("hex"));
|
||||
|
||||
@@ -1,25 +1,6 @@
|
||||
import {
|
||||
Load2on2Response,
|
||||
Load2on2Response1,
|
||||
Load2on2Response2,
|
||||
} from "../response/load2on2";
|
||||
import { Load2on2Response } from "../response/load2on2";
|
||||
|
||||
export function load2on2(res: Load2on2Response): Buffer {
|
||||
switch (res.format) {
|
||||
case 1:
|
||||
return load2on2_v1(res);
|
||||
|
||||
case 2:
|
||||
return load2on2_v2(res);
|
||||
|
||||
default:
|
||||
const exhaust: never = res;
|
||||
|
||||
throw new Error(`Unsupported 2on2 response format ${res["format"]}`);
|
||||
}
|
||||
}
|
||||
|
||||
function load2on2_v1(res: Load2on2Response1): Buffer {
|
||||
export function load2on2_v1(res: Load2on2Response): Buffer {
|
||||
const buf = Buffer.alloc(0x04c0);
|
||||
|
||||
buf.writeInt16LE(0x00b1, 0x0000);
|
||||
@@ -28,7 +9,7 @@ function load2on2_v1(res: Load2on2Response1): Buffer {
|
||||
}
|
||||
|
||||
// Same size but presumably incompatible somehow
|
||||
function load2on2_v2(res: Load2on2Response2): Buffer {
|
||||
export function load2on2_v2(res: Load2on2Response): Buffer {
|
||||
const buf = Buffer.alloc(0x04c0);
|
||||
|
||||
buf.writeInt16LE(0x0133, 0x0000);
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
import { loadProfile1 } from "./loadProfile1";
|
||||
import { loadProfile2 } from "./loadProfile2";
|
||||
import { loadProfile3 } from "./loadProfile3";
|
||||
import { LoadProfileResponse } from "../response/loadProfile";
|
||||
|
||||
export function loadProfile(res: LoadProfileResponse) {
|
||||
switch (res.format) {
|
||||
case 1:
|
||||
return loadProfile1(res);
|
||||
|
||||
case 2:
|
||||
return loadProfile2(res);
|
||||
|
||||
case 3:
|
||||
return loadProfile3(res);
|
||||
|
||||
default:
|
||||
const exhaust: never = res;
|
||||
|
||||
throw new Error(`Unsupported profile response format ${res["format"]}`);
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
import { LoadProfileResponse1 } from "../response/loadProfile";
|
||||
import { LoadProfileResponse } from "../response/loadProfile";
|
||||
|
||||
// Sending this causes an error in v1.21, so it is currently unmapped and
|
||||
// unimplemented.
|
||||
|
||||
export function loadProfile1(res: LoadProfileResponse1) {
|
||||
export function loadProfile1(res: LoadProfileResponse) {
|
||||
const buf = Buffer.alloc(0x0c60);
|
||||
|
||||
buf.writeInt16LE(0x0064, 0x0000);
|
||||
|
||||
@@ -2,10 +2,10 @@ import { encodeBitmap } from "./_bitmap";
|
||||
import { encodeCar } from "./_car";
|
||||
import { encodeChara } from "./_chara";
|
||||
import { encodeMission } from "./_mission";
|
||||
import { LoadProfileResponse2 } from "../response/loadProfile";
|
||||
import { LoadProfileResponse } from "../response/loadProfile";
|
||||
import { writeSjisStr } from "../../util/bin";
|
||||
|
||||
export function loadProfile2(res: LoadProfileResponse2) {
|
||||
export function loadProfile2(res: LoadProfileResponse) {
|
||||
const buf = Buffer.alloc(0x0d30);
|
||||
|
||||
// FLAMETHROWER ANALYSIS (watch out for C strings)
|
||||
|
||||
@@ -2,10 +2,10 @@ import { encodeBitmap } from "./_bitmap";
|
||||
import { encodeCar } from "./_car";
|
||||
import { encodeChara } from "./_chara";
|
||||
import { encodeMission } from "./_mission";
|
||||
import { LoadProfileResponse3 } from "../response/loadProfile";
|
||||
import { LoadProfileResponse } from "../response/loadProfile";
|
||||
import { writeSjisStr } from "../../util/bin";
|
||||
|
||||
export function loadProfile3(res: LoadProfileResponse3) {
|
||||
export function loadProfile3(res: LoadProfileResponse) {
|
||||
const buf = Buffer.alloc(0x0ea0);
|
||||
|
||||
// Initialize all TA grades to uhh... fuck knows
|
||||
|
||||
@@ -1,25 +1,6 @@
|
||||
import {
|
||||
SaveExpeditionResponse,
|
||||
SaveExpeditionResponse1,
|
||||
SaveExpeditionResponse2,
|
||||
} from "../response/saveExpedition";
|
||||
import { SaveExpeditionResponse } from "../response/saveExpedition";
|
||||
|
||||
export function saveExpedition(res: SaveExpeditionResponse): Buffer {
|
||||
switch (res.format) {
|
||||
case 1:
|
||||
return saveExpedition1(res);
|
||||
|
||||
case 2:
|
||||
return saveExpedition2(res);
|
||||
|
||||
default:
|
||||
const exhaust: never = res;
|
||||
|
||||
throw new Error(`Unsupported data format ${res["format"]}`);
|
||||
}
|
||||
}
|
||||
|
||||
function saveExpedition1(res: SaveExpeditionResponse1): Buffer {
|
||||
export function saveExpedition1(res: SaveExpeditionResponse): Buffer {
|
||||
// in awe of the size of this lad
|
||||
const buf = Buffer.alloc(0x17c0);
|
||||
|
||||
@@ -28,7 +9,7 @@ function saveExpedition1(res: SaveExpeditionResponse1): Buffer {
|
||||
return buf;
|
||||
}
|
||||
|
||||
function saveExpedition2(res: SaveExpeditionResponse2): Buffer {
|
||||
export function saveExpedition2(res: SaveExpeditionResponse): Buffer {
|
||||
// absolute unit
|
||||
const buf = Buffer.alloc(0x18ac);
|
||||
|
||||
|
||||
@@ -1,25 +1,8 @@
|
||||
import {
|
||||
UpdateStoryClearNumResponse,
|
||||
UpdateStoryClearNumResponse1,
|
||||
UpdateStoryClearNumResponse2,
|
||||
} from "../response/updateStoryClearNum";
|
||||
import { UpdateStoryClearNumResponse } from "../response/updateStoryClearNum";
|
||||
|
||||
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 {
|
||||
export function updateStoryClearNum1(
|
||||
res: UpdateStoryClearNumResponse
|
||||
): Buffer {
|
||||
const buf = Buffer.alloc(0x0220);
|
||||
|
||||
buf.writeInt16LE(0x0080, 0x0000);
|
||||
@@ -27,7 +10,9 @@ function updateStoryClearNum1(res: UpdateStoryClearNumResponse1): Buffer {
|
||||
return buf;
|
||||
}
|
||||
|
||||
function updateStoryClearNum2(res: UpdateStoryClearNumResponse2): Buffer {
|
||||
export function updateStoryClearNum2(
|
||||
res: UpdateStoryClearNumResponse
|
||||
): Buffer {
|
||||
const buf = Buffer.alloc(0x04f0);
|
||||
|
||||
buf.writeInt16LE(0x013e, 0x0000);
|
||||
|
||||
Reference in New Issue
Block a user