MMORPG прошлого века: как мы создали первый Киевский игровой сервер

Давным давно на далеком сервере…

Вторая половина девяностых. В СНГ интернет как таковой еще только начинает развиваться. Коммерческих сайтов практически нет (а если и есть, то исключительно айтишной тематики). Web еще не стал тем местом, где пользователи проводят основную часть времени. Доминирующая технология последней мили — dial-up, на котором в основном читают почту и сидят в ICQ. Но энтузиасты айтишники уже пользуются и ньюсами и IRC и несколькими другими сервисами. И конечно играют в сетевые игры!

Doom, в который можно было поиграть вдвоем по модему или вчетвером в локальной сети уже смещен с позиции самой популярной сетевой игры. Сейчас поднимают пиратские батлнет сервера на PVPGN — там можно сразиться в Starcraft и Diablo уже в компании до 4–8 игроков (чем больше игроков, тем больше вероятность лагов). В шутерах доминирует Quake и Quake2 — в игре одновременно может быть уже десяток игроков, и уже не зависеть от чужих лагов (ибо UDP).

Кто-бы мог подумать, что примерно всего через десять лет появятся игры, в которые может одновременно играть сотня или тысяча игроков, и даже больше!

1265e3564ff9f81fa5177a53b0c4f159.png

Но что это только что было?
Неужели такие игры уже есть?
Да, уже есть! А если взять англоязычный мир, так уже давным-давно!

Рождение FD

В 1998 году официально запускается первый Киевский MUD (Multi User Dungeon/Dimension) сервер «Forgotten Dungeon».
Для него по шапочному знакомству выделили немного места на одном из FreeBSD-серверов в общежитии Киевского Политехнического института.

38baa6b473cef2c3ee8c039abc11c33f.png

Это не первый русскоязычный MUD сервер, но один из них.
Московский «Мир Мерлина» был запущен примерно на год раньше.
А вот с другими серверами в СНГ старшинство уже можно и оспорить (привет, Zmey и ко.!).

Благодаря большой локальной сети общежитий КПИ, раскинутой на витой паре, коаксиале и честном слове, сервер быстро заполняется игроками.
В активные дни количество игроков находящихся в мире превышает 100, то и 150, что по тем меркам весьма немало!
Такой онлайн позволяет не просто побегать по миру в компании практически в любое время суток, но и наладить дипломатические отношения между кланами и даже альянсами.

Внешний канал для института был проблемой — интернет в то время был медленным и дорогим, поэтому были периоды, когда игровой сервер не был доступен снаружи.
Но по договоренности с ректоратом, для «Forgotten Dungeon» в конечном счете все-таки сделали исключение, как для общественно-полезного проекта.
Снаружи он был известен по адресу mud.ntu-kpi.kiev.ua:4000 до конца своей активной жизни (2005–2007).
Хотя, честно говоря, внешние игроки составляли не более 10% основного онлайна.

991949023609a2c307f39ad4ba78fef8.png

С одной стороны это несколько ограничивало популярность, но с другой стороны давало свои уникальные преимущества, практически недоступные другим MUD-ам.
Регулярные встречи игроков и разработчиков в реале еженедельно, а то и несколько раз в неделю. Обычная рядовая пятничная сходка могла собрать более половины всего состава.

Такая тесная и регулярная связь и общий энтузиазм вдохновляли на множество безумных идей, и «Forgotten Dungeon» очень быстро обрастал сложной боевой/магической механикой и уникальными фичами.

Конечно, по современным меркам, все разработчики в основном не дотягивали даже до джуниоров — обычные студенты, из которых не все отличали компилятор от линкера.
Мы просто писали код с горящими глазами.
Сервер падал — его поднимали и писали скрипты с автоматическим рестартом.
Сервер ломался — его чинили и писали новые фичи с новыми ошибками, которые снова чинили.
Иногда появлялись игроки и «мимокрокодилы» с факультетов информатики, которые могли написать немного больше, чем «hello world». Они делали свой вклад и пропадали.

Однако, несмотря на полное отсутствие коммерческого опыта разработки, мы были открыты к любой полезной информации.
В какой-то момент, узнав про существование систем контроля версий, я перевел все на CVS с коммитами и странной системой версионирования.
Еще не было Jenkins/Teamcity, не было gitlab/gerrit и других привычных CI инструментов, но у нас при коммите новых изменений уже триггерилась сборка новой версии с отправкой логов. А админ, не выходя из игры мог командой перезагрузить игровой сервер с обновлением на новую версию, что позволяло разграничить права доступа, давая возможность вносить изменения в код, но не давая доступ к полной админке.
На каждое падение сервера, автоматически генерировался отчет с отладочной информацией (dbg стектрейс) и уходил на почту.
Для тех времен, это было очень круто!
За почти 10 лет существования сервера, вклад в разработку внесло несколько десятков человек. Без контроля версий, и этих на коленке сделанных скриптов, наверное не получилось бы и половины вещей довести до ума.

Конечно, несмотря на все наши значимые (как нам тогда казалось) попытки причесать код, он очень далек от того, на что можно равняться.
Но мне кажется, это довольно неплохой проект «на поиграться» для начинающих разработчиков, которые хотят освоиться в Си, и научиться работать с базовыми вещами — условия, циклы, структуры данных, неважно тебе 10 или 30+ лет.
По слухам, на кодовой базе нашего сервера, было даже несколько человек, защитивших свои дипломы.
Но были и отчисленные за неуспеваемость слишком увлеченные игроки… Каждый берет что может (;

Технические данные

За базу был взят один из отделившихся от DikuMud движок, а именно ROM 2.4b4a — довольно популярная кодовая база на то время.
К сожалению, сам репозиторий со всей историей коммитов не удалось сохранить (это современные системы типа git хранят всю историю локально, а более старые CVS только на сервере).
Но сохранилась последняя версия исходного кода.
При помощи Google и stackoverflow я смог довести код до состояния, когда он собирается и запускается на современном Линуксе.
В коде есть текстовый файл, где вручную писали комментарии на жуткой смеси русского (нецензурного)/английского, но посторонним его читать не рекомендуется.

Еще до запуска сервера в институте, он стоял у меня на рабочем сервере, я игрался с ним в одиночку (зарегистрировались несколько знакомых, которые заходили в основном потестить какие-то фичи). Но раскручивать я его не собирался, ибо не был готов хостить полноценный сервер на работе, так что я и КПИ нашли друг друга (:
Добавил поддержку кодировок (koi-8, cp-866, win1251 и транслитерацию), добавил поддержку контрольных символов для ANSI colors, поправил какие-то ошибки.
И даже придумал и реализовал систему простых автоматических квестов.
Но эти вещи можно найти практически в каждом MUD, а я хочу поделиться некоторыми уникальными инсайдами или просто забавными моментами.

Делаем простые вещи

Если говорить о базовых элементах программирования — например на практике понять разницу между знанием синтаксиса if/then/else и умением им пользоваться хорошо, то игровые механики в таких простеньких консольных или браузерных играх это просто превосходный вариант для начинающих! Ведь для того, чтобы увидеть результат нового супер-пупер заклинания, тебе не нужен гейм-дизайнер, художник, музыкант и кто-то еще. Многие вещи делаются простыми командами.

Например: научился проверять значение переменной, и создал новую переменную, статус «friendly fire». Добавляем немного условий — и код готов. А с точки зрения игрока — полностью меняется боевая составляющая, потому что теперь можно сражаться команда на команду или клан на клан или стая однотипных монстров против игроков, пользуясь массовыми заклинаниями и не вредя своим «друзьям».

Можно сделать переменную «Статус зрителя», и создать арену для дуэлей, на которой могут находиться зрители в полной безопасности. Еще немного переменных — и можно уже делать ставки на победителя, и вот уже «просто посмотреть за чужой дуэлью» превращается в азартное зрелище вроде «арены гладиаторов» с букмекером! А учитывая что игра текстовая — все зрители могут смотреть, так сказать, с лучшего места в первом ряду ;)

Пробуем что-нибудь посложнее

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

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

Уникальные локации

Игровой мир в Forgotten Dungeon был довольно большим. И становился еще больше. Несколько карт было скачано с разных ресурсов, адаптировались, переводились, подключались.
Но еще больше карт рисовали сами игроки. Так была нарисована собственно карта и самого Киевского Политехнического института с кучей локальных мемов и отсылок. Среди NPC фигурируют фамилии преподавателей и ректоров. И наверное хорошо, что на тот момент эти люди были далеки от игр и компьютеров, ибо цензура на сервере была минимальна ;)
Парочка фамилий, которые можно встретить в игре: Федорова, Куцик, Сенько, Шпортюк, Кравцов, Савицкий, Скоробагатько, Линчевский и др.

