Add talk circles with TopicDef, staff/phone chat, and opinion outcomes.
This commit is contained in:
@@ -13,31 +13,31 @@
|
|||||||
|
|
||||||
## Задачи
|
## Задачи
|
||||||
|
|
||||||
- [ ] `TopicDef`: теги, возраст, роли, шёпот-на-уроке, опциональный язык
|
- [x] `TopicDef`: теги, возраст, роли, шёпот-на-уроке, опциональный язык
|
||||||
- [ ] Ванильный набор тем (учёба, игры, еда, семья, спорт, сплетни, грубое, внешность) в `core`.
|
- [x] Ванильный набор тем (учёба, игры, еда, семья, спорт, сплетни, грубое, внешность) в `core`.
|
||||||
Тема внешности учитывает уместность одежды, если сервер её уже прислал; иначе модификатор 0
|
Тема внешности учитывает уместность одежды, если сервер её уже прислал; иначе модификатор 0
|
||||||
- [ ] Кружок 2–4 в одном узле; пятый не влезает
|
- [x] Кружок 2–4 в одном узле; пятый не влезает
|
||||||
- [ ] Кого зовут: друзья и одноклассники в узле, врагов не зовут; тихоня/лидер — поля черты
|
- [x] Кого зовут: друзья и одноклассники в узле, врагов не зовут; тихоня/лидер — поля черты
|
||||||
- [ ] На перемене и в обед друзья тянутся в узел своих; враги не выбирают тот же обеденный узел,
|
- [x] На перемене и в обед друзья тянутся в узел своих; враги не выбирают тот же обеденный узел,
|
||||||
если есть другой
|
если есть другой
|
||||||
- [ ] `StaffChat` в `TeachersRoom`, только сотрудники
|
- [x] `StaffChat` в `TeachersRoom`, только сотрудники
|
||||||
- [ ] Парный телефонный чат на перемене: оба несут `Phone`, слабее живого кружка; на уроке нет
|
- [x] Парный телефонный чат на перемене: оба несут `Phone`, слабее живого кружка; на уроке нет
|
||||||
- [ ] Нет общего языка — кружок можно, сдвиг мнения слабый и чаще вниз
|
- [x] Нет общего языка — кружок можно, сдвиг мнения слабый и чаще вниз
|
||||||
- [ ] `Communication` растёт от разговора меньше, чем предмет за урок; язык разговора — капля,
|
- [x] `Communication` растёт от разговора меньше, чем предмет за урок; язык разговора — капля,
|
||||||
если не у потолка
|
если не у потолка
|
||||||
- [ ] Черты **сплетник** и **общительный** в `core` с полями, не списками в коде
|
- [x] Черты **сплетник** и **общительный** в `core` с полями, не списками в коде
|
||||||
- [ ] Исход пишет мнения всех пар кружка и строку лога
|
- [x] Исход пишет мнения всех пар кружка и строку лога
|
||||||
- [ ] На уроке обычный `Chat` не стартует (шёпот — фаза 43)
|
- [x] На уроке обычный `Chat` не стартует (шёпот — фаза 43)
|
||||||
|
|
||||||
## Тесты, без которых фаза не закрыта
|
## Тесты, без которых фаза не закрыта
|
||||||
|
|
||||||
- [ ] Двое свободных друзей в коридоре на перемене собирают кружок; враги — нет
|
- [x] Двое свободных друзей в коридоре на перемене собирают кружок; враги — нет
|
||||||
- [ ] Пятый в узле не входит в тот же кружок
|
- [x] Пятый в узле не входит в тот же кружок
|
||||||
- [ ] Сотрудники в учительской могут `StaffChat`; ученик это действие не берёт
|
- [x] Сотрудники в учительской могут `StaffChat`; ученик это действие не берёт
|
||||||
- [ ] Двое с телефоном на перемене могут парный чат; без телефона — нет
|
- [x] Двое с телефоном на перемене могут парный чат; без телефона — нет
|
||||||
- [ ] Без общего языка мнение почти не растёт при том же `Communication`
|
- [x] Без общего языка мнение почти не растёт при том же `Communication`
|
||||||
- [ ] Высокий `Communication` сильнее двигает число, чем низкий, на одной теме
|
- [x] Высокий `Communication` сильнее двигает число, чем низкий, на одной теме
|
||||||
- [ ] Каталог без `TopicDef` не стартует школу с кружками — или падает загрузка, не молча соло-Chat
|
- [x] Каталог без `TopicDef` не стартует школу с кружками — или падает загрузка, не молча соло-Chat
|
||||||
|
|
||||||
## Критерий готовности
|
## Критерий готовности
|
||||||
|
|
||||||
|
|||||||
+38
-16
@@ -41,7 +41,8 @@ public readonly record struct ActorState(
|
|||||||
IReadOnlyDictionary<string, float> Needs,
|
IReadOnlyDictionary<string, float> Needs,
|
||||||
Intent Intent,
|
Intent Intent,
|
||||||
bool LunchWindowOpen = false,
|
bool LunchWindowOpen = false,
|
||||||
ApparelActor Apparel = default);
|
ApparelActor Apparel = default,
|
||||||
|
TalkPlannerContext Talk = default);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Picks a goal by weight and plans walk-then-do. No world, no clock — a table of inputs to an
|
/// 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;
|
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)
|
if (RoomFor(catalog, map, walks, state, occupied, action) is null)
|
||||||
{
|
{
|
||||||
return Intent.None;
|
return Intent.None;
|
||||||
@@ -396,8 +407,9 @@ public static class DecisionPlanner
|
|||||||
}
|
}
|
||||||
|
|
||||||
string? best = null;
|
string? best = null;
|
||||||
var bestCost = float.PositiveInfinity;
|
var bestScore = float.NegativeInfinity;
|
||||||
var from = state.NodeId ?? walks.TerritoryId;
|
var from = state.NodeId ?? walks.TerritoryId;
|
||||||
|
var candidates = new List<string>();
|
||||||
foreach (var room in map.Rooms)
|
foreach (var room in map.Rooms)
|
||||||
{
|
{
|
||||||
if (!action.Room.Equals(room.Def, StringComparison.Ordinal))
|
if (!action.Room.Equals(room.Def, StringComparison.Ordinal))
|
||||||
@@ -410,27 +422,37 @@ public static class DecisionPlanner
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
var cost = walks.Minutes(from, room.Id);
|
candidates.Add(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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (map.Territory is { } territory
|
if (map.Territory is { } territory
|
||||||
&& action.Room.Equals(territory.Def, StringComparison.Ordinal)
|
&& action.Room.Equals(territory.Def, StringComparison.Ordinal)
|
||||||
&& HasSlot(catalog, map, occupied, territory.Id, action.Thing))
|
&& HasSlot(catalog, map, occupied, territory.Id, action.Thing))
|
||||||
{
|
{
|
||||||
var cost = walks.Minutes(from, territory.Id);
|
candidates.Add(territory.Id);
|
||||||
if (!float.IsInfinity(cost) && (best is null || cost < bestCost || (cost == bestCost && string.CompareOrdinal(territory.Id, best) < 0)))
|
}
|
||||||
|
|
||||||
|
var hasAlternative = candidates.Count > 1;
|
||||||
|
foreach (var nodeId in candidates)
|
||||||
{
|
{
|
||||||
best = territory.Id;
|
if (action.Lunch
|
||||||
|
&& TalkCircles.LunchNodeBlockedByEnemy(nodeId, state.Talk.SelfId ?? "", state.Talk, hasAlternative))
|
||||||
|
{
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,377 @@
|
|||||||
|
using HSchool.Content;
|
||||||
|
using HSchool.People;
|
||||||
|
|
||||||
|
namespace HSchool.Ai;
|
||||||
|
|
||||||
|
/// <summary>Inputs the planner needs for friend pull and lunch avoidance. Built in simulation.</summary>
|
||||||
|
public readonly record struct TalkPlannerContext(
|
||||||
|
string? SelfId,
|
||||||
|
IReadOnlyDictionary<string, int> Opinions,
|
||||||
|
IReadOnlyDictionary<string, string> PersonNodes,
|
||||||
|
string? ClassId,
|
||||||
|
bool HasPhone,
|
||||||
|
bool FriendPullActive,
|
||||||
|
BehaviorDef? Rules);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Pure talk-circle rules: who joins, which topic, opinion and skill math. No world access.
|
||||||
|
/// </summary>
|
||||||
|
public static class TalkCircles
|
||||||
|
{
|
||||||
|
public static bool BlocksOnLesson(string actionId) => TalkActions.IsTalk(actionId);
|
||||||
|
|
||||||
|
public static int MaxSize(string actionId, BehaviorDef? rules, IReadOnlyList<string> 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<InventoryItem> items) =>
|
||||||
|
items.Any(item =>
|
||||||
|
item.Def.Equals("Phone", StringComparison.Ordinal)
|
||||||
|
&& item.Location.Equals(ItemLocations.Bag, StringComparison.Ordinal));
|
||||||
|
|
||||||
|
public static float Initiative(IReadOnlyList<string> 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<string> 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Score a room node for friend pull on break or lunch.</summary>
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>True when this lunch node should be avoided because an enemy sits there.</summary>
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Best shared language skill id among participants, or null.</summary>
|
||||||
|
public static string? SharedLanguage(
|
||||||
|
DefCatalog catalog,
|
||||||
|
IReadOnlyList<Person> 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);
|
||||||
|
|
||||||
|
/// <summary>Invite priority: friends, classmates, others. Enemies never invited.</summary>
|
||||||
|
public static IReadOnlyList<string> RankInvitees(
|
||||||
|
Person initiator,
|
||||||
|
IReadOnlyList<Candidate> 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);
|
||||||
|
}
|
||||||
@@ -315,6 +315,7 @@ public sealed class CatalogLoader
|
|||||||
var holidays = new Dictionary<string, HolidayDef>(StringComparer.Ordinal);
|
var holidays = new Dictionary<string, HolidayDef>(StringComparer.Ordinal);
|
||||||
var behavior = new Dictionary<string, BehaviorDef>(StringComparer.Ordinal);
|
var behavior = new Dictionary<string, BehaviorDef>(StringComparer.Ordinal);
|
||||||
var colors = new Dictionary<string, ColorDef>(StringComparer.Ordinal);
|
var colors = new Dictionary<string, ColorDef>(StringComparer.Ordinal);
|
||||||
|
var topics = new Dictionary<string, TopicDef>(StringComparer.Ordinal);
|
||||||
|
|
||||||
foreach (var (key, json) in resolved)
|
foreach (var (key, json) in resolved)
|
||||||
{
|
{
|
||||||
@@ -380,6 +381,9 @@ public sealed class CatalogLoader
|
|||||||
case DefKind.Color:
|
case DefKind.Color:
|
||||||
colors[key.Name] = Jsonc.Deserialize<ColorDef>(json);
|
colors[key.Name] = Jsonc.Deserialize<ColorDef>(json);
|
||||||
break;
|
break;
|
||||||
|
case DefKind.Topic:
|
||||||
|
topics[key.Name] = Jsonc.Deserialize<TopicDef>(json);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -405,6 +409,7 @@ public sealed class CatalogLoader
|
|||||||
holidays,
|
holidays,
|
||||||
behavior,
|
behavior,
|
||||||
colors,
|
colors,
|
||||||
|
topics,
|
||||||
ru,
|
ru,
|
||||||
en);
|
en);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ public sealed class DefCatalog
|
|||||||
IReadOnlyDictionary<string, HolidayDef> holidays,
|
IReadOnlyDictionary<string, HolidayDef> holidays,
|
||||||
IReadOnlyDictionary<string, BehaviorDef> behavior,
|
IReadOnlyDictionary<string, BehaviorDef> behavior,
|
||||||
IReadOnlyDictionary<string, ColorDef> colors,
|
IReadOnlyDictionary<string, ColorDef> colors,
|
||||||
|
IReadOnlyDictionary<string, TopicDef> topics,
|
||||||
IReadOnlyDictionary<string, string> ru,
|
IReadOnlyDictionary<string, string> ru,
|
||||||
IReadOnlyDictionary<string, string> en)
|
IReadOnlyDictionary<string, string> en)
|
||||||
{
|
{
|
||||||
@@ -52,6 +53,7 @@ public sealed class DefCatalog
|
|||||||
Holidays = holidays;
|
Holidays = holidays;
|
||||||
Behavior = behavior;
|
Behavior = behavior;
|
||||||
Colors = colors;
|
Colors = colors;
|
||||||
|
Topics = topics;
|
||||||
_ru = ru;
|
_ru = ru;
|
||||||
_en = en;
|
_en = en;
|
||||||
AnyNeedDecays = needs.Values.Any(need => !need.Abstract && need.DecayPerHour > 0f);
|
AnyNeedDecays = needs.Values.Any(need => !need.Abstract && need.DecayPerHour > 0f);
|
||||||
@@ -109,6 +111,8 @@ public sealed class DefCatalog
|
|||||||
|
|
||||||
public IReadOnlyDictionary<string, ColorDef> Colors { get; }
|
public IReadOnlyDictionary<string, ColorDef> Colors { get; }
|
||||||
|
|
||||||
|
public IReadOnlyDictionary<string, TopicDef> Topics { get; }
|
||||||
|
|
||||||
/// <summary>The one concrete staffing ruleset, or null when a pack has not defined it.</summary>
|
/// <summary>The one concrete staffing ruleset, or null when a pack has not defined it.</summary>
|
||||||
public StaffingDef? StaffingRules => Staffing.Values.FirstOrDefault(def => !def.Abstract);
|
public StaffingDef? StaffingRules => Staffing.Values.FirstOrDefault(def => !def.Abstract);
|
||||||
|
|
||||||
@@ -145,6 +149,7 @@ public sealed class DefCatalog
|
|||||||
DefKind.Holiday => Holidays.GetValueOrDefault(defName),
|
DefKind.Holiday => Holidays.GetValueOrDefault(defName),
|
||||||
DefKind.Behavior => Behavior.GetValueOrDefault(defName),
|
DefKind.Behavior => Behavior.GetValueOrDefault(defName),
|
||||||
DefKind.Color => Colors.GetValueOrDefault(defName),
|
DefKind.Color => Colors.GetValueOrDefault(defName),
|
||||||
|
DefKind.Topic => Topics.GetValueOrDefault(defName),
|
||||||
_ => null,
|
_ => null,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -225,6 +230,7 @@ public sealed class DefCatalog
|
|||||||
HolidayDef => DefKind.Holiday,
|
HolidayDef => DefKind.Holiday,
|
||||||
BehaviorDef => DefKind.Behavior,
|
BehaviorDef => DefKind.Behavior,
|
||||||
ColorDef => DefKind.Color,
|
ColorDef => DefKind.Color,
|
||||||
|
TopicDef => DefKind.Topic,
|
||||||
_ => throw new ArgumentOutOfRangeException(nameof(def)),
|
_ => throw new ArgumentOutOfRangeException(nameof(def)),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ public enum DefKind
|
|||||||
Holiday,
|
Holiday,
|
||||||
Behavior,
|
Behavior,
|
||||||
Color,
|
Color,
|
||||||
|
Topic,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Shared JSONC fields. Kind comes from the folder under <c>defs/</c>, not from the file.</summary>
|
/// <summary>Shared JSONC fields. Kind comes from the folder under <c>defs/</c>, not from the file.</summary>
|
||||||
|
|||||||
@@ -129,6 +129,9 @@ internal static class PackPaths
|
|||||||
case "colors":
|
case "colors":
|
||||||
kind = DefKind.Color;
|
kind = DefKind.Color;
|
||||||
return true;
|
return true;
|
||||||
|
case "topics":
|
||||||
|
kind = DefKind.Topic;
|
||||||
|
return true;
|
||||||
default:
|
default:
|
||||||
kind = default;
|
kind = default;
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -65,6 +65,13 @@ internal static class PeopleDefValidator
|
|||||||
ValidateBehavior(behavior, log);
|
ValidateBehavior(behavior, log);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var topic in catalog.Topics.Values)
|
||||||
|
{
|
||||||
|
ValidateTopic(topic, catalog);
|
||||||
|
}
|
||||||
|
|
||||||
|
RequireTalkTopics(catalog);
|
||||||
|
|
||||||
if (catalog.Staffing.Values.Count(def => !def.Abstract) > 1)
|
if (catalog.Staffing.Values.Count(def => !def.Abstract) > 1)
|
||||||
{
|
{
|
||||||
throw new ContentLoadException("A catalog may only have one concrete StaffingDef.");
|
throw new ContentLoadException("A catalog may only have one concrete StaffingDef.");
|
||||||
@@ -550,6 +557,63 @@ internal static class PeopleDefValidator
|
|||||||
log.Warning(
|
log.Warning(
|
||||||
$"BehaviorDef '{behavior.DefName}' lunchWeight {behavior.LunchWeight} is above dutyLessonWeight {behavior.DutyLessonWeight}; pupils will leave class for lunch.");
|
$"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}'.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>A catalog with circle actions but no topics would silently solo-chat — refuse load.</summary>
|
||||||
|
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)
|
private static void ValidateConditionBands(BehaviorDef behavior)
|
||||||
|
|||||||
@@ -162,6 +162,14 @@ public sealed class TraitSkillModifier
|
|||||||
public int Offset { get; init; }
|
public int Offset { get; init; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>Biases topic pick toward a tag. Used on gossip and similar traits.</summary>
|
||||||
|
public sealed class TopicTagWeight
|
||||||
|
{
|
||||||
|
public required string Tag { get; init; }
|
||||||
|
|
||||||
|
public float Weight { get; init; } = 1f;
|
||||||
|
}
|
||||||
|
|
||||||
public sealed class TraitDef : Def
|
public sealed class TraitDef : Def
|
||||||
{
|
{
|
||||||
public int Weight { get; init; } = 1;
|
public int Weight { get; init; } = 1;
|
||||||
@@ -190,6 +198,39 @@ public sealed class TraitDef : Def
|
|||||||
/// cold-loving is negative.
|
/// cold-loving is negative.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public float ComfortTemperatureOffset { get; init; }
|
public float ComfortTemperatureOffset { get; init; }
|
||||||
|
|
||||||
|
/// <summary>How often this person initiates talk. Quiet below 1, leader above.</summary>
|
||||||
|
public float TalkInitiative { get; init; } = 1f;
|
||||||
|
|
||||||
|
/// <summary>Extra seats preferred in a circle. Social trait raises it.</summary>
|
||||||
|
public int TalkCircleBonus { get; init; }
|
||||||
|
|
||||||
|
/// <summary>Multiplies opinion shift from talk. Gossip above 1.</summary>
|
||||||
|
public float TalkOpinionMultiplier { get; init; } = 1f;
|
||||||
|
|
||||||
|
/// <summary>Pull toward topics carrying these tags when this person picks the subject.</summary>
|
||||||
|
public IReadOnlyList<TopicTagWeight> TalkTagWeights { get; init; } = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Conversation subject. Tags gate appropriateness; language is optional skill help.</summary>
|
||||||
|
public sealed class TopicDef : Def
|
||||||
|
{
|
||||||
|
/// <summary>Vanilla tags: study, games, food, family, sport, gossip, rude, appearance.</summary>
|
||||||
|
public IReadOnlyList<string> Tags { get; init; } = [];
|
||||||
|
|
||||||
|
public IntRange? Age { get; init; }
|
||||||
|
|
||||||
|
/// <summary>Empty means every role.</summary>
|
||||||
|
public IReadOnlyList<string> Roles { get; init; } = [];
|
||||||
|
|
||||||
|
/// <summary>Allowed as whisper on lesson — phase 43 uses this; ordinary Chat does not.</summary>
|
||||||
|
public bool WhisperOnLesson { get; init; }
|
||||||
|
|
||||||
|
/// <summary>Skill that helps when shared above threshold. Null — any language works equally.</summary>
|
||||||
|
public string? Language { get; init; }
|
||||||
|
|
||||||
|
/// <summary>Base opinion shift toward each other participant when talk succeeds.</summary>
|
||||||
|
public int OpinionShift { get; init; } = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
public sealed class StaffingDef : Def
|
public sealed class StaffingDef : Def
|
||||||
@@ -329,6 +370,36 @@ public sealed class BehaviorDef : Def
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public IReadOnlyList<OpinionBand> OpinionBands { get; init; } = DefaultOpinionBands;
|
public IReadOnlyList<OpinionBand> OpinionBands { get; init; } = DefaultOpinionBands;
|
||||||
|
|
||||||
|
/// <summary>Skill points Communication gains per game hour of talk — less than a lesson.</summary>
|
||||||
|
public float TalkSkillPerHour { get; init; } = 0.02f;
|
||||||
|
|
||||||
|
/// <summary>Language used in talk, when not already at skill max.</summary>
|
||||||
|
public float TalkLanguageSkillPerHour { get; init; } = 0.005f;
|
||||||
|
|
||||||
|
/// <summary>Minimum shared language skill for full opinion shift.</summary>
|
||||||
|
public int TalkLanguageThreshold { get; init; } = 25;
|
||||||
|
|
||||||
|
/// <summary>Opinion multiplier when participants share no language above threshold.</summary>
|
||||||
|
public float TalkNoLanguageOpinionMultiplier { get; init; } = 0.15f;
|
||||||
|
|
||||||
|
/// <summary>Opinion multiplier for phone chat vs live circle.</summary>
|
||||||
|
public float TalkPhoneOpinionMultiplier { get; init; } = 0.5f;
|
||||||
|
|
||||||
|
/// <summary>How much Communication scales opinion shift (per 100 points).</summary>
|
||||||
|
public float TalkCommunicationOpinionScale { get; init; } = 0.5f;
|
||||||
|
|
||||||
|
/// <summary>Minimum circle size. Below this Chat does not start.</summary>
|
||||||
|
public int TalkCircleMin { get; init; } = 2;
|
||||||
|
|
||||||
|
/// <summary>Maximum people in one live circle.</summary>
|
||||||
|
public int TalkCircleMax { get; init; } = 4;
|
||||||
|
|
||||||
|
/// <summary>Opinion at or above — friend for invites and node pull.</summary>
|
||||||
|
public int TalkFriendThreshold { get; init; } = 40;
|
||||||
|
|
||||||
|
/// <summary>Opinion at or below — enemy; never invited, lunch nodes avoided.</summary>
|
||||||
|
public int TalkEnemyThreshold { get; init; } = -40;
|
||||||
|
|
||||||
public static IReadOnlyList<OpinionBand> DefaultOpinionBands { get; } =
|
public static IReadOnlyList<OpinionBand> DefaultOpinionBands { get; } =
|
||||||
[
|
[
|
||||||
new() { Min = 70, Id = "OpinionCloseFriend" },
|
new() { Min = 70, Id = "OpinionCloseFriend" },
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
namespace HSchool.Content;
|
||||||
|
|
||||||
|
/// <summary>Leisure actions that form talk circles. Names match ActionDef ids in core.</summary>
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Vanilla topic tags from the social slice design doc.</summary>
|
||||||
|
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";
|
||||||
|
}
|
||||||
@@ -36,6 +36,24 @@
|
|||||||
"roles": ["student", "staff"],
|
"roles": ["student", "staff"],
|
||||||
"weight": 3,
|
"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",
|
"defName": "WalkCorridor",
|
||||||
"room": "Corridor",
|
"room": "Corridor",
|
||||||
|
|||||||
@@ -62,4 +62,15 @@
|
|||||||
{ "min": -40, "id": "OpinionDislike" },
|
{ "min": -40, "id": "OpinionDislike" },
|
||||||
{ "min": -100, "id": "OpinionEnemy" },
|
{ "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,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
},
|
||||||
|
]
|
||||||
@@ -34,12 +34,14 @@
|
|||||||
"weight": 7,
|
"weight": 7,
|
||||||
"incompatible": ["Leader", "Bully"],
|
"incompatible": ["Leader", "Bully"],
|
||||||
"wageAsk": -8,
|
"wageAsk": -8,
|
||||||
|
"talkInitiative": 0.45,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"defName": "Leader",
|
"defName": "Leader",
|
||||||
"weight": 4,
|
"weight": 4,
|
||||||
"incompatible": ["Quiet"],
|
"incompatible": ["Quiet"],
|
||||||
"wageAsk": 10,
|
"wageAsk": 10,
|
||||||
|
"talkInitiative": 1.6,
|
||||||
"skillModifiers": [
|
"skillModifiers": [
|
||||||
{ "skill": "History", "offset": 4 },
|
{ "skill": "History", "offset": 4 },
|
||||||
],
|
],
|
||||||
@@ -92,4 +94,18 @@
|
|||||||
"incompatible": ["HeatLoving"],
|
"incompatible": ["HeatLoving"],
|
||||||
"comfortTemperatureOffset": -4,
|
"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,
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
"UseToilet": "Restroom",
|
"UseToilet": "Restroom",
|
||||||
"RecessRest": "Recess",
|
"RecessRest": "Recess",
|
||||||
"Chat": "Chat",
|
"Chat": "Chat",
|
||||||
|
"StaffChat": "Staff chat",
|
||||||
|
"PhoneChat": "Phone chat",
|
||||||
"WalkCorridor": "Walk the corridor",
|
"WalkCorridor": "Walk the corridor",
|
||||||
"WalkYard": "Walk the yard",
|
"WalkYard": "Walk the yard",
|
||||||
"Behavior": "Behavior rules",
|
"Behavior": "Behavior rules",
|
||||||
@@ -139,6 +141,8 @@
|
|||||||
"Curious": "Curious",
|
"Curious": "Curious",
|
||||||
"HotTempered": "Hot-tempered",
|
"HotTempered": "Hot-tempered",
|
||||||
"Kind": "Kind",
|
"Kind": "Kind",
|
||||||
|
"Gossip": "Gossip",
|
||||||
|
"Outgoing": "Outgoing",
|
||||||
"Neat": "Neat",
|
"Neat": "Neat",
|
||||||
"Staffing": "Staffing",
|
"Staffing": "Staffing",
|
||||||
"Height": "Height",
|
"Height": "Height",
|
||||||
@@ -189,6 +193,15 @@
|
|||||||
"OpinionEnemy": "enemies",
|
"OpinionEnemy": "enemies",
|
||||||
"ActionStarted": "started: {0}",
|
"ActionStarted": "started: {0}",
|
||||||
"ActionEnded": "finished: {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}",
|
"ApparelReplaced": "got a new {0}",
|
||||||
"ApparelChanged": "changed clothes: {0}",
|
"ApparelChanged": "changed clothes: {0}",
|
||||||
"core": "Core",
|
"core": "Core",
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
"UseToilet": "Туалет",
|
"UseToilet": "Туалет",
|
||||||
"RecessRest": "Перемена",
|
"RecessRest": "Перемена",
|
||||||
"Chat": "Разговор",
|
"Chat": "Разговор",
|
||||||
|
"StaffChat": "Разговор в учительской",
|
||||||
|
"PhoneChat": "Разговор по телефону",
|
||||||
"WalkCorridor": "Прогулка по коридору",
|
"WalkCorridor": "Прогулка по коридору",
|
||||||
"WalkYard": "Прогулка во дворе",
|
"WalkYard": "Прогулка во дворе",
|
||||||
"Behavior": "Правила поведения",
|
"Behavior": "Правила поведения",
|
||||||
@@ -139,6 +141,8 @@
|
|||||||
"Curious": "Любопытный",
|
"Curious": "Любопытный",
|
||||||
"HotTempered": "Вспыльчивый",
|
"HotTempered": "Вспыльчивый",
|
||||||
"Kind": "Добрый",
|
"Kind": "Добрый",
|
||||||
|
"Gossip": "Сплетник",
|
||||||
|
"Outgoing": "Общительный",
|
||||||
"Neat": "Аккуратный",
|
"Neat": "Аккуратный",
|
||||||
"Staffing": "Штат",
|
"Staffing": "Штат",
|
||||||
"Height": "Рост",
|
"Height": "Рост",
|
||||||
@@ -189,6 +193,15 @@
|
|||||||
"OpinionEnemy": "враги",
|
"OpinionEnemy": "враги",
|
||||||
"ActionStarted": "начал: {0}",
|
"ActionStarted": "начал: {0}",
|
||||||
"ActionEnded": "закончил: {0}",
|
"ActionEnded": "закончил: {0}",
|
||||||
|
"TalkEnded": "говорил о {0}",
|
||||||
|
"TopicStudy": "учёбе",
|
||||||
|
"TopicGames": "играх",
|
||||||
|
"TopicFood": "еде",
|
||||||
|
"TopicFamily": "семье",
|
||||||
|
"TopicSport": "спорте",
|
||||||
|
"TopicGossip": "сплетнях",
|
||||||
|
"TopicRude": "грубом",
|
||||||
|
"TopicAppearance": "внешности",
|
||||||
"ApparelReplaced": "получил новую {0}",
|
"ApparelReplaced": "получил новую {0}",
|
||||||
"ApparelChanged": "переоделся: {0}",
|
"ApparelChanged": "переоделся: {0}",
|
||||||
"core": "Базовая игра",
|
"core": "Базовая игра",
|
||||||
|
|||||||
@@ -21,6 +21,11 @@ internal static class ActivitySystem
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (TalkActions.IsTalk(actionId))
|
||||||
|
{
|
||||||
|
return TalkCircleSystem.TryStart(school, personId, actionId);
|
||||||
|
}
|
||||||
|
|
||||||
if (!school.Catalog.Actions.TryGetValue(actionId, out var action) || action.Abstract)
|
if (!school.Catalog.Actions.TryGetValue(actionId, out var action) || action.Abstract)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@@ -114,6 +119,11 @@ internal static class ActivitySystem
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (TalkActions.IsTalk(activity.ActionId))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var location = school.Map?.NodeDef(presence.NodeId ?? "");
|
var location = school.Map?.NodeDef(presence.NodeId ?? "");
|
||||||
if (location is null || !location.Equals(action.Room, StringComparison.Ordinal))
|
if (location is null || !location.Equals(action.Room, StringComparison.Ordinal))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ public static class PersonLogTypes
|
|||||||
{
|
{
|
||||||
public const string ActionStarted = "action-started";
|
public const string ActionStarted = "action-started";
|
||||||
public const string ActionEnded = "action-ended";
|
public const string ActionEnded = "action-ended";
|
||||||
|
public const string TalkEnded = "talk-ended";
|
||||||
public const string ApparelReplaced = "apparel-replaced";
|
public const string ApparelReplaced = "apparel-replaced";
|
||||||
public const string ApparelChanged = "apparel-changed";
|
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);
|
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;
|
return Type;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -324,6 +324,23 @@ internal static class PresenceSystem
|
|||||||
{
|
{
|
||||||
var now = school.Clock.Time;
|
var now = school.Clock.Time;
|
||||||
var walks = school.Walks!;
|
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)
|
if (!presence.IsOnCampus)
|
||||||
{
|
{
|
||||||
intent = Intent.None;
|
intent = Intent.None;
|
||||||
@@ -369,16 +386,11 @@ internal static class PresenceSystem
|
|||||||
return null;
|
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 frame = school.Catalog!.DayFrame;
|
||||||
var lunchOpen = frame is not null
|
var lunchOpen = frame is not null
|
||||||
&& SchoolDay.IsLunchWindow(frame, slot, ClassOf(school, person)?.Year);
|
&& SchoolDay.IsLunchWindow(frame, slot, ClassOf(school, person)?.Year);
|
||||||
var apparel = ApparelPresence.Build(school, person, ClassOf(school, person));
|
var apparel = ApparelPresence.Build(school, person, ClassOf(school, person));
|
||||||
|
var talk = BuildTalkContext(school, person, bound, lunchOpen, slot);
|
||||||
var state = new ActorState(
|
var state = new ActorState(
|
||||||
presence.NodeId,
|
presence.NodeId,
|
||||||
presence.DestinationId,
|
presence.DestinationId,
|
||||||
@@ -392,7 +404,8 @@ internal static class PresenceSystem
|
|||||||
needs.Values,
|
needs.Values,
|
||||||
intent,
|
intent,
|
||||||
lunchOpen,
|
lunchOpen,
|
||||||
apparel);
|
apparel,
|
||||||
|
talk);
|
||||||
var decision = DecisionPlanner.Decide(
|
var decision = DecisionPlanner.Decide(
|
||||||
school.Catalog!,
|
school.Catalog!,
|
||||||
school.Map!,
|
school.Map!,
|
||||||
@@ -401,17 +414,19 @@ internal static class PresenceSystem
|
|||||||
(node, thing) => occupied.GetValueOrDefault((node, thing)));
|
(node, thing) => occupied.GetValueOrDefault((node, thing)));
|
||||||
|
|
||||||
var changing = activity.IsActive && ActivitySystem.IsChangeClothes(activity.ActionId);
|
var changing = activity.IsActive && ActivitySystem.IsChangeClothes(activity.ActionId);
|
||||||
|
var inTalk = activity.IsActive && TalkActions.IsTalk(activity.ActionId);
|
||||||
|
|
||||||
if (decision.WalkTo is not null
|
if (decision.WalkTo is not null
|
||||||
&& !decision.WalkTo.Equals(presence.NodeId, StringComparison.Ordinal)
|
&& !decision.WalkTo.Equals(presence.NodeId, StringComparison.Ordinal)
|
||||||
&& activity.IsActive
|
&& activity.IsActive
|
||||||
&& !changing)
|
&& !changing
|
||||||
|
&& !inTalk)
|
||||||
{
|
{
|
||||||
activity = PersonActivity.Idle;
|
activity = PersonActivity.Idle;
|
||||||
}
|
}
|
||||||
|
|
||||||
intent = decision.Intent;
|
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);
|
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);
|
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<string, int> ?? new Dictionary<string, int>(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<string, string> SnapshotPersonNodes(School school)
|
||||||
|
{
|
||||||
|
var nodes = new Dictionary<string, string>(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)
|
private static SchoolClass? ClassOf(School school, Person person)
|
||||||
{
|
{
|
||||||
if (person.ClassId is null)
|
if (person.ClassId is null)
|
||||||
|
|||||||
@@ -131,6 +131,10 @@ public sealed class School : IDisposable
|
|||||||
|
|
||||||
internal Dictionary<string, string?> LoggedActivity { get; } = new(StringComparer.Ordinal);
|
internal Dictionary<string, string?> LoggedActivity { get; } = new(StringComparer.Ordinal);
|
||||||
|
|
||||||
|
internal Dictionary<string, ActiveTalkCircle> TalkCirclesById { get; } = new(StringComparer.Ordinal);
|
||||||
|
|
||||||
|
internal Dictionary<string, string> TalkCircleByPerson { get; } = new(StringComparer.Ordinal);
|
||||||
|
|
||||||
internal void ResetDayLog()
|
internal void ResetDayLog()
|
||||||
{
|
{
|
||||||
_dayLog.Clear();
|
_dayLog.Clear();
|
||||||
@@ -339,6 +343,11 @@ public sealed class School : IDisposable
|
|||||||
PresenceSystem.Enqueue(this, id);
|
PresenceSystem.Enqueue(this, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var id in TalkCircleSystem.Apply(this, gameMinutes))
|
||||||
|
{
|
||||||
|
PresenceSystem.Enqueue(this, id);
|
||||||
|
}
|
||||||
|
|
||||||
PersonDayLog.Sync(this);
|
PersonDayLog.Sync(this);
|
||||||
|
|
||||||
if (Catalog is not null)
|
if (Catalog is not null)
|
||||||
|
|||||||
@@ -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<string> Members { get; init; }
|
||||||
|
|
||||||
|
public float RemainingMinutes { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Forms 2–4 person talk circles, applies outcomes, writes topic log lines.</summary>
|
||||||
|
internal static class TalkCircleSystem
|
||||||
|
{
|
||||||
|
private static readonly QueryDescription People =
|
||||||
|
new QueryDescription().WithAll<PersonIdentity, PersonRoles, PersonTraits, PersonSkills, PersonNeeds, Presence, PersonActivity>();
|
||||||
|
|
||||||
|
public static bool IsInCircle(School school, string personId) =>
|
||||||
|
school.TalkCircleByPerson.ContainsKey(personId);
|
||||||
|
|
||||||
|
/// <summary>Ends an active circle when duty overrides break talk (bell rang).</summary>
|
||||||
|
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<string> 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<string>();
|
||||||
|
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<string> { 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<TalkCircles.Candidate> GatherCandidates(
|
||||||
|
School school,
|
||||||
|
string exceptId,
|
||||||
|
string nodeId,
|
||||||
|
bool requirePhone)
|
||||||
|
{
|
||||||
|
var roster = school.Roster!.People.ToDictionary(person => person.Id, StringComparer.Ordinal);
|
||||||
|
var list = new List<TalkCircles.Candidate>();
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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<string, int>(), new Dictionary<string, string>(), 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<string, int>(), new Dictionary<string, string>(), 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<string, int>(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<string, int>(), new Dictionary<string, string>(), null, hasPhone, true, catalog.BehaviorRules));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Dictionary<string, float> 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<string, int>(StringComparer.Ordinal),
|
||||||
|
Choices = new Dictionary<string, string>(StringComparer.Ordinal),
|
||||||
|
Skills = skills,
|
||||||
|
Traits = [],
|
||||||
|
Needs = new Dictionary<string, float>(StringComparer.Ordinal),
|
||||||
|
Opinions = new Dictionary<string, int>(StringComparer.Ordinal),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,7 +11,8 @@ public class PeopleDefTests
|
|||||||
var catalog = _loader.Load([CatalogLoader.CorePackId], PackDocuments.FromDirectory(CatalogLoader.CorePackId, root));
|
var catalog = _loader.Load([CatalogLoader.CorePackId], PackDocuments.FromDirectory(CatalogLoader.CorePackId, root));
|
||||||
|
|
||||||
Assert.True(catalog.Skills.Count >= 10);
|
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.Equal(5, catalog.Needs.Count);
|
||||||
Assert.True(catalog.BodyAttributes.ContainsKey("Height"));
|
Assert.True(catalog.BodyAttributes.ContainsKey("Height"));
|
||||||
Assert.Equal(BodyAttributeKind.Number, catalog.BodyAttributes["Height"].Kind);
|
Assert.Equal(BodyAttributeKind.Number, catalog.BodyAttributes["Height"].Kind);
|
||||||
|
|||||||
@@ -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<ContentLoadException>(() => _loader.Load([CatalogLoader.CorePackId], documents));
|
||||||
|
Assert.Contains("TopicDef", ex.Message, StringComparison.Ordinal);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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-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-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
|
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.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=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.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=Underwear:Black:worn,Socks:White:worn,Jeans:Black:worn,TShirt:LightBlue:worn,WinterBoots:Beige:worn,Jacket:Gray:worn,Bottle:Green:bag
|
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=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 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=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.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=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.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=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.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=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.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=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 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=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.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,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.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,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 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=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.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=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.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=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 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=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.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=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.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=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.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=Underwear:Gray:worn,Socks:Gray:worn,Jeans:Blue:worn,Shirt:Blue:worn,Shoes:Gray:worn,Jacket:Blue:worn,Bottle:Blue:bag
|
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,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 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=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.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=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.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=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.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=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 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=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.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=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.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=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.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=Underwear:Gray:worn,Socks:Gray:worn,Dress:Gray:worn,WinterBoots:Beige:worn,Hat:Black:worn,Coat:Black:home,Phone:Black:bag
|
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=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.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=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.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=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 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=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.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=Underwear:White:worn,Socks:White:worn,Pants:Gray:worn,Shirt:Gray:worn,Shoes:Gray:worn,Hat:Blue:worn,Jacket:Beige:home
|
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=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 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=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.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=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.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=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.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=Underwear:Black:worn,Socks:Gray:worn,Jeans:Blue:worn,TShirt:Blue:worn,WinterBoots:Black:worn,Belt:Beige:worn,FurCoat:Black:home
|
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=Underwear:White:worn,Socks:White:worn,Pants:Beige:worn,Shirt:Blue:worn,Shoes:Beige:worn,FurCoat:Gray:home,Phone:White:bag
|
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=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.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=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.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=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 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=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.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=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.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,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 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=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.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=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.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=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 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=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.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=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.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=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.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=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 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=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.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,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.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=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 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=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.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=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.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=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.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=Underwear:Gray:worn,Socks:White:worn,Dress:Gray:worn,WinterBoots:Gray:worn,FurCoat:Gray:home,Bottle:Green: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=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.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=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.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=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.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=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 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=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.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=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.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=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.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=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 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=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.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=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 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,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.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=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.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,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.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,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 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=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.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=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.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=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.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=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.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=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 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=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.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=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.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=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.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,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.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,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 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=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.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=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.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=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 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=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.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=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.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,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.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,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 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=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.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=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.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=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.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=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 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=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.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=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.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=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 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=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.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=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.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=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.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=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 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,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.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=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.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=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 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=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.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=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.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=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 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=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.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=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.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=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 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=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.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=Underwear:Black:worn,Socks:Gray:worn,Jeans:Blue:worn,Shirt:White:worn,Shoes:Gray:worn,Scarf:Beige:worn,Jacket:Gray:home
|
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=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 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=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.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=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.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=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.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=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.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=Underwear:Gray:worn,Socks:White:worn,Jeans:Gray:worn,TShirt:Gray:worn,WinterBoots:Beige:worn,Coat:Black:worn,Bottle:White: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=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.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=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.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=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 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=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.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=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.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=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.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,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 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=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.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=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.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=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.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=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.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=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 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
|
||||||
|
|||||||
@@ -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<Person> 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<PersonIdentity, Presence, PersonActivity, Intent>();
|
||||||
|
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<ContentDocument>();
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user