А вот интересно — кто-нибудь занимался формализацией процесса создания диалога с выбором варианта из предложенного перечня фраз? Можно ли его разбить на какие-либо функциональные блоки/стадии/эпизоды?
И какие "типы" диалога могут встретится? Например, диалог может быть линейным и циклическим. Под циклическим я имею в виду ситуацию, когда игроку есть много о чём поговорить с персонажем — он выбирает из перечня какую-либо одну тему, получает ответ, после чего возвращается обратно к перечню тем (в котором уже обсуждённая тема может и отсутствовать). Вариант — расспросы об окружающем мире, о другом персонаже и т.п. С линейным всё проще — игрок двигается по руслу диалога от начала к концу, возможно через какие-либо ответвления.
На какие формальные блоки можно разбить данные типы диалогов? А может есть подходящие инструменты для работы с подобным функционалом (типа блок-схем и т.п.)?
Неактивен
Неактивен
IF topic='Вася' OR topic='работа': ACT 'Кем ты работаешь?': ... END END IF topic='работа': ACT 'А как здесь с работой?': ... END END
Неактивен
Точно так же, как я и писал выше:
#диалог $topic = $ARGS[0] IF $topic = 'прежний': 'Да милостью барина живы да сыты. Барин у нас щедрый, не то что прежний.' ELSEIF $topic = 'добраться': 'Да вот по этой дороге и беги, только на развилке держись прямо<, а то налево псарни - тебе там будут не рады.>' ELSEIF $topic = 'меняется': 'Как часто здесь меняется - не знаем, мы сами не местные. Батрачим то тут, то там по сезонам. А в этих местах впервые.' END IF $topic = '': ACT 'Эй, косари! До барина-то вашего добраться как?': $SELACT 'Здорово, котище. А ты по этой дорожке беги, только на развилке налево прими - так короче будет.' CLA ACT 'Последовать совету': GOTO 'псарни' END ACT 'Косари, а косари, как сами-то? Живы-здоровы?': $SELACT XGOTO $CURLOC, 'прежний' END END IF $topic = 'псарни': ACT 'Плохие вы путникам советы даете...': $SELACT 'Ну если путники к нам без уважения, то и нам резона нет. А дорога до замка там и вправду короче.' XGOTO $CURLOC, 'груб' END END IF $topic = 'груб': ACT 'Эх, косари! Поколотил бы я вас, да времени нет!': GOTO 'конец' END ACT 'Ну простите, если груб был. Как сами-то? Как живется, как работается?': $SELACT XGOTO $CURLOC, 'прежний' END END IF $topic = 'прежний' OR $topic = 'меняется': ACT 'А как добраться до барина вашего?': $SELACT XGOTO $CURLOC, 'добраться' END END IF $topic = 'прежний': ACT '<Прежний?> И часто у вас здесь барин меняется?': $SELACT XGOTO $CURLOC, 'меняется' END END IF $topic = 'добраться': ACT 'А из местных тут живет кто-нибудь?': $SELACT 'Ну... у леса можно встретить полоумную старуху - вот она вроде из местных.' CLA ACT 'Ок': GOTO 'конец' END END ACT 'Побегу-ка я дальше...': GOTO 'конец' END ---- #псарни 'Псарни.' ACT 'Еле унести ноги': GOTO 'диалог', 'псарни' ---- #конец 'конец' ----
Неактивен
Olegus t.Gl. написал:
описанная тобой реализация ... ну ни разу не облегчает задачу
Разве был вопрос, "как облегчить задачу"? Я думал, что был вопрос - как проще всего ее решить. Приведенное мной решение, я считаю самым простым. Сможешь проще?
Olegus t.Gl. написал:
Твоё решение ... уже выглядит путано
Кому как, я вот смотрю и не путаюсь. Сможешь проще?
Olegus t.Gl. написал:
добавление хотя бы одной ветки в эту "систему" приведёт к тому, что код придётся основательно переписывать.
Неправда.
Olegus t.Gl. написал:
как формализовать процесс описания (не написания или программирования, а именно описания) диалога, чтобы это было удобно переносить в код или библиотеку.
В общем случае - никак. Потому что диалоги, как правило, слишком разнообразны для полной формализации - придется либо писать без формализации, полностью "кодом", как я привел выше, либо сочинить очередные неуниверсальные правила поведения диалогов, и подгонять диалоги под них.
Неактивен