Система типов и Dwarf Fortress (3)

предыдущая серия

В рамках физического движка, есть игроки, двери, различные предметы, представленные своей геометрией. Движок, собственно, выполняет только анализ коллизий, а клиентская часть выполняет рендер.
Довольно естественно напрашивается представление каждого вида объекта некоторым типом T — скорее всего, в классической реализации на каком-нибудь объектно-ориентированном языке разработчики так бы и поступили. Есть базовый объект, есть его наследники, и т. д. Вдобавок, у типа T есть некий view, ответственный за рендер. И есть набор функций, получающих на входе экземпляр T. С их помощью мы и реализуем схему взаимодействия.

На первый взгляд, этот подход совершенно очевиден, и додумается до него любой программист.

Но рассмотрим следующий простой пример — объект (тип) «Фляга». Он реализует абстрактный класс Контейнер и содержит внутреннее значение типа Жидкость.
Для этого типа мы определяем три функции:
1) «Опустошить»: возвращает содержимое фляги и пустую флягу;
2) «Наполнить» (сущностью типа «Жидкость»): на входе пустая фляга и объем жидкости, на выходе полная фляга;
3) «Разбить»: на входе фляга и твердая поверхность (объект соответствующего типа ТвёрдаяПоверхность), на выходе её содержимое (жидкость), осколки и некоторый выхлоп энергии (например, в ваттах).
У каждого результата функции — свой тип.

Теперь мы можем добавить в игру бензин (тип Жидкость), для которого определена функция «Воспламеняться», получающая на вход некий объем бензина и ватты для инициализации,  и выдающая на выходе Взрыв.

Для поставки жидкостей (например, воды) создадим тип Кран. Он может содержать воду или бензин, а функция «Наполнить» получает на вход контейнер и вызывает его функцию Наполнить с параметром-своим содержимым. Таким способом мы реализуем водопроводную станцию. А заменив содержимое экземпляра Кран на бензин, получим бензозаправку.

Теперь герой может свободно набирать по пути воду или бензин. Причём необязательно для этого применять флягу — можно использовать, например, стакан (любой подходящий наследник Контейнера).
Если же персонажу добавить функцию Пить, он сможет утолять жажду водой, или получать отравление от других типов жидкости, и т. д.

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

И это очень странно — мы ходим по огромному миру, в котором дизайнерами тщательно прорисованы тысячи, а то и десятки тысяч графических элементов, каждый из которых занимает наверняка не один час труда. Но все эти десятки тысячи объектов сводятся от силы к сотне типов! Так почему бы программистам не потратить несколько минут, чтобы, по указанной выше схеме, фактически на скриптовым декларативном языке, добавить пять-десять строк, которые определяли бы поведение соответствующего типа при взаимодействии с другими? Ведь у нас есть готовая система типов, которая позволяет прозрачно реализовывать такой подход.

Но это факт: ни одной игры с соответствующей осмысленной свободой интерактивности на рынке нету, а вот графический контент своими объемами подчас просто поражает. В качестве контр-примера, конечно, можно привести хардкорный Dwarf Fortress с невероятным количеством возможностей. Именно поэтому он и порождает уникальный игровой контент.

Но — равных ему потому и нету, что создавался Dwarf Fortress, как рассказывают сами авторы, отнюдь не по описанной выше схеме. Конечно, в нем есть некий относительно универсальный механизм функционального расширения, однако, во-первых, этот процесс гораздо труднее, нежели описанный мной. А во-вторых, Dwarf Fortress со временем, при увеличении числа игровых объектов даже до относительно невысоких значений (тысячи), начинает работать ужасающе медленно. Это классическая проблема, характерная для 100% любительских проектов, а вот в случае использования правильной системы типов она исключается автоматически, так как комбинирование «интерактивностей» прозрачно выполняет система типов ещё на этапе компиляции!

Далее мы немного обобщим и детализируем данную идею.

Поделиться статьей ...Share on Facebook0Share on Google+0Tweet about this on TwitterShare on LinkedIn0Share on VKPrint this page

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *