MMORPG минулого століття: як ми створили перший київський ігровий сервер

Давним-давно на далекому сервері...

Привіт, мене звати Сергій, я працюю DevOps-інженером у компанії Luxoft. Хочу розповісти про появу одного з найперших MMORPG-серверів в Україні та загалом на пострадянському просторі в ті часи, коли інтернет ще був тільки на модемі.

Ця стаття може бути цікава усім, хто грав у MMORPG і полюбляє читати історії, які трапилися багато років тому, на початку поширення інтернету. Гадаю, особливо вона «зайде» тим, хто навчався в КПІ приблизно у 1998–2004 роках.

Друга половина дев’яностих

На території колишнього СРСР інтернет ще тільки починає розвиватись. Комерційних сайтів практично немає (а якщо і є, то лише айтішного напряму: простенькі сторінки з можливістю завантажити прайс). Web ще не став тим місцем, де користувачі проводять більшу частину часу.

Провідна технологія — dial-up. Користувачі переважно читають електронну пошту і сидять в ICQ. Але ентузіасти-айтішники вже користуються «ньюсами» (Usenet Newsgroups) і IRC тощо. І, звичайно, грають у мережеві ігри, про які й поговоримо.

DOOM, в який можна було пограти удвох через модем або вчотирьох у локальній мережі, вже зміщений з позиції найпопулярнішої мережевої гри.

Нині піднімають піратські батлнет-сервери на PvPGN. Там можна битися в StarCraft і Diablo вже в компанії до 4–8 гравців (що більше гравців, то більша ймовірність лагів).

У шутерах домінує Quake і Quake2: у грі одночасно може бути десяток людей i гравець уже не залежить від чужих лагів (тому що використовується протокол UDP).

Хто ж міг подумати, що всього за десять років з’являться ігри, в які одночасно зможе грати сотня чи тисяча людей, і навіть більше!

Що? Невже такі ігри вже є? Так! А якщо взяти до уваги англомовний світ, то вже давно!

Народження FD

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

Це не перший MUD-сервер на пострадянському просторі, хоча й один з них. World of Merlin був запущений у Москві приблизно за рік до цього. А ось з іншими серверами в СНД за старшинство вже можна й позмагатись (привіт, Zmey і ко.!).

Завдяки великій локальній мережі гуртожитків КПІ, розкинутій на крученій парі, коаксіалу та чесному слову сервер швидко заповнюється гравцями. В активні дні кількість людей, що грають одночасно, перевищує 100–150, що на той час немало.

Завдяки такому «онлайну» можна не просто побігати локаціями в компанії практично в будь-який час, а й налагодити дипломатичні відносини між кланами й навіть альянсами. Зовнішній канал для інституту був проблемою: інтернет на той час був дорогий і повільний. Тому були періоди, коли ігровий сервер не мав доступу зовні. Але за домовленістю з ректоратом для Forgotten Dungeon все-таки зробили виняток як для суспільно корисного проєкту.

У великому світі він був відомий за адресою mud.ntu-kpi.kiev.ua:4000 до кінця свого активного існування (2005–2007 рр.). Однак, чесно кажучи, зовнішні гравці становили не більше як 10% основного онлайну.

З одного боку, це дещо стримувало популярність, а з іншого — давало свої переваги, недоступні іншим MUD’ам. Регулярні зібрання гравців і розробників наживо щотижня, а то й кілька разів на тиждень. Звичайна зустріч у п’ятницю могла зібрати більш ніж половину всього складу. Такий тісний зв’язок і загальний ентузіазм надихали на безліч божевільних ідей, і Forgotten Dungeon швидко нарощував унікальні можливості та складну бойову/магічну механіку.

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

Сервер падав — його піднімали і писали скрипти з автоматичним рестартом. Сервер ламався — його лагодили й готували нові фічі з новими помилками, які знову потрібно було виправляти. Іноді з’являлися гравці і «мимокрокодили» з факультетів інформатики, які могли написати трохи більше, ніж Hello World. Вони робили свій внесок і зникали.

Попри повну відсутність комерційного досвіду розробки, ми були відкриті до будь-якої корисної інформації.

В якийсь момент, дізнавшись про існування систем контролю версій, я перевів усе на CVS з комітами та не дуже виразною системою версіонування. Ще не було Jenkins/Teamcity, не було GitLab/Gerrit та інших звичних CI-інструментів. Але під час комiту нової версії вже можна було запустити компіляцію із надсиланням логiв поштою.

А адмін, не виходячи з гри, міг командою перезавантажити ігровий сервер з оновленням на нову версію. На кожне падіння сервера автоматично генерувався звіт з відладочною інформацією (dbg стектрейс) і відсилався на пошту. Для тих часів це було дуже круто.

