From 47fc10da026e1f4c0bce1c52afe40585b878caba Mon Sep 17 00:00:00 2001 From: Leonid Pershin Date: Thu, 20 Aug 2026 08:55:55 +0300 Subject: [PATCH 1/2] Add talk circles with TopicDef, staff/phone chat, and opinion outcomes. --- docs/phases/42-talk-circles.md | 38 +- src/HSchool.Ai/Decision.cs | 54 +- src/HSchool.Ai/TalkCircles.cs | 377 ++++++++++++++ src/HSchool.Content/CatalogLoader.cs | 5 + src/HSchool.Content/DefCatalog.cs | 6 + src/HSchool.Content/Defs.cs | 1 + src/HSchool.Content/PackPaths.cs | 3 + src/HSchool.Content/PeopleDefValidator.cs | 64 +++ src/HSchool.Content/PeopleDefs.cs | 71 +++ src/HSchool.Content/TalkActions.cs | 28 + .../mods/core/defs/actions/living.jsonc | 18 + .../mods/core/defs/behavior/rules.jsonc | 11 + .../mods/core/defs/topics/vanilla.jsonc | 52 ++ .../mods/core/defs/traits/traits.jsonc | 16 + .../mods/core/localizations/en.jsonc | 13 + .../mods/core/localizations/ru.jsonc | 13 + src/HSchool.Simulation/ActivitySystem.cs | 10 + src/HSchool.Simulation/PersonLog.cs | 9 + src/HSchool.Simulation/PresenceSystem.cs | 67 ++- src/HSchool.Simulation/School.cs | 9 + src/HSchool.Simulation/TalkCircleSystem.cs | 487 ++++++++++++++++++ tests/HSchool.Ai.Tests/TalkCirclesTests.cs | 200 +++++++ tests/HSchool.Content.Tests/PeopleDefTests.cs | 3 +- tests/HSchool.Content.Tests/TopicDefTests.cs | 32 ++ tests/HSchool.People.Tests/golden/roster.txt | 260 +++++----- .../TalkCircleTests.cs | 276 ++++++++++ 26 files changed, 1948 insertions(+), 175 deletions(-) create mode 100644 src/HSchool.Ai/TalkCircles.cs create mode 100644 src/HSchool.Content/TalkActions.cs create mode 100644 src/HSchool.Server/mods/core/defs/topics/vanilla.jsonc create mode 100644 src/HSchool.Simulation/TalkCircleSystem.cs create mode 100644 tests/HSchool.Ai.Tests/TalkCirclesTests.cs create mode 100644 tests/HSchool.Content.Tests/TopicDefTests.cs create mode 100644 tests/HSchool.Simulation.Tests/TalkCircleTests.cs diff --git a/docs/phases/42-talk-circles.md b/docs/phases/42-talk-circles.md index 707c8be..0c90e0e 100644 --- a/docs/phases/42-talk-circles.md +++ b/docs/phases/42-talk-circles.md @@ -13,31 +13,31 @@ ## Задачи -- [ ] `TopicDef`: теги, возраст, роли, шёпот-на-уроке, опциональный язык -- [ ] Ванильный набор тем (учёба, игры, еда, семья, спорт, сплетни, грубое, внешность) в `core`. +- [x] `TopicDef`: теги, возраст, роли, шёпот-на-уроке, опциональный язык +- [x] Ванильный набор тем (учёба, игры, еда, семья, спорт, сплетни, грубое, внешность) в `core`. Тема внешности учитывает уместность одежды, если сервер её уже прислал; иначе модификатор 0 -- [ ] Кружок 2–4 в одном узле; пятый не влезает -- [ ] Кого зовут: друзья и одноклассники в узле, врагов не зовут; тихоня/лидер — поля черты -- [ ] На перемене и в обед друзья тянутся в узел своих; враги не выбирают тот же обеденный узел, +- [x] Кружок 2–4 в одном узле; пятый не влезает +- [x] Кого зовут: друзья и одноклассники в узле, врагов не зовут; тихоня/лидер — поля черты +- [x] На перемене и в обед друзья тянутся в узел своих; враги не выбирают тот же обеденный узел, если есть другой -- [ ] `StaffChat` в `TeachersRoom`, только сотрудники -- [ ] Парный телефонный чат на перемене: оба несут `Phone`, слабее живого кружка; на уроке нет -- [ ] Нет общего языка — кружок можно, сдвиг мнения слабый и чаще вниз -- [ ] `Communication` растёт от разговора меньше, чем предмет за урок; язык разговора — капля, +- [x] `StaffChat` в `TeachersRoom`, только сотрудники +- [x] Парный телефонный чат на перемене: оба несут `Phone`, слабее живого кружка; на уроке нет +- [x] Нет общего языка — кружок можно, сдвиг мнения слабый и чаще вниз +- [x] `Communication` растёт от разговора меньше, чем предмет за урок; язык разговора — капля, если не у потолка -- [ ] Черты **сплетник** и **общительный** в `core` с полями, не списками в коде -- [ ] Исход пишет мнения всех пар кружка и строку лога -- [ ] На уроке обычный `Chat` не стартует (шёпот — фаза 43) +- [x] Черты **сплетник** и **общительный** в `core` с полями, не списками в коде +- [x] Исход пишет мнения всех пар кружка и строку лога +- [x] На уроке обычный `Chat` не стартует (шёпот — фаза 43) ## Тесты, без которых фаза не закрыта -- [ ] Двое свободных друзей в коридоре на перемене собирают кружок; враги — нет -- [ ] Пятый в узле не входит в тот же кружок -- [ ] Сотрудники в учительской могут `StaffChat`; ученик это действие не берёт -- [ ] Двое с телефоном на перемене могут парный чат; без телефона — нет -- [ ] Без общего языка мнение почти не растёт при том же `Communication` -- [ ] Высокий `Communication` сильнее двигает число, чем низкий, на одной теме -- [ ] Каталог без `TopicDef` не стартует школу с кружками — или падает загрузка, не молча соло-Chat +- [x] Двое свободных друзей в коридоре на перемене собирают кружок; враги — нет +- [x] Пятый в узле не входит в тот же кружок +- [x] Сотрудники в учительской могут `StaffChat`; ученик это действие не берёт +- [x] Двое с телефоном на перемене могут парный чат; без телефона — нет +- [x] Без общего языка мнение почти не растёт при том же `Communication` +- [x] Высокий `Communication` сильнее двигает число, чем низкий, на одной теме +- [x] Каталог без `TopicDef` не стартует школу с кружками — или падает загрузка, не молча соло-Chat ## Критерий готовности diff --git a/src/HSchool.Ai/Decision.cs b/src/HSchool.Ai/Decision.cs index 3c17569..9c6138e 100644 --- a/src/HSchool.Ai/Decision.cs +++ b/src/HSchool.Ai/Decision.cs @@ -41,7 +41,8 @@ public readonly record struct ActorState( IReadOnlyDictionary Needs, Intent Intent, bool LunchWindowOpen = false, - ApparelActor Apparel = default); + ApparelActor Apparel = default, + TalkPlannerContext Talk = default); /// /// Picks a goal by weight and plans walk-then-do. No world, no clock — a table of inputs to an @@ -254,6 +255,16 @@ public static class DecisionPlanner return Intent.None; } + if (state.BoundToLesson && TalkCircles.BlocksOnLesson(action.DefName)) + { + return Intent.None; + } + + if (action.DefName.Equals(TalkActions.PhoneChat, StringComparison.Ordinal) && !state.Talk.HasPhone) + { + return Intent.None; + } + if (RoomFor(catalog, map, walks, state, occupied, action) is null) { return Intent.None; @@ -396,8 +407,9 @@ public static class DecisionPlanner } string? best = null; - var bestCost = float.PositiveInfinity; + var bestScore = float.NegativeInfinity; var from = state.NodeId ?? walks.TerritoryId; + var candidates = new List(); foreach (var room in map.Rooms) { if (!action.Room.Equals(room.Def, StringComparison.Ordinal)) @@ -410,27 +422,37 @@ public static class DecisionPlanner continue; } - var cost = walks.Minutes(from, room.Id); - if (float.IsInfinity(cost) || cost > bestCost) - { - continue; - } - - if (cost < bestCost || best is null || string.CompareOrdinal(room.Id, best) < 0) - { - best = room.Id; - bestCost = cost; - } + candidates.Add(room.Id); } if (map.Territory is { } territory && action.Room.Equals(territory.Def, StringComparison.Ordinal) && HasSlot(catalog, map, occupied, territory.Id, action.Thing)) { - var cost = walks.Minutes(from, territory.Id); - if (!float.IsInfinity(cost) && (best is null || cost < bestCost || (cost == bestCost && string.CompareOrdinal(territory.Id, best) < 0))) + candidates.Add(territory.Id); + } + + var hasAlternative = candidates.Count > 1; + foreach (var nodeId in candidates) + { + if (action.Lunch + && TalkCircles.LunchNodeBlockedByEnemy(nodeId, state.Talk.SelfId ?? "", state.Talk, hasAlternative)) { - best = territory.Id; + continue; + } + + var cost = walks.Minutes(from, nodeId); + if (float.IsInfinity(cost)) + { + continue; + } + + var score = -cost + TalkCircles.NodeFriendScore(nodeId, state.Talk.SelfId ?? "", state.Talk); + if (score > bestScore + || (score == bestScore && (best is null || string.CompareOrdinal(nodeId, best) < 0))) + { + best = nodeId; + bestScore = score; } } diff --git a/src/HSchool.Ai/TalkCircles.cs b/src/HSchool.Ai/TalkCircles.cs new file mode 100644 index 0000000..cf19b74 --- /dev/null +++ b/src/HSchool.Ai/TalkCircles.cs @@ -0,0 +1,377 @@ +using HSchool.Content; +using HSchool.People; + +namespace HSchool.Ai; + +/// Inputs the planner needs for friend pull and lunch avoidance. Built in simulation. +public readonly record struct TalkPlannerContext( + string? SelfId, + IReadOnlyDictionary Opinions, + IReadOnlyDictionary PersonNodes, + string? ClassId, + bool HasPhone, + bool FriendPullActive, + BehaviorDef? Rules); + +/// +/// Pure talk-circle rules: who joins, which topic, opinion and skill math. No world access. +/// +public static class TalkCircles +{ + public static bool BlocksOnLesson(string actionId) => TalkActions.IsTalk(actionId); + + public static int MaxSize(string actionId, BehaviorDef? rules, IReadOnlyList traitIds, DefCatalog catalog) + { + if (actionId.Equals(TalkActions.PhoneChat, StringComparison.Ordinal)) + { + return 2; + } + + var max = rules?.TalkCircleMax ?? 4; + foreach (var traitId in traitIds) + { + if (catalog.Traits.TryGetValue(traitId, out var trait)) + { + max += trait.TalkCircleBonus; + } + } + + return Math.Clamp(max, rules?.TalkCircleMin ?? 2, 4); + } + + public static bool IsFriend(int? opinion, BehaviorDef? rules) => + opinion >= (rules?.TalkFriendThreshold ?? 40); + + public static bool IsEnemy(int? opinion, BehaviorDef? rules) => + opinion <= (rules?.TalkEnemyThreshold ?? -40); + + public static bool HasPhone(IReadOnlyList items) => + items.Any(item => + item.Def.Equals("Phone", StringComparison.Ordinal) + && item.Location.Equals(ItemLocations.Bag, StringComparison.Ordinal)); + + public static float Initiative(IReadOnlyList traitIds, DefCatalog catalog) + { + var weight = 1f; + foreach (var traitId in traitIds) + { + if (catalog.Traits.TryGetValue(traitId, out var trait) && trait.TalkInitiative > 0f) + { + weight *= trait.TalkInitiative; + } + } + + return weight; + } + + public static float OpinionMultiplier(IReadOnlyList traitIds, DefCatalog catalog) + { + var mult = 1f; + foreach (var traitId in traitIds) + { + if (catalog.Traits.TryGetValue(traitId, out var trait) && trait.TalkOpinionMultiplier > 0f) + { + mult *= trait.TalkOpinionMultiplier; + } + } + + return mult; + } + + /// Score a room node for friend pull on break or lunch. + public static float NodeFriendScore( + string nodeId, + string selfId, + TalkPlannerContext context) + { + if (!context.FriendPullActive) + { + return 0f; + } + + var score = 0f; + foreach (var (personId, otherNode) in context.PersonNodes) + { + if (personId.Equals(selfId, StringComparison.Ordinal) || otherNode != nodeId) + { + continue; + } + + context.Opinions.TryGetValue(personId, out var opinion); + if (IsFriend(opinion, context.Rules)) + { + score += 2f; + } + else if (IsEnemy(opinion, context.Rules)) + { + score -= 3f; + } + } + + return score; + } + + /// True when this lunch node should be avoided because an enemy sits there. + public static bool LunchNodeBlockedByEnemy( + string nodeId, + string selfId, + TalkPlannerContext context, + bool hasAlternative) + { + if (!hasAlternative) + { + return false; + } + + foreach (var (personId, otherNode) in context.PersonNodes) + { + if (personId.Equals(selfId, StringComparison.Ordinal) || otherNode != nodeId) + { + continue; + } + + context.Opinions.TryGetValue(personId, out var opinion); + if (IsEnemy(opinion, context.Rules)) + { + return true; + } + } + + return false; + } + + public static bool RoleFitsTopic(TopicDef topic, bool isStudent, bool isStaff, bool isParent) + { + if (topic.Roles.Count == 0) + { + return true; + } + + foreach (var role in topic.Roles) + { + if (role.Equals(PersonRoles.Student, StringComparison.OrdinalIgnoreCase) && isStudent) + { + return true; + } + + if (role.Equals(PersonRoles.Staff, StringComparison.OrdinalIgnoreCase) && isStaff) + { + return true; + } + + if (role.Equals(PersonRoles.Parent, StringComparison.OrdinalIgnoreCase) && isParent) + { + return true; + } + } + + return false; + } + + public static bool AgeFits(TopicDef topic, int age) + { + if (topic.Age is not { } range) + { + return true; + } + + return age >= range.Min && age <= range.Max; + } + + public static string? PickTopic( + DefCatalog catalog, + Person picker, + int age, + int seed) + { + var candidates = new List<(TopicDef Topic, float Weight)>(); + foreach (var topic in catalog.Topics.Values) + { + if (topic.Abstract + || !RoleFitsTopic(topic, picker.IsStudent, picker.IsStaff, picker.IsParent) + || !AgeFits(topic, age)) + { + continue; + } + + var weight = 1f; + foreach (var traitId in picker.Traits) + { + if (!catalog.Traits.TryGetValue(traitId, out var trait)) + { + continue; + } + + foreach (var bias in trait.TalkTagWeights) + { + if (topic.Tags.Contains(bias.Tag, StringComparer.Ordinal)) + { + weight *= bias.Weight; + } + } + } + + candidates.Add((topic, weight)); + } + + if (candidates.Count == 0) + { + return null; + } + + var total = candidates.Sum(pair => pair.Weight); + var roll = (seed & int.MaxValue) % Math.Max(1, (int)(total * 1000)) / 1000f; + var cursor = 0f; + foreach (var (topic, weight) in candidates.OrderBy(pair => pair.Topic.DefName, StringComparer.Ordinal)) + { + cursor += weight / total; + if (roll <= cursor) + { + return topic.DefName; + } + } + + return candidates[^1].Topic.DefName; + } + + /// Best shared language skill id among participants, or null. + public static string? SharedLanguage( + DefCatalog catalog, + IReadOnlyList participants, + BehaviorDef? rules) + { + var threshold = rules?.TalkLanguageThreshold ?? 25; + string? best = null; + var bestLevel = 0f; + foreach (var skill in catalog.Skills.Values.Where(def => + !def.Abstract + && !def.DefName.Equals("Communication", StringComparison.Ordinal) + && (def.AdultChance > 0f || def.DefName.EndsWith("Language", StringComparison.Ordinal)))) + { + var min = float.MaxValue; + foreach (var person in participants) + { + if (!person.Skills.TryGetValue(skill.DefName, out var level) || level < threshold) + { + min = 0f; + break; + } + + min = Math.Min(min, level); + } + + if (min >= threshold && min > bestLevel) + { + bestLevel = min; + best = skill.DefName; + } + } + + return best; + } + + public static int AppearanceModifier(ApparelIssue issues) => + issues == ApparelIssue.None ? 2 : issues.HasFlag(ApparelIssue.Formality) ? -2 : 0; + + public static int OpinionDelta( + Person from, + Person to, + TopicDef topic, + float communication, + bool sharedLanguage, + string actionId, + ApparelIssue targetAppearance, + BehaviorDef? rules, + DefCatalog catalog) + { + var baseShift = topic.OpinionShift; + if (topic.Tags.Contains(TopicTags.Appearance, StringComparer.Ordinal)) + { + baseShift += AppearanceModifier(targetAppearance); + } + + var commScale = 1f + (communication / 100f) * (rules?.TalkCommunicationOpinionScale ?? 0.5f); + var mult = OpinionMultiplier(from.Traits.ToList(), catalog) * commScale; + if (!sharedLanguage) + { + mult *= rules?.TalkNoLanguageOpinionMultiplier ?? 0.15f; + if (baseShift > 0) + { + baseShift = Math.Max(1, baseShift / 3); + } + } + + if (actionId.Equals(TalkActions.PhoneChat, StringComparison.Ordinal)) + { + mult *= rules?.TalkPhoneOpinionMultiplier ?? 0.5f; + } + + var delta = (int)Math.Round(baseShift * mult, MidpointRounding.AwayFromZero); + if (!sharedLanguage && delta > 0) + { + delta = Math.Min(delta, 1); + } + else if (!sharedLanguage && delta == 0 && baseShift <= 0) + { + delta = -1; + } + + return Math.Clamp(delta, -20, 20); + } + + public static float CommunicationGain( + float current, + SkillDef skill, + float hours, + BehaviorDef? rules) => + Math.Clamp(current + (rules?.TalkSkillPerHour ?? 0.02f) * hours, skill.Range.Min, skill.Range.Max); + + public static float LanguageGain( + float current, + SkillDef skill, + float hours, + BehaviorDef? rules) => + Math.Clamp(current + (rules?.TalkLanguageSkillPerHour ?? 0.005f) * hours, skill.Range.Min, skill.Range.Max); + + /// Invite priority: friends, classmates, others. Enemies never invited. + public static IReadOnlyList RankInvitees( + Person initiator, + IReadOnlyList candidates, + BehaviorDef? rules) + { + return candidates + .Where(candidate => !candidate.Id.Equals(initiator.Id, StringComparison.Ordinal)) + .Where(candidate => + { + initiator.Opinions.TryGetValue(candidate.Id, out var opinion); + return !IsEnemy(opinion, rules); + }) + .OrderByDescending(candidate => + { + initiator.Opinions.TryGetValue(candidate.Id, out var opinion); + if (IsFriend(opinion, rules)) + { + return 3; + } + + if (initiator.ClassId is not null + && candidate.ClassId is not null + && initiator.ClassId.Equals(candidate.ClassId, StringComparison.Ordinal)) + { + return 2; + } + + return 1; + }) + .ThenBy(candidate => candidate.Id, StringComparer.Ordinal) + .Select(candidate => candidate.Id) + .ToArray(); + } + + public readonly record struct Candidate( + string Id, + string? ClassId, + bool IsIdle, + bool InCircle, + bool HasPhone); +} diff --git a/src/HSchool.Content/CatalogLoader.cs b/src/HSchool.Content/CatalogLoader.cs index fbf2598..f20ce51 100644 --- a/src/HSchool.Content/CatalogLoader.cs +++ b/src/HSchool.Content/CatalogLoader.cs @@ -315,6 +315,7 @@ public sealed class CatalogLoader var holidays = new Dictionary(StringComparer.Ordinal); var behavior = new Dictionary(StringComparer.Ordinal); var colors = new Dictionary(StringComparer.Ordinal); + var topics = new Dictionary(StringComparer.Ordinal); foreach (var (key, json) in resolved) { @@ -380,6 +381,9 @@ public sealed class CatalogLoader case DefKind.Color: colors[key.Name] = Jsonc.Deserialize(json); break; + case DefKind.Topic: + topics[key.Name] = Jsonc.Deserialize(json); + break; } } @@ -405,6 +409,7 @@ public sealed class CatalogLoader holidays, behavior, colors, + topics, ru, en); } diff --git a/src/HSchool.Content/DefCatalog.cs b/src/HSchool.Content/DefCatalog.cs index 23f8004..12cfb73 100644 --- a/src/HSchool.Content/DefCatalog.cs +++ b/src/HSchool.Content/DefCatalog.cs @@ -28,6 +28,7 @@ public sealed class DefCatalog IReadOnlyDictionary holidays, IReadOnlyDictionary behavior, IReadOnlyDictionary colors, + IReadOnlyDictionary topics, IReadOnlyDictionary ru, IReadOnlyDictionary en) { @@ -52,6 +53,7 @@ public sealed class DefCatalog Holidays = holidays; Behavior = behavior; Colors = colors; + Topics = topics; _ru = ru; _en = en; AnyNeedDecays = needs.Values.Any(need => !need.Abstract && need.DecayPerHour > 0f); @@ -109,6 +111,8 @@ public sealed class DefCatalog public IReadOnlyDictionary Colors { get; } + public IReadOnlyDictionary Topics { get; } + /// The one concrete staffing ruleset, or null when a pack has not defined it. public StaffingDef? StaffingRules => Staffing.Values.FirstOrDefault(def => !def.Abstract); @@ -145,6 +149,7 @@ public sealed class DefCatalog DefKind.Holiday => Holidays.GetValueOrDefault(defName), DefKind.Behavior => Behavior.GetValueOrDefault(defName), DefKind.Color => Colors.GetValueOrDefault(defName), + DefKind.Topic => Topics.GetValueOrDefault(defName), _ => null, }; @@ -225,6 +230,7 @@ public sealed class DefCatalog HolidayDef => DefKind.Holiday, BehaviorDef => DefKind.Behavior, ColorDef => DefKind.Color, + TopicDef => DefKind.Topic, _ => throw new ArgumentOutOfRangeException(nameof(def)), }; diff --git a/src/HSchool.Content/Defs.cs b/src/HSchool.Content/Defs.cs index 33039c1..bbbd536 100644 --- a/src/HSchool.Content/Defs.cs +++ b/src/HSchool.Content/Defs.cs @@ -22,6 +22,7 @@ public enum DefKind Holiday, Behavior, Color, + Topic, } /// Shared JSONC fields. Kind comes from the folder under defs/, not from the file. diff --git a/src/HSchool.Content/PackPaths.cs b/src/HSchool.Content/PackPaths.cs index 85d17e7..390d865 100644 --- a/src/HSchool.Content/PackPaths.cs +++ b/src/HSchool.Content/PackPaths.cs @@ -129,6 +129,9 @@ internal static class PackPaths case "colors": kind = DefKind.Color; return true; + case "topics": + kind = DefKind.Topic; + return true; default: kind = default; return false; diff --git a/src/HSchool.Content/PeopleDefValidator.cs b/src/HSchool.Content/PeopleDefValidator.cs index d3e1492..468478f 100644 --- a/src/HSchool.Content/PeopleDefValidator.cs +++ b/src/HSchool.Content/PeopleDefValidator.cs @@ -65,6 +65,13 @@ internal static class PeopleDefValidator ValidateBehavior(behavior, log); } + foreach (var topic in catalog.Topics.Values) + { + ValidateTopic(topic, catalog); + } + + RequireTalkTopics(catalog); + if (catalog.Staffing.Values.Count(def => !def.Abstract) > 1) { throw new ContentLoadException("A catalog may only have one concrete StaffingDef."); @@ -550,6 +557,63 @@ internal static class PeopleDefValidator log.Warning( $"BehaviorDef '{behavior.DefName}' lunchWeight {behavior.LunchWeight} is above dutyLessonWeight {behavior.DutyLessonWeight}; pupils will leave class for lunch."); } + + if (behavior.TalkCircleMin < 2 || behavior.TalkCircleMax < behavior.TalkCircleMin) + { + throw new ContentLoadException( + $"BehaviorDef '{behavior.DefName}' talk circle size must be at least 2 with max ≥ min."); + } + } + + private static void ValidateTopic(TopicDef topic, DefCatalog catalog) + { + if (topic.Abstract) + { + return; + } + + if (topic.Tags.Count == 0) + { + throw new ContentLoadException($"TopicDef '{topic.DefName}' needs at least one tag."); + } + + if (topic.Age is { Min: var min, Max: var max } && min > max) + { + throw new ContentLoadException($"TopicDef '{topic.DefName}' age min cannot exceed max."); + } + + foreach (var role in topic.Roles) + { + if (!PersonRoles.IsKnown(role)) + { + throw new ContentLoadException($"TopicDef '{topic.DefName}' has unknown role '{role}'."); + } + } + + if (topic.Language is not null && !catalog.Skills.ContainsKey(topic.Language)) + { + throw new ContentLoadException($"TopicDef '{topic.DefName}' references unknown SkillDef '{topic.Language}'."); + } + } + + /// A catalog with circle actions but no topics would silently solo-chat — refuse load. + private static void RequireTalkTopics(DefCatalog catalog) + { + var hasTalkAction = catalog.Actions.Values.Any(action => + !action.Abstract + && (action.DefName.Equals(TalkActions.Chat, StringComparison.Ordinal) + || action.DefName.Equals(TalkActions.StaffChat, StringComparison.Ordinal) + || action.DefName.Equals(TalkActions.PhoneChat, StringComparison.Ordinal))); + if (!hasTalkAction) + { + return; + } + + if (!catalog.Topics.Values.Any(topic => !topic.Abstract)) + { + throw new ContentLoadException( + "A catalog with talk actions requires at least one concrete TopicDef."); + } } private static void ValidateConditionBands(BehaviorDef behavior) diff --git a/src/HSchool.Content/PeopleDefs.cs b/src/HSchool.Content/PeopleDefs.cs index cc85c87..078f529 100644 --- a/src/HSchool.Content/PeopleDefs.cs +++ b/src/HSchool.Content/PeopleDefs.cs @@ -162,6 +162,14 @@ public sealed class TraitSkillModifier public int Offset { get; init; } } +/// Biases topic pick toward a tag. Used on gossip and similar traits. +public sealed class TopicTagWeight +{ + public required string Tag { get; init; } + + public float Weight { get; init; } = 1f; +} + public sealed class TraitDef : Def { public int Weight { get; init; } = 1; @@ -190,6 +198,39 @@ public sealed class TraitDef : Def /// cold-loving is negative. /// public float ComfortTemperatureOffset { get; init; } + + /// How often this person initiates talk. Quiet below 1, leader above. + public float TalkInitiative { get; init; } = 1f; + + /// Extra seats preferred in a circle. Social trait raises it. + public int TalkCircleBonus { get; init; } + + /// Multiplies opinion shift from talk. Gossip above 1. + public float TalkOpinionMultiplier { get; init; } = 1f; + + /// Pull toward topics carrying these tags when this person picks the subject. + public IReadOnlyList TalkTagWeights { get; init; } = []; +} + +/// Conversation subject. Tags gate appropriateness; language is optional skill help. +public sealed class TopicDef : Def +{ + /// Vanilla tags: study, games, food, family, sport, gossip, rude, appearance. + public IReadOnlyList Tags { get; init; } = []; + + public IntRange? Age { get; init; } + + /// Empty means every role. + public IReadOnlyList Roles { get; init; } = []; + + /// Allowed as whisper on lesson — phase 43 uses this; ordinary Chat does not. + public bool WhisperOnLesson { get; init; } + + /// Skill that helps when shared above threshold. Null — any language works equally. + public string? Language { get; init; } + + /// Base opinion shift toward each other participant when talk succeeds. + public int OpinionShift { get; init; } = 2; } public sealed class StaffingDef : Def @@ -329,6 +370,36 @@ public sealed class BehaviorDef : Def /// public IReadOnlyList OpinionBands { get; init; } = DefaultOpinionBands; + /// Skill points Communication gains per game hour of talk — less than a lesson. + public float TalkSkillPerHour { get; init; } = 0.02f; + + /// Language used in talk, when not already at skill max. + public float TalkLanguageSkillPerHour { get; init; } = 0.005f; + + /// Minimum shared language skill for full opinion shift. + public int TalkLanguageThreshold { get; init; } = 25; + + /// Opinion multiplier when participants share no language above threshold. + public float TalkNoLanguageOpinionMultiplier { get; init; } = 0.15f; + + /// Opinion multiplier for phone chat vs live circle. + public float TalkPhoneOpinionMultiplier { get; init; } = 0.5f; + + /// How much Communication scales opinion shift (per 100 points). + public float TalkCommunicationOpinionScale { get; init; } = 0.5f; + + /// Minimum circle size. Below this Chat does not start. + public int TalkCircleMin { get; init; } = 2; + + /// Maximum people in one live circle. + public int TalkCircleMax { get; init; } = 4; + + /// Opinion at or above — friend for invites and node pull. + public int TalkFriendThreshold { get; init; } = 40; + + /// Opinion at or below — enemy; never invited, lunch nodes avoided. + public int TalkEnemyThreshold { get; init; } = -40; + public static IReadOnlyList DefaultOpinionBands { get; } = [ new() { Min = 70, Id = "OpinionCloseFriend" }, diff --git a/src/HSchool.Content/TalkActions.cs b/src/HSchool.Content/TalkActions.cs new file mode 100644 index 0000000..2662cf1 --- /dev/null +++ b/src/HSchool.Content/TalkActions.cs @@ -0,0 +1,28 @@ +namespace HSchool.Content; + +/// Leisure actions that form talk circles. Names match ActionDef ids in core. +public static class TalkActions +{ + public const string Chat = "Chat"; + public const string StaffChat = "StaffChat"; + public const string PhoneChat = "PhoneChat"; + + public static bool IsTalk(string? actionId) => + actionId is not null + && (actionId.Equals(Chat, StringComparison.Ordinal) + || actionId.Equals(StaffChat, StringComparison.Ordinal) + || actionId.Equals(PhoneChat, StringComparison.Ordinal)); +} + +/// Vanilla topic tags from the social slice design doc. +public static class TopicTags +{ + public const string Study = "study"; + public const string Games = "games"; + public const string Food = "food"; + public const string Family = "family"; + public const string Sport = "sport"; + public const string Gossip = "gossip"; + public const string Rude = "rude"; + public const string Appearance = "appearance"; +} diff --git a/src/HSchool.Server/mods/core/defs/actions/living.jsonc b/src/HSchool.Server/mods/core/defs/actions/living.jsonc index fe8be2a..876aa5c 100644 --- a/src/HSchool.Server/mods/core/defs/actions/living.jsonc +++ b/src/HSchool.Server/mods/core/defs/actions/living.jsonc @@ -36,6 +36,24 @@ "roles": ["student", "staff"], "weight": 3, }, + { + "defName": "StaffChat", + "room": "TeachersRoom", + "minutes": 8, + "need": "Social", + "needGain": 0.4, + "roles": ["staff"], + "weight": 3, + }, + { + "defName": "PhoneChat", + "room": "Corridor", + "minutes": 6, + "need": "Social", + "needGain": 0.25, + "roles": ["student"], + "weight": 2, + }, { "defName": "WalkCorridor", "room": "Corridor", diff --git a/src/HSchool.Server/mods/core/defs/behavior/rules.jsonc b/src/HSchool.Server/mods/core/defs/behavior/rules.jsonc index 079b9f3..f87b1e6 100644 --- a/src/HSchool.Server/mods/core/defs/behavior/rules.jsonc +++ b/src/HSchool.Server/mods/core/defs/behavior/rules.jsonc @@ -62,4 +62,15 @@ { "min": -40, "id": "OpinionDislike" }, { "min": -100, "id": "OpinionEnemy" }, ], + // Talk circles (slice 9 phase 42). Communication per hour is well below lessonSkillPerHour. + "talkSkillPerHour": 0.02, + "talkLanguageSkillPerHour": 0.005, + "talkLanguageThreshold": 25, + "talkNoLanguageOpinionMultiplier": 0.15, + "talkPhoneOpinionMultiplier": 0.5, + "talkCommunicationOpinionScale": 0.5, + "talkCircleMin": 2, + "talkCircleMax": 4, + "talkFriendThreshold": 40, + "talkEnemyThreshold": -40, } diff --git a/src/HSchool.Server/mods/core/defs/topics/vanilla.jsonc b/src/HSchool.Server/mods/core/defs/topics/vanilla.jsonc new file mode 100644 index 0000000..bcefc76 --- /dev/null +++ b/src/HSchool.Server/mods/core/defs/topics/vanilla.jsonc @@ -0,0 +1,52 @@ +[ + { + "defName": "TopicStudy", + "tags": ["study"], + "roles": ["student", "staff"], + "opinionShift": 2, + }, + { + "defName": "TopicGames", + "tags": ["games"], + "roles": ["student"], + "age": { "min": 7, "max": 18 }, + "opinionShift": 3, + }, + { + "defName": "TopicFood", + "tags": ["food"], + "roles": ["student", "staff"], + "opinionShift": 2, + }, + { + "defName": "TopicFamily", + "tags": ["family"], + "roles": ["student", "staff"], + "opinionShift": 2, + }, + { + "defName": "TopicSport", + "tags": ["sport"], + "roles": ["student", "staff"], + "opinionShift": 3, + }, + { + "defName": "TopicGossip", + "tags": ["gossip"], + "roles": ["student", "staff"], + "opinionShift": 1, + }, + { + "defName": "TopicRude", + "tags": ["rude"], + "roles": ["student", "staff"], + "opinionShift": -3, + }, + { + "defName": "TopicAppearance", + "tags": ["appearance"], + "roles": ["student"], + "age": { "min": 11, "max": 18 }, + "opinionShift": 1, + }, +] diff --git a/src/HSchool.Server/mods/core/defs/traits/traits.jsonc b/src/HSchool.Server/mods/core/defs/traits/traits.jsonc index 36b1a9a..0354cbf 100644 --- a/src/HSchool.Server/mods/core/defs/traits/traits.jsonc +++ b/src/HSchool.Server/mods/core/defs/traits/traits.jsonc @@ -34,12 +34,14 @@ "weight": 7, "incompatible": ["Leader", "Bully"], "wageAsk": -8, + "talkInitiative": 0.45, }, { "defName": "Leader", "weight": 4, "incompatible": ["Quiet"], "wageAsk": 10, + "talkInitiative": 1.6, "skillModifiers": [ { "skill": "History", "offset": 4 }, ], @@ -92,4 +94,18 @@ "incompatible": ["HeatLoving"], "comfortTemperatureOffset": -4, }, + { + "defName": "Gossip", + "weight": 5, + "roles": ["student", "staff"], + "talkOpinionMultiplier": 1.5, + "talkTagWeights": [{ "tag": "gossip", "weight": 3 }], + }, + { + "defName": "Outgoing", + "weight": 6, + "incompatible": ["Quiet"], + "talkInitiative": 1.4, + "talkCircleBonus": 1, + }, ] diff --git a/src/HSchool.Server/mods/core/localizations/en.jsonc b/src/HSchool.Server/mods/core/localizations/en.jsonc index c587ff1..c577513 100644 --- a/src/HSchool.Server/mods/core/localizations/en.jsonc +++ b/src/HSchool.Server/mods/core/localizations/en.jsonc @@ -4,6 +4,8 @@ "UseToilet": "Restroom", "RecessRest": "Recess", "Chat": "Chat", + "StaffChat": "Staff chat", + "PhoneChat": "Phone chat", "WalkCorridor": "Walk the corridor", "WalkYard": "Walk the yard", "Behavior": "Behavior rules", @@ -139,6 +141,8 @@ "Curious": "Curious", "HotTempered": "Hot-tempered", "Kind": "Kind", + "Gossip": "Gossip", + "Outgoing": "Outgoing", "Neat": "Neat", "Staffing": "Staffing", "Height": "Height", @@ -189,6 +193,15 @@ "OpinionEnemy": "enemies", "ActionStarted": "started: {0}", "ActionEnded": "finished: {0}", + "TalkEnded": "talked about {0}", + "TopicStudy": "schoolwork", + "TopicGames": "games", + "TopicFood": "food", + "TopicFamily": "family", + "TopicSport": "sport", + "TopicGossip": "gossip", + "TopicRude": "rough talk", + "TopicAppearance": "looks", "ApparelReplaced": "got a new {0}", "ApparelChanged": "changed clothes: {0}", "core": "Core", diff --git a/src/HSchool.Server/mods/core/localizations/ru.jsonc b/src/HSchool.Server/mods/core/localizations/ru.jsonc index affb2e6..405f718 100644 --- a/src/HSchool.Server/mods/core/localizations/ru.jsonc +++ b/src/HSchool.Server/mods/core/localizations/ru.jsonc @@ -4,6 +4,8 @@ "UseToilet": "Туалет", "RecessRest": "Перемена", "Chat": "Разговор", + "StaffChat": "Разговор в учительской", + "PhoneChat": "Разговор по телефону", "WalkCorridor": "Прогулка по коридору", "WalkYard": "Прогулка во дворе", "Behavior": "Правила поведения", @@ -139,6 +141,8 @@ "Curious": "Любопытный", "HotTempered": "Вспыльчивый", "Kind": "Добрый", + "Gossip": "Сплетник", + "Outgoing": "Общительный", "Neat": "Аккуратный", "Staffing": "Штат", "Height": "Рост", @@ -189,6 +193,15 @@ "OpinionEnemy": "враги", "ActionStarted": "начал: {0}", "ActionEnded": "закончил: {0}", + "TalkEnded": "говорил о {0}", + "TopicStudy": "учёбе", + "TopicGames": "играх", + "TopicFood": "еде", + "TopicFamily": "семье", + "TopicSport": "спорте", + "TopicGossip": "сплетнях", + "TopicRude": "грубом", + "TopicAppearance": "внешности", "ApparelReplaced": "получил новую {0}", "ApparelChanged": "переоделся: {0}", "core": "Базовая игра", diff --git a/src/HSchool.Simulation/ActivitySystem.cs b/src/HSchool.Simulation/ActivitySystem.cs index 44eb863..9d57972 100644 --- a/src/HSchool.Simulation/ActivitySystem.cs +++ b/src/HSchool.Simulation/ActivitySystem.cs @@ -21,6 +21,11 @@ internal static class ActivitySystem return false; } + if (TalkActions.IsTalk(actionId)) + { + return TalkCircleSystem.TryStart(school, personId, actionId); + } + if (!school.Catalog.Actions.TryGetValue(actionId, out var action) || action.Abstract) { return false; @@ -114,6 +119,11 @@ internal static class ActivitySystem return; } + if (TalkActions.IsTalk(activity.ActionId)) + { + return; + } + var location = school.Map?.NodeDef(presence.NodeId ?? ""); if (location is null || !location.Equals(action.Room, StringComparison.Ordinal)) { diff --git a/src/HSchool.Simulation/PersonLog.cs b/src/HSchool.Simulation/PersonLog.cs index 24534b1..4f4a71d 100644 --- a/src/HSchool.Simulation/PersonLog.cs +++ b/src/HSchool.Simulation/PersonLog.cs @@ -12,6 +12,7 @@ public static class PersonLogTypes { public const string ActionStarted = "action-started"; public const string ActionEnded = "action-ended"; + public const string TalkEnded = "talk-ended"; public const string ApparelReplaced = "apparel-replaced"; public const string ApparelChanged = "apparel-changed"; } @@ -58,6 +59,14 @@ public sealed record PersonLogEvent(string PersonId, DateTime Time, string Type, return string.Format(CultureInfo.InvariantCulture, catalog.Text(locale, key), name); } + if (Type.Equals(PersonLogTypes.TalkEnded, StringComparison.Ordinal)) + { + var topic = catalog.Topics.TryGetValue(ThingDef ?? "", out var def) + ? catalog.Label(locale, def) + : ThingDef ?? Type; + return string.Format(CultureInfo.InvariantCulture, catalog.Text(locale, "TalkEnded"), topic); + } + return Type; } } diff --git a/src/HSchool.Simulation/PresenceSystem.cs b/src/HSchool.Simulation/PresenceSystem.cs index 94bd274..626b2af 100644 --- a/src/HSchool.Simulation/PresenceSystem.cs +++ b/src/HSchool.Simulation/PresenceSystem.cs @@ -324,6 +324,23 @@ internal static class PresenceSystem { var now = school.Clock.Time; var walks = school.Walks!; + var slot = SchoolDay.At(school.Catalog!, now, school.SchoolWeekDays); + var weekday = SchoolDay.WeekdayIndex(now); + var lessons = Duty.LessonsToday(person, ClassOf(school, person), school.Timetable, weekday); + var bound = Duty.IsOtherStaff(person) + ? slot.Kind != DaySlotKind.Outside + : slot.Kind == DaySlotKind.Lesson && lessons.Any(lesson => lesson.Period == slot.Index); + if (activity.IsActive && TalkActions.IsTalk(activity.ActionId)) + { + if (!bound) + { + return null; + } + + TalkCircleSystem.Interrupt(school, person.Id); + activity = PersonActivity.Idle; + } + if (!presence.IsOnCampus) { intent = Intent.None; @@ -369,16 +386,11 @@ internal static class PresenceSystem return null; } - var slot = SchoolDay.At(school.Catalog!, now, school.SchoolWeekDays); - var weekday = SchoolDay.WeekdayIndex(now); - var lessons = Duty.LessonsToday(person, ClassOf(school, person), school.Timetable, weekday); - var bound = Duty.IsOtherStaff(person) - ? slot.Kind != DaySlotKind.Outside - : slot.Kind == DaySlotKind.Lesson && lessons.Any(lesson => lesson.Period == slot.Index); var frame = school.Catalog!.DayFrame; var lunchOpen = frame is not null && SchoolDay.IsLunchWindow(frame, slot, ClassOf(school, person)?.Year); var apparel = ApparelPresence.Build(school, person, ClassOf(school, person)); + var talk = BuildTalkContext(school, person, bound, lunchOpen, slot); var state = new ActorState( presence.NodeId, presence.DestinationId, @@ -392,7 +404,8 @@ internal static class PresenceSystem needs.Values, intent, lunchOpen, - apparel); + apparel, + talk); var decision = DecisionPlanner.Decide( school.Catalog!, school.Map!, @@ -401,17 +414,19 @@ internal static class PresenceSystem (node, thing) => occupied.GetValueOrDefault((node, thing))); var changing = activity.IsActive && ActivitySystem.IsChangeClothes(activity.ActionId); + var inTalk = activity.IsActive && TalkActions.IsTalk(activity.ActionId); if (decision.WalkTo is not null && !decision.WalkTo.Equals(presence.NodeId, StringComparison.Ordinal) && activity.IsActive - && !changing) + && !changing + && !inTalk) { activity = PersonActivity.Idle; } intent = decision.Intent; - if (decision.WalkTo is not null && !changing) + if (decision.WalkTo is not null && !changing && !inTalk) { presence = PresenceStepper.StartWalk(presence, walks, decision.WalkTo, headingHome: false); } @@ -523,6 +538,40 @@ internal static class PresenceSystem return new Intent(kind, row.GoalId, row.GoalWeight, row.GoalAction); } + private static TalkPlannerContext BuildTalkContext( + School school, + Person person, + bool boundToLesson, + bool lunchOpen, + DaySlot slot) + { + var opinions = person.Opinions as IReadOnlyDictionary ?? new Dictionary(StringComparer.Ordinal); + var nodes = SnapshotPersonNodes(school); + var friendPull = !boundToLesson && (slot.Kind == DaySlotKind.Break || lunchOpen); + return new TalkPlannerContext( + person.Id, + opinions, + nodes, + person.ClassId, + TalkCircles.HasPhone(person.Items), + friendPull, + school.Catalog?.BehaviorRules); + } + + private static Dictionary SnapshotPersonNodes(School school) + { + var nodes = new Dictionary(StringComparer.Ordinal); + var world = school.World; + world.Query(in People, (ref PersonIdentity identity, ref Presence presence) => + { + if (presence.IsOnCampus && presence.NodeId is not null) + { + nodes[identity.Id] = presence.NodeId; + } + }); + return nodes; + } + private static SchoolClass? ClassOf(School school, Person person) { if (person.ClassId is null) diff --git a/src/HSchool.Simulation/School.cs b/src/HSchool.Simulation/School.cs index bfcd068..fa0ea42 100644 --- a/src/HSchool.Simulation/School.cs +++ b/src/HSchool.Simulation/School.cs @@ -131,6 +131,10 @@ public sealed class School : IDisposable internal Dictionary LoggedActivity { get; } = new(StringComparer.Ordinal); + internal Dictionary TalkCirclesById { get; } = new(StringComparer.Ordinal); + + internal Dictionary TalkCircleByPerson { get; } = new(StringComparer.Ordinal); + internal void ResetDayLog() { _dayLog.Clear(); @@ -339,6 +343,11 @@ public sealed class School : IDisposable PresenceSystem.Enqueue(this, id); } + foreach (var id in TalkCircleSystem.Apply(this, gameMinutes)) + { + PresenceSystem.Enqueue(this, id); + } + PersonDayLog.Sync(this); if (Catalog is not null) diff --git a/src/HSchool.Simulation/TalkCircleSystem.cs b/src/HSchool.Simulation/TalkCircleSystem.cs new file mode 100644 index 0000000..734ada8 --- /dev/null +++ b/src/HSchool.Simulation/TalkCircleSystem.cs @@ -0,0 +1,487 @@ +using Arch.Core; +using HSchool.Ai; +using HSchool.Content; +using HSchool.People; + +namespace HSchool.Simulation; + +internal sealed class ActiveTalkCircle +{ + public required string Id { get; init; } + + public required string ActionId { get; init; } + + public required string TopicId { get; init; } + + public required string NodeId { get; init; } + + public required List Members { get; init; } + + public float RemainingMinutes { get; set; } +} + +/// Forms 2–4 person talk circles, applies outcomes, writes topic log lines. +internal static class TalkCircleSystem +{ + private static readonly QueryDescription People = + new QueryDescription().WithAll(); + + public static bool IsInCircle(School school, string personId) => + school.TalkCircleByPerson.ContainsKey(personId); + + /// Ends an active circle when duty overrides break talk (bell rang). + public static void Interrupt(School school, string personId) + { + if (!school.TalkCircleByPerson.TryGetValue(personId, out var circleId) + || !school.TalkCirclesById.TryGetValue(circleId, out var circle)) + { + return; + } + + Finish(school, circle); + } + + public static bool TryStart(School school, string personId, string actionId) + { + if (school.Catalog is null || school.Map is null || school.Roster is null) + { + return false; + } + + if (!TalkActions.IsTalk(actionId) || !school.Catalog.Actions.TryGetValue(actionId, out var action) || action.Abstract) + { + return false; + } + + if (school.TalkCircleByPerson.ContainsKey(personId)) + { + return true; + } + + var person = school.Roster.People.FirstOrDefault(row => row.Id.Equals(personId, StringComparison.Ordinal)); + if (person is null) + { + return false; + } + + string? nodeId = null; + var busy = false; + school.World.Query(in People, (ref PersonIdentity identity, ref Presence presence, ref PersonActivity activity) => + { + if (!identity.Id.Equals(personId, StringComparison.Ordinal)) + { + return; + } + + nodeId = presence.NodeId; + busy = activity.IsActive; + }); + + if (nodeId is null || busy) + { + return false; + } + + var location = school.Map.NodeDef(nodeId); + if (location is null || !location.Equals(action.Room, StringComparison.Ordinal)) + { + return false; + } + + if (action.DefName.Equals(TalkActions.PhoneChat, StringComparison.Ordinal)) + { + return TryStartPhone(school, person, nodeId, action); + } + + var existing = FindOpenCircle(school, nodeId, actionId); + if (existing is not null) + { + return JoinCircle(school, existing, personId, action); + } + + return TryStartGroup(school, person, nodeId, action); + } + + public static IReadOnlyList Apply(School school, double gameMinutes) + { + if (gameMinutes <= 0 || school.Catalog is null || school.Roster is null) + { + return []; + } + + var minutes = (float)gameMinutes; + var completed = new List(); + foreach (var circle in school.TalkCirclesById.Values.ToArray()) + { + circle.RemainingMinutes -= minutes; + SyncActivity(school, circle); + if (circle.RemainingMinutes > 0) + { + continue; + } + + Finish(school, circle); + completed.AddRange(circle.Members); + } + + completed.Sort(StringComparer.Ordinal); + return completed; + } + + private static bool TryStartPhone(School school, Person initiator, string nodeId, ActionDef action) + { + if (!TalkCircles.HasPhone(initiator.Items)) + { + return false; + } + + var candidates = GatherCandidates(school, initiator.Id, nodeId, requirePhone: true); + var ranked = TalkCircles.RankInvitees(initiator, candidates, school.Catalog!.BehaviorRules); + if (ranked.Count == 0) + { + return false; + } + + var partnerId = ranked[0]; + var partner = school.Roster!.People.First(row => row.Id.Equals(partnerId, StringComparison.Ordinal)); + if (!TalkCircles.HasPhone(partner.Items)) + { + return false; + } + + var topicId = TalkCircles.PickTopic( + school.Catalog!, + initiator, + initiator.AgeOn(school.Clock.Time), + Seed.Mix(school.PeopleSeed, initiator.Id, DateOnly.FromDateTime(school.Clock.Time).DayNumber, Seed.ApparelSalt + 20)) + ?? school.Catalog!.Topics.Values.First(topic => !topic.Abstract).DefName; + + var circle = new ActiveTalkCircle + { + Id = $"phone-{initiator.Id}-{partnerId}", + ActionId = action.DefName, + TopicId = topicId, + NodeId = nodeId, + Members = [initiator.Id, partnerId], + RemainingMinutes = action.Minutes, + }; + Register(school, circle, action); + return true; + } + + private static bool TryStartGroup(School school, Person initiator, string nodeId, ActionDef action) + { + var rules = school.Catalog!.BehaviorRules; + var max = TalkCircles.MaxSize(action.DefName, rules, initiator.Traits, school.Catalog); + var candidates = GatherCandidates(school, initiator.Id, nodeId, requirePhone: false); + var ranked = TalkCircles.RankInvitees(initiator, candidates, rules); + var members = new List { initiator.Id }; + foreach (var id in ranked) + { + if (members.Count >= max) + { + break; + } + + members.Add(id); + } + + var min = rules?.TalkCircleMin ?? 2; + if (members.Count < min) + { + return false; + } + + var topicId = TalkCircles.PickTopic( + school.Catalog, + initiator, + initiator.AgeOn(school.Clock.Time), + Seed.Mix(school.PeopleSeed, initiator.Id, DateOnly.FromDateTime(school.Clock.Time).DayNumber, Seed.ApparelSalt + 21)) + ?? school.Catalog.Topics.Values.First(topic => !topic.Abstract).DefName; + + var circle = new ActiveTalkCircle + { + Id = $"talk-{initiator.Id}-{nodeId}-{school.Clock.Time.Ticks}", + ActionId = action.DefName, + TopicId = topicId, + NodeId = nodeId, + Members = members, + RemainingMinutes = action.Minutes, + }; + Register(school, circle, action); + return true; + } + + private static bool JoinCircle(School school, ActiveTalkCircle circle, string personId, ActionDef action) + { + var rules = school.Catalog!.BehaviorRules; + var person = school.Roster!.People.First(row => row.Id.Equals(personId, StringComparison.Ordinal)); + var max = TalkCircles.MaxSize(action.DefName, rules, person.Traits, school.Catalog); + if (circle.Members.Count >= max || circle.Members.Contains(personId)) + { + return false; + } + + circle.Members.Add(personId); + circle.Members.Sort(StringComparer.Ordinal); + school.TalkCircleByPerson[personId] = circle.Id; + SetActivity(school, personId, action.DefName, circle.TopicId, circle.RemainingMinutes); + return true; + } + + private static ActiveTalkCircle? FindOpenCircle(School school, string nodeId, string actionId) + { + foreach (var circle in school.TalkCirclesById.Values) + { + if (circle.NodeId.Equals(nodeId, StringComparison.Ordinal) + && circle.ActionId.Equals(actionId, StringComparison.Ordinal) + && circle.RemainingMinutes > 0) + { + var rules = school.Catalog!.BehaviorRules; + var max = rules?.TalkCircleMax ?? 4; + if (circle.Members.Count < max) + { + return circle; + } + } + } + + return null; + } + + private static IReadOnlyList GatherCandidates( + School school, + string exceptId, + string nodeId, + bool requirePhone) + { + var roster = school.Roster!.People.ToDictionary(person => person.Id, StringComparer.Ordinal); + var list = new List(); + school.World.Query( + in People, + (ref PersonIdentity identity, ref PersonRoles roles, ref Presence presence, ref PersonActivity activity) => + { + if (identity.Id.Equals(exceptId, StringComparison.Ordinal) + || presence.NodeId is null + || !presence.NodeId.Equals(nodeId, StringComparison.Ordinal)) + { + return; + } + + if (!roster.TryGetValue(identity.Id, out var person)) + { + return; + } + + if (requirePhone && !TalkCircles.HasPhone(person.Items)) + { + return; + } + + list.Add(new TalkCircles.Candidate( + identity.Id, + roles.ClassId, + !activity.IsActive && !school.TalkCircleByPerson.ContainsKey(identity.Id), + school.TalkCircleByPerson.ContainsKey(identity.Id), + TalkCircles.HasPhone(person.Items))); + }); + + return list.Where(candidate => candidate.IsIdle).ToArray(); + } + + private static void Register(School school, ActiveTalkCircle circle, ActionDef action) + { + school.TalkCirclesById[circle.Id] = circle; + foreach (var member in circle.Members) + { + school.TalkCircleByPerson[member] = circle.Id; + SetActivity(school, member, action.DefName, circle.TopicId, circle.RemainingMinutes); + } + } + + private static void SetActivity(School school, string personId, string actionId, string topicId, float remaining) + { + school.World.Query( + in People, + (ref PersonIdentity identity, ref PersonActivity activity) => + { + if (identity.Id.Equals(personId, StringComparison.Ordinal)) + { + activity = new PersonActivity(actionId, topicId, remaining); + } + }); + } + + private static void SyncActivity(School school, ActiveTalkCircle circle) + { + foreach (var member in circle.Members) + { + SetActivity(school, member, circle.ActionId, circle.TopicId, Math.Max(0f, circle.RemainingMinutes)); + } + } + + private static void Finish(School school, ActiveTalkCircle circle) + { + var catalog = school.Catalog!; + var rules = catalog.BehaviorRules; + var roster = school.Roster!; + var people = circle.Members + .Select(id => roster.People.First(person => person.Id.Equals(id, StringComparison.Ordinal))) + .ToArray(); + if (!catalog.Topics.TryGetValue(circle.TopicId, out var topic)) + { + topic = catalog.Topics.Values.First(def => !def.Abstract); + } + + if (!catalog.Actions.TryGetValue(circle.ActionId, out var action)) + { + action = catalog.Actions[TalkActions.Chat]; + } + + var hours = action.Minutes / 60f; + var sharedLanguage = TalkCircles.SharedLanguage(catalog, people, rules) is not null; + var language = TalkCircles.SharedLanguage(catalog, people, rules); + + foreach (var person in people) + { + if (!string.IsNullOrWhiteSpace(action.Need) + && catalog.Needs.TryGetValue(action.Need, out var need)) + { + var current = NeedOf(school, person.Id, action.Need); + if (float.IsNaN(current)) + { + current = need.Min; + } + + var next = ActionStepper.ApplyNeedGain(current, action, need); + MutateNeed(school, person.Id, action.Need, next); + } + + if (catalog.Skills.TryGetValue("Communication", out var communicationSkill)) + { + var level = SkillOf(school, person.Id, "Communication"); + var next = TalkCircles.CommunicationGain(level, communicationSkill, hours, rules); + MutateSkill(school, person.Id, "Communication", next); + } + + if (language is not null + && catalog.Skills.TryGetValue(language, out var languageSkill) + && SkillOf(school, person.Id, language) < languageSkill.Range.Max) + { + var level = SkillOf(school, person.Id, language); + var next = TalkCircles.LanguageGain(level, languageSkill, hours, rules); + MutateSkill(school, person.Id, language, next); + } + + foreach (var other in people) + { + if (other.Id.Equals(person.Id, StringComparison.Ordinal)) + { + continue; + } + + var communication = SkillOf(school, person.Id, "Communication"); + var appearance = AppearanceOf(school, other); + var delta = TalkCircles.OpinionDelta( + person, + other, + topic, + communication, + sharedLanguage, + circle.ActionId, + appearance, + rules, + catalog); + if (delta == 0) + { + continue; + } + + var current = OpinionStore.Get(person, other.Id) ?? 0; + OpinionStore.Set(person, other.Id, current + delta); + } + + school.AppendDayLog(new PersonLogEvent( + person.Id, + school.Clock.Time, + PersonLogTypes.TalkEnded, + circle.TopicId)); + } + + foreach (var member in circle.Members) + { + school.TalkCircleByPerson.Remove(member); + ClearActivity(school, member); + } + + school.TalkCirclesById.Remove(circle.Id); + } + + private static ApparelIssue AppearanceOf(School school, Person person) + { + var schoolClass = person.ClassId is { } classId + ? school.Roster!.Classes.FirstOrDefault(row => row.Id.Equals(classId, StringComparison.Ordinal)) + : null; + var mode = ApparelPresence.ModeAt(school, person, schoolClass); + return ApparelDresser.CurrentIssues(school, person, mode); + } + + private static float NeedOf(School school, string personId, string need) + { + var value = float.NaN; + school.World.Query(in People, (ref PersonIdentity identity, ref PersonNeeds needs) => + { + if (identity.Id.Equals(personId, StringComparison.Ordinal)) + { + value = needs.Values.GetValueOrDefault(need, float.NaN); + } + }); + return value; + } + + private static float SkillOf(School school, string personId, string skill) + { + var value = 0f; + school.World.Query(in People, (ref PersonIdentity identity, ref PersonSkills skills) => + { + if (identity.Id.Equals(personId, StringComparison.Ordinal)) + { + value = skills.Values.GetValueOrDefault(skill); + } + }); + return value; + } + + private static void MutateSkill(School school, string personId, string skill, float value) + { + school.World.Query(in People, (ref PersonIdentity identity, ref PersonSkills skills) => + { + if (identity.Id.Equals(personId, StringComparison.Ordinal)) + { + skills.Values[skill] = value; + } + }); + } + + private static void MutateNeed(School school, string personId, string need, float value) + { + school.World.Query(in People, (ref PersonIdentity identity, ref PersonNeeds needs) => + { + if (identity.Id.Equals(personId, StringComparison.Ordinal)) + { + needs.Values[need] = value; + } + }); + } + + private static void ClearActivity(School school, string personId) + { + school.World.Query(in People, (ref PersonIdentity identity, ref PersonActivity activity) => + { + if (identity.Id.Equals(personId, StringComparison.Ordinal)) + { + activity = PersonActivity.Idle; + } + }); + } +} diff --git a/tests/HSchool.Ai.Tests/TalkCirclesTests.cs b/tests/HSchool.Ai.Tests/TalkCirclesTests.cs new file mode 100644 index 0000000..ea88aef --- /dev/null +++ b/tests/HSchool.Ai.Tests/TalkCirclesTests.cs @@ -0,0 +1,200 @@ +using HSchool.Ai; +using HSchool.Ai.Tests; +using HSchool.Content; +using HSchool.People; + +namespace HSchool.Ai.Tests; + +public class TalkCirclesTests +{ + [Fact] + public void BoundToLesson_BlocksChatLeisure() + { + var (catalog, map, walks) = World(); + var corridor = map.Rooms.First(room => room.Def == "Corridor").Id; + var decision = DecisionPlanner.Decide( + catalog, + map, + walks, + new ActorState( + corridor, + corridor, + false, + false, + true, + false, + false, + true, + corridor, + Needs(), + Intent.None, + Talk: new TalkPlannerContext("p1", new Dictionary(), new Dictionary(), null, false, true, catalog.BehaviorRules)), + (_, _) => 0); + + Assert.NotEqual(TalkActions.Chat, decision.StartAction); + Assert.NotEqual(TalkActions.StaffChat, decision.StartAction); + } + + [Fact] + public void Student_DoesNotPickStaffChat() + { + var (catalog, map, walks) = World(); + var teachersRoom = map.Rooms.First(room => room.Def == "TeachersRoom").Id; + var decision = DecisionPlanner.Decide( + catalog, + map, + walks, + new ActorState( + teachersRoom, + teachersRoom, + false, + false, + true, + false, + false, + false, + teachersRoom, + Needs(social: 0.2f), + Intent.None, + Talk: new TalkPlannerContext("p1", new Dictionary(), new Dictionary(), null, false, true, catalog.BehaviorRules)), + (_, _) => 0); + + Assert.NotEqual(TalkActions.StaffChat, decision.StartAction); + } + + [Fact] + public void PhoneChat_NotOfferedWithoutPhone() + { + var (catalog, map, walks) = World(); + var corridor = map.Rooms.First(room => room.Def == "Corridor").Id; + var decision = DecisionPlanner.Decide( + catalog, + map, + walks, + Actor(corridor, hasPhone: false), + (_, _) => 0); + + Assert.NotEqual(TalkActions.PhoneChat, decision.StartAction); + } + + [Fact] + public void HasPhone_DetectsBagPhone() + { + Assert.False(TalkCircles.HasPhone([])); + Assert.True(TalkCircles.HasPhone([new InventoryItem("Phone", "Black", 1f, ItemLocations.Bag)])); + } + + [Fact] + public void NoSharedLanguage_WeakensOpinionShift() + { + var (catalog, _, _) = World(); + var rules = catalog.BehaviorRules!; + var topic = catalog.Topics["TopicStudy"]; + var from = Person("a", ["RussianLanguage"]); + var to = Person("b", ["English"]); + var withLanguage = TalkCircles.OpinionDelta(from, to, topic, 50f, sharedLanguage: true, TalkActions.Chat, ApparelIssue.None, rules, catalog); + var without = TalkCircles.OpinionDelta(from, to, topic, 50f, sharedLanguage: false, TalkActions.Chat, ApparelIssue.None, rules, catalog); + + Assert.True(withLanguage > without); + Assert.True(without <= 1); + } + + [Fact] + public void HighCommunication_MovesOpinionMoreThanLow_OnSameTopic() + { + var (catalog, _, _) = World(); + var rules = catalog.BehaviorRules!; + var topic = catalog.Topics["TopicSport"]; + var from = Person("a", ["RussianLanguage"]); + var to = Person("b", ["RussianLanguage"]); + var high = TalkCircles.OpinionDelta(from, to, topic, 80f, true, TalkActions.Chat, ApparelIssue.None, rules, catalog); + var low = TalkCircles.OpinionDelta(from, to, topic, 20f, true, TalkActions.Chat, ApparelIssue.None, rules, catalog); + + Assert.True(high > low); + } + + [Fact] + public void Enemies_AreNotRankedAsInvitees() + { + var (catalog, _, _) = World(); + var opinions = new Dictionary(StringComparer.Ordinal) + { + ["b"] = 50, + ["c"] = -50, + }; + var initiator = Person("a", []) with { Opinions = opinions }; + var ranked = TalkCircles.RankInvitees( + initiator, + [ + new TalkCircles.Candidate("b", "c1", true, false, false), + new TalkCircles.Candidate("c", "c1", true, false, false), + ], + catalog.BehaviorRules); + + Assert.Equal(["b"], ranked); + } + + private static ActorState Actor(string node, bool hasPhone) + { + var (catalog, _, _) = World(); + return new ActorState( + node, + node, + false, + false, + true, + false, + false, + false, + node, + Needs(social: 0.2f), + Intent.None, + Talk: new TalkPlannerContext("p1", new Dictionary(), new Dictionary(), null, hasPhone, true, catalog.BehaviorRules)); + } + + private static Dictionary Needs(float social = 1f) => new(StringComparer.Ordinal) + { + ["Social"] = social, + ["Hunger"] = 1f, + ["Sleep"] = 1f, + ["Toilet"] = 1f, + }; + + private static (DefCatalog Catalog, MapLayout Map, WalkGraph Walks) World() + { + var (catalog, map) = Fixtures.Vanilla(); + return (catalog, map, WalkGraph.Build(catalog, map)); + } + + private static Person Person(string id, string[] languages) + { + var skills = languages.ToDictionary(skill => skill, _ => 60, StringComparer.Ordinal); + skills["Communication"] = 50; + var cases = new CaseTable + { + Nom = "A", + Gen = "A", + Dat = "A", + Acc = "A", + Ins = "A", + Pre = "A", + }; + return new Person + { + Id = id, + FamilyId = "f1", + Female = false, + BirthDate = new DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Utc), + Name = new PersonName("A", "B", "C", cases, cases, cases), + IsStudent = true, + IsStaff = false, + IsParent = false, + Numbers = new Dictionary(StringComparer.Ordinal), + Choices = new Dictionary(StringComparer.Ordinal), + Skills = skills, + Traits = [], + Needs = new Dictionary(StringComparer.Ordinal), + Opinions = new Dictionary(StringComparer.Ordinal), + }; + } +} diff --git a/tests/HSchool.Content.Tests/PeopleDefTests.cs b/tests/HSchool.Content.Tests/PeopleDefTests.cs index ad76fe2..a7567ce 100644 --- a/tests/HSchool.Content.Tests/PeopleDefTests.cs +++ b/tests/HSchool.Content.Tests/PeopleDefTests.cs @@ -11,7 +11,8 @@ public class PeopleDefTests var catalog = _loader.Load([CatalogLoader.CorePackId], PackDocuments.FromDirectory(CatalogLoader.CorePackId, root)); Assert.True(catalog.Skills.Count >= 10); - Assert.Equal(12, catalog.Traits.Count); + Assert.Equal(14, catalog.Traits.Count); + Assert.True(catalog.Topics.Count >= 8); Assert.Equal(5, catalog.Needs.Count); Assert.True(catalog.BodyAttributes.ContainsKey("Height")); Assert.Equal(BodyAttributeKind.Number, catalog.BodyAttributes["Height"].Kind); diff --git a/tests/HSchool.Content.Tests/TopicDefTests.cs b/tests/HSchool.Content.Tests/TopicDefTests.cs new file mode 100644 index 0000000..27745c2 --- /dev/null +++ b/tests/HSchool.Content.Tests/TopicDefTests.cs @@ -0,0 +1,32 @@ +using HSchool.Content; +using HSchool.Content.Tests; + +namespace HSchool.Content.Tests; + +public class TopicDefTests +{ + private readonly CatalogLoader _loader = new(); + + [Fact] + public void VanillaCore_LoadsTalkTopics() + { + var root = Path.Combine(AppContext.BaseDirectory, "vanilla"); + var catalog = _loader.Load([CatalogLoader.CorePackId], PackDocuments.FromDirectory(CatalogLoader.CorePackId, root)); + + Assert.True(catalog.Topics.Count >= 8); + Assert.True(catalog.Topics.ContainsKey("TopicStudy")); + Assert.Contains("study", catalog.Topics["TopicStudy"].Tags); + } + + [Fact] + public void CatalogWithoutTopics_ThrowsOnLoad() + { + var root = Path.Combine(AppContext.BaseDirectory, "vanilla"); + var documents = PackDocuments.FromDirectory(CatalogLoader.CorePackId, root) + .Where(document => !document.RelativePath.Contains("defs/topics/", StringComparison.OrdinalIgnoreCase)) + .ToList(); + + var ex = Assert.Throws(() => _loader.Load([CatalogLoader.CorePackId], documents)); + Assert.Contains("TopicDef", ex.Message, StringComparison.Ordinal); + } +} diff --git a/tests/HSchool.People.Tests/golden/roster.txt b/tests/HSchool.People.Tests/golden/roster.txt index ed54516..ea87923 100644 --- a/tests/HSchool.People.Tests/golden/roster.txt +++ b/tests/HSchool.People.Tests/golden/roster.txt @@ -3,133 +3,133 @@ class class-classroom-00 year=1 letter=А room=classroom-00 capacity=16 pupils=f class class-classroom-01 year=2 letter=А room=classroom-01 capacity=16 pupils=f0.c1,f12.c0,f12.c1,f12.c2,f13.c1,f13.c2,f14.c2,f20.c0,f23.c1,f26.c0,f27.c0,f29.c0,f31.c0,f4.c0,f7.c0,f9.c0 class class-classroom-02 year=3 letter=А room=classroom-02 capacity=16 pupils=f10.c0,f14.c0,f16.c0,f17.c1,f2.c0,f21.c0,f22.c1,f23.c0,f25.c0,f28.c0,f3.c0,f3.c1,f32.c0,f32.c2,f5.c0,f6.c1 class class-classroom-03 year=4 letter=А room=classroom-03 capacity=16 pupils=f0.c0,f1.c0,f11.c0,f14.c1,f15.c0,f17.c0,f17.c2,f20.c1,f22.c0,f24.c0,f28.c1,f30.c0,f30.c1,f8.c1,f9.c1,f9.c2 -person f0.c0 Андреев Сергей Валериевич female=False roles=student class=class-classroom-03 born=2000-10-23 traits=Kind skills=Agility=33,Biology=57,Communication=47,Endurance=46,Hauling=56,Literature=22,Mathematics=18,PhysicalEducation=73,RussianLanguage=47,Strength=64,UkrainianLanguage=31 items=Underwear:Black:worn,Socks:Gray:worn,Jeans:Black:worn,TShirt:Black:worn,Shoes:Gray:worn,Sweater:Gray:worn,Scarf:Black:worn,Coat:Black:home,PeShirt:Gray:home,PeShorts:Gray:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f0.c1 Андреев Александр Валериевич female=False roles=student class=class-classroom-01 born=2002-11-09 traits=HotTempered,Leader skills=Agility=13,Biology=46,Communication=20,Endurance=52,Hauling=24,Literature=35,Mathematics=49,PhysicalEducation=57,RussianLanguage=47,Strength=45 items=Underwear:Black:worn,Socks:Gray:worn,Jeans:Blue:worn,TShirt:LightBlue:worn,Shoes:Gray:worn,Sweater:Black:worn,Coat:Beige:worn,Scarf:Gray:worn,PeShirt:Gray:home,PeShorts:Black:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f0.p0 Андреев Валерий Николаевич female=False roles=parent class=- born=1971-06-03 traits=Diligent,Quiet skills=Agility=43,Communication=58,Cooking=82,Endurance=61,Hauling=61,Pedagogy=50,RussianLanguage=89,Strength=33 items=Underwear:Black:worn,Socks:White:worn,Jeans:Black:worn,TShirt:LightBlue:worn,WinterBoots:Beige:worn,Jacket:Gray:worn,Bottle:Green:bag -person f0.p1 Андреева Марина Артемовна female=True roles=parent class=- born=1971-09-30 traits=Quiet skills=Agility=25,BelarusianLanguage=26,Communication=38,Endurance=35,Hauling=46,History=61,Mathematics=75,RussianLanguage=65,Strength=40,UkrainianLanguage=23 items=Underwear:Gray:worn,Socks:White:worn,Pants:Beige:worn,Shirt:Blue:worn,WinterBoots:Gray:worn,Sweater:Beige:worn,Jacket:Blue:home,Bottle:White:bag,Phone:Black:bag -person f1.c0 Александрова Людмила Борисовна female=True roles=student class=class-classroom-03 born=2001-01-26 traits=AbsentMinded skills=Agility=72,BelarusianLanguage=36,Biology=67,Communication=37,Endurance=39,Hauling=56,Literature=77,Mathematics=29,PhysicalEducation=54,RussianLanguage=51,Strength=45,UkrainianLanguage=28 items=Underwear:Black:worn,Socks:White:worn,Dress:Black:worn,Shoes:White:worn,Belt:Beige:worn,Jacket:Black:home,PeShirt:Blue:home,PeShorts:Blue:home,Bottle:Blue:bag,Phone:Black:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f1.c1 Александров Евгений Борисович female=False roles=student class=class-classroom-00 born=2004-04-01 traits= skills=Agility=31,BelarusianLanguage=27,Biology=50,Communication=38,Endurance=54,Hauling=58,Literature=65,Mathematics=30,PhysicalEducation=88,RussianLanguage=44,Strength=40 items=Underwear:White:worn,Socks:Black:worn,Jeans:Black:worn,TShirt:Blue:worn,WinterBoots:Black:worn,Hat:Black:worn,Coat:Gray:home,PeShirt:Blue:home,PeShorts:Blue:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f1.c2 Александров Юрий Борисович female=False roles=student class=class-classroom-00 born=2003-10-28 traits= skills=Agility=45,Biology=68,Communication=31,Endurance=30,Hauling=49,Literature=60,Mathematics=29,PhysicalEducation=49,RussianLanguage=53,Strength=74,UkrainianLanguage=23 items=Underwear:Black:worn,Socks:Gray:worn,Pants:Blue:worn,TShirt:LightBlue:worn,Shoes:Black:worn,Sweater:Blue:worn,Scarf:Black:worn,Coat:Beige:home,PeShirt:Red:home,PeShorts:Gray:home,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f1.p0 Александров Борис Ильич female=False roles=parent class=- born=1968-10-25 traits= skills=Agility=45,Communication=74,Endurance=34,Hauling=65,RussianLanguage=53,Strength=53,UkrainianLanguage=14 items=Underwear:Black:worn,Socks:White:worn,Trousers:Gray:worn,TShirt:Blue:worn,WinterBoots:Gray:worn,Hat:Beige:worn,Scarf:Gray:worn,FurCoat:Beige:home -person f1.p1 Александрова Елизавета Романовна female=True roles=parent class=- born=1972-01-25 traits= skills=Administration=71,Agility=45,BelarusianLanguage=26,Communication=76,Cooking=59,Endurance=35,English=58,Hauling=48,Mathematics=30,RussianLanguage=42,Strength=66 items=Underwear:Black:worn,Socks:Black:worn,Skirt:Beige:worn,Shirt:Blue:worn,WinterBoots:Beige:worn,Sweater:Beige:worn,Coat:Beige:home,Bottle:White:bag,Phone:White:bag -person f10.c0 Захаров Пётр Виталиевич female=False roles=student class=class-classroom-02 born=2001-11-08 traits=Diligent skills=Agility=31,BelarusianLanguage=26,Biology=62,Communication=54,Endurance=45,Hauling=56,Literature=25,Mathematics=81,PhysicalEducation=63,RussianLanguage=46,Strength=60 items=Underwear:Black:worn,Socks:Black:worn,Pants:Gray:worn,TShirt:Black:worn,WinterBoots:Beige:worn,Jacket:Gray:home,PeShirt:Red:home,PeShorts:Red:home,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f10.p0 Захаров Виталий Борисович female=False roles=parent class=- born=1976-09-07 traits=HeatLoving,Neat skills=Agility=44,BelarusianLanguage=22,Communication=66,Endurance=82,English=16,Hauling=40,RussianLanguage=69,Strength=55 items=Underwear:Gray:worn,Socks:Black:worn,Trousers:Black:worn,TShirt:White:worn,WinterBoots:Black:worn,FurCoat:Gray:worn,Hat:Blue:worn,Scarf:Blue:worn,Bottle:White:bag,Phone:Black:bag -person f10.p1 Захарова Любовь Валериевна female=True roles=parent class=- born=1978-11-03 traits=AbsentMinded,HotTempered skills=Administration=43,Agility=45,BelarusianLanguage=21,Communication=61,Endurance=53,English=52,Hauling=52,Medicine=23,PhysicalEducation=42,Physics=59,RussianLanguage=66,Strength=28 items=Underwear:Gray:worn,Socks:Gray:worn,Trousers:Blue:worn,Shirt:White:worn,Shoes:Gray:worn,Sweater:Blue:worn,FurCoat:Gray:home,Bottle:White:bag,Phone:Gray:bag -person f11.c0 Андреева Дарья Ивановна female=True roles=student class=class-classroom-03 born=2001-05-20 traits=Lazy skills=Agility=47,BelarusianLanguage=13,Biology=57,Communication=43,Endurance=44,Hauling=50,Literature=59,Mathematics=18,PhysicalEducation=53,RussianLanguage=47,Strength=45,UkrainianLanguage=24 items=Underwear:Gray:worn,Socks:White:worn,Dress:Beige:worn,Shoes:White:worn,Hat:Blue:worn,Coat:Gray:home,PeShirt:Black:home,PeShorts:Black:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f11.p0 Андреев Иван Алексеевич female=False roles=parent class=- born=1976-06-01 traits= skills=Agility=38,BelarusianLanguage=16,Communication=52,Endurance=82,Hauling=33,Medicine=48,Pedagogy=61,PhysicalEducation=54,RussianLanguage=82,Strength=67,UkrainianLanguage=22 items=Underwear:White:worn,Socks:White:worn,Jeans:Black:worn,Shirt:Gray:worn,WinterBoots:Gray:worn,Sweater:Beige:worn,FurCoat:Beige:worn,Phone:Gray:bag -person f11.p1 Андреева София Александровна female=True roles=parent class=- born=1978-04-24 traits=Curious,Diligent skills=Agility=61,Communication=74,Endurance=55,English=61,Hauling=31,History=29,RussianLanguage=54,Strength=43 items=Underwear:Gray:worn,Socks:Black:worn,Trousers:Blue:worn,Shirt:Black:worn,WinterBoots:Black:worn,Coat:Gray:worn,Bottle:White:bag -person f12.c0 Кузьмин Олег Владиславович female=False roles=student class=class-classroom-01 born=2003-03-20 traits=ColdLoving,Lazy skills=Agility=49,Biology=58,Communication=48,Endurance=57,Hauling=54,Literature=54,Mathematics=33,PhysicalEducation=39,RussianLanguage=9,Strength=36,UkrainianLanguage=31 items=Underwear:White:worn,Socks:Gray:worn,Pants:Blue:worn,TShirt:LightBlue:worn,WinterBoots:Black:worn,Hat:Black:worn,Belt:Black:worn,FurCoat:Gray:home,PeShirt:Red:home,PeShorts:Red:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f12.c1 Кузьмин Егор Владиславович female=False roles=student class=class-classroom-01 born=2003-05-31 traits=Lazy,Leader skills=Agility=45,Biology=45,Communication=30,Endurance=59,Hauling=44,Literature=39,Mathematics=30,PhysicalEducation=59,RussianLanguage=49,Strength=35,UkrainianLanguage=23 items=Underwear:Gray:worn,Socks:Gray:worn,Pants:Black:worn,TShirt:Beige:worn,Shoes:Black:worn,Sweater:Black:worn,Coat:Black:worn,Belt:Beige:worn,PeShirt:Black:home,PeShorts:Black:home,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f12.c2 Кузьмина Дарья Владиславовна female=True roles=student class=class-classroom-01 born=2002-10-29 traits=Curious,Leader skills=Agility=42,BelarusianLanguage=20,Biology=56,Communication=39,Endurance=58,Hauling=59,Literature=35,Mathematics=22,PhysicalEducation=81,RussianLanguage=58,Strength=34,UkrainianLanguage=28 items=Underwear:Black:worn,Socks:Gray:worn,Skirt:Blue:worn,Shirt:Black:worn,Shoes:Black:worn,Sweater:Beige:worn,Coat:Beige:worn,PeShirt:Green:home,PeShorts:Black:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f12.p0 Кузьмин Владислав Александрович female=False roles=parent class=- born=1975-01-17 traits= skills=Administration=56,Agility=25,BelarusianLanguage=10,Communication=68,Endurance=35,English=36,Hauling=63,Informatics=56,Medicine=59,RussianLanguage=54,Strength=36 items=Underwear:Gray:worn,Socks:Gray:worn,Jeans:Blue:worn,Shirt:Blue:worn,Shoes:Gray:worn,Jacket:Blue:worn,Bottle:Blue:bag -person f12.p1 Кузьмина Ольга Кирилловна female=True roles=parent class=- born=1979-10-15 traits=AbsentMinded,HotTempered skills=Administration=38,Agility=39,BelarusianLanguage=25,Chemistry=48,Communication=32,Endurance=41,English=42,Geography=41,Hauling=46,RussianLanguage=32,Strength=34,UkrainianLanguage=40 items=Underwear:Gray:worn,Socks:Gray:worn,Pants:Gray:worn,Shirt:Gray:worn,WinterBoots:Gray:worn,Sweater:Gray:worn,FurCoat:Gray:home -person f13.c0 Яковлев Константин Владиславович female=False roles=student class=class-classroom-00 born=2004-06-16 traits= skills=Agility=53,BelarusianLanguage=24,Biology=48,Communication=29,Endurance=37,Hauling=64,Literature=58,Mathematics=22,PhysicalEducation=44,RussianLanguage=31,Strength=37 items=Underwear:Gray:worn,Socks:Black:worn,Trousers:Gray:worn,Shirt:Blue:worn,WinterBoots:Gray:worn,Jacket:Blue:home,PeShirt:Gray:home,PeShorts:Red:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f13.c1 Яковлев Юрий Владиславович female=False roles=student class=class-classroom-01 born=2003-07-23 traits=Diligent,Quiet skills=Agility=36,BelarusianLanguage=22,Biology=56,Communication=43,Endurance=44,Hauling=57,Literature=56,Mathematics=26,PhysicalEducation=51,RussianLanguage=37,Strength=68,UkrainianLanguage=8 items=Underwear:Black:worn,Socks:Gray:worn,Pants:Blue:worn,Shirt:Black:worn,WinterBoots:Gray:worn,Sweater:Gray:worn,FurCoat:Black:worn,PeShirt:Gray:home,PeShorts:Blue:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f13.c2 Яковлева Алина Владиславовна female=True roles=student class=class-classroom-01 born=2003-02-01 traits=Diligent skills=Agility=58,BelarusianLanguage=20,Biology=60,Communication=45,Endurance=54,Hauling=53,Literature=66,Mathematics=34,PhysicalEducation=47,RussianLanguage=59,Strength=45 items=Underwear:White:worn,Socks:White:worn,Trousers:Black:worn,Shirt:Blue:worn,Shoes:Gray:worn,Hat:Gray:worn,Scarf:Blue:worn,Coat:Beige:home,PeShirt:Red:home,PeShorts:Red:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f13.p0 Яковлев Владислав Андреевич female=False roles=parent class=- born=1974-09-23 traits=AbsentMinded,HotTempered skills=Agility=25,BelarusianLanguage=28,Communication=42,Endurance=35,English=26,Hauling=52,RussianLanguage=54,Strength=38 items=Underwear:Black:worn,Socks:White:worn,Trousers:Black:worn,TShirt:White:worn,Shoes:Beige:worn,Hat:Beige:worn,Coat:Beige:home,Bottle:Green:bag,Phone:White:bag -person f14.c0 Александров Степан Денисович female=False roles=student class=class-classroom-02 born=2002-01-03 traits= skills=Agility=57,BelarusianLanguage=17,Biology=53,Communication=18,Endurance=60,Hauling=64,Literature=34,Mathematics=33,PhysicalEducation=55,RussianLanguage=32,Strength=41 items=Underwear:Gray:worn,Socks:Gray:worn,Pants:Blue:worn,TShirt:Gray:worn,Shoes:Black:worn,Sweater:Beige:worn,Jacket:Gray:worn,Hat:Blue:worn,Scarf:Blue:worn,PeShirt:Gray:home,PeShorts:Red:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f14.c1 Александрова Вероника Денисовна female=True roles=student class=class-classroom-03 born=2001-08-11 traits= skills=Agility=45,BelarusianLanguage=15,Biology=52,Communication=38,Endurance=37,Hauling=44,Literature=29,Mathematics=18,PhysicalEducation=65,RussianLanguage=46,Strength=64 items=Underwear:Black:worn,Socks:Gray:worn,Trousers:Gray:worn,TShirt:Black:worn,WinterBoots:Gray:worn,Belt:Gray:worn,FurCoat:Beige:home,PeShirt:Red:home,PeShorts:Gray:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f14.c2 Александров Константин Денисович female=False roles=student class=class-classroom-01 born=2003-08-21 traits= skills=Agility=29,BelarusianLanguage=21,Biology=66,Communication=21,Endurance=51,Hauling=42,Literature=64,Mathematics=27,PhysicalEducation=67,RussianLanguage=20,Strength=45 items=Underwear:White:worn,Socks:Gray:worn,Jeans:Gray:worn,TShirt:Gray:worn,Shoes:Gray:worn,Scarf:Blue:worn,Coat:Black:home,PeShirt:Blue:home,PeShorts:Red:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f14.p1 Александрова Виктория Викторовна female=True roles=parent class=- born=1973-07-23 traits= skills=Agility=45,Communication=72,Cooking=68,Endurance=64,Geography=58,Hauling=44,Physics=38,RussianLanguage=61,Strength=49,UkrainianLanguage=18 items=Underwear:Gray:worn,Socks:Gray:worn,Dress:Gray:worn,WinterBoots:Beige:worn,Hat:Black:worn,Coat:Black:home,Phone:Black:bag -person f15.c0 Воробьёв Игорь Сергеевич female=False roles=student class=class-classroom-03 born=2000-09-20 traits= skills=Agility=45,BelarusianLanguage=24,Biology=33,Communication=61,Endurance=58,Hauling=42,Literature=45,Mathematics=32,PhysicalEducation=40,RussianLanguage=55,Strength=38 items=Underwear:Black:worn,Socks:White:worn,Trousers:Blue:worn,TShirt:Black:worn,Shoes:Beige:worn,Sweater:Black:worn,Hat:Gray:worn,FurCoat:Black:home,PeShirt:Green:home,PeShorts:Blue:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f15.p0 Воробьёв Сергей Никитич female=False roles=parent class=- born=1974-10-22 traits=Neat,Quiet skills=Agility=45,Communication=54,Endurance=45,Hauling=36,Librarianship=67,Pedagogy=38,RussianLanguage=71,Strength=65,UkrainianLanguage=32 items=Underwear:White:worn,Socks:Black:worn,Pants:Blue:worn,TShirt:Gray:worn,Shoes:Black:worn,Sweater:Black:worn,FurCoat:Beige:home,Bottle:Blue:bag -person f15.p1 Воробьёва Вера Виталиевна female=True roles=parent class=- born=1972-09-07 traits=Lazy,Neat skills=Agility=42,BelarusianLanguage=40,Communication=30,Endurance=52,Hauling=46,Pedagogy=55,RussianLanguage=46,Strength=45,UkrainianLanguage=25 items=Underwear:Black:worn,Socks:Gray:worn,Pants:Black:worn,TShirt:Black:worn,WinterBoots:Black:worn,Coat:Gray:worn,Hat:Gray:worn,Scarf:Black:worn,Bottle:Blue:bag,Phone:White:bag -person f16.c0 Фролова Елизавета Игоревна female=True roles=student class=class-classroom-02 born=2002-06-29 traits=Quiet skills=Agility=29,BelarusianLanguage=17,Biology=43,Communication=32,Endurance=19,Hauling=36,Literature=51,Mathematics=51,PhysicalEducation=68,RussianLanguage=24,Strength=45 items=Underwear:Gray:worn,Socks:Black:worn,Jeans:Blue:worn,Shirt:Blue:worn,WinterBoots:Beige:worn,Sweater:Beige:worn,FurCoat:Black:home,PeShirt:Red:home,PeShorts:Gray:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f16.p0 Фролов Игорь Виталиевич female=False roles=parent class=- born=1968-07-25 traits= skills=Administration=51,Agility=57,BelarusianLanguage=25,Communication=58,Endurance=63,Hauling=49,Medicine=53,RussianLanguage=53,Strength=46 items=Underwear:White:worn,Socks:White:worn,Pants:Gray:worn,Shirt:Gray:worn,Shoes:Gray:worn,Hat:Blue:worn,Jacket:Beige:home -person f16.p1 Фролова Татьяна Олеговна female=True roles=parent class=- born=1970-06-17 traits=Leader,Neat skills=Agility=45,BelarusianLanguage=23,Communication=59,Endurance=59,Hauling=62,Literature=51,RussianLanguage=72,Strength=44 items=Underwear:White:worn,Socks:Black:worn,Skirt:Blue:worn,Shirt:Blue:worn,Shoes:Beige:worn,Sweater:Blue:worn,Coat:Beige:home,Bottle:Blue:bag,Phone:Black:bag -person f17.c0 Иванов Андрей Александрович female=False roles=student class=class-classroom-03 born=2001-06-27 traits=Lazy skills=Agility=60,Biology=53,Communication=54,Endurance=35,Hauling=41,Literature=65,Mathematics=32,PhysicalEducation=47,RussianLanguage=35,Strength=45,UkrainianLanguage=13 items=Underwear:White:worn,Socks:Gray:worn,Jeans:Gray:worn,Shirt:White:worn,WinterBoots:Gray:worn,Coat:Black:home,PeShirt:Green:home,PeShorts:Blue:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f17.c1 Иванова Ксения Александровна female=True roles=student class=class-classroom-02 born=2001-09-10 traits=ColdLoving skills=Agility=45,Biology=64,Communication=28,Endurance=64,Hauling=48,Literature=51,Mathematics=37,PhysicalEducation=28,RussianLanguage=43,Strength=45 items=Underwear:White:worn,Socks:Black:worn,Pants:Black:worn,Shirt:Gray:worn,WinterBoots:Gray:worn,FurCoat:Beige:worn,Hat:Black:worn,PeShirt:Blue:home,PeShorts:Green:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f17.c2 Иванова Полина Александровна female=True roles=student class=class-classroom-03 born=2001-05-21 traits=Diligent,HotTempered skills=Agility=36,Biology=43,Communication=45,Endurance=45,Hauling=47,Literature=43,Mathematics=41,PhysicalEducation=58,RussianLanguage=42,Strength=45,UkrainianLanguage=15 items=Underwear:Gray:worn,Socks:Black:worn,Pants:Black:worn,TShirt:Beige:worn,WinterBoots:Gray:worn,Sweater:Gray:worn,Coat:Beige:worn,Belt:Beige:worn,PeShirt:Red:home,PeShorts:Gray:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f17.p0 Иванов Александр Владимирович female=False roles=parent class=- born=1967-12-24 traits=Diligent,HeatLoving skills=Agility=47,Communication=74,Endurance=52,Hauling=55,Physics=39,RussianLanguage=27,Strength=49 items=Underwear:Black:worn,Socks:Gray:worn,Jeans:Blue:worn,TShirt:Blue:worn,WinterBoots:Black:worn,Belt:Beige:worn,FurCoat:Black:home -person f17.p1 Иванова Александра Ивановна female=True roles=parent class=- born=1967-04-25 traits= skills=Agility=40,Communication=69,Endurance=63,Hauling=35,RussianLanguage=56,Strength=68,UkrainianLanguage=19 items=Underwear:White:worn,Socks:White:worn,Pants:Beige:worn,Shirt:Blue:worn,Shoes:Beige:worn,FurCoat:Gray:home,Phone:White:bag -person f18.c0 Лебедев Александр Валериевич female=False roles=student class=class-classroom-00 born=2004-02-16 traits=ColdLoving skills=Agility=26,Biology=50,Communication=9,Endurance=53,Hauling=33,Literature=55,Mathematics=20,PhysicalEducation=56,RussianLanguage=23,Strength=35 items=Underwear:Black:worn,Socks:Black:worn,Pants:Black:worn,Shirt:White:worn,WinterBoots:Beige:worn,Sweater:Beige:worn,Jacket:Blue:worn,Belt:Gray:worn,PeShirt:Blue:home,PeShorts:Green:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f18.p0 Лебедев Валерий Романович female=False roles=parent class=- born=1985-03-29 traits=Leader,Neat skills=Agility=25,Chemistry=56,Communication=59,Endurance=35,English=49,Geography=50,Hauling=35,Pedagogy=51,RussianLanguage=67,Strength=62 items=Underwear:Gray:worn,Socks:Black:worn,Pants:Black:worn,Shirt:Gray:worn,Shoes:Beige:worn,FurCoat:Gray:worn,Belt:Beige:worn,Bottle:Green:bag -person f18.p1 Лебедева Юлия Михаиловна female=True roles=parent class=- born=1981-01-26 traits= skills=Administration=54,Agility=59,BelarusianLanguage=36,Biology=68,Communication=52,Endurance=44,Hauling=67,Mathematics=47,Medicine=37,RussianLanguage=48,Strength=45,UkrainianLanguage=22 items=Underwear:Gray:worn,Socks:White:worn,Dress:Black:worn,Shoes:Gray:worn,Sweater:Gray:worn,Hat:Black:worn,Belt:Black:worn,Jacket:Gray:home,Phone:Black:bag -person f19.c0 Воробьёв Григорий Михаилович female=False roles=student class=class-classroom-00 born=2004-08-29 traits=Quiet skills=Agility=62,BelarusianLanguage=31,Biology=42,Communication=36,Endurance=50,Hauling=39,Literature=34,Mathematics=37,PhysicalEducation=50,RussianLanguage=33,Strength=45,UkrainianLanguage=23 items=Underwear:Black:worn,Socks:White:worn,Pants:Blue:worn,Shirt:Blue:worn,Shoes:Gray:worn,Sweater:Black:worn,Coat:Gray:worn,PeShirt:Blue:home,PeShorts:Black:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f19.p0 Воробьёв Михаил Егорович female=False roles=parent class=- born=1978-11-03 traits=Lazy skills=Administration=53,Agility=40,Communication=56,Endurance=46,Hauling=41,Librarianship=66,Mathematics=36,RussianLanguage=45,Strength=55 items=Underwear:Black:worn,Socks:Black:worn,Pants:Black:worn,Shirt:Black:worn,Shoes:Beige:worn,Hat:Black:worn,Jacket:Green:home,Bottle:Blue:bag -person f19.p1 Воробьёва Вера Алексеевна female=True roles=parent class=- born=1982-08-29 traits=AbsentMinded,Kind skills=Administration=50,Agility=58,BelarusianLanguage=20,Communication=46,Endurance=30,Hauling=50,PhysicalEducation=74,RussianLanguage=49,Strength=40,UkrainianLanguage=25 items=Underwear:Gray:worn,Socks:Gray:worn,Dress:Black:worn,WinterBoots:Black:worn,Jacket:Red:home -person f2.c0 Алексеев Григорий Константинович female=False roles=student class=class-classroom-02 born=2002-07-24 traits=Neat skills=Agility=40,BelarusianLanguage=36,Biology=64,Communication=34,Endurance=57,Hauling=38,Literature=58,Mathematics=41,PhysicalEducation=47,RussianLanguage=28,Strength=45,UkrainianLanguage=23 items=Underwear:White:worn,Socks:Gray:worn,Jeans:Blue:worn,TShirt:Black:worn,Shoes:Black:worn,FurCoat:Gray:home,PeShirt:Red:home,PeShorts:Red:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f2.p0 Алексеев Константин Романович female=False roles=parent class=- born=1974-12-11 traits=Neat skills=Agility=36,BelarusianLanguage=23,Communication=60,Endurance=49,English=34,Hauling=47,Mathematics=63,Medicine=81,Pedagogy=74,RussianLanguage=56,Strength=59,UkrainianLanguage=22 items=Underwear:Gray:worn,Socks:White:worn,Pants:Beige:worn,Shirt:Black:worn,WinterBoots:Beige:worn,Sweater:Black:worn,Hat:Black:worn,FurCoat:Gray:home -person f2.p1 Алексеева Ольга Романовна female=True roles=parent class=- born=1970-07-22 traits=Neat skills=Agility=50,Communication=58,Cooking=51,Endurance=43,English=55,Hauling=54,Literature=35,Medicine=76,PhysicalEducation=32,RussianLanguage=38,Strength=42 items=Underwear:Black:worn,Socks:White:worn,Skirt:Gray:worn,TShirt:Blue:worn,Shoes:Beige:worn,Sweater:Gray:worn,Coat:Beige:home,Bottle:White:bag -person f20.c0 Павлова Елена Игоревна female=True roles=student class=class-classroom-01 born=2002-11-09 traits= skills=Agility=55,Biology=47,Communication=19,Endurance=51,Hauling=38,Literature=41,Mathematics=34,PhysicalEducation=49,RussianLanguage=44,Strength=42,UkrainianLanguage=20 items=Underwear:White:worn,Socks:Gray:worn,Pants:Black:worn,TShirt:Blue:worn,WinterBoots:Beige:worn,Hat:Beige:worn,Belt:Gray:worn,Coat:Gray:home,PeShirt:Red:home,PeShorts:Gray:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f20.c1 Павлова Валентина Игоревна female=True roles=student class=class-classroom-03 born=2001-01-24 traits=HotTempered skills=Agility=68,BelarusianLanguage=12,Biology=41,Communication=31,Endurance=58,Hauling=46,Literature=42,Mathematics=19,PhysicalEducation=50,RussianLanguage=45,Strength=42,UkrainianLanguage=9 items=Underwear:White:worn,Socks:Black:worn,Trousers:Gray:worn,TShirt:Blue:worn,Shoes:Black:worn,Sweater:Blue:worn,FurCoat:Beige:home,PeShirt:Green:home,PeShorts:Blue:home,Bottle:Green:bag,Phone:Black:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f20.p0 Павлов Игорь Никитич female=False roles=parent class=- born=1968-08-01 traits=HeatLoving,Leader skills=Administration=61,Agility=72,Communication=57,Endurance=43,Geography=61,German=73,Hauling=44,Pedagogy=56,RussianLanguage=66,Strength=42,UkrainianLanguage=28 items=Underwear:Black:worn,Socks:White:worn,Trousers:Black:worn,TShirt:Blue:worn,WinterBoots:Gray:worn,FurCoat:Black:home,Bottle:White:bag -person f20.p1 Павлова Людмила Дмитриевна female=True roles=parent class=- born=1970-01-17 traits=ColdLoving,Quiet skills=Agility=46,BelarusianLanguage=26,Communication=71,Endurance=39,English=31,Hauling=36,Physics=42,RussianLanguage=53,Strength=56 items=Underwear:White:worn,Socks:Gray:worn,Dress:Beige:worn,WinterBoots:Beige:worn,Hat:Black:worn,Belt:Beige:worn,Coat:Gray:home,Bottle:White:bag -person f21.c0 Ильин Андрей Константинович female=False roles=student class=class-classroom-02 born=2002-05-12 traits= skills=Agility=54,BelarusianLanguage=15,Biology=72,Communication=22,Endurance=54,Hauling=58,Literature=58,Mathematics=45,PhysicalEducation=52,RussianLanguage=38,Strength=45,UkrainianLanguage=25 items=Underwear:Black:worn,Socks:Black:worn,Jeans:Black:worn,TShirt:White:worn,WinterBoots:Black:worn,Sweater:Black:worn,Jacket:Black:worn,PeShirt:Gray:home,PeShorts:Blue:home,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f21.p0 Ильин Константин Никитич female=False roles=parent class=- born=1971-01-21 traits=Diligent,Quiet skills=Agility=45,Biology=50,Communication=53,Endurance=40,English=46,Hauling=45,History=42,Librarianship=57,RussianLanguage=68,Strength=40,UkrainianLanguage=9 items=Underwear:Gray:worn,Socks:Black:worn,Trousers:Black:worn,Shirt:Black:worn,Shoes:White:worn,Scarf:Black:worn,FurCoat:Beige:home,Bottle:Blue:bag -person f21.p1 Ильина Яна Борисовна female=True roles=parent class=- born=1975-04-20 traits=Kind skills=Agility=74,BelarusianLanguage=26,Biology=41,Communication=54,Endurance=55,English=77,Hauling=35,Librarianship=44,Medicine=57,RussianLanguage=35,Strength=50,UkrainianLanguage=23 items=Underwear:Black:worn,Socks:White:worn,Jeans:Gray:worn,Shirt:Gray:worn,WinterBoots:Gray:worn,Coat:Gray:worn,Bottle:Blue:bag -person f22.c0 Захаров Никита Виталиевич female=False roles=student class=class-classroom-03 born=2000-09-14 traits= skills=Agility=62,BelarusianLanguage=19,Biology=50,Communication=42,Endurance=39,Hauling=47,Literature=68,Mathematics=65,PhysicalEducation=60,RussianLanguage=59,Strength=45,UkrainianLanguage=31 items=Underwear:Gray:worn,Socks:White:worn,Jeans:Gray:worn,TShirt:Beige:worn,Shoes:Beige:worn,FurCoat:Gray:home,PeShirt:Black:home,PeShorts:Blue:home,Bottle:White:bag,Phone:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f22.c1 Захаров Денис Виталиевич female=False roles=student class=class-classroom-02 born=2001-09-11 traits=Kind,Leader skills=Agility=51,Biology=42,Communication=55,Endurance=51,Hauling=69,Literature=53,Mathematics=60,PhysicalEducation=80,RussianLanguage=50,Strength=53,UkrainianLanguage=16 items=Underwear:White:worn,Socks:White:worn,Trousers:Blue:worn,TShirt:Blue:worn,Shoes:White:worn,Hat:Blue:worn,Coat:Beige:home,PeShirt:Red:home,PeShorts:Red:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f22.p0 Захаров Виталий Андреевич female=False roles=parent class=- born=1966-04-08 traits= skills=Agility=29,Communication=62,Endurance=82,Hauling=33,RussianLanguage=65,Strength=58,UkrainianLanguage=18 items=Underwear:Black:worn,Socks:Black:worn,Pants:Beige:worn,TShirt:LightBlue:worn,Shoes:Black:worn,Coat:Black:worn,Hat:Gray:worn,Bottle:White:bag,Phone:Black:bag -person f22.p1 Захарова Елизавета Егоровна female=True roles=parent class=- born=1967-09-05 traits= skills=Administration=37,Agility=42,BelarusianLanguage=28,Communication=82,Cooking=65,Endurance=60,English=52,Hauling=37,Mathematics=67,RussianLanguage=54,Strength=51 items=Underwear:Gray:worn,Socks:White:worn,Dress:Gray:worn,WinterBoots:Gray:worn,FurCoat:Gray:home,Bottle:Green:bag -person f23.c0 Орловская Нина Константиновна female=True roles=student class=class-classroom-02 born=2001-11-01 traits=AbsentMinded,Quiet skills=Agility=44,BelarusianLanguage=13,Biology=42,Communication=9,Endurance=51,Hauling=45,Literature=53,Mathematics=34,PhysicalEducation=70,RussianLanguage=46,Strength=38 items=Underwear:White:worn,Socks:White:worn,Trousers:Blue:worn,TShirt:Blue:worn,Shoes:Beige:worn,Sweater:Blue:worn,Coat:Beige:worn,Hat:Gray:worn,PeShirt:Blue:home,PeShorts:Red:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f23.c1 Орловская Полина Константиновна female=True roles=student class=class-classroom-01 born=2003-03-30 traits=ColdLoving,Quiet skills=Agility=39,BelarusianLanguage=20,Biology=70,Communication=19,Endurance=53,Hauling=54,Literature=73,Mathematics=46,PhysicalEducation=55,RussianLanguage=47,Strength=67 items=Underwear:White:worn,Socks:Black:worn,Dress:Blue:worn,Shoes:Black:worn,Sweater:Beige:worn,Jacket:Red:home,PeShirt:Black:home,PeShorts:Gray:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f23.p0 Орловский Константин Михаилович female=False roles=parent class=- born=1965-04-02 traits=Curious,Diligent skills=Agility=45,BelarusianLanguage=23,Communication=55,Endurance=50,Hauling=50,History=40,Librarianship=56,Physics=67,RussianLanguage=52,Strength=32,UkrainianLanguage=17 items=Underwear:Gray:worn,Socks:White:worn,Jeans:Gray:worn,Shirt:Blue:worn,WinterBoots:Beige:worn,FurCoat:Black:worn,Hat:Beige:worn -person f23.p1 Орловская Яна Степановна female=True roles=parent class=- born=1965-10-22 traits=Lazy skills=Agility=56,BelarusianLanguage=28,Communication=44,Endurance=40,Hauling=81,Pedagogy=45,RussianLanguage=62,Strength=56,UkrainianLanguage=26 items=Underwear:Gray:worn,Socks:Gray:worn,Pants:Gray:worn,TShirt:Blue:worn,Shoes:White:worn,Hat:Blue:worn,Coat:Black:home -person f24.c0 Орлов Фёдор Алексеевич female=False roles=student class=class-classroom-03 born=2000-12-05 traits=Leader skills=Agility=40,BelarusianLanguage=8,Biology=54,Communication=6,Endurance=40,Hauling=45,Literature=41,Mathematics=10,PhysicalEducation=46,RussianLanguage=52,Strength=63 items=Underwear:Black:worn,Socks:Black:worn,Jeans:Gray:worn,Shirt:Black:worn,Shoes:Gray:worn,Sweater:Black:worn,Jacket:Blue:worn,PeShirt:Blue:home,PeShorts:Blue:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f24.c1 Орлова Оксана Алексеевна female=True roles=student class=class-classroom-00 born=2004-03-01 traits=HeatLoving,HotTempered skills=Agility=75,Biology=30,Communication=23,Endurance=54,Hauling=35,Literature=62,Mathematics=49,PhysicalEducation=58,RussianLanguage=26,Strength=41,UkrainianLanguage=31 items=Underwear:Black:worn,Socks:White:worn,Pants:Beige:worn,TShirt:White:worn,WinterBoots:Black:worn,Scarf:Beige:worn,Jacket:Red:home,PeShirt:Black:home,PeShorts:Red:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f24.p0 Орлов Алексей Денисович female=False roles=parent class=- born=1977-04-17 traits= skills=Agility=45,BelarusianLanguage=17,Communication=51,Endurance=18,English=61,Hauling=46,Literature=56,Mathematics=60,RussianLanguage=55,Strength=62,UkrainianLanguage=16 items=Underwear:Black:worn,Socks:Black:worn,Trousers:Gray:worn,Shirt:Gray:worn,WinterBoots:Black:worn,Sweater:Black:worn,Hat:Gray:worn,Jacket:Black:home -person f24.p1 Орлова Надежда Владиславовна female=True roles=parent class=- born=1977-12-04 traits=Kind skills=Agility=25,BelarusianLanguage=25,Communication=52,Endurance=22,English=70,Hauling=52,Librarianship=51,Medicine=10,RussianLanguage=50,Strength=52,UkrainianLanguage=19 items=Underwear:Black:worn,Socks:Gray:worn,Trousers:Blue:worn,TShirt:LightBlue:worn,WinterBoots:Gray:worn,Sweater:Black:worn,FurCoat:Black:worn,Belt:Black:worn,Bottle:Blue:bag,Phone:Black:bag -person f25.c0 Петрова Александра Игоревна female=True roles=student class=class-classroom-02 born=2001-12-19 traits= skills=Agility=57,BelarusianLanguage=29,Biology=64,Communication=32,Endurance=40,Hauling=58,Literature=47,Mathematics=40,PhysicalEducation=79,RussianLanguage=64,Strength=65,UkrainianLanguage=7 items=Underwear:White:worn,Socks:White:worn,Trousers:Black:worn,TShirt:Blue:worn,WinterBoots:Black:worn,Sweater:Gray:worn,Coat:Beige:worn,Hat:Beige:worn,Scarf:Beige:worn,PeShirt:Red:home,PeShorts:Blue:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f25.p1 Петрова Полина Юриевна female=True roles=parent class=- born=1965-12-11 traits=Kind,Neat skills=Agility=53,Communication=50,Endurance=59,English=70,Geography=41,Hauling=56,Medicine=42,RussianLanguage=72,Strength=45 items=Underwear:Gray:worn,Socks:White:worn,Pants:Beige:worn,TShirt:LightBlue:worn,WinterBoots:Beige:worn,Coat:Beige:worn,Hat:Black:worn,Bottle:White:bag -person f26.c0 Яковлев Павел Михаилович female=False roles=student class=class-classroom-01 born=2002-12-29 traits=Kind,Neat skills=Agility=45,BelarusianLanguage=30,Biology=59,Communication=8,Endurance=59,Hauling=53,Literature=60,Mathematics=47,PhysicalEducation=43,RussianLanguage=43,Strength=45,UkrainianLanguage=23 items=Underwear:White:worn,Socks:White:worn,Pants:Beige:worn,TShirt:LightBlue:worn,Shoes:Black:worn,Sweater:Blue:worn,Coat:Beige:worn,PeShirt:Gray:home,PeShorts:Red:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f26.c1 Яковлев Вадим Михаилович female=False roles=student class=class-classroom-00 born=2004-06-28 traits= skills=Agility=40,BelarusianLanguage=24,Biology=36,Communication=14,Endurance=66,Hauling=41,Literature=71,Mathematics=26,PhysicalEducation=55,RussianLanguage=25,Strength=40,UkrainianLanguage=18 items=Underwear:Black:worn,Socks:Black:worn,Jeans:Blue:worn,TShirt:Black:worn,Shoes:Black:worn,FurCoat:Black:home,PeShirt:Blue:home,PeShorts:Red:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f26.p0 Яковлев Михаил Степанович female=False roles=parent class=- born=1975-12-27 traits=HeatLoving,Neat skills=Agility=44,Communication=59,Endurance=66,Hauling=52,Mathematics=44,Medicine=71,PhysicalEducation=53,RussianLanguage=55,Strength=45,UkrainianLanguage=28 items=Underwear:Black:worn,Socks:Black:worn,Jeans:Blue:worn,TShirt:Black:worn,Shoes:Gray:worn,Scarf:Blue:worn,Jacket:Blue:home,Phone:Gray:bag -person f26.p1 Яковлева Марина Кирилловна female=True roles=parent class=- born=1976-12-10 traits=Diligent,Neat skills=Agility=36,BelarusianLanguage=22,Communication=53,Endurance=66,English=40,Hauling=47,History=43,Medicine=66,PhysicalEducation=45,RussianLanguage=65,Strength=43 items=Underwear:White:worn,Socks:White:worn,Jeans:Black:worn,TShirt:Gray:worn,WinterBoots:Black:worn,FurCoat:Gray:worn,Bottle:Blue:bag,Phone:Gray:bag -person f27.c0 Иванов Виктор Константинович female=False roles=student class=class-classroom-01 born=2002-12-27 traits=Bully skills=Agility=29,BelarusianLanguage=19,Biology=56,Communication=26,Endurance=46,Hauling=65,Literature=45,Mathematics=53,PhysicalEducation=58,RussianLanguage=27,Strength=45,UkrainianLanguage=22 items=Underwear:Black:worn,Socks:Gray:worn,Pants:Gray:worn,TShirt:Gray:worn,Shoes:Beige:worn,FurCoat:Black:worn,PeShirt:Gray:home,PeShorts:Red:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f27.c1 Иванов Владислав Константинович female=False roles=student class=class-classroom-00 born=2004-07-04 traits=Diligent,Leader skills=Agility=38,BelarusianLanguage=23,Biology=27,Communication=31,Endurance=53,Hauling=65,Literature=62,Mathematics=33,PhysicalEducation=64,RussianLanguage=49,Strength=53 items=Underwear:White:worn,Socks:White:worn,Trousers:Black:worn,Shirt:Gray:worn,WinterBoots:Black:worn,Sweater:Blue:worn,Jacket:Gray:worn,Hat:Gray:worn,Scarf:Blue:worn,PeShirt:Blue:home,PeShorts:Green:home,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f27.c2 Иванов Александр Константинович female=False roles=student class=class-classroom-00 born=2004-05-25 traits= skills=Agility=58,Biology=51,Communication=37,Endurance=60,Hauling=37,Literature=65,Mathematics=35,PhysicalEducation=33,RussianLanguage=42,Strength=45,UkrainianLanguage=38 items=Underwear:Black:worn,Socks:Black:worn,Pants:Black:worn,TShirt:White:worn,WinterBoots:Beige:worn,Sweater:Black:worn,Hat:Beige:worn,Scarf:Blue:worn,FurCoat:Gray:home,PeShirt:Blue:home,PeShorts:Black:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f27.p0 Иванов Константин Иванович female=False roles=parent class=- born=1974-08-25 traits=Neat skills=Agility=44,BelarusianLanguage=27,Communication=77,Endurance=42,English=53,Hauling=62,Medicine=52,Pedagogy=40,RussianLanguage=32,Strength=28 items=Underwear:Black:worn,Socks:Black:worn,Trousers:Blue:worn,Shirt:Blue:worn,Shoes:Gray:worn,Sweater:Blue:worn,Scarf:Beige:worn,Jacket:Green:home,Bottle:White:bag,Phone:White:bag -person f27.p1 Иванова Марина Константиновна female=True roles=parent class=- born=1969-11-29 traits=Curious skills=Agility=43,BelarusianLanguage=16,Communication=71,Endurance=63,English=50,Hauling=59,RussianLanguage=56,Strength=35,UkrainianLanguage=21 items=Underwear:Black:worn,Socks:Gray:worn,Skirt:Beige:worn,TShirt:Black:worn,WinterBoots:Beige:worn,Sweater:Black:worn,FurCoat:Beige:worn,Bottle:Green:bag,Phone:Black:bag -person f28.c0 Иванов Пётр Петрович female=False roles=student class=class-classroom-02 born=2002-08-02 traits= skills=Agility=43,BelarusianLanguage=34,Biology=36,Communication=42,Endurance=50,Hauling=36,Literature=33,Mathematics=4,PhysicalEducation=78,RussianLanguage=46,Strength=44 items=Underwear:Gray:worn,Socks:White:worn,Pants:Beige:worn,Shirt:Gray:worn,WinterBoots:Black:worn,Sweater:Blue:worn,Jacket:Red:home,PeShirt:Green:home,PeShorts:Green:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f28.c1 Иванова Наталья Петровна female=True roles=student class=class-classroom-03 born=2000-12-07 traits=Quiet skills=Agility=58,BelarusianLanguage=30,Biology=46,Communication=52,Endurance=36,Hauling=58,Literature=38,Mathematics=73,PhysicalEducation=77,RussianLanguage=51,Strength=45,UkrainianLanguage=23 items=Underwear:White:worn,Socks:Gray:worn,Pants:Beige:worn,TShirt:Gray:worn,Shoes:Beige:worn,Hat:Black:worn,Coat:Beige:home,PeShirt:Green:home,PeShorts:Gray:home,Phone:Black:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f28.c2 Иванов Максим Петрович female=False roles=student class=class-classroom-00 born=2004-04-05 traits=Lazy skills=Agility=67,BelarusianLanguage=23,Biology=32,Communication=26,Endurance=54,Hauling=51,Literature=57,Mathematics=10,PhysicalEducation=57,RussianLanguage=47,Strength=75,UkrainianLanguage=35 items=Underwear:Black:worn,Socks:Gray:worn,Pants:Beige:worn,TShirt:Black:worn,Shoes:Gray:worn,Sweater:Gray:worn,Scarf:Black:worn,Coat:Black:home,PeShirt:Black:home,PeShorts:Red:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f28.p0 Иванов Пётр Олегович female=False roles=parent class=- born=1965-06-23 traits=AbsentMinded,HotTempered skills=Agility=75,BelarusianLanguage=24,Biology=51,Communication=60,Cooking=51,Endurance=74,English=57,Geography=66,Hauling=48,RussianLanguage=45,Strength=40,UkrainianLanguage=36 items=Underwear:Black:worn,Socks:Gray:worn,Trousers:Black:worn,Shirt:White:worn,Shoes:White:worn,Sweater:Black:worn,Coat:Gray:worn,Hat:Black:worn,Scarf:Black:worn -person f28.p1 Иванова Полина Алексеевна female=True roles=parent class=- born=1965-11-18 traits=AbsentMinded,Lazy skills=Agility=43,Communication=61,Cooking=49,Endurance=43,Hauling=60,RussianLanguage=46,Strength=45 items=Underwear:White:worn,Socks:White:worn,Dress:Beige:worn,WinterBoots:Gray:worn,Hat:Beige:worn,Belt:Black:worn,FurCoat:Gray:home,Bottle:Green:bag,Phone:Black:bag -person f29.c0 Макарова Ксения Александровна female=True roles=student class=class-classroom-01 born=2002-11-08 traits=Bully,HeatLoving skills=Agility=52,Biology=73,Communication=35,Endurance=53,Hauling=68,Literature=60,Mathematics=34,PhysicalEducation=67,RussianLanguage=18,Strength=45 items=Underwear:Gray:worn,Socks:White:worn,Pants:Blue:worn,TShirt:Gray:worn,WinterBoots:Black:worn,Jacket:Black:worn,Hat:Blue:worn,Belt:Beige:worn,PeShirt:Gray:home,PeShorts:Blue:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f29.p0 Макаров Александр Николаевич female=False roles=parent class=- born=1981-11-08 traits=AbsentMinded skills=Agility=50,BelarusianLanguage=34,Communication=44,Endurance=55,Hauling=42,Informatics=34,PhysicalEducation=74,RussianLanguage=54,Strength=64,UkrainianLanguage=10 items=Underwear:Black:worn,Socks:White:worn,Jeans:Blue:worn,Shirt:Blue:worn,WinterBoots:Black:worn,Sweater:Gray:worn,Coat:Black:worn,Hat:Gray:worn,Scarf:Black:worn,Bottle:Blue:bag,Phone:Black:bag -person f29.p1 Макарова Мария Владиславовна female=True roles=parent class=- born=1977-10-31 traits=ColdLoving,Curious skills=Administration=44,Agility=44,BelarusianLanguage=8,Communication=56,Endurance=62,English=40,Hauling=44,Medicine=15,RussianLanguage=35,Strength=52 items=Underwear:White:worn,Socks:Black:worn,Trousers:Black:worn,Shirt:Blue:worn,Shoes:Beige:worn,Sweater:Black:worn,Hat:Blue:worn,Coat:Black:home,Bottle:White:bag,Phone:White:bag -person f3.c0 Макарова Вероника Петровна female=True roles=student class=class-classroom-02 born=2002-05-15 traits= skills=Agility=68,BelarusianLanguage=24,Biology=34,Communication=45,Endurance=50,Hauling=48,Literature=37,Mathematics=41,PhysicalEducation=50,RussianLanguage=28,Strength=45,UkrainianLanguage=23 items=Underwear:Gray:worn,Socks:Black:worn,Trousers:Blue:worn,Shirt:Gray:worn,WinterBoots:Gray:worn,Jacket:Black:home,PeShirt:Gray:home,PeShorts:Blue:home,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f3.c1 Макаров Роман Петрович female=False roles=student class=class-classroom-02 born=2002-04-16 traits=Kind skills=Agility=50,BelarusianLanguage=22,Biology=59,Communication=22,Endurance=46,Hauling=51,Literature=39,Mathematics=23,PhysicalEducation=45,RussianLanguage=31,Strength=45,UkrainianLanguage=23 items=Underwear:Gray:worn,Socks:Black:worn,Jeans:Blue:worn,Shirt:White:worn,WinterBoots:Black:worn,Hat:Beige:worn,Coat:Black:home,PeShirt:Black:home,PeShorts:Black:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f3.p0 Макаров Пётр Егорович female=False roles=parent class=- born=1977-02-28 traits=Diligent,Neat skills=Agility=67,Communication=28,Endurance=53,English=57,Hauling=43,History=43,Pedagogy=54,RussianLanguage=43,Strength=40 items=Underwear:Black:worn,Socks:White:worn,Pants:Gray:worn,Shirt:Blue:worn,WinterBoots:Black:worn,Sweater:Beige:worn,Hat:Beige:worn,Coat:Black:home -person f3.p1 Макарова Алина Антоновна female=True roles=parent class=- born=1978-04-05 traits=HotTempered,Neat skills=Agility=45,BelarusianLanguage=20,Biology=41,Communication=45,Cooking=68,Endurance=51,English=54,Hauling=52,History=69,Medicine=78,RussianLanguage=63,Strength=44 items=Underwear:Black:worn,Socks:Black:worn,Jeans:Black:worn,TShirt:Gray:worn,WinterBoots:Gray:worn,Sweater:Gray:worn,Hat:Beige:worn,FurCoat:Beige:home,Phone:Black:bag -person f30.c0 Иванова Светлана Владимировна female=True roles=student class=class-classroom-03 born=2000-10-08 traits=Leader skills=Agility=43,Biology=53,Communication=26,Endurance=44,Hauling=49,Literature=68,Mathematics=39,PhysicalEducation=73,RussianLanguage=51,Strength=36,UkrainianLanguage=21 items=Underwear:White:worn,Socks:Black:worn,Pants:Blue:worn,Shirt:Gray:worn,Shoes:Gray:worn,Coat:Black:worn,Hat:Blue:worn,Scarf:Gray:worn,PeShirt:Gray:home,PeShorts:Black:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f30.c1 Иванова Надежда Владимировна female=True roles=student class=class-classroom-03 born=2000-12-10 traits=AbsentMinded,Kind skills=Agility=43,BelarusianLanguage=19,Biology=57,Communication=38,Endurance=66,Hauling=46,Literature=70,Mathematics=23,PhysicalEducation=56,RussianLanguage=41,Strength=40,UkrainianLanguage=10 items=Underwear:White:worn,Socks:Black:worn,Pants:Black:worn,Shirt:White:worn,Shoes:Black:worn,Scarf:Beige:worn,Jacket:Blue:home,PeShirt:Blue:home,PeShorts:Red:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f30.p0 Иванов Владимир Денисович female=False roles=parent class=- born=1974-06-12 traits=Lazy skills=Agility=40,Biology=17,Communication=72,Cooking=61,Endurance=50,Hauling=32,RussianLanguage=58,Strength=40,UkrainianLanguage=26 items=Underwear:Black:worn,Socks:Black:worn,Trousers:Black:worn,Shirt:Gray:worn,WinterBoots:Gray:worn,Coat:Beige:home,Bottle:Blue:bag -person f30.p1 Иванова Мария Андреевна female=True roles=parent class=- born=1973-09-24 traits=Diligent skills=Agility=52,BelarusianLanguage=40,Communication=61,Endurance=62,Hauling=65,Medicine=47,RussianLanguage=43,Strength=39 items=Underwear:White:worn,Socks:Gray:worn,Skirt:Black:worn,Shirt:Blue:worn,Shoes:Gray:worn,Hat:Beige:worn,Jacket:Blue:home,Phone:Gray:bag -person f31.c0 Иванов Николай Вадимович female=False roles=student class=class-classroom-01 born=2003-08-29 traits= skills=Agility=20,BelarusianLanguage=24,Biology=40,Communication=27,Endurance=43,Hauling=46,Literature=36,Mathematics=40,PhysicalEducation=53,RussianLanguage=32,Strength=73,UkrainianLanguage=20 items=Underwear:Gray:worn,Socks:White:worn,Jeans:Black:worn,TShirt:Beige:worn,WinterBoots:Beige:worn,FurCoat:Black:home,PeShirt:Blue:home,PeShorts:Black:home,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f31.p0 Иванов Вадим Андреевич female=False roles=parent class=- born=1985-06-23 traits=Curious,Quiet skills=Administration=28,Agility=45,BelarusianLanguage=32,Communication=54,Endurance=71,English=55,German=47,Hauling=53,PhysicalEducation=44,RussianLanguage=64,Strength=44,UkrainianLanguage=17 items=Underwear:White:worn,Socks:White:worn,Jeans:Black:worn,Shirt:Black:worn,Shoes:Black:worn,Hat:Blue:worn,Coat:Gray:home,Bottle:Blue:bag,Phone:Gray:bag -person f31.p1 Иванова Александра Юриевна female=True roles=parent class=- born=1980-08-20 traits=Curious,Diligent skills=Agility=70,BelarusianLanguage=29,Communication=50,Endurance=41,English=50,Hauling=51,Librarianship=35,PhysicalEducation=73,Physics=60,RussianLanguage=59,Strength=62,UkrainianLanguage=23 items=Underwear:Black:worn,Socks:Black:worn,Pants:Black:worn,TShirt:Gray:worn,Shoes:Black:worn,Jacket:Black:worn,Hat:Black:worn,Scarf:Blue:worn,Phone:Gray:bag -person f32.c0 Петров Артём Евгениевич female=False roles=student class=class-classroom-02 born=2002-07-14 traits=Neat skills=Agility=78,Biology=58,Communication=47,Endurance=32,Hauling=19,Literature=31,Mathematics=29,PhysicalEducation=60,RussianLanguage=65,Strength=18,UkrainianLanguage=18 items=Underwear:Black:worn,Socks:Black:worn,Trousers:Blue:worn,Shirt:Gray:worn,Shoes:Beige:worn,Sweater:Black:worn,FurCoat:Black:worn,PeShirt:Gray:home,PeShorts:Gray:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f32.c1 Петрова Елена Евгениевна female=True roles=student class=class-classroom-00 born=2003-10-27 traits=AbsentMinded,Curious skills=Agility=37,Biology=54,Communication=39,Endurance=60,Hauling=53,Literature=58,Mathematics=33,PhysicalEducation=75,RussianLanguage=34,Strength=42,UkrainianLanguage=30 items=Underwear:Gray:worn,Socks:Black:worn,Pants:Blue:worn,TShirt:White:worn,Shoes:Gray:worn,Coat:Black:worn,Hat:Gray:worn,Belt:Gray:worn,PeShirt:Blue:home,PeShorts:Green:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f32.c2 Петрова Ирина Евгениевна female=True roles=student class=class-classroom-02 born=2001-09-18 traits=HotTempered,Neat skills=Agility=41,BelarusianLanguage=32,Biology=80,Communication=32,Endurance=42,Hauling=67,Literature=51,Mathematics=26,PhysicalEducation=33,RussianLanguage=32,Strength=45 items=Underwear:White:worn,Socks:White:worn,Dress:Beige:worn,WinterBoots:Black:worn,Sweater:Black:worn,Jacket:Beige:worn,Belt:Gray:worn,PeShirt:Black:home,PeShorts:Blue:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f32.p0 Петров Евгений Станиславович female=False roles=parent class=- born=1963-05-02 traits= skills=Agility=45,Communication=66,Endurance=43,English=53,Hauling=42,PhysicalEducation=51,RussianLanguage=62,Strength=52,UkrainianLanguage=26 items=Underwear:Black:worn,Socks:White:worn,Jeans:Black:worn,Shirt:Black:worn,Shoes:White:worn,Sweater:Black:worn,Belt:Beige:worn,Coat:Beige:home,Bottle:Blue:bag -person f33.c0 Морозова Елизавета Григориевна female=True roles=student class=class-classroom-00 born=2003-11-04 traits=AbsentMinded,Kind skills=Agility=59,BelarusianLanguage=25,Biology=55,Communication=45,Endurance=48,Hauling=50,Literature=58,Mathematics=3,PhysicalEducation=62,RussianLanguage=28,Strength=38,UkrainianLanguage=26 items=Underwear:Gray:worn,Socks:Black:worn,Skirt:Gray:worn,TShirt:White:worn,Shoes:Beige:worn,Sweater:Blue:worn,Hat:Blue:worn,Scarf:Gray:worn,Coat:Gray:home,PeShirt:Gray:home,PeShorts:Green:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f33.p0 Морозов Григорий Михаилович female=False roles=parent class=- born=1968-05-01 traits= skills=Agility=28,BelarusianLanguage=8,Communication=68,Endurance=62,Hauling=51,Pedagogy=72,RussianLanguage=56,Strength=46,UkrainianLanguage=22 items=Underwear:Gray:worn,Socks:White:worn,Trousers:Gray:worn,TShirt:Blue:worn,WinterBoots:Beige:worn,Sweater:Blue:worn,Coat:Gray:home,Phone:Black:bag -person f33.p1 Морозова Марина Владимировна female=True roles=parent class=- born=1972-10-24 traits=Leader skills=Administration=54,Agility=41,BelarusianLanguage=28,Communication=42,Endurance=80,English=30,Geography=60,Hauling=41,PhysicalEducation=76,RussianLanguage=74,Strength=37 items=Underwear:Black:worn,Socks:White:worn,Pants:Beige:worn,Shirt:Gray:worn,WinterBoots:Black:worn,Hat:Beige:worn,Belt:Gray:worn,Jacket:Beige:home -person f34.c0 Кузнецова Валентина Ивановна female=True roles=student class=class-classroom-00 born=2004-03-25 traits=Bully,HotTempered skills=Agility=29,Biology=32,Communication=21,Endurance=69,Hauling=54,Literature=54,Mathematics=28,PhysicalEducation=53,RussianLanguage=16,Strength=45,UkrainianLanguage=24 items=Underwear:Black:worn,Socks:Black:worn,Pants:Black:worn,Shirt:White:worn,Shoes:Black:worn,Sweater:Gray:worn,Jacket:Black:worn,PeShirt:Green:home,PeShorts:Red:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f34.p0 Кузнецов Иван Сергеевич female=False roles=parent class=- born=1970-02-02 traits= skills=Agility=44,Communication=43,Endurance=58,English=45,German=55,Hauling=31,Literature=54,RussianLanguage=55,Strength=72 items=Underwear:Black:worn,Socks:Black:worn,Pants:Beige:worn,Shirt:Gray:worn,WinterBoots:Gray:worn,Hat:Black:worn,Scarf:Beige:worn,Coat:Black:home -person f34.p1 Кузнецова Дарья Валериевна female=True roles=parent class=- born=1967-03-25 traits=Diligent skills=Agility=47,BelarusianLanguage=23,Communication=52,Endurance=52,German=38,Hauling=32,Informatics=21,RussianLanguage=62,Strength=67,UkrainianLanguage=15 items=Underwear:Black:worn,Socks:Gray:worn,Jeans:Blue:worn,Shirt:Black:worn,Shoes:Black:worn,Sweater:Gray:worn,Jacket:Blue:home,Bottle:Blue:bag,Phone:Gray:bag -person f4.c0 Васильев Денис Федорович female=False roles=student class=class-classroom-01 born=2003-02-01 traits=Neat skills=Agility=50,BelarusianLanguage=9,Biology=58,Communication=27,Endurance=35,Hauling=25,Literature=52,Mathematics=53,PhysicalEducation=43,RussianLanguage=68,Strength=45,UkrainianLanguage=27 items=Underwear:Gray:worn,Socks:White:worn,Trousers:Black:worn,TShirt:Gray:worn,Shoes:Gray:worn,Sweater:Gray:worn,Jacket:Red:home,PeShirt:Black:home,PeShorts:Black:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f4.p0 Васильев Фёдор Игоревич female=False roles=parent class=- born=1970-05-21 traits=AbsentMinded skills=Agility=66,Communication=49,Endurance=44,English=25,Geography=47,Hauling=45,Medicine=44,RussianLanguage=45,Strength=47,UkrainianLanguage=31 items=Underwear:Black:worn,Socks:Black:worn,Jeans:Gray:worn,TShirt:LightBlue:worn,Shoes:Gray:worn,Coat:Beige:worn,Hat:Black:worn,Belt:Gray:worn,Phone:White:bag -person f4.p1 Васильева Анастасия Федоровна female=True roles=parent class=- born=1975-01-20 traits= skills=Agility=64,BelarusianLanguage=22,Communication=59,Endurance=64,English=43,Hauling=53,Librarianship=49,Medicine=75,RussianLanguage=49,Strength=73,UkrainianLanguage=13 items=Underwear:Gray:worn,Socks:White:worn,Pants:Blue:worn,TShirt:Blue:worn,Shoes:Beige:worn,Sweater:Gray:worn,Hat:Black:worn,Coat:Gray:home,Bottle:White:bag -person f5.c0 Захарова Екатерина Борисовна female=True roles=student class=class-classroom-02 born=2002-07-13 traits=Kind,Lazy skills=Agility=57,BelarusianLanguage=29,Biology=72,Communication=42,Endurance=39,Hauling=29,Literature=19,Mathematics=37,PhysicalEducation=60,RussianLanguage=28,Strength=54 items=Underwear:Gray:worn,Socks:Black:worn,Dress:Black:worn,WinterBoots:Gray:worn,Sweater:Beige:worn,Hat:Black:worn,Coat:Black:home,PeShirt:Blue:home,PeShorts:Black:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f5.p0 Захаров Борис Николаевич female=False roles=parent class=- born=1980-04-15 traits= skills=Agility=45,BelarusianLanguage=29,Communication=37,Cooking=51,Endurance=51,Hauling=32,Pedagogy=36,RussianLanguage=66,Strength=51,UkrainianLanguage=15 items=Underwear:Black:worn,Socks:Gray:worn,Jeans:Blue:worn,Shirt:White:worn,Shoes:Gray:worn,Scarf:Beige:worn,Jacket:Gray:home -person f5.p1 Захарова Вероника Григориевна female=True roles=parent class=- born=1979-06-22 traits= skills=Administration=39,Agility=68,Communication=64,Endurance=40,English=31,Hauling=61,Informatics=35,PhysicalEducation=35,RussianLanguage=55,Strength=65 items=Underwear:Black:worn,Socks:White:worn,Skirt:Beige:worn,Shirt:Blue:worn,WinterBoots:Gray:worn,Sweater:Black:worn,Jacket:Gray:worn,Hat:Beige:worn -person f6.c0 Козловская Юлия Олеговна female=True roles=student class=class-classroom-00 born=2004-08-15 traits= skills=Agility=45,Biology=49,Communication=42,Endurance=61,Hauling=67,Literature=49,Mathematics=54,PhysicalEducation=39,RussianLanguage=23,Strength=58 items=Underwear:Black:worn,Socks:White:worn,Jeans:Black:worn,Shirt:Black:worn,WinterBoots:Black:worn,Sweater:Gray:worn,Coat:Gray:worn,Hat:Blue:worn,Scarf:Black:worn,PeShirt:Gray:home,PeShorts:Green:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f6.c1 Козловская Светлана Олеговна female=True roles=student class=class-classroom-02 born=2001-12-31 traits=HotTempered,Lazy skills=Agility=53,BelarusianLanguage=37,Biology=59,Communication=36,Endurance=40,Hauling=26,Literature=66,Mathematics=28,PhysicalEducation=43,RussianLanguage=53,Strength=47,UkrainianLanguage=10 items=Underwear:White:worn,Socks:Black:worn,Jeans:Gray:worn,Shirt:Black:worn,WinterBoots:Beige:worn,Coat:Black:worn,Hat:Beige:worn,PeShirt:Blue:home,PeShorts:Green:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f6.c2 Козловская Вероника Олеговна female=True roles=student class=class-classroom-00 born=2003-09-29 traits=Curious skills=Agility=55,Biology=77,Communication=27,Endurance=56,Hauling=46,Literature=56,Mathematics=32,PhysicalEducation=46,RussianLanguage=20,Strength=49,UkrainianLanguage=25 items=Underwear:Gray:worn,Socks:Black:worn,Jeans:Black:worn,TShirt:White:worn,Shoes:White:worn,Coat:Gray:home,PeShirt:Blue:home,PeShorts:Red:home,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f6.p0 Козловский Олег Станиславович female=False roles=parent class=- born=1967-12-18 traits=Kind skills=Agility=42,Communication=82,Endurance=64,Hauling=52,Informatics=53,Literature=33,RussianLanguage=58,Strength=21 items=Underwear:Black:worn,Socks:Black:worn,Pants:Beige:worn,TShirt:White:worn,Shoes:White:worn,Sweater:Gray:worn,Coat:Beige:home,Bottle:Blue:bag -person f6.p1 Козловская Ирина Кирилловна female=True roles=parent class=- born=1963-12-28 traits=AbsentMinded,Kind skills=Agility=57,BelarusianLanguage=11,Communication=67,Endurance=42,English=48,Hauling=57,RussianLanguage=79,Strength=45 items=Underwear:Gray:worn,Socks:White:worn,Jeans:Gray:worn,TShirt:Gray:worn,WinterBoots:Beige:worn,Coat:Black:worn,Bottle:White:bag -person f7.c0 Андреев Виктор Степанович female=False roles=student class=class-classroom-01 born=2003-07-19 traits=Curious,Kind skills=Agility=50,BelarusianLanguage=27,Biology=78,Communication=24,Endurance=50,Hauling=73,Literature=51,Mathematics=26,PhysicalEducation=26,RussianLanguage=50,Strength=64,UkrainianLanguage=34 items=Underwear:Gray:worn,Socks:Black:worn,Jeans:Black:worn,Shirt:Black:worn,Shoes:Gray:worn,Belt:Beige:worn,Jacket:Red:home,PeShirt:Blue:home,PeShorts:Green:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f7.p0 Андреев Степан Андреевич female=False roles=parent class=- born=1973-08-21 traits= skills=Agility=64,Communication=76,Endurance=36,English=60,Hauling=46,History=47,Literature=57,RussianLanguage=64,Strength=62,UkrainianLanguage=27 items=Underwear:Black:worn,Socks:White:worn,Jeans:Gray:worn,Shirt:Black:worn,Shoes:White:worn,Sweater:Black:worn,Hat:Beige:worn,FurCoat:Gray:home -person f7.p1 Андреева Мария Алексеевна female=True roles=parent class=- born=1977-07-16 traits=Diligent skills=Agility=35,BelarusianLanguage=18,Communication=56,Cooking=47,Endurance=45,Hauling=56,Medicine=47,RussianLanguage=64,Strength=64 items=Underwear:Gray:worn,Socks:Black:worn,Trousers:Blue:worn,TShirt:Black:worn,Shoes:Gray:worn,Hat:Blue:worn,FurCoat:Beige:home,Bottle:White:bag -person f8.c0 Фролов Евгений Павелович female=False roles=student class=class-classroom-00 born=2003-12-20 traits=AbsentMinded,Kind skills=Agility=69,BelarusianLanguage=26,Biology=50,Communication=28,Endurance=29,Hauling=45,Literature=52,Mathematics=31,PhysicalEducation=44,RussianLanguage=43,Strength=31,UkrainianLanguage=24 items=Underwear:Gray:worn,Socks:Black:worn,Trousers:Black:worn,Shirt:White:worn,WinterBoots:Beige:worn,Sweater:Gray:worn,FurCoat:Beige:worn,PeShirt:Green:home,PeShorts:Black:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f8.c1 Фролов Станислав Павелович female=False roles=student class=class-classroom-03 born=2000-10-11 traits=AbsentMinded,Lazy skills=Agility=57,BelarusianLanguage=20,Biology=56,Communication=57,Endurance=34,Hauling=42,Literature=71,Mathematics=23,PhysicalEducation=25,RussianLanguage=39,Strength=45,UkrainianLanguage=24 items=Underwear:Black:worn,Socks:White:worn,Jeans:Black:worn,TShirt:Black:worn,Shoes:Beige:worn,Jacket:Black:worn,Hat:Black:worn,PeShirt:Red:home,PeShorts:Green:home,Bottle:White:bag,Phone:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f8.p0 Фролов Павел Егорович female=False roles=parent class=- born=1968-06-07 traits=Leader skills=Administration=51,Agility=71,Chemistry=39,Communication=87,Endurance=39,English=42,Hauling=45,Informatics=65,Librarianship=57,RussianLanguage=73,Strength=45,UkrainianLanguage=26 items=Underwear:Gray:worn,Socks:Black:worn,Trousers:Gray:worn,TShirt:White:worn,WinterBoots:Black:worn,Sweater:Gray:worn,Coat:Black:home,Phone:Black:bag -person f8.p1 Фролова Виктория Степановна female=True roles=parent class=- born=1963-10-04 traits=Curious,Lazy skills=Agility=57,Chemistry=51,Communication=77,Endurance=45,English=33,Hauling=52,Librarianship=83,RussianLanguage=58,Strength=55 items=Underwear:White:worn,Socks:White:worn,Skirt:Beige:worn,Shirt:Gray:worn,WinterBoots:Black:worn,Coat:Gray:home,Bottle:Green:bag -person f9.c0 Кузьмина Любовь Александровна female=True roles=student class=class-classroom-01 born=2003-06-13 traits=HotTempered skills=Agility=45,Biology=47,Communication=31,Endurance=32,Hauling=40,Literature=63,Mathematics=46,PhysicalEducation=48,RussianLanguage=41,Strength=44,UkrainianLanguage=5 items=Underwear:Black:worn,Socks:Gray:worn,Skirt:Beige:worn,Shirt:Blue:worn,WinterBoots:Gray:worn,Sweater:Blue:worn,FurCoat:Beige:worn,PeShirt:Gray:home,PeShorts:Green:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f9.c1 Кузьмин Сергей Александрович female=False roles=student class=class-classroom-03 born=2001-08-20 traits=Curious,Quiet skills=Agility=11,Biology=58,Communication=41,Endurance=59,Hauling=40,Literature=39,Mathematics=31,PhysicalEducation=40,RussianLanguage=51,Strength=52 items=Underwear:Gray:worn,Socks:Black:worn,Trousers:Gray:worn,TShirt:Gray:worn,Shoes:Beige:worn,Sweater:Beige:worn,Hat:Beige:worn,Scarf:Beige:worn,Coat:Gray:home,PeShirt:Gray:home,PeShorts:Blue:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f9.c2 Кузьмина Алина Александровна female=True roles=student class=class-classroom-03 born=2001-01-22 traits= skills=Agility=52,Biology=38,Communication=29,Endurance=53,Hauling=34,Literature=63,Mathematics=31,PhysicalEducation=55,RussianLanguage=42,Strength=63,UkrainianLanguage=12 items=Underwear:White:worn,Socks:Gray:worn,Trousers:Blue:worn,Shirt:Blue:worn,WinterBoots:Gray:worn,Jacket:Gray:worn,Scarf:Gray:worn,PeShirt:Blue:home,PeShorts:Black:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool -person f9.p0 Кузьмин Александр Денисович female=False roles=parent class=- born=1981-12-09 traits= skills=Agility=40,Chemistry=55,Communication=58,Endurance=78,English=57,Hauling=43,Pedagogy=52,RussianLanguage=67,Strength=63 items=Underwear:White:worn,Socks:White:worn,Jeans:Gray:worn,Shirt:Gray:worn,Shoes:Beige:worn,FurCoat:Beige:worn,Belt:Beige:worn,Bottle:Green:bag -person f9.p1 Кузьмина Анастасия Сергеевна female=True roles=parent class=- born=1977-01-01 traits=Diligent skills=Agility=62,BelarusianLanguage=27,Communication=72,Endurance=92,Hauling=47,Librarianship=43,Pedagogy=48,RussianLanguage=67,Strength=34,UkrainianLanguage=21 items=Underwear:Black:worn,Socks:White:worn,Skirt:Blue:worn,Shirt:Blue:worn,Shoes:Beige:worn,Hat:Black:worn,Belt:Gray:worn,Jacket:Black:home,Bottle:White:bag +person f0.c0 Андреев Сергей Валериевич female=False roles=student class=class-classroom-03 born=2000-10-23 traits=Lazy skills=Agility=33,Biology=57,Communication=47,Endurance=46,Hauling=56,Literature=22,Mathematics=12,PhysicalEducation=65,RussianLanguage=47,Strength=64,UkrainianLanguage=31 items=Boxers:Black:worn,Socks:Gray:worn,Jeans:Black:worn,TShirt:Black:worn,Shoes:Gray:worn,Sweater:Gray:worn,Scarf:Black:worn,Coat:Black:home,PeShirt:Gray:home,PeShorts:Gray:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f0.c1 Андреев Александр Валериевич female=False roles=student class=class-classroom-01 born=2002-11-09 traits=Kind,Outgoing skills=Agility=13,Biology=46,Communication=20,Endurance=52,Hauling=24,Literature=35,Mathematics=49,PhysicalEducation=57,RussianLanguage=47,Strength=45 items=Briefs:Black:worn,Socks:Gray:worn,Jeans:Blue:worn,TShirt:LightBlue:worn,Shoes:Gray:worn,Sweater:Black:worn,Coat:Beige:worn,Scarf:Gray:worn,PeShirt:Gray:home,PeShorts:Black:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f0.p0 Андреев Валерий Николаевич female=False roles=parent class=- born=1971-06-03 traits=Diligent,Quiet skills=Agility=43,Communication=58,Cooking=82,Endurance=61,Hauling=61,Pedagogy=50,RussianLanguage=89,Strength=33 items=Briefs:Black:worn,Socks:White:worn,Jeans:Black:worn,TShirt:LightBlue:worn,WinterBoots:Beige:worn,Jacket:Gray:worn,Bottle:Green:bag +person f0.p1 Андреева Марина Артемовна female=True roles=parent class=- born=1971-09-30 traits=Quiet skills=Agility=25,BelarusianLanguage=26,Communication=38,Endurance=35,Hauling=46,History=61,Mathematics=75,RussianLanguage=65,Strength=40,UkrainianLanguage=23 items=Panties:Black:worn,Bra:White:worn,Socks:Black:worn,Jeans:Blue:worn,TShirt:LightBlue:worn,Shoes:Black:worn,Sweater:Gray:worn,Belt:Gray:worn,Coat:Beige:home,Bottle:White:bag +person f1.c0 Александрова Людмила Борисовна female=True roles=student class=class-classroom-03 born=2001-01-26 traits=AbsentMinded skills=Agility=72,BelarusianLanguage=36,Biology=67,Communication=37,Endurance=39,Hauling=56,Literature=77,Mathematics=29,PhysicalEducation=54,RussianLanguage=51,Strength=45,UkrainianLanguage=28 items=Panties:Beige:worn,Bra:White:worn,Socks:Gray:worn,Dress:Gray:worn,Shoes:Gray:worn,Coat:Beige:worn,Belt:Beige:worn,PeShirt:Green:home,PeShorts:Blue:home,Bottle:Blue:bag,Phone:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f1.c1 Александров Евгений Борисович female=False roles=student class=class-classroom-00 born=2004-04-01 traits= skills=Agility=31,BelarusianLanguage=27,Biology=50,Communication=38,Endurance=54,Hauling=58,Literature=65,Mathematics=30,PhysicalEducation=88,RussianLanguage=44,Strength=40 items=Boxers:White:worn,Socks:Black:worn,Jeans:Black:worn,TShirt:Blue:worn,WinterBoots:Black:worn,Hat:Black:worn,Coat:Gray:home,PeShirt:Blue:home,PeShorts:Blue:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f1.c2 Александров Юрий Борисович female=False roles=student class=class-classroom-00 born=2003-10-28 traits= skills=Agility=45,Biology=68,Communication=31,Endurance=30,Hauling=49,Literature=60,Mathematics=29,PhysicalEducation=49,RussianLanguage=53,Strength=74,UkrainianLanguage=23 items=Boxers:Black:worn,Socks:Gray:worn,Pants:Blue:worn,TShirt:LightBlue:worn,Shoes:Black:worn,Sweater:Blue:worn,Scarf:Black:worn,Coat:Beige:home,PeShirt:Red:home,PeShorts:Gray:home,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f1.p0 Александров Борис Ильич female=False roles=parent class=- born=1968-10-25 traits= skills=Agility=45,Communication=74,Endurance=34,Hauling=65,RussianLanguage=53,Strength=53,UkrainianLanguage=14 items=Briefs:Black:worn,Socks:White:worn,Trousers:Gray:worn,TShirt:Blue:worn,WinterBoots:Gray:worn,Hat:Beige:worn,Scarf:Gray:worn,FurCoat:Beige:home +person f1.p1 Александрова Елизавета Романовна female=True roles=parent class=- born=1972-01-25 traits= skills=Administration=71,Agility=45,BelarusianLanguage=26,Communication=76,Cooking=59,Endurance=35,English=58,Hauling=48,Mathematics=30,RussianLanguage=42,Strength=66 items=Panties:Black:worn,SportsBra:Blue:worn,Socks:Black:worn,Dress:Black:worn,WinterBoots:Beige:worn,Sweater:Beige:worn,Coat:Beige:home,Bottle:White:bag,Phone:White:bag +person f10.c0 Захаров Пётр Виталиевич female=False roles=student class=class-classroom-02 born=2001-11-08 traits=Gossip skills=Agility=31,BelarusianLanguage=26,Biology=62,Communication=54,Endurance=45,Hauling=56,Literature=25,Mathematics=73,PhysicalEducation=63,RussianLanguage=40,Strength=60 items=Boxers:Black:worn,Socks:Black:worn,Pants:Gray:worn,TShirt:Black:worn,WinterBoots:Beige:worn,Jacket:Gray:home,PeShirt:Red:home,PeShorts:Red:home,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f10.p0 Захаров Виталий Борисович female=False roles=parent class=- born=1976-09-07 traits=HeatLoving,Outgoing skills=Agility=44,BelarusianLanguage=22,Communication=66,Endurance=82,English=16,Hauling=40,RussianLanguage=69,Strength=55 items=Boxers:Gray:worn,Socks:Black:worn,Trousers:Black:worn,TShirt:White:worn,WinterBoots:Black:worn,FurCoat:Gray:worn,Hat:Blue:worn,Scarf:Blue:worn,Bottle:White:bag,Phone:Black:bag +person f10.p1 Захарова Любовь Валериевна female=True roles=parent class=- born=1978-11-03 traits=AbsentMinded,Kind skills=Administration=43,Agility=45,BelarusianLanguage=21,Communication=61,Endurance=53,English=52,Hauling=52,Medicine=23,PhysicalEducation=42,Physics=59,RussianLanguage=66,Strength=28 items=Panties:Black:worn,SoftBra:Gray:worn,Socks:Gray:worn,Jeans:Gray:worn,Shirt:Gray:worn,Shoes:Beige:worn,FurCoat:Gray:home,Bottle:White:bag,Phone:Gray:bag +person f11.c0 Андреева Дарья Ивановна female=True roles=student class=class-classroom-03 born=2001-05-20 traits=Leader skills=Agility=47,BelarusianLanguage=13,Biology=57,Communication=43,Endurance=44,Hauling=50,Literature=59,Mathematics=24,PhysicalEducation=61,RussianLanguage=47,Strength=45,UkrainianLanguage=24 items=Panties:Gray:worn,Socks:White:worn,Dress:Beige:worn,Shoes:White:worn,Hat:Blue:worn,Coat:Gray:home,PeShirt:Black:home,PeShorts:Black:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f11.p0 Андреев Иван Алексеевич female=False roles=parent class=- born=1976-06-01 traits= skills=Agility=38,BelarusianLanguage=16,Communication=52,Endurance=82,Hauling=33,Medicine=48,Pedagogy=61,PhysicalEducation=54,RussianLanguage=82,Strength=67,UkrainianLanguage=22 items=Briefs:White:worn,Socks:White:worn,Jeans:Black:worn,Shirt:Gray:worn,WinterBoots:Gray:worn,Sweater:Beige:worn,FurCoat:Beige:worn,Phone:Gray:bag +person f11.p1 Андреева София Александровна female=True roles=parent class=- born=1978-04-24 traits=Diligent,HeatLoving skills=Agility=61,Communication=74,Endurance=55,English=61,Hauling=31,History=29,RussianLanguage=54,Strength=43 items=Panties:Gray:worn,Bra:Black:worn,Socks:Gray:worn,Jeans:Black:worn,TShirt:Blue:worn,WinterBoots:Beige:worn,Sweater:Blue:worn,Hat:Blue:worn,FurCoat:Gray:home,Bottle:Green:bag +person f12.c0 Кузьмин Олег Владиславович female=False roles=student class=class-classroom-01 born=2003-03-20 traits=ColdLoving,Lazy skills=Agility=49,Biology=58,Communication=48,Endurance=57,Hauling=54,Literature=54,Mathematics=33,PhysicalEducation=39,RussianLanguage=9,Strength=36,UkrainianLanguage=31 items=Briefs:White:worn,Socks:Gray:worn,Pants:Blue:worn,TShirt:LightBlue:worn,WinterBoots:Black:worn,Hat:Black:worn,Belt:Black:worn,FurCoat:Gray:home,PeShirt:Red:home,PeShorts:Red:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f12.c1 Кузьмин Егор Владиславович female=False roles=student class=class-classroom-01 born=2003-05-31 traits=Lazy,Leader skills=Agility=45,Biology=45,Communication=30,Endurance=59,Hauling=44,Literature=39,Mathematics=30,PhysicalEducation=59,RussianLanguage=49,Strength=35,UkrainianLanguage=23 items=Briefs:Gray:worn,Socks:Gray:worn,Pants:Black:worn,TShirt:Beige:worn,Shoes:Black:worn,Sweater:Black:worn,Coat:Black:worn,Belt:Beige:worn,PeShirt:Black:home,PeShorts:Black:home,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f12.c2 Кузьмина Дарья Владиславовна female=True roles=student class=class-classroom-01 born=2002-10-29 traits=Diligent,Neat skills=Agility=42,BelarusianLanguage=20,Biology=56,Communication=39,Endurance=58,Hauling=59,Literature=35,Mathematics=30,PhysicalEducation=81,RussianLanguage=64,Strength=34,UkrainianLanguage=28 items=Panties:Black:worn,Socks:Gray:worn,Skirt:Blue:worn,Shirt:Black:worn,Shoes:Black:worn,Sweater:Beige:worn,Coat:Beige:worn,PeShirt:Green:home,PeShorts:Black:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f12.p0 Кузьмин Владислав Александрович female=False roles=parent class=- born=1975-01-17 traits= skills=Administration=56,Agility=25,BelarusianLanguage=10,Communication=68,Endurance=35,English=36,Hauling=63,Informatics=56,Medicine=59,RussianLanguage=54,Strength=36 items=Boxers:Gray:worn,Socks:Gray:worn,Jeans:Blue:worn,Shirt:Blue:worn,Shoes:Gray:worn,Jacket:Blue:worn,Bottle:Blue:bag +person f12.p1 Кузьмина Ольга Кирилловна female=True roles=parent class=- born=1979-10-15 traits=AbsentMinded,Kind skills=Administration=38,Agility=39,BelarusianLanguage=25,Chemistry=48,Communication=32,Endurance=41,English=42,Geography=41,Hauling=46,RussianLanguage=32,Strength=34,UkrainianLanguage=40 items=Panties:Gray:worn,SoftBra:Gray:worn,Socks:White:worn,Jeans:Blue:worn,TShirt:LightBlue:worn,Shoes:Beige:worn,FurCoat:Gray:home +person f13.c0 Яковлев Константин Владиславович female=False roles=student class=class-classroom-00 born=2004-06-16 traits= skills=Agility=53,BelarusianLanguage=24,Biology=48,Communication=29,Endurance=37,Hauling=64,Literature=58,Mathematics=22,PhysicalEducation=44,RussianLanguage=31,Strength=37 items=Boxers:Gray:worn,Socks:Black:worn,Trousers:Gray:worn,Shirt:Blue:worn,WinterBoots:Gray:worn,Jacket:Blue:home,PeShirt:Gray:home,PeShorts:Red:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f13.c1 Яковлев Юрий Владиславович female=False roles=student class=class-classroom-01 born=2003-07-23 traits=Diligent,Quiet skills=Agility=36,BelarusianLanguage=22,Biology=56,Communication=43,Endurance=44,Hauling=57,Literature=56,Mathematics=26,PhysicalEducation=51,RussianLanguage=37,Strength=68,UkrainianLanguage=8 items=Briefs:Black:worn,Socks:Gray:worn,Pants:Blue:worn,Shirt:Black:worn,WinterBoots:Gray:worn,Sweater:Gray:worn,FurCoat:Black:worn,PeShirt:Gray:home,PeShorts:Blue:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f13.c2 Яковлева Алина Владиславовна female=True roles=student class=class-classroom-01 born=2003-02-01 traits=Diligent skills=Agility=58,BelarusianLanguage=20,Biology=60,Communication=45,Endurance=54,Hauling=53,Literature=66,Mathematics=34,PhysicalEducation=47,RussianLanguage=59,Strength=45 items=Panties:White:worn,Socks:White:worn,Trousers:Black:worn,Shirt:Blue:worn,Shoes:Gray:worn,Hat:Gray:worn,Scarf:Blue:worn,Coat:Beige:home,PeShirt:Red:home,PeShorts:Red:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f13.p0 Яковлев Владислав Андреевич female=False roles=parent class=- born=1974-09-23 traits=AbsentMinded,HotTempered skills=Agility=25,BelarusianLanguage=28,Communication=42,Endurance=35,English=26,Hauling=52,RussianLanguage=54,Strength=38 items=Boxers:Black:worn,Socks:White:worn,Trousers:Black:worn,TShirt:White:worn,Shoes:Beige:worn,Hat:Beige:worn,Coat:Beige:home,Bottle:Green:bag,Phone:White:bag +person f14.c0 Александров Степан Денисович female=False roles=student class=class-classroom-02 born=2002-01-03 traits= skills=Agility=57,BelarusianLanguage=17,Biology=53,Communication=18,Endurance=60,Hauling=64,Literature=34,Mathematics=33,PhysicalEducation=55,RussianLanguage=32,Strength=41 items=Briefs:Gray:worn,Socks:Gray:worn,Pants:Blue:worn,TShirt:Gray:worn,Shoes:Black:worn,Sweater:Beige:worn,Jacket:Gray:worn,Hat:Blue:worn,Scarf:Blue:worn,PeShirt:Gray:home,PeShorts:Red:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f14.c1 Александрова Вероника Денисовна female=True roles=student class=class-classroom-03 born=2001-08-11 traits= skills=Agility=45,BelarusianLanguage=15,Biology=52,Communication=38,Endurance=37,Hauling=44,Literature=29,Mathematics=18,PhysicalEducation=65,RussianLanguage=46,Strength=64 items=Panties:Beige:worn,Socks:Gray:worn,Trousers:Gray:worn,TShirt:Black:worn,WinterBoots:Gray:worn,Belt:Gray:worn,FurCoat:Beige:home,PeShirt:Red:home,PeShorts:Gray:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f14.c2 Александров Константин Денисович female=False roles=student class=class-classroom-01 born=2003-08-21 traits= skills=Agility=29,BelarusianLanguage=21,Biology=66,Communication=21,Endurance=51,Hauling=42,Literature=64,Mathematics=27,PhysicalEducation=67,RussianLanguage=20,Strength=45 items=Boxers:White:worn,Socks:Gray:worn,Jeans:Gray:worn,TShirt:Gray:worn,Shoes:Gray:worn,Scarf:Blue:worn,Coat:Black:home,PeShirt:Blue:home,PeShorts:Red:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f14.p1 Александрова Виктория Викторовна female=True roles=parent class=- born=1973-07-23 traits= skills=Agility=45,Communication=72,Cooking=68,Endurance=64,Geography=58,Hauling=44,Physics=38,RussianLanguage=61,Strength=49,UkrainianLanguage=18 items=Panties:Gray:worn,Bra:Gray:worn,Socks:White:worn,Skirt:Beige:worn,TShirt:White:worn,Shoes:Beige:worn,Hat:Gray:worn,Belt:Gray:worn,FurCoat:Black:home,Bottle:Blue:bag,Phone:White:bag +person f15.c0 Воробьёв Игорь Сергеевич female=False roles=student class=class-classroom-03 born=2000-09-20 traits= skills=Agility=45,BelarusianLanguage=24,Biology=33,Communication=61,Endurance=58,Hauling=42,Literature=45,Mathematics=32,PhysicalEducation=40,RussianLanguage=55,Strength=38 items=Briefs:Black:worn,Socks:White:worn,Trousers:Blue:worn,TShirt:Black:worn,Shoes:Beige:worn,Sweater:Black:worn,Hat:Gray:worn,FurCoat:Black:home,PeShirt:Green:home,PeShorts:Blue:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f15.p0 Воробьёв Сергей Никитич female=False roles=parent class=- born=1974-10-22 traits=Neat,Quiet skills=Agility=45,Communication=54,Endurance=45,Hauling=36,Librarianship=67,Pedagogy=38,RussianLanguage=71,Strength=65,UkrainianLanguage=32 items=Boxers:White:worn,Socks:Black:worn,Pants:Blue:worn,TShirt:Gray:worn,Shoes:Black:worn,Sweater:Black:worn,FurCoat:Beige:home,Bottle:Blue:bag +person f15.p1 Воробьёва Вера Виталиевна female=True roles=parent class=- born=1972-09-07 traits=Leader,Neat skills=Agility=42,BelarusianLanguage=40,Communication=30,Endurance=52,Hauling=46,Pedagogy=55,RussianLanguage=46,Strength=45,UkrainianLanguage=25 items=Panties:Beige:worn,Bra:Black:worn,Socks:Black:worn,Trousers:Black:worn,TShirt:Gray:worn,WinterBoots:Black:worn,Sweater:Beige:worn,Scarf:Black:worn,Coat:Beige:home,Bottle:White:bag,Phone:White:bag +person f16.c0 Фролова Елизавета Игоревна female=True roles=student class=class-classroom-02 born=2002-06-29 traits=Quiet skills=Agility=29,BelarusianLanguage=17,Biology=43,Communication=32,Endurance=19,Hauling=36,Literature=51,Mathematics=51,PhysicalEducation=68,RussianLanguage=24,Strength=45 items=Panties:Gray:worn,Socks:Black:worn,Jeans:Blue:worn,Shirt:Blue:worn,WinterBoots:Beige:worn,Sweater:Beige:worn,FurCoat:Black:home,PeShirt:Red:home,PeShorts:Gray:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f16.p0 Фролов Игорь Виталиевич female=False roles=parent class=- born=1968-07-25 traits= skills=Administration=51,Agility=57,BelarusianLanguage=25,Communication=58,Endurance=63,Hauling=49,Medicine=53,RussianLanguage=53,Strength=46 items=Boxers:White:worn,Socks:White:worn,Pants:Gray:worn,Shirt:Gray:worn,Shoes:Gray:worn,Hat:Blue:worn,Jacket:Beige:home +person f16.p1 Фролова Татьяна Олеговна female=True roles=parent class=- born=1970-06-17 traits=Neat,Outgoing skills=Agility=45,BelarusianLanguage=23,Communication=59,Endurance=59,Hauling=62,Literature=51,RussianLanguage=72,Strength=44 items=Panties:White:worn,Bra:Beige:worn,Socks:Gray:worn,Dress:Black:worn,Shoes:Beige:worn,Sweater:Blue:worn,Coat:Beige:home,Bottle:Blue:bag,Phone:Black:bag +person f17.c0 Иванов Андрей Александрович female=False roles=student class=class-classroom-03 born=2001-06-27 traits=Leader skills=Agility=60,Biology=53,Communication=54,Endurance=35,Hauling=41,Literature=65,Mathematics=38,PhysicalEducation=55,RussianLanguage=35,Strength=45,UkrainianLanguage=13 items=Boxers:White:worn,Socks:Gray:worn,Jeans:Gray:worn,Shirt:White:worn,WinterBoots:Gray:worn,Coat:Black:home,PeShirt:Green:home,PeShorts:Blue:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f17.c1 Иванова Ксения Александровна female=True roles=student class=class-classroom-02 born=2001-09-10 traits=ColdLoving skills=Agility=45,Biology=64,Communication=28,Endurance=64,Hauling=48,Literature=51,Mathematics=37,PhysicalEducation=28,RussianLanguage=43,Strength=45 items=Panties:White:worn,Socks:Black:worn,Pants:Black:worn,Shirt:Gray:worn,WinterBoots:Gray:worn,FurCoat:Beige:worn,Hat:Black:worn,PeShirt:Blue:home,PeShorts:Green:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f17.c2 Иванова Полина Александровна female=True roles=student class=class-classroom-03 born=2001-05-21 traits=Gossip,HotTempered skills=Agility=36,Biology=43,Communication=45,Endurance=45,Hauling=47,Literature=43,Mathematics=33,PhysicalEducation=58,RussianLanguage=36,Strength=45,UkrainianLanguage=15 items=Panties:Black:worn,Socks:Black:worn,Pants:Black:worn,TShirt:Beige:worn,WinterBoots:Gray:worn,Sweater:Gray:worn,Coat:Beige:worn,Belt:Beige:worn,PeShirt:Red:home,PeShorts:Gray:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f17.p0 Иванов Александр Владимирович female=False roles=parent class=- born=1967-12-24 traits=Diligent,HeatLoving skills=Agility=47,Communication=74,Endurance=52,Hauling=55,Physics=39,RussianLanguage=27,Strength=49 items=Briefs:Black:worn,Socks:Gray:worn,Jeans:Blue:worn,TShirt:Blue:worn,WinterBoots:Black:worn,Belt:Beige:worn,FurCoat:Black:home +person f17.p1 Иванова Александра Ивановна female=True roles=parent class=- born=1967-04-25 traits= skills=Agility=40,Communication=69,Endurance=63,Hauling=35,RussianLanguage=56,Strength=68,UkrainianLanguage=19 items=Panties:White:worn,Bra:Gray:worn,Socks:Black:worn,Jeans:Blue:worn,Shirt:Black:worn,WinterBoots:Gray:worn,Jacket:Black:home +person f18.c0 Лебедев Александр Валериевич female=False roles=student class=class-classroom-00 born=2004-02-16 traits=Curious skills=Agility=26,Biology=50,Communication=9,Endurance=53,Hauling=33,Literature=55,Mathematics=20,PhysicalEducation=56,RussianLanguage=23,Strength=35 items=Boxers:Black:worn,Socks:Black:worn,Pants:Black:worn,Shirt:White:worn,WinterBoots:Beige:worn,Sweater:Beige:worn,Jacket:Blue:worn,Belt:Gray:worn,PeShirt:Blue:home,PeShorts:Green:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f18.p0 Лебедев Валерий Романович female=False roles=parent class=- born=1985-03-29 traits=Neat,Quiet skills=Agility=25,Chemistry=56,Communication=59,Endurance=35,English=49,Geography=50,Hauling=35,Pedagogy=51,RussianLanguage=67,Strength=62 items=Briefs:Gray:worn,Socks:Black:worn,Pants:Black:worn,Shirt:Gray:worn,Shoes:Beige:worn,FurCoat:Gray:worn,Belt:Beige:worn,Bottle:Green:bag +person f18.p1 Лебедева Юлия Михаиловна female=True roles=parent class=- born=1981-01-26 traits= skills=Administration=54,Agility=59,BelarusianLanguage=36,Biology=68,Communication=52,Endurance=44,Hauling=67,Mathematics=47,Medicine=37,RussianLanguage=48,Strength=45,UkrainianLanguage=22 items=Panties:Gray:worn,SoftBra:White:worn,Socks:Gray:worn,Dress:Blue:worn,Shoes:Beige:worn,Hat:Black:worn,Belt:Black:worn,Jacket:Gray:home,Phone:Black:bag +person f19.c0 Воробьёв Григорий Михаилович female=False roles=student class=class-classroom-00 born=2004-08-29 traits=Outgoing skills=Agility=62,BelarusianLanguage=31,Biology=42,Communication=36,Endurance=50,Hauling=39,Literature=34,Mathematics=37,PhysicalEducation=50,RussianLanguage=33,Strength=45,UkrainianLanguage=23 items=Briefs:Black:worn,Socks:White:worn,Pants:Blue:worn,Shirt:Blue:worn,Shoes:Gray:worn,Sweater:Black:worn,Coat:Gray:worn,PeShirt:Blue:home,PeShorts:Black:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f19.p0 Воробьёв Михаил Егорович female=False roles=parent class=- born=1978-11-03 traits=Leader skills=Administration=53,Agility=40,Communication=56,Endurance=46,Hauling=41,Librarianship=66,Mathematics=42,RussianLanguage=45,Strength=55 items=Briefs:Black:worn,Socks:Black:worn,Pants:Black:worn,Shirt:Black:worn,Shoes:Beige:worn,Hat:Black:worn,Jacket:Green:home,Bottle:Blue:bag +person f19.p1 Воробьёва Вера Алексеевна female=True roles=parent class=- born=1982-08-29 traits=AbsentMinded,Lazy skills=Administration=50,Agility=58,BelarusianLanguage=20,Communication=46,Endurance=30,Hauling=50,PhysicalEducation=66,RussianLanguage=49,Strength=40,UkrainianLanguage=25 items=Panties:Black:worn,Bra:Gray:worn,Socks:Gray:worn,Skirt:Blue:worn,TShirt:Blue:worn,WinterBoots:Gray:worn,Coat:Gray:home,Bottle:Green:bag +person f2.c0 Алексеев Григорий Константинович female=False roles=student class=class-classroom-02 born=2002-07-24 traits=Neat skills=Agility=40,BelarusianLanguage=36,Biology=64,Communication=34,Endurance=57,Hauling=38,Literature=58,Mathematics=41,PhysicalEducation=47,RussianLanguage=28,Strength=45,UkrainianLanguage=23 items=Briefs:White:worn,Socks:Gray:worn,Jeans:Blue:worn,TShirt:Black:worn,Shoes:Black:worn,FurCoat:Gray:home,PeShirt:Red:home,PeShorts:Red:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f2.p0 Алексеев Константин Романович female=False roles=parent class=- born=1974-12-11 traits=Neat skills=Agility=36,BelarusianLanguage=23,Communication=60,Endurance=49,English=34,Hauling=47,Mathematics=63,Medicine=81,Pedagogy=74,RussianLanguage=56,Strength=59,UkrainianLanguage=22 items=Boxers:Gray:worn,Socks:White:worn,Pants:Beige:worn,Shirt:Black:worn,WinterBoots:Beige:worn,Sweater:Black:worn,Hat:Black:worn,FurCoat:Gray:home +person f2.p1 Алексеева Ольга Романовна female=True roles=parent class=- born=1970-07-22 traits=Outgoing skills=Agility=50,Communication=58,Cooking=51,Endurance=43,English=55,Hauling=54,Literature=35,Medicine=76,PhysicalEducation=32,RussianLanguage=38,Strength=42 items=Panties:Beige:worn,Bra:Gray:worn,Socks:White:worn,Skirt:Black:worn,Shirt:Black:worn,Shoes:Beige:worn,Coat:Beige:home,Bottle:White:bag +person f20.c0 Павлова Елена Игоревна female=True roles=student class=class-classroom-01 born=2002-11-09 traits= skills=Agility=55,Biology=47,Communication=19,Endurance=51,Hauling=38,Literature=41,Mathematics=34,PhysicalEducation=49,RussianLanguage=44,Strength=42,UkrainianLanguage=20 items=Panties:White:worn,Socks:Gray:worn,Pants:Black:worn,TShirt:Blue:worn,WinterBoots:Beige:worn,Hat:Beige:worn,Belt:Gray:worn,Coat:Gray:home,PeShirt:Red:home,PeShorts:Gray:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f20.c1 Павлова Валентина Игоревна female=True roles=student class=class-classroom-03 born=2001-01-24 traits=HotTempered skills=Agility=68,BelarusianLanguage=12,Biology=41,Communication=31,Endurance=58,Hauling=46,Literature=42,Mathematics=19,PhysicalEducation=50,RussianLanguage=45,Strength=42,UkrainianLanguage=9 items=Panties:White:worn,SoftBra:Beige:worn,Socks:White:worn,Trousers:Blue:worn,Shirt:Blue:worn,Shoes:Black:worn,FurCoat:Beige:home,PeShirt:Green:home,PeShorts:Blue:home,Bottle:Green:bag,Phone:Black:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f20.p0 Павлов Игорь Никитич female=False roles=parent class=- born=1968-08-01 traits=HotTempered,Neat skills=Administration=61,Agility=72,Communication=57,Endurance=43,Geography=61,German=73,Hauling=44,Pedagogy=56,RussianLanguage=66,Strength=42,UkrainianLanguage=28 items=Briefs:Black:worn,Socks:White:worn,Trousers:Black:worn,TShirt:Blue:worn,WinterBoots:Gray:worn,FurCoat:Black:home,Bottle:White:bag +person f20.p1 Павлова Людмила Дмитриевна female=True roles=parent class=- born=1970-01-17 traits=ColdLoving,Quiet skills=Agility=46,BelarusianLanguage=26,Communication=71,Endurance=39,English=31,Hauling=36,Physics=42,RussianLanguage=53,Strength=56 items=Panties:White:worn,Bra:Gray:worn,Socks:Black:worn,Pants:Beige:worn,TShirt:Blue:worn,Shoes:White:worn,FurCoat:Beige:worn,Hat:Black:worn +person f21.c0 Ильин Андрей Константинович female=False roles=student class=class-classroom-02 born=2002-05-12 traits= skills=Agility=54,BelarusianLanguage=15,Biology=72,Communication=22,Endurance=54,Hauling=58,Literature=58,Mathematics=45,PhysicalEducation=52,RussianLanguage=38,Strength=45,UkrainianLanguage=25 items=Boxers:Black:worn,Socks:Black:worn,Jeans:Black:worn,TShirt:White:worn,WinterBoots:Black:worn,Sweater:Black:worn,Jacket:Black:worn,PeShirt:Gray:home,PeShorts:Blue:home,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f21.p0 Ильин Константин Никитич female=False roles=parent class=- born=1971-01-21 traits=Diligent,Outgoing skills=Agility=45,Biology=50,Communication=53,Endurance=40,English=46,Hauling=45,History=42,Librarianship=57,RussianLanguage=68,Strength=40,UkrainianLanguage=9 items=Briefs:Gray:worn,Socks:Black:worn,Trousers:Black:worn,Shirt:Black:worn,Shoes:White:worn,Scarf:Black:worn,FurCoat:Beige:home,Bottle:Blue:bag +person f21.p1 Ильина Яна Борисовна female=True roles=parent class=- born=1975-04-20 traits=Lazy skills=Agility=74,BelarusianLanguage=26,Biology=41,Communication=54,Endurance=55,English=77,Hauling=35,Librarianship=44,Medicine=57,RussianLanguage=35,Strength=50,UkrainianLanguage=23 items=Panties:Black:worn,SportsBra:White:worn,Socks:White:worn,Jeans:Gray:worn,TShirt:White:worn,WinterBoots:Beige:worn,Sweater:Black:worn,Hat:Blue:worn,Belt:Gray:worn,Coat:Gray:home +person f22.c0 Захаров Никита Виталиевич female=False roles=student class=class-classroom-03 born=2000-09-14 traits= skills=Agility=62,BelarusianLanguage=19,Biology=50,Communication=42,Endurance=39,Hauling=47,Literature=68,Mathematics=65,PhysicalEducation=60,RussianLanguage=59,Strength=45,UkrainianLanguage=31 items=Briefs:Gray:worn,Socks:White:worn,Jeans:Gray:worn,TShirt:Beige:worn,Shoes:Beige:worn,FurCoat:Gray:home,PeShirt:Black:home,PeShorts:Blue:home,Bottle:White:bag,Phone:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f22.c1 Захаров Денис Виталиевич female=False roles=student class=class-classroom-02 born=2001-09-11 traits=Kind,Leader skills=Agility=51,Biology=42,Communication=55,Endurance=51,Hauling=69,Literature=53,Mathematics=60,PhysicalEducation=80,RussianLanguage=50,Strength=53,UkrainianLanguage=16 items=Boxers:White:worn,Socks:White:worn,Trousers:Blue:worn,TShirt:Blue:worn,Shoes:White:worn,Hat:Blue:worn,Coat:Beige:home,PeShirt:Red:home,PeShorts:Red:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f22.p0 Захаров Виталий Андреевич female=False roles=parent class=- born=1966-04-08 traits= skills=Agility=29,Communication=62,Endurance=82,Hauling=33,RussianLanguage=65,Strength=58,UkrainianLanguage=18 items=Briefs:Black:worn,Socks:Black:worn,Pants:Beige:worn,TShirt:LightBlue:worn,Shoes:Black:worn,Coat:Black:worn,Hat:Gray:worn,Bottle:White:bag,Phone:Black:bag +person f22.p1 Захарова Елизавета Егоровна female=True roles=parent class=- born=1967-09-05 traits= skills=Administration=37,Agility=42,BelarusianLanguage=28,Communication=82,Cooking=65,Endurance=60,English=52,Hauling=37,Mathematics=67,RussianLanguage=54,Strength=51 items=Panties:Gray:worn,SoftBra:White:worn,Socks:White:worn,Trousers:Gray:worn,TShirt:LightBlue:worn,WinterBoots:Gray:worn,Jacket:Gray:home,Phone:White:bag +person f23.c0 Орловская Нина Константиновна female=True roles=student class=class-classroom-02 born=2001-11-01 traits=AbsentMinded,Quiet skills=Agility=44,BelarusianLanguage=13,Biology=42,Communication=9,Endurance=51,Hauling=45,Literature=53,Mathematics=34,PhysicalEducation=70,RussianLanguage=46,Strength=38 items=Panties:White:worn,Socks:White:worn,Trousers:Blue:worn,TShirt:Blue:worn,Shoes:Beige:worn,Sweater:Blue:worn,Coat:Beige:worn,Hat:Gray:worn,PeShirt:Blue:home,PeShorts:Red:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f23.c1 Орловская Полина Константиновна female=True roles=student class=class-classroom-01 born=2003-03-30 traits=ColdLoving,Quiet skills=Agility=39,BelarusianLanguage=20,Biology=70,Communication=19,Endurance=53,Hauling=54,Literature=73,Mathematics=46,PhysicalEducation=55,RussianLanguage=47,Strength=67 items=Panties:White:worn,Socks:Black:worn,Dress:Blue:worn,Shoes:Black:worn,Sweater:Beige:worn,Jacket:Red:home,PeShirt:Black:home,PeShorts:Gray:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f23.p0 Орловский Константин Михаилович female=False roles=parent class=- born=1965-04-02 traits=Diligent,HeatLoving skills=Agility=45,BelarusianLanguage=23,Communication=55,Endurance=50,Hauling=50,History=40,Librarianship=56,Physics=61,RussianLanguage=52,Strength=32,UkrainianLanguage=17 items=Briefs:Gray:worn,Socks:White:worn,Jeans:Gray:worn,Shirt:Blue:worn,WinterBoots:Beige:worn,FurCoat:Black:worn,Hat:Beige:worn +person f23.p1 Орловская Яна Степановна female=True roles=parent class=- born=1965-10-22 traits=Leader skills=Agility=56,BelarusianLanguage=28,Communication=44,Endurance=40,Hauling=81,Pedagogy=45,RussianLanguage=62,Strength=56,UkrainianLanguage=26 items=Panties:Gray:worn,SportsBra:Gray:worn,Socks:White:worn,Pants:Black:worn,Shirt:White:worn,WinterBoots:Black:worn,Sweater:Blue:worn,Hat:Blue:worn,Jacket:Red:home +person f24.c0 Орлов Фёдор Алексеевич female=False roles=student class=class-classroom-03 born=2000-12-05 traits=Neat skills=Agility=40,BelarusianLanguage=8,Biology=54,Communication=6,Endurance=40,Hauling=45,Literature=41,Mathematics=10,PhysicalEducation=46,RussianLanguage=52,Strength=63 items=Briefs:Black:worn,Socks:Black:worn,Jeans:Gray:worn,Shirt:Black:worn,Shoes:Gray:worn,Sweater:Black:worn,Jacket:Blue:worn,PeShirt:Blue:home,PeShorts:Blue:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f24.c1 Орлова Оксана Алексеевна female=True roles=student class=class-classroom-00 born=2004-03-01 traits=HotTempered,Kind skills=Agility=75,Biology=30,Communication=23,Endurance=54,Hauling=35,Literature=62,Mathematics=49,PhysicalEducation=58,RussianLanguage=26,Strength=41,UkrainianLanguage=31 items=Panties:Beige:worn,Socks:White:worn,Pants:Beige:worn,TShirt:White:worn,WinterBoots:Black:worn,Scarf:Beige:worn,Jacket:Red:home,PeShirt:Black:home,PeShorts:Red:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f24.p0 Орлов Алексей Денисович female=False roles=parent class=- born=1977-04-17 traits= skills=Agility=45,BelarusianLanguage=17,Communication=51,Endurance=18,English=61,Hauling=46,Literature=56,Mathematics=60,RussianLanguage=55,Strength=62,UkrainianLanguage=16 items=Boxers:Black:worn,Socks:Black:worn,Trousers:Gray:worn,Shirt:Gray:worn,WinterBoots:Black:worn,Sweater:Black:worn,Hat:Gray:worn,Jacket:Black:home +person f24.p1 Орлова Надежда Владиславовна female=True roles=parent class=- born=1977-12-04 traits=Kind skills=Agility=25,BelarusianLanguage=25,Communication=52,Endurance=22,English=70,Hauling=52,Librarianship=51,Medicine=10,RussianLanguage=50,Strength=52,UkrainianLanguage=19 items=Panties:Beige:worn,SoftBra:Gray:worn,Socks:Gray:worn,Pants:Gray:worn,TShirt:LightBlue:worn,Shoes:Black:worn,Sweater:Blue:worn,FurCoat:Beige:worn,Hat:Black:worn,Belt:Beige:worn +person f25.c0 Петрова Александра Игоревна female=True roles=student class=class-classroom-02 born=2001-12-19 traits= skills=Agility=57,BelarusianLanguage=29,Biology=64,Communication=32,Endurance=40,Hauling=58,Literature=47,Mathematics=40,PhysicalEducation=79,RussianLanguage=64,Strength=65,UkrainianLanguage=7 items=Panties:White:worn,Socks:White:worn,Trousers:Black:worn,TShirt:Blue:worn,WinterBoots:Black:worn,Sweater:Gray:worn,Coat:Beige:worn,Hat:Beige:worn,Scarf:Beige:worn,PeShirt:Red:home,PeShorts:Blue:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f25.p1 Петрова Полина Юриевна female=True roles=parent class=- born=1965-12-11 traits=Kind,Neat skills=Agility=53,Communication=50,Endurance=59,English=70,Geography=41,Hauling=56,Medicine=42,RussianLanguage=72,Strength=45 items=Panties:Gray:worn,SportsBra:White:worn,Socks:Black:worn,Trousers:Gray:worn,TShirt:Black:worn,WinterBoots:Beige:worn,Sweater:Black:worn,Coat:Gray:home +person f26.c0 Яковлев Павел Михаилович female=False roles=student class=class-classroom-01 born=2002-12-29 traits=Kind,Outgoing skills=Agility=45,BelarusianLanguage=30,Biology=59,Communication=8,Endurance=59,Hauling=53,Literature=60,Mathematics=47,PhysicalEducation=43,RussianLanguage=43,Strength=45,UkrainianLanguage=23 items=Boxers:White:worn,Socks:White:worn,Pants:Beige:worn,TShirt:LightBlue:worn,Shoes:Black:worn,Sweater:Blue:worn,Coat:Beige:worn,PeShirt:Gray:home,PeShorts:Red:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f26.c1 Яковлев Вадим Михаилович female=False roles=student class=class-classroom-00 born=2004-06-28 traits= skills=Agility=40,BelarusianLanguage=24,Biology=36,Communication=14,Endurance=66,Hauling=41,Literature=71,Mathematics=26,PhysicalEducation=55,RussianLanguage=25,Strength=40,UkrainianLanguage=18 items=Briefs:Black:worn,Socks:Black:worn,Jeans:Blue:worn,TShirt:Black:worn,Shoes:Black:worn,FurCoat:Black:home,PeShirt:Blue:home,PeShorts:Red:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f26.p0 Яковлев Михаил Степанович female=False roles=parent class=- born=1975-12-27 traits=HeatLoving,Outgoing skills=Agility=44,Communication=59,Endurance=66,Hauling=52,Mathematics=44,Medicine=71,PhysicalEducation=53,RussianLanguage=55,Strength=45,UkrainianLanguage=28 items=Briefs:Black:worn,Socks:Black:worn,Jeans:Blue:worn,TShirt:Black:worn,Shoes:Gray:worn,Scarf:Blue:worn,Jacket:Blue:home,Phone:Gray:bag +person f26.p1 Яковлева Марина Кирилловна female=True roles=parent class=- born=1976-12-10 traits=Diligent,Outgoing skills=Agility=36,BelarusianLanguage=22,Communication=53,Endurance=66,English=40,Hauling=47,History=43,Medicine=66,PhysicalEducation=45,RussianLanguage=65,Strength=43 items=Panties:Gray:worn,SportsBra:White:worn,Socks:Black:worn,Skirt:Blue:worn,TShirt:Blue:worn,WinterBoots:Beige:worn,Coat:Beige:home,Bottle:Green:bag,Phone:Gray:bag +person f27.c0 Иванов Виктор Константинович female=False roles=student class=class-classroom-01 born=2002-12-27 traits=Bully skills=Agility=29,BelarusianLanguage=19,Biology=56,Communication=26,Endurance=46,Hauling=65,Literature=45,Mathematics=53,PhysicalEducation=58,RussianLanguage=27,Strength=45,UkrainianLanguage=22 items=Boxers:Black:worn,Socks:Gray:worn,Pants:Gray:worn,TShirt:Gray:worn,Shoes:Beige:worn,FurCoat:Black:worn,PeShirt:Gray:home,PeShorts:Red:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f27.c1 Иванов Владислав Константинович female=False roles=student class=class-classroom-00 born=2004-07-04 traits=Gossip,Neat skills=Agility=38,BelarusianLanguage=23,Biology=27,Communication=31,Endurance=53,Hauling=65,Literature=62,Mathematics=25,PhysicalEducation=64,RussianLanguage=43,Strength=53 items=Boxers:White:worn,Socks:White:worn,Trousers:Black:worn,Shirt:Gray:worn,WinterBoots:Black:worn,Sweater:Blue:worn,Jacket:Gray:worn,Hat:Gray:worn,Scarf:Blue:worn,PeShirt:Blue:home,PeShorts:Green:home,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f27.c2 Иванов Александр Константинович female=False roles=student class=class-classroom-00 born=2004-05-25 traits= skills=Agility=58,Biology=51,Communication=37,Endurance=60,Hauling=37,Literature=65,Mathematics=35,PhysicalEducation=33,RussianLanguage=42,Strength=45,UkrainianLanguage=38 items=Boxers:Black:worn,Socks:Black:worn,Pants:Black:worn,TShirt:White:worn,WinterBoots:Beige:worn,Sweater:Black:worn,Hat:Beige:worn,Scarf:Blue:worn,FurCoat:Gray:home,PeShirt:Blue:home,PeShorts:Black:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f27.p0 Иванов Константин Иванович female=False roles=parent class=- born=1974-08-25 traits=Outgoing skills=Agility=44,BelarusianLanguage=27,Communication=77,Endurance=42,English=53,Hauling=62,Medicine=52,Pedagogy=40,RussianLanguage=32,Strength=28 items=Boxers:Black:worn,Socks:Black:worn,Trousers:Blue:worn,Shirt:Blue:worn,Shoes:Gray:worn,Sweater:Blue:worn,Scarf:Beige:worn,Jacket:Green:home,Bottle:White:bag,Phone:White:bag +person f27.p1 Иванова Марина Константиновна female=True roles=parent class=- born=1969-11-29 traits=Curious skills=Agility=43,BelarusianLanguage=16,Communication=71,Endurance=63,English=50,Hauling=59,RussianLanguage=56,Strength=35,UkrainianLanguage=21 items=Panties:Beige:worn,SoftBra:Gray:worn,Socks:Black:worn,Skirt:Black:worn,TShirt:Beige:worn,Shoes:Gray:worn,Sweater:Black:worn,FurCoat:Gray:worn,Hat:Black:worn,Belt:Gray:worn,Bottle:Green:bag,Phone:Black:bag +person f28.c0 Иванов Пётр Петрович female=False roles=student class=class-classroom-02 born=2002-08-02 traits= skills=Agility=43,BelarusianLanguage=34,Biology=36,Communication=42,Endurance=50,Hauling=36,Literature=33,Mathematics=4,PhysicalEducation=78,RussianLanguage=46,Strength=44 items=Briefs:Gray:worn,Socks:White:worn,Pants:Beige:worn,Shirt:Gray:worn,WinterBoots:Black:worn,Sweater:Blue:worn,Jacket:Red:home,PeShirt:Green:home,PeShorts:Green:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f28.c1 Иванова Наталья Петровна female=True roles=student class=class-classroom-03 born=2000-12-07 traits=Quiet skills=Agility=58,BelarusianLanguage=30,Biology=46,Communication=52,Endurance=36,Hauling=58,Literature=38,Mathematics=73,PhysicalEducation=77,RussianLanguage=51,Strength=45,UkrainianLanguage=23 items=Panties:Gray:worn,SoftBra:Gray:worn,Socks:Black:worn,Skirt:Blue:worn,Shirt:Black:worn,WinterBoots:Black:worn,Sweater:Black:worn,Hat:Blue:worn,Jacket:Black:home,PeShirt:Blue:home,PeShorts:Black:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f28.c2 Иванов Максим Петрович female=False roles=student class=class-classroom-00 born=2004-04-05 traits=Lazy skills=Agility=67,BelarusianLanguage=23,Biology=32,Communication=26,Endurance=54,Hauling=51,Literature=57,Mathematics=10,PhysicalEducation=57,RussianLanguage=47,Strength=75,UkrainianLanguage=35 items=Boxers:Black:worn,Socks:Gray:worn,Pants:Beige:worn,TShirt:Black:worn,Shoes:Gray:worn,Sweater:Gray:worn,Scarf:Black:worn,Coat:Black:home,PeShirt:Black:home,PeShorts:Red:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f28.p0 Иванов Пётр Олегович female=False roles=parent class=- born=1965-06-23 traits=AbsentMinded,Kind skills=Agility=75,BelarusianLanguage=24,Biology=51,Communication=60,Cooking=51,Endurance=74,English=57,Geography=66,Hauling=48,RussianLanguage=45,Strength=40,UkrainianLanguage=36 items=Boxers:Black:worn,Socks:Gray:worn,Trousers:Black:worn,Shirt:White:worn,Shoes:White:worn,Sweater:Black:worn,Coat:Gray:worn,Hat:Black:worn,Scarf:Black:worn +person f28.p1 Иванова Полина Алексеевна female=True roles=parent class=- born=1965-11-18 traits=AbsentMinded,Leader skills=Agility=43,Communication=61,Cooking=49,Endurance=43,Hauling=60,RussianLanguage=46,Strength=45 items=Panties:White:worn,SoftBra:White:worn,Socks:Black:worn,Skirt:Gray:worn,TShirt:Gray:worn,Shoes:Beige:worn,Sweater:Black:worn,FurCoat:Black:home,Bottle:Blue:bag,Phone:White:bag +person f29.c0 Макарова Ксения Александровна female=True roles=student class=class-classroom-01 born=2002-11-08 traits=Bully,HeatLoving skills=Agility=52,Biology=73,Communication=35,Endurance=53,Hauling=68,Literature=60,Mathematics=34,PhysicalEducation=67,RussianLanguage=18,Strength=45 items=Panties:Black:worn,Socks:White:worn,Pants:Blue:worn,TShirt:Gray:worn,WinterBoots:Black:worn,Jacket:Black:worn,Hat:Blue:worn,Belt:Beige:worn,PeShirt:Gray:home,PeShorts:Blue:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f29.p0 Макаров Александр Николаевич female=False roles=parent class=- born=1981-11-08 traits=AbsentMinded skills=Agility=50,BelarusianLanguage=34,Communication=44,Endurance=55,Hauling=42,Informatics=34,PhysicalEducation=74,RussianLanguage=54,Strength=64,UkrainianLanguage=10 items=Briefs:Black:worn,Socks:White:worn,Jeans:Blue:worn,Shirt:Blue:worn,WinterBoots:Black:worn,Sweater:Gray:worn,Coat:Black:worn,Hat:Gray:worn,Scarf:Black:worn,Bottle:Blue:bag,Phone:Black:bag +person f29.p1 Макарова Мария Владиславовна female=True roles=parent class=- born=1977-10-31 traits=ColdLoving,Curious skills=Administration=44,Agility=44,BelarusianLanguage=8,Communication=56,Endurance=62,English=40,Hauling=44,Medicine=15,RussianLanguage=35,Strength=52 items=Panties:White:worn,Bra:Beige:worn,Socks:Black:worn,Pants:Black:worn,Shirt:Black:worn,Shoes:Black:worn,Sweater:Black:worn,Coat:Black:home,Bottle:White:bag,Phone:White:bag +person f3.c0 Макарова Вероника Петровна female=True roles=student class=class-classroom-02 born=2002-05-15 traits= skills=Agility=68,BelarusianLanguage=24,Biology=34,Communication=45,Endurance=50,Hauling=48,Literature=37,Mathematics=41,PhysicalEducation=50,RussianLanguage=28,Strength=45,UkrainianLanguage=23 items=Panties:Gray:worn,Socks:Black:worn,Trousers:Blue:worn,Shirt:Gray:worn,WinterBoots:Gray:worn,Jacket:Black:home,PeShirt:Gray:home,PeShorts:Blue:home,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f3.c1 Макаров Роман Петрович female=False roles=student class=class-classroom-02 born=2002-04-16 traits=Lazy skills=Agility=50,BelarusianLanguage=22,Biology=59,Communication=22,Endurance=46,Hauling=51,Literature=39,Mathematics=17,PhysicalEducation=37,RussianLanguage=31,Strength=45,UkrainianLanguage=23 items=Boxers:Gray:worn,Socks:Black:worn,Jeans:Blue:worn,Shirt:White:worn,WinterBoots:Black:worn,Hat:Beige:worn,Coat:Black:home,PeShirt:Black:home,PeShorts:Black:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f3.p0 Макаров Пётр Егорович female=False roles=parent class=- born=1977-02-28 traits=Diligent,Outgoing skills=Agility=67,Communication=28,Endurance=53,English=57,Hauling=43,History=43,Pedagogy=54,RussianLanguage=43,Strength=40 items=Briefs:Black:worn,Socks:White:worn,Pants:Gray:worn,Shirt:Blue:worn,WinterBoots:Black:worn,Sweater:Beige:worn,Hat:Beige:worn,Coat:Black:home +person f3.p1 Макарова Алина Антоновна female=True roles=parent class=- born=1978-04-05 traits=HotTempered,Outgoing skills=Agility=45,BelarusianLanguage=20,Biology=41,Communication=45,Cooking=68,Endurance=51,English=54,Hauling=52,History=69,Medicine=78,RussianLanguage=63,Strength=44 items=Panties:Beige:worn,SportsBra:Black:worn,Socks:Black:worn,Pants:Blue:worn,TShirt:LightBlue:worn,Shoes:Black:worn,Hat:Beige:worn,FurCoat:Beige:home,Phone:Black:bag +person f30.c0 Иванова Светлана Владимировна female=True roles=student class=class-classroom-03 born=2000-10-08 traits=Leader skills=Agility=43,Biology=53,Communication=26,Endurance=44,Hauling=49,Literature=68,Mathematics=39,PhysicalEducation=73,RussianLanguage=51,Strength=36,UkrainianLanguage=21 items=Panties:White:worn,SoftBra:Beige:worn,Socks:Gray:worn,Dress:Blue:worn,Shoes:Gray:worn,Coat:Black:worn,Hat:Blue:worn,Scarf:Gray:worn,PeShirt:Gray:home,PeShorts:Black:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f30.c1 Иванова Надежда Владимировна female=True roles=student class=class-classroom-03 born=2000-12-10 traits=AbsentMinded,Kind skills=Agility=43,BelarusianLanguage=19,Biology=57,Communication=38,Endurance=66,Hauling=46,Literature=70,Mathematics=23,PhysicalEducation=56,RussianLanguage=41,Strength=40,UkrainianLanguage=10 items=Panties:White:worn,SoftBra:Beige:worn,Socks:Black:worn,Dress:Gray:worn,Shoes:Black:worn,Scarf:Beige:worn,Jacket:Blue:home,PeShirt:Blue:home,PeShorts:Red:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f30.p0 Иванов Владимир Денисович female=False roles=parent class=- born=1974-06-12 traits=Leader skills=Agility=40,Biology=17,Communication=72,Cooking=61,Endurance=50,Hauling=32,RussianLanguage=58,Strength=40,UkrainianLanguage=26 items=Boxers:Black:worn,Socks:Black:worn,Trousers:Black:worn,Shirt:Gray:worn,WinterBoots:Gray:worn,Coat:Beige:home,Bottle:Blue:bag +person f30.p1 Иванова Мария Андреевна female=True roles=parent class=- born=1973-09-24 traits=Diligent skills=Agility=52,BelarusianLanguage=40,Communication=61,Endurance=62,Hauling=65,Medicine=47,RussianLanguage=43,Strength=39 items=Panties:White:worn,Bra:Gray:worn,Socks:Black:worn,Jeans:Blue:worn,Shirt:Gray:worn,WinterBoots:Black:worn,Sweater:Beige:worn,Jacket:Black:home,Bottle:Blue:bag,Phone:Black:bag +person f31.c0 Иванов Николай Вадимович female=False roles=student class=class-classroom-01 born=2003-08-29 traits= skills=Agility=20,BelarusianLanguage=24,Biology=40,Communication=27,Endurance=43,Hauling=46,Literature=36,Mathematics=40,PhysicalEducation=53,RussianLanguage=32,Strength=73,UkrainianLanguage=20 items=Briefs:Gray:worn,Socks:White:worn,Jeans:Black:worn,TShirt:Beige:worn,WinterBoots:Beige:worn,FurCoat:Black:home,PeShirt:Blue:home,PeShorts:Black:home,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f31.p0 Иванов Вадим Андреевич female=False roles=parent class=- born=1985-06-23 traits=Curious,Quiet skills=Administration=28,Agility=45,BelarusianLanguage=32,Communication=54,Endurance=71,English=55,German=47,Hauling=53,PhysicalEducation=44,RussianLanguage=64,Strength=44,UkrainianLanguage=17 items=Boxers:White:worn,Socks:White:worn,Jeans:Black:worn,Shirt:Black:worn,Shoes:Black:worn,Hat:Blue:worn,Coat:Gray:home,Bottle:Blue:bag,Phone:Gray:bag +person f31.p1 Иванова Александра Юриевна female=True roles=parent class=- born=1980-08-20 traits=Diligent,HeatLoving skills=Agility=70,BelarusianLanguage=29,Communication=50,Endurance=41,English=50,Hauling=51,Librarianship=35,PhysicalEducation=73,Physics=54,RussianLanguage=59,Strength=62,UkrainianLanguage=23 items=Panties:Beige:worn,SportsBra:Blue:worn,Socks:Gray:worn,Trousers:Blue:worn,Shirt:Blue:worn,WinterBoots:Beige:worn,Hat:Black:worn,Scarf:Blue:worn,Jacket:Black:home,Bottle:Green:bag +person f32.c0 Петров Артём Евгениевич female=False roles=student class=class-classroom-02 born=2002-07-14 traits=Neat skills=Agility=78,Biology=58,Communication=47,Endurance=32,Hauling=19,Literature=31,Mathematics=29,PhysicalEducation=60,RussianLanguage=65,Strength=18,UkrainianLanguage=18 items=Boxers:Black:worn,Socks:Black:worn,Trousers:Blue:worn,Shirt:Gray:worn,Shoes:Beige:worn,Sweater:Black:worn,FurCoat:Black:worn,PeShirt:Gray:home,PeShorts:Gray:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f32.c1 Петрова Елена Евгениевна female=True roles=student class=class-classroom-00 born=2003-10-27 traits=Bully,Curious skills=Agility=37,Biology=54,Communication=39,Endurance=60,Hauling=53,Literature=54,Mathematics=39,PhysicalEducation=75,RussianLanguage=34,Strength=45,UkrainianLanguage=30 items=Panties:Gray:worn,Socks:Black:worn,Pants:Blue:worn,TShirt:White:worn,Shoes:Gray:worn,Coat:Black:worn,Hat:Gray:worn,Belt:Gray:worn,PeShirt:Blue:home,PeShorts:Green:home,Bottle:Green:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f32.c2 Петрова Ирина Евгениевна female=True roles=student class=class-classroom-02 born=2001-09-18 traits=Kind,Quiet skills=Agility=41,BelarusianLanguage=32,Biology=80,Communication=32,Endurance=42,Hauling=67,Literature=51,Mathematics=26,PhysicalEducation=33,RussianLanguage=32,Strength=45 items=Panties:White:worn,Socks:White:worn,Dress:Beige:worn,WinterBoots:Black:worn,Sweater:Black:worn,Jacket:Beige:worn,Belt:Gray:worn,PeShirt:Black:home,PeShorts:Blue:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f32.p0 Петров Евгений Станиславович female=False roles=parent class=- born=1963-05-02 traits= skills=Agility=45,Communication=66,Endurance=43,English=53,Hauling=42,PhysicalEducation=51,RussianLanguage=62,Strength=52,UkrainianLanguage=26 items=Briefs:Black:worn,Socks:White:worn,Jeans:Black:worn,Shirt:Black:worn,Shoes:White:worn,Sweater:Black:worn,Belt:Beige:worn,Coat:Beige:home,Bottle:Blue:bag +person f33.c0 Морозова Елизавета Григориевна female=True roles=student class=class-classroom-00 born=2003-11-04 traits=AbsentMinded,Lazy skills=Agility=59,BelarusianLanguage=25,Biology=55,Communication=45,Endurance=48,Hauling=50,Literature=58,Mathematics=0,PhysicalEducation=54,RussianLanguage=28,Strength=38,UkrainianLanguage=26 items=Panties:Gray:worn,Socks:Black:worn,Skirt:Gray:worn,TShirt:White:worn,Shoes:Beige:worn,Sweater:Blue:worn,Hat:Blue:worn,Scarf:Gray:worn,Coat:Gray:home,PeShirt:Gray:home,PeShorts:Green:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f33.p0 Морозов Григорий Михаилович female=False roles=parent class=- born=1968-05-01 traits= skills=Agility=28,BelarusianLanguage=8,Communication=68,Endurance=62,Hauling=51,Pedagogy=72,RussianLanguage=56,Strength=46,UkrainianLanguage=22 items=Boxers:Gray:worn,Socks:White:worn,Trousers:Gray:worn,TShirt:Blue:worn,WinterBoots:Beige:worn,Sweater:Blue:worn,Coat:Gray:home,Phone:Black:bag +person f33.p1 Морозова Марина Владимировна female=True roles=parent class=- born=1972-10-24 traits=Neat skills=Administration=54,Agility=41,BelarusianLanguage=28,Communication=42,Endurance=80,English=30,Geography=60,Hauling=41,PhysicalEducation=76,RussianLanguage=74,Strength=37 items=Panties:Beige:worn,SportsBra:White:worn,Socks:Black:worn,Dress:Blue:worn,WinterBoots:Black:worn,Hat:Beige:worn,Belt:Gray:worn,Jacket:Beige:home +person f34.c0 Кузнецова Валентина Ивановна female=True roles=student class=class-classroom-00 born=2004-03-25 traits=Bully,HotTempered skills=Agility=29,Biology=32,Communication=21,Endurance=69,Hauling=54,Literature=54,Mathematics=28,PhysicalEducation=53,RussianLanguage=16,Strength=45,UkrainianLanguage=24 items=Panties:Beige:worn,Socks:Black:worn,Pants:Black:worn,Shirt:White:worn,Shoes:Black:worn,Sweater:Gray:worn,Jacket:Black:worn,PeShirt:Green:home,PeShorts:Red:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f34.p0 Кузнецов Иван Сергеевич female=False roles=parent class=- born=1970-02-02 traits= skills=Agility=44,Communication=43,Endurance=58,English=45,German=55,Hauling=31,Literature=54,RussianLanguage=55,Strength=72 items=Boxers:Black:worn,Socks:Black:worn,Pants:Beige:worn,Shirt:Gray:worn,WinterBoots:Gray:worn,Hat:Black:worn,Scarf:Beige:worn,Coat:Black:home +person f34.p1 Кузнецова Дарья Валериевна female=True roles=parent class=- born=1967-03-25 traits=HeatLoving skills=Agility=47,BelarusianLanguage=23,Communication=52,Endurance=52,German=38,Hauling=32,Informatics=21,RussianLanguage=56,Strength=67,UkrainianLanguage=15 items=Panties:Beige:worn,Bra:Black:worn,Socks:Gray:worn,Dress:Beige:worn,Shoes:Black:worn,Sweater:Gray:worn,Jacket:Blue:home,Bottle:Blue:bag,Phone:Gray:bag +person f4.c0 Васильев Денис Федорович female=False roles=student class=class-classroom-01 born=2003-02-01 traits=Outgoing skills=Agility=50,BelarusianLanguage=9,Biology=58,Communication=27,Endurance=35,Hauling=25,Literature=52,Mathematics=53,PhysicalEducation=43,RussianLanguage=68,Strength=45,UkrainianLanguage=27 items=Boxers:Gray:worn,Socks:White:worn,Trousers:Black:worn,TShirt:Gray:worn,Shoes:Gray:worn,Sweater:Gray:worn,Jacket:Red:home,PeShirt:Black:home,PeShorts:Black:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f4.p0 Васильев Фёдор Игоревич female=False roles=parent class=- born=1970-05-21 traits=AbsentMinded skills=Agility=66,Communication=49,Endurance=44,English=25,Geography=47,Hauling=45,Medicine=44,RussianLanguage=45,Strength=47,UkrainianLanguage=31 items=Boxers:Black:worn,Socks:Black:worn,Jeans:Gray:worn,TShirt:LightBlue:worn,Shoes:Gray:worn,Coat:Beige:worn,Hat:Black:worn,Belt:Gray:worn,Phone:White:bag +person f4.p1 Васильева Анастасия Федоровна female=True roles=parent class=- born=1975-01-20 traits= skills=Agility=64,BelarusianLanguage=22,Communication=59,Endurance=64,English=43,Hauling=53,Librarianship=49,Medicine=75,RussianLanguage=49,Strength=73,UkrainianLanguage=13 items=Panties:Black:worn,SportsBra:Gray:worn,Socks:White:worn,Pants:Black:worn,Shirt:Black:worn,Shoes:Gray:worn,Hat:Black:worn,Coat:Gray:home,Bottle:White:bag +person f5.c0 Захарова Екатерина Борисовна female=True roles=student class=class-classroom-02 born=2002-07-13 traits=Kind,Lazy skills=Agility=57,BelarusianLanguage=29,Biology=72,Communication=42,Endurance=39,Hauling=29,Literature=19,Mathematics=37,PhysicalEducation=60,RussianLanguage=28,Strength=54 items=Panties:Black:worn,Socks:Black:worn,Dress:Black:worn,WinterBoots:Gray:worn,Sweater:Beige:worn,Hat:Black:worn,Coat:Black:home,PeShirt:Blue:home,PeShorts:Black:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f5.p0 Захаров Борис Николаевич female=False roles=parent class=- born=1980-04-15 traits= skills=Agility=45,BelarusianLanguage=29,Communication=37,Cooking=51,Endurance=51,Hauling=32,Pedagogy=36,RussianLanguage=66,Strength=51,UkrainianLanguage=15 items=Boxers:Black:worn,Socks:Gray:worn,Jeans:Blue:worn,Shirt:White:worn,Shoes:Gray:worn,Scarf:Beige:worn,Jacket:Gray:home +person f5.p1 Захарова Вероника Григориевна female=True roles=parent class=- born=1979-06-22 traits= skills=Administration=39,Agility=68,Communication=64,Endurance=40,English=31,Hauling=61,Informatics=35,PhysicalEducation=35,RussianLanguage=55,Strength=65 items=Panties:Beige:worn,Bra:White:worn,Socks:Black:worn,Pants:Black:worn,TShirt:LightBlue:worn,Shoes:Beige:worn,Sweater:Blue:worn,Hat:Beige:worn,Jacket:Gray:home,Bottle:White:bag +person f6.c0 Козловская Юлия Олеговна female=True roles=student class=class-classroom-00 born=2004-08-15 traits= skills=Agility=45,Biology=49,Communication=42,Endurance=61,Hauling=67,Literature=49,Mathematics=54,PhysicalEducation=39,RussianLanguage=23,Strength=58 items=Panties:Beige:worn,Socks:White:worn,Jeans:Black:worn,Shirt:Black:worn,WinterBoots:Black:worn,Sweater:Gray:worn,Coat:Gray:worn,Hat:Blue:worn,Scarf:Black:worn,PeShirt:Gray:home,PeShorts:Green:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f6.c1 Козловская Светлана Олеговна female=True roles=student class=class-classroom-02 born=2001-12-31 traits=HeatLoving,Leader skills=Agility=53,BelarusianLanguage=37,Biology=59,Communication=36,Endurance=40,Hauling=26,Literature=66,Mathematics=34,PhysicalEducation=51,RussianLanguage=53,Strength=47,UkrainianLanguage=10 items=Panties:White:worn,Socks:Black:worn,Jeans:Gray:worn,Shirt:Black:worn,WinterBoots:Beige:worn,Coat:Black:worn,Hat:Beige:worn,PeShirt:Blue:home,PeShorts:Green:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f6.c2 Козловская Вероника Олеговна female=True roles=student class=class-classroom-00 born=2003-09-29 traits=Diligent skills=Agility=55,Biology=77,Communication=27,Endurance=56,Hauling=46,Literature=56,Mathematics=40,PhysicalEducation=46,RussianLanguage=26,Strength=49,UkrainianLanguage=25 items=Panties:Gray:worn,Socks:Black:worn,Jeans:Black:worn,TShirt:White:worn,Shoes:White:worn,Coat:Gray:home,PeShirt:Blue:home,PeShorts:Red:home,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f6.p0 Козловский Олег Станиславович female=False roles=parent class=- born=1967-12-18 traits=Kind skills=Agility=42,Communication=82,Endurance=64,Hauling=52,Informatics=53,Literature=33,RussianLanguage=58,Strength=21 items=Boxers:Black:worn,Socks:Black:worn,Pants:Beige:worn,TShirt:White:worn,Shoes:White:worn,Sweater:Gray:worn,Coat:Beige:home,Bottle:Blue:bag +person f6.p1 Козловская Ирина Кирилловна female=True roles=parent class=- born=1963-12-28 traits=AbsentMinded,Kind skills=Agility=57,BelarusianLanguage=11,Communication=67,Endurance=42,English=48,Hauling=57,RussianLanguage=79,Strength=45 items=Panties:Gray:worn,SportsBra:White:worn,Socks:White:worn,Trousers:Blue:worn,TShirt:Black:worn,WinterBoots:Beige:worn,Sweater:Gray:worn,FurCoat:Black:home +person f7.c0 Андреев Виктор Степанович female=False roles=student class=class-classroom-01 born=2003-07-19 traits=Diligent,Kind skills=Agility=50,BelarusianLanguage=27,Biology=78,Communication=24,Endurance=50,Hauling=73,Literature=51,Mathematics=34,PhysicalEducation=26,RussianLanguage=56,Strength=64,UkrainianLanguage=34 items=Briefs:Gray:worn,Socks:Black:worn,Jeans:Black:worn,Shirt:Black:worn,Shoes:Gray:worn,Belt:Beige:worn,Jacket:Red:home,PeShirt:Blue:home,PeShorts:Green:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f7.p0 Андреев Степан Андреевич female=False roles=parent class=- born=1973-08-21 traits= skills=Agility=64,Communication=76,Endurance=36,English=60,Hauling=46,History=47,Literature=57,RussianLanguage=64,Strength=62,UkrainianLanguage=27 items=Briefs:Black:worn,Socks:White:worn,Jeans:Gray:worn,Shirt:Black:worn,Shoes:White:worn,Sweater:Black:worn,Hat:Beige:worn,FurCoat:Gray:home +person f7.p1 Андреева Мария Алексеевна female=True roles=parent class=- born=1977-07-16 traits=HeatLoving skills=Agility=35,BelarusianLanguage=18,Communication=56,Cooking=47,Endurance=45,Hauling=56,Medicine=47,RussianLanguage=58,Strength=64 items=Panties:Black:worn,Bra:Beige:worn,Socks:Gray:worn,Trousers:Black:worn,Shirt:Gray:worn,WinterBoots:Black:worn,Sweater:Blue:worn,Belt:Gray:worn,FurCoat:Gray:home,Bottle:Blue:bag +person f8.c0 Фролов Евгений Павелович female=False roles=student class=class-classroom-00 born=2003-12-20 traits=ColdLoving,Kind skills=Agility=69,BelarusianLanguage=26,Biology=50,Communication=28,Endurance=29,Hauling=45,Literature=52,Mathematics=37,PhysicalEducation=44,RussianLanguage=43,Strength=31,UkrainianLanguage=24 items=Boxers:Gray:worn,Socks:Black:worn,Trousers:Black:worn,Shirt:White:worn,WinterBoots:Beige:worn,Sweater:Gray:worn,FurCoat:Beige:worn,PeShirt:Green:home,PeShorts:Black:home,Bottle:Blue:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f8.c1 Фролов Станислав Павелович female=False roles=student class=class-classroom-03 born=2000-10-11 traits=AbsentMinded,Lazy skills=Agility=57,BelarusianLanguage=20,Biology=56,Communication=57,Endurance=34,Hauling=42,Literature=71,Mathematics=23,PhysicalEducation=25,RussianLanguage=39,Strength=45,UkrainianLanguage=24 items=Boxers:Black:worn,Socks:White:worn,Jeans:Black:worn,TShirt:Black:worn,Shoes:Beige:worn,Jacket:Black:worn,Hat:Black:worn,PeShirt:Red:home,PeShorts:Green:home,Bottle:White:bag,Phone:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f8.p0 Фролов Павел Егорович female=False roles=parent class=- born=1968-06-07 traits=Neat skills=Administration=51,Agility=71,Chemistry=43,Communication=87,Endurance=39,English=42,Hauling=45,Informatics=65,Librarianship=57,RussianLanguage=73,Strength=45,UkrainianLanguage=26 items=Boxers:Gray:worn,Socks:Black:worn,Trousers:Gray:worn,TShirt:White:worn,WinterBoots:Black:worn,Sweater:Gray:worn,Coat:Black:home,Phone:Black:bag +person f8.p1 Фролова Виктория Степановна female=True roles=parent class=- born=1963-10-04 traits=Curious,Leader skills=Agility=57,Chemistry=51,Communication=77,Endurance=45,English=33,Hauling=52,Librarianship=83,RussianLanguage=58,Strength=55 items=Panties:Gray:worn,SoftBra:White:worn,Socks:Black:worn,Jeans:Blue:worn,TShirt:Blue:worn,WinterBoots:Black:worn,Hat:Black:worn,Jacket:Black:home,Bottle:White:bag,Phone:White:bag +person f9.c0 Кузьмина Любовь Александровна female=True roles=student class=class-classroom-01 born=2003-06-13 traits=HotTempered skills=Agility=45,Biology=47,Communication=31,Endurance=32,Hauling=40,Literature=63,Mathematics=46,PhysicalEducation=48,RussianLanguage=41,Strength=44,UkrainianLanguage=5 items=Panties:Black:worn,Socks:Gray:worn,Skirt:Beige:worn,Shirt:Blue:worn,WinterBoots:Gray:worn,Sweater:Blue:worn,FurCoat:Beige:worn,PeShirt:Gray:home,PeShorts:Green:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f9.c1 Кузьмин Сергей Александрович female=False roles=student class=class-classroom-03 born=2001-08-20 traits=Curious,Quiet skills=Agility=11,Biology=58,Communication=41,Endurance=59,Hauling=40,Literature=39,Mathematics=31,PhysicalEducation=40,RussianLanguage=51,Strength=52 items=Briefs:Gray:worn,Socks:Black:worn,Trousers:Gray:worn,TShirt:Gray:worn,Shoes:Beige:worn,Sweater:Beige:worn,Hat:Beige:worn,Scarf:Beige:worn,Coat:Gray:home,PeShirt:Gray:home,PeShorts:Blue:home,Bottle:White:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f9.c2 Кузьмина Алина Александровна female=True roles=student class=class-classroom-03 born=2001-01-22 traits= skills=Agility=52,Biology=38,Communication=29,Endurance=53,Hauling=34,Literature=63,Mathematics=31,PhysicalEducation=55,RussianLanguage=42,Strength=63,UkrainianLanguage=12 items=Panties:White:worn,SportsBra:Gray:worn,Socks:Gray:worn,Jeans:Black:worn,TShirt:White:worn,WinterBoots:Beige:worn,Scarf:Gray:worn,FurCoat:Beige:home,PeShirt:Black:home,PeShorts:Black:home,Phone:Gray:bag,SchoolBag:-:bag,Textbook:-:bag:PhysicalEducation,Textbook:-:bag:PrimarySchool +person f9.p0 Кузьмин Александр Денисович female=False roles=parent class=- born=1981-12-09 traits= skills=Agility=40,Chemistry=55,Communication=58,Endurance=78,English=57,Hauling=43,Pedagogy=52,RussianLanguage=67,Strength=63 items=Boxers:White:worn,Socks:White:worn,Jeans:Gray:worn,Shirt:Gray:worn,Shoes:Beige:worn,FurCoat:Beige:worn,Belt:Beige:worn,Bottle:Green:bag +person f9.p1 Кузьмина Анастасия Сергеевна female=True roles=parent class=- born=1977-01-01 traits=HeatLoving skills=Agility=62,BelarusianLanguage=27,Communication=72,Endurance=92,Hauling=47,Librarianship=43,Pedagogy=48,RussianLanguage=61,Strength=34,UkrainianLanguage=21 items=Panties:Black:worn,SportsBra:White:worn,Socks:Gray:worn,Jeans:Black:worn,Shirt:Black:worn,WinterBoots:Black:worn,Sweater:Black:worn,Coat:Gray:worn,Scarf:Blue:worn,Bottle:White:bag diff --git a/tests/HSchool.Simulation.Tests/TalkCircleTests.cs b/tests/HSchool.Simulation.Tests/TalkCircleTests.cs new file mode 100644 index 0000000..7da77f9 --- /dev/null +++ b/tests/HSchool.Simulation.Tests/TalkCircleTests.cs @@ -0,0 +1,276 @@ +using Arch.Core; +using HSchool.Ai; +using HSchool.Content; +using HSchool.People; +using HSchool.Simulation; + +namespace HSchool.Simulation.Tests; + +public class TalkCircleTests +{ + private static readonly DateTime TuesdayMorning = new(2012, 4, 3, 6, 0, 0, DateTimeKind.Utc); + + [Fact] + public void FriendsOnBreakInCorridor_FormTalkCircle() + { + var (school, first, second) = TwoPupilsOnBreak(); + using (school) + { + OpinionStore.Set(first, second.Id, 55); + OpinionStore.Set(second, first.Id, 55); + PlaceAt(school, first.Id, "corridor-1"); + PlaceAt(school, second.Id, "corridor-1"); + + Assert.True(school.TryStartAction(first.Id, TalkActions.Chat)); + + var rows = school.CapturePresence(); + Assert.Equal(TalkActions.Chat, rows.Single(row => row.PersonId == first.Id).ActionId); + Assert.Equal(TalkActions.Chat, rows.Single(row => row.PersonId == second.Id).ActionId); + } + } + + [Fact] + public void EnemiesOnBreak_DoNotFormCircle() + { + var (school, first, second) = TwoPupilsOnBreak(); + using (school) + { + OpinionStore.Set(first, second.Id, -55); + OpinionStore.Set(second, first.Id, -55); + PlaceAt(school, first.Id, "corridor-1"); + PlaceAt(school, second.Id, "corridor-1"); + + Assert.False(school.TryStartAction(first.Id, TalkActions.Chat)); + Assert.Null(school.CapturePresence().Single(row => row.PersonId == first.Id).ActionId); + } + } + + [Fact] + public void FifthPerson_DoesNotJoinFullCircle() + { + var (school, pupils) = FivePupilsOnBreak(); + using (school) + { + foreach (var pupil in pupils.Take(4)) + { + PlaceAt(school, pupil.Id, "corridor-1"); + } + + PlaceAt(school, pupils[0].Id, "corridor-1"); + Assert.True(school.TryStartAction(pupils[0].Id, TalkActions.Chat)); + PlaceAt(school, pupils[4].Id, "corridor-1"); + Assert.False(school.TryStartAction(pupils[4].Id, TalkActions.Chat)); + Assert.Null(school.CapturePresence().Single(row => row.PersonId == pupils[4].Id).ActionId); + } + } + + [Fact] + public void StaffInTeachersRoom_CanStaffChat() + { + var (school, staff) = TwoStaffOnBreak(); + using (school) + { + PlaceAt(school, staff[0].Id, "teachers-room"); + PlaceAt(school, staff[1].Id, "teachers-room"); + + Assert.True(school.TryStartAction(staff[0].Id, TalkActions.StaffChat)); + Assert.Equal(TalkActions.StaffChat, ActivityOf(school, staff[0].Id)); + Assert.Equal(TalkActions.StaffChat, ActivityOf(school, staff[1].Id)); + } + } + + [Fact] + public void Pupil_CannotStaffChat() + { + var (school, first, _) = TwoPupilsOnBreak(); + using (school) + { + PlaceAt(school, first.Id, "teachers-room"); + Assert.False(school.TryStartAction(first.Id, TalkActions.StaffChat)); + } + } + + [Fact] + public void TwoWithPhoneOnBreak_CanPhoneChat() + { + var (school, first, second) = TwoPupilsWithPhonesOnBreak(); + using (school) + { + PlaceAt(school, first.Id, "corridor-1"); + PlaceAt(school, second.Id, "corridor-1"); + + Assert.True(school.TryStartAction(first.Id, TalkActions.PhoneChat)); + Assert.Equal(TalkActions.PhoneChat, ActivityOf(school, first.Id)); + Assert.Equal(TalkActions.PhoneChat, ActivityOf(school, second.Id)); + } + } + + [Fact] + public void WithoutPhone_CannotPhoneChat() + { + var (school, first, second) = TwoPupilsOnBreak(); + using (school) + { + Assert.False(TalkCircles.HasPhone(first.Items)); + PlaceAt(school, first.Id, "corridor-1"); + PlaceAt(school, second.Id, "corridor-1"); + + Assert.False(school.TryStartAction(first.Id, TalkActions.PhoneChat)); + } + } + + [Fact] + public void TalkCircle_WritesTopicToLogAndShiftsOpinion() + { + var (school, first, second) = TwoPupilsOnBreak(); + using (school) + { + OpinionStore.Set(first, second.Id, 10); + PlaceAt(school, first.Id, "corridor-1"); + PlaceAt(school, second.Id, "corridor-1"); + Assert.True(school.TryStartAction(first.Id, TalkActions.Chat)); + + while (ActivityOf(school, first.Id) is not null) + { + school.Tick(0.2d, 5d); + } + + Assert.NotEqual(10, OpinionStore.Get(first, second.Id)); + Assert.Contains( + school.DayLog, + row => row.PersonId == first.Id + && row.Type.Equals(PersonLogTypes.TalkEnded, StringComparison.Ordinal) + && row.ThingDef is not null); + } + } + + private static (School School, Person First, Person Second) TwoPupilsWithPhonesOnBreak() + { + var (catalog, map) = Vanilla(); + var school = OpenSchool(catalog, map, seed: 45); + var withPhone = school.Roster!.People + .Where(person => person.IsStudent && TalkCircles.HasPhone(person.Items)) + .Take(2) + .ToArray(); + Assert.Equal(2, withPhone.Length); + return (school, withPhone[0], withPhone[1]); + } + + private static (School School, Person First, Person Second) TwoPupilsOnBreak() + { + var (catalog, map) = Vanilla(); + var school = OpenSchool(catalog, map, seed: 42); + var schoolClass = school.Roster!.Classes.First(row => row.RoomId == "classroom-101"); + var pupils = schoolClass.PupilIds + .Select(id => school.Roster.People.First(person => person.Id == id)) + .Take(2) + .ToArray(); + return (school, pupils[0], pupils[1]); + } + + private static (School School, IReadOnlyList Pupils) FivePupilsOnBreak() + { + var (catalog, map) = Vanilla(); + var school = OpenSchool(catalog, map, seed: 43); + var schoolClass = school.Roster!.Classes.First(row => row.RoomId == "classroom-101"); + var pupils = schoolClass.PupilIds + .Select(id => school.Roster.People.First(person => person.Id == id)) + .Take(5) + .ToArray(); + return (school, pupils); + } + + private static (School School, Person[] Staff) TwoStaffOnBreak() + { + const float cap = 100_000f; + var (catalog, map) = Vanilla(); + var school = OpenSchool(catalog, map, seed: 44); + var roster = school.Roster!; + var pool = school.Applicants!; + for (var i = 0; i < 2; i++) + { + var hired = Staffing.Hire( + catalog, + map, + roster, + pool, + pool.Applicants[0].Person.Id, + Staffing.TeacherPosition, + cap); + Assert.Equal(StaffingError.None, hired.Error); + roster = hired.Roster; + pool = hired.Pool; + } + + school.ApplyStaffing(roster, pool); + var staff = school.Roster!.People.Where(person => person.IsStaff).Take(2).ToArray(); + Assert.Equal(2, staff.Length); + return (school, staff); + } + + private static School OpenSchool(DefCatalog catalog, MapLayout map, int seed) + { + var roster = RosterGenerator.Generate(catalog, map, seed, "Russia", TuesdayMorning); + var pool = ApplicantPool.Create(catalog, roster, seed, "Russia", TuesdayMorning); + var schoolClass = roster.Classes.First(row => row.RoomId == "classroom-101"); + var school = School.Create(seed, "Talk", TuesdayMorning, catalog, map); + school.InstallPeople(roster, seed, "Russia", pool); + school.SetTimetable(new HSchool.Schedule.Timetable( + [ + new HSchool.Schedule.LessonPlacement(schoolClass.Id, "Mathematics", "t1", schoolClass.RoomId, Day: 1, Period: 1), + ], + [])); + school.ConfigurePresence(weekDays: 5, maxDecisionsPerTick: 10_000); + AdvanceTo(school, new DateTime(2012, 4, 3, 9, 18, 0, DateTimeKind.Utc)); + return school; + } + + private static void AdvanceTo(School school, DateTime until) + { + while (school.Clock.Time < until) + { + school.Tick(0.2d, 5d); + } + } + + private static void PlaceAt(School school, string personId, string nodeId) + { + var query = new QueryDescription().WithAll(); + school.World.Query(in query, (ref PersonIdentity identity, ref Presence presence, ref PersonActivity activity, ref Intent intent) => + { + if (identity.Id.Equals(personId, StringComparison.Ordinal)) + { + presence = new Presence(nodeId, 0f, nodeId, false, []); + activity = PersonActivity.Idle; + intent = Intent.None; + } + }); + } + + private static string? ActivityOf(School school, string personId) => + school.CapturePresence().Single(row => row.PersonId == personId).ActionId; + + private static (DefCatalog Catalog, MapLayout Map) Vanilla() + { + var root = Path.Combine(AppContext.BaseDirectory, "vanilla"); + var documents = new List(); + foreach (var path in Directory.EnumerateFiles(root, "*.*", SearchOption.AllDirectories)) + { + if (!path.EndsWith(".jsonc", StringComparison.OrdinalIgnoreCase) + && !path.EndsWith(".json", StringComparison.OrdinalIgnoreCase)) + { + continue; + } + + documents.Add(new ContentDocument( + CatalogLoader.CorePackId, + Path.GetRelativePath(root, path).Replace('\\', '/'), + File.ReadAllText(path))); + } + + var catalog = new CatalogLoader().Load([CatalogLoader.CorePackId], documents); + var map = CatalogLoader.LastDefaultMap([CatalogLoader.CorePackId], documents); + Assert.NotNull(map); + return (catalog, map); + } +} From ef36bd5d35297cbce859abfa5a8a1d09afb95970 Mon Sep 17 00:00:00 2001 From: Leonid Pershin Date: Thu, 20 Aug 2026 08:56:30 +0300 Subject: [PATCH 2/2] phase 42: mark complete --- docs/phases/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/phases/README.md b/docs/phases/README.md index ea891ae..50db6d6 100644 --- a/docs/phases/README.md +++ b/docs/phases/README.md @@ -200,7 +200,7 @@ | Фаза | Статус | Зачем | | --- | --- | --- | -| [42. Темы и кружки](42-talk-circles.md) | ⬜ | `TopicDef`, 2–4 человека, учительская, телефон, вместе | +| [42. Темы и кружки](42-talk-circles.md) | ✅ | `TopicDef`, 2–4 человека, учительская, телефон, вместе | | [43. Шёпот и учитель](43-whisper.md) | ⬜ | Шёпот на уроке, шанс оборвать, разговор после звонка | 42 стоит на 41; 43 — на 42.