From 0d8b55bfada15973ffbc744dc528be84e056526e Mon Sep 17 00:00:00 2001 From: Tau Date: Mon, 8 Apr 2019 19:13:53 -0400 Subject: [PATCH] add course play counter tracking --- src/idz/decoder/saveProfile.ts | 7 +++++++ src/idz/encoder/loadProfile2.ts | 9 ++++----- src/idz/handler/loadProfile.ts | 2 ++ src/idz/handler/saveProfile.ts | 1 + src/idz/request/saveProfile.ts | 1 + src/idz/response/loadProfile2.ts | 5 +++-- src/idz/world/base.ts | 2 ++ src/idz/world/index.ts | 7 +++++++ 8 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/idz/decoder/saveProfile.ts b/src/idz/decoder/saveProfile.ts index b0a0b5c..fd6be6c 100644 --- a/src/idz/decoder/saveProfile.ts +++ b/src/idz/decoder/saveProfile.ts @@ -28,6 +28,12 @@ export function saveProfile(buf: Buffer): SaveProfileRequest { storyRows.push(row); } + const coursePlays = new Array(); + + for (let i = 0x0000; i < 0x0020; i += 2) { + coursePlays.push(buf.readUInt16LE(0x04c0 + i)); + } + return { type: "save_profile_req", profileId: buf.readUInt32LE(0x0004) as Id, @@ -38,6 +44,7 @@ export function saveProfile(buf: Buffer): SaveProfileRequest { title: buf.readUInt16LE(0x0040) as TitleCode, titles: bitmap(buf.slice(0x0042, 0x00f6)) as TitleCode[], background: buf.readUInt8(0x0750) as BackgroundCode, + coursePlays, car: car(buf.slice(0x0834, 0x0894)), story: { x: buf.readUInt16LE(0x06fc), diff --git a/src/idz/encoder/loadProfile2.ts b/src/idz/encoder/loadProfile2.ts index 90de233..7b9d503 100644 --- a/src/idz/encoder/loadProfile2.ts +++ b/src/idz/encoder/loadProfile2.ts @@ -18,11 +18,6 @@ export function loadProfile2(res: LoadProfileResponse2) { const buf = Buffer.alloc(0x0d30); - //buf.writeUInt16LE(0x0001, 0x06bc); // story_X - //buf.writeUInt8(0x00, 0x0670); // story_Y - //buf.writeUInt16LE(0x0001, 0x0228 + 0); // records[0].pairs[0].a - //buf.writeUInt16LE(0x0003, 0x0228 + 2); // records[0].pairs[0].b - for (let i = 0; i < 9 && i < res.story.rows.length; i++) { const row = res.story.rows[i]; const rowOffset = 0x0228 + i * 0x26; @@ -36,6 +31,10 @@ export function loadProfile2(res: LoadProfileResponse2) { } } + for (let i = 0; i < 16 && i < res.coursePlays.length; i++) { + buf.writeUInt16LE(res.coursePlays[i], 0x0460 + 2 * i); + } + buf.writeUInt16LE(0x0065, 0x0000); buf.writeUInt32LE(res.profileId, 0x03b8); buf.writeUInt16LE(res.settings.bgMusic, 0x03c8); diff --git a/src/idz/handler/loadProfile.ts b/src/idz/handler/loadProfile.ts index b0763e4..061637b 100644 --- a/src/idz/handler/loadProfile.ts +++ b/src/idz/handler/loadProfile.ts @@ -13,6 +13,7 @@ export async function loadProfile( const settings = await w.settings().load(profile.id); const chara = await w.chara().load(profile.id); const titles = await w.titles().load(profile.id); + const coursePlays = await w.coursePlays().load(profile.id); const car = await w.car().load(profile.id); const story = await w.story().load(profile.id); @@ -28,6 +29,7 @@ export async function loadProfile( settings, chara, titles, + coursePlays, car, story, }; diff --git a/src/idz/handler/saveProfile.ts b/src/idz/handler/saveProfile.ts index 58e2f9a..e309e5b 100644 --- a/src/idz/handler/saveProfile.ts +++ b/src/idz/handler/saveProfile.ts @@ -23,6 +23,7 @@ export async function saveProfile( background: req.background, }), w.car().save(req.profileId, req.car), + w.coursePlays().save(req.profileId, req.coursePlays), w.story().save(req.profileId, req.story), w.titles().save(req.profileId, req.titles), ]); diff --git a/src/idz/request/saveProfile.ts b/src/idz/request/saveProfile.ts index 56b2c6b..aefbf4d 100644 --- a/src/idz/request/saveProfile.ts +++ b/src/idz/request/saveProfile.ts @@ -13,6 +13,7 @@ export interface SaveProfileRequest { title: TitleCode; titles: TitleCode[]; background: BackgroundCode; + coursePlays: number[]; car: Car; story: Story; } diff --git a/src/idz/response/loadProfile2.ts b/src/idz/response/loadProfile2.ts index cfe9a3d..5bfa354 100644 --- a/src/idz/response/loadProfile2.ts +++ b/src/idz/response/loadProfile2.ts @@ -1,4 +1,4 @@ -import { Id } from "../model/base"; +import { Id, TitleCode } from "../model/base"; import { Car } from "../model/car"; import { Chara } from "../model/chara"; import { Profile } from "../model/profile"; @@ -16,7 +16,8 @@ export interface LoadProfileResponse2 { teamId?: number; settings: Settings; chara: Chara; - titles: number[]; + titles: TitleCode[]; + coursePlays: number[]; car: Car; story: Story; // giga TODO diff --git a/src/idz/world/base.ts b/src/idz/world/base.ts index 258e056..2e00492 100644 --- a/src/idz/world/base.ts +++ b/src/idz/world/base.ts @@ -21,6 +21,8 @@ export interface World { chara(): Repository; + coursePlays(): Repository; + profile(): ProfileRepository; settings(): Repository; diff --git a/src/idz/world/index.ts b/src/idz/world/index.ts index 1980437..aa15327 100644 --- a/src/idz/world/index.ts +++ b/src/idz/world/index.ts @@ -32,6 +32,13 @@ class WorldImpl implements World { ); } + coursePlays() { + return new SingletonTextRepo( + this._root, + "coursePlays" + ); + } + profile() { return new ProfileRepositoryImpl(this._root); }