From daebde53f34b262e21d73f842582bf31d9118a29 Mon Sep 17 00:00:00 2001 From: Tau Date: Mon, 29 Apr 2019 19:59:09 -0400 Subject: [PATCH] wip enrich top ten req/res defs --- src/idz/decoder/loadTopTen.ts | 11 +++++++---- src/idz/encoder/loadTopTen.ts | 27 ++++++++++++++++++--------- src/idz/model/index.ts | 2 +- src/idz/request/loadTopTen.ts | 4 ++-- src/idz/response/loadTopTen.ts | 12 +++++------- 5 files changed, 33 insertions(+), 23 deletions(-) diff --git a/src/idz/decoder/loadTopTen.ts b/src/idz/decoder/loadTopTen.ts index b1b4ac4..31c6f2c 100644 --- a/src/idz/decoder/loadTopTen.ts +++ b/src/idz/decoder/loadTopTen.ts @@ -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(); 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), }); } diff --git a/src/idz/encoder/loadTopTen.ts b/src/idz/encoder/loadTopTen.ts index 7f530f9..febaf71 100644 --- a/src/idz/encoder/loadTopTen.ts +++ b/src/idz/encoder/loadTopTen.ts @@ -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); diff --git a/src/idz/model/index.ts b/src/idz/model/index.ts index d2dc29a..9d584d4 100644 --- a/src/idz/model/index.ts +++ b/src/idz/model/index.ts @@ -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"; diff --git a/src/idz/request/loadTopTen.ts b/src/idz/request/loadTopTen.ts index ca6f280..cda9abd 100644 --- a/src/idz/request/loadTopTen.ts +++ b/src/idz/request/loadTopTen.ts @@ -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; } diff --git a/src/idz/response/loadTopTen.ts b/src/idz/response/loadTopTen.ts index 8e01e45..9499b13 100644 --- a/src/idz/response/loadTopTen.ts +++ b/src/idz/response/loadTopTen.ts @@ -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[]; }