feat(runtime): FA4 -- fellowship roster enumeration + Social selection source
IRuntimeFellowshipView.GetMembers() gives the fellowship panel a way to enumerate the whole roster (TryGetMember alone needs the guid first, which a UI roster build doesn't have yet). Implemented on RuntimeFellowshipState.FellowshipView as a materialized snapshot under the same lock every other read there uses. SelectionChangeSource.Social covers a fellowship-roster row click (gmFellowshipUI's list-selection arm calls the same ACCWeenieObject::SetSelectedObject primitive every other selection origin uses -- lane B docs/research/2026-08-11-fa-panel-structure.md §6.2/§2.8). Runtime tests: +4 (RuntimeFellowshipStateTests.GetMembers_*). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
afb3223c9b
commit
357d203202
4 changed files with 88 additions and 0 deletions
|
|
@ -406,6 +406,24 @@ public sealed class RuntimeFellowshipState : IDisposable
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Campaign FA slice FA4: snapshots the whole roster under the same
|
||||
/// lock every other read here uses. Returns a materialized array
|
||||
/// (not a lazy iterator over live state) so the caller can walk it
|
||||
/// after the lock releases without racing a concurrent mutation.
|
||||
/// </summary>
|
||||
public IEnumerable<RuntimeFellowMemberSnapshot> GetMembers()
|
||||
{
|
||||
lock (owner._gate)
|
||||
{
|
||||
var result = new RuntimeFellowMemberSnapshot[owner._members.Count];
|
||||
int i = 0;
|
||||
foreach (GameEvents.FellowMember raw in owner._members.Values)
|
||||
result[i++] = ToSnapshot(raw);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
private static RuntimeFellowMemberSnapshot ToSnapshot(
|
||||
GameEvents.FellowMember raw) =>
|
||||
new(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue