Статья первая. Общий взгляд на nmud


Черновая версия веб-интерфейса (слева) и сам мад-сервер (справа)

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

Сразу оговорюсь, сейчас готово 5-7% от планируемого.

Оригинал расположен здесь, копипаста от 17.06.17.

UPD: Уже после написания решил побродить по сайту. Оказывается, движок соответствует всем требованиям Artist'a. Кто-нибудь, скажите ему об этом.



nmud — это MUD, написанный на Java с нуля, без заимствований чего-либо из других мадов, кроме самой идеи. Да и та очень сильно изменилась в процессе.

Проект разделен на несколько репозиториев. В ядре содержится основной, платформонезависимый код движка. Демо — это демонстрационные проекты для нескольких платформ. Игровые данные, которые нужны демке для работы, находятся в nmud-content. Ну а в nmud-docs накиданы различные идеи и концепты.

Художественная составляющая

Все предметы уникальны. У всех есть небольшие черты, отличающие предметы друг от друга — царапинки, оттенки окраски, неровности. Поэтому все предметы производятся мобами и игроками. Причем под 'производятся' понимается полный цикл производства. К примеру, то, что в доме появился стол (стул, шкаф, пол), означает, что выросло дерево, его срубили, обработали, распилили, сколотили стол, привезли и продали. Вот так.

Все предметы можно разбирать. Те, которые разобрать нельзя (состоящие из одной части), можно сломать. Ну а настолько простые предметы, что невозможно сломать сильнее, можно растереть до состояния порошка. Кроме того, большинство предметов можно расплавить или сжечь.

Разумеется, можно торговать, интриговать и воевать. Или не делать ничего из этого, а просто мастерить что-нибудь. Можно спасать мир, можно пытаться его уничтожить. Можно устраивать революции или по-тихому грабить в подворотнях. В общем, полная свобода.

Мир живет, мир меняется
С миром можно взаимодействовать. Для этого есть команды взаимодействия с миром, которые выглядят примерно так: «заблокировать дверь шкафом», «выкинуть стул в окно», «передвинуть стол к стене». Результатом выполнения этих команд будет то, что стол, который стоял в центре комнаты, будет передвинут к стене; окно будет разбито стулом; в комнату никто не сможет попасть, так как игрок закрыл дверь шкафом.

Все квесты «двигают» историю мира. Квесты более-менее уникальны и выдаются _конкретному_ игроку или группе игроков. Как правило, задания имеют несколько путей решения; для большинства заданий есть соотвественные задания-антиподы.

К примеру, Вы игрок. Вы отыгрываете дознавателя. Ваш начальник дает приказ расследовать серию преступлений в одном из кварталов города. Вы можете осмотреть место преступления, опросить свидетелей (да, с мобамм можно общаться), нанять бедняков или беспризорников, и/или придумать еще что-то. Пока Вы ведете расследование, преступники — скажем, контрабандисты — занимаются противоположным заданием: заметают следы. Предположиим, Вы нашли преступников. В этом случае виновные предстанут перед судом и, быть может, будут сосланы на рудники; Вас повысят/наградят; цены на «запрещенку» повысятся.

Через некоторое время количество выполненных квестов переходит в качество — меняется глава мировой истории, изменяется сам мир.

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

Домены
Домен — это некоторая часть (область) карты, которая может рассматриваться отдельно от остальных частей. По сути, это что-то вроде локации, но с особыми свойствами.

В зависимости от настроек сервера, каждый игрок или только игрок с особыми правами может создать собственный домен.

Несколько игроков могут договориться, и стать соседями. Тогда домены станут граничить друг с другом: из одного можно будет беспрепятственно перейти в другой. Сетка из нескольких доменов-соседей называется областью, или регионом.

Размеры домена могут быть неограниченно увеличены или уменьшены без вреда соседям.

У доменов нет четкой привязки к пространству: местоположение домена меняется в зависимости от того, с какими доменами он граничит.

География мира, слои.

Домены могут располагаться на разной высоте, или, другими словами, в разных слоях. На нашем сервере семь слоев:
  • Ад, или инферно. Находится глубоко под землей, здесь очень жарко и живут демоны. Однако ни сами грешники, ни их души сюда не попадают.
  • Пещеры. Расположены над адом и под поверхностью. Темно, зачастую сыро. Странные полуслепые животные и светящиеся растения.
  • Поверхность. Основной слой, в котором происходит все самое интересное. В этом слое размещено больше всего доменов и населения.
  • Воздух. Атмосфера, облака. Парящие острова прилагаются.
  • Пустота. Или вакуум. Здесь нет ничего, даже воздуха.
  • Лед. Именно его отблески на поверхности принимают за свет звезд и солнца.
  • Сон/мечта. Очень интересный слой. Здесь расположены те места, в которых можно побывать во время сна; здесь же живут боги; тут расположено то, что Вы видите на картинах. Очень непостоянный, изменчивый слой.

Набор слоев и их свойства могут быть изменены. Мы пока думаем над этим.

О классах, уровнях и рангах.
Возможности выбрать определенный класс из списка всех классов нет, уровни персонажа также отсутствуют. Однако есть специализации и ранги.

Специализация — это то, чем Ваш персонаж может заниматься лучше всего. Почти каждое действие аватара повышает специализацию в какой-либо области. Часто занимаетесь раскрытием преступлений? Ваша специализация — сыщик. Занимаетесь охотой на диких зверей? Вы — охотник. Водите караваны между городами и продаете товар подороже? — торговец. И так далее.

