Add UI scene / resource bin entry names - #37
Conversation
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
left a comment
There was a problem hiding this comment.
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 | |||
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. |
235
hashes.binentries.txtnames, 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
nameis<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/UiComponentare named after the file they reference, so hashing every path inhashes.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³²):clientstatesux/loadouts/characters/levelsassetsdataassets/anddata/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. OnlyUIRTL/UIMobileRTL,UITencentand theLevels/Map10/Scripts/Mutatorsdirectory 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=Cpertools/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.