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`.