Как я IF на Twine писал

Привет Хабр! Это мой первый пост, и я хотел бы поделиться опытом создания IF-игры на Twine. Рассказать о преимуществах и недостатках инструмента, которые заметил во время работы, ну и немного о самой игре.

image

Началось все пять месяцев назад, когда мне предложили сделать IF-игру.

IF-игры – это игры, в которых взаимодействие с игроком происходит с помощью текстовой информации. Есть 2 варианта взаимодействия: ввод текста или выбор из уже предложенных вариантов.

В качестве примера была выбрана игра Dictator, т.к. она была похожа на то, что планировалось реализовать. Dictator – это компьютерная игра в жанре политический симулятор, разработанная Доном Пристли и выпущенная для компьютера ZX Spectrum, а впоследствии была портирована под разные платформы.

Главный герой, правитель банановой страны, пытается удержать власть всеми силами. Геймплей довольно прост. Диктатор, то есть игрок, должен выбрать один из предложенных вариантов действий. Задача – продержаться на посту главы государства как можно дольше.

Для разработки игры я выбрал Twine. На просторах интернета можно найти и похожие инструменты, но потыкав пару вариантов, решил остановиться на Twine, т.к. он больше приглянулся по интерфейсу и был бесплатным.

Немного о реализации


Игра называется Political games. В начале каждого месяца одна из политических фракций задает вопрос, а игрок должен выбрать действие, которое, возможно, улучшит ситуацию. Например, продать землю, или купить вертолет, чтобы в случае провала свалить из этого богом забытого места.

Создание игры сводится к написанию html в параграфах: каждый параграф – отдельная страница, которую в дальнейшем можно стилизовать. Как разработчик я могу выбрать, с какого именно параграфа будет начинаться история. Я добавил 2 параграфа: один для размещения переменных, которые будут отвечать за очки и счетчик месяцев, а второй для списка вопросов. И потом использовал display этих двух параграфов в начальном. Переходы между параграфами осуществляются с помощью ссылок. Далее в параграфах реализуется разметка того, как будет выглядеть страница.

В итоге, получилось примерно вот такое дерево:

image

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

О Twine


Twine — открытая платформа для написания интерактивной литературы, текстовых игр и визуальных новелл. Позволяет публиковать игры в виде html страниц и не требует от автора глубоких познаний в программировании.

Можно работать с ним как в онлайн-версии, так и скачать софтину себе на компьютер.

Большим плюсом онлайн-версии является то, что после изменения и нажатия на кнопку «Play» уже открытая вкладка с историей перезагрузится. В десктопной же после нескольких десятков изменений и запуска истории появляется 100500 вкладок.

В Twine есть несколько движков, или как это называется в Twine, форматов игры.

image

В каждом формате игры есть различия в плане синтаксиса, а также в различиях в плане функционала. Для каждого из них есть дока, а также можно найти исходный код на github. Самым оптимальным мне показался SugarCube 2. В нем и синтаксис удобный, и дебаг неплохой.

Проект можно как экспортировать, так и импортировать. Но, если вдруг захочется изменить файл в редакторе, а потом обратно импортировать, эти изменения не сохранятся, т.к. Twine при запуске игры пересоберёт файл заново, и все добавленное просто удалится. Это создает небольшое неудобство, в случаях, когда надо добавить метаинформацию, favicon или же сторонние css и js файлы. В таком случае приходится добавлять их через JavaScript. Действие-то простое, но лучше бы было простое добавление тега в секцию head.

Еще одна из проблем в Twine — отсутствие автокомплита, поэтому всю разметку, названия свойств нужно прописывать руками. И это в то время, когда во всех редакторах кода он присутствует!

Итог


Twine хорошо подходит для создания небольших проектов или прототипов. Можно быстренько запилить IF-игрушку. Лично мне хватило этого инструмента, за исключением некоторых минусов.

Из минусов технологии:

  • Есть проблемы с десктопной версией
  • Нет автокомплита
  • Не удобно работать с head секцией, приходится делать через js
  • Нет live-reloading, поэтому во время разработки приходится постоянно перезапускать игру, нажимая на кнопку «Play»

