Forum.iFiction.Ru

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

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

Вы не зашли.

0    0    #1
06.07.2011 22:18

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

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

Буду сваливать сюда всякие заметки по работе над своим "Адским движком" — фреймворком для QSP.
Если чего-то непонятно — это нормально, уже проделана большая работа, о которой задним числом писать времени просто нет.

Неактивен

0    0    #2
06.07.2011 22:45

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

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

Итак, решил проблему с выводом содержимого предмета при выводе его описания.

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

Первое, что пришло на ум — доработать систему "упоминаний", расширив их синтаксис и добавив туда ключевое слово "ПереченьОбъектов". Далее, нужно указать, содержимое какого именно контейнера нужно выводить. Однако и это не всё — хорошо бы, чтобы перечень объектов сопровождался какой-нибудь фразой, характерной для этого объекта (в данном случае: "На дне сундука лежат").

В общем справился.

Как это сейчас выглядит в коде:

Блок описаний:

Код:

GS 'УстановитьОписание','Сундук:Снаружи','Громоздкий сундук','
    п. Здоровенный деревянный ((сундук|Сундук)), обтянутый железными полосками.
'
!----------
GS 'УстановитьОписание','Сундук:Содержимое','Громоздкий сундук','
    п. Изнутри ((сундук|Сундук)) обит потёртой выцветшей тканью.

    [[ПереченьОбъектов:Содержимое:На дне сундука лежат]]
'

А так описывается меню, которое формируется при нажатии на ссылку "Сундук":

Код:

GS 'ПриНажатииНаСсылку','Сундук',{
    GS 'Меню.ДобавитьПунктСМодулем','Меню','Осмотреть сундук','',{
        GS 'ДействиеНаЭкран',$ARGS[0]
        GS 'ТекстНаЭкран',func('Описание','Сундук:Снаружи','Текст')
    }
    !----------
    GS 'Меню.ДобавитьПунктСМодулем','Меню','Покопаться в сундуке','',{
        GS 'ДействиеНаЭкран',$ARGS[0]
        GS 'ТекстНаЭкран',func('Описание','Сундук:Содержимое','Текст')
    }
}

Что в итоге:
https://ifiction.ru/i/scr/qsp_scr_001.png

Неактивен

0    0    #3
07.07.2011 11:23

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

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

Что я подразумеваю под "Упоминанием" объекта?

Чтобы не заморачиваться со встраиванием информации об игровых объектах в том или ином тексте посредством программного кода (возьмём любимый пример [1, 2] Некса):

Код:

*P 'Вы на кухне.'
IF роджер=1: ' Здесь находится Роджер.'

(и так — в каждой локации, где может появиться Роджер)

я пошёл по другому пути. Описание локаций у меня содержит ссылку на упоминание о Роджере, а у объекта "Роджер" расписаны упоминания о нём в зависимости от того, в какой локации он находится:

Код:

GS 'УстановитьОписание', 'Кухня', 'Кухня', '
    п. Вы на кухне. [[Роджер]]
'
GS 'УстановитьОписание', 'Туалет', 'Туалет', '
    п. Вы в туалете. [[Роджер]]
'
!----------
GS 'УстановитьУпоминание', 'Роджер', 'Локации:Описания', '', {
    $Локация=$ARGS[0]
    $Текст=$ARGS[1]
    !----------
    if $Локация='кухня' and роджер=1:
        $Текст='Здесь находится Роджер.'
    elseif $Локация='туалет' and роджер=2:
        $Текст='Здесь спит Роджер.'
    end
    !----------
    $Result=$Текст
}

Теперь обращение к описанию локации:

Код:

*NL func('Описание', $ТекущаяЛокация, 'Текст')

возвращает мне законченный текст с учётом упоминания о Роджере.

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

Неактивен

0    0    #4
07.07.2011 14:42

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

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

В рамках вопроса, поднятого в дискуссии "Как лучше выводить перечень предметов/персонажей игры в описании?", пока остановился у себя на таком порядке вывода:

  1. Заголовок локации
  2. Описание локации со всеми встроенными в само описание упоминаниями предметов и персонажей
  3. Индивидуальные упоминания о местонахождении того или иного ПРЕДМЕТА в локации
  4. Индивидуальные упоминания о местонахождении того или иного ПЕРСОНАЖА в локации
  5. Перечень остальных персонажей в локации
  6. Перечень остальных предметов в локации

По пунктам 3 и 4: по тем объектам, упоминания которых не были задействованы в тексте описания, ищется упоминание (для использования в описании) и выводится по каждому объекту с новой строки.

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

Код:

GS 'УстановитьОписание', 'Кухня', 'Кухня', '
    п. Вы на кухне.
'
GS 'УстановитьОписание', 'Туалет', 'Туалет', '
    п. Вы в туалете.
'

При формировании описания, если Роджер находится в описываемой локации, его упоминание автоматически добавится в конец описания (с новой строки).

Ну а те объекты, которые не попали ни в само описание, ни в конец его, — перечисляются просто через запятую в самом низу.

Неактивен

0    0    #5
10.07.2011 22:08

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

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

Доделал вывод описания объектов (локаций, предметов, персонажей) со всеми потрохами, т.е. находящимися "внутри них" объектами. Всё работает именно так, как описано в предыдущем сообщении.

Чтобы при выводе описания появилось перечисление "хранящихся" внутри объектов, нужно это описание связать с тем или иным контейнером. Например:

Код:

GS 'УстановитьОписание', 'Сундук:Основное', 'Громоздкий сундук', '
    п. Здоровенный деревянный ((сундук|Сундук)), обтянутый железными полосками.
'
!----------
GS 'УстановитьОписание', 'Сундук:ЧтоВнутри', 'Громоздкий сундук', '
    п. Изнутри ((сундук|Сундук)) обит потёртой выцветшей тканью.
