Найти тему
Invariant World

Checkpoint (чекпоинт)

Оглавление

Это контрольная точка (срез) состояния объекта, который имеет хронологические изменения в определенной единице летоисчисления (для меня это год). Контрольная точка создается для объекта в случае его внешнего изменения, например в случае миграции. Между контрольными точками состояние объекта рассчитывается автоматически.

По сути можно было обойтись без этих контрольных точек. Состояния можно рассчитывать от создания объекта на основании хранимых изменений, но я хочу, чтобы у некоторых объектов могла быть многотысячная история, и пересчет может занимать много машинного времени. А так, в случае изменений в середине хронологии объекта, можно будет пересчитать только последующие контрольные точки, и промежуточные состояния будут рассчитываться очень быстро.

Для получения текущего состояния объекта необходимо взять предыдущий чекпоинт и прогнать по алгоритму изменений на каждый год между ним и текущим временем.

На данный момент хронологическими изменениями обладают три основных объекта: Окружение, Сообщество и Герои.

Состояние Окружения:

Окружение, кроме своих основных параметров, в определенный год имеет еще несколько дополнительных параметров:

  • Список Героев, которые находятся в этом окружении.
  • Список Сообществ, которые находятся в этом окружении.
  • Список Популяций.

При расчете состояния относительно предыдущего чекпоинта список героев и сообществ не меняется, так как их изменения вызваны миграциями и создают новую контрольную точку.

С популяциями же на каждый промежуточный год проводится ряд операций:

  • Отрабатывается смертность для каждой популяции.
  • Далее отрабатываем взросление, для перехода членов возрастных групп в следующие.
  • Следующим этапом разбиваем все популяции на группы с одинаковой расой для подсчета новорожденных. Далее работаем с каждой группой по отдельности.
  • У каждой группы со всех её популяций собираем новорожденных.
  • Находим в группе популяции, которые в этот год принимают новорожденных (это те поколения, у которых текущий год попадает в период рождения) и равномерно распределяем новорожденных между ними.
  • Если в группе нет ни одной популяции принимающей новорожденных, то ищем поколение в текущем окружении для расы этой группы, которое имеет подходящий период рождения, и создаем на её основании новую популяцию с новорожденными.
  • Если же не нашлось подходящего поколения для этого, то автоматом создаем новое с такими же параметрами как предыдущее, только меняем его тип и период рождения. И создаем популяцию с новорожденными на его основании. Параметры автоматически созданного поколения естественно можно будет подправить и изменить (довести до ума). Найти его будет не сложно, так как название по умолчанию для них будет "Pseudo".
  • Ну и в самом конце убираем из состояния все опустевшие популяции.

Механизм автоматического создания поколения получился очень удобным, так как поколение - это самый часто создаваемый объект, и работа над ним уменьшается до редактирования параметров, которые меняются у поколения из-за изменений окружающей их обстановки.

Состояние Сообщества:

Дополнительные параметры сообщества:

  • В каком окружении оно находится. На данном этапе я исхожу из того, что сообщество может находиться только в одном окружении (головной офис\штаб), и если оно из него уходит, то он должен переместиться в какое-то другое, либо исчезнуть. В будущем думаю проработать этот момент на наличие дочерних сообществ. Но это будут по сути другие сообщества, но непосредственно связанные с главным.
  • Список Героев входящих в это сообщество.
  • В качестве членов сообщества также выступает список популяций, но работа с ними немного упрощена.

Расчет состояния упрощается до отработки в популяциях смертности и взросления. Рождаемость в сообществе не отрабатывается, так как члены сообщества приходят из населения окружения.
Как мысль на будущее: создать у сообщества дополнительный параметр "Автоматический приём детей членов сообщества" для неких закрытых сообществ (люди запертые в отдельном бункере например, хотя по сути это будет уже окружение). Но это в случае возникновения такой необходимости.

Список героев и сообщество не меняется между контрольными точками, и в пересчете не нуждается.

Состояние Героя:

Герой, кроме своих основных параметров, имеет следующие параметры:

  • В каком окружении он находится. Также как и у сообществ, герой может находиться только в одном окружении. И для будущего необходимо будет сделать проявление героя в других окружениях (Аватары), что-то типа других героев, но связанных с основной сущностью.
  • В каких сообществах состоит герой. Тут герой может уже быть в нескольких сообществах. Преимущественно в тех, которые находятся в том же окружении что и он. Во всяком случае вступить можно будет только в местные сообщества.

Промежуточные состояния не пересчитываются, так как при переходах между окружениями и сообществами будет создаваться новый чекпоинт.

Итого:

Теперь для полной работы не хватает только Миграций. О них я расскажу в следующей статье.

P.S. Ставьте лайки, подписывайтесь, пишите комментарии. Это позволит развить блог и делиться в нем всем интересным в моих проектах. А на этапах тестирования гипотез и прототипов мнение большого числа людей будет очень важно.

P.P.S. для лучшего понимания статьи рекомендую прочитать предыдущие:
Идея первого проекта
Карта Хронологии
Теория поколений

Честно говорю: Картинка для обложки :)
Честно говорю: Картинка для обложки :)