From 4390935b6ca4b4930732dcd767587c0a087fcf15 Mon Sep 17 00:00:00 2001 From: Tau Date: Wed, 10 Apr 2019 22:11:32 -0400 Subject: [PATCH] Track misc unlocks --- src/idz/decoder/saveProfile.ts | 5 +++++ src/idz/encoder/loadProfile2.ts | 14 ++++++++++++++ src/idz/handler/createProfile.ts | 4 ++++ src/idz/handler/loadProfile.ts | 2 ++ src/idz/handler/saveProfile.ts | 1 + src/idz/model/index.ts | 1 + src/idz/model/unlocks.ts | 5 +++++ src/idz/request/saveProfile.ts | 2 ++ src/idz/response/loadProfile2.ts | 2 ++ src/idz/world/base.ts | 2 ++ src/idz/world/index.ts | 7 +++++++ 11 files changed, 45 insertions(+) create mode 100644 src/idz/model/unlocks.ts diff --git a/src/idz/decoder/saveProfile.ts b/src/idz/decoder/saveProfile.ts index 33deecd..c0dd46a 100644 --- a/src/idz/decoder/saveProfile.ts +++ b/src/idz/decoder/saveProfile.ts @@ -56,5 +56,10 @@ export function saveProfile(buf: Buffer): SaveProfileRequest { y: buf.readUInt8(0x06e0), rows: storyRows, }, + unlocks: { + cup: buf.readUInt8(0x0110), + gauges: buf.readUInt16LE(0x0114), + music: buf.readUInt16LE(0x0140), + }, }; } diff --git a/src/idz/encoder/loadProfile2.ts b/src/idz/encoder/loadProfile2.ts index 4b5a70e..2e18626 100644 --- a/src/idz/encoder/loadProfile2.ts +++ b/src/idz/encoder/loadProfile2.ts @@ -19,6 +19,17 @@ export function loadProfile2(res: LoadProfileResponse2) { const buf = Buffer.alloc(0x0d30); + // FLAMETHROWER ANALYSIS (watch out for C strings) + //buf.fill(0xff, 0x0000, 0x08f4); + //buf.fill(0xff, 0x0c20, 0x0c2a); + + // B0-C0: Cup and gauges + // B8-C0: All gauges, no cup + buf.fill(0xff, 0x00b4, 0x00b6); + buf.writeUInt8(0xff, 0x00b4); // PAPER CUP + buf.writeUInt16LE(0xffff, 0x00b8); + buf.writeUInt16LE(0x0009, 0x01ec); // MUSIC UNLOCKS + for (let i = 0; i < 9 && i < res.story.rows.length; i++) { const row = res.story.rows[i]; const rowOffset = 0x0228 + i * 0x26; @@ -37,6 +48,9 @@ export function loadProfile2(res: LoadProfileResponse2) { } buf.writeUInt16LE(0x0065, 0x0000); + buf.writeUInt8(res.unlocks.cup, 0x00b4); + buf.writeUInt16LE(res.unlocks.gauges, 0x00b8); + buf.writeUInt16LE(res.unlocks.music, 0x01ec); mission(res.missions.team).copy(buf, 0x038a); buf.writeUInt32LE(res.profileId, 0x03b8); buf.writeUInt16LE(res.settings.bgMusic, 0x03c8); diff --git a/src/idz/handler/createProfile.ts b/src/idz/handler/createProfile.ts index 63347f4..50f9d4c 100644 --- a/src/idz/handler/createProfile.ts +++ b/src/idz/handler/createProfile.ts @@ -4,6 +4,7 @@ import { Profile } from "../model/profile"; import { Settings } from "../model/settings"; import { Story } from "../model/story"; import { Team } from "../model/team"; +import { Unlocks } from "../model/unlocks"; import { CreateProfileRequest } from "../request/createProfile"; import { GenericResponse } from "../response/generic"; import { World } from "../world"; @@ -41,12 +42,15 @@ export async function createProfile( const story: Story = { x: 0, y: 0, rows: [] }; + const unlocks: Unlocks = { cup: 0, gauges: 0, music: 0 }; + await Promise.all([ w.profile().save(profile.id, profile), w.chara().save(profile.id, req.chara), w.car().save(profile.id, req.car), w.missions().save(profile.id, missions), w.settings().save(profile.id, settings), + w.unlocks().save(profile.id, unlocks), ]); return { diff --git a/src/idz/handler/loadProfile.ts b/src/idz/handler/loadProfile.ts index 358e8ae..3df0050 100644 --- a/src/idz/handler/loadProfile.ts +++ b/src/idz/handler/loadProfile.ts @@ -17,6 +17,7 @@ export async function loadProfile( const missions = await w.missions().load(profile.id); const car = await w.car().load(profile.id); const story = await w.story().load(profile.id); + const unlocks = await w.unlocks().load(profile.id); return { type: "load_profile_v2_res", @@ -34,5 +35,6 @@ export async function loadProfile( missions, car, story, + unlocks, }; } diff --git a/src/idz/handler/saveProfile.ts b/src/idz/handler/saveProfile.ts index c91a809..fe68704 100644 --- a/src/idz/handler/saveProfile.ts +++ b/src/idz/handler/saveProfile.ts @@ -27,6 +27,7 @@ export async function saveProfile( w.missions().save(req.profileId, req.missions), w.story().save(req.profileId, req.story), w.titles().save(req.profileId, req.titles), + w.unlocks().save(req.profileId, req.unlocks), ]); return { diff --git a/src/idz/model/index.ts b/src/idz/model/index.ts index 71d7304..ba35777 100644 --- a/src/idz/model/index.ts +++ b/src/idz/model/index.ts @@ -6,3 +6,4 @@ export { Profile } from "./profile"; export { Settings } from "./settings"; export { Story } from "./story"; export { Team } from "./team"; +export { Unlocks } from "./unlocks"; diff --git a/src/idz/model/unlocks.ts b/src/idz/model/unlocks.ts new file mode 100644 index 0000000..7ee2f50 --- /dev/null +++ b/src/idz/model/unlocks.ts @@ -0,0 +1,5 @@ +export interface Unlocks { + cup: number; + gauges: number; + music: number; +} diff --git a/src/idz/request/saveProfile.ts b/src/idz/request/saveProfile.ts index 8564606..17b8fd8 100644 --- a/src/idz/request/saveProfile.ts +++ b/src/idz/request/saveProfile.ts @@ -3,6 +3,7 @@ import { Car } from "../model/car"; import { MissionState } from "../model/mission"; import { Profile } from "../model/profile"; import { Story } from "../model/story"; +import { Unlocks } from "../model/unlocks"; export interface SaveProfileRequest { type: "save_profile_req"; @@ -18,4 +19,5 @@ export interface SaveProfileRequest { missions: MissionState; car: Car; story: Story; + unlocks: Unlocks; } diff --git a/src/idz/response/loadProfile2.ts b/src/idz/response/loadProfile2.ts index 19691c4..0b0d90b 100644 --- a/src/idz/response/loadProfile2.ts +++ b/src/idz/response/loadProfile2.ts @@ -5,6 +5,7 @@ import { MissionState } from "../model/mission"; import { Profile } from "../model/profile"; import { Settings } from "../model/settings"; import { Story } from "../model/story"; +import { Unlocks } from "../model/unlocks"; export interface LoadProfileResponse2 { type: "load_profile_v2_res"; @@ -22,5 +23,6 @@ export interface LoadProfileResponse2 { missions: MissionState; car: Car; story: Story; + unlocks: Unlocks; // giga TODO } diff --git a/src/idz/world/base.ts b/src/idz/world/base.ts index bffcc7c..7b1178e 100644 --- a/src/idz/world/base.ts +++ b/src/idz/world/base.ts @@ -32,4 +32,6 @@ export interface World { story(): Repository; titles(): Repository; + + unlocks(): Repository; } diff --git a/src/idz/world/index.ts b/src/idz/world/index.ts index fa7cbb7..f87356d 100644 --- a/src/idz/world/index.ts +++ b/src/idz/world/index.ts @@ -70,6 +70,13 @@ class WorldImpl implements World { "titles" ); } + + unlocks() { + return new SingletonJsonRepo( + this._root, + "unlocks" + ); + } } export async function createWorld(root: string): Promise {