81a2d4de7571905fbcccb0afaa82a1f6.png

Воспоминания про армию

Однажды мы придумали армию.
Натуральную.
По достижению 18 уровня, все вещи у игрока забираются, и его переносит в закрытую локацию.
В этой локации он даже пообщаться с другими игроками не может, за исключением тех, кто уже в «армии». Из внешнего мира можно было прийти в специальную «комнату переговоров», в котором можно было пообщаться и даже передать предметы (только с типом «вода» или «еда»).
Без поддержки друзей, клана и хороших предметов, нужно было выжить три уровня с высокоуровневыми агрессивными монстрами (сержанты, солдаты, прапорщики…), пока на 21 уровне товарищ Майор не отправлял тебя назад в общий мир. Иногда даже игроки из враждующих кланов объединялись в армии =)
Но за смерть в армии не штрафовали, поэтому рано или поздно армию проходили все.
Казалось бы — ну придумали и придумали.
Но Армия оказала заметное социальное воздействие.

Небольшое отступление: в середине 90х во многих MUD у игроков вообще могла отсутствовать возможность сражаться друг с другом, так как многие MUD создавались как социальные игровые «чаты» с ролевой составляющей в стиле DnD (или другой тематикой). На ресурсах со списком серверов, даже отдельно указывалась поддержка PK (Player Killing) в описании сервера.

Смерть персонажа в игре воспринималась неприятно — потеря опыта, потеря предметов, и в отличие от уже одиночных RPG, нельзя было сохраниться.
Но Армия в нашем MUD «сделала из тварей дрожащих львов и тигров».
После армии, страх перед смертью заметно падал, отношение к игровому персонажу менялось.
Я слышал пару историй, когда игроки из нашего мира уходили в другие миры и наводили там шороху.
Даже верю, что это могло оказать какое-то влияние и в реале. Ну собственно для кого-то это так и было.
Конечно с армией тоже было связано много багов, которыми пользовались любители халявы, но мы это дело находили и прекращали:

874b5671e842f40c98a95f4a5d1ac829.png

Сотни мелочей

Введено много уникальных рас, с действительно заметными отличиями. Сейчас в MMORPG это уже норма, а тогда и рас было мало, и в базовом движке их отличие было в основном в небольшом разбросе изначальных параметров — силы, ловкости и так далее.
У нас вводились заметные изменения.
Раса Вампиров, которые заметно прибавляли в силе по ночам и вынуждали игроков следить за сменой дня и ночи в игре.
Банальные вещи — Ящеры умеют плавать. Пикси — летать. Этериалы — проходить сквозь двери и сопротивляться режущему оружию. Зомби могут не есть и не дышать. У Кентавров четыре ноги, поэтому удар двумя копытами вполне заменял серьезное оружие.
Гномы могут перековывать предметы, улучшая их при помощи специальных артефактных компонентов (да, у нас гномы-игроки уже были прародителями современных крафтеров).
В общем сотни мелочей, которые в сумме значительно влияли на то, как следует одевать/вооружать/прокачивать и отыгрывать своего персонажа в зависимости от расы.

Введены перерождения с частичным сохранением навыков предыдущего класса, позволяя создавать сложные комбинации (например вор/маг и маг/вор — далеко не одно и тоже, а это ведь необходимо дважды прокачаться до 101 уровня.)

Админы и игроки творят вместе

Мы любили игроков-энтузиастов. У нас была активная поддержка кланов и гильдий — мы вводили уникальные индивидуальные визуалиации для игроков и кланов. Мы вводили уникальные заклинания, навыки и фичи и локации для кланов и гильдий прямо в код, которые придумывали вместе с игроками.
Да, всегда на фоне старались не забывать о балансе, но согласитесь — в современных играх такая идейная поддержка игроков и ролевой составляющей практически невозможна.

