Авторизация
×

Логин (e-mail)

Пароль

Интерактивные истории, текстовые игры, квесты и визуальные новеллы
Гиперкнига

Библиотека    Блог

Использование модуля «Inventory». Часть 2-я

Борис Семёнов (Morych), 03.05.13 | Практика ASM

Продолжаем знакомиться с примером практического применения модуля «Inventory».

Настройка торговли

Рассмотрим настройку торговли в параграфе ХмурыйТорговец:

<<display "m_Title">>
<<set $m_market = 1.2>>
Вы подходите к хмурому торговцу. Взглянув на вас, торговец ворчит:
-- Если не собираешься ничего покупать, то не загораживай товар!
<<set $m_trader = "Хмурый торговец">>
<<set $m_position = $m_trader>>
<<set $m_textPosition = "На прилавке, среди всякой ерунды вы видите">>
<<set $m_textEmpty = "На прилавке остался только всякий хлам.">>
<<display "m_Items">>
[[Продать что-нибудь торговцу|ПродатьХмуромуТорговцу]]
[[Отойти от торговца|Рынок]]

После вызова m_Title устанавливаем параметр торговли $m_market, который также отвечает за наценку. Параметр больше 0, значит герой будет покупать, причём все цены в данном случае будут больше номинальных в 1.2 раза. Далее заносим в объект $m_trader имя активного торговца. И затем, установив перед вызовом m_Items имя торговца в качестве позиции, показываем предметы, которыми он владеет.

Покупать и продавать одновременно модуль не позволяет. Для продажи своих предметов нужно перейти в параграф ПродатьХмуромуТорговцу:

<<display "m_Title">>
<<set $m_market = -0.4>>
-- Может, купите что-нибудь у меня? -- с надеждой спрашиваете вы.
-- А что у тебя есть? Покажи! -- требует торговец.
[[Купить что-нибудь у торговца|ХмурыйТорговец]]
[[Отойти от торговца|Рынок]]

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

Перед ссылками-действиями можно даже сразу перечислить предметы героя, чтобы игроку не нужно было нажимать «инвентарь»:

<<set $m_position = $m_hero>>
<<set $m_textPosition = "В руках вы держите">>
<<set $m_textEmpty = "У вас при себе ничего нет.">>
<<display "m_Items">>

В этом случае саму ссылку «инвентарь» лучше сделать неактивной:

<<set $m_inventoryEnabled = false>>
<<display "m_Title">>
<<set $m_inventoryEnabled = true>>

После вызова m_Title не забываем вернуть объекту $m_inventoryEnabled значение true.

Использование поиска предметов

Чтобы персонажи «знали», какими предметами они владеют, и могли, к примеру, упоминать их в разговоре, мы используем специальный параграф m_Search. Вот как используется поиск предметов в параграфе РадостныйТорговец:

<<display "m_Title">>
<<set $m_market = 2.5>>
Вы подходите к радостному торговцу, и тот живо выбегает из-за прилавка.
<<set $m_trader = "Радостный торговец">>
<<set $m_searchPosition = $m_trader>>
<<set $m_searchItem = "">>
<<display "m_Search">>
<<if $m_searchIndex gt -1>>
    -- Добрый день! Меня зовут Поликарп, вам что-нибудь подсказать? Советую купить <<print $m_listItem[$m_searchIndex]>>!
    -- Спасибо, я подумаю, -- отвечаете вы.
<<endif>>
<<set $m_position = $m_trader>>
<<set $m_textPosition = "На прилавке торговца вы видите">>
<<set $m_textEmpty = "-- К сожалению, все товары закончились, но я могу купить что-нибудь у вас!">>
<<display "m_Items">>
[[Продать что-нибудь|ПродатьРадостномуТорговцу]]
[[Отойти от торговца|Рынок]]

Перед вызовом m_Search мы установили значение объекта $m_searchPosition равным имени активного торговца (будем искать предметы только среди его товаров), а в объект $m_searchItem занесли пустую строку (ищем все предметы, а не какой-то определённый). После вызова m_Search в объекте $m_searchIndex у нас есть индекс одного из найденных предметов (выбранный случайно), при помощи которого мы получаем доступ к любому свойству предмета. В данном случае выводим на экран наименование. Чтобы наименование предмета отображалось в виде ссылки, нужно использовать вместо макроса «print» макрос «display»:

<<display $m_listItem[$m_searchIndex]>>

Если поиск не даст результатов, значение объекта $m_searchIndex будет равно -1. Не забывайте проверять значение индекса перед обращением к свойствам предметов.

Передача предметов персонажам и реакция на действия

После похода на рынок герой попадает на параграф Поздравление. Здесь мы включаем возможность отдавать предметы инвентаря, для чего после вызова m_Title заносим в объект $m_giveTo имя целевого персонажа (в дательном падеже):

<<display "m_Title">>
<<set $m_giveTo = "маме">>
<<if ($m_action eq 5) or ($m_action eq 11)>>
    <<set $present = 1>>
<<endif>>
Мама пришла домой, и можно поздравить её с днём рождения.
<<if $present>>
    Кое-что вы ей отдали, но мама пока не догадывается, что это был подарок. Самое время сказать ей об этом!
<<else>>
    <<set $m_searchItem = "">>
    <<set $m_searchPosition = $m_hero>>
    <<display "m_Search">>
    <<if $m_searchIndex eq -1>>
        Правда, поздравлять придётся исключительно на словах.
    <<else>>
        Поздравить, конечно, можно только на словах, но лучше что-нибудь подарить. Например, <<print $m_listItem[$m_searchIndex]>>.
    <<endif>>
<<endif>>
<<if $present>>
    [[Поздравить маму подарком|ПоздравитьПодарком]]
<<endif>>
[[Поздравить только на словах|ПоздравитьСловами]]
[[+Порыться в шкафу|Шкаф]]

Чтобы сцена или персонажи реагировали на действия героя, мы должны организовать проверку значения объекта $m_action, в котором хранится код последнего действия. Например, в приведённом параграфе, как только герой отдаст один из предметов (код действия 5) или отдаст сразу все свои предметы (код 11), описание сцены поменяется. Если реакцией на какое-либо действие является изменение количества денег, нужно выполнять проверку кода действия до вызова параграфа m_Title.

Больше возможностей

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

<<set $i = 0>>
<<loop $m_listItem.length>>
    <<if ($m_listPosition[$i] eq "Рынок") and ($m_listPrice[$i] gt 0)>>
        <<set $m_listPosition[$i] = "Хмурый торговец">>
    <<endif>>
    <<set $i++>>
<<endloop>>

При помощи цикла перебираем все предметы и проверяем их позицию и цену. В случае удовлетворения свойств предмета всем условиям, меняем его позицию. Для перебора индексов нам понадобится объект $i, который мы увеличиваем на 1 при каждом повторении цикла. Количество повторений равно числу элементов списка $m_listItem.length.

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

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

С радостью отвечу на ваши вопросы по использованию модуля здесь, в комментариях, или на форуме.

Комментарии: 2.

Профиль


Закрыть
Евгений Туголуков (Korwin)
05.05.13 05:53

Борис, благоговейно снимаю шляпу! Огромная работа! Попробую использовать твой модуль в следующей игре...
Morych
06.05.13 23:30

Отлично! С удовольствием поиграю! :-)

Для того, чтобы оставлять комментарии, необходимо зарегистрироваться и подтвердить в профиле указанный e-mail адрес.

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