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

Логин (e-mail)

Пароль

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

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

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

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

Ввод данных

Пожалуй, пришло время познакомить нашего героя с хозяином леса. Не важно, покружит ли герой немного по поляне, или догадается использовать нож, в любом случае читатель окажется на параграфе «Разговор с лешим». Здесь мы предоставим читателю возможность придумать герою прозвище. В ASM для ввода пользовательских данных предусмотрен специальный макрос «input» (от англ. «ввод»). Добавляем новый параграф:

Разговор с лешим

<<display 'Заголовок'>>
<<set $поляна = 10>>
<<if $диалог_леший eq 1>>
    # Обычное начало диалога
    Присаживаясь на пенёк, я уже представлял, как славно передохну, и вдруг в самый последний миг негодный пень отскочил в сторону, а я кубарем покатился на сырую землю. Вскочив на ноги, я с изумлением уставился на ожившую деревяшку, которая волчком закрутилась на месте и прямо на моих глазах обернулась долговязым косматым мужиком.
    -- Ой, умора! -- захохотал мужик, схватившись за живот. -- Видел бы ты свою ряху!
    -- Так вот кто меня битый час морочит, тропки путает! -- возмутился я.
    -- А что? Я -- леший, право моё такое. Да и потом, что-то я не припомню, как ты дозволения спрашивал <<if $ягоды gt 0>>грибы-ягоды мои потаптывать<<else>>по лесу моему погуливать<<endif>>, честных зверей-птиц попугивать.
    [[Рассмотреть лешего|Разговор с лешим {$диалог_леший = 2}]]
<<elseif $диалог_леший eq 2>>
    Тогда я ещё не знал, как подобает себя вести с лесным хозяином, и потому решил ничего не говорить, а для начала получше его рассмотреть.
    <<set $диалог_леший = 6>>
<<elseif $диалог_леший eq 3>>
    # Начало диалога, если герой решил отметить пень
    Вдруг мне в голову пришла замечательная идея: чтобы убедиться, что я не хожу кругами, надобно пень этот трухлявый как-нибудь отметить.
    -- А нацарапаю-ка я на пеньке руну какую приметную! -- радостно воскликнул я и вытащил из-за пазухи острый нож.
    -- Э! -- запротестовал пень. -- Я тебе сейчас нацарапаю! Ишь, чего удумал!
    Пенёк волчком закрутился на месте и прямо на моих глазах обернулся долговязым косматым мужиком.
    -- Что за домовые пошли, -- принялся он шуметь, размахивая своими сажонными руками, -- средь бела дня на лешего с ножом кидаются! И это в лесу! Ну-ка убери свою железку подобру-поздорову!
    Тут я и вспомнил, что всё ещё сжимаю нож в руке.
    [[Спрятать нож|Разговор с лешим {$диалог_леший = 5}]]
    [[Угрожать лешему|Разговор с лешим {$диалог_леший = 4}]]
<<elseif $диалог_леший eq 4>>
    -- А ну как не уберу? -- принялся я храбриться, перекидывая нож из руки в руку. -- Да как возьму и по-обстругаю твои листочки-веточки!
    -- Да ты никак сдурнел, домовой! -- загрохотал хозяин леса и в мгновение ока стал ростом с самые высокие деревья. -- Последний раз говорю -- бросай оружие! А не то -- до конца дней своих по лесу блуждать будешь, тропы верной не сыщешь!
    Вот что-что, а блуждать по лесу до конца дней своих мне совершенно не хотелось.
    [[Спрятать нож|Разговор с лешим {$диалог_леший = 5}]]
<<elseif $диалог_леший eq 5>>
    Я вернул нож за пазуху.
    -- Так-то лучше, -- успокоился леший и уселся на землю, а я, наконец, мог получше его рассмотреть.
    <<set $диалог_леший = 6>>
