diff --git a/schema/init/idz.sql b/schema/init/idz.sql index 2bc3615..5c20eb5 100644 --- a/schema/init/idz.sql +++ b/schema/init/idz.sql @@ -98,6 +98,7 @@ create table "idz_settings" ( on delete cascade, "music" integer not null, "pack" integer not null, + "aura" integer not null, "paper_cup" integer not null, -- Not a boolean, oddly enough "gauges" integer not null ); @@ -192,6 +193,7 @@ create table "idz_unlocks" ( "id" integer primary key not null references "idz_profile"("id") on delete cascade, + "auras" integer not null, "cup" integer not null, "gauges" integer not null, "music" integer not null, diff --git a/schema/migrate/M0009-idz-aura.sql b/schema/migrate/M0009-idz-aura.sql new file mode 100644 index 0000000..4c855ea --- /dev/null +++ b/schema/migrate/M0009-idz-aura.sql @@ -0,0 +1,5 @@ +-- This adds the required columns to save player aura settings and unlocks +-- Default values are set according to what the game expects + +alter table "idz_settings" add column "aura" integer NOT NULL DEFAULT '0'; +alter table "idz_unlocks" add column "auras" integer NOT NULL DEFAULT '1'; \ No newline at end of file diff --git a/src/idz/decoder/saveProfile2.ts b/src/idz/decoder/saveProfile2.ts index bfb567b..7e00e69 100644 --- a/src/idz/decoder/saveProfile2.ts +++ b/src/idz/decoder/saveProfile2.ts @@ -67,6 +67,7 @@ export function saveProfile2(buf: Buffer): SaveProfileRequest2 { rows: storyRows, }, unlocks: { + auras: buf.readUInt16LE(0x010c), cup: buf.readUInt8(0x0110), gauges: buf.readUInt16LE(0x0114), music: buf.readUInt16LE(0x0140), @@ -90,6 +91,7 @@ export function saveProfile2(buf: Buffer): SaveProfileRequest2 { settings: { music: buf.readUInt16LE(0x045a), pack: buf.readUInt32LE(0x0034), + aura: buf.readUInt8(0x002c), paperCup: buf.readUInt8(0x00f6), gauges: buf.readUInt8(0x00f7), }, diff --git a/src/idz/decoder/saveProfile3.ts b/src/idz/decoder/saveProfile3.ts index 013c8a3..7e07600 100644 --- a/src/idz/decoder/saveProfile3.ts +++ b/src/idz/decoder/saveProfile3.ts @@ -69,6 +69,7 @@ export function saveProfile3(buf: Buffer): SaveProfileRequest2 { rows: storyRows, }, unlocks: { + auras: buf.readUInt16LE(0x010c), cup: buf.readUInt8(0x0110), gauges: buf.readUInt16LE(0x0114), music: buf.readUInt16LE(0x0140), @@ -92,6 +93,7 @@ export function saveProfile3(buf: Buffer): SaveProfileRequest2 { settings: { music: buf.readUInt16LE(0x04ee), pack: buf.readUInt32LE(0x0034), + aura: buf.readUInt8(0x002c), paperCup: buf.readUInt8(0x00f6), gauges: buf.readUInt8(0x00f7), }, diff --git a/src/idz/decoder/saveSettings.ts b/src/idz/decoder/saveSettings.ts index 4d0f978..f18fa71 100644 --- a/src/idz/decoder/saveSettings.ts +++ b/src/idz/decoder/saveSettings.ts @@ -16,8 +16,8 @@ export function saveSettings(buf: Buffer): SaveSettingsRequest { pack: buf.readUInt32LE(0x000c), paperCup: buf.readUInt8(0x0011), gauges: buf.readUInt8(0x0012), + aura: buf.readUInt8(0x0013), }, field_0010: buf.readUInt8(0x0010), - field_0013: buf.readUInt8(0x0013), }; } diff --git a/src/idz/encoder/loadProfile2.ts b/src/idz/encoder/loadProfile2.ts index 44f9dce..6c4fd95 100644 --- a/src/idz/encoder/loadProfile2.ts +++ b/src/idz/encoder/loadProfile2.ts @@ -71,6 +71,7 @@ export function loadProfile2(res: LoadProfileResponse2) { } buf.writeUInt16LE(0x0065, 0x0000); + buf.writeUInt16LE(res.unlocks.auras, 0x00b0); buf.writeUInt8(res.unlocks.cup, 0x00b4); buf.writeUInt16LE(res.unlocks.gauges, 0x00b8); buf.writeUInt32LE(res.unlocks.lastMileageReward, 0x01e8); @@ -92,6 +93,7 @@ export function loadProfile2(res: LoadProfileResponse2) { encodeMission(res.missions.solo).copy(buf, 0x06e4); encodeChara(res.chara).copy(buf, 0x070c); encodeBitmap(res.titles, 0xb4).copy(buf, 0x720); + buf.writeUInt8(res.settings.aura, 0x07d6); buf.writeUInt8(res.settings.paperCup, 0x07d9); buf.writeUInt8(res.settings.gauges, 0x07da); buf.writeUInt32LE(res.teamId || 0xffffffff, 0x07e0); diff --git a/src/idz/encoder/loadProfile3.ts b/src/idz/encoder/loadProfile3.ts index 4cdb5e8..5f50ffd 100644 --- a/src/idz/encoder/loadProfile3.ts +++ b/src/idz/encoder/loadProfile3.ts @@ -71,6 +71,7 @@ export function loadProfile3(res: LoadProfileResponse3) { } buf.writeUInt16LE(0x012e, 0x0000); + buf.writeUInt16LE(res.unlocks.auras, 0x00b0); buf.writeUInt8(res.unlocks.cup, 0x00b4); buf.writeUInt16LE(res.unlocks.gauges, 0x00b8); buf.writeUInt32LE(res.unlocks.lastMileageReward, 0x0218); @@ -92,6 +93,7 @@ export function loadProfile3(res: LoadProfileResponse3) { encodeMission(res.missions.solo).copy(buf, 0x0858); encodeChara(res.chara).copy(buf, 0x0880); encodeBitmap(res.titles, 0xb4).copy(buf, 0x0894); + buf.writeUInt8(res.settings.aura, 0x094a); buf.writeUInt8(res.settings.paperCup, 0x094d); buf.writeUInt8(res.settings.gauges, 0x094e); buf.writeUInt32LE(res.teamId || 0xffffffff, 0x0954); diff --git a/src/idz/handler/createProfile.ts b/src/idz/handler/createProfile.ts index 85fb47a..20281c5 100644 --- a/src/idz/handler/createProfile.ts +++ b/src/idz/handler/createProfile.ts @@ -27,9 +27,10 @@ export async function createProfile( }; const missions: MissionState = { team: [], solo: [] }; - const settings: Settings = { music: 0, pack: 13640, paperCup: 0, gauges: 5 }; + const settings: Settings = { music: 0, pack: 13640, aura: 0, paperCup: 0, gauges: 5 }; const story: Story = { x: 0, y: 0, rows: [] }; const unlocks: Unlocks = { + auras: 1, cup: 0, gauges: 1 << 5, music: 0, diff --git a/src/idz/model/settings.ts b/src/idz/model/settings.ts index b98de6e..053dba7 100644 --- a/src/idz/model/settings.ts +++ b/src/idz/model/settings.ts @@ -1,6 +1,7 @@ export interface Settings { music: number; pack: number; + aura: number; paperCup: number; gauges: number; } diff --git a/src/idz/model/unlocks.ts b/src/idz/model/unlocks.ts index 3e0282b..18e0144 100644 --- a/src/idz/model/unlocks.ts +++ b/src/idz/model/unlocks.ts @@ -1,4 +1,5 @@ export interface Unlocks { + auras: number; cup: number; gauges: number; music: number; diff --git a/src/idz/request/saveSettings.ts b/src/idz/request/saveSettings.ts index f106d39..c49b896 100644 --- a/src/idz/request/saveSettings.ts +++ b/src/idz/request/saveSettings.ts @@ -7,5 +7,4 @@ export interface SaveSettingsRequest { dpoint: number; // ?? why settings: Settings; field_0010: number; - field_0013: number; } diff --git a/src/idz/sql/settings.ts b/src/idz/sql/settings.ts index bab0bff..f7779c6 100644 --- a/src/idz/sql/settings.ts +++ b/src/idz/sql/settings.ts @@ -24,6 +24,7 @@ export class SqlSettingsRepository implements FacetRepository { return { music: parseInt(row.music), pack: parseInt(row.pack), + aura: parseInt(row.aura), paperCup: parseInt(row.paper_cup), gauges: parseInt(row.gauges), }; @@ -35,11 +36,12 @@ export class SqlSettingsRepository implements FacetRepository { id: profileId, music: settings.music, pack: settings.pack, + aura: settings.aura, paper_cup: settings.paperCup, gauges: settings.gauges, }) .onConflict("id") - .doUpdate(["music", "pack", "paper_cup", "gauges"]); + .doUpdate(["music", "pack", "aura", "paper_cup", "gauges"]); await this._txn.modify(saveSql); } diff --git a/src/idz/sql/unlocks.ts b/src/idz/sql/unlocks.ts index 9e7f66c..7c046f1 100644 --- a/src/idz/sql/unlocks.ts +++ b/src/idz/sql/unlocks.ts @@ -22,6 +22,7 @@ export class SqlUnlocksRepository implements FacetRepository { } return { + auras: parseInt(row.auras), cup: parseInt(row.cup), gauges: parseInt(row.gauges), music: parseInt(row.music), @@ -33,13 +34,14 @@ export class SqlUnlocksRepository implements FacetRepository { const saveSql = sql .insert("idz_unlocks", { id: profileId, + auras: unlocks.auras, cup: unlocks.cup, gauges: unlocks.gauges, music: unlocks.music, last_mileage_reward: unlocks.lastMileageReward, }) .onConflict("id") - .doUpdate(["cup", "gauges", "music", "last_mileage_reward"]); + .doUpdate(["auras", "cup", "gauges", "music", "last_mileage_reward"]); await this._txn.modify(saveSql); }