Forum.iFiction.Ru

iFiction.Ru · ifHub · FAQ · IFWiki · QSP · URQ · INSTEAD · AXMA

форум об interactive fiction, текстовых приключенческих играх и всём таком...

Вы не зашли.

0    0    #51
12.05.2012 15:45

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Заметки по работе над "Адским движком" (фреймворком для QSP)

Olegus t.Gl. написал:

Хм… Наткнулся на некоторую проблему (не знаю пока, насколько серьёзную) с реализацией чекпоинтов. А именно — момент сохранения чекпоинта.

Решил проблему.

Исходил из следующих соображений: по сути, точка сохранения состояния игры нужна не в любом произвольном месте, а после смены состояния игры (что-то произошло), когда управление передаётся игроку. Таким образом я у себя вычислил всего несколько точек (функций), которые безоговорочно завершают выполнение авторского и служебного кода. То есть в конце этих функций весь служебный и прочий мусор вычищен.
Следовательно мне оказалось достаточно заменить содержимое функции "СоздатьТочкуСохранения" на простое "взведение" флага, что нужно создать чекпоинт, а в конец этих функций (их две-три штуки) дописать уже вызов функции, содержащей "SAVEGAME". И всё.

Кстати, когда я доберусь до оптимизации скорости работы Адского Движка (знакомые с нетбуками жалуются), то можно сделать ещё и кэширование всех изменений на экране и вываливание их всех зараз именно в этих же точках кода. Это должно сэкономить прилично времени на обновление ссылок на экране и всё таком.

Неактивен

0    0    #52
22.05.2012 13:56

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Заметки по работе над "Адским движком" (фреймворком для QSP)

Кстати, добавил события и подписки на события.

С одной стороны у меня уже есть обработчики системных событий. То есть на ряд системных событий (например, получение свойства, перемещение объекта и т.п.) можно повесить модуль-обработчик, который будет выполняться при наступлении события. Например, есть объекты "Меч" и "Палица", у которых есть свойство "Урон". А у игрока есть свойство "Ловкость", которое должно увеличивать урон от оружия. Тогда такой вот обработчик:

Код:

    …ПриПолученииСвойства, 'Игрок', 'Урон', {
        °Значение = °Значение + …Получить('Игрок:Ловкость')
        }

увеличит значение урона от объекта на значение ловкости.

P.S. Для простоты я убрал код проверки, что объект, урон которого определяется, находится у игрока.

Однако кроме системных событий теперь есть ещё и авторские.

Например, вот код:

Код:

    …ПриНаступленииСобытия, 'СигнализацияСработала', '+', '', 'Сигнализация', После, {
        …Установить, 'Дракон:Спит', НЕТ
        …Переместить, 0, 'Дракон', '', 'Сокровищница'
        }
    
    …ПриНаступленииСобытия, 'СигнализацияСработала', '+', '', 'Сигнализация', После, {
        …Переместить, 0, 'Охранник', '', 'Сокровищница'
        }
    
    …ПриПеремещенииОбъекта, ИГРОК, 'Сокровищница', '', Перед, {
        if …Содержится(0, 'Корона', ИНВЕНТАРЬ, ДА) and …Получить(0, 'Сигнализация:Включена')=ДА {
            …Установить, 'Сигнализация:Орёт', ДА
            …ВызватьСобытие, 'СигнализацияСработала', ИГРОК, '', 'Сигнализация', После
            °Результат = Нельзя
            }
        }

Теперь если переместить игрока из "Сокровищницы", то

  1. Отработает обработчик системного события "ПриПеремещенииОбъекта", и если у игрока в инвентаре есть корона, а сигнализация не отключена, то сигнализация начнёт орать: её свойство "Орёт" установится в ДА, и произойдёт авторское событие "СигнализацияСработала". И выйти игроку не получится.
  2. На авторское событие "СигнализацияСработала" есть две подписки (они могут заполняться в разных местах: в модуле дракона и в модуле охранника), которые и вызовутся. В результате чего в сокровищнице окажутся и бодрствующий дракон, и охранник.

Как-то так…

Неактивен

0    0    #53
22.05.2012 16:42

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Заметки по работе над "Адским движком" (фреймворком для QSP)

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

Неактивен

0    0    #54
29.05.2012 23:44

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Заметки по работе над "Адским движком" (фреймворком для QSP)

