💾 Archived View for ostov.ml › articles › reum.gmi captured on 2023-01-29 at 02:18:38. Gemini links have been rewritten to link to archived content
-=-=-=-=-=-=-
Знаете, что самое сложное в разработке IF? Состояние.
`7MM"""Mq. `7MM"""YMM `7MMF' `7MF'`7MMM. ,MMF' MM `MM. MM `7 MM M MMMb dPMM MM ,M9 MM d MM M M YM ,M MM MMmmdM9 MMmmMM MM M M Mb M' MM MM YM. MM Y , MM M M YM.P' MM MM `Mb. MM ,M YM. ,M M `YM' MM .JMML. .JMM..JMMmmmmMMM `bmmmmd"' .JML. `' .JMML.
О да, состояние, оно же State. Вы конечно же можете и не согласиться, утвердив сюжет самой сложной частью разработки.
Однако состояние мира - это бездна, в которую очень легко провалиться.
Глазом не моргнешь, как реализация какого-нибудь предмета или глагола (и попытка впихнуть его в многочисленные связи со всеми другими предметами и действиями) отнимает непростительно много времени.
Ради адекватной работы с состоянием был создан такой наисложнейший инструмент - Inform 7.
Вдумайтесь. И ведь он только облегчит работу с состоянием, но не решит саму проблему состояния.
Интересный вопрос.
В визуальной новелле "Бесконечное Лето" ты не можешь пнуть или лизнуть каждый предмет.
Однако "Бесконечное Лето" - бриллиант отечественного игростроя.
В "Жизнь и страдания господина Бранте" всё состояние мира сводится к параметрам персонажа и открытым историям (storylets), которые будут влиять на доступность тех или иных действий.
И "Бранте" - прекраснейшая игра с крайне затягивающим сюжетом.
Читая блог Эмили Шорт я наткнулся на вот этот инструмент:
Emily Short's Interactive Storytelling: DINE
Мне понравилась концепция DINE. DINE это движок игр-книг, но в которых выбор делается не с помощью клика по ссылкам, а с помощью ввода команд (как в традиционных парсерных IF).
И в DINE нет даже намека на симуляцию мира.
К сожалению, NLP-методы для анализа команд у DINE работают не очень: игра то и дело путает команды "осмотреть кровать" с "осмотреть игрушки".
Это натолкнуло меня на создание собственного движка.
Reum - пет-проект на один вечер.
Движок разделяет действия на три категории:
И в пределах одной страницы (в других движках это может называться room или passage) не важно в какой последовательности выполняются действия. Действия пишутся так, чтобы их (с точки зрения здравого смысла) можно было сделать независимо друг от друга.
Немного по тексту из скриншота: абзац, в котором говорится, что у комнаты есть два выхода показывается только после того, как игрок (играющий в первый раз, и думающий, что игра вычисляет состояние мира) открывает сундук. Потому игрок не может не открыть сундук, перед тем как выйдет из комнаты - до открытия сундука он вообще не знает, что из комнаты есть выходы. Интересный трюк.
Но почему ввод команд, а не менюшный интерфейс? Почему новый движок, когда уже есть Twine?
Всё просто - тогда потеряется иллюзия свободы. Когда игрок вводит команды самостоятельно создается впечатление непосредственного участия.
Я не стал писать свой DSL, а просто взял YAML, идеально подходящий для моей цели.
Маленький фрагмент для примера:
--- название: Вход в подземелье описание: | Ты стоишь возле входа в подземелье. Войдешь ли ты в него или уйдешь? действия: - ?: войти =: Ты вошел в подземелье. Перед тобой стоит сундук. - ?: уйти =: Ты решил закончить приключение, так и не начав его :( +: 1 - ?: открыть( сундук)? =: | Ты открыл сундук, в нём был видавший бои меч. Ты оставил меч себе. В комнате была большая дверь на востоке. Куда ты отправишься? - ?: восток =: Ты открыл восточную дверь. ): Темница
Символы подобраны так, чтобы можно было как можно больше не переключаться на английскую раскладку.
Надеюсь я поборю свою лень, и постараюсь из чего-то *минимального* сделать что-то максимально хорошее.
Своего рода челлендж. Ну или хоть какую-нибудь историю, которую не так стыдно показать.