# Фаза 18. Присутствие и ходьба ## Зависимости - [Фаза 16](16-timetable-in-school.md) ## Зачем Человек перестаёт быть записью в расписании и получает **место**. Он приходит утром, идёт коридором в кабинет и уходит после последнего урока. Экрана ещё нет — всё проверяется тестами и логом. ## Задачи - [x] Новый проект `HSchool.Ai` рядом с `People` и `Schedule`: зависит на `Content`, `People` и `Schedule`, без Arch и ASP.NET. Рядом — `tests/HSchool.Ai.Tests` - [x] `travelMinutes` на `RoomDef` и `TerritoryDef`; в `core` проставлены кабинет 0.5, коридор 1.5, лестница 1.5, вестибюль 1, двор 3 - [x] Маршрутизация по `MapLayout.Links` — в библиотеке: матрица следующих шагов считается **один раз** при загрузке школы, не на каждом шаге - [x] План дня человека — тоже в библиотеке: во сколько выходить, чтобы успеть, и когда уходить. Часы, компоненты и мир туда не проникают - [x] Место человека — компонент в `World`: узел, остаток пути, минуты до выхода из узла. Человек всегда в узле; рёбер как состояний нет - [x] Состояние «вне школы» — не удаление сущности: человек остаётся в списке и в карточке - [x] Приход и уход: у кого сегодня нет уроков, тот не приходит вовсе. Ученик и учитель — по своим урокам, прочий штат — по дню школы - [x] Запас на дорогу свой у каждого: путь от двора плюс несколько минут из своего потока случайности, с поправкой на черты - [x] Обязанность как место назначения: урок — кабинет из расписания, должность — комната из `RoomDef.works`. Выбора действий пока нет - [x] Движение по тику: остаток минут в узле уменьшается, при нуле человек переходит в следующий узел пути - [x] Стабильный порядок обхода людей — собственный список, а не порядок сущностей в Arch - [x] Адаптер в `HSchool.Simulation`: собирает значения из компонентов, зовёт библиотеку, записывает ответ обратно. Горячий путь — движение — границу не пересекает - [x] Ориентир в `AGENTS.md`, `docs/architecture.md` и `docs/design/projects.md` знает про новый проект - [x] Место, путь и назначение едут в файл часов; кого в файле нет, тот расставляется по обязанности - [x] Потолок решений за тик — в `SimulationOptions`, как очередь, а не как отсечка - [x] Предикат «школа пуста»: в здании и во дворе нет никого - [x] Рабочее окно дня — от шести утра до последнего звонка по **каркасу дня**, а не по фактическому расписанию - [x] «Ближайшее шесть утра рабочего дня впереди»: ночь ведёт в то же утро, вечер — в следующее, выходные, праздники и каникулы пропускаются. Поиск ограничен разумным числом дней и честно отвечает «нет такого» - [x] Прыжок часов туда одним шагом: разрешён только при пустой школе и вне рабочего окна, отрабатывает первое сентября и обновление пула за весь пропуск, после себя пишет сейв ## Тесты, без которых фаза не закрыта - [x] Путь из кабинета 201 в санузел первого этажа идёт через лестницу и коридор, а не напрямую - [x] Сумма `travelMinutes` совпадает с временем, за которое человек реально доходит - [x] В воскресенье и в каникулы школа пуста: все вне школы - [x] Класс без уроков сегодня не приходит, а его учитель с уроками у другого класса — приходит - [x] К началу первого урока ученик находится в своём кабинете - [x] Физкультура после урока в главном корпусе: класс доходит до спортзала, и видно, что перемены на это едва хватает - [x] Тот же сид и та же карта дают то же расположение людей на тот же момент - [x] Сохранение и загрузка посреди перемены не телепортируют людей - [x] Прыжок с субботы попадает в понедельник, 6:00; с трёх ночи вторника — в утро того же вторника; с десяти вечера — в утро среды - [x] Прыжок в учебное время отклоняется. В семь утра рабочего дня, когда школа ещё пуста, — тоже: это уже рабочее окно - [x] У школы без единого учителя рабочий день не пропускается - [x] Прыжок через летние каникулы проводит первое сентября: классы перешли, выпуск состоялся, набор пришёл - [x] Промотанная неделя и прожитая неделя дают одно состояние школы ## Критерий готовности - `dotnet test` проходит - Маршруты и план дня проверены без мира: в `HSchool.Ai.Tests` нет Arch - В `HSchool.Ai` нет упоминаний Arch, ASP.NET и `DateTime.Now`; в `HSchool.Simulation` — сокетов ## Стоп Не трогать протокол и клиент. Не заводить нужды, действия и выбор — это фазы 20 и 21.