Перейти к контенту

[SoC] Ковыряемся в файлах


Рекомендуемые сообщения

Секция actor_dialogs я так понимаю не работает в релизе? Или диалоги всё равно надо прописывать в характер_деск? Просто хочется использовать стандартные профили НПС из оригинала, как им прописать несколько диалогов, в meet не выходит прописать больше 1 диалога в схеме, т.е. конструкция вида

meet_dialog = dialog1, dialog2

даёт доступность только dialog1.

Изменено пользователем dPlayer
Ссылка на комментарий

@dPlayer, а можешь сказать применение? Просто нужные диалоги же итак прописываются в профиль НПС.

Ссылка на комментарий
Секция actor_dialogs я так понимаю не работает в релизе?

Судя по тому, что в ф-ции init_meet(xr_meet.script) нет никаких упоминаний про actor_dialogs - таки да, не работает.

 

meet_dialog = dialog1, dialog2... даёт доступность только dialog1.

Ну так все правильно - meet_dialog устанавливает новый стартовый диалог, а он в отличии от actor-диалогов может быть только один.

Изменено пользователем UnLoaded
Ссылка на комментарий

 

 

meet_dialog устанавливает новый стартовый диалог, а он в отличии от actor-диалогов может быть только один.
По условию их может быть n-ое количество.
meet_dialog = {-esc_stalker_most_leader_dialog_start_compl} esc_stalker_most_leader_dialog_start, {+esc_stalker_most_leader_dialog_start_compl} esc_stalker_most_leader_def_dialog

Ранее был известен под ником BoBaH_671.

Ссылка на комментарий

 

 

По условию их может быть n-ое количество.

К каждому выходит какое-то условие надо, а просто так не включатся?

 

 

а можешь сказать применение?

Чтобы не плодить ненужную кучу профилей, стараюсь использовать оригинальные. Вот, например sim_stalker_general, там около шести профилей в этом классе - разное вооружение/визуалы и т.п..

Ссылка на комментарий

 

 

К каждому выходит какое-то условие надо, а просто так не включатся?

Разумеется. Если прописать через запятую три диалога без условий, то у тебя всегда будет играться первый. Можно не писать эти условия в самой секции meet, напиши в скелете диалога, чтобы он не был цикличным. Сделай в начале проверку на отсутствие инфо, которое выдашь в конце диалога. Как вариант.

  • Спасибо 1

Ранее был известен под ником BoBaH_671.

Ссылка на комментарий

 

 

К каждому выходит какое-то условие надо

Вообще-то это логично. Делает ГГ что-то, получает один диалог, не делает - другой. Ну и до бесконечности..

А ты хотел, чтобы было доступно сразу несколько диалогов без каких-либо предусловий?

  • Спасибо 1
Ссылка на комментарий

 

 

По условию их может быть n-ое количество.

Только не надо обманывать себя и других: по условиям можно прописать выбор из любого кол-ва диалогов, но при разговоре с неписем он будет только один(тот, что прошел по условиям).

Ссылка на комментарий
по условиям можно прописать выбор из любого кол-ва диалогов, но при разговоре с неписем он будет только один(тот, что прошел по условиям).

Я про это и толкую. Диалог начинает непись, всегда будет один диалог, тут все логично. Видимо, не так поняли друг друга.

 

а он в отличии от actor-диалогов может быть только один.

Сначала мне это показалось как вообще один, т.е. после него ты никаких диалогов заюзать не сможешь. :)

 


 

Вот еще пример для @dPlayer c довольно емкой структурой условий:

meet_dialog = {+mechanic_start_polter_quest -esc_mechanic_night_polters_complete} esc_mechanic_quest_polters_compl, {+esc_mechanic_repair_dialog_done -mechanic_start_polter_quest !check_night_time} esc_mechanic_quest_polters_day, {+esc_mechanic_repair_dialog_done -mechanic_start_polter_quest =check_night_time} esc_mechanic_quest_polters_night, {-esc_technic_inspect_obj_second_compl +technic_inspect_object_complete} esc_technic_inspect_obj_second, {+esc_defence_village -esc_technic_inspect_obj_third_compl +esc_technic_inspect_obj_second_compl} esc_technic_inspect_obj_third, {-esc_technic_meet_possible} esc_technic_default_no_meet_dialog, {+esc_technic_meet_possible} esc_technic_default_meet_dialog
Изменено пользователем BoBaH_671
  • Спасибо 1

Ранее был известен под ником BoBaH_671.

Ссылка на комментарий

 

 

А ты хотел, чтобы было доступно сразу несколько диалогов без каких-либо предусловий?

Конкретно сейчас нет, а в целом да, хотелось бы любое кол-во диалогов. Предусловия не важны, всё равно чаще выходит так, что без прекондишенов нужен только 1 разговор с НПС, а потом всяко появятся условия.

Ссылка на комментарий

На самом деле, довольно легко сделать действительно случайный стартовый диалог. Пишу «вслепую», поэтому извиняйте, если накосячил или вообще предложил лажу.

Где-нибудь в xr_conditions пишем такой код:

local random_dialog = nil
function get_random_dialog(actor, npc, p)
	local max_count = p and p[1] or 1

	if random_dialog == nil or random_dialog.counter >= max_count then
		random_dialog = {dialog_set = false, counter = 1}
	else
		random_dialog.counter = random_dialog.counter + 1
	end

	math.randomseed(time_global())
	if not random_dialog.dialog_set then
		random_dialog.dialog_set = random_dialog.counter == max_count or math.random(random_dialog.counter, max_count) == max_count
		return random_dialog.dialog_set
	else
		return false
	end