', '', '', 'Содержимое'

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

Неактивен

0    0    #6
11.07.2011 17:54

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

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

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

Неактивен

0    0    #7
11.07.2011 19:14

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

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

Так, самая простая часть — технически погасить или восстановить ссылки — работает и работает отлично.

  1. Берётся область экрана, в которую выводится игровая информация.
  2. Из этой области вытаскиваются все (как активные, так и погашенные) ссылки.
  3. Из ссылки вычленяется ID объекта.
  4. Проверяется доступность объекта.
  5. Если объект недоступен, то ссылка гасится.

Осталось реализовать саму функцию проверки доступности объекта в текущей ситуации (как заглушку я использовал проверку наличия объекта в инвентаре).

Неактивен

0    0    #8
11.07.2011 22:30

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

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

М-да… С объектами ладно, но с ссылками на локации (для вызова меню переходов) что делать? их как бы нигде ведь нет…

Неактивен

0    0    #9
11.07.2011 22:41

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

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

Так, приехали. Кажется, QSP-плеер начал тормозить…

Неактивен

0    0    #10
12.07.2011 00:30

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

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

Так, кое-что удалось реализовать:

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

Перебор ссылок и анализ доступности каждого объекта (если это не локация):

  1. Если объект находится в инвентаре, то ссылка на экране не нужна (объект доступен через инвентарь) — блокируем.
  2. Если объект находится в содержимом локации, то ссылка нужна — активизируем.
  3. Если объект находится в одном из доступных к этому времени контейнеров, то ссылка также пригодится — активизируем.

Неактивен

0    0    #11
12.07.2011 20:49

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

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

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

Так, кое-что удалось реализовать:

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

Перебор ссылок и анализ доступности каждого объекта (если это не локация):

  1. Если объект находится в инвентаре, то ссылка на экране не нужна (объект доступен через инвентарь) — блокируем.
  2. Если объект находится в содержимом локации, то ссылка нужна — активизируем.
  3. Если объект находится в одном из доступных к этому времени контейнеров, то ссылка также пригодится — активизируем.

4. Если текущее местоположение объекта соответствует сохранённому на момент формирования ссылки — активизируем.

Неактивен

0    0    #12
12.07.2011 21:25

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

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

Ну и слайды.
В тесте я создал три объекта-контейнера: Лужайка, Сумка и Чугунок, и один предмет — Яблоко, и последовательно перекладывал яблоко: Лужайка -> Инвентарь -> Сумка -> Инвентарь -> Чугунок -> Лужайка.

На последнем слайде я пометил участки, где находятся ссылки на объект "Яблоко": красным — активные, зелёным — заблокированные (т.е. это уже даже не ссылки, а просто слова). Можно увидеть, что когда Яблоко вернулось на Лужайку — активизировалась самая первая ссылка.

Чтобы оценить участие в технической стороне процесса (никакого, собственно) автора — приложен файл с исходным текстом примера.

P.S. Ссылки в примере я специально сделал жёлтыми, чтобы лучше было видно :-)


Прикрепленные файлы:
qsp_test_apple.txt, Размер: 5,849 байт, Скачано: 773

Неактивен

0    0    #13
13.07.2011 08:16

Nex
Участник (+120, -130)
Зарегистрирован: 11.06.2007
Сообщений: 2053

---

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

Осталось сделать визуальный конструктор, который будет генерировать такой код.

Неактивен

0    0    #14
13.07.2011 11:34

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

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

Nex написал:

Осталось сделать визуальный конструктор, который будет генерировать такой код.

Получившийся код слишком сложен для ручного набора?

Неактивен

0    0    #15
13.07.2011 12:04

Nex
Участник (+120, -130)
Зарегистрирован: 11.06.2007
Сообщений: 2053

---

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

Получившийся код подсказывает моей интуиции, что именно такой "модульный" код можно было бы удобно "обернуть" с помощью визуального конструктора, наподобие TGE/Квестера. В отличие от обычного QSP-кода, который слишком многовариантен для конструктора. Только об  этом я и хотел сказать.

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

Неактивен

0    0    #16
19.07.2011 01:21

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

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

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

Итак, код с помощью которого задаются возможные пункты для меню объектов "Яблоко" и "Чугунок":

Код:

!Добавляем пункт в меню, который должен присутствовать всегда
GS 'УстановитьДействие', 'Яблоко', 'Осмотреть яблоко', $ico['осмотреть снаружи'], '', '', {
        GS 'ОписаниеНаЭкран', 'Яблоко'
    }
!----------
!Добавляем пункт в меню, который должен присутствовать только если яблоко не в инвентаре игрока
GS 'УстановитьДействие', 'Яблоко', 'Взять яблоко', $ico['взять'], {
        ARGS['Результат']=IIF(func('Местонахождение', 'Игрок', 'Яблоко', 'Игрок')=НЕТ, Использовать, Пропускать)
    }, ''  ,{
        if func('Переместить', 'Игрок', 'Яблоко', '', 'Игрок')=Продолжить:
            GS 'ТекстНаЭкран', 'п. Вы взяли ((яблоко|Яблоко)).'
        end
    }
!----------
!Устанавливаем фразы для обеспечения процесса взаимодействия яблока с другими объектами
GS 'УстановитьПриглашениеКВзаимодействию', 'Яблоко', 'Что вы хотите сделать с яблоком?', 'Что-нибудь сделать с яблоком'
!----------
!Добавляем взаимодействие в чугунком — яблоко можно только положить в чугунок, да и то, только если его там нет
GS 'ДобавитьВзаимодействие', 'Яблоко', 'Чугунок', 'Положить яблоко в чугунок', $ico['положить'], {
        ARGS['Результат']=IIF(func('Местонахождение', '', 'Яблоко', 'Чугунок')=ДА, Пропускать, Использовать)
    }, '', {
        if func('Переместить', 'Игрок', 'Яблоко', '', 'Чугунок')=Продолжить:
            GS 'ТекстНаЭкран', 'п. Вы положили ((яблоко|Яблоко)) в ((чугунок|Чугунок)).'
        end
    }
