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