О выразительных средствах и юзабилити.
Недавно случилось моё второе пришествие к текстовым играм и QSP в частности. В течении недели пересмотрел/переиграл много игр, как новичковых, так и сделанных явно опытными конструкторами. А заодно и сам попробовал, написал, потестил и ощутил. Набрались мысли и конкретные приёмы, которыми и хочу поделиться.
Первое, чего не стоит забывать: мы имеем дело с гипертекстом. Так что не нужно ограничиваться одной кнопкой «далее», иначе достаточно будет книжки, которую читатель просто прочтёт. Хотя бы развилка нужна или возможность выбора между сделать/не сделать.
Допустим, у нас классический QSP с его минимумом выразительных средств.
А ещё вы не умеете рисовать. Что делать? Фантазировать, искать. Мне попадались замечательные примеры, просто сделанные, но улучшающие впечатление.
Самое простое, что можно сделать:
Наступила ночь? — тёмный фон. Нет, не чёрный. Чисто чёрным бывают только непроглядные дыры или фотокомнаты.
Герой отошёл дальше от машины, в которой играет радио? — сделать музыку пропроционально тише.
Герой избыточно пользовался стимуляторами и схлопотал зависимость? — пораздражаем игрока всплывающим окошком или застопорим игру на WAIT, скрыв ненадолго действия. А при сильной ломке заменив все действия на «искать шырево» и «скорее уколоться» и так, пока не вылечится или не переждёт длительное время.
У протагониста стало плохо со зрением? — понизим контраст текста против фона (не злоупотребляйте, обычно достаточно намекнуть)
Он под глюками? — пробежимся ПарСероМ пО Тек%ту, сделав прыгающие буквы, случайную замену некоторых на непонятные символы.
Резкая боль — слегка пульсирующий красным экран (губить глаза игрока не надо, эффект помягче, но заметный).
Волнение, страх, паника, любовь? — не составляет труда найти где-то на freesound звук «сердца».
Как грамотно сказал один человек: в игре у пользователя пока нет осязания, его симулирует звук (так же нет обоняния, а в текстовых ещё и зрения). Но не только звук. Подумайте, как можно у человека вызвать нужные ассоциации быстрее всего, особенно если расписывать долго.
И конечно же текст. Его выразительность. Тут рекомендация для любых произведений общая: хотите впечатлить зрителя, впечатлитесь сами, вспомните, представьте, сделайте, включите подобающую музыку или кино, прочувствуйте, а потом выражайте.
Ещё есть такая важная штука, как темп игры. О нём часто забывают, в итоге игрок не погружается, играет несоответствующим темпом и пропускает кусками. Для задания темпа можно использовать как звук, так и просто подачу текста: регулировать объём, паузы.
Например. Перестрелка. Взрыв справа! Нужно сменить укрытие (таймер, не успел нажать — умер). Быстрая ритмичная музыка. Короткие предложения. Мелкие куски текста. Восклицания! Эпитетам не место. Понятно? Но возникает момент, когда всё начинает словно плыть, как в густом вязком желе, пуля медленно скользит, натужно дырявя воздух, и, кажется, никогда не достигнет цели. Ожидание становится томительным, а мгновение словно всё более и более растягивается, замедляясь. Кажется, что всё сейчас застынет окончательно в нелепую и уродливую скультуру грязной подворотни, с чёртовой летящей пулей, неоконченными движениями, вечно падающим убитым напарником…
Теперь о структуре игры.
Игра с десятком локаций, которые нужно все пройти, причём выполнить на них все действия — это линейная игра. И как бы она не ветвилась, меняется в ней только порядок прохождения, от которого ничего не зависит. Такой структурой вполне может обладать классический квест, но если он квест, то в нём нужны загадки хотя бы уровня «вот подсказка, найди нужный порядок трёх действий», а не просто «войти в комнату и взять» или «прочесть на листке и исполнить». Тогда это квест, а не просто чтиво с неопределённым порядком страниц.
Если от порядка выбора меняются результаты и некоторые главы обходятся — игра нелинейна. Если же это просто два пути к идентичному результату, то нелинейность отсутствует. Под результатом конечно же подразумевается и эмоциональное состояние игрока, история, которая с ним случилась. То есть финал может быть один: «мир захвачен», а методы разные (добро/зло) и впечатления тоже и это вполне нелинейно.

