Для управления зависимостями используется pnpm
.
pnpm install
npm run start
Настройки симуляции по умолчанию:
- Размер: 50x50 [2500 клеток];
- Итерации в секунду: 100;
- Итерации за тик: 1;
- Near: 0.1;
- Far: 10000;
- Правила: S23B3;
Все эти настройки можно вручную менять в
src/scripts/constants
. Правило по умолчанию задаётся в функцииdefaultRulesFunction
вsrc/scripts/meta/rules.ts
.
Описание GUI:
- Общее
- On/Off (переключает режим симуляции)
- Очистить поле (очищает поле)
- Скопировать поле [с сжатием] (транслирует матрицу всего поля в строку и сохраняет в буфер обмена)
- Скопировать поле [без сжатия] (транслирует минимально необходимую матрицу - необязательно квадратную -, содержащая все необходимые клетки, в строку и сохраняет в буфер обмена)
- Настройки симуляции
- Итерации в секунду (количество тиков в секунду)
- Итерации за тик (количество итераций за тик)
- Правило (список доступных правил)
- [RULE_NAME] (по каким правилам вычисляется жизнь и смерть клеток)
- Шаблоны (список доступных шаблонов)
- [TEMPLATE_NAME] (шаблон подсказки)
- Режимы
- Инверсирование (вместо живой клетки шаблона подставляется мёртвая, а вместо мёртвой - живая)
- Оживление (клетки, соответствующие живым клеткам шаблона, оживают)
- Уничтожение (клетки, соответствующие живым клеткам шаблона, умирают)
Для добавления нового правила необходимо дополнить объект rules
в src/scripts/meta/rules.js
объектом следующего формата:
interface Rule {
name: String,
stay: Array<number>,
birth: Array<number>
}
При этом ключ в объекте должен быть таким же, как и Rule.name
. Например:
{
// ...
[RULE_S245B368]: {
name: RULE_S245B368,
stay: [2, 4, 5],
birth: [3, 6, 8]
},
// ...
}
Для добавления нового шаблона необходимо дополнить объект templates
в src/scripts/meta/templates.ts
объектом следующего формата:
interface HintTemplate {
name: String, // Внутреннее название правила
guiName: String, // Название правила, которое будет выводиться в GUI
string: String, // Строка, представляющая из себя сжатую матрицу [результат копирования поля в GUI]. Состоит из цифр и символов o, b, $ и !
width: Number, // Ширина шаблона
height: Number // Высота шаблона
}
При этом ключ в объекте должен быть таким же, как и HintTemplate.name
. Например:
{
// ...
[DOT]: {
name: DOT,
guiName: "Точка",
string: "o!",
width: 1,
height: 1
},
// ...
}
ВАЖНО: пока что нет поддержки неквадратных матриц. Необходимо, чтобы width
и height
совпадали.
Матрица сжимается в строку по следующему алгоритму:
encodeMatrixToString (
[
[1, 1, 0],
[1, 0, 1],
[1, 0, 0]
]
) == "2o$obo$o!" // все неуказанные клетки считаются мёртвыми
- Символ
o
соответствует живой клетке, а число перед ним указывает на их количество. - Символ
b
соответствует мёртвой клетке, а число перед ним указывает на их количество. - Символ
$
соответствует началу строку. - Символ
!
соответствует концу строки шаблона.
- Добавить возможность добавлять пользовательские шаблоны
- Добавить возможность изменять правила симуляции
- Добавить возможность создавать неквадратное поле
- Выделить симуляцию в отдельный пакет (?)
- Добавить файл с описаниями функций [JSDoc]
- Пересмотреть получившуюся архитектуру
- Улучшить UX gui
- При копировании матрицы добавить в строку информацию о правилах
- Сетка не подстраивается под длину и высоту клеток (cells.js)
- Исправить мерцание шаблонов
- При изменение скорости итераций с высокой на низкую симуляция некоторое время не работает