Crusader_Decomp/docs/versions/family-export-differences.md
2026-04-01 00:31:23 +02:00

4.2 KiB

Family Export Differences

This note summarizes the first run of the renderer-side family comparison script and points to the generated artifacts for deeper inspection.

How to Regenerate

  • Run npm run compare-family-export-data from k:\ghidra\crusader_map_viewer\map_renderer
  • Generated artifacts:
    • k:\ghidra\crusader_map_viewer\map_renderer\generated\version-differences\family-export-differences.json
    • k:\ghidra\crusader_map_viewer\map_renderer\generated\version-differences\family-export-differences.md

Normalization Rules

  • The script compares the same scene.json payload that export-static emits for each map.
  • It strips build metadata before hashing:
    • build.*
    • metadata.game
    • metadata.gameLabel
    • metadata.usage.note
    • metadata.usage.tableAddress
  • Result: matching hashes mean the exported scene payload is content-identical after removing packaging-only metadata. Differing hashes mean something in the exported map payload changed, even if the high-level item counts stayed the same.

No Remorse Family

  • Map presence:
    • retail, 1.01, and JP all expose the same 63 detected maps
    • demo exposes only map 1
  • Shared-map headline:
    • no shared Remorse-family map hashed identically across compared versions in this first run
    • that does not mean every map has large layout changes; many differences are below the top-line counters
  • Retail vs 1.01:
    • this is the clearest structural delta in the family
    • many shared maps have small but real count changes in raw fixed rows, rendered items, or sprite totals
    • representative examples from the generated report:
      • map 1: raw 7547 -> 7530, rendered 17584 -> 17567, sprites 790 -> 791
      • map 15: raw 7473 -> 7486, rendered 13667 -> 13680, sprites 686 -> 687
      • map 24: raw 2296 -> 2285, rendered 5028 -> 5020, sprites 517 -> 520
  • Retail vs JP:
    • all 63 shared maps differ at the normalized payload level
    • the top-line counts stayed the same in the summary lines sampled from the generated report, which suggests the interesting deltas are likely deeper in the serialized scene payload rather than simple map-size changes
    • that makes JP a good candidate for focused scene-structure or sprite-definition diffing rather than another map-count pass
  • Retail vs demo:
    • only map 1 is shared
    • map 1 differs in normalized payload, but the headline counts remained the same in the first-pass summary (raw 7547, render 17584, sprites 790 on both sides)
    • that again points to deeper scene-serialization or resource differences instead of a broad layout mismatch
  • 1.01 vs JP:
    • the maps with visible count deltas line up with the retail-vs-1.01 changes, which is consistent with JP often tracking retail more closely than 1.01 does for top-line counts

No Regret Family

  • Map presence:
    • retail exposes 38 detected maps
    • demo exposes only maps 1 and 2
  • Shared-map headline:
    • maps 1 and 2 both differ between retail and demo
  • Concrete count deltas from the generated report:
    • map 1: raw 5073 -> 5104, rendered 8809 -> 8840, sprites 629 -> 639
    • map 2: raw 3078 -> 3093, rendered 5544 -> 5559, sprites 523 -> 531
  • Category shift pattern:
    • both shared demo maps gained fixed-source rows and editor records relative to retail
    • map 1 also shifts the base/editor/terrain mix slightly, which makes it a strong candidate for targeted scene-item diff tooling later

Practical Hunting Order

  • First: Regret retail vs demo maps 1 and 2, because the delta set is small and the count changes are obvious
  • Second: Remorse retail vs 1.01 on maps with visible count deltas such as 1, 15, 24, 29, 40, and 41
  • Third: Remorse retail vs JP on maps where counts stay identical, because those likely hide more subtle structural or resource-order differences

Notes

  • The Regret demo export path now depends on per-entry SHAPES.FLX fallback to retail Regret art for sparse demo archives. That fallback is intentional and currently required for successful export.
  • This report is meant to narrow the search space. When a pair/map looks interesting, the next pass should diff the specific exported scene.json entries or inspect the underlying FIXED.DAT rows and shape references directly.