На схеме первые два линейны. Преждевременная смерть персонажа обычно концовкой не считается.
а вот в третьей итог зависит от пути и выпавшей точки старта:
из А без ключей можно либо достичь В, либо застрять наглухо в нижней части (переходы со стрелкой односторонние), собрав два ключа иметь шанс на концовку Г/Д, взяв только оранжевый — В/Г. Стартанув из Б не имеем шансов на концовку В. И кстати о схемах/таблицах. Делайте их. Рисуйте, чертите (редактор yEd graph editor в помощь для блок-схем). Ибо интересную логику трудно сразу охватить в голове, а каждый раз по ней мысленно пробегаться — долго и неудобно.
Дальние последствия. Очень хорошая фишка, если обставлена грамотно. Например решил напиться и вроде это ничего не решает. А через год у тебя ребёнок даун. Или сомневаешься, подать ли странному типу, рассказывающему сказки, потом жалеешь, а потом имеешь шанс случайно наткнуться на него и получить вознаграждение.
Интерфейс управления. Казалось бы всё просто: жми действия, получай результат. Но тут недоработки почти у всех почти всегда. Сразу оговорюсь, что указанное не всегда ошибка, нужно смотреть контекстно.
Ошибка №1
Давать нажать действие, результат которого лишь сообщение «вы не можете выполнить это действие» или вовсе нерабочее действие без явных признаков, что оно нерабочее.
Пример: Вхожу в магазин, вхожу на страницу покупки предмета, написано «Если вы нажмёте на покупку 2й раз, то оно не купится» — это если нужно либо совать в код, убирая действие или возможность войти на страницу покупки. Либо выдавать окошко «У вас уже есть %предмет%. Больше не нужно».
Пример 2: Действие «Найти меч». Жму. Имею два действия «Найти меч» и «Взять меч». Первое не работает. Его нужно удалять.
Ошибка 2
Весьма раздражающая штука — скачущие списки действий. То есть догадавшись делать список действий динамическим и контекстным, разработчик не догадывается следующем. Допустим 1 наименований товара в действиях (Купить N), я купил l два и они исчезли. Список сместился/дёрнулся, мне опять нужно искать глазами где третий товар, который я хотел купить. И более тяжёлый случай (который я сам же и слепил): в списке действий с возможностью и купить и продать не только убираются действия, но и добавляются. А когда 1 единица, то продал, убирается один пункт, добавляется другой, а если ещё завязка на имеющуюся сумму денег, то вообще трэш и угар. Выход: оставлять постоянный порядок пунктов, деактивируя недоступные. Как это сделано, можно по ссылке
Ошибка 3
Вместо простейшего учёта действий — переброс на новую локацию. Ничего плохого в обновлении текста или в неумении программировать нет. Но на новой локации не забудьте дописать прежние действия, если по сути мы в одной комнате.
То есть сделайте так, чтобы не нужно было жать «Назад» только ради возможности вернуть действия.
Пример: Локация Комната1. Описывает комнату, действия «Подойти к зеркалу, подойти к шкафу, подойти к кровати». Жмём «К зеркалу» и нередко получаем то самое «Отойти от зеркала» со съеданием всех остальных действий и описания локации. Мы же находимся в одной комнате? Никаких препятствий нет, чтобы сразу пойти к кровати? Так не отбирайте у игрока эту возможность, постоянно заставляя возвращаться в центр. Вы присели на кровать? Замените действие «пойти к шкафу» на «встати и пойти к шкафу», а лучше просто выдайте дополнительный кусочек текста «Вы встали с кровати и…», не трогая кнопку.
Игрок уже посетил все локальные места? Дайте ему телепорт. Во всех вменяемых играх с большим миром есть телепорты в той или иной форме (быстрое путешествие, транспорт, портал, свиток), чтобы не заставлять по сто раз ходить, например, на работу, через 10 локаций. Однако не нужно в каждой локации давать список изо всех 50, достаточно дать список базовых и только, например, дома (или на вокзале). То есть дать не список всех рыночных лотков, а просто быстрый переход на рынок, из которого доступны все лотки.
Ошибка 4. Обучение неконткестным языком. А именно если мы хотим рассказать о внутриигровой ситуации и мире, лучше сделать это от лица персонажа. Если же мы хотим сделать справку по интерфейсу игры, каким-то её особенностям — говорить лучше напрямую, не путая игрока в духе «коснись квадратика с руной А на своём пульте» вместо «нажми А на клавиатуре». Интересный вариант обучения — посещение библиотеки внутри игры. То есть тем, кому лень читать, придётся самим доходить, а прочитавшие будут знать из книг.
В качестве хорошего примера разных типов обучения хочу отметить Хранителя Старграда — про эффективное оружие против монстров узнаём в библиотеке, про броню у продавца, про систему боя — на арене с учебной тренировкой. Как ловить рыбу — исходя из логики и практики.
Недоработка:
Если игрок пользуется инвентарём регулярно, вещи многоразовые или их список больше трёх — сделайте иконки. Самые мелкие и схематичные существенно упростят распознание. Совсем лень и не умеете рисовать и предмета 4? Пометьте адекватными буллитами. Меч — серым шестиугольником. Лекарство — красным кружком или крестиком. Сигарету — серым прямоугольником (или пополамно серо-оранжевым) и для игрока всё станет проще и приятнее.
Недоработка 2:
Карта. Если в игре мы шатаемся из локации в локацию регулярно — делайте карту. Достаточно даже картинки, показываемой через View. Она может быть доступна не сразу, а после посещения ключевых узлов или обхода 80% локаций.
Для продвинутых товарищей — генерация ASCII-карты по обходу матрицы (массива), в котором или соседи считаются доступными или идёт вычисление оптимальной конструкции графа ближайших переходов.
Недоработка 3:
Отсутствие заметной индикации для важных событий. Например я что-то сделал, а в качестве индикации только сменился текст в окне дополнительного описания, причём объём текста примерно тот же. Боковым зрением можно не заметить. Очень важное и опасное для жизни — сделайте звук, явно отличающийся от фона. Не очень — явная и заметная смена дополнительного текста (было пусто, стали крупные буквы). Малозначимое или даже специально маскирующееся — небольшое изменение в тексте локации (только текст не слишком длинный, заставлять перечитывать много не стоит).
В игре Зона опасность выброса явно указывается и красным текстом и сиреной. Однажды я завозился с менюшкой и не особо смотрел на верхний экран, не будь сирены — пропустил бы. Так же хороший пример искажения карты из-за болезни или явлений.
Недоработка 4:
Неконтекстность. Начиная с «12 патроны» и заканчивая более тонким случаем, когда у противника здоровья осталось на один удар и «ударить» меняется на «добить», контекстность типа удара имеющемуся оружию: вездесущее «Атаковать» и на меч и на ружьё — халтура. Так же в процессе случайно можно выдавать «ударить, вмазать, пнуть, пырнуть, рубануть» и т.п. Программирования тут — массив слов да рэндом, а впечатление приятнее. Как вариант — сразу все действия в списке, дающие разный эффект: послабее, но поточнее или быстрое и мощное но с сильным случайным разбросом.
Пока всё, спасибо за внимание.
И ещё один момент.
Сохранение в QSP — это выбрать в меню, открыть диалог, выбрать имя файла. Когда игру не проблема пройти в один заход — достаточно. Если же игрок будет регулярно помирать, но можно начинать с чекпоинта — сделайте автосохранение на три слота. Каждый раз сохраняется в следующий слот и так по кругу. Либо возможность быстрого схрона сразу из игры в один файл, желательно из инвентаря, чтобы не мешать списку действий. Делается ведь элементарно сейчас, всё само, так что не поленитесь использовать.
пораздражаем игрока всплывающим окошком или застопорим игру на WAIT, скрыв ненадолго действия
таймер, не успел нажать — умер
Я смотрю, здесь все самые популярные новичковые грабли собраны. Прямо рубрика вредных советов.
Nex, ты сам сейчас вырываешь из контекста и это твои грабли :)
Это долгий опыт в играх.
Раздражать предлагаю только когда это действительно должно раздражать. Наркотическая ломка — не заноза в пальчике.
Возьмём в пример фоллаут 2. Там сообщение о зависимости или облучении шли в лог. Мне (и не только) было на них абсолютно плевать, пока они не начинали спамить так, что сдвигали важные сообщения, то есть уже мешали. Или пока облучение не снижало резко статы. Опять же степень раздражения нужно адекватно соразмерять с тем, насколько быстро игрок в силах избавиться от воздействия. Ну то есть не выдавать окошко 50 раз, пока он пройдёт 50 локаций до больницы. Неужели к статье, где и так особо упомянута адекватность контексту, нужно разжёвывать подобные подробности?
Умереть по таймеру — только в перестрелке, где заранее предупреждён, что будет экшЫн и нужно быстро жать.
Хитрый Пряник,
я не буду спорить и разубеждать. Я давным-давно убедился, что предупреждения о граблях никогда не работают. Автор обязательно должен лично получить ими по лбу, огрести и натерпеться, чтобы понять их смысл. До этого момента, никакая логика и никакие аргументы не заставят его отказаться от своих убеждений. Поэтому, я просто сообщил информацию. Принять её ты сможешь только тогда, когда будешь готов к этому. Не раньше.
Ты прав насчёт разубеждения, проверено. Сам такой: считаю нужным предупредить.
Но наступил, проверил, всё норм. Говорю ж, нельзя ставить вопрос мол «это абсолютное зло и нельзя» или «это абсолютная няшность и можно». Просто есть баланс. Например для приёма бытового радиосигнала (музычки) неуместно отводить комнату под четырёхтонный приёмник. А вот для прослушки кого-то важного за 5 км, да чтоб с жучка размером с катушек на одежде — очень даже нужно, да и вариантов порой нет ретранслятор поближе поставить.
Никто не запрещает. Пиши, как считаешь нужным.
Хитрый Пряник, хорошая статья получилась. Прочитал и даже проникся этакой атмосферой)