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

Логин (e-mail)

Пароль

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

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

Пишем интерактивную историю вместе. Часть 7-я

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

Улучшенное оформление инвентаря

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

Решим две эти проблемы, немного изменив оформление инвентаря. Теперь все предметы будут выводиться в одном предложении, через запятую. При отсутствии предметов предложение будет завершаться соответствующим образом.

Инвентарь

***
<<set $всего_предметов = 0>>
У меня с собой<<if $нож gt 0>><<display 'зпт'>>[[*нож|Описания предметов {$предмет = 'нож'}]]<<endif>><<if $клубок gt 0>><<display 'зпт'>>[[*клубок|Описания предметов {$предмет = 'клубок'}]]<<endif>><<if $всего_предметов eq 0>> ничего не было<<endif>>.

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

зпт

<<if $всего_предметов eq 0>>:<<else>>,<<endif>> <<set $всего_предметов++>>

Мы создали объект «$всего_предметов» для подсчёта количества предметов, которыми обладает герой. Перед выводом каждой ссылки увеличиваем значение этого объекта на 1. Кроме того, в параграфе «зпт» мы проверяем, сколько ссылок с предметами уже выведено. Если ни одной, выводим двоеточие. В противном случае выводим запятую. Не забываем и пробел после каждого знака препинания. Для наглядности я поставил его перед макросом «set».

Работая над историей, всегда лучше концентрироваться в первую очередь на основной сюжетной линии. А такие мелочи, как описания некоторых предметов, можно будет придумать и позже. Кроме того, добавив очередной предмет, можно просто забыть добавить соответствующее описание. Давайте немного подправим параграф «Описания предметов».

Описания предметов

***
<<if $предмет eq 'нож'>>
    Нож этот нашёлся в золе. Рукоять была деревянная, и, конечно, сгорела, но главное, клинок уцелел.
<<elseif $предмет eq 'клубок'>>
    Небольшим клубком тонких шерстяных ниток василькового цвета меня на прощанье одарил дед Закром.
<<else>>
    Просто <<print $предмет>>. Чего ж тут непонятного?

<<endif>>

Мы добавили, так сказать, описание предмета «по умолчанию». Теперь можно не отвлекаться от нашей главной задачи.

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

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

Продолжение следует...

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

Профиль


Закрыть

Показать все комментарии

Mo555
29.12.16 22:33

С запятыми, классная идея! Только у меня почему-то предметы в игре не хотят в одну строку отображаться, хотя код пишу в одну строчку. А предметы и запятые выводятся каждый раз с новой строки :( Уже и в <<nop>> пробовал код загнать, тоже не помогает :(

Повторяющийся фрагмент у меня такой:

<<if $флешка eq "флешка">><<display 'зпт'>><<print $флешка>><<endif>><<if $фонарик eq "фонарик">><<display 'зпт'>><<print $фонарик>><<endif>> ...и т.д.

Параграф "зпт" такой: <<if $штук eq 0>> <<else>>,<<endif>> <<set $штук++>>

Не пойму где ошибка :(
Mo555
29.12.16 22:34

Версия программы 5.0.2
Mo555
01.01.17 20:34

Удалось решить проблему, если кому-то это интересно :)

Попробовал вместо макроса <<display 'зпт'>> вставить напрямую содержимое самого параграфа 'зпт'. В итоге предметы в игре стали выводиться в одну строку, как и положено. Конструкция кода, правда, стала очень громоздкая, но зато работает :)

Похоже, в версии программы 5.0.2 применение в такой конструкции макроса <<display >> разрывает строку, причём даже макрос <<nop>> не может её склеить.

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

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