Zeantar написал:
Можешь выложить какой-нибудь пример, пару локаций, которые демонстрируют возможности, описанные в последних двух постах?
Хм… Почему бы и нет. Но только без глубокого экскурса в прошлое Адского Движка™.
Допустим есть три локации: Ворота, Утёс, Болото. От Ворот можно пройти к Утёсу, с Утёса можно спуститься к Болоту, ну и, само собой, можно подняться от Болота обратно на Утёс. Таким образом с локацией Утёс у нас связано два действия:
Поскольку действия в Адском Движке™ привязываются к объекту, то в данном случае мы должны привязать всё это к локации Утёс.
Можно, конечно, исхитриться по-другому, но это будет уже не то. А так у нас есть Утёс и есть ряд действий с ним.
Однако, просто накидать два действия мало:
…Добавить, ’Утёс:Действия’, 'Подойти к утёсу', '', {…Переместить, ИГРОК, 0, 'Утёс', 'п. Пройдя несколько шагов по тропинке, вы остановились на краю утёса.'} …Добавить, ’Утёс:Действия’, 'Взобраться на утёс', '', {…Переместить, ИГРОК, 0, 'Утёс', 'п. Взобравшись по хлипкой лестнице, вы оказались на утёсе.'}
Нужно дать понять фреймворку, когда какие действия нужно выводить.
Если я ещё не рассказывал про синтаксис команды "Действие", то вот он:
…Добавить, ’<Объект>:Действия’, <Название>, <Условие>, <Модуль>
Так вот параметр Условие и нужно заполнить, чтобы один пункт появлялся, когда игрок находится в локации Ворота, а другой — когда на Болоте. И только так. Два пункта сразу не нужны.
Совсем давно это можно было сделать так:
…Добавить, ’Утёс:Действия’, 'Подойти к утёсу', {°Результат = IIF($ЛОКАЦИЯ = 'Ворота', Использовать, Пропустить)}, {…Переместить, ИГРОК, 0, 'Утёс', 'п. Пройдя несколько шагов по тропинке, вы остановились на краю утёса.'} …Добавить, ’Утёс:Действия’, 'Взобраться на утёс', {°Результат = IIF($ЛОКАЦИЯ = 'Болото', Использовать, Пропустить)}, {…Переместить, ИГРОК, 0, 'Утёс', 'п. Взобравшись по хлипкой лестнице, вы оказались на утёсе.'}
После добавления "кратких условий" — так:
…Добавить, ’Утёс:Действия’, 'Подойти к утёсу', {if:$ЛОКАЦИЯ = 'Ворота'}, {…Переместить, ИГРОК, 0, 'Утёс', 'п. Пройдя несколько шагов по тропинке, вы остановились на краю утёса.'} …Добавить, ’Утёс:Действия’, 'Взобраться на утёс', {if:$ЛОКАЦИЯ = 'Болото'}, {…Переместить, ИГРОК, 0, 'Утёс', 'п. Взобравшись по хлипкой лестнице, вы оказались на утёсе.'}
Ну а теперь — достаточно описать условия так:
…Добавить, ’Утёс:Действия’, 'Подойти к утёсу', {в:Ворота}, {…Переместить, ИГРОК, 0, 'Утёс', 'п. Пройдя несколько шагов по тропинке, вы остановились на краю утёса.'} …Добавить, ’Утёс:Действия’, 'Взобраться на утёс', {в:Болото}, {…Переместить, ИГРОК, 0, 'Утёс', 'п. Взобравшись по хлипкой лестнице, вы оказались на утёсе.'}
Не бог весть какое новшество — несколько строчек кода, но нужно же напомнить об Адском Движке™…
Неактивен
Ну и поскольку традиционно никто ничего не понял (нет, я вовсе не претендую на понятный стиль — в данной теме это необязательно), выкладываю рабочий пример на Адском Движке™:
Полная версия, включающая плеер QSP и файл автозапуска "start.vbs" (1,5 МБ).
QSP-only версия. Файлы QSP-плеера отсутствуют (80 КБ).
Исходный код примера в текстовом виде (2,3 КБ).
Исходный код примера в графическом — как я вижу — виде (21 КБ).
Неактивен
Не совсем ясно, почему на простых ссылках типа "взобраться", "спуститься" вылезает дополнительное меню с одноименными пунктами (и никакими другими). Зачем тогда нужно это меню, если действие односложно?
Отредактировано Zeantar (10.08.2012 20:49)
Неактивен
Zeantar написал:
Не совсем ясно, почему на простых ссылках типа "взобраться", "спуститься" вылезает дополнительное меню с одноименными пунктами (и никакими другими). Зачем тогда нужно это меню, если действие односложно?
Речь вообще-то не об этом. Хотя да, я считаю, что даже если по ссылке производится всего одно действие, должно появляться меню, и игрок должен иметь возможность понять, что он сделает, нажав на ссылку. Единообразие интерфейса и страховка игрока от ошибочных действий. Но эту тему лучше обсуждать в другом месте.
Неактивен
Olegus t.Gl. написал:
Хотя да, я считаю, что даже если по ссылке производится всего одно действие, должно появляться меню, и игрок должен иметь возможность понять, что он сделает, нажав на ссылку. Единообразие интерфейса и страховка игрока от ошибочных действий. .
Да вроде игрок не полный даун, чтобы не понять, что по ссылке с названием "взобраться" ему предстоит именно взобраться. ) Ты, я думаю, привел слишком упрощенный и гипотетический пример. Если можно, сделай живой пример - не сложный, но правдоподобный.
С уважением.
Неактивен
Zeantar написал:
Olegus t.Gl. написал:
Хотя да, я считаю, что даже если по ссылке производится всего одно действие, должно появляться меню, и игрок должен иметь возможность понять, что он сделает, нажав на ссылку. Единообразие интерфейса и страховка игрока от ошибочных действий. .
Да вроде игрок не полный даун, чтобы не понять, что по ссылке с названием "взобраться" ему предстоит именно взобраться. ) Ты, я думаю, привел слишком упрощенный и гипотетический пример. Если можно, сделай живой пример - не сложный, но правдоподобный.
С уважением.
Ссылка на объект "Утёс" может стоять на слове "утёс". Тогда в меню могут быть ещё пункты "Осмотреть", "Поковырять" и всё такое.
Я привёл пример работы с действиями. Не нужно обсуждать в этой теме теорию интерфейса игры на ссылках. Лучше перенести это обсуждение, например, сюда. Тут про Адский Движок™ всё же.
Неактивен
Ну и добавил в пример пару объектов и взаимодействие между ними.
Полная версия, включающая плеер QSP и файл автозапуска "start.vbs" (1,5 МБ).
QSP-only версия. Файлы QSP-плеера отсутствуют (81 КБ).
Исходный код примера в текстовом виде (4,4 КБ).
Исходный код примера в графическом — как я вижу — виде (42 КБ).
Кстати, там есть нюанс. Если объекты в локациях просто перечисляются, то для топора, когда он воткнут в столб навеса, предусмотрено отдельное упоминание в тексте локации. Как-то так.
Неактивен
Olegus t.Gl. написал:
…передача в модуль формирования меню параметра была уже давно. Я всё думал, как сократить запись, чтобы мне не приходилось скрупулёзно описывать все условия во всех пунктах. И вот что я добавил: если в описании ссылки написать что-нибудь такое: ((яблок|Яблоко:=Запах)) (то есть в начало параметра было добавлен символ "="), то это послужит фреймворку сигналом, что для данной ссылки нужно отбирать только те пункты, в условиях включения которых в том или ином виде обрабатывается значение параметра (в данном случае "Запах")…
Лиха беда началом. Заменил символ "=" на "!", добавил два новых: "&" и "-", позволил писать их как в начале, так и в конце параметра. Про "&" говорить не буду — он отключает блок формирования пункта приглашения к взаимодействию с другими объектами. Зачем это нужно — в другой раз. А вот про "-" упомяну.
Раз у меня всё такое на ссылках, и в текущих вариантах дизайна ссылки отчётливо видны, то встала проблема: если хочется пораспихать по описанию ссылки на "предметы обстановки", с которыми нельзя взаимодействовать, но можно, например, осмотреть, потрогать или ещё чего (то есть чисто информация/антураж), то, после того как игрок по ним пройдётся, они будут мозолить глаза. Однако гасить их и не совсем правильно, да и хлопотно на уровне кода игры.
Для решения этой проблемы как раз и служит модификатор "-":
На обоях нарисовано ((яблоко|Обои:Рисунок-)).
В результате нажатия на ссылку "яблоко" будет сформировано меню, пункты для которого отбираются по параметру "Рисунок". И ссылка эта ничем не будет отличаться от остальных, пока игрок не переберёт все пункты меню. Как только он пройдётся по всему меню, ссылка поменяет цвет на менее заметный. А поскольку доступность ссылок проверяется у меня постоянно, то, если потом по каким-то условиям в данном меню прибавится пунктов, ссылка вернёт свой исходный цвет, то есть опять начнёт мозолить игроку глаза.
Неактивен
Когда работаешь не только с теорией, но и на практике, то многое выглядит иначе, и то, что казалось простым и удобным, становится если не сложным, то громоздким. И когда от громоздкости избавится в полной мере не удаётся, то можно, по крайней мере, перенести создающие её (эту самую громоздкость) элементы в другое место, разгрузив требуемый участок.
Это я всё к тому, что я всё ещё обдумываю способы записи ссылок. Изначально, ссылка в тексте описания имела такой вот формат:
((текст|объект))
Однако сейчас поле "объект" неприлично разрослось, поскольку в него помимо идентификатора объекта стало удобно записывать дополнительные параметры, по которым можно было формировать индивидуальные для каждой ссылки меню.
Например, у меня есть локация "Избушка", в описании которой есть упоминание трубы. Если я хочу дать игроку возможность просто осмотреть трубу (и ничего более), мне не нужно создавать отдельный объект "Труба" и прописывать его описание и соответствующее действие ("осмотреть"). Мне достаточно добавить к объекту "Избушка" действие "осмотреть трубу" и прописать в нём вывод соответствующего описания. А чтобы это действие не попадало в пункты меню, которое относится непосредственно к избушке: осмотреть (саму избушку), войти и т.п. — я у этого действия прописываю условие включения в меню:
если:©Параметр='Труба'
Соответственно, в тексте описания мне достаточно указать следующее:
У самого леса из земли торчит низенькая ((избушка|Избушка)) с неприлично высокой и толстой ((трубой|Избушка:Труба)). Вот где враги жгут ваши брёвна!
чтобы при клике на слове "избушка" получать одно меню, а при клике на "трубой" — другое.
Это неплохо: меньше объектов, меньше описаний и всего такого. Но с текстом работать становится уже неудобно. Он становится громоздким. Знакомое слово? Да, я в первом абзаце упоминал как о проблеме громоздкости, так и об одном способе её решения, а именно переносе загромождающих текст элементов в другое место.
Тут уместно вспомнить мой модуль шаблонов, и используемый там способ указания параметров и их значений.
Применяя этот способ к указанной задаче сам текст можно изрядно разгрузить:
У самого леса из земли торчит низенькая %избушка% с неприлично высокой и толстой %трубой%. Вот где враги жгут ваши брёвна!
Но придётся в каком-то виде и где-то задавать, что движок должен подставлять вместо %избушка% и %трубой%. Но это уже мелочи. Пока рассматриваю дополнительный параметр, в котором значения подстановок описаны следующим образом:
избушка = избушка|Избушка трубой = трубой|Избушка:Труба
Не то, что мне делать нечего, правда… Просто с текстом становится неудобно работать.
Неактивен
Olegus t.Gl. написал:
Но придётся в каком-то виде и где-то задавать, что движок должен подставлять вместо %избушка% и %трубой%. Но это уже мелочи. Пока рассматриваю дополнительный параметр…
Забросил идею с дополнительным параметром — у меня их и так многовато. Пошёл по более дикому, но зато более универсальному пути, а именно добавил блок параметров прямо в текст. В коде эта строка выглядит так:
'У самого леса из земли торчит низенькая %избушка% с неприлично высокой и толстой %трубой%. Вот где враги жгут ваши брёвна! '+$ттт+' избушка = %|Избушка трубой = %|Избушка:Труба '
В переменной $ттт
я зашил абракадабру, по которой специально обученная функция чётко разделяет текст и дополняет содержательную часть данными из блока подстановок. Ну и в редакторе это выглядит не настолько страшно, потому как блок со значениями подстановок всегда можно свернуть. А знак % в блоке параметров означает, что текст соответствует строке подстановки, ну, чтобы не писать по два раза: трубой=трубой|Избушка:Труба
.
Неактивен
Так и вижу, как кто-то пишет игру на адском движке Олегуса:
'Вы вошли на локацию', СуперЛокацияПрименитьСуперМетодОлегуса, 3
ЯнаЛокацииСуперМетодОлегусаСрочноВызов, 25
УраЯСмогУпотребитьСтранныйМетодОлегуса, 87
act: 'Хотите перейти или будете дальше наслаждаться двиглом?' : goto 'НоваяСуперЛокацияКотораяИмеетМетод', 25
Неактивен
Zeantar написал:
Так и вижу, как кто-то пишет игру на адском движке Олегуса:
'Вы вошли на локацию', СуперЛокацияПрименитьСуперМетодОлегуса, 3
ЯнаЛокацииСуперМетодОлегусаСрочноВызов, 25
УраЯСмогУпотребитьСтранныйМетодОлегуса, 87
act: 'Хотите перейти или будете дальше наслаждаться двиглом?' : goto 'НоваяСуперЛокацияКотораяИмеетМетод', 25
Как известно, в условиях отсутствия информации человек начинает моделировать ситуацию на тех сведениях и приёмах, что ему известны и знакомы. Часто это является отражением мировоззрения и привычных приёмов (мышления или действия) самого человека. Так что, я полагаю, в твоём примере мы видим некое отражение сущности твоего же движка на JavaScript. Дарю название: "ЛБД", что расшифровывается "Лютый Бешеный Движок".
Неактивен
У меня все проще, но ладноо ) отвлеклись, поспамили - и снова в бой, в адский движок
Отредактировано Zeantar (26.08.2012 23:42)
Неактивен
Добавил возможность добавлять в контейнер (содержимое) скрытые объекты, чтобы не заморачиваться с ними при выводе описания.
Если взять за пример тизер "Тестировщиков", то там есть момент, когда нужно вставить батарейки в телефон. При этом использовалась функция простого перемещения батареек из инвентаря в телефон, чтобы потом просто проверять, если ли батарейки в телефоне.
При выводе описания телефона не было особого смысла выводить информацию о том, что в телефоне содержаться батарейки. Можно вовсе отключать вывод содержимого для данного описания, но это как-то чересчур, поэтому я добавил точечное исключение объектов из перечня.
Теперь, если поместить батарейки в телефон командой:
…Поместить, 'Батарейки В Телефон Скрыть'
то батарейки при выводе описания телефона в блоке содержимого упоминаться не будут. Однако, функция
…Содержится('Батарейки В Телефон')
всё равно будет возвращать ДА.
Неактивен
В синтаксис ссылок в тексте добавил расширение параметра. Обычный синтаксис ссылки выглядит так: ((текст|ссылка|цвет))
, где ссылка
— это имя объекта (может быть также http, exec — но сейчас не об этом, как и возможность указания цвета у ссылки). При нажатии на ссылку анализируется перечень действий с данным объектом, формируется и выводится меню.
Чтобы можно было использовать в тексте несколько ссылок на один и тот же объект и получать при этом разные меню, в Адском Движке™ можно дополнять имя объекта параметром, например так: ((телефонная книга|Таксофон:ТелефоннаяКнига))
.
Так вот теперь всё ещё круче — у параметра можно ещё и указывать данные, что делает синтаксис ещё более диким, но в умелых руках даёт интересные возможности. Синтаксис теперь такой: ((текст|ссылка:параметр+данные|цвет))
Например, у меня есть телефонная книга, и я хочу, чтобы в ней были ссылки на конкретные номера, при нажатии на которые выводилось меню с пунктом: "Набрать номер", который вызывал бы одну и ту же процедуру, передавая ей в качестве параметра телефонный номер (примечание: нет, я не хочу делать телефонную книгу в виде выпадающего меню).
Теперь мне достаточно в телефонной книге указать следующий текст:
…ТекстНаЭкран, '((000|Таксофон:НабратьНомер+000)) — телефон Арнольда'
а к объекту "Таксофон" добавить одно-единственное действие:
…Действие, ’Таксофон:НабратьНомер’, 'Набрать номер', 'позвонить', _ , { …ТекстНаЭкран, 'п. Вы набрали номер ' + ©Данные + '.' …Объекты.Таксофон.ОбработатьНомер, ©Данные }
и всё будет работать (вернее уже работает).
Неактивен
В своё время я реализовал работу с шаблонами в текстах, чтобы можно было нагляднее разделять текст и ссылки со всеми их параметрами. Сейчас решил немножко эту тему развить, особенно в свете идеи скрывать ссылки. В обсуждении этой идеи прозвучала дельная мысль, что если уж скрывать ссылки на объекты, то тогда каждое упоминание объекта в тексте должно быть ссылкой. Это правильно, но расставлять ссылки в этом случае, даже с шаблонами, — скука смертная. Поэтому я добавил простое решение — реализовал "общие шаблоны".
Допустим есть два текста:
У самого леса из земли торчит низенькая %избушка% с неприлично высокой и толстой %трубой%. Вот где враги жгут ваши брёвна!
Стены %избушки% покрыты мхом и словно растут из земли. Неровный проём двери занавешен грубой рогожей. Из %трубы% идёт густой белый дым.
Чтобы не прописывать к каждому тексту замену шаблонов на ссылки, можно просто добавить две команды:
…ДобавитьШаблонДляТекстов, 'избушка|избушки', '((%|Избушка))' …ДобавитьШаблонДляТекстов, 'трубой|трубы', '((%|Избушка:Труба))'
Теперь во всех текстах шаблоны (не слова, а именно шаблоны) "%избушка%", "%избушки%", "%трубой%", "%трубы%" будут заменены на ссылки.
Как-то так.
Неактивен
И опять насчёт шаблонов в тексте. Как обычно практика вносит свои коррективы. Расширил функционал шаблонов в текстах. Теперь помимо общих шаблонов, которые заменяются во всех текстах, существуют шаблоны с привязкой к локации, в которой находится игрок.
Общий шаблон:
…ДобавитьШаблонДляТекстов, 'трубой|трубы', '((%|Избушка:Труба))'
Шаблон привязанный к локации:
…ДобавитьШаблонДляТекстов, 'трубой В ВнутриИзбушки', '((%|Печь:Труба))'
Теперь в описании локации "ПередИзбушкой"
У самого леса из земли торчит низенькая %избушка% с неприлично высокой и толстой %трубой%. Вот где враги жгут ваши брёвна!
%трубой%
будет заменяться на "((трубой|Избушка:Труба))
", то есть на ссылку на объект "Избушка".
А в описании локации "ВнутриИзбушки"
Половину комнаты занимает огромная печь с уходящей через прорубленную в крыше дыру %трубой%.
%трубой%
будет заменяться на "((трубой|Печь:Труба))
", то есть на ссылку на объект "Печь".
Ну и само собой синтаксис записи шаблонов позволяет указывать перечни как шаблонов, так и локаций:
…ДобавитьШаблонДляТекстов, '(шаблон1|шаблон2|шаблон3) В (локация1|локация2|локация3)', 'замещающий текст'
Как-то так.
Неактивен
Давненько не делился зажигательными видео, демонстрирующими работу Адского Движка™.
Сейчас вернулся к своему старому проекту, и сразу же наткнулся на интерфейсную проблему, связанную с гашением ссылок. Если нужно сконцентрировать игрока на выполнении какой-нибудь задачи, то лучший способ — отрубить ему возможность делать что-нибудь ещё. Иногда это действительно имеет смысл.
Ну и код работы с кодовой панелью на двери приведён на скриншоте.
Неактивен