Ранг показывает, как высоко вы находитесь в иерархии какой-либо группы, будь то гильдия, клан или армия. Соответственно, рангов много — столько же, сколько групп в игровом мире. Выполняете задания группы, помогаете ей — лидер группы или кто-то с высоким рангом повышает Вас.

Техническая составляющая

Начну с того, на что обращают внимание в первую очередь. Демонстрационный сервер принимает клиентов на telnet и http. Скриптовый движок — lua. Однако архитектура сервера позволяет работать по любому клиент-серверному протоколу, будь то ssh, xmpp, irc — любой из них (но не ограничиваясь ими) можно встроить в сервер за пару часов. Можно встроить и любой другой скриптовый движок, который есть для Java, если Вам не нравится lua. Например, python, реализованный в Java jython'ом; ruby, используя JRuby, или javascript, для которого есть два движка — rhino и dynjs.

Сервисы
Система хорошо масштабируема, так как основана на модной сервис-ориентированной архитектуре (SOA). Точнее, на SOA в понимании iillyyaa2033. Система состоит из одного или нескольких серверов — т.е. запущенных программ nmud-server.exe. Каждый сервер состоит из сервисов — грубо говоря, подпрограмм, которые выполняют некоторую работу и доступны через RMI (местный аналог RPC). Например, сервис работы с базой данных, сервис приема и общения с клиентами (шлюз), множество различных сервисов игровой механики.

Такая архитектура позволяет использовать один и тот же код и на маленьком тестовом сервере, запущенном на андроид-планшете, и на нескольких winows- или linux-серверах, если когда-нибудь будет действительно большой онлайн. Кроме того, эта архитектура вкупе с доменной системой позволяет создать единый и вместе с тем децентрализованный мир.

Домен
Основой мира является домен, о котором уже говорилось в этой статье. Точнее, DomainService — сервис, который содержит этот самый домен. Создать новый домен и доменный сервис очень просто — находим в системе сервер с низкой нагрузкой, размещаем в нем новый DomainService, подключаем уже существующие сервисы симуляции — и вуаля! домен готов принимать игроков. Кроме того, вынесение доменов в раздельные сервисы позволяет избежать той неловкой ситуации, когда криво написаный скрипт вешает всю систему: в случае домен-сервиса падает только он сам.

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

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

Entity — это базовый класс сущности, от которого наследуются все остальные. Имеет имя, материал, размеры и проч.; состоит из сущностей. Пример — меч. Называется 'меч', выглядит поцарапанным, но надежным, он двуручный и довольно тяжелый, на клинке — пятна ржавчины, рукоять обмотана кожей. Если, скажем, разломать этот меч, то каждый из обломков можно изучить отдельно.

ContainerEntity. Сундуки, ящики, комоды, шкафы, комнаты в домах — то, что может содержать в себе какие-либо предметы. К тем параметрам, которые есть у Entity добавляется 'содержимое' — список объектов, которые он содержит.

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

Creature. Очень интересный тип сущности — существо. Представляет все то, что наделено разумом (все животные, большинство деревьев). Наследуется от Entity. Список содержимого представляет иерархию органов. Поэтому всяческие ранения персонажей, а также процедуры лечения будут детальны и разнообразны.

Словарь
Мы отказались от полностью рукописных описаний в пользу генерируемых; однако правила генерации все еще необходимо задавать руками. К сожалению или счастью, генерируемый текст — это единственная возможность выдавать описания местности и предметов в том случае, когда содержимое одного помещения за час может измениться на 120%, а обычная деревянная ложка — превратиться в грозный, обитый металом боевой черпак 'Злобноложка'.

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

Прочее
Разумеется, идей у нас гораздо больше, чем описано в этой статье. Однако о двух идеях я просто обязан упомянуть.

Во-первых, сервисы физики и биологии позволит выполнять трюки на уровне 'расплавим золото дыханием дракона, тот надышится паром и умрет от гипоксии'.

Во-вторых, сервисы ИИ и биологии также включают в себя симуляцию жизни. То есть НИПы будут, есть, пить, спать, гадить и размножаться. Особо умные — люди, например — общаться и заниматься трудом. Кроме того, соответственные сервисы могут быть дополнены и/или модифицированы скриптами и конфигами, если Вам нужно, чтобы мобы вели себя иначе, чем это в них заложено 'из коробки'.

4 комментария

avatar
Задумали что-то сложное и необычное, молодцы. Но разобраться, что вы делаете сложновато, наверно, не помешали бы условные схемы, что как устроено и что с чем связано.

Самое главное, пока не понятно какую игру вы хотите получить. Что в вашей игре будут делать игроки? Это будет hack&slash рогалик с крафтом, или Survival-игра, в которой игроку чтобы выжить надо делать одежду, оружие, дома и т.д.?
avatar
Документация, в том числе и схемы, будет. Но заниматься ей сейчас — не самая лучшая идея, так как при разработке многое меняется: я пробую и экспериментирую, ведь подобным раньше не занимался. Как только сервер как следует утрясется, можно будет говорить и о доках; случится это где-то после беты.

Жанр и окружение не упоминал специально, так как этот момент мы еще обсуждаем. Пока что остановились на средневековье с уклоном в реализм¹: в меру survival'a, в меру хардкора, отыгрыш. Но будем посмотреть: я еще не нашел ту концепцию, о которой смог бы сказать «вот! это то что надо».

1. Но магия вполне может быть, тут не все так однозначно.
комментарий был удален
avatar
Ясно.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.