Симуляция воды в моей песочнице (YASG)

Проблема симуляции воды - это сложная задача для игр-песочниц, поэтому многие индюки (инди-разработчики) решают воду вообще не делать. Я подумал, что из этого получилась бы прикольная фишка, поэтому все же реализовал.

У меня в игрушке мир состоит из 2d блоков 32х32 пикселя. Вот представим, что у нас есть 1 такой блок воды. На блок воды действует сила тяжести. На гифке в яму падает по пол блока воды.


Блок воды делится на 4 части, которые "лежат" одна на другой. Количество воды в блоке - дискретная величина.
У каждого блока есть 2 параметра: объем (сколько там частей, от 1 до 4) и "псевдодавдение". Псевдодавление нужно, чтобы разравнивать поверхность воды - чтобы вода равномерно распределялась по доступной области.

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

У этого подхода есть один недостаток: не работают сообщающиеся сосуды.


Водичка булькает :)

Если в воде кто-то плавает, то при поднятии уровня воды этот кто-то телепортируется на 1 блок наверх. Если сверху нет места, то появляется утопленник(и).


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