За майже 10 років існування сервера внесок у розробку зробило кілька десятків людей.

Без контролю версій і на колінці створених скриптів, напевно, не вийшло б і половини речей довести до ладу. Звичайно, попри всі наші значущі (як нам тоді здавалося) спроби упорядкувати код, він був далекий від того, на що можна рівнятися.

Але мені здається, це непоганий проєкт «погратися» для розробників, що роблять свої перші кроки, хочуть освоїтися в С і навчитися працювати з базою: умовами, циклами, структурою даних тощо. За чутками було навіть кілька випускників, що обрали дипломною роботою технології нашого сервера. Були й відраховані за неуспішність, занадто захоплені гравці... Кожен бере, що може ;)

Технічні дані

За основу взяли рушій, що відколовся від DikuMUD, а саме ROM 2.4b4a — популярна кодова база на той час. На жаль, сам репозиторій з усією історією комітів не вдалося зберегти. Це сучасні системи на зразок Git зберігають всю історію локально, а більш старі, як-от CVS, — тільки на сервері.

Збереглася тільки остання версія коду. За допомогою Google і Stack Overflow я зміг довести код до стану, коли він компілюється і запускається на сучасному Linux. У коді знайшовся текстовий файл, де вручну писали коментарі на страшній суміші російської (нецензурної) та англійської, але стороннім його читати не рекомендую.

Ще за пів року до запуску сервера в інституті я грався з ним сам. Додав підтримку кодувань (koi-8, cp-866, win-1251 і транслітерацію), контрольних символів для ANSI colors, виправив помилки. І навіть придумав і реалізував систему простих автоматичних квестів. Але це можна знайти майже в кожному MUD. Далі розповім кілька історій про наш сервер.

Робимо прості речі

Якщо говорити про базові елементи програмування, наприклад на практиці зрозуміти різницю між знанням синтаксису if/then/else та умінням цим користуватися, то ігрові механіки в консольних або браузерних іграх є чудовим варіантом для початківців.

Адже для того, щоб побачити результат нової супермагії, тобі не потрібен геймдизайнер, художник, музикант або хтось іще. Багато речей робляться простими командами та придуманою текстовою фразою для візуалізації.

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

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

Про ігровий час

У якийсь момент я розібрався з тим, як працюють «часи» у рушії, і подумав, що можна зробити уміння або магію, що потребують деякий час на створення і які можна навіть перервати під час виконання. І які будуть візуально давати відчуття, що ти вичакловуєш щось потужне. Наприклад, заклинання порталу займало декілька секунд і створювало портал (який зникав через деякий час). Через нього міг пройти вже будь-який гравець.

Технічна реалізація заклинання «поліморф» вже була складніша. Високорівневий маг мав змогу перетворитися на будь-який повноцінний предмет, який можна було взяти. Якщо це була зброя, можна було озброїтися і битися. Якщо їжа — з’їсти її (з’їдений гравець вмирав :)

Складність полягала в тому, що всі тригери на оповіщення персонажа (хтось поруч зайшов, хтось сів, щось сказав, хтось встав і пішов) були зав’язані на об’єкті «персонаж». Варто було додати численні перевірки й тригери, щоб гравець, що перетворився на об’єкт «предмет», отримував повну інформацію з навколишнього світу.

Із заклинанням було пов’язано багато проблем, чим з радістю користувалися «зловмисники». Але всі помилки наприкінці були виправлені, а саме заклинання внесло значні зміни в командну гру та особливо кланові війни.

Унікальні локації

Ігровий світ у Forgotten Dungeon був досить великий. І ставав ще більший. Кілька карт було завантажено з різних ресурсів, адаптовано, переведено та пiд’єднано. Але ще більше карт створювали самі гравці.

Так була зроблена власне карта й самого Київського політехнічного інституту з купою локальних мемів і відсилань. Серед NPC фігурують прізвища викладачів і ректорів. І добре, що на той момент ці люди були далекі від ігор і комп’ютерів, бо цензура на сервері була мінімальна ;)

Декілька прізвищ, які можна помітити в грі: Федорова, Куцик, Сенько, Шпортюк, Кравцов, Савицький, Скоробагатько, Лінчевський.

Спогади про армію

Одного разу ми придумали «армію». Натуральну. Після досягнення 18-го рівня всі речі у гравця забираються, і він переміщується у закриту локацію. У цій локації він навіть поспілкуватися з іншими гравцями не може, за винятком тих, хто вже в «армії».

Із зовнішнього світу можна було прийти в спеціальну «кімнату перемовин», поспілкуватися і навіть передати предмети (тільки з типом «вода» або «їжа»). Без підтримки друзів, клану та хороших предметів потрібно було пройти три рівнi з високорівневими агресивними монстрами (сержантами, солдатами, прапорщиками), аж доки на 21-му рівні товариш Майор не відправить гравця назад у загальний світ.

