Git Product home page Git Product logo

mudjs's Introduction

MUDJS: Web-Socket MUD client

Содержание

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

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

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

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

Для использования 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 пройзойдет подключение к серверу, и можно будет начинать играть.

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

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

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

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

TODO

Расширенная строка состояния - это 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>

mudjs's People

Contributors

filths avatar ruffinakoza avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.