Записи, помеченные ‘OCaml’

A Great Thought about Programming / CS

Суббота, 1/05/2010

Programming languages are rigorous but incomplete approximations of the language of mathematics. General purpose languages are Turing complete. That is, they allow to write all algorithms. (…) However, programming languages are not all equivalent, since they differ by their ability to describe certain kinds of algorithms succinctly. This leads to an —endless?— research for new programming structures that are more expressive and allow shorter and safer descriptions of algorithms. Of course, expressiveness is not the ultimate goal. In particular, the safety of program execution should not be given up for expressiveness. We usually limit ourselves to a relatively small subset of programs that are well-typed and guaranteed to run safely. We also search for a small set of simple, essential, and orthogonal constructs.

— “Using, Understanding, and Unraveling the OCaml Language. From Practice to Theory and vice versaDidier Rémy

Arena. Командный AI.

Воскресенье, 25/04/2010

Пишу “игрушку” с командным взаимодействием между управляемыми компом человечками. Основной принцип заключается в том, что логика для каждого персонажа выполняется функцией, получающей в качестве аргументов список клеток, на которые он может сходить, и список всех видимых ему других персонажей. Он может ходить и стрелять, все просто как кирпич ) Обзор сделан маленьким - круг радиусом в ~2.5 клетки.

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

Интересно проверить, на сколько сложного поведения удастся добиться от этих не особо многофункциональных человечков )

Возможно, что я допишу-таки свой интерпретатор ML-подобного скриптового языка на ocamllex/ocamlyacc, тогда можно будет даже распространять гаму по интернетам на радость фанатам OCaml/SML/etc. %)

Project Jealousy #1. Генерация портретов персонажей.

Воскресенье, 6/09/2009

Новости

Как я уже писал в “Project Jealousy #0“, я программирую 2D Tactical RPG. Основная механика хождения группы по пещерам, стрельба и освещение работают почти хорошо, поэтому теперь первостепенной задачей стал моск/разум существ. Сейчас я пишу скриптовый язык (NV-script) для программирования логики мобов, мувиков + кое-каких дополнительных возможностей (программируемый игроком робот !! А-а-а !!). Ботаю книжку Programming Language Pragmatics. Иногда хочется просто отвлечься от постоянного переписывания парсеров и лексеров, и сделать что-то существенное и интересное.

Портреты персонажей

Очевидно, маленькие персонажики 16 на 16 пикселей, пусть и увеличенные (x2) - это несколько недостаточно для создания атмосферы игры. Конечно, можно привести в пример rogue-like игры, но навязанный минимализм и культура рогаликов - это несколько не мое, поэтому я решил сделать портреты персонажей. Идея отличная, но чтобы нарисовать десятки или даже сотни портретов, надо искать художников, которых у меня наберется всего-то в количестве 0.25 человек. Что делать?

Кстати, три классических вопроса русской интеллигенции: Что делать? Кто виноват? И кто взял мои очки?

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

Основная идея - это разделение картинки на составные части: 1) овал лица, 2) глаза, 3) нос, 4) губы 5) волосы (прическа). Заменяя любую из частей лица, мы получаем уже другой внешний вид, другого персонажа. Достаточно даже всего четырех вариантов лиц, глаз, носов и т.д., которые дадут 4^5 = 1024 разных лица. Может быть, они и будут не сильно одушевленно и выразительно выглядеть, но в качестве фотографии на паспорт сойдут. Плюс, наличие персональных лиц позволяет сделать дополнительные приколы с полицией, ищущей опасных преступников по фотке, баунти-хантинг и т.п.

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

Механика

Каждая черта лица представляет собой последоватльное наложение белой основы, (если надо: лицо, прическа, губы), тени и контура (опять же, если надо). В показанных в этой статье картинках такой контур используется для глаз, бровей и носа, а обводка на лице - это часть “белой основы” (методика пока не отработана и изменения еще будут).

Каждая картинка обрабатывается фильтром (red, green, blue, alpha) и наклеивается на идущую перед ней. Полный нераскрашенный портрет выглядит так:

Отдельные части лица приведены на следующем рисунке в порядке их наложения. Пометка “shadow” означает, что картинка является тенью - как правило он выводится полупрозрачной (0.0 < alpha < 1.0).

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

Пока показан только один тип лица, и все различие сведено к раскашиванию.
В целом, кажется, что получается довольно неплохо.

Из плюсов таких портретов:

  • Разнообразие лиц
  • Похожий стиль каждого изображения
  • Меньше работы художника
  • ?
  • Профит

Из минусов, очевидно:

  • Разнообразие возможно только в допустимых перделах
  • Шаблонные лица - отсутсвие уникальности героев
  • Дополнительная сложность рисования, необходима совместимость различных черт лица между собой
  • Что-то еще, что может пофейлить идею

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

Project Jealousy #0

Четверг, 23/07/2009

Пока студентов учить не нужно и лето, работаю над игрой в стиле.. внимание.. Turn-based Tactic/RPG с возможными элементами Horror/Bloody-mess XD Звучит пафосно, это да.

Первоначальная идея была взята из супер-отличной коллекции идей геймдизайна “Three Hundred Mechanics “: (#086 - Darkness Creatures) и заключалась в управлении командой персонажей в данджене, в темных лабиринтах которого игрока дожидаются кровожадные мобы. Хотя эта идея была только отправной точкой, подсказав дизайн игры, основанный на освещенности игрового поля: каждый персонаж видит только небольшую область вокруг себя, а остальная часть карты погружена во мрак.

Управление командой персонажей - пошаговое с использованием Очков Действия (Action Points, AP), аналогичное системе Fallout/Fallout 2.

Язык реализации - OCaml (Objective-CAML) - клевый язык программирования, позволяюший использовать функциональную, объектно-ориентированную и императивную парадигмы. При этом он компилируется в высокопроизводительный исполняемый файл, часто сравнимый по скорости работы с программой на C/C++. Но в отличие от С++ тут есть “Сборщик мусора”, функциональные кошерности, суперудобная (хотя и не очевидная по началу) обработка данных по шаблону (pattern matching), и вообще много всего того, что должно быть в современном языке программирования %) Все это сильно повышает выразительность языка - по существу, каждая строчка кода несет смысл, и программируя думаешь о том, что тебе хочется получить, а не о том, что от тебя требует традиция языка/компилятора. У меня сложилось очень приятное впечатление. Существуют реализации компилятора OCaml под Linux/Windows/Mac. Имеется достаточно удобная стандартную библиотека. Для целей геймдева есть реализации SDL и OpenGL. Все работает как часы )

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

Ах, да, назваение Jealousy Project - это временное название, отчасти появившееся из-за песни X Japan - Silent Jealousy. В прочем, какая разница-то.. ))