Страшно представить, что будет если
Направо пойду или встану на месте!
Буду злодеев крошить и трепать,
Главное книжку бы мне не порвать.

 
Путник

Здравствуйте. Я разрабатываю интерпретатор URQ-квестов, которые исполняются в окне интегрированного браузера (пока работает только под Windows в среде .NET). В будущем возможна также Silverlight-версия, требующая для своей работы на компьютере под управлением ОС Windows, MacOS или Linux установленного браузера Internet Explorer или FireFox. Расширенный синтаксис позволяет обрабатывать теги HTML и код JavaScript. Вставки <html> работают как в AkURQ, но заменяют не всю текущую страницу, а содержимое ее текстового блока. Для полного обновления страницы введены теги <head> и <body>. С помощью скриптовых вставок можно полностью контролировать выполнение сценариев, в то время как движок URQ позволяет реализовывать переходы по ссылкам на локации.

В настоящее время реализован базовый синтаксис URQL, что уже позволяет запускать мою реализацию книги-игры "Подземелья черного замка", за основу которой было взято приложение с диска "Игровая Матрица" издательства "Бука" (я взял оттуда графику и переписал код на скриптах, которые пока работают только в Internet Explorer – для версии под Linux придется их переписывать). Подробности в этой теме. Также в комплекте к плееру вы найдете несколько квестов, в папке "bb" – мини-квест для AkURQ, демонстрирующий возможности HTML-оформления игр (работает только в AkURQ и PolyQuest!).

Плеер поддерживает стандартный формат QST. Реализовано сохранение игры в любой момент квеста. Режим компилятора, который присутствовал в ранней Java-версии, пока отсутствует в версии для .NET, хотя именно трансляция квестов в байт-код была отправной точкой в работе над этим проектом. Возможно также сохранение квестов в исполняемый файл. Внутри кода JavaScript можно использовать переменные, объявленные в локациях. В интерпретируемой версии плеера также возможен вызов кода языка URQL внутри JavaScript (функция UrqExec) и оценка значения выражения URQL соответственно (функция UrqEval).

Прилагаются исходные тексты.

QueSTation.rar

1.69 МБ

PolyQuest для .NET, версия 0.1 

Загрузок: 31 раз(а)
Сказали спасибо(1): Jumangee


Последний раз редактировалось: LastElf (Вт Июн 12, 2012 20:01), всего редактировалось 4 раз(а)
Свободный издатель

Хм... А как на счёт авторских прав? В частности на ПЧЗ?


_________________
Главное качество издателя — умение отстраняться от собственного вкуса. (с) Виталий Пищенко
Путник

Так ведь прямо на этом форуме можно скачать "Подземелья Черного Замка" и "Лабиринт затаившейся смерти" в версии Buka Entertainment? Не говоря уже о различных других реализациях.


_________________
Онлайн-интерпретатор текстовых приключенческих игр и книг-игр polyquest.github.io
Свободный издатель
Так ведь прямо на этом форуме можно скачать "Подземелья Черного Замка" и "Лабиринт затаившейся смерти" в версии Buka Entertainment?

Мдя, недоработка однако Smile

Я так понимаю, Вы не планируете прибыль извлекать из своего проекта? Если так, то бог с ними, с Подземельями. Всё равно уже много всяких реализаций бродит...
А вот от реализации Лабиринта я бы попросил воздержаться...

P.S. Ужасно хочется посмотреть на все иллюстрации к лабиринту от "Игровой матрицы". В своё время потратил много сил на попытки их извлечения. Но по-скольку совсем не программист, результата не добился.


_________________
Главное качество издателя — умение отстраняться от собственного вкуса. (с) Виталий Пищенко
Во всех бочках затычка

Да, заработало
Но:
1. Гораздо интереснее было бы, если игры будут запускаться отдельно – "standalone", ибо "файл" -> "загрузить игру" -> выбрать файл – утомительно это )
2. Особого смысла в существовании этой такого транслятора для Windows имхо нету, вот если б потом такие игры можно было бы запустить хотя бы на коммуникаторах... а ещё лучше – на обычном телефоне... Embarassed
3. Через 3-4 параграфа после начала игры отобразился пустой экран, ошибок не вылезло

Путник

Jumangee

1. Со standalone проблем возникнуть не должно. Ведь он создает класс байт-кода для каждого квеста? Помещаем его внутрь jar-файла, и при запуске программа должна будет искать у себя класс с таким именем и если найдет, то будет загружать его и запускать квест.