!----------
!Ну и пару постоянных пунктов в меню Чугунка добавим:
GS 'УстановитьДействие', 'Чугунок', 'Осмотреть чугунок', $ico['осмотреть снаружи'], '', '', {
        GS 'ОписаниеНаЭкран', 'Чугунок'
    }
!----------
GS 'УстановитьДействие', 'Чугунок', 'Заглянуть внутрь чугунка', $ico['осмотреть внутри'], '', '', {
        GS 'ОписаниеНаЭкран', 'Чугунок:Содержимое'
    }

Теперь, при нажатии на ссылку "Чугунок" в тексте получаем такое меню:
https://ifiction.ru/i/scr/qsp_scr_manip_002.png

При нажатии на ссылку "Яблоко" в тексте получаем такое меню:
https://ifiction.ru/i/scr/qsp_scr_manip_001.png

Выбрав пункт "Что-нибудь сделать с яблоком", включаем режим "взаимодействия" объектов (в нижнем левом углу появляется фраза-приглашение, напоминающая с каким предметом мы сейчас проводим манипуляции):
https://ifiction.ru/i/scr/qsp_scr_manip_003.png

Ну и при нажатии на ссылку какого-нибудь другого объекта, в случае, если взаимодействие с данным объектом возможно, в меню появляется соответствующий пункт (в данной ситуации — "Положить яблоко в чугунок"):
https://ifiction.ru/i/scr/qsp_scr_manip_004.png

Кстати, добавил в меню иконки, чтобы посмотреть, как будет выглядеть. Весёленько так, да…

Неактивен

0    0    #17
19.07.2011 09:03

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

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

Ajenta, вертикальный разделитель в меню появляется в Windows 7 (виден на скриншотах из предыдущего поста), в WinXP его нет.

Неактивен

0    0    #18
25.07.2011 15:03

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

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

Я был настолько шокирован уходом со сцены главного конкурента по части описания непонятных наработок, что несколько забросил работу над Адским движком™, да и сюда писать стимула поубавилось — с кем же будут сравнивать?! Однако, впереди ещё много интересного, чем бы хотелось попугать и ужаснуть адептов классического менюшного подхода, приверженцев идеологии "всё своё пишу я сам", ну и проповедников чистоты Кусп-языка. Я даже придумал классное и многообещающее название для одного из модулей: "самовозбуждающаяся система".

Так-то ©

Неактивен

0    0    #19
27.07.2011 00:13

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

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

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

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

Вот, например, рабочий код для ситуации, когда объект может быть только в единственном экземпляре:

Код:

! У объекта "Сигарета" добавляем пункт в меню…
GS 'УстановитьДействие', 'Сигарета', 'Взять сигарету', {
    ! …который будет появляться, только если объект "Сигарета" отсутствует у игрока
    ARGS['Результат']=IIF(func('Местонахождение', 'Сигарета', 'Игрок')=НЕТ, Использовать, Пропускать)
}, {
    ! Если игрок выбрал этот пункт, то перемещаем объект в инвентарь игрока
    if func('Переместить', 'Сигарета', 'Игрок')=Продолжить:
        GS 'ТекстНаЭкран', 'п. Вы взяли ((сигарету|Сигарета)).'
    end
}

В случае с многочисленными экземплярами объекта возникают следующие моменты:

  1. При формировании описания содержимого объекта нужно определять его местонахождение — причём не просто в лоб, а с привязкой к выводимому описанию. И уже это местонахождение фиксировать в ссылке как ID-Места.
  2. В системный обработчик ссылки нужно передавать вместе с ID-Объекта ещё и ID-Места, где он находится.
  3. В авторский модуль обработки ссылки также нужно передавать ID-Места.
  4. Использование этого ID-Места хотелось бы сделать незаметным для автора. Т.е. упоминаемый автором в коде идентификатор объекта система воспринимает как связку ID-Объекта + ID-Места.

Если допустить, что все условия и авторские модули передаются как строки или через {…}, то при реализации пунктов 1 и 2 можно провернуть такой финт: во все авторские модули передаётся параметр, в котором в запакованном виде хранится связка ID-Объекта + ID-Места, а в начало каждого авторского модуля автоматически добавляется строка:

Код:

ARGS['Объект']=ARGS[0]

В этом случае появляется стимул использовать в авторском модуле именно эту переменную вместо имени объекта, т.е. пример кода с сигаретой будет выглядеть, например, так:

Код:

! У объекта "Сигарета" добавляем пункт в меню…
GS 'УстановитьДействие', 'Сигарета', 'Взять сигарету', {
    ! …который будет появляться, только если объект "Сигарета" отсутствует у игрока
    ARGS['Результат']=IIF(func('Местонахождение', ARGS['Объект'], 'Игрок')=НЕТ, Использовать, Пропускать)
}, {
    ! Если игрок выбрал этот пункт, то перемещаем объект в инвентарь игрока
    if func('Переместить', ARGS['Объект'], 'Игрок')=Продолжить:
        GS 'ТекстНаЭкран', 'п. Вы взяли ((сигарету|Сигарета)).'
    end
}

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

Неактивен

0    0    #20
02.08.2011 00:10

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

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

Кажется, я нащупал решение.

Неактивен

0    0    #21
04.08.2011 15:48

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

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

