Refuse enemies joining an open talk circle.

RankInvitees already skipped enemies when a circle formed; a later Chat in the same node still joined without checking opinions.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Leonid Pershin
2026-08-20 17:25:36 +03:00
co-authored by Cursor
parent b2b56d7af9
commit a80c6f097a
4 changed files with 135 additions and 13 deletions
@@ -52,6 +52,44 @@ public class TalkCircleTests
}
}
[Fact]
public void Enemy_StartsNeighborCircle_InsteadOfJoiningFriends()
{
var (school, pupils) = FivePupilsOnBreak();
using (school)
{
var first = pupils[0];
var second = pupils[1];
var enemy = pupils[2];
var ally = pupils[3];
OpinionStore.Set(first, second.Id, 55);
OpinionStore.Set(second, first.Id, 55);
OpinionStore.Set(enemy, first.Id, -55);
OpinionStore.Set(first, enemy.Id, -55);
OpinionStore.Set(enemy, second.Id, -55);
OpinionStore.Set(second, enemy.Id, -55);
OpinionStore.Set(enemy, ally.Id, 55);
OpinionStore.Set(ally, enemy.Id, 55);
PlaceAt(school, first.Id, "corridor-1");
PlaceAt(school, second.Id, "corridor-1");
Assert.True(school.TryStartAction(first.Id, TalkActions.Chat));
var friends = school.TalkCircleOf(first.Id);
Assert.NotNull(friends);
Assert.DoesNotContain(enemy.Id, friends.MemberIds);
PlaceAt(school, enemy.Id, "corridor-1");
PlaceAt(school, ally.Id, "corridor-1");
Assert.True(school.TryStartAction(enemy.Id, TalkActions.Chat));
var neighbor = school.TalkCircleOf(enemy.Id);
Assert.NotNull(neighbor);
Assert.NotEqual(friends.MemberIds, neighbor.MemberIds);
Assert.Contains(ally.Id, neighbor.MemberIds);
Assert.DoesNotContain(first.Id, neighbor.MemberIds);
Assert.Equal(friends.MemberIds, school.TalkCircleOf(first.Id)?.MemberIds);
}
}
[Fact]
public void FifthPerson_DoesNotJoinFullCircle()
{