R50 5feefc6454c55873d32ea9cb0e32943e
Автоматизирую рутинные задачи

Интерпретатор текстовых квестов с поддержкой HTML и JavaScript

Добавлено 14 июл 2018 в 12:15
Кратко о PolyQuest: PolyQuest является модификацией проекта UrqW: https://github.com/narmiel/UrqW/ и, соответственно, обладает всеми возможностями UrqW.

Дополнительные возможности PolyQuest обеспечивают:
  • Поддержку веб-разметки через тэги <html>...</html>. Можно использовать все те же возможности html, что и для операторов печати, плюс гиперссылки в стиле AkURQ:
<a href="btn:метка">

(подробнее см. здесь: http://urq.plut.info/system/files/AkURQ.rar)

  • Поддержку выполнения кода JavaScript, который заключается внутри тэгов <script>...</script>. Все описываемые тэги могут находиться на месте очередного оператора URQL.

  • Возможность изменения html-содержимого текущей (работающей) странички. Реализуется несколькими возможными тэгами: <appendContent ... > ... </appendContent>, <appendScript ... > ... </appendScript>, <appendStyle ... > ... </appendStyle>, добавляющими к указанному элементу, соответственно, html-код, js-код и css-разметку. Внутри открывающего тэга указывается один из двух текстовых атрибутов: либо element, значением которого может быть "head" или "body", либо elementId, указывающий id конкретного элемента страницы, к которому добавляется содержимое, расположенное между открывающим и закрывающим тэгами.

  • Возможность внедрения переменных URQL в выполняемые фрагменты JavaScript. Объявляются такие переменные с помощью нового оператора let, имеющего вид:
    let <переменная>=<значение>
    или
    let <переменная>

  • При каждом создании такой переменной её имя заносится в список переменных, доступных для js-кода. При входе в выполняемый участок js- кода значения всех таких переменных передаются внутри JavaScript, а при выходе из него результирующие значения вновь заносятся в одноимённые переменные URQL. Также переменные URQL и JavaScript синхронизируются при каждом входе в поток выполнения кода URQL (в направлении JavaScript -> URQL) и при выходе из него и передаче управления пользователю (в обратном направлении URQL -> JavaScript).

  • Возможность управления последовательностью проигрывания музыки. С этой целью введена системная локация endmusicloop, заход на которую осуществляется в момент окончания проигрывания музыкальной композиции (с помощью оператора music или js-метода MusicPlay - см. ниже). Таким образом можно зациклить не одну музыкальную композицию, а сразу несколько, выбирая каждую следующую последовательно или случайным образом.

  • Возможность осуществления дополнительных действий при сохранении и загрузке игры. Заход на локацию onsave осуществляется до момента сохранения, а заход на локацию onload -- до момента восстановления состояния игры, соответственно. После выполнения всех действий по восстановлению состояния также может осуществляться заход на локацию afterload. Целью подобных действий может быть, например, инициализация каких-то переменных внутри JavaScript, прорисовка графического инвентаря и др.

  • Ряд вспомогательных функций JavaScript, осуществляющих взаимодействие с URQL-частью. К ним относятся

  • readParagraph -- переход на локацию;

  • UrqExec -- выполнение заданного в качестве параметра кода URQL;

  • UrqEval -- оценка значения URQL-выражения, заданного в качестве параметра. Работает аналогично выражению if, но внутри скрипта;

  • MusicPlay -- проигрывание музыкальной композиции (если указан параметр); возобновление проигрывания музыки (если без параметра);

  • MusicStop -- остановка музыки;

  • SoundPlay -- проигрывание звукового фрагмента;

  • SoundStop -- остановка звука.

    Надо отметить, что музыка и звуки проигрываются двумя различными потоками. При каждом начале проигрывания звукового фрагмента (оператором sound или js-функцией SoundPlay) музыка приостанавливается, а по его окончании возобновляется вновь.
3e61007bb8 B04f6df343