Store mission progress

This commit is contained in:
Tau
2019-04-10 16:54:34 -04:00
parent 4de8c36291
commit 04034fba45
13 changed files with 95 additions and 0 deletions

View File

@@ -0,0 +1,28 @@
import { MissionGrid } from "../model/mission";
export function mission(buf: Buffer): MissionGrid[] {
const grids = new Array();
for (let gridNo = 0; gridNo < 5; gridNo++) {
const grid: MissionGrid = { gridNo, cells: [] };
for (let cellNo = 0; cellNo < 9; cellNo++) {
let cell = 0;
let mask = 1 << cellNo;
for (let sliceNo = 0; sliceNo < 3; sliceNo++) {
const slice = buf.readUInt16LE(0x0c * sliceNo + 0x02 * gridNo);
if (slice & mask) {
cell |= 1 << sliceNo;
}
}
grid.cells.push(cell);
}
grids.push(grid);
}
return grids;
}

View File

@@ -1,4 +1,5 @@
import { car } from "./_car";
import { mission } from "./_mission";
import { RequestCode } from "./_defs";
import { BackgroundCode, Id, TitleCode } from "../model/base";
import { Profile } from "../model/profile";
@@ -45,6 +46,10 @@ export function saveProfile(buf: Buffer): SaveProfileRequest {
titles: bitmap(buf.slice(0x0042, 0x00f6)) as TitleCode[],
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),

View File

@@ -0,0 +1,26 @@
import { MissionGrid } from "../model/mission";
export function mission(grids: MissionGrid[]): Buffer {
const buf = Buffer.alloc(0x24);
for (const grid of grids) {
const { gridNo } = grid;
const slices = [0, 0, 0];
for (let cellNo = 0; cellNo < 9 && cellNo < grid.cells.length; cellNo++) {
const value = grid.cells[cellNo];
for (let sliceNo = 0; sliceNo < 3; sliceNo++) {
if (value & (1 << sliceNo)) {
slices[sliceNo] |= 1 << cellNo;
}
}
}
for (let sliceNo = 0; sliceNo < 3; sliceNo++) {
buf.writeUInt16LE(slices[sliceNo], 0x0c * sliceNo + 0x02 * gridNo);
}
}
return buf;
}

View File

@@ -3,6 +3,7 @@ import iconv = require("iconv-lite");
import { bitmap } from "./_bitmap";
import { car } from "./_car";
import { chara } from "./_chara";
import { mission } from "./_mission";
import { LoadProfileResponse2 } from "../response/loadProfile2";
export function loadProfile2(res: LoadProfileResponse2) {
@@ -36,6 +37,7 @@ export function loadProfile2(res: LoadProfileResponse2) {
}
buf.writeUInt16LE(0x0065, 0x0000);
mission(res.missions.team).copy(buf, 0x038a);
buf.writeUInt32LE(res.profileId, 0x03b8);
buf.writeUInt16LE(res.settings.bgMusic, 0x03c8);
buf.writeUInt16LE(res.lv, 0x03cc);
@@ -46,6 +48,7 @@ export function loadProfile2(res: LoadProfileResponse2) {
iconv.encode(res.name + "\0", "shift_jis").copy(buf, 0x03ee);
buf.writeUInt16LE(res.story.x, 0x06bc);
buf.writeUInt8(res.story.y, 0x0670);
mission(res.missions.solo).copy(buf, 0x06e4);
chara(res.chara).copy(buf, 0x070c);
bitmap(res.titles, 0xb4).copy(buf, 0x720);
buf.writeInt32LE(res.teamId || 0, 0x07e0);

View File

@@ -1,4 +1,5 @@
import { Id } from "../model/base";
import { MissionState } from "../model/mission";
import { Profile } from "../model/profile";
import { Settings } from "../model/settings";
import { Story } from "../model/story";
@@ -21,6 +22,11 @@ export async function createProfile(
dpoint: 0,
};
const missions: MissionState = {
team: [],
solo: [],
};
const settings: Settings = {
bgMusic: 0,
forceQuitEn: false,
@@ -39,6 +45,7 @@ export async function createProfile(
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),
]);

View File

@@ -14,6 +14,7 @@ export async function loadProfile(
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 missions = await w.missions().load(profile.id);
const car = await w.car().load(profile.id);
const story = await w.story().load(profile.id);
@@ -30,6 +31,7 @@ export async function loadProfile(
chara,
titles,
coursePlays,
missions,
car,
story,
};

View File

@@ -24,6 +24,7 @@ export async function saveProfile(
}),
w.car().save(req.profileId, req.car),
w.coursePlays().save(req.profileId, req.coursePlays),
w.missions().save(req.profileId, req.missions),
w.story().save(req.profileId, req.story),
w.titles().save(req.profileId, req.titles),
]);

View File

@@ -1,6 +1,7 @@
export { AimeId, BackgroundCode, Id, TitleCode } from "./base";
export { Car } from "./car";
export { Chara } from "./chara";
export { MissionState, MissionGrid } from "./mission";
export { Profile } from "./profile";
export { Settings } from "./settings";
export { Story } from "./story";

9
src/idz/model/mission.ts Normal file
View File

@@ -0,0 +1,9 @@
export interface MissionGrid {
gridNo: number;
cells: number[];
}
export interface MissionState {
team: MissionGrid[];
solo: MissionGrid[];
}

View File

@@ -1,5 +1,6 @@
import { BackgroundCode, Id, TitleCode } from "../model/base";
import { Car } from "../model/car";
import { MissionState } from "../model/mission";
import { Profile } from "../model/profile";
import { Story } from "../model/story";
@@ -14,6 +15,7 @@ export interface SaveProfileRequest {
titles: TitleCode[];
background: BackgroundCode;
coursePlays: number[];
missions: MissionState;
car: Car;
story: Story;
}

View File

@@ -1,6 +1,7 @@
import { Id, 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";
@@ -18,6 +19,7 @@ export interface LoadProfileResponse2 {
chara: Chara;
titles: TitleCode[];
coursePlays: number[];
missions: MissionState;
car: Car;
story: Story;
// giga TODO

View File

@@ -23,6 +23,8 @@ export interface World {
coursePlays(): Repository<number[], Model.Profile>;
missions(): Repository<Model.MissionState, Model.Profile>;
profile(): ProfileRepository;
settings(): Repository<Model.Settings, Model.Profile>;

View File

@@ -39,6 +39,13 @@ class WorldImpl implements World {
);
}
missions() {
return new SingletonJsonRepo<Model.MissionState, Model.Profile>(
this._root,
"missions"
);
}
profile() {
return new ProfileRepositoryImpl(this._root);
}