re: the player-facing chatter partition; correcting the wingman claim

The 13 tables that voice every player-facing event are all
PresetMessage_Katana_*, the PLAYER's own sets -- unit-group-table.md already
names the link (DeltaSaber_T_Player carries msg=MessageSet_Katana).  Exact
partition: 13 voice all 14 events, 131 voice none, 0 voice some, and no
non-Katana table voices any of them.  CharacterKATANA is the only speaker
exclusive to the set.

Corrects preset-message-rules.md, which called those the wingman tables.  The
wingman roster is owned by isl-condition-builtins.md (UNITS: Bird1-Sandra ...
Rhino2-Katana, Rhino3-Ellen) and needed no experiment.

Residual: Katana_09_S10-1 and Katana_14_S16-2 voice none of the 14.

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 17:42:28 +00:00
parent 52c08b7246
commit 7d34428bec
5 changed files with 155 additions and 7 deletions

View File

@@ -362,6 +362,39 @@ def main():
oshape[tuple(sorted({r['squadron'].rstrip('0123456789') for r in recs}))] += 1
print(' their record-name families: %s' % dict(oshape))
# the player-facing partition: which tables voice LOCKON_* / PLAYER_* /
# ORDER_WINGMAN_*, and who speaks in them
PLAYER_FACING = ['LOCKON_1', 'LOCKON_12', 'LOCKON_UP', 'LOCKON_DOWN',
'PLAYER_HP_LESS_10', 'PLAYER_HP_LESS_30', 'PLAYER_HP_LESS_50',
'PLAYER_AMMO_LESS_00', 'PLAYER_AMMO_LESS_10', 'PLAYER_AMMO_LESS_40',
'ORDER_WINGMAN_ATTACK', 'ORDER_WINGMAN_COVER',
'ORDER_WINGMAN_EXTENDED', 'ORDER_WINGMAN_FORMATION']
full, none_, partial = [], [], []
spk_full, spk_rest = set(), set()
for h, recs in rule.items():
byname = {r['squadron']: r for r in recs}
got = [k for k in PLAYER_FACING
if any(n is None for _, n, _ in byname[k]['fields'])]
who = [n for _, n, _ in byname['Sperkers']['fields'] if n]
nm = A.get(h, '%#010x' % h)
if len(got) == len(PLAYER_FACING):
full.append(nm); spk_full.update(who)
elif not got:
none_.append(nm); spk_rest.update(who)
else:
partial.append((nm, len(got))); spk_rest.update(who)
print()
print('player-facing events (%d of the 64): who voices them' % len(PLAYER_FACING))
print(' tables voicing ALL of them : %d' % len(full))
print(' tables voicing NONE : %d' % len(none_))
print(' tables voicing SOME : %d %s' % (len(partial), partial))
for nm in sorted(full):
print(' all %s' % nm)
print(' speakers in the all-set: %d' % len(spk_full))
print(' exclusive to it: %s' % sorted(spk_full - spk_rest))
print(' also elsewhere : %d' % len(spk_full & spk_rest))
print()
print('rule tables, by name:')
for h in sorted(rule, key=lambda k: A.get(k, '~%#010x' % k)):