Всё хорошо — пока всё получается как и задумывалось.

Неактивен

0    0    #22
04.08.2011 22:17

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

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

В общем, отдельными слайдами результат продемонстрировать уже невозможно. Поэтому — видео:



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

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


Прикрепленные файлы:
qsp_multiple_objects_1.txt, Размер: 4,633 байт, Скачано: 647

Неактивен

0    0    #23
04.08.2011 22:39

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

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

Чтобы не отпугивать благовоспитанных людей "Адский Движок" на публике будет выступать под мирским именем "Az"…

Неактивен

0    0    #26
06.08.2011 15:17

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

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

Что делать с контейнерами объекта, который может быть в нескольких экземплярах?

Есть объект "Река", который находится ("протекает") в нескольких локациях (этот пример мы обсуждали с Чеширом на канале #ifrus). Почему есть смысл сделать реку одним объектом? Да чтобы модули ("осмотреть", "посмотреться", "попить", "набрать воды") не дублировать — надо всего лишь один раз прописать взаимодействие с одним объектом "Река". Однако тут есть нюанс — а что, если нужно что-то положить в реку?

Можно реализовать это так — при перемещении каких-нибудь объектов в "Реку" на самом деле размещать их в специально выделенном для этой цели контейнере "ДноРеки", но принадлежащем не объекту "Река", а текущей локации:

Код:

GS 'ДобавитьВзаимодействие', 'Пистолет', 'Река', 'Бросить пистолет в реку', $ico['положить'], {
        Result = IIF(func('Местонахождение', ИГРОК, $ОБЪЕКТ1, '$ЛОКАЦИЯ:ДноРеки'), Пропускать, Использовать)
    }, 0, {
        if func('Переместить', ИГРОК, $ОБЪЕКТ1, 0, '$ЛОКАЦИЯ:ДноРеки') = Продолжить:
            GS 'ТекстНаЭкран', 'п. Вы бросили ((пистолет|$ОБЪЕКТ1)) в ((реку|$ОБЪЕКТ2)).'
        end
    }

При попытке взаимодействия "Пистолета" и "Реки" (при условии, что Пистолет уже не находится в контейнере "ДноРеки" текущей локации) "Пистолет" перемещается в контейнер "ДноРеки" текущей локации.

Соответственно, при выполнении осмотра дна "Реки" (что-то типа действия "Пошарить по дну реки") нужно просто дополнительно вывести содержимое контейнера "ДноРеки" текущей локации.

Наверное, стоит пока остановиться на этом обходном манёвре…

Неактивен

0    0    #27
10.08.2011 08:44

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

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

Из-за введения понятия "Экземпляр объекта" (Объект + Местонахождение — пока это значит именно это) пришлось переделать большую часть модулей. Однако результатом доволен.

Неактивен

0    0    #28
10.08.2011 09:14

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

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

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

Синтаксис обработчика пока следующий:

Код:

GS 'ПриОпределенииМестонахождения', <Инициатор>, <Объект>, <Местонахождение>, <Модуль>

Инициатор — кто определяет местонахождение.
Объект — местонахождение чего определяется.
Местонахождение — где именно определяется местонахождение объекта.

Вызов данного обработчика происходит во всех возможных комбинациях параметров, включая пустые, что позволяет обрабатывать такие ситуации, как, например, определение игроком (Инициатор="ИГРОК") местонахождения чего угодно (Объект=0) в локации "Зал" (Местонахождение="Зал").

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

Код:

GS 'ПриОпределенииМестонахождения', 'Сканер', 0, ИГРОК, {
    if func('Свойство', 0, 'Сканер', 'Питание'):
        ARGS['Результат']=ДА
    else
        ARGS['Результат']=НЕТ
    end
}

Данный обработчик вызывается при определении объектом "Сканер" наличия какого угодно объекта у текущего персонажа. Если свойство "Питание" объекта "Сканер" в этот момент равно 0, то в результате определения местонахождения вернётся НЕТ вне зависимости от наличия искомого объекта у персонажа "Игрок".

Неактивен

0    0    #29
08.09.2011 10:43

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

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

Столкнулся с явлением перехода количества в качество: регулярность возникновения некоторых проблем перевела их из категории исключений в категорию "нереализованного общего подхода". Пришлось кое-что переписать, в том числе и модуль контейнеров. И параллельно нашлось, над чем подумать…

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

Неактивен

0    0    #30
11.09.2011 00:07

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

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

Хм… Иногда моя работа над Адским Движком™ напоминает мне это:

http://comicsia.ru/i/7e/ad-32429.png

Неактивен

1    0    #31
11.09.2011 17:52

fireton
некто с бородой (+354, -92)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1103
Вебсайт

Тон

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

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

Хм… Иногда моя работа над Адским Движком™ напоминает мне это:

Не, ну ты сам того добился. smile
Делал бы себе игру и движок молча... Теперь терпи. smile

Неактивен

0    0    #32
11.09.2011 18:06

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

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

fireton написал:

Не, ну ты сам того добился. smile
Делал бы себе игру и движок молча... Теперь терпи. smile

Да я как-то не жалуюсь. Даже наоборот.

Неактивен

0    0    #33
13.09.2011 20:55

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

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

Хм… Сколько останется, если из "Бесконечности" вычесть "Всё что есть"?

Неактивен

0    0    #34
13.09.2011 22:13

uux
Участник (+884, -80)
Откуда: Москва
Зарегистрирован: 02.12.2006
Сообщений: 1624

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

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

Хм… Сколько останется, если из "Бесконечности" вычесть "Всё что есть"?

 спойлер…

Отредактировано uux (13.09.2011 22:14)

Неактивен

0    0    #35
14.09.2011 10:19

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

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

Раз у нас такие лингвистические шутники водятся, то я, пожалуй, переименую константу "ЧЛ" ("ЧисЛо"), обозначающую числовой тип аргумента, в "ЧС".

Неактивен

0    0    #36
17.09.2011 14:27

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

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

В правильном ролике "Алфавит по хардкору", глаз зацепился за кадр с буквой Q, из чего родилось настроение логотипа для Адского движка:

https://ifiction.ru/i/qsp-az-logo.png

Неактивен

0    0    #37
10.10.2011 21:48

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

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

А между тем работа, хоть и медленно, но идёт.

Кстати, сегодня ввиду плохого самочувствия и настроения пришла мысль, как сделать синтаксис команд Адского движка ещё кошмарнее:

Например, команда добавления действия с объектом:

Код:

GS 'УстановитьДействие', <Объект>, <Название пункта меню>, <Иконка>, <Условие>, <Обработчик>, <Модуль>

Её можно записать так (текущий работающий вариант):

Код:

GS 'УстановитьДействие', 'Портсигар', 'Осмотреть/Осмотреть портсигар', 'осмотреть', '', '', {
    GS 'ОписаниеНаЭкран', 'Портсигар'
}

а если порядок аргументов забыли (как я сегодня), то можно ведь сделать и так:

Код:

GS 'УстановитьДействие', $ПС + '
    Объект: Портсигар
    ПунктМеню: Осмотреть
    Действие: Осмотреть портсигар
    Иконка: осмотреть
    Модуль: "
        GS 'ОписаниеНаЭкран', 'Портсигар'
    "
'

$ПС в данном случае — это просто системный префикс, чтобы отловить такой вот изврат.

Что это добавляет кроме монументальности? Хороший вопрос!.. Наверное, в основном возможность произвольного расположения параметров и пропуска ненужных. Кроме того легче добавлять множество различных параметров, которые вроде как особо не нужны, но если их указать, то в некоторых случаях они могут изрядно сократить код.

Для альтернативно одарённых: советовать мне переходить на INSTEAD не надо.

Неактивен

0    0    #38
03.11.2011 15:08

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

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

В своё время мою идею маскировать ссылки на объекты в тексте (делая их тем же цветом, что и текст) подвергли критике, хотя были и те, кто эту идею поддержал.

Однако, добавление в описание объектов только для антуража делает текст слишком "пёстрым". Так может для подобных объектов добавить свойство "Не выделять ссылку", при установке которого ссылка на этот объект и будет маскироваться под обычный текст?

P.S. Хотя со временем, идея маскировать ссылки мне кажется всё более привлекательной.

Неактивен

0    0    #39
03.11.2011 22:52

gloomy
Модератор (+277, -67)
Зарегистрирован: 21.02.2009
Сообщений: 427

http://instead.hugeping.ru

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

Идея делать ссылки невидимыми имеет интересный эффект. В первых версиях INSTEAD ссылки как раз были не видимыми, но курсор при наведении менял свою форму. Идея была в том, чтобы максимально приблизить игровой процесс к парсеру. Грубо говоря, предотвратить бездумное прохождение по рельсам ( что еще ярче выражено в CYOA играх). Игровой процесс еще больше похож на исследование (что я в основном и ценю в IF-играх).

Лично мне результат очень нравился wink, но большинство людей выбрали ссылки, это делает игge более казуальной. В итоге я поддался, и кот уже был на видимых ссылках.

Но лично мне нравится идея. Правда при ее реализации желательно увеличить количество ссылок до состояния, когда КАЖДОЕ слово, обозначающее один предмет, можно кликнуть, а не только в определенном предложении. При выполнении такого условия игра становится честнее и менее напрягающей.

Неактивен

0    0    #40
03.11.2011 23:38

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

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

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

Неактивен

0    0    #41
04.11.2011 09:27

Cheshire
Участник (+141, -23)
Зарегистрирован: 01.07.2009
Сообщений: 340
Вебсайт

Утлый парсер ©

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

Как вариант — делать текст и ссылки одного цвета, но разных тонов. Например, текст серым, а ссылки чёрным. «Пёстрота» текста уменьшается значительно, ссылки при этом остаются различимыми (при должном усердии).
Впрочем, такое автору можно уже и сейчас делать.

Отредактировано Cheshire (04.11.2011 09:28)

Неактивен

0    0    #42
04.11.2011 10:29

WladySpb
Участник (+2)
Зарегистрирован: 21.12.2008
Сообщений: 33

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

Я обычно так и делаю, на мой взгляд самая удобная реализация ссылок. В один цвет нежелательно - начинается пиксельхантинг

Неактивен

0    0    #43
04.11.2011 11:31

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

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

WladySpb написал:

Я обычно так и делаю, на мой взгляд самая удобная реализация ссылок. В один цвет нежелательно - начинается пиксельхантинг

Я думал насчёт пиксельхантинга. В принципе сравнение тут не особо корректное — изменение курсора над ссылкой и ограниченный размер текста делают процесс не столь утомительным. Зато потенциально возможна как раз та отдача, о которой упоминал gloomy.

Неактивен

0    0    #44
04.11.2011 11:37

Oreolek
Модератор (+450, -169)
Откуда: Кемерово
Зарегистрирован: 02.11.2009
Сообщений: 673
Вебсайт

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

Офигенная тема, хочу обсудить, но сообщение не скрывается :-(

По-моему, идея скрывать ссылки в играх плоха по трём причинам.

Во-первых, её труднее объяснить.

Во-вторых, на планшетах и телефонах такого события, как наведение курсора мыши, вообще не существует.

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

Отредактировано Oreolek (04.11.2011 11:37)

Неактивен

0    0    #45
04.11.2011 11:47

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

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

Oreolek написал:

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

Насчёт планшетов и телефонов — резонно.

А зачем вываливать на игрока два экрана текста в самом игровом процессе (т.е. не во вступлении или текстовых вставках, а именно в описании локаций, объектов и т.п.)? Это пагубная привычка.

Неактивен

0    0    #46
04.11.2011 15:22

fireton
некто с бородой (+354, -92)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1103
Вебсайт

Тон

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

Мне очень нравится идея подсветки всех существительных в тексте с последующим интерактивом. Две трудности:
1. Дофига работы над описанием. Но это решаемо.
2. Удобная разметка текста. При достаточной насыщенности текста существительными код игры быстро превратится в нечитаемый треш. Тут простого решения нет. Либо идём путём инстеда и собираем описание из кусочков, либо надо как-то извращаться.

Неактивен

0    0    #47
04.11.2011 15:43

Oreolek
Модератор (+450, -169)
Откуда: Кемерово
Зарегистрирован: 02.11.2009
Сообщений: 673
Вебсайт

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

А зачем вываливать на игрока два экрана текста в самом игровом процессе (т.е. не во вступлении или текстовых вставках, а именно в описании локаций, объектов и т.п.)? Это пагубная привычка.

Объекты могут очень красиво выглядеть... или экран может быть маленьким.

Неактивен

0    0    #48
04.11.2011 15:58

Серый Волк
Модератор (+1194, -91)
Откуда: Тверь
Зарегистрирован: 22.02.2008
Сообщений: 1096
Вебсайт

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

Хороший пример реализации - игра "Цветохимия (Ajenta; QSP), в которой предусмотрено два режима сложности. На одном ссылки подсвечены, на другом, соответственно, скрыты.
Ссылка на игру: http://qsp.su/index.php?option=com_sobi … p;Itemid=0

Отредактировано Серый Волк (08.11.2011 16:40)

Неактивен

0    0    #49
12.03.2012 14:37

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

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

Что-то совсем забросил тему, хотя работа некоторое время назад возобновилась.

Поскольку текст у меня идёт сплошняком (textflow — модное слово!), добавил автоматический вывод на экран маркера, который помечает с какого места появился новый текст для игрока. Выглядит это примерно так:
https://ifiction.ru/i/scr/qsp_scr_text_001.png
Вот та чёткая пунктирная линия — и есть чёткий такой маркер. Само собой, при появлении новой порции текста старый маркер исчезает.
Пока проверяю на себе — очень удобно.

Неактивен

0    0    #50
12.03.2012 14:51

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

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

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

Код:

…ТекстНаЭкран, 'Привет мир!'

тег "<-далее->", чтобы команда:

Код:

…ТекстНаЭкран, 'Привет мир!<-далее->Я всех ненавижу!'

выводила сначала "Привет мир!", а потом (после нажатия на пробел или маленькую ссылочку "продолжить") — "Я всех ненавижу!". Это позволило бы нагнетать атмосферу и выводить неожиданные обороты. Драматическая пауза на заданное время — это выход, но я не люблю решения с фиксированными паузами (и недолюбливаю людей, которые этим приёмом злоупотребляют). Поэтому отложил это до лучших времён.

P.S. Почему не получилось? Потому что в QSP-Classic невозможно остановить выполнение кода в отдельной точке (если это не input или msg, конечно же), подождать действия игрока, а потом продолжить далее.

Неактивен

0    0    #51
28.03.2012 21:47

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

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

Наткнулся на несколько головоломных моментов:

1. Ссылки на некоторые объекты хотелось бы иметь активными всегда, а не только когда объект находится в известных игроку "контейнерах". Известные контейнеры — это содержимое текущей локации и осмотренные игроком объекты в ней. Так, например, упоминание в описании каких-нибудь объектов или персонажей, которых рядом с игроком как бы и нет. В этом случае можно для объекта указать спец. режим обработки ссылок — т.е. ссылка активна всегда, когда объект в доступных контейнерах или когда при нажатии на него формируется меню.

Кстати, совсем забыл про полезную функцию — формирование меню в режиме проверки, т.е. сформированное меню в итоге не вызывается, а возвращается лишь количество пунктов в нём. Это можно использовать.

2. Что делать с ссылками на локации. Сейчас они у меня активны всегда, однако во время игры сразу же наткнулся на проблему "локация в нескольких переходах".
Вариант — активна всегда локация, в которой находится игрок, плюс автору добавляется возможность указывать перечень локаций, откуда будет доступна та или иная локация. А можно и не заморачиваться, а пойти по пункту 1 и локациям добавить автоматическое присвоение признака "ссылки активны всегда" — а уж за наличие пунктов в меню пусть отвечает автор.

P.S. Чтобы никто заново не возбуждался — под автором я всё ещё подразумеваю себя, хоть и говорю отвлечённо.

Неактивен

0    0    #52
28.03.2012 22:10

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

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

Да, и поскольку всякие действия, описания, упоминания и т.п. содержат модуль условия их использования, и этот модуль зачастую состоит из одной строчки типа:

Код:

{°Результат=IIF(©Параметр='Встать',Использовать,Пропускать)}

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

Код:

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

Так и короче пишется, и не нужно помнить, какая константа ("Использовать", "Пропускать" и т.п.) для данной конструкции означает использование, а какая — пропуск.

Неактивен

0    1    #53
29.03.2012 07:01

Nex
Участник (+120, -130)
Зарегистрирован: 11.06.2007
Сообщений: 2053

---

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

Фигасе, значки градуса и копирайта?! Как их набирать?

2. Что делать с ссылками на локации.

См. классику INSTEAD.

Неактивен

0    0    #54
29.03.2012 07:44

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

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

Nex написал:

Фигасе, значки градуса и копирайта?! Как их набирать?

Клавиатурная раскладка Ильи Бирмана: http://ilyabirman.ru/projects/typography-layout/

Nex написал:

2. Что делать с ссылками на локации.

См. классику INSTEAD.

Как насчёт развернуть свою мысль, чтобы было ясно, что же ты имеешь в виду?
Так, у меня на экране может одновременно находится описание нескольких локаций (textflow), а также описания предметов и действий с упоминаниями тех или иных объектов, ссылки на которые автоматически гасятся, если объекты недоступны. Я не припомню, чтобы кто-нибудь говорил про такое в контексте INSTEAD.

Неактивен

0    1    #55
29.03.2012 13:34

Nex
Участник (+120, -130)
Зарегистрирован: 11.06.2007
Сообщений: 2053

---

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

Вопрос.

Код:

Что делать с ссылками на локации.

Ответ.

Код:

См. классику INSTEAD.

В классических играх INSTEAD уже давно решили эту проблему. Можно взять того же "Квантового Кота", посмотреть, как это реализовано, и сделать так же.

Неактивен

0    0    #56
29.03.2012 16:48

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

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

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

Так, у меня на экране может одновременно находится описание нескольких локаций (textflow), а также описания предметов и действий с упоминаниями тех или иных объектов, ссылки на которые автоматически гасятся, если объекты недоступны. Я не припомню, чтобы кто-нибудь говорил про такое в контексте INSTEAD.

Nex написал:

В классических играх INSTEAD уже давно решили эту проблему. Можно взять того же "Квантового Кота", посмотреть, как это реализовано, и сделать так же.

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

Неактивен

0    1    #57
29.03.2012 19:00

Nex
Участник (+120, -130)
Зарегистрирован: 11.06.2007
Сообщений: 2053

---

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

При чем тут то, что находится на экране? Постановка вопроса такая:

Что делать с ссылками на локации. Сейчас они у меня активны всегда, однако во время игры сразу же наткнулся на проблему "локация в нескольких переходах".
Вариант — активна всегда локация, в которой находится игрок, плюс автору добавляется возможность указывать перечень локаций, откуда будет доступна та или иная локация. А можно и не заморачиваться, а пойти по пункту 1 и локациям добавить автоматическое присвоение признака "ссылки активны всегда" — а уж за наличие пунктов в меню пусть отвечает автор.

Вот на это я и дал ответ. То, что ты там подразумевал не то, о чем в итоге написал - твои проблемы.

Неактивен

0    0    #58
29.03.2012 20:18

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

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

Nex написал:

При чем тут то, что находится на экране? Постановка вопроса такая:

Что делать с ссылками на локации. Сейчас они у меня активны всегда, однако во время игры сразу же наткнулся на проблему "локация в нескольких переходах".
Вариант — активна всегда локация, в которой находится игрок, плюс автору добавляется возможность указывать перечень локаций, откуда будет доступна та или иная локация. А можно и не заморачиваться, а пойти по пункту 1 и локациям добавить автоматическое присвоение признака "ссылки активны всегда" — а уж за наличие пунктов в меню пусть отвечает автор.

Вот на это я и дал ответ. То, что ты там подразумевал не то, о чем в итоге написал - твои проблемы.

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

Неактивен

0    1    #59
29.03.2012 20:26

Nex
Участник (+120, -130)
Зарегистрирован: 11.06.2007
Сообщений: 2053

---

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

Это был не совет, а ответ на вопрос. То, что мой ответ показался тебе неприемлемым, не моя забота.

Неактивен

0    0    #60
29.03.2012 20:37

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

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

Nex написал:

Это был не совет, а ответ на вопрос. То, что мой ответ показался тебе неприемлемым, не моя забота.

Вот только от вопроса ты отсёк всё, что не подходило к ответу. В том числе и накопленный контекст. Смотри аналогию с лыжами и санками.

Неактивен

0    1    #61
30.03.2012 09:47

Nex
Участник (+120, -130)
Зарегистрирован: 11.06.2007
Сообщений: 2053

---

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

Ой, ну хватит уже меня благодарить.

Неактивен

0    0    #62
31.03.2012 13:00

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

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

Посмотрел код "Адского движка" на выходе (т.е. включаемый в "состав" игры). Понял, как важно не потерять исходники исходников…

Пример кода (редактор EmEditor), с которым я и работаю:
https://ifiction.ru/i/scr/qsp_scr_code_002.png

Получаемый в результате код (редактор QGen):
https://ifiction.ru/i/scr/qsp_scr_code_003.png

Неактивен

0    0    #63
31.03.2012 17:46

Zeantar
Участник (+23, -51)
Зарегистрирован: 30.03.2012
Сообщений: 119

Мир, как мы его знали, подходит к концу... (с) БГ

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

Обычная конструкция. Что ты хотел сказать этим?

Неактивен

0    0    #64
31.03.2012 17:54

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

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

Zeantar написал:

Обычная конструкция. Что ты хотел сказать этим?

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

P.S. Вообще-то тут не приветствуется стиль общения а-ля чат. И важно не только смотреть на картинки, но и читать, что пишут другие.

Неактивен

0    1    #65
31.03.2012 21:20

Zeantar
Участник (+23, -51)
Зарегистрирован: 30.03.2012
Сообщений: 119

Мир, как мы его знали, подходит к концу... (с) БГ

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

Приветствуется твой монолог, хочешь сказать?
Будь проще.

Неактивен

0    0    #66
31.03.2012 21:30

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

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

Zeantar написал:

Приветствуется твой монолог, хочешь сказать?

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

Для обсуждения друг друга лучше всего подходит раздел "Изба". Здесь продолжать подобный оффтоп не нужно.

Неактивен

0    0    #67
05.04.2012 21:29

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

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

А между тем на Asus EeePC 901 первоапрельский трейлер заметно притормаживает. Замеры времени выполнения некоторых участков кода (через MSECSCOUNT) выявили кое-какие любопытные участки с серьёзным ухудшением времени обработки. Есть над чем подумать.

Неактивен

0    0    #68
21.04.2012 00:17

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

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

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

Да, и пришлось обломаться с порционным выводом текста.

Код:

…ТекстНаЭкран, 'Привет мир!<-далее->Я всех ненавижу!'

P.S. Почему не получилось? Потому что в QSP-Classic невозможно остановить выполнение кода в отдельной точке (если это не input или msg, конечно же), подождать действия игрока, а потом продолжить далее.

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

Неактивен

0    0    #69
11.05.2012 23:06

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

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

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

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

Таким образом вызывать SAVEGAME нужно в том месте кода, после которого гарантировано ничего выполняться уже не будет. А у меня с этим очень непросто, потому как игровой код (откуда и вызывается команда создания точки сохранения) обрамлён служебным кодом фреймворка.

Код:

1. Начало служебной функции
2. Заполнение вспомогательной информации
3. Запуск игрового кода
4. Вызов SAVEGAME
5. Окончание игрового кода
6. Чистка вспомогательной информации
7. Завершение служебной функции

И если потом загрузить такой чекпоинт (командой OPENGAME), то в нём будет присутствовать всякий мусор, поскольку чистки вспомогательной информации (п.6) и корректного завершения служебной функции (п.7) произведено не было и не будет, потому как у нас восстановится состояние игры в пункте 4 и никаких дополнительных действий произведено не будет.

Предусмотреть состав вспомогательной информации, чтобы как-то почистить её в локации-обработчике загрузки состояния игры ($ONGLOAD), невозможно. Так что есть над чем подумать.

Неактивен

0    0    #70
12.05.2012 15:45

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

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

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

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

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

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

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

Неактивен

0    0    #71
22.05.2012 13:56

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

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

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

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

Код:

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

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

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

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

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

Код:

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

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

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

Как-то так…

Неактивен

0    0    #72
22.05.2012 16:42

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

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

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

Неактивен

0    0    #73
29.05.2012 23:44

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Код:

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

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

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

Код:

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

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

Как-то так…

Неактивен

0    0    #74
10.08.2012 14:10

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

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

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

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

Код:

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

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

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

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

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

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

Неактивен

0    0    #75
10.08.2012 17:29

Zeantar
Участник (+23, -51)
Зарегистрирован: 30.03.2012
Сообщений: 119

Мир, как мы его знали, подходит к концу... (с) БГ

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

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

Неактивен

0    0    #76
10.08.2012 18:44

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

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

Zeantar написал:

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

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

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

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

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

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

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

Код:

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

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

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

Код:

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

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

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

Код:

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

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

Код:

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

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

Код:

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

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

Неактивен

0    0    #77
10.08.2012 19:38

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

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

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

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


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

Неактивен

0    0    #80
10.08.2012 20:47

Zeantar
Участник (+23, -51)
Зарегистрирован: 30.03.2012
Сообщений: 119

Мир, как мы его знали, подходит к концу... (с) БГ

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

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

Отредактировано Zeantar (10.08.2012 20:49)

Неактивен

0    0    #81
10.08.2012 20:53

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

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

Zeantar написал:

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

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

Неактивен

0    0    #82
10.08.2012 21:02

Zeantar
Участник (+23, -51)
Зарегистрирован: 30.03.2012
Сообщений: 119

Мир, как мы его знали, подходит к концу... (с) БГ

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

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

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

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

С уважением.

Неактивен

0    0    #83
10.08.2012 21:06

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

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

Zeantar написал:

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

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

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

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

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

Неактивен

0    0    #84
11.08.2012 23:10

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

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

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

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

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


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

Неактивен

0    0    #85
22.08.2012 17:02

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

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

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

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

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

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

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

Код:

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

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

Неактивен

0    0    #86
24.08.2012 18:39

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

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

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

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

Код:

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

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

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

Код:

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

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

Код:

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

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

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

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

Код:

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

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

Код:

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

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

Неактивен

0    0    #87
25.08.2012 15:05

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

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

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

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

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

Код:

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

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

Неактивен

0    0    #88
26.08.2012 11:51

Zeantar
Участник (+23, -51)
Зарегистрирован: 30.03.2012
Сообщений: 119

Мир, как мы его знали, подходит к концу... (с) БГ

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

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

Неактивен

0    0    #89
26.08.2012 11:59

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

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

Zeantar написал:

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

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

Неактивен

0    0    #90
26.08.2012 12:40

Zeantar
Участник (+23, -51)
Зарегистрирован: 30.03.2012
Сообщений: 119

Мир, как мы его знали, подходит к концу... (с) БГ

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

У меня все проще, но ладноо ) отвлеклись, поспамили - и снова в бой, в адский движок

Отредактировано Zeantar (26.08.2012 23:42)

Неактивен

0    0    #91
08.10.2012 22:28

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

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

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

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

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

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

Код:

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

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

Код:

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

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

Неактивен

2    0    #92
09.04.2013 20:55

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

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

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

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

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

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

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

Код:

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

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

Код:

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

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

Неактивен

1    0    #93
23.04.2013 11:37

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

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

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

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

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

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

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

Код:

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

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

Как-то так.

Неактивен

0    0    #94
30.04.2013 12:56

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

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

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

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

Код:

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

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

Код:

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

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

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

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

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

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

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

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

Код:

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

Как-то так.

Неактивен

1    0    #95
05.03.2014 14:56

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

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

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

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



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

Неактивен

Powered by PunBB
© copyright 2001–2024 iFiction.Ru