Skip to content

fix: ship menuIcon.dds for the Esc RF door badge - #38

Open
TheCodingDad-TisonK wants to merge 13 commits into
mainfrom
development
Open

fix: ship menuIcon.dds for the Esc RF door badge#38
TheCodingDad-TisonK wants to merge 13 commits into
mainfrom
development

Conversation

@TheCodingDad-TisonK

Copy link
Copy Markdown
Member

The Esc RF door host builds RfPdaMenuPage which loads textures/ui/menuIcon.dds as the module badge. IncomeMod never shipped the file and its build include list did not pack the textures dir. Adds the suite menuIcon.dds and includes textures in the zip. Built and deployed.

TheCodingDad-TisonK and others added 10 commits August 5, 2026 15:52
A Lua parse error does not stop FS25 loading the mod. The mod loads, the
game runs, and the offending FILE is silently dropped, so one feature is
simply absent with nothing but a compiler line nobody reads.

On 2026-08-05 seven files across four repos shipped with a UTF-8 BOM,
every one of which would have died exactly that way. Lua does not skip a
byte order mark the way it skips a shebang, so the BOM is read as part of
the first token.

- tools/git-hooks/pre-commit: parses the staged .lua set with luaparse
  pinned to Lua 5.1, then runs the repo lint where one exists. Syntax
  blocks the commit, lint only advises.
- tools/test/check-staged.mjs: the checker. A BOM was already caught, but
  only as "Cannot read properties of undefined (reading 'range')", which
  tells you nothing. It now names the BOM and says how to fix it.
- node_modules/ gitignored; luaparse is fetched on the hook's first run.

Dev tooling only, never shipped: build.sh repos use an INCLUDE allowlist
that omits tools/, and the build.py repos exclude it via EXCLUDE_DIRS.

Install on a fresh clone: bash tools/test/install-hooks.sh
Skip once: git commit --no-verify
Wizard lane OUT 2026-08-08: one PR onto origin/development (no GPortal).

Co-authored-by: Cursor <cursoragent@cursor.com>
Esc RF densify / RfEscModules whitelist guest deltas
The Esc RF door host builds RfPdaMenuPage which loads textures/ui/menuIcon.dds
as the module badge. IncomeMod never shipped the file and its build include
list did not pack the textures dir, so hosting the door logged missing-dds
errors. Add the suite menuIcon.dds and include textures in the zip.
IncomeMod's build include list omitted xml/, so the Esc RF door host failed to
open xml/gui/RfPdaMenuPage.xml and rfEscProfiles.xml. Add xml to the include
list. The menuIcon + textures fix already landed; this completes the door.
The previous menuIcon was an uncompressed dds (raw format), which FS25 does not
reliably render as a tab icon, so the Esc RF door showed no badge. Swap to the
suite's DXT5 256x256 badge.
The shared Esc door is built by whichever carrier loads first, and load
order is alphabetical, so FS25_DairyCore won it. Its copy of
RfPdaMenuPage had the Soil footer frozen at { Back, Help }, so Rotation
Planner and Field Detail were simply absent from the chrome the player
got, no matter what SoilFertilizer itself shipped.

Four lineages were live in the field:
  2260  MarketDynamics                   67 fns, full Soil footer
  2110  DairyCore + 4 others             67 fns, Soil footer short 2
  1858  SoilFertilizer                   61 fns
  1855  SeasonalCropStress, WorkerCosts  61 fns

MarketDynamics was a strict function-level superset - zero functions
existed only in SoilFertilizer - so it becomes canonical, with the two
SoilFertilizer deltas re-applied on top:

- Help is no longer seeded into menuButtonInfo at initialize time. It
  leaked onto every module's footer until the first chrome sync ran.
- the long rf_pda_side_info_* fallback strings are restored over the
  shortened rewrite.

All nine now ship one identical file, so who wins the door race stops
mattering. Creation order is untouched, so this does not reintroduce the
load-timing regression that got 7f8b21b2 reverted.
Swaps the suite badge from the Soil sprout to Wizard's RF monogram. He
shipped it in FS25_NPCFavor (bb70571) but it never reached the mod that
actually owns the badge, so nobody saw it: RfEscBootstrap resolves
ICON_OWNER to FS25_SoilFertilizer, so SoilFertilizer's copy is the one
that renders whenever SF is installed, whoever built the door. The other
carriers hold the fallback for a no-SF install and are updated in step.

Format: Wizard's source was 256x256 DXT5 with zero mipmaps, while the
badge proven to render in game is 256x256 DXT5 with a 9 level mip chain.
Rebuilt with the full chain by reusing that working file's 128 byte
header verbatim, so dimensions, fourCC and mip count are provably
identical to the icon already known good. 87536 bytes, unchanged.

The sprout is preserved at textures/ui/menuIcon_sprout.dds in
SoilFertilizer so it can be restored without digging through history.

MarketDynamics keeps its own price-chart icon: that is module branding,
not the suite badge.
@TheCodingDad-TisonK

Copy link
Copy Markdown
Member Author

Heads up for review: this PR has picked up the 2026-08-08 Esc door work since it was opened, so it now carries more than the title says.

  • 1c699e5 Esc door chrome unified across all nine carriers. RfPdaMenuPage.lua had drifted into four versions. The door is built by whichever carrier loads first and load order is alphabetical, so DairyCore was winning and serving a chrome whose Soil footer was frozen at { Back, Help }. Rotation Planner and Field Detail never reached the player, and Help rendered but did nothing because that copy called bare cross-mod globals with no resolver. MarketDynamics was a strict function-level superset and became the canonical base. All nine now ship one identical file, EOL-normalized hash 47142adce92f.
  • 87b76f0 RF badge on the Esc tab. Wizard's RF monogram (his bb70571 in NPCFavor) rebuilt from 0 mipmaps to the 9 level chain the working badge uses, header reused verbatim so the format is provably identical. 256x256 DXT5, 87536 bytes.

Verified: parses clean under luaparse pinned to Lua 5.1 (control file rejected first), deployed zip re-opened after packing to confirm the hashes, and confirmed in game.

Pattern doc for future footer work: Office Wizard/esc-rf-pda/CANONICAL-CHROME-AND-BUTTON-PATTERN.md. The short version: a footer change is a nine-repo change, and footer buttons are Lua menuButtonInfo, never XML.

Resolves the only conflict, modDesc.xml, in favour of the version main
already shipped. development sat at 2.1.6.15 while main had released
2.1.7.0, so development was numbered below a public release. Takes
2.1.7.0 and keeps development's Esc RF PDA l10n keys, which did not
conflict.

The next real bump happens at release time; this only stops development
from regressing the number.
development is the trunk, so a PR opened from it silently absorbs every
commit that lands while it is open, under a title that still describes
the first one. That happened twice in two days, the second time to the
seat that had reported it the day before.

Every feature, fix or brief now gets its own branch cut from
development, and the PR is that branch into development. One item per
PR. development to main becomes a release PR only.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants