RU 📌 Pinned

Как сделать?

Dark[Ol(U23)leneri] #34 18.04.2010 22:57 6408 comments 2437829 views

Спасибо огромное!

Всегда рад :)

Евген:

Всегда рад

Благодарят Некса, а не тебя :)

Мне это не мешает.

Вопрос по поводу диалогов. Как лучше, удобнее и компактнее запрограммировать линейный, многократно ветвящийся диалог с повторением отдельных вариантов ответа? То есть, вот такой:
!Диалог начался
- NPC Talk

  • 1answvar
  • 2answvar

if 1answvar:
- NPC Talk

  • 3answvar
  • 4answvar
  • 2answvar end

if 2answvar:

  • 5answvar
  • 4answvar
  • 1answvar end

И так далее. Сказав сначала 2answvar, затем 5answvar, получаешь ещё несколько answvar на выбор, среди них новые и старые… То есть, при сложном диалоге, появляется куча вложенных одно в другое if … end, что плохо. Вдобавок, варианты ответов (answvar) дублируются, впустую захламляя код и утяжеляя игру.

Есть ли у кого наработки оптимально решения?

Я вообще ничего не понял

ChainSaw,
Да, наработки присутствуют ещё в обучении, “диалоги”, вот
ссылка
Суть в том, что ты задаёшь тему разговора (ну, отдельный обмен фразами положим).
Таким образом, локация у тебя будет выглядеть примерно так:

CLA
if тема = "тема1":
    *NL 'бла-бла?'
    act 'вопрос1':
         тема = "подтема1"
         gs curloc
    end
    act 'вопрос2':
         тема = "подтема2"
         gs curloc
    end
end

if тема = 'подтема1':
     *NL 'Бла-бла!'
end

Вот примерно такой принцип. Я его немного модифицировал и использую, очень удобно.

Antipod,
спасибо, попробую, как протрезвею. Но всё равно при таком способе один и тот же “вопросN” может повториться раз пять в разных “темах”. Много копий одного вопроса засоряют код. Тем более если при выборе этого “вопроса” идут дополнительные инструкции: установка переменных, изменение параметров героя и т.д. Вот и думаю, нельзя ли сократить?
Может, ежели создать $array[N], в который записать все возможные “ответы” и “бла-бла”, а потом по мере необходимости вызывать нужные строки? Тогда код станет выглядеть так:

if тема = "тема1": 
    *NL '<<$array[1]>>' 
    act '<<$array[2]>>': 
         тема = "подтема1" 
         gs curloc 
    end 
    act '<<$array[3]>>': 
         тема = "подтема2" 
         gs curloc 
    end 
end

И так далее. Будет работать?

Вот ещё вопрос: если в массив записать инструкции, можно ли их будет потом извлечь оттуда и исполнить?

ChainSaw,

ChainSaw:

Может, ежели создать $array[N], в который записать все возможные “ответы” и “бла-бла”, а потом по мере необходимости вызывать нужные строки?

Если так, то нужно будет создавать базу строк. В конце концов это приведёт к простому разбиению на 2 локации, ещё и с заморочкой вызова и передачи параметров.
В общем-то, по сути, один и тот же вопрос должен приводить к одному и тому же ответу. Ну, может реакция как-либо и может изменится, но это один-два if не больше, просто пара флажков. А вот с бла-бла подход правильный, забил все эти выраженьица в массив и случайно вызывать, и никаких иф-ов не надо.

ChainSaw:

Вот ещё вопрос: если в массив записать инструкции, можно ли их будет потом извлечь оттуда и исполнить?

Хм… Тут нужно обратиться к справке “Динамическое исполнение кода”. Сам таким не пользовался, но тут есть. Ключевое слово DYNAMIC

Aleks Versus Moderator 02.01.2012 18:42 (14 years ago)

ChainSaw, Не надо копировать один и тот же вопрос в пяти разных темах, да и базу создавать глупо, если диалог используется только один раз (для одного персонажа), просто перечисли все темы в условии вызова этого вопроса:

if тема='подтема1' or тема='подтема2' or тема='подтема3':
	act 'вопрос в подтемах':
		...
	end
end

Насколько “вместительна” строковая переменная?
Возникла мысль сделать журнал таким образом:

$journal=$journal+'
<font size=+1>Название записи</font>
Содержание записи'

Но не уверен, что весь дневник сможет влезть в переменную)

До 2гб текста. Должно влезть :)

Byte:

До 2гб текста. Должно влезть

Ну нифига себе, объёмчик))) Окей, тогда так и буду реализовывать, раз уж о размере можно не беспокоиться)

Можете пожалуйста хорошо объяснить, как создавать менюшки? В справке что-то не очень понятно написано.

Log in or Register to post comments.