WebSocket MUD client for DreamLand
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
css
dist
font
src
.gitignore
README.md
defaults.js
index.html
main.css
package.json

README.md

MUDJS: Web-Socket MUD client

Содержание

Обзор

Клиент mudjs первоначально был разработан для мира DreamLand и сейчас доступен по адресу https://dreamland.rocks/mudjs. Для полноценного его использования в код DreamLand была добавлена поддержка web sockets. Это дало возможность поддерживать SSL-соединения, а также видеть реальный IP адрес тех, кто соединяется с миром.

Сейчас в репозитории есть две ветки:

  • master - код клиента неспецифичен для какого-либо сервера и может быть использован для любого MUD
  • dreamland - плотная интеграция с сервером DreamLand по собственному протоколу общения

Основная разработка ведется в ветке dreamland. Master по сути заморожен.

Сборка

Для сборки ветки dreamland, cклонируйте основной репозиторий или свой форк, например:

git clone https://github.com/dreamland-mud/mudjs.git

Затем установите NodeJs и npm, скачав последнюю рекомендуемую версию для вашей системы с официального сайта NodeJs. Под Linux может понадобиться прописать путь к бинарникам node и npm в переменной окружения PATH. Это можно сделать с командной строки или же прописать в файле ~/.bashrc:

export NODEJS_HOME=/opt/node-v8.11.3-linux-x64 # путь может отличаться
export PATH=$NODEJS_HOME/bin:$PATH

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

cd mudjs
npm update

И, наконец, сборка bundle.js из исходников:

npm run build

Запуск

Удобнее всего поднять свой HTTP-server в каталоге mudjs. Если в системе установлен python, это очень просто сделать такими командами:

cd mudjs
python -m SimpleHTTPServer # для Python 2
python3 -m http.server # для Python 3

После этого веб-клиент станет доступен по адресу http://localhost:8000/index.html.

По идее можно обойтись и без cервера, открывая локальный файл прямо из браузера: file:///path/to/mudjs/index.html

Можно указать различные фрагменты после index.html#, для доступа к различным серверам:

Описание протокола общения с сервером мира DreamLand

Общение между сервером и клиентом происходит в виде команд с аргументами, передаваемых в формате JSON.

{ "command": "имя команды", "args": ["первый аргумент", "второй аргумент", "и так далее"] }

Поддерживаемые команды:

  • console_out строка: обычный вывод сообщения в терминал
  • notify строка: вывод сообщения во всплывающем окошке оповещений
  • alert строка: вывод сообщения через JavaScript alert в модальном окне
  • version строка: сервер передает текующую версию, и если она не совпадает с версией клиента, соединиться не получится
  • editor_open: открывает диалоговое окно с текстовым редактором (вышлется с сервера, если пользователь успешно выполнил команду webedit)
  • cs_edit: открывает диалоговое окно с редактором скриптов на Fenia, с подсветкой синтаксиса (вышлется с сервера после выполнения команды codesource edit)
  • prompt массив аргументов: т.н. web prompt высылается с сервера каждый раз одновременно с обычной строкой состояния. По результатам его обработки будет отрисована правая панель.

RPC-протокол

TODO

Web Prompt: расширенная строка состояния

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

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

Пример строки состояния:

{
  "area": "midgaard.are", 
  "date": { "d": 7, "m": "Зимы", "y": 657 },
  "det": "none",
  "enh": "none",
  "exits": { "e": "s", "h": "", "l": "r" },
  "group": {
    "leader": { "health": 100, "hit": 13234, "hit_clr": "6", "level": 100, "max_hit": 13234, "sees": "Руфина", "tnl": 998
    },
    "ln": "Руфины",
    "npc": [
      { "health": 100, "hit": 583, "hit_clr": "6", "level": 22, "max_hit": 583, "sees": "КуСидха", "tnl": "" }
    ]
  },
  "hit": 13234,
  "mal": "none",
  "mana": 21272,
  "max_hit": 13234,
  "max_mana": 21272,
  "max_move": 5966,
  "move": 5966,
  "p1": {
    "cs": [ "15", "17", "20", "20", "17", "17" ],
    "ps": [ "15", "17", "20", "20", "17", "17" ]
  },
  "p2": { "a": "50", "d": "0", "h": "0", "s": "0" },
  "pro": "none",
  "q": "none",
  "room": "Оружейный Магазин",
  "time": { "h": 2, "tod": "ночи" },
  "trv": "none",
  "vnum": 3011,
  "w": "none",
  "who": {
    "p": [
      { "cc": "dg", "cn": "l", "n": "Руфина", "r": "sa", "s": "f" }
    ],
    "t": "1", "v": "1"
  },
  "zone": "Мидгаард"
}

Поддержка цветов

Веб-клиент умеет парсить ANSI-последовательности с цветами, кроме того, он распознает псевдотеги разметки, которые ему посылает сервер DreamLand. Например,

<c c='fgbg'>ярко-зеленое сообщение</c>

превратится в

<span class='fgbg'>ярко-зеленое сообщение</span>

Названия классов основаны на названиях цветов внутри мира, fgbg - (foreground) bright green, fgdr - dark red, и т. д. Они все объявлены в файле main.css.

Контекстное меню манипуляции с предметами

Каждый предмет в инвентаре, экипировке, контейнере или на полу обрамляется специальным псевдотегом разметки . Веб-клиент обрабатывает эти теги и превращает их в стандартное dropdown-menu из Bootstrap.

Пример разметки для предмета в инвентаре:

<m c='бросить $, надеть $, смотреть $, использовать $, легенды $' id='1773732900'>хитрость лаеркаи</m>

Для компактности символ $ будет заменен на стороне клиента на уникальный ID предмета. ID используется в качестве аргумента для однозначности при манипуляциях.

Пример разметки для команд с дополнительным аргументом. Здесь 5394478976633 - ID бочонка, найденного в инвентаре персонажа, который можно было бы наполнить из этого фонтана.

<m c='пить $, наполнить 5394478976633 $, смотреть $' id='1614907783901'>Большой фонтан (fountain) здесь, бьет нескончаемым потоком воды.</m>

Некоторые манипуляции контекстно-зависимы и могут быть проделаны только в какой-то комнате (магазине, у ремонтника). Такие команды отделяются в меню вертикальной чертой, а внутри псевдотега будут переданы аттрибутом 'l':

<m c='бросить $, надеть $, смотреть $, легенды $' l='чинить $, стоимость $' id='5573732900'>хитрость лаеркаи</m>

Использование клиента для других MUD-ов

Для использования master версии клиента в своем мире нужна либо поддержка web sockets, либо можно воспользоваться утилитой websockify. Например, если мир обычно доступен по протоколу telnet на порту 9000, на хостинге запустите:

websockify :4321 :9000

После чего в странице веб-клиента (например, /mudjs/index.html) установите переменную wsUrl, указывающую на ваш хост и порт 4321:

    <script>
        var wsUrl = "ws://yourmud.com:4321";
    </script>

Хост "yourmud.com" должен совпадать с именем сайта, на котором размещен вебклиент. Внутри main.js, первое что посылается при соединении с сервером, это цифра 7, что соответствует выбору кодировки UTF8 в DreamLand. У себя вы можете изменить эту цифру на тот номер кодировки, который соответствует UTF8 в вашем мире:

    ws.onopen = function(e) {
        send('7');
    }

Готово. Теперь при заходе на страницу http://yourmud.com/mudjs/index.html пройзойдет подключение к серверу, и можно будет начинать играть.