Але за смерть в «армії» не штрафували, тому рано чи пізно «армію» проходили всi. Здавалося б, ну придумали й придумали. Але «армія» мала значний соціальний вплив.

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

Смерть персонажа в грі сприймалася досить важко: ти втрачав досвід, міг втратити предмети з інвентарю. Але «армія» на нашому сервері «зробила з тварюк тремтячих левів і тигрів». Після неї страх перед смертю помітно падав, ставлення до ігрового персонажа змінювалося.

Я чув кілька історій, коли гравці з нашого світу створювали клани на інших серверах і наводили там шороху. Навіть вірю, що це могло надати якийсь вплив і в реалі. Ну, власне, для когось це так і було.

Звичайно, з «армією» теж було пов’язано багато багів, якими користувалися «халявщики», але ми це знаходили та виправляли, іноді додаючи трошки гумору:

Сотні дрібниць

Ми ввели багато унікальних рас зі значними відмінностями. У сучасних MMORPG це вже норма, а тоді й рас було мало, і найчастiше їхня відмінність полягала в невеликому «розкиді» початкових параметрів — сили, спритності тощо. У нас були значні зміни. Наприклад, раса Вампірів, які посилювались вночі та слабшали вдень, змушувала гравців стежити за зміною дня і ночі в грі. Гноми перековували предмети, покращуючи їх за допомогою спеціальних артефактних компонентів (так, у нас гноми-гравці вже були предками сучасних крафтерів).

Банальні речі: Ящери вміли плавати та бити хвостом. Пікс — літати. Етеріали — проходити крізь двері й чинити опір холодній зброї. Зомбі не їли та не дихали. У Кентаврів чотири копита, тому удар ногою замінявся на подвійний удар. Розмір мав значення: велетні могли брати дворучну зброю в одну руку, маленькі краще ухилялися.

Загалом сотні дрібниць, які в сумі значно впливали на те, як варто одягати / озброювати / прокачувати і відігравати свого персонажа залежно від раси.

Введено переродження у новий клас з частковим збереженням навичок попереднього класу, що давало змогу створювати складні комбінації. Наприклад, злодій / маг і маг / злодій — далеко не одне й те саме, а це ж треба двічі прокачатися до 101-го рівня.

Адміни та гравці творять разом

Ми любили гравців-ентузіастів. Була активна підтримка кланів і гільдій: ми додавали індивідуальні візуальні фічі, унікальні навички або магію прямо в код. Усе придумували разом з гравцями. Але в сучасних іграх така підтримка гравців практично неможлива.

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

Були гравці-одинаки, які не хотіли в клан. Але кланові фічі були досить «смачні». І ми зробили спеціальний клан для одинаків LONER. Він ні до чого не зобов’язував, але вказував, що людина сама по собі й давав можливість користуватися захищеним теплим місцем з ліжком для відпочинку.

Внутрішня кухня

Деякі рішення були досить дивні за архітектурою. Наприклад, ніхто з нас не вмів працювати з базами даних і навіть не знав, що це і наскільки зручно. Чесно кажучи, в той час з відомих баз були доступні, мабуть, тільки FoxPro і MS Access. Oracle версії 5–6 була дуже важкою і рішення на її базі тільки починали продаватися, а MySQL ще не була відомою.

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

Рецепт приблизно такий: ти дізнаєшся будь-яку помилку в грі, яка призводить до падіння сервера (регулярна річ).

Інструкція: в гру заходять два гравці, в одного є «смачний» предмет. Він віддає предмет іншому. Той виходить з гри (його профайл зберігається вже з предметом). Перший гравець валить сервер (або чекає, поки вiн впаде), і його інвентар не встигає зберегтися в файл. Після рестарту сервера обидва гравці заходять — і кожен з предметом. Моє робоче рішення «в лоб»: якщо гравець робив будь-які маніпуляції з предметами, на нього вішалась помітка «зберегти».

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

Варто було лише почитати документацію про fopen / fwrite. І ось додані адміністративні команди для роботи з офлайн-гравцями. Адміністратори гри могли забанити, розбанити, перевірити інформацію щодо гравців, які зараз офлайн, без доступу до консолі сервера. А це вже розподіл прав доступу. В адміністратора міг бути левел від 102 до 110 (повні права).

Працюємо з текстом

Під час перекладу текст активних подій в грі намагалися будувати таким чином, щоб вони звучали коректно незалежно від статі гравця.

Наприклад: «Ты уже благословил 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);

