Skip to content

Add UI scene / resource bin entry names - #37

Open
Crauzer wants to merge 1 commit into
CommunityDragon:masterfrom
Crauzer:add-uiscene-binentry-names
Open

Add UI scene / resource bin entry names#37
Crauzer wants to merge 1 commit into
CommunityDragon:masterfrom
Crauzer:add-uiscene-binentry-names

Conversation

@Crauzer

@Crauzer Crauzer commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

235 hashes.binentries.txt names, derived rather than guessed.

Many bin entries are named after a path that is already known, so they can be recovered by a dictionary join instead of brute force. Two rules, both run against 16.14.7949266 (421,004 top-level entries across 46,154 bins; 47,243 not yet named here):

A — prefix of a string value. Every UI element's name is <scene path>/<element tree>, so every /-delimited prefix of a string value is an entry-name candidate. Positive control: this regenerates 27,929 names already in this file, and gives correct casing for free.

B — known WAD path. Entries such as UiPropertyLoadable / UiPropertyOverrideLoadable / UiComponent are named after the file they reference, so hashing every path in hashes.game.txt (full and extension-stripped) against unnamed entry hashes recovers them. This reaches the variant stubs rule A cannot — 174 of them contain no objects, so no string exists to take a prefix of.

The rules overlap on 22 entries and agree on the name for all 22.

Rule B gave 233 raw matches, so chance collisions were separated by directory using dictionary size to predict them (paths × forms × targets / 2³²):

top-level dict paths expected observed
clientstates 1,068 0.0 193 kept
ux / loadouts / characters / levels 12,283 0.1 7 kept
assets 2,067,660 26.2 29 dropped
data 190,766 2.4 3 dropped

assets/ and data/ sit on the collision expectation and were dropped wholesale rather than filtered by hand.

Casing is attested, not invented — from names already in this file (UIBase ×57,691, UIMobile ×1,012, TFT ×24,812), from cased strings inside the bins, and from a raw scan of all 841,898 decompressed WAD chunks for the literal. Only UIRTL/UIMobileRTL, UITencent and the Levels/Map10/Scripts/Mutators directory chain rest on convention alone; everything else is attested somewhere in shipped data.

Every entry was checked to occur as an unnamed entry in shipped bins, to reproduce its name under FNV-1a-32, and to be absent from this file. Sorted with LC_ALL=C per tools/hashes-prepare.

Happy to split the convention-only handful out if you'd rather not take them.

Researched and prepared with the help of an LLM; every name was verified against shipped data.

These entries are named after the WAD path of the file they reference, or
after a '/'-prefix of a UI element name string, so they can be derived
rather than guessed.

@Morilli Morilli left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The approach makes sense and except for the one I noted I believe the results. In general there's a lot of hashes that can be found from existing paths, either bin entries from game hashes, bin hashes from bin entries or by stripping path components (from the right, usually). The annoying part is verifying that you actually get correct results and not just things that look right.

@@ -373545,6 +373774,7 @@ dbce8e85 LCU/Strawberry/Progression/Story_Y2/Story_Y2RewardGroup
2d8a3899 LCU/Strawberry/Progression/Survive_3/Survive_3RewardGroup
a7606cda LCU/Strawberry/Progression/TotalDamageDone/TotalDamageDoneReward
2af288c6 LCU/Strawberry/Progression/TotalMinionKills/TotalMinionKillRewardGroup
62181dc9 Levels/Map10/Scripts/Mutators/MEM_Persistent

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This one seems wrong.

@benoitryder

Copy link
Copy Markdown
Member

The annoying part is verifying that you actually get correct results and not just things that look right.

Could we filter or validate using the surrounding context? (e.g. owning entry).

@Morilli

Morilli commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Could we filter or validate using the surrounding context? (e.g. owning entry).

For most of them probably, yes. But that requires the hash guessing infrastructure to connect hashes to their origin and doesn't allow "dumb" iteration over all unknown hashes.

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