2. А как насчет Linux и MacOS? Перенести несложно, если только FireFox под этими системами будет позволять все те извращения, которые я проделываю над Internet Explorer в своем плеере. Кстати, была у меня и чисто браузерная реализация ПЧЗ, которая запускалась только под Internet Explorer и только с локальной машины. Вот от нее толку, пожалуй, еще меньше. Писал в качестве курсового проекта по HTML и JavaScript. Там еще в отдельном окне открывалось графическое меню как на диске "Игровой матрицы" и из него можно было сохранить и загрузить игру (с помощью cookie). Выход в меню я скоро реализую и здесь. Сам код квеста с тех пор претерпел минимальные изменения, только привел его к формату URQ. Теперь уж никто не спросит, а чем эта платформа лучше URQ? Very Happy

Что касается коммуникаторов, то порт для Android представляется мне возможным, но в виде интерпретатора. Для других платформ пришлось бы реализовывать свой браузер.

3. Пустой экран отображается при ссылке на неописанную локацию. Дождитесь полной версии. Smile

Знаменитый приключенец

писал(а): LastElf
транслятор URQ-квестов в байт-код Java

А можешь написать не в байт-код, а просто в Ява-код?

писал(а): LastElf
2. А как насчет Linux и MacOS? Перенести несложно, если только FireFox под этими системами будет позволять все те извращения, которые я проделываю над Internet Explorer в своем плеере. Кстати, была у меня и чисто браузерная реализация ПЧЗ, которая запускалась только под Internet Explorer и только с локальной машины.

До сих пор не понял, почему в названии темы идет JavaScript, а разговоры про Java Wink Да и зачем извращаться – возьми самую базовую Яву-технологию – Апплет. И все будет запускаться в любом "большом" браузере. А если от Явы перейти к Ява-скрипту, то даже на iPhone и Андроиде будет работать.

Еще вариант – а не хочешь написать интерпретатор URQL на Java1? Тоже получилась бы (при правильной реализации) убойное решение – почти автоматическое портирование на J2ME, прямая компиляция в Ява-скрипт и т.п. Надо только отделить интерпретатор от UI.


_________________
Редактор книг-игр "Я - Мастер Книг"
Путник
писал(а): Logger
А можешь написать не в байт-код, а просто в Ява-код?

Не знаю, там у меня все основано на использовании команды GOTO. Каждая локация – отдельная метка. Конечно, это можно реализовать с помощью switch в цикле, но в URQL есть еще команда proc – как с ней быть?
А с байт-кодом получились почти что ассемблерные вставки, мне понравилось.

До сих пор не понял, почему в названии темы идет JavaScript, а разговоры про Java

Сам исходный файл квеста может содержать код HTML с поддержкой JavaScript. Эти же яваскрипты могут внедряться в описание локаций (новый тег <script> вдобавок к имеющемуся в Акурке тегу <html>). А исполняется этот квест в стандартном Java-приложении, в котором интегрирован браузер, а не наоборот (как в случае апплета).

А если от Явы перейти к Ява-скрипту, то даже на iPhone и Андроиде будет работать.

А что, Ява-скриптом можно читать файлы на локальном диске, подгружая локации? Я реализовывал такое только под Internet Explorer и перед запуском возникала масса всяческих предупреждений. После этого перешел к собственному плееру, в котором крутится тот же IE и без вопросов исполняет любые скрипты при обращении к нему в процессе игры. Можно читать квесты с сервера, используя AJAX, но это уже совсем другая история.

А что за прямая компиляция в Ява-скрипт?

Во всех бочках затычка
писал(а): LastElf
Ява-скриптом можно читать файлы на локальном диске, подгружая локации?

Можно. AJAX это разрешает, проверено на "Подземной дороге".

Путник

Может, кому-нибудь будет интересно, если я выложу первую версию книги-игры, которая на JavaScript? Там свой небольшой парсер разметки локаций. Конечно, при сравнении его с моим нынешним парсером даже думать не хочется о том, чтобы переписать все на JavaScript опять.
А еще: как загружать произвольный код HTML в отведенный для него элемент веб-страницы, не изменяя его свойство innerHTML (это не входит в стандарт DOM и, следовательно, не будет работать на всех браузерах)? У меня на этом все основано.

Во всех бочках затычка

Не обижайтесь, но ПЧЗ на каких только платформах не реализовывалась...

писал(а): LastElf
как загружать произвольный код HTML в отведенный для него элемент веб-страницы, не изменяя его свойство innerHTML

Или я не понял, или это невозможно. Если нужно к элементу прицепить некие данные не меняя его содержимого (innerHTML) можно использовать либо HTML5 data-атрибуты (data-*) либо просто создавать свои аттрибуты элементов. При должном желании туда можно запихнуть практически всё что душе угодно.

Знаменитый приключенец

Давай сначала о главном – ЧТО ты хочешь создать? А уже из этого будем выбирать способы реализации.

У URQ на данные момент есть отличный плеер – Фурка. Но он накрывает только Windows машины. Есть Instead, он закроет Mac, UNIX, Android. Поддержка J2ME есть у Мурки и AURQ, но оба плеера ужасно сырые и слабо пригодные для нормального использования.

Где ты видишь место своего проекта?

писал(а): LastElf
Сам исходный файл квеста может содержать код HTML с поддержкой JavaScript. Эти же яваскрипты могут внедряться в описание локаций (новый тег <script> вдобавок к имеющемуся в Акурке тегу <html>). А исполняется этот квест в стандартном Java-приложении, в котором интегрирован браузер, а не наоборот (как в случае апплета).

HTML в тексте квеста, IMHO, – зло, так как не позволяет нормально портировать на небольшие экраны (iPhone, мобильники и т.п.) Да отдавая Ява-скрипт и HTML на обработку браузеру ты создаешь возможность встраивать вирусы в текст квеста.

писал(а): LastElf
А что, Ява-скриптом можно читать файлы на локальном диске, подгружая локации?

Может. Только не надо пытаться это делать как прямой доступ к файлам. Лучше – через подгрузку дополнительной Ява-скрипт библиотеки.

писал(а): LastElf
Каждая локация – отдельная метка. Конечно, это можно реализовать с помощью switch в цикле, но в URQL есть еще команда proc – как с ней быть?

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

писал(а): LastElf
как загружать произвольный код HTML в отведенный для него элемент веб-страницы, не изменяя его свойство innerHTML (это не входит в стандарт DOM и, следовательно, не будет работать на всех браузерах)

Использовать innerHTML. Он поддерживается всеми основными браузерами.


_________________
Редактор книг-игр "Я - Мастер Книг"
Путник
писал(а): Logger
А с ней-то какие проблемы – вызов метода, вот ее прямой аналог.

Ну тогда придется все локации оформлять в виде методов, а после каждого перехода на новую локацию по goto (вызова метода) помещать return. Если при таком подходе отыгрывать сразу весь квест, периодически отображая текущую локацию и вызывая обработчик меню, переполнения стека не избежать. Если же прекращать выполнение квеста после каждой команды end, а затем запускать его снова с нужного метода (как это сделано у меня), все переменные надо будет хранить в таблице вне файла квеста и для каждой встретившейся в тексте переменной выполнять ее поиск в таблице. Это уже не есть хорошо для компилятора. В моей реализации переменные объявляются и вызываются в одном большом методе кода квеста, поэтому к ним можно обращаться из любой локации. После выполнения команды end их значения сохраняются в браузере вызовом JavaScript, перед входом в следующую локацию оттуда же вызываются.
Таким образом из скриптовых вставок можно обращаться ко всем переменным, что позволит реализовать практически любые (графические и др.) навороты. В то же время ядром квеста по прежнему остаются команды URQL. Именно такие квесты я и хотел бы увидеть.

писал(а): Logger
HTML в тексте квеста, IMHO, – зло, так как не позволяет нормально портировать на небольшие экраны (iPhone, мобильники и т.п.)

Не знаю, мне вот кнопки в квестах не нравятся. Возможно, на мобильниках им самое место, но на iPhone, Android прекрасно могут работать квесты с гиперссылками. Мне нравится идея, заложенная в Instead: делать квесты, приближенные к традиционным. Кликнуть на инвентарь, потом на предмет окружения – это лучше, чем просто выбирать нужное действие с помощью кнопок. Но в то же время сам автор Instead‘а отмечал в своем подкасте, что у его платформы входной порог выше, чем у URQ, QSP и поэтому не стоит ждать такого большого количества квестов.
Я бы хотел, не сильно усложняя синтаксис URQL, обеспечить возможность создания именно таких квестов с последовательными щелчками по ссылкам. Самый простой путь к этому состоит в использовании HTML. Кроме того, это позволит заменять стандартный вид инвентаря на графическое меню, обрабатываемое скриптами, и делать любые другие вещи.