Плюсы:

  • Бесплатный инструмент
  • Понятный и простой
  • Есть достаточно возможностей сделать что-то интересное

Если кто-то хочет попробовать себя в роли диктатора, вытащить страну из бедности на небывалые высоты или, наоборот, ввергнуть ее в пучину гражданской войны, то милости прошу. Буду рад конструктивной критике.

UPD


Snuux в комментариях скинул примеры компиляторов Twine с live reload.

Комментарии 13

    +5
    Привет, я писал на Twine игру, «Лорды проклятых земель» (в Стиме).

    Проблемы с live reload можно решить, открывая в браузере исходный html истории. Они все лежат в папках вида
    C:\Users\UserName\Documents\Twine\Stories

    Открываешь .html оттуда в браузере — и F5, когда добавляешь узел.

    В целом согласен, для небольших проектов годится. На сотнях узлов — нет, начинает тормозить и глючить. У меня было 900 узлов, тормозить начало на 500. Это происходит из-за того, что чуваки плохо сделали оптимизацию, навернули фронтендового программирования, не понимая всех последствий (на каждое нажатие клавиши — куча коллбэков, один из которых меняет className всего body документа, что приводит к перерисовке, что проявляется в тормозах, когда узлов становится очень много).

    Хорошо, я понимал, что происходит, просто скачал исходники, разобрался и хакнул, отрубив тормоза. Так сумел закончить игру.

    Но денег в IF на ПК нет, так что пришлось вернуться в программисты )

      0
      Cейчас попробовал поставить Twine на комп, и это не прокатило. Он же вроде пересобирает при каждом старте, и пока не нажмешь на Play, изменения не сохраняются. Либо я что-то не так делаю. Энивэй под live reload я подразумевал типа того же webpack с dev server`ом )
      А вот кстати интересно, как вы портировали игру в стим?
        0
        Ой простите, а это был вопрос? А то я подумал что первый комментарий это краткое содержание статьи.
          0
          Он должен автоматически сохранять историю при каждом закрытии редактора узла.

          Я уже несколько месяцев не писал на официальной версии, но раньше там был autosave.

          И да, его исходники в userdocuments/Twine/Stories/ — практически ничем не отличаются от экспортированных файлов.
            0
            Блин, один фиг не робит. Но все-равное это не совсем то live reload который нужет )
              0
              Надо будет проверить, может, я упустил какую-то деталь.
            +2
            // как портировали игру в стим?

            Завернул в Electron.js

            можно начать с github.com/Kvisaz/electron-iframe-dock — там подготовленный исходник, чтобы бросать в папку готовую игру и компилить. Потом можно доработать electron-часть под свои желания.

              0
              Круть! Спасибо большое, буду тестить.
                0
                по поводу npm — сначала надо установить node.js в системе
                пишу на всякий случай, мало ли кто может читать дискуссию, а инструкция в репозитории это не описывает, так как рассчитана на кодеров
          0
          Присоединяюсь к вопросу о портировании в стим
            0
            через electron.js
            +1
            Ребят, используйте github.com/tmedwards/tweego или github.com/videlais/extwee. Это компилируемый твайн. В вашей IDE можно настроить live-reload, можно удобно разбить игру на файлы и пр.

            А ещё заходите сюда discord.gg/VtrmjdgM7A. Это официальный дискорд твайна. Куча информации, ресурсов, и пр. Много людей которые шарят и помогут по коду.
              +1
              судя по описанию, это компиляторы исходного кода Twee
              да, это удобно, если привык кодировать

              а есть ли там инструмент визуального наблюдения за всеми узлами, как в Twine

              image

              Мне лично был интересен этот инструмент. Я программист, пишу на Java/JavaScript. Просто писать на Twee для себя не вижу смысла — все эти IF-движки в своей основе гипертекст с исполняемыми скриптами, что можно легко реализовать на HTML\JavaScript.

              Собственно я и для Twine написал прежде всего свой формат со своими возможностями, потому что зачем мне учить twee, если он все равно меньше по возможностям, чем HTML\JavaScript.

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое