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

Логин (e-mail)

Пароль

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

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

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

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

Инициализация объектов

Как мы уже знаем, объекты в ASM являются глобальными, то есть мы можем работать с одним и тем же объектом во всех параграфах. И может так случиться, что по недосмотру мы станем проверять значение объекта до того, как зададим его макросом «set». В этом случае значение будет равно «undefined» (от англ. «не определён»). Теперь представьте, что мы забыли установить значение объекта «$селение» в начале истории, и читатель впервые перешёл на параграф «Старое селение». Он увидит описание, следующее за «else». А ведь это совсем не то, что мы задумали.

Чтобы избежать возможных ошибок с неопределённым значением объектов, возьмём себе за правило устанавливать начальные значения всех объектов в служебном параграфе, который будем вызывать в начале истории. Пусть этот новый служебный параграф называется «Создание объектов».

Создание объектов

# Заголовок текущей сцены
<<set $сцена = ''>>
# Номер описания сцены «Старое селение»
<<set $селение = 1>>

Объектов у нас пока всего два, их мы и перечислим в макросах «set». А перед каждым макросом оставим комментарий, чтобы не забыть, для чего нам объект нужен. Эти пояснения видны только в режиме редактирования, на экран в готовой истории они не выводятся. Первым символом в строке комментария всегда идёт «#».

Не забудем вызвать параграф инициализации объектов в параграфе «Вступление» при помощи макроса «display».

Вступление

===''Кто в доме хозяин''===
----
<<display 'Создание объектов'>>
Давным-давно это случилось, о чём поведаю. Зим с тех пор минуло уж столько, что и не счесть. Однако же то утро я как сейчас помню. Красно солнышко только-только проснулось и, умывшись росой, степенно восходило на небо, обещая пригожий и ясный день. Я же сидел себе на завалинке и горько плакал. А как тут не плакать, коль у меня больше не было дома?! Именно: вчера вечером был, да такой, что всем прочим домам на посрамление, а сегодня -- лишь чёрные угли да зола. Словом, стал я теперь бездомный домовой.
[[Осмотреться|Сгоревший дом]]

В параграфе «Создание объектов» будут только макросы «set» и комментарии, поэтому ничего лишнего во вступлении на экран выведено не будет.

Второстепенный персонаж

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

Как только у нас появляется некоторый текст, который планируется выводить в разных параграфах или в одном параграфе, но разными методами, такой текст нужно сразу оформлять в отдельный параграф. Это сэкономит нам массу времени в дальнейшем, когда придётся этот текст править. Кроме этого, используя отдельный параграф вместо копирования одинакового текста в разные места, мы можем значительно уменьшить «вес» истории (тот, который измеряется в килобайтах). Сделаем такой параграф для описания нашего второстепенного персонажа.

Дед Закром

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

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

Дом старейшины

<<set $сцена = 'Дом старейшины'>>
<<display 'Заголовок'>>
<<if $дом_деда eq 1>>
    Изба деда Закрома, в которой жил ещё и старейшина селения с роднёй, была велика и на диво хороша! Одних сундуков здесь стояла целая дюжина, а то и две. И ведь в каждом сундуке добра всевозможного -- видимо-невидимо!
    -- Явился, не запылился! -- вдруг проскрипел ворчливый голос.
    Обернувшись на звук, я тот час же увидал, как напротив печи, на широкой лавке чинно восседает дед Закром.
    <<display 'Дед Закром'>>
    <<set $дом_деда = 2>>
<<else>>
    Вновь переступив порог дома старейшины, я тот час приметил [[+деда Закрома|Дед Закром]], который увлечённо пересчитывал добро в самом большом сундуке. Увидав меня, он сразу же захлопнул крышку и уселся на неё верхом.
<<endif>>
[[Поговорить с дедом Закромом|Разговор с дедом]]
[[Выйти за порог|Старое селение]]

У нас появился новый объект «$дом_деда», который отвечает за номер описания сцены «Дом старейшины». Добавим этот объект в параграф «Создание объектов» и установим начальное значение в 1, чтобы при первом посещении сцены отображалось первое описание. А описаний сцены в этот раз всего два, причём второе описание будет отображаться как при втором посещении, так и при всех последующих, т. к. значение объекта «$дом_деда» изменяется на 2 только однажды, при первом посещении.

Что касается описания второстепенного персонажа, то при первом посещении мы выводим его макросом «display». При последующих посещениях для вывода описания предусмотрена добавляющая ссылка. Только вот беда, мы договорились, что текст по добавляющим ссылкам будет выводиться после разделителя «звёздочки», а при первом посещении эти звёздочки нам ни к чему. Воспользуемся всё теми же условными операторами и немного подправим параграф с описанием персонажа.

Дед Закром

<<if $дом_деда neq 1>>
    ***
<<endif>>

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

В макросе «if» мы использовали служебное слово «neq» (от англ. «not equals» — «не равно»). Таким образом, мы будем выводить звёздочки, только если значение объекта «$дом_деда» не равно 1 (т. е. при повторных посещениях).

Наш дед Закром получается очень простым персонажем. Он всегда сидит на одном месте, и с ним можно только поговорить. Что ж, для первого персонажа пусть он таким простым и остаётся. Других персонажей постараемся делать посложнее. История становится более интересной, когда второстепенные персонажи умеют перемещаться по сценам, совершать какие-то действия, иными словами, когда они живут своей жизнью.

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

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

Профиль


Закрыть
Кельта
16.04.13 21:01

Классная серия статей. Кстати, в следующем параграфе знакомая идея. Я во всех программах и играх так делаю.

"Чтобы избежать возможных ошибок с неопределённым значением объектов, возьмём себе за правило устанавливать начальные значения всех объектов в служебном параграфе, который будем вызывать в начале истории. Пусть этот новый служебный параграф называется «Создание объектов»."

А в попытке методичке, которая на форуме выложена на первой странице:

"Первое, даже если это не требует используемая среда, пропишите шапку программы/игры. В шапке укажите все переменные, которые вы собираетесь использовать и присвойте им начальные значения (например А:=0). Благодаря этому простому действию исключается целый класс ошибок с неопределенными переменными и ошибок, связанных с неожиданными значениями по умолчанию (например, автоматически неопределенным переменным присваивается 1 или 0). "
Morych
17.04.13 11:50

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

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

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