end 

Затем в логике пишем так (пример для трёх равнозначных диалогов):

meet_dialog = {=get_random_dialog(3)} dialog1, {=get_random_dialog(3)} dialog2, {=get_random_dialog(3)} dialog3 

Важно:

1. аргумент, передаваемый в функцию, должен быть равен общему числу диалогов;

2. функцию обязательно надо использовать в том числе для последнего диалога в цепочке, чтобы не сбился внутренний счётчик;

3. дополнительные условия (например инфопорции) при таком подходе использовать нельзя;

4. данная реализация может быть применима только к одному конкретному выбору случайного диалога. Если необходимо применить аналогичный подход в нескольких местах (с разным количеством диалогов для выбора), из переменной random_dialog надо делать массив, а в функцию передавать 2 аргумента - номер комплекта диалогов и кол-во диалогов в этом комплекте. Соответсвенно и код функции претерпит небольшие изменения.

 

При таких последовательных вызовах функция случайным образом назначит активным один из диалогов.

При повторной попытке заговорить счётчик диалогов сбросится и случайный выбор будет сделан заново.

Изменено пользователем Kirgudu
  • Нравится 2
Ссылка на комментарий

@Kirgudu, как вариант, можно ещё использовать вероятность ~. Не? :)

meet_dialog = {~30} dialog1, {~60} dialog2, {~10} dialog3 
  • Согласен 1

Ранее был известен под ником BoBaH_671.

Ссылка на комментарий

@BoBaH_671, вот понятия не имею. Но не исключено. Почему бы не проверить, если есть возможность? ;)

Если сработает (сам посмотреть не могу) - это, пожалуй, будет оптимальней, чем то, что я понаписал выше. Что ж, хотя бы поупражнялся. :D

Изменено пользователем Kirgudu
Ссылка на комментарий

@Kirgudu, сработало. Только у меня диалог после открытия практически сразу исчезает. Быть может, эта штука висит на апдейте даже во время диалога? Тогда проверка возвращает false, и диалоговое окно закрывается. Надеюсь, ты понял, что за несвязную чушь я сказал. :D

Думаю, так оно и есть. Играя в моды, сдавая квест на поиск какого-то предмета, я открывал окно диалога, продавал предмет, и диалог после закрытия торговли сбрасывался. С вероятностью так же, на апдейте висит, похоже.

Изменено пользователем BoBaH_671

Ранее был известен под ником BoBaH_671.

Ссылка на комментарий

 

 

Подскажите, как выдать поршень при поднятии предмета?

Файл bind_stalker.script, в нем ф-ция on_item_take. Она срабатывает при появлении(взятии) предмета в инвентаре ГГ. В ней добавь проверку нужного предмета, к примеру по его конфиговой секции:

local section = obj:section()
if section and section == "секция_предмета" then
     -- что то делаем
end
Ссылка на комментарий

Только у меня диалог после открытия практически сразу исчезает.

Это потому, что настройки диалога у тебя неправильные. Дело в том, что необходимость выбора того или иного диалога рассчитывается последовательно, а вероятности при расчёте не складываются. Смотри:

meet_dialog = {~30} dialog1, {~60} dialog2, {~10} dialog3
Первый диалог будет выбран с вероятностью 30% (число сравнивается со случайным числом в диапазоне от 1 до 100, если больше - сработало). 70% - вероятность, что не будет выбран.

Второй диалог будет выбран с вероятностью 60%, но относительно 70% вероятности не выбора первого диалога. Общая вероятность выбора второго диалога 0.7*0.6*100% = 42%. Отсюда 30%+42% = 72% - вероятность выбора первого или второго диалога, 28% - вероятность не выбора.

Третий диалог будет выбран с вероятностью 10%, но уже от этих оставшихся 28%. Общая вероятность выбора третьего диалога составит 0.1*0.28*100% = 2.8%. Отсюда 72%+2.8% = 74.8% - общая вероятность выбора одного из трёх диалогов.

Получается, с вероятностью 100%-74.8% = 25.2% никакой диалог не будет выбран. И даже если у тебя получилось при начале разговора попасть в «правильные» 74.8% - на апдейте, тут ты прав, происходит выбор диалога заново, с некоей вероятностью он оказывается пуст, и в таком случае в скрипте логики происходит вызов функции restore_default_start_dialog(). Возможно, именно она и закрывает диалоговое окно - движкоправы могут сказать точнее.

Чтобы условие гарантированно приводило к какому-либо диалогу, необходимо, чтобы последний диалог в цепочке от вероятности не зависел:

meet_dialog = {~30} dialog1, {~60} dialog2, dialog3
Но и тогда диалоговое окно теоретически может сбрасываться, если во время апдейта новый выбранный диалог будет отличаться от старого - для смены диалога в таком случае вызывается функция set_start_dialog(dialog). Вызывает ли эта функция аналогичное закрытие диалогового окна, мне неизвестно. Надо проверять.

 

Update: Прошу считать данный пост недействительным - причина ниже.

Изменено пользователем Kirgudu
  • Нравится 1
Ссылка на комментарий

@Kirgudu, ну ты сообразил ^_^ А сумма вероятностей должна быть = 100?

Как передать в диалог текущее значение параметра (ну например состояние оружия)?

Изменено пользователем dPlayer
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...