писал(а): Logger
Использовать innerHTML. Он поддерживается всеми основными браузерами.

Спасибо, не знал. А то у меня в книге приводится устаревшая информация.[/b]

Знаменитый приключенец

писал(а): LastElf
Я бы хотел, не сильно усложняя синтаксис URQL, обеспечить возможность создания именно таких квестов с последовательными щелчками по ссылкам. Самый простой путь к этому состоит в использовании HTML.

Совершенно нет. Достаточно разрешить отмечать в тексте локации блоки текста, которые бы подсвечивались как гиперссылка и вызывали определенную локацию при клике. Типа

p В центре стола лежит &#91;осмотретьНожНаСтоле|нож&#93;
...
осмотретьНожНаСтоле&#58;
p Тяжелый нож с деревянной ручкой, на нем следы чего-то красного. Судя по отсутствию пыли - лежит тут недавно. &#91;взятьНожСоСтола|Взять&#93; или &#91;столСНожом|оставить&#93; ?
...

Сразу снимаются все проблемы с HTML и java-script, исходный текст/код квеста делается более читабельным (для Автора).

писал(а): LastElf
Не знаю, мне вот кнопки в квестах не нравятся. Возможно, на мобильниках им самое место, но на iPhone, Android прекрасно могут работать квесты с гиперссылками.

Хе-хе, ты попробуй попадать пальцем в нужные гиперссылку (когда их пара рядышком), да еще в условии качающегося вагона метро. Я тоже поначалу в плеер для iPhone хотел делать типа гиперссылок, поиграв на реальном девайсе – понял, что получается сложно.

пришлось перейти на кнопки

Да и...гиперссылки уже есть в Instead и QSP. Тебе придется уговаривать кого-то писать на URQ с использованием твоих расширений (а на Фурке они будут работать?), что в 99% случаем означает, что под твою урку ничего никогда написано не будет.

В общем – хочешь славы? Сделай нормальную урку для мобильников (даже без гиперссылок). Или сделай компилятор URQL -> Java, тогда можно будет квесты на URQL портировать на Android/iOS и ту же J2ME.

писал(а): LastElf
Ну тогда придется все локации оформлять в виде методов, а после каждого перехода на новую локацию по goto (вызова метода) помещать return.

Не совсем. Каждая метка – отдельный метод. Для goto – он возвращает некий идентификатор метки-метода, куда надо передать управление (то есть стек очищается), а для proc – вызывает оный метод самостоятельно (сохраняя в стеке состояние). И все будет работать.
Типа
int next = ...;//start method
main&#58;
while &#40;true&#41; &#123;
&nbsp; int i;
&nbsp; switch &#40;next&#41; &#123;
&nbsp; &nbsp; case 1&#58;i = method1&#40;&#41;;break;
&nbsp; &nbsp; case 2&#58;i = method2&#40;&#41;;break;
&nbsp; &nbsp; ...
&nbsp; &#125;
&nbsp; switch &#40;i&#41; &#123;
&nbsp; case 0&#58;//end - конец работы интепретатора
&nbsp; &nbsp; &nbsp; break main;
&nbsp; case -1&#58;
&nbsp; &nbsp; &nbsp; //просто следующая локация
&nbsp; &nbsp; &nbsp; next++;
&nbsp; &nbsp; &nbsp; break;
&nbsp; default&#58;
&nbsp; &nbsp; &nbsp; //goto
&nbsp; &nbsp; &nbsp; next = i;
&nbsp; &#125;
&#125;
...
private int method1&#40;&#41; &#123;
&nbsp; &nbsp;if &#40;variable1==1&#41; &#123;
&nbsp; &nbsp; &nbsp; //proc
&nbsp; &nbsp; &nbsp; method2&#40;&#41;;
&nbsp; &nbsp;&#125; else &#123;
&nbsp; &nbsp; &nbsp; //goto
&nbsp; &nbsp; &nbsp; return 2;
&nbsp; &nbsp;&#125;
&nbsp; &nbsp;...
&nbsp; &nbsp;//нет return в данной локации
&nbsp; &nbsp;return -1;
&#125;
...
private int method2&#40;&#41; &#123;
&nbsp; &nbsp;...
&nbsp; &nbsp;//end
&nbsp; &nbsp;return 0;
&#125;

