mirror of
https://github.com/djhackersdev/minime.git
synced 2026-08-28 05:24:04 -05:00
wip enrich top ten req/res defs
This commit is contained in:
@@ -1,18 +1,21 @@
|
||||
import { RequestCode } from "./_defs";
|
||||
import { ExtId } from "../model/base";
|
||||
import { ExtId, RouteNo } from "../model/base";
|
||||
import { Profile } from "../model/profile";
|
||||
import { Team } from "../model/team";
|
||||
import { LoadTopTenRequest } from "../request/loadTopTen";
|
||||
import {
|
||||
LoadTopTenRequest,
|
||||
LoadTopTenRequestSelector,
|
||||
} from "../request/loadTopTen";
|
||||
|
||||
loadTopTen.msgCode = 0x00b5 as RequestCode;
|
||||
loadTopTen.msgLen = 0x00e0;
|
||||
|
||||
export function loadTopTen(buf: Buffer): LoadTopTenRequest {
|
||||
const selectors = new Array();
|
||||
const selectors = new Array<LoadTopTenRequestSelector>();
|
||||
|
||||
for (let i = 0; i < 32; i++) {
|
||||
selectors.push({
|
||||
field_4: buf.readUInt16LE(0x0004 + 2 * i),
|
||||
routeNo: (buf.readUInt16LE(0x0004 + 2 * i) >> 1) as RouteNo,
|
||||
field_44: buf.readUInt32LE(0x0044 + 4 * i),
|
||||
});
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ export function loadTopTen(res: LoadTopTenResponse): Buffer {
|
||||
const buf = Buffer.alloc(0x1720);
|
||||
|
||||
buf.writeUInt16LE(0x00b6, 0x0000);
|
||||
buf.writeUInt16LE(res.totalSelected, 0x0002);
|
||||
buf.writeUInt16LE(res.courseCount, 0x0002);
|
||||
|
||||
for (let i = 0; i < 3; i++) {
|
||||
if (i >= res.courses.length) {
|
||||
@@ -16,27 +16,36 @@ export function loadTopTen(res: LoadTopTenResponse): Buffer {
|
||||
const course = res.courses[i];
|
||||
const outerOff = 0x0004 + 0x794 * i;
|
||||
|
||||
buf.writeUInt16LE(course.courseId, outerOff + 0x0000);
|
||||
buf.writeUInt16LE(course.routeNo << 1, outerOff + 0x0000);
|
||||
buf.writeUInt16LE(course.field_02, outerOff + 0x0002); // Bitmask-y?
|
||||
buf.writeUInt32LE(course.wrStageMsec[0], outerOff + 0x0004);
|
||||
buf.writeUInt32LE(course.wrStageMsec[1], outerOff + 0x0008);
|
||||
buf.writeUInt32LE(course.wrStageMsec[2], outerOff + 0x000c);
|
||||
|
||||
if (course.rows.length > 0) {
|
||||
// Section times for the top result (and only top result) are sent OOB
|
||||
const best = course.rows[0];
|
||||
|
||||
for (let j = 0; j < 3; j++) {
|
||||
buf.writeUInt32LE(
|
||||
(best.ta.sectionTimes[j] * 1000) | 0,
|
||||
outerOff + 0x0004 + 4 * j
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
for (let j = 0; j < 10; j++) {
|
||||
if (j >= course.rows.length) {
|
||||
break;
|
||||
}
|
||||
|
||||
const row = course.rows[i];
|
||||
const row = course.rows[j];
|
||||
const innerOff = outerOff + 0x0010 + 0xc0 * j;
|
||||
|
||||
buf.writeUInt32LE(row.field_00, innerOff + 0x0000);
|
||||
buf.writeUInt32LE(row.totalMsec, innerOff + 0x0004);
|
||||
buf.writeUInt32LE((row.ta.totalTime * 1000) | 0, innerOff + 0x0004);
|
||||
buf.writeUInt32LE(
|
||||
(row.timestamp.getTime() / 1000) | 0,
|
||||
(row.ta.timestamp.getTime() / 1000) | 0,
|
||||
innerOff + 0x0008
|
||||
);
|
||||
buf.writeUInt16LE(row.car, innerOff + 0x000c); // CAR
|
||||
buf.writeUInt16LE(row.ta.carSelector, innerOff + 0x000c); // CAR
|
||||
buf.writeUInt8(row.field_0E ? 1 : 0, innerOff + 0x000e); // Boolean
|
||||
buf.writeUInt8(row.field_0F ? 1 : 0, innerOff + 0x000f); // Boolean
|
||||
buf.writeUInt8(row.field_10, innerOff + 0x0010);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
export { BackgroundCode, CourseNo, ExtId, TitleCode } from "./base";
|
||||
export { BackgroundCode, CourseNo, ExtId, RouteNo, TitleCode } from "./base";
|
||||
export { Car, CarSelector } from "./car";
|
||||
export { Chara } from "./chara";
|
||||
export { MissionState, MissionGrid } from "./mission";
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { ExtId } from "../model/base";
|
||||
import { ExtId, RouteNo } from "../model/base";
|
||||
import { Profile } from "../model/profile";
|
||||
import { Team } from "../model/team";
|
||||
|
||||
export interface LoadTopTenRequestSelector {
|
||||
field_4: number;
|
||||
routeNo: RouteNo;
|
||||
field_44: number;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
import { CarSelector } from "../model/car";
|
||||
import { RouteNo } from "../model/base";
|
||||
import { TimeAttackScore } from "../model/timeAttack";
|
||||
|
||||
export interface LoadTopTenResponseRow {
|
||||
field_00: number;
|
||||
totalMsec: number;
|
||||
timestamp: Date;
|
||||
car: CarSelector;
|
||||
field_0E: boolean;
|
||||
field_0F: boolean;
|
||||
field_10: number;
|
||||
@@ -15,12 +13,12 @@ export interface LoadTopTenResponseRow {
|
||||
field_78: number;
|
||||
field_7C: number;
|
||||
field_7D: number;
|
||||
ta: TimeAttackScore;
|
||||
}
|
||||
|
||||
export interface LoadTopTenResponseCourse {
|
||||
courseId: number; // Multiplied by 2! Includes day/night i guess
|
||||
routeNo: RouteNo;
|
||||
field_02: number;
|
||||
wrStageMsec: number[]; // Sent OOB, for first-place only
|
||||
rows: LoadTopTenResponseRow[];
|
||||
}
|
||||
|
||||
@@ -35,7 +33,7 @@ export interface LoadTopTenResponseTrailer {
|
||||
|
||||
export interface LoadTopTenResponse {
|
||||
type: "load_top_ten_res";
|
||||
totalSelected: number;
|
||||
courseCount: number;
|
||||
courses: LoadTopTenResponseCourse[];
|
||||
trailers: LoadTopTenResponseTrailer[];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user