↓
 ↑
Регистрация
Имя/email

Пароль

 
Вход при помощи VK ID
временно не работает,
как войти читайте здесь!
Odio inventar nombres
2 ноября в 12:42
Aa Aa
#вопрос
#визуальные_новеллы #вн

Появился вопрос по проектированию визуальных новелл, но этот вопрос скорее не к писателям, а к инженерам или даже математикам. Если кто-то удивлён, то попробуйте прочитать постановку задачи. Вдруг заинтересуетесь? Такая вот занятная штука, эти визуальные новеллы.

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

Для примера рассмотрим простейшую ВН, где главный герой кун выбирает одну из двух тян. Самый примитивный случай — это тупо предложить читателю выбор в духе:
Я выбираю:
1. A-chan
2. B-chan
После выбора из этого меню дать прочитать соответствующий вариант сюжета.

Очевидно, что такой примитивный способ выбора не содержит никакой интриги — получится максимально унылое говно, какое только можно представить. Намного менее унылым будет следующий подход. Надо предусмотреть нечётное количество выборов с двумя вариантами ответов. Каждый такой ответ ведёт к небольшим отличиям в тексте, после чего сюжет возвращается к общей линии (это важно, чтобы не было десятков и сотен вариантов сюжета). Но при этом, в зависимости от выбранного варианта увеличивается один из счётчиков, AChan_count или BChan_count. Поскольку таких выборов нечётное количество, то в итоге AChan_count никогда не будет равен BChan_count. И вот потом общий сюжет идёт до драматической развилки, где кун задаётся вопросом, кого же ему выбрать. Долго и драматично думает и уже без участия читателя выбирает ту тян, у которой счётчик больше — предпочитал её в тех вариантах выбора, значит она ему больше нравится, после чего сюжет сворачивает на одну из концовок.

А вот теперь этот подход надо обобщить.

Во-первых, у нас может быть не две концовки, а больше. Например:

1. A-chan
2. B-chan
3. C-chan
4. D-chan
5. Bad end (так и не смог выбрать и остался ни с чем)
6. True end (сознательно решил, что «нафиг эти тян, поищу другую»).

Во-вторых, предлагая читателю сделать выбор, мы можем давать больше двух вариантов ответов.

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

И вот как обобщить предыдущее правило? С двумя концовками и двумя вариантами ответов было просто — нечётное количество выборов. А здесь как подойти к проектированию, чтобы можно было выходить на все концовки, причём каким-то управляемым способом? А не так, что почти все варианты ведут к одной концовке, а на некоторые вообще выйти нельзя и надо всё переписывать. Вроде для подсчёта путей должен получиться граф или какая-то ещё комбинаторная конструкция. Но у меня ступор — я никак не могу сообразить, как формализовать эту задачу.
2 ноября в 12:42
1 комментариев из 7
Если временно оставить чисто математический анализ задачи, поскольку я даже не представляю, как к нему подступиться...

Насчёт практического подхода сейчас подумал следующее.

Мы немного расширяем идею переменных AChan_count и BChan_count из примера в посте. Теперь это будет не счётчик, а скажем, репутация у A-chan и B-chan. Или склонность к какой-то концовке в более общем смысле, ведь концовка может вообще не быть связана с персонажем. Ну, пусть будет у переменных префикс Rep.

Итак, на старте мы имеем что-то вроде

Rep_AChan = 0
Rep_BChan = 0
Rep_CChan = 0
Rep_DChan = 0
Rep_TrueEnd = 0

Эти переменные делаем с плавающей точкой, меняем их все при любом выборе, причём значения приращений делаем не идеально равными, что-то вроде

«Выбор ответа, понравившегося A-chan, B-chan, безразличного C-chan, не понравившегося D-chan и не ведущего к True End»:

Rep_AChan += 2.5
Rep_BChan += 2.49999
# Rep_CChan += 0
Rep_DChan -= 2.2
Rep_TrueEnd -= 2.19999

Перед финальным поворотом сюжета надо просто выбрать максимум. При вот таких отличиях, вроде 2.5 и 2.49999 ничья будет достаточно маловероятна, чтобы её можно было проигнорировать. Потом максимум надо сравнить с некоторым пороговым значением, которое можно посчитать исходя из суммарных значений этих приращений по разным путям (просто забить их в простую программу на C в массив и посчитать все пути тупо перебором). Вариант: пороговое значение может зависеть от концовки. Если максимум превышает порог — выбираем концовку. Иначе — jump bad_end.

В принципе, народ что-то подобное и делает. Чтобы не мудрить с ничьей, добавил вот эти мелкие отличия в приращениях. Их даже можно обосновать сюжетно — ведь не может же быть, чтобы два персонажа реагировали полностью одинаково.

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

Но с теоретическим анализом всё же было бы интересно разобраться. Увы, мне пока даже в голову не приходит, как формализовать такую модель.
Показать полностью
ПОИСК
ФАНФИКОВ











Закрыть
Закрыть
Закрыть