писал(а): LastElf
В моей реализации переменные объявляются и вызываются в одном большом методе кода квеста, поэтому к ним можно обращаться из любой локации.

Статические переменные, доступны везде и всем.


_________________
Редактор книг-игр "Я - Мастер Книг"
Путник
писал(а): Logger
И все будет работать.

К сожалению, не все. В локации, которую мы вызываем через proc, тоже могут присутствовать переходы goto. Можно было бы написать:

private int method1&#40;&#41; &#123;
&nbsp; &nbsp;if &#40;variable1==1&#41; &#123;
&nbsp; &nbsp; &nbsp; //proc
&nbsp; &nbsp; &nbsp;int i = method2&#40;&#41;;
&nbsp; &nbsp; &nbsp;if &#40;i != 0&#41;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return i;
&nbsp; &nbsp;&#125;

Но сразу же возникает такая проблема. После перехода по goto из локации, вызванной через proc, точка возврата из подпрограммы будет находиться уже в другом месте. Все точки возврата мы должны будем хранить в стеке. И сразу пропадает весь смысл оформления локаций как отдельных методов.

писал(а): Logger
Тебе придется уговаривать кого-то писать на URQ с использованием твоих расширений (а на Фурке они будут работать?), что в 99% случаем означает, что под твою урку ничего никогда написано не будет.

Что же теперь, не расширять язык только из-за того, что на Фурке это не будет работать? Разве сложно написать демку, использующую новые возможности, обсудить эти возможности на форуме урки, выработать стандарт, выложить исходники, а там уж и автор Фурки сам добавит необходимый функционал.

Знаменитый приключенец

писал(а): LastElf
К сожалению, не все. В локации, которую мы вызываем через proc, тоже могут присутствовать переходы goto

Да, про этот "финт ушами" в URQL я позабыл. Значит – придется вызывать локацию не напрямую, а через основную процедуру (по switch).

писал(а): LastElf
Что же теперь, не расширять язык только из-за того, что на Фурке это не будет работать? Разве сложно написать демку, использующую новые возможности, обсудить эти возможности на форуме урки, выработать стандарт, выложить исходники, а там уж и автор Фурки сам добавит необходимый функционал.

Сложно. Там последние год игр како-то почти не пишется...Проще уж начать с переговоров с Фаертоном, чтобы совместно выступить с изменением стандарта. Либо загодя найти писателя, который захочет написать игру с твоими расширениями.


_________________
Редактор книг-игр "Я - Мастер Книг"
Путник

Новая версия программы и работающие под ней П.Ч.З. Обновил шапку темы, где вы можете скачать инсталлятор под Windows. Теперь плеер запускается в режиме интерпретатора, ассоциируется с файлами соответствующих форматов.


_________________
Онлайн-интерпретатор текстовых приключенческих игр и книг-игр polyquest.github.io
Путник

Что-то давно я не выкладывал новых версий своего интерпретатора. Работа, тем не менее, ведется. Со времени выхода интерактивной версии игры "Повелитель Тьмы", специально для которой мой интерпретатор был переписан на C#, плеер квестов PolyQuest успел обзавестись еще некоторыми полезными функциями. Прежде всего, он научился встраивать код квеста в собственный исполняемый файл, позволяя запускать игры как standalone-приложения. Возобновлена поддержка звуков и музыки, которая была еще в Java-версии, но для того, чтобы она работала, в каталоге, из которого запускается программа, должен присутствовать файл libzplay.dll. Интерпретатор теперь поддерживает относительно простые, но такие известные URQ-квесты, как "Древний кинжал" и "Похождения хомяка Семена". Эти игры, а также некоторые другие, вы можете найти в папке Quests. Да, знаю, что плеер еще сырой, многие возможности URQL не поддерживаются, исходники надо основательно почистить от всевозможного мусора. Но сложность и запутанность программного кода во многом объясняется тем, что парсер PolyQuest работает по принципу последовательного разбора текста, как в стандартных языках программирования, но не в урк-интерпретаторах. Подобный парсер был у интерпретатора AURQ (собственно, исходный код одной из его версий и использовался в PolyQuest, но от него здесь уже практически ничего не осталось), однако он вводил свои правила и требовал переделки существующих игр под свой формат. Я же стараюсь приспособить свой парсер к стандартам URQL, из-за чего код постоянно разрастается и покрывается новыми "заплатками". Тем не менее, по-видимому, это первая попытка опенсорсного URQL-интерпретатора. Версию 0.1 вы можете найти в шапке темы.