From deafc2b01bd4cbc2b7c93873f8f64439f4c1579a Mon Sep 17 00:00:00 2001 From: RT Date: Fri, 7 Aug 2026 20:52:00 -0500 Subject: [PATCH] Make Behemoth II inherit validated display mappings Copy Behemoth's validated texuv2, offset2, texuv3, and offset3 rows from Mech ID 11 to Behemoth II at Mech ID 12. Both variants intentionally share the same external MFD and Radar geometry. Add an inherited-mapping assertion to the J&J comparison generator so future runs fail if any Behemoth II coordinate row diverges from Behemoth. Record the passing inheritance check in the generated summary. Document the inherited variant relationship and effective mapping count in MFD-RADAR-MAPPINGS.md. Compare hud/behemothii.bmp and radar/hud/behemothii.bmp against the corresponding Behemoth runtime assets. Both 512x512 grayscale images are already pixel-identical, so no hsh art files are copied or replaced. --- Finished HUDS from J&J/COMPARISON-SUMMARY.md | 4 ++++ .../generate_comparison_maps.py | 19 +++++++++++++++++++ .../code/CoreTech/Libraries/GameOS/coord.cpp | 8 ++++---- MFD-RADAR-MAPPINGS.md | 10 ++++++++++ 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/Finished HUDS from J&J/COMPARISON-SUMMARY.md b/Finished HUDS from J&J/COMPARISON-SUMMARY.md index 2fa99107..cbe222f0 100644 --- a/Finished HUDS from J&J/COMPARISON-SUMMARY.md +++ b/Finished HUDS from J&J/COMPARISON-SUMMARY.md @@ -26,6 +26,10 @@ Generated by `generate_comparison_maps.py`. Red is the current `coord.cpp` mappi | Warhammer | MFD | **EXACT** | 0/11 | 0/11 | | Warhammer | RADAR | **EXACT** | 0/11 | 0/11 | +## Inherited mappings + +- `Behemoth II` (Mech ID 12) inherits all four coordinate rows from `Behemoth` (Mech ID 11); generator assertion passed + ## Missing comparison inputs - `Argus` RADAR: no complete provided mapping/image set configured diff --git a/Finished HUDS from J&J/generate_comparison_maps.py b/Finished HUDS from J&J/generate_comparison_maps.py index 1063fd13..d0742a01 100644 --- a/Finished HUDS from J&J/generate_comparison_maps.py +++ b/Finished HUDS from J&J/generate_comparison_maps.py @@ -51,6 +51,10 @@ DISPLAYS = ( Display("Warhammer", 62, "radar", "Radar", "warhammer", "Radar/Warhammer unexploded.txt", "Radar/Warhammer exploded.txt", "Radar/warhammer_unexploded copy.bmp", "Radar/warhammer_exploded.bmp"), ) +INHERITED_MAPPINGS = ( + ("Behemoth II", 12, "Behemoth", 11), +) + def parse_coord_arrays() -> dict[str, list[list[tuple[int, ...]]]]: text = COORD.read_bytes().decode("ascii") @@ -241,6 +245,14 @@ def main() -> None: all_warnings = [] generated = [] + for variant_name, variant_id, base_name, base_id in INHERITED_MAPPINGS: + for array_name in ("texuv2", "offset2", "texuv3", "offset3"): + if arrays[array_name][variant_id] != arrays[array_name][base_id]: + raise RuntimeError( + f"{variant_name} (ID {variant_id}) must inherit {array_name} " + f"from {base_name} (ID {base_id})" + ) + for display in DISPLAYS: warnings = [] provided_rectangles, provided_offsets = normalize_measurements(display, warnings) @@ -294,6 +306,13 @@ def main() -> None: for display, status, rectangle_differences, offset_differences, _ in results: lines.append(f"| {display.folder} | {display.kind.upper()} | **{status}** | {rectangle_differences}/11 | {offset_differences}/11 |") + lines.extend(("", "## Inherited mappings", "")) + for variant_name, variant_id, base_name, base_id in INHERITED_MAPPINGS: + lines.append( + f"- `{variant_name}` (Mech ID {variant_id}) inherits all four coordinate rows " + f"from `{base_name}` (Mech ID {base_id}); generator assertion passed" + ) + lines.extend(("", "## Missing comparison inputs", "")) for folder, kind in missing: lines.append(f"- `{folder}` {kind.upper()}: no complete provided mapping/image set configured") diff --git a/Gameleap/code/CoreTech/Libraries/GameOS/coord.cpp b/Gameleap/code/CoreTech/Libraries/GameOS/coord.cpp index 2fa17dfd..9cc180b5 100644 --- a/Gameleap/code/CoreTech/Libraries/GameOS/coord.cpp +++ b/Gameleap/code/CoreTech/Libraries/GameOS/coord.cpp @@ -14,7 +14,7 @@ float texuv2[65][11][4]={ {{174,153,225,345},{111,153,162,345},{219, 33,276,153},{ 60, 33,117,153},{126, 45,150,144},{186, 45,210,144},{ 6, 24, 54,198},{ 0, 0, 0, 0},{144, 9,162, 18},{291,111,309,129},{252,195,273,252}}, // M_Battlemaster {{174,153,225,345},{111,153,162,345},{219, 33,276,153},{ 60, 33,117,153},{126, 45,150,144},{186, 45,210,144},{ 6, 24, 54,198},{ 0, 0, 0, 0},{144, 9,162, 18},{291,111,309,129},{ 0, 0, 0, 0}}, // M_BattlemasterIIc {{ 76,170,152,302},{184,170,262,302},{ 12,106,126,174},{212,106,326,174},{176, 86,226,174},{110, 82,160,174},{140, 96,198,224},{ 0, 0, 0, 0},{164,122,174,134},{142, 38,194, 98},{ 0, 0, 0, 0}}, // M_Behemoth - {{186,177,243,375},{102,177,159,375},{249, 27,324,162},{ 18, 18,102,162},{111, 51,147,141},{201, 51,237,141},{153, 18,192,174},{ 0, 0, 0, 0},{210, 30,231, 39},{ 21,213, 75,330},{ 0, 0, 0, 0}}, // M_Behemothii + {{ 76,170,152,302},{184,170,262,302},{ 12,106,126,174},{212,106,326,174},{176, 86,226,174},{110, 82,160,174},{140, 96,198,224},{ 0, 0, 0, 0},{164,122,174,134},{142, 38,194, 98},{ 0, 0, 0, 0}}, // M_Behemothii {{ 32, 82,140,294},{188, 82,294,294},{ 6, 12, 88,134},{236, 12,318,134},{176, 18,234,132},{ 92, 18,244, 36},{152, 6,172,132},{ 0, 0, 0, 0},{154, 38,168, 42},{110,112,142,138},{184,112,216,138}}, // M_Blackhawk {{186,177,243,375},{102,177,159,375},{249, 27,324,162},{ 18, 18,102,162},{111, 51,147,141},{201, 51,237,141},{153, 18,192,174},{ 0, 0, 0, 0},{210, 30,231, 39},{ 21,213, 75,330},{ 0, 0, 0, 0}}, // M_Blackknight {{256,122,336,334},{ 8,122, 88,334},{234, 24,282,100},{ 62, 14,108, 90},{108,162,152,220},{194,162,238,220},{118, 2,226,152},{ 0, 0, 0, 0},{164,208,180,222},{194,238,218,290},{126,238,152,290}}, // M_Blacklanner @@ -85,7 +85,7 @@ int offset2[65][11][2]={ {{174,143},{111,143},{216, 23},{ 63, 23},{126, 35},{186, 35},{147, 14},{ 0, 0},{144, 29},{117,101},{207,140}}, // M_Battlemaster {{174,143},{111,143},{216, 23},{ 63, 23},{126, 35},{186, 35},{147, 14},{ 0, 0},{144, 29},{117,101},{ 0, 0}}, // M_BattlemasterIIc {{ 6,172},{246,172},{ 6, 8},{281, 8},{226, 82},{ 72, 82},{138,172},{ 0, 0},{164,122},{142, 8},{ 0, 0}}, // M_Behemoth - {{186,142},{102,142},{234, 22},{ 27, 13},{117, 46},{192, 46},{153, 13},{ 0, 0},{162, 25},{ 24, 13},{ 0, 0}}, // M_Behemothii + {{ 6,172},{246,172},{ 6, 8},{281, 8},{226, 82},{ 72, 82},{138,172},{ 0, 0},{164,122},{142, 8},{ 0, 0}}, // M_Behemothii {{ 8,128},{228,128},{ 8, 0},{252, 0},{188, 0},{ 0, 96},{160, 0},{ 0, 0},{164,146},{132,168},{176,168}}, // M_Black Hawk {{186,142},{102,142},{234, 22},{ 27, 13},{117, 46},{192, 46},{153, 13},{ 0, 0},{162, 25},{ 24, 13},{ 0, 0}}, // M_Black Knight {{196,128},{ 68,128},{234, 30},{ 62, 20},{108, 18},{194, 18},{118, 8},{ 0, 0},{164, 24},{194, 44},{126, 44}}, // M_Black Lanner @@ -155,7 +155,7 @@ float texuv3[65][11][4]={ {{350,260,420,502},{128,246,200,488},{426, 16,500,172},{ 24, 14, 98,172},{162, 26,216,160},{352, 26,406,160},{258, 50,312,268},{ 0, 0, 0, 0},{262, 6,282, 18},{118,118,146,144},{436,218,464,282}}, // M_Battlemaster {{350,260,420,502},{128,246,200,488},{426, 16,500,172},{ 24, 14, 98,172},{162, 26,216,160},{352, 26,406,160},{258, 50,312,268},{ 0, 0, 0, 0},{262, 6,282, 18},{118,118,146,144},{ 0, 0, 0, 0}}, // M_BattlemasterIIc {{ 84,206,184,374},{222,206,322,374},{ 2,124,150,210},{260,124,404,210},{214, 94,278,210},{130, 94,194,210},{166,110,242,274},{ 0, 0, 0, 0},{198,144,210,158},{170, 36,236,112},{ 0, 0, 0, 0}}, // M_Behemoth - {{400,258,472,478},{ 42,258,112,478},{372, 58,456,204},{ 72, 96,128,212},{150,100,190,188},{314,100,354,188},{208, 54,296,252},{ 0, 0, 0, 0},{234, 12,270, 24},{234,282,298,452},{ 0, 0, 0, 0}}, // M_Behemothii + {{ 84,206,184,374},{222,206,322,374},{ 2,124,150,210},{260,124,404,210},{214, 94,278,210},{130, 94,194,210},{166,110,242,274},{ 0, 0, 0, 0},{198,144,210,158},{170, 36,236,112},{ 0, 0, 0, 0}}, // M_Behemothii {{ 40,118,178,390},{238,118,376,390},{ 8, 28,114,182},{296, 28,404,180},{220, 38,497,182},{114, 38,192,182},{188, 22,222,184},{ 0, 0, 0, 0},{192, 58,218, 78},{134,156,178,190},{230,156,272,190}}, // M_Black Hawk {{400,258,472,478},{ 42,258,112,478},{372, 58,456,204},{ 72, 96,128,212},{150,100,190,188},{314,100,354,188},{208, 54,296,252},{ 0, 0, 0, 0},{234, 12,270, 24},{234,282,298,452},{ 0, 0, 0, 0}}, // M_Black Knight {{376,226,472,482},{ 24,226,118,482},{412, 48,468,142},{ 36, 36, 92,128},{110, 34,162,104},{332, 32,386,104},{184, 24,312,202},{ 0, 0, 0, 0},{238,250,258,270},{330,126,364,196},{132,126,166,196}}, // M_Black Lanner @@ -224,7 +224,7 @@ int offset3[65][11][2]={ {{208,162},{130,162},{266, 18},{ 70, 12},{136, 26},{220, 28},{178, 4},{ 0, 0},{182, 28},{136,118},{256,162}}, // M_Battlemaster {{208,162},{130,162},{266, 18},{ 70, 12},{136, 26},{220, 28},{178, 4},{ 0, 0},{182, 28},{136,118},{ 0, 0}}, // M_BattlemasterIIc {{ 8,236},{348,236},{ 8, 26},{302, 26},{294,130},{108,130},{202,242},{ 0, 0},{230,174},{202, 28},{ 0, 0}}, // M_Behemoth - {{220,188},{132,188},{282, 38},{ 82, 76},{130, 80},{254, 80},{168, 34},{ 0, 0},{194, 52},{ 44, 2},{ 0, 0}}, // M_Behemothii + {{ 8,236},{348,236},{ 8, 26},{302, 26},{294,130},{108,130},{202,242},{ 0, 0},{230,174},{202, 28},{ 0, 0}}, // M_Behemothii {{ 8,228},{362,228},{ 8, 28},{392, 30},{ 85, 56},{136, 56},{234, 28},{ 0, 0},{242,250},{170,250},{296,250}}, // M_Black Hawk {{220,188},{132,188},{282, 38},{ 82, 76},{130, 80},{254, 80},{168, 34},{ 0, 0},{194, 52},{ 44, 2},{ 0, 0}}, // M_Black Knight {{236,146},{ 84,146},{282, 28},{ 76, 16},{130, 14},{232, 12},{144, 4},{ 0, 0},{198, 20},{230, 46},{152, 46}}, // M_Black Lanner diff --git a/MFD-RADAR-MAPPINGS.md b/MFD-RADAR-MAPPINGS.md index 3700e189..27120370 100644 --- a/MFD-RADAR-MAPPINGS.md +++ b/MFD-RADAR-MAPPINGS.md @@ -333,6 +333,10 @@ Also verify all of the following before considering the source complete: All 19 complete display sets under `Finished HUDS from J&J/` are installed in `coord.cpp` and report `EXACT` in `COMPARISON-SUMMARY.md`: 12 MFD sets and 7 Radar sets across 13 chassis. Seven opposite-display sets have no complete supplied mapping/image inputs and were not changed. +Behemoth II (Mech ID 12) has no separate J&J measurement set because it deliberately shares +Behemoth's geometry and art. Its four rows now inherit Behemoth's validated ID 11 rows, bringing +the effective installed result to 21 MFD/Radar mappings across 14 Mech IDs. The comparison +generator asserts this inheritance on every run and fails if any row diverges. Installed sets: @@ -343,6 +347,7 @@ Installed sets: | 5 | Assassin II | installed | installed | | 7 | Avatar | installed | installed | | 11 | Behemoth | installed | installed | +| 12 | Behemoth II | inherited from ID 11 | inherited from ID 11 | | 13 | Black Hawk | installed | installed | | 27 | Fafnir | installed | no supplied set | | 28 | Flea | installed | no supplied set | @@ -365,6 +370,11 @@ MFD: annihilator, argus, assassin2, avatar, behemoth, blackhawk, Fafnir, Radar: annihilator, assassin2, avatar, behemoth, blackhawk, hellspawn, warhammer ``` +Behemoth II uses separate canonical files, `hud/behemothii.bmp` and +`radar/hud/behemothii.bmp`. Both were decoded and compared to their corresponding Behemoth +runtime BMP on 2026-08-07; both were already pixel-identical 512x512 grayscale images, so no art +files were copied or replaced. + Three obvious measurement-file transcription errors were normalized without changing the validated geometry: Behemoth MFD LT `1742` to `174`, Behemoth Radar CT `202.242` to `202,242`, and Fafnir MFD LL `162.326` to `162,326`. Behemoth Radar's blank S2 was made explicit as `0,0`.