Add EventDef notices, morning and lesson bells, and info toasts.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Leonid Pershin
2026-08-20 20:46:33 +03:00
co-authored by Cursor
parent ea3f5c7bf1
commit a554738084
38 changed files with 952 additions and 22 deletions
+48
View File
@@ -0,0 +1,48 @@
using HSchool.Content;
namespace HSchool.Simulation;
/// <summary>
/// Turns clock edges into world facts. One dayStart per morning crossing, one lessonStart per
/// school when the bell enters a lesson period — not one per class.
/// </summary>
internal static class EventSystem
{
public static IReadOnlyList<WorldEvent> Detect(School school, DateTime before, DateTime after)
{
if (school.Catalog is null || after <= before)
{
return [];
}
var facts = new List<WorldEvent>(2);
if (CrossedWorkMorning(school.Catalog, before, after, school.SchoolWeekDays))
{
facts.Add(new WorldEvent(EventTriggers.DayStart));
}
if (EnteredLessonPeriod(school.Catalog, before, after, school.SchoolWeekDays))
{
facts.Add(new WorldEvent(EventTriggers.LessonStart));
}
return facts;
}
private static bool CrossedWorkMorning(DefCatalog catalog, DateTime before, DateTime after, int weekDays)
{
if (!PersonDayLog.CrossedDayStart(before, after))
{
return false;
}
return SchoolDay.IsWorkday(catalog, after, weekDays);
}
private static bool EnteredLessonPeriod(DefCatalog catalog, DateTime before, DateTime after, int weekDays)
{
var beforeSlot = SchoolDay.At(catalog, before, weekDays);
var afterSlot = SchoolDay.At(catalog, after, weekDays);
return afterSlot.Kind == DaySlotKind.Lesson && beforeSlot != afterSlot;
}
}