Summarize joined GPS route results
This commit is contained in:
+72
-27
@@ -4,12 +4,12 @@ Current date/time context: 2026-06-20/21, local timezone America/Chicago.
|
||||
|
||||
## Current Installed State
|
||||
|
||||
- Latest commit: `64ddf7a Trace GPS provider filters`.
|
||||
- Latest installed probe commit: `54f014b Trace full GPS query results`.
|
||||
- Installed RED4ext plugin:
|
||||
`Cyberpunk 2077/red4ext/plugins/EdgeWeightGPS/EdgeWeightGPS.dll`.
|
||||
- Installed build is read-only. It should not alter route behavior.
|
||||
- Plugin log is cleared and empty before the next test:
|
||||
`Cyberpunk 2077/red4ext/plugins/EdgeWeightGPS/EdgeWeightGPS.log`.
|
||||
- Latest archived test log:
|
||||
`logs/EdgeWeightGPS_query_route_probe_2308.log`.
|
||||
- Game is cold as of the latest user message.
|
||||
|
||||
## New Toolbox Tools
|
||||
@@ -32,6 +32,7 @@ In `red4ext/EdgeWeightGPS/src/Main.cpp`:
|
||||
- `kEnableGpsTraceHooks = true`
|
||||
- `kEnableGpsQueryLifecycleHooks = true`
|
||||
- `kEnableGpsRouteJobLifecycleHooks = false`
|
||||
- `kEnableGpsRouteJobStartTrace = false`
|
||||
- `kEnableGpsLocalSearchHooks = true`
|
||||
- `kEnableRouteUiTraceHooks = false`
|
||||
|
||||
@@ -113,37 +114,81 @@ Route result records:
|
||||
- `h00` in those records matches `worldTrafficLanePersistent.nodeRefHash`.
|
||||
- Route records can be joined to `work/raw-segment-json/all.traffic_persistent.json`.
|
||||
- The low byte of route-record `u08` is not the same as the search point class.
|
||||
- The log's human wall timestamp has a millisecond rollover bug around second
|
||||
boundaries. Use the `+Nms` elapsed field for ordering and durations.
|
||||
|
||||
## Next User Test
|
||||
## Latest 23:08 Test Result
|
||||
|
||||
Ask the user to run the usual routine:
|
||||
The user clicked:
|
||||
|
||||
1. Launch game.
|
||||
2. Hit Continue on main menu.
|
||||
3. Hit Space to Continue.
|
||||
4. Wait for minimap/GPS to settle.
|
||||
5. Open map.
|
||||
6. Plot the usual three routes plus one custom highway-ish target.
|
||||
7. Close game.
|
||||
- 23:08 continue on main menu
|
||||
- 23:30 space to continue
|
||||
- 23:46 map open
|
||||
- 23:56 side job
|
||||
- 24:06 Sinnerman
|
||||
- 24:14 Claire
|
||||
- 24:21 custom
|
||||
- 24:30 Aldecaldo camp
|
||||
- 24:47 far gig east
|
||||
- 25:03 Violence
|
||||
- 25:10 cyberpsycho unfinished highway
|
||||
|
||||
Ask for timestamps for:
|
||||
Use:
|
||||
|
||||
- Space-to-Continue
|
||||
- map open
|
||||
- each route click
|
||||
- game cold
|
||||
```bash
|
||||
python3 tools/summarize_gps_route_records.py \
|
||||
--traffic-json work/raw-segment-json/all.traffic_persistent.json \
|
||||
logs/EdgeWeightGPS_query_route_probe_2308.log
|
||||
```
|
||||
|
||||
After the run:
|
||||
Important result table:
|
||||
|
||||
1. Archive the log to `logs/EdgeWeightGPS_provider_filter_probe_<time>.log`.
|
||||
2. Inspect `GPSQuerySubmit`/`GPSQueryResultFetch` lines for tracked route IDs
|
||||
from submit return RVA `0x8d20d4`, especially successful `0x7094b8`
|
||||
records with `gpsResult_ptr28_rec40`.
|
||||
3. Inspect `GPSSearch result` lines for `filterPassClasses`,
|
||||
`filterFailClasses`, `filterPassMaskBits`, and `filterFailMaskBits`.
|
||||
4. Compare filter pass/fail classes to `edgeSrcClasses` and route output
|
||||
records. The key question is whether the class/mask filter is selecting the
|
||||
graph subset before cost weighting can matter.
|
||||
- qid 1: startup/minimap route, 18 records, 50 ms, 1216.5 pavement length.
|
||||
- qid 2: side job, 12 records, 32 ms, 578.6 pavement length.
|
||||
- qid 3: Sinnerman, 23 records, 45 ms, 897.4 pavement, 160.4 highway,
|
||||
89.8 road.
|
||||
- qid 4: Claire, 18 records, 34 ms, 1216.5 pavement.
|
||||
- qid 5: custom, 17 records, 44 ms, 1006.3 pavement, 241.0 highway,
|
||||
38.0 road.
|
||||
- qid 6: Aldecaldo camp, 80 records, 325 ms, 5853.5 road, 1492.9 highway,
|
||||
1111.5 pavement, 24.6 gpsonly.
|
||||
- qid 7: far east gig, 81 records, 144 ms, 5086.2 road, 1523.0 highway,
|
||||
1111.5 pavement, 24.6 gpsonly.
|
||||
- qid 8: Violence, 55 records, 97 ms, 1991.5 pavement, 358.5 highway,
|
||||
86.1 road.
|
||||
- qid 9: cyberpsycho unfinished highway, 58 records, 147 ms, 2657.4 pavement,
|
||||
519.0 highway, 113.2 road, 56.7 gpsonly.
|
||||
|
||||
All 362 route-record handles matched traffic lane hashes in the extracted
|
||||
resource.
|
||||
|
||||
Local search/provider aggregate from this run:
|
||||
|
||||
- 159 searches, 4036 provider filter calls, only 3 filter failures.
|
||||
- Filter pass classes: `3:3114`, `5:451`, `15:310`, `1:116`, `4:42`.
|
||||
- Edge source classes: `3:3244`, `5:487`, `15:318`, `1:117`, `4:58`.
|
||||
- Edge return RVAs: `0x44f457:4033`, `0x44f629:151`,
|
||||
`0x8d74d3:30`, `0x8d76b0:10`.
|
||||
|
||||
Inference:
|
||||
|
||||
- Provider vtable slot `+0x08` filtering is almost not pruning these route
|
||||
searches, so it is not the dominant reason class-cost patches failed to
|
||||
visibly steer GPS.
|
||||
- Search-side edge classes are only `{1,3,4,5,15}` in this run. Final emitted
|
||||
route-record classes include `{0,1,2,3,4,5,7,8,9}` and class 7/8/9 are
|
||||
highway-heavy. Therefore final route-record `u08` low byte and search point
|
||||
`point+0x13` class are different domains.
|
||||
|
||||
## Next Work
|
||||
|
||||
- Static disassembly around result-drain/producer RVAs `0x520783`,
|
||||
`0x41be2c`, `0x41be94`, `0x70a42c`, and `0x8d20d4`.
|
||||
- The plausible patch point is upstream of result copy: find where search
|
||||
output is converted to 0x28 route records or where candidate lanes are ranked
|
||||
with enough lane-hash/resource context to prefer highway/major-road lanes.
|
||||
- Post-`0x7094b8` rewriting would likely only change displayed path records and
|
||||
risks desynchronizing instructions from the real planner.
|
||||
|
||||
## Useful Commands
|
||||
|
||||
|
||||
Reference in New Issue
Block a user