Функція перевіряла, чи є для цього персонажа набір відмінків, якщо не було, просто брала інфінітив. Базу NPC оновлювати не встигали, але начебто в центральних та популярних локаціях можна було насолоджуватись милозвучністю:

Кожен світ існував у своїй невеликій спільноті й справді був оригінальніший за піратські шарди сучасних MMORPG, які переважно відрізняються тільки «рейтами». Тому кожен окремий MUD-сервер — це не тiльки особлива атмосфера, а й щоразу безліч великих і дрібних відмінностей від інших серверів у різних аспектах. Також це історія людей. Деяких уже немає з нами, але їхній слід є в довідках про устави кланів, піснях та інших текстах. Ось текст однієї з пісень.

За кордоном

Історія закордонних (насамперед англомовних) MUD набагато цікавіша та довша. Вона починається мало не з появи перших мереж — другої половини 70-х.

Кількість гравців загалом і на окремо взятому сервері також було більша, якщо порівнювати з серверами в СНД. Наприклад, Arctic MUD, що відкрився ще 1992 року, до кінця дев’яностих міг похвалитися «онлайном» у понад 1000 гравців, а в годину пік кількість становила майже дві тисячі.

Багато англомовних MUD могли дозволити собі монетизацію, яка в той час в СНД була неможлива. Також для гри в MUD, а точніше для комфортної гри, бажаний рівень англійської мови був помітно вищий за Elementary. Це теж серйозний бар’єр.

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

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

А потім підтяглися вже і більш сучасні MMORPG — Lineage / Aion / WOW та інші. Тому вітчизняні MUD, яскраво спалахнувши, горіли не дуже довго — близько десяти років (1997–2007 рр.), й були витіснені більш сучасними іграми.

Я витратив приблизно однакову кількість часу на адміністрування Forgotten Dungeon та шарду Lineage2 і можу сказати, що з погляду ігрової механіки MUD, звичайно, набагато глибший, ширший, він дає більше можливостей і свободи гравцям.

Легкість введення нових можливостей і вимоги до рівня розробників просто не порівняти. Також для MUD не потрібен потужний комп’ютер, ігрова відеокарта та швидкісний інтернет. Але зручність, простота управління, привабливість (особливо для молодшої цільової аудиторії) на боці графічних ігор.

Я порахував, що в Forgotten Dungeon було приблизно 350 команд, які можна ввести (включаючи адміністративні та емоції), близько 120 заклять, 50 навичок (активні та пасивні). Гайдів нема. Це приблизно на місяць, тільки щоб звикнути до інтерфейсу та стати більш-менш впевненим гравцем. До графічної гри звикаєш за кілька годин, а за тиждень вже почуваєшся вільно та комфортно.

Наразі можна знайти кiлька серверiв в СНД, але це тільки тінь минулого. А ось серед англомовних ще є десяток з онлайном у 500–800 гравців.

Варто відзначити, що MUD — це практично єдиний варіант цікавої мережевої MMORPG-гри для сліпих гравців, оскільки це легко адаптується за допомогою речових синтезаторів. Є цілі клани таких гравців. Та й підтримка текстової гри вимагає небагато часу.

Кінець історії

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

Код Forgotten Dungeon доступний на GitHub. До речі, викладаючи код на GitHub (щоправда, без кількох останніх змін), я встиг потрапити до GitHub Arctic Archive program, тому можна сподіватися, що код Forgotten Dungeon переживе нас усiх ;)

Сам ігровий сервер (нехай і порожній) доступний за адресою mud.saboteur.com.ua:4000. Багато він не просить, а раптом хтось зайде й поностальгує.

Іноді я можу вносити дрібні правки, також планую використовувати код з навчальною метою, але нічого серйозного впроваджувати не буду (плюс я ще й не розробник), тому якщо кому цікаво — форкайте.

Буду вдячний, якщо при цьому ви збережете в текстах «наши юные смешные имена»... Дякую всім, хто дочитав статтю до кінця.

Похожие статьи:
Проработав 6 лет на позициях Front-end Developer в MacPaw и Grammarly, в прошлом году Дмитрий Филипенко решил взять таймаут и поступить на 1 курс...
У випуску: розпізнавання карт з Python, FB використовує Python 3.6.3, генератор ботів для ігор. Новини Python is the 2nd most popular language on GitHub —...
В сети уже появлялись слухи о готовящемся смартфоне начального уровня Samsung Galaxy J1 (SM-J105F), к примеру, не так давно он был замечен...
«Билайн» и Благотворительный Фонд «Линия жизни» запустили совместный новогодний проект «Все мы родом из...
Нещодавно ІТ-спільнота закрила вже другий збір на безпілотник PD-2 — цього разу 31 млн грн зібрали за п’ять днів....
Яндекс.Метрика