Удалось решить старую проблему. Как я уже говорил и показывал, ссылки на объекты в тексте активируются или гасятся в зависимости от наличия объекта в инвентаре, текущей локации и в перечне доступных игроку контейнеров (если он осмотрел сундук, то ссылки на объекты из сундука должны быть активными). Таким образом, стоит игроку перейти в другую локацию, как ссылки на объекты их прежнего местонахождения гасятся. Точно так же, если объект исчезает из игрового окружения, то ссылка на него в предыдущем тексте будет погашена.

Плюс ко всему этому даже если объект присутствует "рядом" — вызывается функция проверки формирования меню. Если меню пустое, то ссылка гасится (всё равно выбирать не из чего).

Всё это хорошо работало, но возникали следующие проблемы:

  1. Ссылки на локации. Локации нигде не расположены, поэтому говорить о том, есть они где-то или нет, нельзя. Приходилось в модуле формирования меню прописывать где какие пункты действий с той или иной локацией доступны.
  2. Упоминания (со ссылкой) объектов или персонажей, по идее отсутствующих в текущей локации. Например игрок вспоминает о ком-то, и по ссылке на этого персонажа можно узнать что-нибудь о нём. Однако в этом случае приходилось либо таскать персонажа по локациям (при этом контролировать, чтобы он не попадал в перечень содержимого), либо применять различные изощрённые средства.

При всём при этом ещё нужно было отслеживать местонахождение игрока и всё такое.

В общем удалось привести это к единой методологии, что уже хорошо. Мужайтесь, дальше идут подробности.

Добавлена команда "УстановитьДоступностьСсылок", с помощью которой можно указать, ссылка на какой объект в каком месте будет активна (если конечно в меню есть пункты), если игрок находится в этом же месте. То есть когда игрок переходит в другую локацию, ссылка становится неактивной.

Но добавлено кое-что ещё более страшное и малопонятное.

Небольшой экскурс в правила формирования меню: при формировании контекстного меню можно указывать условия использования того или иного пункта. При этом в ссылке в тексте можно указать параметр, с помощью которого можно регулировать состав меню.

Например описание комнаты, где яблока нет, но чувствуется его запах:

В комнате стоит устойчивый запах ((яблок|Яблоко:Запах)).

Описание содержимого шкафа, где находится яблоко:

В шкафу на блюдце лежит ((яблоко|Яблоко)).

В данном случае объектом является "Яблоко", а "Запах" — это параметр, который передаётся в модуль формирования меню. И меню я могу формировать так:

Код:

…Добавить, 'Яблоко:Действия', 'Принюхаться',      '', {if:©Параметр ='Запах'}, {…ТекстНаЭкран, 'п. Запах усиливается по мере приближения к шкафу.'}
…Добавить, 'Яблоко:Действия', 'Осмотреть яблоко', '', {if:©Параметр<>'Запах'}, {…ОписаниеНаЭкран, 'Яблоко'}
…Добавить, 'Яблоко:Действия', 'Съесть яблоко',    '', {if:©Параметр<>'Запах'}, {…ТекстНаЭкран, 'п. Не стоит — тут явно какой-то подвох!'}

В этом случае при щелчке на ссылке с параметром "Запах" ((яблок|Яблоко:Запах)) я получу меню с одним пунктом "Принюхаться". А при щелчке на яблоке из описания шкафа (где параметра "Запах" нет: ((яблоко|Яблоко))) — меню уже будет состоять из двух пунктов: "Осмотреть яблоко", "Съесть яблоко".

Но передача в модуль формирования меню параметра была уже давно. Я всё думал, как сократить запись, чтобы мне не приходилось скрупулёзно описывать все условия во всех пунктах. И вот что я добавил: если в описании ссылки написать что-нибудь такое: ((яблок|Яблоко:=Запах)) (то есть в начало параметра было добавлен символ "="), то это послужит фреймворку сигналом, что для данной ссылки нужно отбирать только те пункты, в условиях включения которых в том или ином виде обрабатывается значение параметра (в данном случае "Запах"). И теперь мне достаточно записать код так:

Код:

…Добавить, 'Яблоко:Действия', 'Принюхаться',      '', {if:©Параметр ='Запах'}, {…ТекстНаЭкран, 'п. Запах усиливается по мере приближения к шкафу.'}
…Добавить, 'Яблоко:Действия', 'Осмотреть яблоко', '', '', {…ОписаниеНаЭкран, 'Яблоко'}
…Добавить, 'Яблоко:Действия', 'Съесть яблоко',    '', '', {…ТекстНаЭкран, 'п. Не стоит — тут явно какой-то подвох!'}

