“Вся Галлия делится на три части”

В мудах из семейства Diku/Circle/ROM можно выделить три части. Первая это код, то есть исходный текст на языке C или C++ или их сочетании. Вторая это мир, то есть игровые зоны, в текстовом формате файлов zon/wld/mob/obj/trg/shp для ветки Circle и в едином формате are для ветки MERC/ROM. Третью выделяю только я, это то, что я называю “файлы данных” и чаще всего они находятся в каталоге misc. Там находится “цифирь”, то есть все параметры классов, умений, заклинаний, уровней и так далее. Часть из этих цифирей находится в коде, и для их изменения надо уметь перекомпилировать исходники (и иметь их в наличии). А вот те цифры, которые находятся в файлах данных можно просто поменять и перезапустить мад (или выполнить в маде команду reload) и все в мире изменится.

Чтобы запустить у себя сервер надо иметь все три части, причем код может быть как в виде готового бинарника, так и в виде исходников, что конечно предпочтительнее, по крайней мере для тех, кто знает основы программирования. А иногда эти части распространяются отдельно (и порой имеют различные лицензии и правовые статусы). Например, tbamud присутствует на github полностью, то есть код, файлы и зоны. Эти зоны они называют stock zones, но некоторые авторы зон (билдеры) не разрешают свободно распространять свои зоны. Кроме авторского произвола (или желания заработать) здесь есть и игровая логика – изучив файлы зоны игроки получат преимущество, так как заранее, не играя будут знать топологию зоны, квесты, параметры монстров и так далее. Это как в D&D игрокам сильно не рекомендуется читать Книгу мастера (спойлеры, “вам потом неинтересно будет”).

А вот Былины (несмотря на сложный характер отцов-основателей) были чуть ли не первым русскоязычным мадом, опубликовавшим свой исходный код вместе со “стоковыми” файлами и тремя начальным зонами. Ну, вы знаете эту душераздирающую историю, несколько раз из штаб-квартиры Былин происходили утечки других зон (и файлов), на базе которых делали пиратские “локалки”, например широко известная в узких кругах “НВОшная локалка” или не менее известное Зеркало.

Недавно я нашел на github англоязычный Luminari MUD, который объявлен как последователь tbamud (а tba – наследник Circle), причем в Luminari использован механизм D20. Я решил его поковырять, оказалось, опубликован только код, который достаточно легко собрался. И что дальше с ним делать? Оказалось, что в Luminari используется хранение базы игроков и некоторые параметры и хелпы в базе mysql, то есть в качестве “стоковых файлов” должен был быть дамп этой базы, которого в поставке не было. И игровых зон не было. Игровые зоны я взял со старой версии  Luminari, а проблему с базой решил самым кардинальным образом – я начал жестоко курочить код (я называю это методом дурацкого хака и помечаю коментарием prool fool), и получится франкенштейн, который как-то запускался. Он не умеет хранить базу игроков, в нем надо постоянно регистрироваться, но походить по комнатам можно. Этот хак я еще не опубликовал, я не думаю, что он может быть кому-то сильно интересен.

А совсем недавно я нашел исходники русскоязычного муда по Ведьмаку. Начал их ковырять, и увидел, что они сделаны на базе Былин и чего-старого типа старого Circle или старого ROM. Информация об игроках там хранится в 24 подкаталогах с именами в виде латинских букв. То есть игрок Алекс будет лежать в каталоге a, игрок Пруль в p, Романа в r и так далее. Это было в каком-то старом ROM, потому что новые Circle (как и Былины) используют 6 каталогов A-E F-J K-O P-T U-Z ZZZ. Но остальные потроха у Ведьмака былиновские, но файлов и зон не было от слова совсем. Я откомпилировал его (это оказалось просто) и начал подбрасывать ему файлы данных от старого Зеркала, при ошибках делая их пустыми (то есть умений и заклинаний не будет). И постепенно сервер начал запускаться, потом я подбросил ему одну зону от Зеркала и ЭТО запустилось.

Для желающих поковырять вот моя франкенштейн-версия на gitlab https://gitlab.com/prool/cholera-mud

Называется она Холера муд. Ведьмак Геральт в фильмах и играх любил ругаться по-польски, слово KURWA я посчитал слишком неприличным, а вот CHOLERA в самый раз.

А вот сборка Холеры для Виндовс http://mud.kharkov.org/files/cholera-mud.zip

Она же временно крутится у меня на сервере на порту 7777 (хост мой обычный, mud.kharkov.org)

Впрочем, оригинальный Ведьмак вполне себе жив и крутится вот здесь: game.mudlast.ru 2700

Маленькое наблюдение про русификацию

Я уже писал, что русификацию английских кодовых баз делаю простейшим способом: в кодовых базах, основанных на Circle/DIKU/ROM/MERC в одном месте модфицируется код проверки вводимого символа так, чтобы все 8-битные символы проходили нормально. Один из последних примеров вот. Но при этом во входной поток могут попасть управляющие символы протокола telnet (или их куски). Когда это бывает? Например после ввода пароля. Во многих кодовых базах для безопасного ввода пароля управляющими символами отключается эхо, а потом оно включается. А во время регистрации после пароля мад спрашивает sex и на любой первый ответ выдает сообщение об ошибке, приходится второй раз говорить m. (Я всегда говорю m).

Так вот, оказалось последние версии клиента tintin++ эту проблему с выскакивающими мусорными символами решают. В версии 2.02.12 все ок, а например в prooltin, основанном на tintin 2.01.7 выскакивает ошибка. Команда telnet тоже дает ошибку (что естественно, он тупой по определению, он так сделан). Чуть позже протестирую другие клиенты.

