Fix PE change-clothes interruption and post-PE mode detection.

Add appropriateness tests for staging PE kit, wearing form before gym, and returning to everyday clothes after the lesson.
This commit is contained in:
Leonid Pershin
2026-08-20 06:31:41 +03:00
parent c541156614
commit e461a9f3e4
5 changed files with 112 additions and 11 deletions
+4 -3
View File
@@ -166,9 +166,10 @@ internal static class ActivitySystem
ApparelDresser.RedressPerson(school, person, mode, includeHome: false, todaySubjects: subjects);
}
private static bool IsChangeClothes(string actionId) =>
actionId.Equals(ApparelActions.ChangeMale, StringComparison.Ordinal)
|| actionId.Equals(ApparelActions.ChangeFemale, StringComparison.Ordinal);
internal static bool IsChangeClothes(string? actionId) =>
actionId is not null
&& (actionId.Equals(ApparelActions.ChangeMale, StringComparison.Ordinal)
|| actionId.Equals(ApparelActions.ChangeFemale, StringComparison.Ordinal));
private static int Occupied(School school, string nodeId, string thing)
{
+20 -3
View File
@@ -56,10 +56,27 @@ internal static class ApparelPresence
return ApparelDresser.ModeForLesson(current?.Subject);
}
var next = lessons.Where(lesson => lesson.Period > slot.Index).OrderBy(lesson => lesson.Period).FirstOrDefault();
if (next is not null)
if (slot.Kind == DaySlotKind.Break)
{
return ApparelDresser.ModeForLesson(next.Subject);
var justEnded = lessons.FirstOrDefault(lesson => lesson.Period == slot.Index);
if (justEnded is not null && ApparelDresser.ModeForLesson(justEnded.Subject) == ApparelMode.Pe)
{
return ApparelMode.Everyday;
}
var next = lessons.Where(lesson => lesson.Period > slot.Index).OrderBy(lesson => lesson.Period).FirstOrDefault();
if (next is not null)
{
return ApparelDresser.ModeForLesson(next.Subject);
}
return ApparelMode.Everyday;
}
var nextLesson = lessons.Where(lesson => lesson.Period > slot.Index).OrderBy(lesson => lesson.Period).FirstOrDefault();
if (nextLesson is not null)
{
return ApparelDresser.ModeForLesson(nextLesson.Subject);
}
var previous = lessons.Where(lesson => lesson.Period < slot.Index).OrderByDescending(lesson => lesson.Period).FirstOrDefault();
+5 -2
View File
@@ -400,15 +400,18 @@ internal static class PresenceSystem
state,
(node, thing) => occupied.GetValueOrDefault((node, thing)));
var changing = activity.IsActive && ActivitySystem.IsChangeClothes(activity.ActionId);
if (decision.WalkTo is not null
&& !decision.WalkTo.Equals(presence.NodeId, StringComparison.Ordinal)
&& activity.IsActive)
&& activity.IsActive
&& !changing)
{
activity = PersonActivity.Idle;
}
intent = decision.Intent;
if (decision.WalkTo is not null)
if (decision.WalkTo is not null && !changing)
{
presence = PresenceStepper.StartWalk(presence, walks, decision.WalkTo, headingHome: false);
}