Интерактивные истории, текстовые игры и квесты
Регистрация / Вход
Посетите наш новый сайт AXMAJS.RU
Пишем интерактивную историю вместе. Часть 6-я
Борис Семёнов (Morych), 22.03.13 | Практика ASM
Инвентарь
Под этим традиционным термином понимается набор предметов, которые главный герой носит с собой. Как правило, эти предметы помогают герою продвигаться по сюжету. Герой может владеть ими с начала истории, а может получить по ходу действия. Может герой и лишаться предметов (терять, ломать, отдавать второстепенному персонажу). Итак, для каждого предмета нам потребуется завести свой объект. Значение объекта в общем случае будет равно количеству однотипных предметов, имеющихся у главного героя. Мы здесь можем вспомнить пример с яблоками из главы «Объекты». Первоначально у нас есть объект «$яблоки», значение которого равно 0. Если некто даёт герою пять яблок, увеличиваем значение этого объекта на 5. Теперь до тех пор, пока значение объекта «$яблоки» больше 0, герой сможет подкрепиться. Каждый раз при этом уменьшаем значение объекта на 1. Если же предмет уникальный, соответствующий объект может принимать следующие значения: 0 — предмет пока не получен, 1 — предмет есть, -1 — предмет был, но теперь его нет. Самое время дать возможность нашему герою найти первый предмет. Пусть это будет железный нож, который чудом сохранился среди обломков сгоревшего дома. Это, конечно, будет уникальный предмет. Создадим объект «$нож» и установим его начальное значение в 0. Затем на сцене «Сгоревший дом» добавим ссылку-действие для случая, когда нож ещё не найден, и соответствующее предложение, если уже нашёлся.Сгоревший дом
<<set $сцена = 'Сгоревший дом'>>
<<display 'Заголовок'>>
Какой же это был хороший дом! Крепкий, добротный, срубленный из душистых сосновых брёвен! А теперь... мрачные чёрные обломки дымятся в горах золы. И лишь одинокая [[+каменная печь|Про печь]] сиротливо стоит посреди пепелища. Но самое ужасное, что всё [[+добро|Подробнее о добре]] пропало!
<<if $нож eq 0>>
[[Побродить среди пожарища|Найти нож]]
<<elseif $нож eq 1>>
Всего-то один нож и остался. Хорошо всё же, что я его отыскал.
<<endif>>
[[Пойти со двора|Старое селение]]
Теперь нам нужен новый параграф «Найти нож» с описанием события, где мы поменяем значение объекта «$нож».
Найти нож
<<display 'Заголовок'>>
Не веря в случившееся, я принялся бесцельно бродить по руинам того, что ещё вчера было моим домом. Здесь, напротив печи стояла широкая лавка, моя любимая. Теперь -- лишь куча золы. А вот эта груда углей -- стол, добрый дубовый стол... И тут внизу что-то звякнуло. Немного пошарив руками, я с удивлением добыл из-под углей почти целый нож. Клинок почернел, но не оплавился.
<<set $нож = 1>>
-- Вот повезло, -- обрадовался я и сунул ещё тёплый клинок за пазуху.
К сожалению, ничего больше найти не удалось. Похоже, остальное уцелевшее добро мои бывшие люди забрали с собой. Больше здесь меня ничего не держало.
[[Пойти со двора|Старое селение]]
Итак, нож мы нашли, значение объекта «$нож» установлено в 1. Если читатель захочет вернуться на сцену «Сгоревший дом», вместо действия он увидит сообщение, что нож успешно найден.
Если предметов в истории немного, можно понадеяться, что читатель запомнит, какими предметами обладает герой. Но гораздо лучше даже в этом случае выводить список имеющихся предметов с кратким описанием каждого из них. Конечно, постоянно читателю этот список ни к чему, поэтому будем выводить его по добавляющей ссылке, причём возможность отображения инвентаря должна присутствовать на каждой сцене.
А чтобы логика инвентаря была понятней, добавим ещё один предмет. Пусть это будет клубок ниток, который нашему герою подарит дед Закром в 14-м фрагменте диалога (то есть если герой поблагодарит деда). Параграф с диалогом большой, приведу только нужную часть.
Разговор с дедом
...
<<elseif $диалог_дед eq 14>>
-- Благодарствую тебе, дедушка Закром, за науку, -- поклонился я старику в пояс.
-- Выйдешь за околицу, по тропе ступай прямёхонько через лес, -- подсказал напоследок дед Закром. -- Да смотри, никуда с тропы не сворачивай!
Не успел я повернуться к выходу, как старик остановил меня:
-- Да погоди, куда пошёл! На вот, на удачу тебе, -- с этими словами он вынул из-за пазухи клубок ниток и протянул мне. -- Бери, в хозяйстве всё пригодится.
<<set $клубок = 1>>
Принимая подарок, я поблагодарил деда ещё раз. Тот лишь отмахнулся и, творя надо мной громовой знак, промолвил:
-- Всё, ступай, и Сварог тебе в допомогу!
[[Уйти|Старое селение {$диалог_дед = 15}]]
<<elseif $диалог_дед eq 15>>
...
За наличие клубка отвечает объект «$клубок», начальное значение которого должно равняться 0. Теперь займёмся списком предметов. Нам понадобится новый параграф «Инвентарь».
Инвентарь
***
<<if $нож gt 0>>
* [[*нож|Описания предметов {$предмет = 'нож'}]]
<<endif>>
<<if $клубок gt 0>>
* [[*клубок|Описания предметов {$предмет = 'клубок'}]]
<<endif>>
В макросах «if» мы использовали служебное слово «gt» (от англ. «greater than» — «больше чем»). Такое условие («если значение объекта больше 0») подходит и для уникальных предметов, и для множественных.
Каждый предмет в списке мы оформили как многоразовую ссылку, нажатие которой позволит посмотреть краткое описание предмета. Все описания будут содержаться в одном параграфе «Описания предметов», чтобы они выводились в одну и ту же область экрана. Нам пришлось завести ещё один объект «$предмет», которому присваиваем соответствующее значение во время перехода на параграф с описаниями.
Описания предметов
***
<<if $предмет eq 'нож'>>
Нож этот нашёлся в золе. Рукоять была деревянная, и, конечно, сгорела, но главное, клинок уцелел.
<<elseif $предмет eq 'клубок'>>
Небольшим клубком тонких шерстяных ниток василькового цвета меня на прощанье одарил дед Закром.
<<endif>>
Здесь всё просто: в зависимости от значения объекта «$предмет» выводим нужное описание. Если на какой-нибудь сцене герой может попробовать использовать предмет, будем выводить под описанием ссылки-действия.
Кроме описания предмета можно выводить ещё и соответствующее изображение. Как именно это сделать, мы узнаем в главе «Иллюстрации».
Список предметов, без сомнения, должен быть доступен на каждой сцене. Хорошо, что у нас уже есть параграф, который на каждой сцене отображается. Это параграф «Заголовок», где мы поместим добавляющую ссылку на параграф «Инвентарь».
Заголовок
@@@''~~[[+инвентарь]]~~''@@@
===''<<print $сцена>>''===
----
Теперь на любой сцене можно посмотреть список предметов. Ссылка «инвентарь» будет выровнена по правому краю и выделена жирным шрифтом. Кроме того мы использовали форматирование «нижний индекс», чтобы размер шрифта был поменьше и не отвлекал от основного текста.
Когда-то я прятал ссылку «инвентарь» в меню истории. Для этого достаточно разместить ссылку в спецпараграфе «StoryMenu». Проблема в том, что неподготовленный читатель может не сразу догадаться искать инвентарь в системном меню рядом с функциями сохранения и загрузки. Кроме того, для просмотра списка предметов потребуется выполнять два действия вместо одного, что утомляет.
Продолжение следует...Комментарии: 7.
Профиль
Закрыть
Показать все комментарии
31.12.15 15:57
Подскажите пожалуйста, почему когда в процессе игры пытаюсь вывести описание предмета, то оно появляется не дополнительно в тексте, а отдельным окном?[[*нож|Описания предметов ---— вот этот кусочек ведет к описанию ножа. но результат не тот, что ожидается(
04.01.16 12:59
Многоразовые ссылки, начиная с версии 3, открывают текст в отдельном окне.
05.01.16 09:27
А это хорошо или плохо?
Для того, чтобы оставлять комментарии, необходимо зарегистрироваться и подтвердить в профиле указанный
При использовании любых материалов блога обязательно указание ссылки на источник
Борис, вот читаю и понимаю, что это действительно добротная и нужная серия статей. Вы смогли найти в себе талант, желание и терпение, что бы написать их. А Вам не кажется, что после самой последней из публикация цикла, весь материал будет целесообразно выложить одним файлом? Что бы воспользоваться интересными статьями стало проще.P.S. По сравнению с Вашим трудом мои попытки кратких методичек выглядят жалко. Но там цель была чуть чуть иная. :(