У нас были «отношений», включая секс, свадьбы, разводы и даже возможность получить статус «родственника». Да, следует ставить рейтинг 18+.

Были игроки-одиночки, которые не хотели в клан. Но клановые фичи были довольно «вкусные». И мы сделали для них специальный клан для одиночек «LONER». Он ни к чему не обязывал, но указывал, что человек сам по себе и давал возможность пользоваться защищенным тепленьким местом с кроватью для отдыха.

Внутренняя кухня

Некоторые решения были довольно странные по архитектуре. Например, никто из нас не умел работать с базами данных и не особо разбирались в том, насколько это удобно. Честно говоря, в то время из известных баз были Foxpro и MS Access. MySql еще не был известен. А Oracle какой-то версии 5–6 был жутко тяжелым и решения на его базе только начинали продаваться далеко в Москве.
В большинстве MUD движков данные игроков хранились в файлах. Проблемным моментом в этом было то, что сохранение файла игрока обычно происходило во время его выхода из игры, и практически все сервера были подвержены ошибке с дублированием предметов.
Рецепт примерно такой: Ты узнаешь любой баг в игре, который приводит к падению сервера (это встречалось частенько и в разных мадах).

4f2e34ec54717f3e6f98ce418a9d1a5c.png

Инструкция: в игру заходят два игрока, у одного есть «вкусный» предмет.
Он отдает его второму. Второй выходит из игры (его профайл сохраняется уже с предметом).
Первый игрок крашит сервер (или дожидается такого краша), и его инвентарь не успевает сохраниться в файл.
После рестарта сервера — оба заходят — и каждый с предметом.

Мое ужасное, но рабочее решение было в лоб — если игрок производил любые манипуляции с предметами, на него вешался флаг «сохранить».
При сохранении какого-либо игрока, сохранялись все игроки с таким флагом одновременно.
При онлайне 100–200 игроков вопрос производительности не стоял, файлы игроков занимали в среднем 3–4 килобайта.
Решение сработало отлично, и duplicate bug в нашем мире исчез (главное чтобы не крашилась сама процедура сохранения).

Можно было просто почитать документацию о fopen/fwrite, и вот — добавлены административные команды для работы с оффлайн игроками.
Администраторам игры было полезно уметь забанить, разбанить, проверить информацию по игрокам, которые сейчас оффлайн, без доступа к консоли сервера.

Работаем с текстом

Переводя фразы изначального движка и создавая новые, текст для действий старались строить таким образом, чтобы он звучал корректно вне зависимости от пола игрока.
Например: «Ты уже благословил Aelita» — звучит неблагозвучно, если заклинание колдует девушка.
Нейтральная фраза выглядит как: «Aelita уже под божественным благословлением».

Но затем была придумана и реализована система работы с полом.
В коде это выглядело как: «Ты уже благословил$a Aelita», (ch→sex)
Нужное подбиралось из массива [», «а», «о»] для он, она, оно.
Или с использованием готовой функции: act_new («Задание перв$b выполнил$r $n!», ch, NULL, NULL, TO_ALL, POS_DEAD);

Чуть позже, по той же схеме добавили обработку падежей.
Для этого в описании персонажей (в основном для NPC) нужно было руками прописать склонения: «волшебн|ый|ого|ому|ого|ым|ом дракош|а|и|е|у|ей|е».

В тексте фразы указывалась нужная форма:
act (»$c1 выдыхает облако кислоты в $C4.», ch, NULL, victim, TO_NOTVICT);
Функция проверяла есть ли для данного персонажа набор падежей, если нет — просто брала инфинитив.

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

27162852338da5e16375e8fbd5c87dff.png

Каждый мир существовал в своем небольшом сообществе и действительно был гораздо более уникален, чем пиратские шарды современных MMORPG, которые в основном отличаются только «рейтами».

Зарубежом

История зарубежных англоязычных МАДов гораздо более долгая. Она начинается чуть ли сразу с появления первых сетей — второй половины семидесятых. Общее количество игроков и онлайн на отдельно взятом крупном сервере могло посоревноваться с общим онлайном всех серверов в СНГ вместе взятых.