UPDATE. Проблему можно решить как на стороне сервера, так и на стороне клиента. В новой версии tintin++ проблема решена на стороне клиента – “не реагируем на мусорные символы”. Но я внес коррективы в функцию isprool и теперь не выдаю эти мусорные символы и старая версия tintin++ и некоторые другие виндовые клиенты, которые раньше глючили, теперь не глючат. В общем, проблема решена.

Shadow Realms MUD

В Дискорд-чате кинули ссылку на исходники еще одного русского мада Shadow Realms. А также вот.

Я немного повозился и собрал мад в Убунте, это оказалось сравнительно несложно. Моя версия вот.

Этот мад, кстати, сейчас работает: mud.nnov.net 9000

Сайт мада.

Реинкарнация ROM

Один энтузиаст рефакторит ROM

https://www.reddit.com/r/MUD/comments/crn5r6/followup_to_rom_codebase_cleanup_now_online_again/

https://github.com/Synival/BaseMUD

Update. Под Центосом собралось и запустилось нараз. Под Убунтой пришлось удалить лишние зависимости из Makefile и в паре мест заменить ‘\0’ на 0. Запускать виртуалку с Дебианом мне стало лень

Update #2.
UTFизировать по “методу Пруля” код удалось очень легко, как и остальные Circle и ROMы. При этом вместо сочетания вызова функций isascii и isprint в модуле  comm.c надо использовать функцию  isprool.

// prool begin
int isprool(char c)
{
if ((c<32)&&(c>=0)) return 0;
if (c==-1) return 0;
if (c==-3) return 0;
return 1;
}

// prool end

Update #3. Под Андроидом тоже удалось собрать. Мои эксперименты выложены в Гитлаб: https://gitlab.com/prool/basemud-prool/ (пока без русификации). Это первый ROM, который у меня заработал на Андроиде, потому что rom-quickmud что-то собрался, но при запуске начал крешать. А Цирклы работают без проблем – tbamud & EmpireMUD

Как я ехал в метро

Сегодня утром по дороге на работу вместо того, чтобы залипать в твиттер, залипал в терминал termux на Андроиде и игрался со сборкой мад-серверов под Андроид.

Как я уже ранее писал, tbamud собирается с пол-пинка. ROM собирается. Виртустан муд собирается, но выпадает в корку на каком-то вызове lexical cast. А в Былинах-0 (это очень-очень-очень старая версия Былин, по сути слегка русифицированный Circle) внезапно нашелся ассемблерный код на ассемблере x86 (а телефон построен на процессоре ARM). Перепишу эти вставки на C и посмотрю, что будет дальше.

Кстати, когда телефон подключается к Wi-Fi, запущенный там мад-сервер может быть виден из Интернета, а вот при использовании 3G/4G – нет

Update. Код Былин-0 оказался психологически несовместим с используемым в Андроиде “богомерзким кленгом”. А tbamud и rom – рулез!

О русификации ROM

На выходных ВНЕЗАПНО решил поразвлекаться и русифицировать ROM. В качестве примера ROM’а взял rom24-quickmud:

https://github.com/prool/rom24-quickmud

Замечания к данному релизу:

1. В отличие от Circle, где вместо if (isprint() && isascii()) можно написать даже if (1) здесь такое не проходит, так как выскакивают команды протокола telnet, которые портят пароль и первую вводимую команду (смутно вспоминаю, что с первой испорченной командой я уже сталкивался ранее и вышел тогда тупо, выведя сообщение “нажмите энтэр два раза”). Я пока игнорирую коды FF, FD, FE, но это неправильно, так как могут теряться некоторые буквы некоторых кодировок, например “большой твердый знак” в koi8-r

Update. В последней ревизии на github обработка команд telnet сделана корректно

О русификации QuickMUD-lua

С подачи товарища Пацифиста начал русифицировать QuickMUD+lua (Авраам породил Иакова, ROM породил QuickMUD, а потом товарищ Odoth добавил туда lua). В общем, все делается примерно по тому же шаблону, что и ранее слегка русифицированный tbaMUD. Русские команды лучше и проще реализовывать не в общей таблице, а отдельным обработчиком, вызываемым до основного. А то всякие глюки выползают из-за UTF-8

Всё здесь:

https://bitbucket.org/prool/quickmud-lua-russian

А вот взгляд на проблему с другой стороны: http://muder.ru/blog/172.html

И снова о русификации английских кодовых баз, основанных на Circle

Я только о том, чтобы мад воспринимал символы из второй половины таблицы ASCII. И строго говоря это не русификация и даже не кириллизация, а интернационализация и UTFизация

Возьмем, к примеру TBAMUD

Файл comm.c, в функции perform_socket_read

ищем строку с проверкой isascii(*ptr)&&isprint(*ptr)

и меняем ее на ((unsigned char)*ptr)>=32U

Почему так коряво, да потому что по умолчанию *ptr – это signed *char

Я там и единицу ставил (то есть всегда true), тоже работало, но лучше от символов, меньших пробела, защититься 😉

Возможно есть и другие места, где придется слегка модифицировать код, чтобы нормально проходили старшие символы (>127). И не надо забывать, что char signed!

UPDATE. 01-Apr-2017. То же касается и русификации ROM и вообще всех детей Diku

UPDATE. 03-Dec-2017. И не надо забывать, от командах протокола telnet, которые могут появиться, например в начале строки и испортить картину. Например, испортится ввод пароля или ввод команд. Вот пример таких последовательностей FF FD 01 и FF FE 01