Это контрольная точка (срез) состояния объекта, который имеет хронологические изменения в определенной единице летоисчисления (для меня это год). Контрольная точка создается для объекта в случае его внешнего изменения, например в случае миграции. Между контрольными точками состояние объекта рассчитывается автоматически.
По сути можно было обойтись без этих контрольных точек. Состояния можно рассчитывать от создания объекта на основании хранимых изменений, но я хочу, чтобы у некоторых объектов могла быть многотысячная история, и пересчет может занимать много машинного времени. А так, в случае изменений в середине хронологии объекта, можно будет пересчитать только последующие контрольные точки, и промежуточные состояния будут рассчитываться очень быстро.
Для получения текущего состояния объекта необходимо взять предыдущий чекпоинт и прогнать по алгоритму изменений на каждый год между ним и текущим временем.
На данный момент хронологическими изменениями обладают три основных объекта: Окружение, Сообщество и Герои.
Состояние Окружения:
Окружение, кроме своих основных параметров, в определенный год имеет еще несколько дополнительных параметров:
- Список Героев, которые находятся в этом окружении.
- Список Сообществ, которые находятся в этом окружении.
- Список Популяций.
При расчете состояния относительно предыдущего чекпоинта список героев и сообществ не меняется, так как их изменения вызваны миграциями и создают новую контрольную точку.
С популяциями же на каждый промежуточный год проводится ряд операций:
- Отрабатывается смертность для каждой популяции.
- Далее отрабатываем взросление, для перехода членов возрастных групп в следующие.
- Следующим этапом разбиваем все популяции на группы с одинаковой расой для подсчета новорожденных. Далее работаем с каждой группой по отдельности.
- У каждой группы со всех её популяций собираем новорожденных.
- Находим в группе популяции, которые в этот год принимают новорожденных (это те поколения, у которых текущий год попадает в период рождения) и равномерно распределяем новорожденных между ними.
- Если в группе нет ни одной популяции принимающей новорожденных, то ищем поколение в текущем окружении для расы этой группы, которое имеет подходящий период рождения, и создаем на её основании новую популяцию с новорожденными.
- Если же не нашлось подходящего поколения для этого, то автоматом создаем новое с такими же параметрами как предыдущее, только меняем его тип и период рождения. И создаем популяцию с новорожденными на его основании. Параметры автоматически созданного поколения естественно можно будет подправить и изменить (довести до ума). Найти его будет не сложно, так как название по умолчанию для них будет "Pseudo".
- Ну и в самом конце убираем из состояния все опустевшие популяции.
Механизм автоматического создания поколения получился очень удобным, так как поколение - это самый часто создаваемый объект, и работа над ним уменьшается до редактирования параметров, которые меняются у поколения из-за изменений окружающей их обстановки.
Состояние Сообщества:
Дополнительные параметры сообщества:
- В каком окружении оно находится. На данном этапе я исхожу из того, что сообщество может находиться только в одном окружении (головной офис\штаб), и если оно из него уходит, то он должен переместиться в какое-то другое, либо исчезнуть. В будущем думаю проработать этот момент на наличие дочерних сообществ. Но это будут по сути другие сообщества, но непосредственно связанные с главным.
- Список Героев входящих в это сообщество.
- В качестве членов сообщества также выступает список популяций, но работа с ними немного упрощена.
Расчет состояния упрощается до отработки в популяциях смертности и взросления. Рождаемость в сообществе не отрабатывается, так как члены сообщества приходят из населения окружения.
Как мысль на будущее: создать у сообщества дополнительный параметр "Автоматический приём детей членов сообщества" для неких закрытых сообществ (люди запертые в отдельном бункере например, хотя по сути это будет уже окружение). Но это в случае возникновения такой необходимости.
Список героев и сообщество не меняется между контрольными точками, и в пересчете не нуждается.
Состояние Героя:
Герой, кроме своих основных параметров, имеет следующие параметры:
- В каком окружении он находится. Также как и у сообществ, герой может находиться только в одном окружении. И для будущего необходимо будет сделать проявление героя в других окружениях (Аватары), что-то типа других героев, но связанных с основной сущностью.
- В каких сообществах состоит герой. Тут герой может уже быть в нескольких сообществах. Преимущественно в тех, которые находятся в том же окружении что и он. Во всяком случае вступить можно будет только в местные сообщества.
Промежуточные состояния не пересчитываются, так как при переходах между окружениями и сообществами будет создаваться новый чекпоинт.
Итого:
Теперь для полной работы не хватает только Миграций. О них я расскажу в следующей статье.
P.S. Ставьте лайки, подписывайтесь, пишите комментарии. Это позволит развить блог и делиться в нем всем интересным в моих проектах. А на этапах тестирования гипотез и прототипов мнение большого числа людей будет очень важно.
P.P.S. для лучшего понимания статьи рекомендую прочитать предыдущие:
Идея первого проекта
Карта Хронологии
Теория поколений