При нажатии на ссылку ((яблок|Яблоко:=Запах)) фреймворк просто обросит пункты "Осмотреть яблоко" и "Съесть яблоко", поскольку в них не обрабатывается параметр "Запах".

Как-то так…

Неактивен

0    0    #55
10.08.2012 14:10

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Заметки по работе над "Адским движком" (фреймворком для QSP)

Olegus t.Gl. написал:

то добавил возможность использования сокращённой формы:

Код:

{if:©Параметр='Встать'}

Расширил варианты краткой записи условий:

Дополнительный вариант записи проверки условия: {если:©Параметр='Встать'}

Проверка, находится ли игрок в локации "ВоротаНаБолото": {в:ВоротаНаБолото}

Проверка, попал ли в текущую локацию игрок из локации "ВоротаНаБолото": {из:ВоротаНаБолото}

Зачем это всё? Ах да, я же игру пишу. И возник вопрос, как лучше прописывать переходы из локации в локацию. Получается, когда игрок щёлкает на ссылку на определённую локацию, то меню переходов нужно собирать исходя из местоположения игрока. Вот поэтому всё и так. Пока удобно.

Неактивен

0    0    #56
10.08.2012 18:44

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Заметки по работе над "Адским движком" (фреймворком для QSP)

Zeantar написал:

Можешь выложить какой-нибудь пример, пару локаций, которые демонстрируют возможности, описанные в последних двух постах?

Хм… Почему бы и нет. Но только без глубокого экскурса в прошлое Адского Движка™.

Допустим есть три локации: Ворота, Утёс, Болото. От Ворот можно пройти к Утёсу, с Утёса можно спуститься к Болоту, ну и, само собой, можно подняться от Болота обратно на Утёс. Таким образом с локацией Утёс у нас связано два действия:

  1. Пройти от Ворот к Утёсу.
  2. Подняться с Болота на Утёс.

Поскольку действия в Адском Движке™ привязываются к объекту, то в данном случае мы должны привязать всё это к локации Утёс.

Можно, конечно, исхитриться по-другому, но это будет уже не то. А так у нас есть Утёс и есть ряд действий с ним.

Однако, просто накидать два действия мало:

Код:

…Добавить, ’Утёс:Действия’, 'Подойти к утёсу',    '', {…Переместить, ИГРОК, 0, 'Утёс', 'п. Пройдя несколько шагов по тропинке, вы остановились на краю утёса.'}
…Добавить, ’Утёс:Действия’, 'Взобраться на утёс', '', {…Переместить, ИГРОК, 0, 'Утёс', 'п. Взобравшись по хлипкой лестнице, вы оказались на утёсе.'}

Нужно дать понять фреймворку, когда какие действия нужно выводить.

Если я ещё не рассказывал про синтаксис команды "Действие", то вот он:

Код:

…Добавить, ’<Объект>:Действия’, <Название>, <Условие>, <Модуль>

Так вот параметр Условие и нужно заполнить, чтобы один пункт появлялся, когда игрок находится в локации Ворота, а другой — когда на Болоте. И только так. Два пункта сразу не нужны.

Совсем давно это можно было сделать так:

Код:

…Добавить, ’Утёс:Действия’, 'Подойти к утёсу',    {°Результат = IIF($ЛОКАЦИЯ = 'Ворота', Использовать, Пропустить)}, {…Переместить, ИГРОК, 0, 'Утёс', 'п. Пройдя несколько шагов по тропинке, вы остановились на краю утёса.'}
…Добавить, ’Утёс:Действия’, 'Взобраться на утёс', {°Результат = IIF($ЛОКАЦИЯ = 'Болото', Использовать, Пропустить)}, {…Переместить, ИГРОК, 0, 'Утёс', 'п. Взобравшись по хлипкой лестнице, вы оказались на утёсе.'}

После добавления "кратких условий" — так:

Код:

…Добавить, ’Утёс:Действия’, 'Подойти к утёсу',    {if:$ЛОКАЦИЯ = 'Ворота'}, {…Переместить, ИГРОК, 0, 'Утёс', 'п. Пройдя несколько шагов по тропинке, вы остановились на краю утёса.'}
…Добавить, ’Утёс:Действия’, 'Взобраться на утёс', {if:$ЛОКАЦИЯ = 'Болото'}, {…Переместить, ИГРОК, 0, 'Утёс', 'п. Взобравшись по хлипкой лестнице, вы оказались на утёсе.'}

