idz: Tweak how request variants are modelled

This commit is contained in:
Tau 2019-05-07 18:01:48 -04:00
parent 6b58c4d722
commit 5bac5b6abc
8 changed files with 73 additions and 51 deletions

View File

@ -13,7 +13,6 @@ import { loadGarage } from "./loadGarage";
import { loadGeneralReward } from "./loadGeneralReward";
import { loadGhost } from "./loadGhost";
import { loadProfile } from "./loadProfile";
import { loadProfile2 } from "./loadProfile2";
import { loadRewardTable } from "./loadRewardTable";
import { loadServerList } from "./loadServerList";
import { loadStocker } from "./loadStocker";
@ -64,12 +63,9 @@ function encode(res: Response): Buffer {
case "load_ghost_res":
return loadGhost(res);
case "load_profile_v1_res":
case "load_profile_res":
return loadProfile(res);
case "load_profile_v2_res":
return loadProfile2(res);
case "load_reward_table_res":
return loadRewardTable(res);

View File

@ -1,10 +1,18 @@
import { loadProfile1 } from "./loadProfile1";
import { loadProfile2 } from "./loadProfile2";
import { LoadProfileResponse } from "../response/loadProfile";
// Sending this causes an error
export function loadProfile(res: LoadProfileResponse) {
const buf = Buffer.alloc(0x0c60);
switch (res.format) {
case 1:
return loadProfile1(res);
buf.writeInt16LE(0x0064, 0x0000);
case 2:
return loadProfile2(res);
return buf;
default:
const exhaust: never = res;
throw new Error(`Unsupported profile response format ${res["format"]}`);
}
}

View File

@ -0,0 +1,12 @@
import { LoadProfileResponse1 } from "../response/loadProfile";
// Sending this causes an error in v1.21, so it is currently unmapped and
// unimplemented.
export function loadProfile1(res: LoadProfileResponse1) {
const buf = Buffer.alloc(0x0c60);
buf.writeInt16LE(0x0064, 0x0000);
return buf;
}

View File

@ -4,7 +4,7 @@ import { bitmap } from "./_bitmap";
import { car } from "./_car";
import { chara } from "./_chara";
import { mission } from "./_mission";
import { LoadProfileResponse2 } from "../response/loadProfile2";
import { LoadProfileResponse2 } from "../response/loadProfile";
export function loadProfile2(res: LoadProfileResponse2) {
const buf = Buffer.alloc(0x0d30);

View File

@ -1,11 +1,11 @@
import { LoadProfileRequest } from "../request/loadProfile";
import { LoadProfileResponse2 } from "../response/loadProfile2";
import { LoadProfileResponse } from "../response/loadProfile";
import { Repositories } from "../repo";
export async function loadProfile(
w: Repositories,
req: LoadProfileRequest
): Promise<LoadProfileResponse2> {
): Promise<LoadProfileResponse> {
// Promise.all would be messy here, who cares anyway this isn't supposed to
// be a high-performance server.
@ -23,7 +23,8 @@ export async function loadProfile(
const tickets = await w.tickets().load(profile.id);
return {
type: "load_profile_v2_res",
type: "load_profile_res",
format: 2,
name: profile.name,
profileId: profile.id,
lv: profile.lv,

View File

@ -10,7 +10,6 @@ import { LoadGarageResponse } from "./loadGarage";
import { LoadGeneralRewardResponse } from "./loadGeneralReward";
import { LoadGhostResponse } from "./loadGhost";
import { LoadProfileResponse } from "./loadProfile";
import { LoadProfileResponse2 } from "./loadProfile2";
import { LoadRewardTableResponse } from "./loadRewardTable";
import { LoadServerListResponse } from "./loadServerList";
import { LoadStockerResponse } from "./loadStocker";
@ -40,7 +39,6 @@ export type Response =
| LoadGeneralRewardResponse
| LoadGhostResponse
| LoadProfileResponse
| LoadProfileResponse2
| LoadRewardTableResponse
| LoadServerListResponse
| LoadStockerResponse

View File

@ -1,3 +1,44 @@
export interface LoadProfileResponse {
type: "load_profile_v1_res";
import { ExtId, TitleCode } from "../model/base";
import { Car } from "../model/car";
import { Chara } from "../model/chara";
import { MissionState } from "../model/mission";
import { Profile } from "../model/profile";
import { Settings } from "../model/settings";
import { Story } from "../model/story";
import { Tickets } from "../model/tickets";
import { TimeAttackScore } from "../model/timeAttack";
import { Unlocks } from "../model/unlocks";
interface LoadProfileResponseBase {
type: "load_profile_res";
name: string;
profileId: ExtId<Profile>;
lv: number;
exp: number;
fame: number;
dpoint: number;
mileage: number;
teamId?: number;
settings: Settings;
chara: Chara;
titles: Set<TitleCode>;
coursePlays: Map<number, number>;
missions: MissionState;
timeAttack: TimeAttackScore[];
car: Car;
carCount: number;
story: Story;
unlocks: Unlocks;
tickets: Tickets;
// giga TODO
}
export interface LoadProfileResponse1 extends LoadProfileResponseBase {
format: 1;
}
export interface LoadProfileResponse2 extends LoadProfileResponseBase {
format: 2;
}
export type LoadProfileResponse = LoadProfileResponse1 | LoadProfileResponse2;

View File

@ -1,34 +0,0 @@
import { ExtId, TitleCode } from "../model/base";
import { Car } from "../model/car";
import { Chara } from "../model/chara";
import { MissionState } from "../model/mission";
import { Profile } from "../model/profile";
import { Settings } from "../model/settings";
import { Story } from "../model/story";
import { Tickets } from "../model/tickets";
import { TimeAttackScore } from "../model/timeAttack";
import { Unlocks } from "../model/unlocks";
export interface LoadProfileResponse2 {
type: "load_profile_v2_res";
name: string;
profileId: ExtId<Profile>;
lv: number;
exp: number;
fame: number;
dpoint: number;
mileage: number;
teamId?: number;
settings: Settings;
chara: Chara;
titles: Set<TitleCode>;
coursePlays: Map<number, number>;
missions: MissionState;
timeAttack: TimeAttackScore[];
car: Car;
carCount: number;
story: Story;
unlocks: Unlocks;
tickets: Tickets;
// giga TODO
}