<<elseif $диалог_леший eq 7>>
    <<set $имя = $имя.charAt(0).toUpperCase() + $имя.substr(1).toLowerCase()>>
    Всяк ведает, что имя своё истинное каждому встречному-поперечному называть не след. Но леший и не спрашивал моё имя, а лишь, как меня зовут.    
    -- <<print $имя>> моё прозвище, -- сказал я, -- а в леса не по своей воле подался.
    И я поведал лешему, какая со мной приключилась печаль, и как я оказался на поляне. Тот выслушал не перебивая, и ответил:
    -- Ясно. А меня можешь называть Корян. В зернь будешь играть, <<print $имя>>?
<<endif>>
<<if $диалог_леший eq 6>>
    <<set $диалог_леший = 7>>
    <<display 'Леший'>>
    -- Ну, -- заговорил он, -- чего встал столбом? Сказывай давай, как звать-величать, и с какого-такого перепугу домовые в леса подались?
    //Назову-ка я лешему такое прозвище://
    <<input 'Разговор с лешим' $имя>>
<<endif>>

Мы должны создать объект «$диалог_леший», начальное значение которого равно 1. С первого фрагмента диалог и начнётся, если герой не воспользуется ножом. Иначе (как понятно из параграфа «Описания предметов») мы покажем читателю фрагмент диалога №3. Обе ветви диалога приведут в конечном итоге к фрагменту №6, где мы и воспользуемся макросом «input».

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

Перед макросом ввода всегда лучше ясно давать понять читателю, каких именно данных от него требует история. Мы с вами даже выделим этот поясняющий текст курсивом.

Прозвище героя мы будем хранить в объекте «$имя». Этот объект мы и передаём макросу «input». В качестве параграфа перехода укажем тот же самый параграф «Разговор с лешим», но предварительно поменяем значение объекта «$диалог_леший», чтобы по окончании ввода читатель увидел фрагмент диалога №7.

Итак, в седьмом фрагменте у нас есть прозвище героя. Как мы прекрасно знаем, имена собственные пишутся с заглавной буквы. Но вот какое дело, читатель запросто может ввести буквы в неожиданном регистре: «прозвище» (забыл про клавишу «Shift»), «пРОЗВИЩЕ» (забыл про «Caps Lock») и даже «ПрОзВиЩе» (любит клавишу «Shift»). Все эти варианты будут смотреться в тексте истории не очень красиво. Ну а мы возьмём, да и воспользуемся маленькой хитростью из статьи «Расширяем возможности макросов с помощью Javascript. Часть 1-я»:

<<set $имя = $имя.charAt(0).toUpperCase() + $имя.substr(1).toLowerCase()>>

Возьмём первый символ прозвища с индексом 0 («$имя.charAt(0)») и преобразуем его в верхний регистр («.toUpperCase()»). У нас есть первая заглавная буква. К ней мы добавим оставшуюся часть прозвища начиная со второго символа, индекс которого 1, («+ $имя.substr(1)») и приведём эту часть к нижнему регистру («.toLowerCase()»). Полученное новое значение мы присваиваем объекту «$имя». Вот и всё, теперь можно выводить прозвище героя на экран макросом «print».

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

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

Профиль


Закрыть

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

Morych
01.05.13 13:32

О, благодарю! Надо будет подумать, как сделать читабельным код в следующей части, поскольку там код будет по-сложнее. Мы перейдём на третий уровень интерактивности и будем использовать циклы.
Morych
15.11.13 10:54

Как верно подсказал Flash на форуме, перед использованием методов Javascript для строковых объектов, нужно выполнить явное преобразование объекта к строковому типу: <<set $имя = $имя + "">>

Во избежание ошибки в случае, если игрок введёт число.
Зинаида Живило
07.09.17 19:51

Тут есть нюанс, если читатель решит представиться именем и отчеством 'Иван Иванович', то отчество получится с маленькой буквы. Есть макрос, который позволяет ставить большую букву после пробела?

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

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