wip enrich top ten req/res defs

This commit is contained in:
Tau
2019-04-29 19:59:09 -04:00
parent f08c47306d
commit daebde53f3
5 changed files with 33 additions and 23 deletions

View File

@@ -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),
});
}

View File

@@ -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);

View File

@@ -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";

View File

@@ -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;
}

View File

@@ -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[];
}