Add lesson marks 2-5 from lesson quality once per slot.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -9,8 +9,9 @@ namespace HSchool.Simulation;
|
||||
/// <summary>
|
||||
/// Grows skills for people who are actually in the lesson: at the room, not walking, not off
|
||||
/// doing something else, and with the assigned teacher standing there. A pupil without today's
|
||||
/// textbook in the bag learns at <see cref="BehaviorDef.LessonNoTextbookFactor"/>. The formula
|
||||
/// lives in <see cref="HSchool.Ai.LessonLearning"/>.
|
||||
/// textbook in the bag learns at <see cref="BehaviorDef.LessonNoTextbookFactor"/>. Writes one
|
||||
/// mark 2–5 per lesson slot from the same quality inputs. The formula lives in
|
||||
/// <see cref="HSchool.Ai.LessonLearning"/>.
|
||||
/// </summary>
|
||||
internal static class LessonLearningSystem
|
||||
{
|
||||
@@ -69,7 +70,7 @@ internal static class LessonLearningSystem
|
||||
|
||||
var personId = identity.Id;
|
||||
var person = school.Roster.People.FirstOrDefault(row => row.Id.Equals(personId, StringComparison.Ordinal));
|
||||
if (person is null)
|
||||
if (person is null || !person.IsStudent)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -86,6 +87,7 @@ internal static class LessonLearningSystem
|
||||
if (!TeacherStandingIn(places, lesson.TeacherId, lesson.RoomId))
|
||||
{
|
||||
school.TryLogLessonOnce(personId, PersonLogTypes.LessonNoTeacher, lesson.Subject);
|
||||
TryWriteAbsentTeacherMark(school, person, lesson, rules);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -97,7 +99,7 @@ internal static class LessonLearningSystem
|
||||
}
|
||||
|
||||
var textbookFactor = 1f;
|
||||
if (person.IsStudent && !LessonLearning.HasTextbookInBag(person.Items, lesson.Subject))
|
||||
if (!LessonLearning.HasTextbookInBag(person.Items, lesson.Subject))
|
||||
{
|
||||
textbookFactor = rules.LessonNoTextbookFactor;
|
||||
school.TryLogLessonOnce(personId, PersonLogTypes.LessonNoTextbook, lesson.Subject);
|
||||
@@ -109,6 +111,7 @@ internal static class LessonLearningSystem
|
||||
? found
|
||||
: new Dictionary<string, float>(StringComparer.Ordinal);
|
||||
var teacherSkill = LessonLearning.AverageTeacherSkill(subject, taught, catalog);
|
||||
var traitOffset = AverageTraitOffset(catalog, traits, subject);
|
||||
foreach (var share in subject.Skills)
|
||||
{
|
||||
if (!catalog.Skills.TryGetValue(share.Skill, out var skill) || skill.Abstract)
|
||||
@@ -133,9 +136,57 @@ internal static class LessonLearningSystem
|
||||
warmth,
|
||||
textbookFactor);
|
||||
}
|
||||
|
||||
TryWriteQualityMark(school, person, lesson, rules, hunger, traitOffset, teacherSkill, warmth, textbookFactor);
|
||||
});
|
||||
}
|
||||
|
||||
private static void TryWriteAbsentTeacherMark(
|
||||
School school,
|
||||
Person person,
|
||||
LessonPlacement lesson,
|
||||
BehaviorDef rules)
|
||||
{
|
||||
if (rules.LessonMarkWhenNoTeacher is not { } mark)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!school.TryClaimLessonMark(person.Id, school.Clock.Time.Date, lesson.Period))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (LessonMarkMemory.Record(person, lesson.Subject, mark, school.Clock.Time, lesson.Period, rules))
|
||||
{
|
||||
school.RosterTalkDirty = true;
|
||||
}
|
||||
}
|
||||
|
||||
private static void TryWriteQualityMark(
|
||||
School school,
|
||||
Person person,
|
||||
LessonPlacement lesson,
|
||||
BehaviorDef rules,
|
||||
float hunger,
|
||||
int traitOffset,
|
||||
float teacherSkill,
|
||||
float warmth,
|
||||
float textbookFactor)
|
||||
{
|
||||
if (!school.TryClaimLessonMark(person.Id, school.Clock.Time.Date, lesson.Period))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var quality = LessonLearning.Quality(hunger, traitOffset, teacherSkill, warmth, textbookFactor);
|
||||
var mark = LessonLearning.Mark(quality, rules);
|
||||
if (LessonMarkMemory.Record(person, lesson.Subject, mark, school.Clock.Time, lesson.Period, rules))
|
||||
{
|
||||
school.RosterTalkDirty = true;
|
||||
}
|
||||
}
|
||||
|
||||
private static bool IsStanding(Presence presence) =>
|
||||
presence.NodeId is not null && presence.Path.Length == 0 && presence.RemainingMinutes <= 0;
|
||||
|
||||
@@ -170,6 +221,19 @@ internal static class LessonLearningSystem
|
||||
return school.Roster?.Classes.FirstOrDefault(row => row.Id.Equals(person.ClassId, StringComparison.Ordinal));
|
||||
}
|
||||
|
||||
private static int AverageTraitOffset(DefCatalog catalog, PersonTraits traits, SubjectDef subject)
|
||||
{
|
||||
var total = 0;
|
||||
var count = 0;
|
||||
foreach (var share in subject.Skills)
|
||||
{
|
||||
total += TraitOffset(catalog, traits, share.Skill);
|
||||
count++;
|
||||
}
|
||||
|
||||
return count == 0 ? 0 : total / count;
|
||||
}
|
||||
|
||||
private static int TraitOffset(DefCatalog catalog, PersonTraits traits, string skill)
|
||||
{
|
||||
var offset = 0;
|
||||
|
||||
Reference in New Issue
Block a user