Ну а теперь — достаточно описать условия так:

Код:

…Добавить, ’Утёс:Действия’, 'Подойти к утёсу',    {в:Ворота}, {…Переместить, ИГРОК, 0, 'Утёс', 'п. Пройдя несколько шагов по тропинке, вы остановились на краю утёса.'}
…Добавить, ’Утёс:Действия’, 'Взобраться на утёс', {в:Болото}, {…Переместить, ИГРОК, 0, 'Утёс', 'п. Взобравшись по хлипкой лестнице, вы оказались на утёсе.'}

Не бог весть какое новшество — несколько строчек кода, но нужно же напомнить об Адском Движке™…

Неактивен

0    0    #57
10.08.2012 19:38

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Заметки по работе над "Адским движком" (фреймворком для QSP)

Ну и поскольку традиционно никто ничего не понял (нет, я вовсе не претендую на понятный стиль — в данной теме это необязательно), выкладываю рабочий пример на Адском Движке™:

Полная версия, включающая плеер QSP и файл автозапуска "start.vbs" (1,5 МБ).
QSP-only версия. Файлы QSP-плеера отсутствуют (80 КБ).
Исходный код примера в текстовом виде (2,3 КБ).
Исходный код примера в графическом — как я вижу — виде (21 КБ).


Прикрепленные файлы:
boloto_full.zip, Размер: 1,494,952 байт, Скачано: 778
boloto_qsp_only.zip, Размер: 78,000 байт, Скачано: 765
boloto.png, Размер: 21,085 байт, Скачано: 366
boloto.txt, Размер: 2,380 байт, Скачано: 787

Неактивен

0    0    #59
10.08.2012 20:53

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Заметки по работе над "Адским движком" (фреймворком для QSP)

Zeantar написал:

Не совсем ясно, почему на простых ссылках типа "взобраться", "спуститься" вылезает дополнительное меню с одноименными пунктами (и никакими другими). Зачем тогда нужно это меню, если действие односложно?

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

Неактивен

0    0    #60
10.08.2012 21:06

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Заметки по работе над "Адским движком" (фреймворком для QSP)

Zeantar написал:

Olegus t.Gl. написал:

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

Да вроде игрок не полный даун, чтобы не понять, что по ссылке с названием "взобраться" ему предстоит именно взобраться. ) Ты, я думаю, привел слишком упрощенный и гипотетический пример. Если можно, сделай живой пример - не сложный, но правдоподобный.
С уважением.

Ссылка на объект "Утёс" может стоять на слове "утёс". Тогда в меню могут быть ещё пункты "Осмотреть", "Поковырять" и всё такое.

Я привёл пример работы с действиями. Не нужно обсуждать в этой теме теорию интерфейса игры на ссылках. Лучше перенести это обсуждение, например, сюда. Тут про Адский Движок™ всё же.

Неактивен

0    0    #61
11.08.2012 23:10

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Заметки по работе над "Адским движком" (фреймворком для QSP)

Ну и добавил в пример пару объектов и взаимодействие между ними.

Полная версия, включающая плеер QSP и файл автозапуска "start.vbs" (1,5 МБ).
QSP-only версия. Файлы QSP-плеера отсутствуют (81 КБ).
Исходный код примера в текстовом виде (4,4 КБ).
Исходный код примера в графическом — как я вижу — виде (42 КБ).

Кстати, там есть нюанс. Если объекты в локациях просто перечисляются, то для топора, когда он воткнут в столб навеса, предусмотрено отдельное упоминание в тексте локации. Как-то так.


Прикрепленные файлы:
boloto_full_20120811_2300.zip, Размер: 1,498,404 байт, Скачано: 782
boloto_qsp_20120811_2300.zip, Размер: 80,709 байт, Скачано: 740
boloto_20120811_2300.txt, Размер: 4,417 байт, Скачано: 819
boloto_20120811_2300.png, Размер: 41,934 байт, Скачано: 352

Неактивен

0    0    #62
22.08.2012 17:02

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Заметки по работе над "Адским движком" (фреймворком для QSP)

Olegus t.Gl. написал:

…передача в модуль формирования меню параметра была уже давно. Я всё думал, как сократить запись, чтобы мне не приходилось скрупулёзно описывать все условия во всех пунктах. И вот что я добавил: если в описании ссылки написать что-нибудь такое: ((яблок|Яблоко:=Запах)) (то есть в начало параметра было добавлен символ "="), то это послужит фреймворку сигналом, что для данной ссылки нужно отбирать только те пункты, в условиях включения которых в том или ином виде обрабатывается значение параметра (в данном случае "Запах")…

Лиха беда началом. Заменил символ "=" на "!", добавил два новых: "&" и "-", позволил писать их как в начале, так и в конце параметра. Про "&" говорить не буду — он отключает блок формирования пункта приглашения к взаимодействию с другими объектами. Зачем это нужно — в другой раз. А вот про "-" упомяну.

Раз у меня всё такое на ссылках, и в текущих вариантах дизайна ссылки отчётливо видны, то встала проблема: если хочется пораспихать по описанию ссылки на "предметы обстановки", с которыми нельзя взаимодействовать, но можно, например, осмотреть, потрогать или ещё чего (то есть чисто информация/антураж), то, после того как игрок по ним пройдётся, они будут мозолить глаза. Однако гасить их и не совсем правильно, да и хлопотно на уровне кода игры.

Для решения этой проблемы как раз и служит модификатор "-":

Код:

На обоях нарисовано ((яблоко|Обои:Рисунок-)).

В результате нажатия на ссылку "яблоко" будет сформировано меню, пункты для которого отбираются по параметру "Рисунок". И ссылка эта ничем не будет отличаться от остальных, пока игрок не переберёт все пункты меню. Как только он пройдётся по всему меню, ссылка поменяет цвет на менее заметный. А поскольку доступность ссылок проверяется у меня постоянно, то, если потом по каким-то условиям в данном меню прибавится пунктов,  ссылка вернёт свой исходный цвет, то есть опять начнёт мозолить игроку глаза.

Неактивен

0    0    #63
24.08.2012 18:39

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Заметки по работе над "Адским движком" (фреймворком для QSP)

Когда работаешь не только с теорией, но и на практике, то многое выглядит иначе, и то, что казалось простым и удобным, становится если не сложным, то громоздким. И когда от громоздкости избавится в полной мере не удаётся, то можно, по крайней мере, перенести создающие её (эту самую громоздкость) элементы в другое место, разгрузив требуемый участок.

Это я всё к тому, что я всё ещё обдумываю способы записи ссылок. Изначально, ссылка в тексте описания имела такой вот формат:

Код:

((текст|объект))

Однако сейчас поле "объект" неприлично разрослось, поскольку в него помимо идентификатора объекта стало удобно записывать дополнительные параметры, по которым можно было формировать индивидуальные для каждой ссылки меню.

Например, у меня есть локация "Избушка", в описании которой есть упоминание трубы. Если я хочу дать игроку возможность просто осмотреть трубу (и ничего более), мне не нужно создавать отдельный объект "Труба" и прописывать его описание и соответствующее действие ("осмотреть"). Мне достаточно добавить к объекту "Избушка" действие "осмотреть трубу" и прописать в нём вывод соответствующего описания. А чтобы это действие не попадало в пункты меню, которое относится непосредственно к избушке: осмотреть (саму избушку), войти и т.п. — я у этого действия прописываю условие включения в меню:

Код:

если:©Параметр='Труба'

Соответственно, в тексте описания мне достаточно указать следующее:

Код:

У самого леса из земли торчит низенькая ((избушка|Избушка)) с неприлично высокой и толстой ((трубой|Избушка:Труба)). Вот где враги жгут ваши брёвна!

чтобы при клике на слове "избушка" получать одно меню, а при клике на "трубой" — другое.

Это неплохо: меньше объектов, меньше описаний и всего такого. Но с текстом работать становится уже неудобно. Он становится громоздким. Знакомое слово? Да, я в первом абзаце упоминал как о проблеме громоздкости, так и об одном способе её решения, а именно переносе загромождающих текст элементов в другое место.

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

Код:

У самого леса из земли торчит низенькая %избушка% с неприлично высокой и толстой %трубой%. Вот где враги жгут ваши брёвна!

Но придётся в каком-то виде и где-то задавать, что движок должен подставлять вместо %избушка% и %трубой%. Но это уже мелочи. Пока рассматриваю дополнительный параметр, в котором значения подстановок описаны следующим образом:

