А вот интересно — кто-нибудь занимался формализацией процесса создания диалога с выбором варианта из предложенного перечня фраз? Можно ли его разбить на какие-либо функциональные блоки/стадии/эпизоды?
И какие "типы" диалога могут встретится? Например, диалог может быть линейным и циклическим. Под циклическим я имею в виду ситуацию, когда игроку есть много о чём поговорить с персонажем — он выбирает из перечня какую-либо одну тему, получает ответ, после чего возвращается обратно к перечню тем (в котором уже обсуждённая тема может и отсутствовать). Вариант — расспросы об окружающем мире, о другом персонаже и т.п. С линейным всё проще — игрок двигается по руслу диалога от начала к концу, возможно через какие-либо ответвления.
На какие формальные блоки можно разбить данные типы диалогов? А может есть подходящие инструменты для работы с подобным функционалом (типа блок-схем и т.п.)?
Неактивен
Неактивен
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. написал:
как формализовать процесс описания (не написания или программирования, а именно описания) диалога, чтобы это было удобно переносить в код или библиотеку.
В общем случае - никак. Потому что диалоги, как правило, слишком разнообразны для полной формализации - придется либо писать без формализации, полностью "кодом", как я привел выше, либо сочинить очередные неуниверсальные правила поведения диалогов, и подгонять диалоги под них.
Неактивен