re: the rest of the stage-settings object -- cameras, player limits, difficulty
53 objects in GP_MAIN_GAME_E carry a Phase_1 record, in TWO families: 29 are the resource manifest the corpus already owns (Phase_N = 4 fields) and 24 are the settings table (Phase_N = 31-90 fields). That answers the 24-vs-28 puzzle left open by the scoring entry -- the 29 is a different table, not the settings. Camera: three chase rigs in metres, 13 of 14 fields identical in every stage -- Nose (0, 4.5, 7), Near (0, 10, 40), Far (0, 15, 80), FOV 0.92; only CameraFar varies, once. Player: BulletLimit 512 / HomingLimit 256 / LaserLimit 32 and the three 0.30 axis adjustments are constant, GravityFactor is non-zero in 4 of 24 stages, and IsBoss16Enable appears in exactly ONE object -- the first per-stage handle for a family whose filenames do not resolve. Difficulty_Easy/Normal/Hard is a SECOND difficulty record (8 damage and guidance multipliers), separate from Score_*. New doc structures/stage-settings-table.md; mission_scoring.py extended. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PMRJjbxLqZtsb5Vb7KunPE
This commit is contained in:
@@ -86,6 +86,40 @@ def main():
|
||||
if t['Score_Normal'][f] != dict(base)[f]}
|
||||
print(' %#010x %s' % (h, diff))
|
||||
|
||||
# the rest of the settings object: Camera / Player / SplinterCell / Difficulty_*
|
||||
OTHER = ('Camera', 'Player', 'SplinterCell',
|
||||
'Difficulty_Easy', 'Difficulty_Normal', 'Difficulty_Hard')
|
||||
full = []
|
||||
for h, s2 in pak_entries(P):
|
||||
if s2[:4] != b'IDXD' or KEY.encode() not in s2:
|
||||
continue
|
||||
try:
|
||||
full.append((h, {r['squadron']: r for r in U.parse(s2)}))
|
||||
except Exception:
|
||||
pass
|
||||
full.sort()
|
||||
print()
|
||||
print('the rest of the settings object (%d objects):' % len(full))
|
||||
shapes = collections.Counter(tuple(sorted(d)) for _, d in full)
|
||||
print(' record-name sets: %d' % len(shapes))
|
||||
for t, c in shapes.most_common():
|
||||
print(' x%-3d %s' % (c, list(t)))
|
||||
for rn in OTHER:
|
||||
vals = collections.defaultdict(collections.Counter)
|
||||
n = 0
|
||||
for _, d in full:
|
||||
if rn not in d:
|
||||
continue
|
||||
n += 1
|
||||
for k, v in U.named(d[rn]).items():
|
||||
vals[k][v] += 1
|
||||
print()
|
||||
print(' %s — present in %d/%d objects, %d fields' % (rn, n, len(full), len(vals)))
|
||||
for k in sorted(vals):
|
||||
c = vals[k]
|
||||
print(' %-36s %2d distinct %s' % (
|
||||
k, len(c), ' '.join('%s=%d' % (a, b) for a, b in c.most_common(5))[:70]))
|
||||
|
||||
print()
|
||||
print('the commonest Normal record:')
|
||||
for k, v in sorted(dict(base).items()):
|
||||
|
||||
Reference in New Issue
Block a user