Comments 8
В игре система поверхностей всё же сложнее показанного.
1) Поверхность пара создаётся над жидкостью и продолжает существование независимо. То есть под паром может быть новая жидкость с другими свойствами. Не увидел этого в коде
2) Благословенные и проклятые жидкости имеют приоритет над обычными. Нельзя погасить проклятое пламя обычной водой, сперва его надо благословить
3) Также не нашел, возможно ли существование проклятого огненного облака, которое есть в игре
Интересная статься, но в готовой игре система всё такие более углублённая со сложными для программирования нюансами
Спасибо, вы совершенно правы, что я учёл не все нюансы из оригинальной игры.
1) да, комбинация "поверхность + пар" в текущей версии невозможна. Мы действуем в парадигме "одной ячейке Cell - одна поверхность Surface". Однако в Cell можно создать дополнительный атрибут cloud (помимо surface), который должен быть в газообразном состоянии (если на него подействовали охлаждением, то произойдёт конденсация. Тогда субстанция облака вступит в реакцию с поверхностью согласно правилу set_base_surface).
2) я забыл об этой игровой особенности, спасибо, что напомнили. В set_base_surface можно добавить проверку - "если магическое состояние не нейтральное, то текущая базовая субстанция будет устойчива к вытеснениям". С огненными поверхностями чуть сложнее, например, нет же разницы между поджиганием благословленной и обычной нефти?
3) да, возможно. Для этого нужно применить цепочку преобразований:s = Surface()
s.set_base_surface(BaseSurface.FIRE)
print(s.heat().curse())
По поводу пункта 2): я внес изменения в код метода set_base_surface в статье, который поддерживает приоритет магических поверхностей.
Я бы начал как раз с хардкодинга. Описываете машину состояний, добавляете проверок на целостность. С поведением по умолчанию, легко пропустить какие-то шаги, а с валидной машиной, вы над каждым взаимодействием подумаете. Для заполнения данных не нужен будет программист. А ещё будет легко построить документацию и подсказки для пользователя, что можно сделать с этоц поверхностью.
Очень интересная статья. Я загорелся идеей сделать подобную систему на Raku, попробую написать ответную статью со сравнением, как бы выглядело то же самое, но в контексте другого языка. Мне кажется, что многие повторяющиеся части вроде веток if-else, конструкций с and можно упростить. Например, отдельные ветки можно разбить на мультиметоды, а повторяющиеся условия сократить с помощью Junctions https://docs.raku.org/type/Junction
Программируем систему окружающей среды из игры Divinity: Original Sin 2 на Python