mirror of
https://github.com/djhackersdev/minime.git
synced 2026-03-22 02:04:19 -05:00
Turns out (while researching team creation) the profile ext id is just the aime id. After creating a team a profile discovery request is immediately issued with the "profile id" in the field that holds the aime id during initial profile load.
99 lines
2.7 KiB
TypeScript
99 lines
2.7 KiB
TypeScript
import { car } from "./_car";
|
|
import { mission } from "./_mission";
|
|
import { RequestCode } from "./_defs";
|
|
import { BackgroundCode, CourseNo, ExtId, TitleCode } from "../model/base";
|
|
import { SaveProfileRequest2 } from "../request/saveProfile";
|
|
import { bitmap } from "./_bitmap";
|
|
import { AimeId } from "../../model";
|
|
|
|
saveProfile2.msgCode = 0x0068 as RequestCode;
|
|
saveProfile2.msgLen = 0x0940;
|
|
|
|
export function saveProfile2(buf: Buffer): SaveProfileRequest2 {
|
|
const storyRows = new Array();
|
|
|
|
for (let i = 0; i < 9; i++) {
|
|
const cells = new Array();
|
|
const rowOffset = 0x01a8 + i * 0x3c;
|
|
|
|
for (let j = 0; j < 9; j++) {
|
|
const a = buf.readUInt32LE(rowOffset + 0x04 + j * 4);
|
|
const b = buf.readUInt16LE(rowOffset + 0x28 + j * 2);
|
|
const cell = { a, b };
|
|
|
|
cells.push(cell);
|
|
}
|
|
|
|
const row = { cells };
|
|
|
|
storyRows.push(row);
|
|
}
|
|
|
|
const coursePlays = new Map<CourseNo, number>();
|
|
|
|
for (let i = 0; i < 16; i++) {
|
|
coursePlays.set(i as CourseNo, buf.readUInt16LE(0x04c0 + 2 * i));
|
|
}
|
|
|
|
const freeCar = {
|
|
validFrom: buf.readUInt32LE(0x0138),
|
|
};
|
|
|
|
const freeContinue = {
|
|
validFrom: buf.readUInt32LE(0x0038),
|
|
validTo: buf.readUInt32LE(0x003c),
|
|
};
|
|
|
|
return {
|
|
type: "save_profile_req",
|
|
format: 2,
|
|
aimeId: buf.readUInt32LE(0x0004) as AimeId,
|
|
lv: buf.readUInt16LE(0x0026),
|
|
exp: buf.readUInt32LE(0x0028),
|
|
fame: buf.readUInt32LE(0x0468),
|
|
dpoint: buf.readUInt32LE(0x0464),
|
|
mileage: buf.readUInt32LE(0x0008),
|
|
title: buf.readUInt16LE(0x0040) as TitleCode,
|
|
titles: bitmap(buf.slice(0x0042, 0x00f6)),
|
|
background: buf.readUInt8(0x0750) as BackgroundCode,
|
|
coursePlays,
|
|
missions: {
|
|
team: mission(buf.slice(0x03c4, 0x03e6)),
|
|
solo: mission(buf.slice(0x0724, 0x0746)),
|
|
},
|
|
car: car(buf.slice(0x0834, 0x0894)),
|
|
story: {
|
|
x: buf.readUInt16LE(0x06fc),
|
|
y: buf.readUInt8(0x06e0),
|
|
rows: storyRows,
|
|
},
|
|
unlocks: {
|
|
cup: buf.readUInt8(0x0110),
|
|
gauges: buf.readUInt16LE(0x0114),
|
|
music: buf.readUInt16LE(0x0140),
|
|
lastMileageReward: buf.readUInt32LE(0x013c),
|
|
},
|
|
tickets: {
|
|
freeCar:
|
|
freeCar.validFrom !== 0
|
|
? {
|
|
validFrom: new Date(freeCar.validFrom * 1000),
|
|
}
|
|
: undefined,
|
|
freeContinue:
|
|
freeContinue.validFrom !== 0 && freeContinue.validTo !== 0
|
|
? {
|
|
validFrom: new Date(freeContinue.validFrom * 1000),
|
|
validTo: new Date(freeContinue.validTo * 1000),
|
|
}
|
|
: undefined,
|
|
},
|
|
settings: {
|
|
music: buf.readUInt16LE(0x045a),
|
|
pack: buf.readUInt32LE(0x0034),
|
|
paperCup: buf.readUInt8(0x00f6),
|
|
gauges: buf.readUInt8(0x00f7),
|
|
},
|
|
};
|
|
}
|