Decode route element float fields

This commit is contained in:
2026-06-20 13:53:09 -05:00
parent b34f2e2dee
commit eee31e55d8
2 changed files with 55 additions and 4 deletions
+42 -2
View File
@@ -190,13 +190,53 @@ Latest route-result findings:
cleanly matched the visible routes: side job `12`, Sinnerman `23`, Claire's cleanly matched the visible routes: side job `12`, Sinnerman `23`, Claire's
Garage `18`, and custom pin `17`. Garage `18`, and custom pin `17`.
- The vector elements are 0x28-byte records, not pointers. `0x41be2c` calls - The vector elements are 0x28-byte records, not pointers. `0x41be2c` calls
`0x41be94` with `(data, data + count * 40)`, so the next probe logs each `0x41be94` with `(data, data + count * 40)`. The active probe logs each
route element as a compact 40-byte record tuple: route element as a compact 40-byte record tuple:
`h00,u08,u0c,u10,u14,h18,h20`. `h00,u08hex,u0c,u10,u14,h18,h18lowFloat,h18highFloat,h20`.
- A nearby helper at `0x41c508` does iterate an array of 8-byte pointers at - A nearby helper at `0x41c508` does iterate an array of 8-byte pointers at
offset `+0x28`, but that is a different route-adjacent object type, not the offset `+0x28`, but that is a different route-adjacent object type, not the
`0x7094b8` output record captured in `outPath`. `0x7094b8` output record captured in `outPath`.
Latest route-element decode:
- User clock `45:37`: Continue on the main menu.
- User clock `46:05`: Space to continue.
- User clock `46:15`: map opened and the usual route-click routine was run.
- The startup/minimap route and the later explicit Claire's Garage map route
produced identical 18-record `ptr28` sequences, so the same solved route
object feeds both HUD startup and deliberate map plotting.
- The four deliberate map routes completed as route result IDs `2` through `5`:
side job `12` records / final span end `68`, Sinnerman `23` records / final
span end `188`, Claire's Garage `18` records / final span end `86`, custom
pin `14` records / final span end `78`.
- Within every route, `u10` and `u14` are monotonically increasing start/end
indexes into a flattened point/span buffer. The final `u14` equals
`gpsResult_u20` for every route.
- `h00` is a stable per-segment handle: common route prefixes share identical
`h00` sequences, and the custom pin and Claire's Garage routes share their
first ten solved segments before diverging.
- `u08` is packed metadata. Values appear byte-structured, for example
`0x00020202`, `0x01020203`, `0x02020103`, and `0x03020003`, rather than a
simple scalar weight.
- `h18` splits into two 32-bit floats. The high half is consistently a sane
road-scale float, often in the `20` to `230` range, and is likely segment
length/cost-like output. The low half is usually zero or a tiny value, with
non-zero values appearing around the start segment.
- `h20` has been zero in all captured full-map GPS result records.
Current static producer lead:
- `0x70a908` packages the route endpoints and query settings, then calls
`0x44cc7c`.
- `0x44cc7c` is now the main producer corridor, not merely a generic unknown
helper. It allocates large scratch state, projects the query endpoints, and
calls deeper pathfinding routines that should decide route cost before the
`0x7094b8` fetch/drain path copies final result records.
- Direct xrefs confirm `0x41be94` has only the result-copy caller
`0x41be69`; patching there would alter copied/displayed records after route
choice. The cost patch needs to happen upstream of the `0x44cc7c` result
construction path.
Autodrive finding: Autodrive finding:
- User clock `28:28` and `28:48`: enabling autodrive did not use the full - User clock `28:28` and `28:48`: enabling autodrive did not use the full
+13 -2
View File
@@ -450,6 +450,13 @@ void AppendHexValue(std::ostringstream& aLine, const char* aLabel, uint64_t aVal
aLine << " " << aLabel << "=0x" << std::hex << aValue << std::dec; aLine << " " << aLabel << "=0x" << std::hex << aValue << std::dec;
} }
float FloatFromBits(uint32_t aBits)
{
float value = 0.0f;
std::memcpy(&value, &aBits, sizeof(value));
return value;
}
void LogHookCall(const char* aName, uint32_t aCount, void* aThis, void* a2, void* a3, void* a4) void LogHookCall(const char* aName, uint32_t aCount, void* aThis, void* a2, void* a3, void* a4)
{ {
std::ostringstream line; std::ostringstream line;
@@ -947,8 +954,12 @@ void AppendGpsResultElementArraySummary(std::ostringstream& aLine, const char* a
continue; continue;
} }
aLine << std::hex << h00 << "," << std::dec << u08 << "," << u0c << "," << u10 << "," << u14 << "," const auto h18Lo = static_cast<uint32_t>(h18);
<< std::hex << h18 << "," << h20 << std::dec; const auto h18Hi = static_cast<uint32_t>(h18 >> 32);
aLine << std::hex << h00 << ",0x" << std::setw(8) << std::setfill('0') << u08 << std::setfill(fill)
<< std::dec << "," << u0c << "," << u10 << "," << u14 << "," << std::hex << h18 << std::dec
<< "," << FloatFromBits(h18Lo) << "," << FloatFromBits(h18Hi) << "," << std::hex << h20
<< std::dec;
} }
aLine << "]"; aLine << "]";
aLine.flags(flags); aLine.flags(flags);