Например Arctic MUD, который появился еще в 1992 году, к концу девяностых мог похвастать онлайном свыше 1000 человек, доходя в пиковое время почти до двух тысяч. Многие англоязычные MUD могли позволить себе монетизирование, которое в то время в СНГ было бы непонятым и попросту невозможным. Также для игры в MUD, точнее комфортной игры, желательный уровень английского языка заметно выше чем elementary. Это также было довольно серьезным барьером для желающих поиграть.
Вполне возможно что за рубежом было придумано и воплощено много разных интересных вещей, и многие из наших нововведений могли оказаться вторичными.

Пик MUD серверов в рунете пришелся на тот небольшой промежуток времени, когда сама идея многопользовательских текстовых игр была уже неплохо проработана. Существовало несколько готовых движков с разным подходом к основной механике: level-based (dikumud, ROM, Merc and many other), когда персонаж получает уровни и от уровня уже получает навыки, заклинания и улучшения параметров (elf 80-го левелу), или skill-based (Avalon, Clok, DartMUD), когда уровня нет вообще, или он ни на что не влияет, а значение имеет только уровень владения различными навыками и заклинаниями (владение двуручным мечом 12 уровня).

Но уже всего через несколько лет на хвост начали наступать первые «графические МАДы», как их называли вначале — Ultima Online, Everquest. А затем подтянулись уже и более современные MMORPG — Lineage/Aion/WOW и другие. Поэтому отечественные мады, ярко вспыхнув, горели не слишком долго — около десяти лет (примерно с 1997 по 2005–2007), вытесненные более современными играми.

Я потратил примерно одинаковое количество времени на администрирование «Forgotten Dungeon» и шарда Lineage2, и могу сказать, что с точки зрения игровой механики, МАД конечно гораздо глубже, шире, и предоставляет больше возможностей и свободы для игроков.

Легкость введения новых возможностей и требования к уровню разработчиков просто не сопоставима. Вдобавок для игры не нужен современный компьютер или мощная видеокарта. Даже требования к скорости подключения весьма скромные.

Но удобство и простота управления, привлекательность и конечно визуальная составляющая — конечно на стороне графических игр.

Я подсчитал, что в «Forgotten Dungeon» есть примерно 350 команд, которые можно ввести (правда часть из них административные, часть эмоции), около 120 заклинания и примерно 50 навыков (активных и пассивных). Гайдов и форумов практически не было в силу неразвитости веб, есть только довольно обширная, но запутанная внутренняя справка. Примерно месяц занимало просто чтобы игрок стал чувствовать себя в игре уверенно и ориентироваться в мире.
А для большинства графических игр — месяц это зачастую если и не ветеран, то уже довольно опытный игрок.

На текущий момент (2021 год) еще можно найти несколько живых серверов в СНГ (http://www.mudconnector.su/MudList), но это лишь тень минулого и зачастую они пустуют.
А вот среди англоязычных серверов можно найти десяток серверов, с онлайном в 500–800 игроков.

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

Конец истории

Я уверен, что наши восторженные «открытия» тех времен сейчас вряд ли кого-то удивят.
Подход к разработке заметно изменился. Количество готовых наработанных решений за 20 лет можно найти практически на любой случай. Паттерны, структуры данных (словари, двухсторонние списки с уже готовыми методами работы) и множество других вещей — уже встроено в язык.
Но эта статья — кусочек реальной истории одного из первых виртуальных миров Украины и рунета.

Исходники «Forgotten Dungeon» доступны на https://github.com/sfkulyk/fdungeon
Кстати, выложить код в github (правда без некоторых последних правок), я успел еще до https://archiveprogram.github.com/, поэтому можно надеятся, что исходники FD переживут всех нас ;)

Сам игровой мир (пусть и пустой) живет по адресу mud.saboteur.com.ua:4000, чисто из чувства ностальгии. Много он не просит, а вдруг кто зайдет пустить слезу по временам, когда трава была зеленее.

Изредка я могу вносить мелкие правки, а также планирую использовать его в школьно-образовательных целях, но ничего серьезного вносить не планируется (тем более что я не разработчик, а так — балуюсь). Если кому интересно — форкайте!

Буду благодарен, если при этом вы сохраните в текстах наши юные смешные имена

Спасибо всем, кто дочитал до конца.

© Habrahabr.ru