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.
Участник (+1056, -249)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2881
Вебсайт

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

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

Неактивен

0    0    #2
06.07.2011 22:45

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

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.
Участник (+1056, -249)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2881
Вебсайт

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.
Участник (+1056, -249)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2881
Вебсайт

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

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

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

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

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

Код:

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

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

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

Неактивен

0    0    #5
10.07.2011 22:08

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

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

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

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

Код:

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

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

Неактивен

0    0    #6
11.07.2011 17:54

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

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

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

Неактивен

0    0    #7
11.07.2011 19:14

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

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

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

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

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

Неактивен

0    0    #8
11.07.2011 22:30

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

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

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

Неактивен

0    0    #9
11.07.2011 22:41

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

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

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

Неактивен

0    0    #10
12.07.2011 00:30

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

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

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

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

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

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

Неактивен

0    0    #11
12.07.2011 20:49

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

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

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

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

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

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

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

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

Неактивен

0    0    #12
12.07.2011 21:25

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

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

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

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

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

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


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

Неактивен

0    0    #13
13.07.2011 11:34

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

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

Nex написал:

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

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

Неактивен

0    0    #14
19.07.2011 01:21

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

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    #15
19.07.2011 09:03

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

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

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

Неактивен

0    0    #16
25.07.2011 15:03

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

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

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

Так-то ©

Неактивен

0    0    #17
27.07.2011 00:13

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

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    #18
02.08.2011 00:10

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

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

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

Неактивен

0    0    #19
04.08.2011 15:48

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

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

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

Неактивен

0    0    #20
04.08.2011 22:17

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

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

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



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

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


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

Неактивен

0    0    #21
04.08.2011 22:39

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

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

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

Неактивен

0    0    #23
06.08.2011 15:17

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

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

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

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

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

Код:

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

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

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

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

Неактивен

0    0    #24
10.08.2011 08:44

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

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

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

Неактивен

0    0    #25
10.08.2011 09:14

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

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

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

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

Код:

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

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

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

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

Код:

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

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

Неактивен

Powered by PunBB
© copyright 2001–2024 iFiction.Ru