Код:

    избушка    = избушка|Избушка
    трубой     = трубой|Избушка:Труба

Не то, что мне делать нечего, правда… Просто с текстом становится неудобно работать.

Неактивен

0    0    #64
25.08.2012 15:05

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Заметки по работе над "Адским движком" (фреймворком для QSP)

Olegus t.Gl. написал:

Но придётся в каком-то виде и где-то задавать, что движок должен подставлять вместо %избушка% и %трубой%. Но это уже мелочи. Пока рассматриваю дополнительный параметр…

Забросил идею с дополнительным параметром — у меня их и так многовато. Пошёл по более дикому, но зато более универсальному пути, а именно добавил блок параметров прямо в текст. В коде эта строка выглядит так:

Код:

'У самого леса из земли торчит низенькая %избушка% с неприлично высокой и толстой %трубой%. Вот где враги жгут ваши брёвна!
'+$ттт+'
    избушка    = %|Избушка
    трубой     = %|Избушка:Труба
'

В переменной $ттт я зашил абракадабру, по которой специально обученная функция чётко разделяет текст и дополняет содержательную часть данными из блока подстановок. Ну и в редакторе это выглядит не настолько страшно, потому как блок со значениями подстановок всегда можно свернуть. А знак % в блоке параметров означает, что текст соответствует строке подстановки, ну, чтобы не писать по два раза: трубой=трубой|Избушка:Труба.

Неактивен

0    0    #65
26.08.2012 11:59

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Заметки по работе над "Адским движком" (фреймворком для QSP)

Zeantar написал:

Так и вижу, как кто-то пишет игру на адском движке Олегуса:
'Вы вошли на локацию', СуперЛокацияПрименитьСуперМетодОлегуса, 3
ЯнаЛокацииСуперМетодОлегусаСрочноВызов, 25
УраЯСмогУпотребитьСтранныйМетодОлегуса, 87
act: 'Хотите перейти или будете дальше наслаждаться двиглом?' : goto 'НоваяСуперЛокацияКотораяИмеетМетод', 25

Как известно, в условиях отсутствия информации человек начинает моделировать ситуацию на тех сведениях и приёмах, что ему известны и знакомы. Часто это является отражением мировоззрения и привычных приёмов (мышления или действия) самого человека. Так что, я полагаю, в твоём примере мы видим некое отражение сущности твоего же движка на JavaScript. Дарю название: "ЛБД", что расшифровывается "Лютый Бешеный Движок".

Неактивен

0    0    #66
08.10.2012 22:28

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Заметки по работе над "Адским движком" (фреймворком для QSP)

Добавил возможность добавлять в контейнер (содержимое) скрытые объекты, чтобы не заморачиваться с ними при выводе описания.

Если взять за пример тизер "Тестировщиков", то там есть момент, когда нужно вставить батарейки в телефон. При этом использовалась функция простого перемещения батареек из инвентаря в телефон, чтобы потом просто проверять, если ли батарейки в телефоне.

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

Теперь, если поместить батарейки в телефон командой:

Код:

…Поместить, 'Батарейки В Телефон Скрыть'

то батарейки при выводе описания телефона в блоке содержимого упоминаться не будут. Однако, функция

Код:

…Содержится('Батарейки В Телефон')

всё равно будет возвращать ДА.

Неактивен

2    0    #67
09.04.2013 20:55

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Заметки по работе над "Адским движком" (фреймворком для QSP)

В синтаксис ссылок в тексте добавил расширение параметра. Обычный синтаксис ссылки выглядит так: ((текст|ссылка|цвет)), где ссылка — это имя объекта (может быть также http, exec — но сейчас не об этом, как и возможность указания цвета у ссылки). При нажатии на ссылку анализируется перечень действий с данным объектом, формируется и выводится меню.

Чтобы можно было использовать в тексте несколько ссылок на один и тот же объект и получать при этом разные меню, в Адском Движке™ можно дополнять имя объекта параметром, например так: ((телефонная книга|Таксофон:ТелефоннаяКнига)).

Так вот теперь всё ещё круче — у параметра можно ещё и указывать данные, что делает синтаксис ещё более диким, но в умелых руках даёт интересные возможности. Синтаксис теперь такой: ((текст|ссылка:параметр+данные|цвет))

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

