re: all 24 settings objects named -- stage\StageParameter_S<NN>.tbl

The queued item (the 29-object resource manifest) turned out to be already
settled by challenge-mission-gate.md and stage-mission-tables.md, so the
iteration moved to the open question those docs make answerable.

Hashing EVERY string that appears in any IDXD object on the disc resolves all
24: StageParameter_S01..S16 (story), S24..S29 (challenge), StageParameter_
Tutorial shared by all six tutorials, and StageParameter_Test.  16+6+1+1 = 24,
which is exactly why the settings family is 24 against 29 stage records.

IsBoss16Enable confirmed independently: that object is StageParameter_S16.
GravityFactor is non-zero in S10 (700), S11 (400), S03 (250), S27 (250); the
three unscored objects are S24, S27, S28; the one without SplinterCell is _Test.

Refuted on the way: TOC order is not stage order (the TOC is hash-sorted and the
Boss16 object is 17th, not 16th), and neither the StageResource template nor a
real 19-field record names the settings table.  The AUTO_SETTINGS filenames are
a different scheme -- none of the 28 hashes to any of these 24.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PMRJjbxLqZtsb5Vb7KunPE
This commit is contained in:
Claude (auto)
2026-08-27 19:05:28 +00:00
parent 54e36349a4
commit 19b6eb3ee6
6 changed files with 141 additions and 17 deletions

View File

@@ -98,6 +98,32 @@ def main():
except Exception:
pass
full.sort()
# name every settings object: harvest all IDXD strings and hash them
harvest = set()
for pp in sorted(glob.glob(os.path.join(DAT, '**', '*.pak'), recursive=True)):
for _, s2 in pak_entries(pp):
if s2[:4] != b'IDXD':
continue
try:
for r in U.parse(s2):
for _, nm, v in r['fields']:
harvest.add(v)
except Exception:
pass
want = {h for h, _ in tables}
named = {}
for c in harvest:
if not c or len(c) > 90:
continue
for pre in ('', 'stage\\', 'message\\'):
hh = U.name_hash(pre + c)
if hh in want:
named.setdefault(hh, pre + c)
print()
print('settings objects named from harvested disc strings: %d/%d' % (len(named), len(want)))
for h in sorted(named, key=lambda k: named[k]):
print(' %#010x %s' % (h, named[h]))
print()
print('the rest of the settings object (%d objects):' % len(full))
shapes = collections.Counter(tuple(sorted(d)) for _, d in full)