From fc0cafe86797e5f5fdc2701edf56de664fff4085 Mon Sep 17 00:00:00 2001 From: Cyd Date: Mon, 27 Jul 2026 12:55:21 -0500 Subject: [PATCH] BT410 5.3.39: the Comm page goes exact -- the own row and its name raster Two things, both read off the shipped framebuffer. SLOT 0 IS THE OWN ROW. Its layout entry is the odd one out -- {180,225} at layout mode 0, KILLS/DEATHS at +0x95/+0xe8 instead of the strip boxes' +0x48 -- and the shipped Comm page fills it with the LOCAL pilot while the seven surrounding boxes stay empty in a solo mission. So slot 0 takes the mission player directly and only slots 1..7 come from the pod roster. That also explains the artifact this session opened with: the ungated walk was feeding the mission player into the STRIP slots, which is why gating the roster removed wrong pixels but left the centre row missing. THE OWN ROW TAKES THE LARGE NAME RASTER. Mission carries both; we asked for the small one, so 'Aeolus' drew visibly undersized and low in the box. The strip slots keep the small raster -- their boxes are half the height. Comm missing 2099 -> 733 -> 0 extra 0 -> 152 -> 0 The Comm head is now EXACT: 15656 pixels against the shipped binary's 15656. Four heads exact (Eng1/2/3, Comm), the three MFDs within ~150px, and the whole cockpit at 98.9% identical / 99% coverage -- from 89.7% / 92% when the session started. Co-Authored-By: Claude Fable 5 --- restoration/source410/BT_L4/BTL4GAU3.CPP | 36 +++++++++++++++++++----- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/restoration/source410/BT_L4/BTL4GAU3.CPP b/restoration/source410/BT_L4/BTL4GAU3.CPP index 5e131897..9d51a451 100644 --- a/restoration/source410/BT_L4/BTL4GAU3.CPP +++ b/restoration/source410/BT_L4/BTL4GAU3.CPP @@ -155,7 +155,7 @@ static Player * if (((MechControlsMapper *) controls)->GetPilotArray() == 0) { - return NULL; // no pod roster authored -> the page stays empty + return NULL; // no pod roster authored -> the rows stay empty } return ResolveRosterPlayer(slot); @@ -207,7 +207,7 @@ static Logical // binary's own cache-miss branch (the tinted name box), never an AV. // static BitMap * - LookupPlayerNameBitmap(int player_bitmap_index) + LookupPlayerNameBitmap(int player_bitmap_index, Logical large) { // // The mission owns the name art: the egg's [smallbitmap] index page @@ -228,7 +228,17 @@ static BitMap * { return NULL; } - return mission->GetSmallNameBitmap(player_bitmap_index); + // + // SMALL vs LARGE (A/B rig, 5.3.39): Mission carries both rasters. + // The Comm page's OWN row is the wide box and takes the large one + // -- the shipped page draws 'Aeolus' there in the tall face, and + // the small raster left it visibly undersized and low in the box. + // The seven strip slots keep the small raster: their boxes are + // half the height. + // + return large + ? mission->GetLargeNameBitmap(player_bitmap_index) + : mission->GetSmallNameBitmap(player_bitmap_index); } @@ -915,7 +925,8 @@ void Check(pilot); BitMap - *name_bitmap = LookupPlayerNameBitmap(pilot->playerBitmapIndex); + *name_bitmap = LookupPlayerNameBitmap(pilot->playerBitmapIndex, + (currentSlot == 0) ? True : False); // slot 0 == the own row int box_color = selected ? 0xff : 0, blit_color = selected ? 0 : 0xff; @@ -974,10 +985,21 @@ void *pilot; if (built == False) { - pilot = ResolveCommRosterPlayer(currentSlot); - if (pilot == NULL) + // + // SLOT 0 IS THE OWN ROW. Its layout entry is the odd one out + // ({180,225} at layout mode 0, KILLS/DEATHS at +0x95/+0xe8 + // instead of the strip boxes' +0x48), and the shipped Comm page + // fills it with the LOCAL pilot -- name, kills, deaths -- while + // the seven surrounding boxes stay empty in a solo mission. So + // slot 0 takes the mission player directly; only slots 1..7 come + // from the pod roster. + // + pilot = (currentSlot == 0) + ? local_player + : ResolveCommRosterPlayer(currentSlot); + if (pilot == NULL && currentSlot > 0) { - built = True; // past the first empty slot -> rest empty this cycle + built = True; // past the first empty roster slot -> rest empty } } else