Интерактивные истории, текстовые игры и квесты
Регистрация / Вход
Посетите наш новый сайт AXMAJS.RU
Использование модуля «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.
Профиль
Закрыть
06.05.13 23:30
Отлично! С удовольствием поиграю! :-)
Для того, чтобы оставлять комментарии, необходимо зарегистрироваться и подтвердить в профиле указанный
При использовании любых материалов блога обязательно указание ссылки на источник
Борис, благоговейно снимаю шляпу! Огромная работа! Попробую использовать твой модуль в следующей игре...