Теперь мне достаточно в телефонной книге указать следующий текст:

Код:

…ТекстНаЭкран, '((000|Таксофон:НабратьНомер+000)) — телефон Арнольда'

а к объекту "Таксофон" добавить одно-единственное действие:

Код:

…Действие, ’Таксофон:НабратьНомер’, 'Набрать номер', 'позвонить', _ , {
    …ТекстНаЭкран, 'п. Вы набрали номер ' + ©Данные + '.'
    …Объекты.Таксофон.ОбработатьНомер, ©Данные
    }

и всё будет работать (вернее уже работает).

Неактивен

1    0    #68
23.04.2013 11:37

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Заметки по работе над "Адским движком" (фреймворком для QSP)

В своё время я реализовал работу с шаблонами в текстах, чтобы можно было нагляднее разделять текст и ссылки со всеми их параметрами. Сейчас решил немножко эту тему развить, особенно в свете идеи скрывать ссылки. В обсуждении этой идеи прозвучала дельная мысль, что если уж скрывать ссылки на объекты, то тогда каждое упоминание объекта в тексте должно быть ссылкой. Это правильно, но расставлять ссылки в этом случае, даже с шаблонами, — скука смертная. Поэтому я добавил простое решение — реализовал "общие шаблоны".

Допустим есть два текста:

У самого леса из земли торчит низенькая %избушка% с неприлично высокой и толстой %трубой%. Вот где враги жгут ваши брёвна!

Стены %избушки% покрыты мхом и словно растут из земли. Неровный проём двери занавешен грубой рогожей. Из %трубы% идёт густой белый дым.

Чтобы не прописывать к каждому тексту замену шаблонов на ссылки, можно просто добавить две команды:

Код:

…ДобавитьШаблонДляТекстов, 'избушка|избушки', '((%|Избушка))'
…ДобавитьШаблонДляТекстов, 'трубой|трубы', '((%|Избушка:Труба))'

Теперь во всех текстах шаблоны (не слова, а именно шаблоны) "%избушка%", "%избушки%", "%трубой%", "%трубы%" будут заменены на ссылки.

Как-то так.

Неактивен

0    0    #69
30.04.2013 12:56

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Заметки по работе над "Адским движком" (фреймворком для QSP)

И опять насчёт шаблонов в тексте. Как обычно практика вносит свои коррективы. Расширил функционал шаблонов в текстах. Теперь помимо общих шаблонов, которые заменяются во всех текстах, существуют шаблоны с привязкой к локации, в которой находится игрок.

Общий шаблон:

Код:

…ДобавитьШаблонДляТекстов, 'трубой|трубы', '((%|Избушка:Труба))'

Шаблон привязанный к локации:

Код:

…ДобавитьШаблонДляТекстов, 'трубой В ВнутриИзбушки', '((%|Печь:Труба))'

Теперь в описании локации "ПередИзбушкой"

У самого леса из земли торчит низенькая %избушка% с неприлично высокой и толстой %трубой%. Вот где враги жгут ваши брёвна!

%трубой% будет заменяться на "((трубой|Избушка:Труба))", то есть на ссылку на объект "Избушка".

А в описании локации "ВнутриИзбушки"

Половину комнаты занимает огромная печь с уходящей через прорубленную в крыше дыру %трубой%.

%трубой% будет заменяться на "((трубой|Печь:Труба))", то есть на ссылку на объект "Печь".

Ну и само собой синтаксис записи шаблонов позволяет указывать перечни как шаблонов, так и локаций:

Код:

…ДобавитьШаблонДляТекстов, '(шаблон1|шаблон2|шаблон3) В (локация1|локация2|локация3)', 'замещающий текст'

Как-то так.

Неактивен

1    0    #70
05.03.2014 14:56

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Заметки по работе над "Адским движком" (фреймворком для QSP)

Давненько не делился зажигательными видео, демонстрирующими работу Адского Движка™.

Сейчас вернулся к своему старому проекту, и сразу же наткнулся на интерфейсную проблему, связанную с гашением ссылок. Если нужно сконцентрировать игрока на выполнении какой-нибудь задачи, то лучший способ — отрубить ему возможность делать что-нибудь ещё. Иногда это действительно имеет смысл.



Ну и код работы с кодовой панелью на двери приведён на скриншоте.

Неактивен

Powered by PunBB
© copyright 2001–2026 iFiction.Ru