• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток!
    Стартовал новый литературный конкурс от "Ордена Хранителей" - "Пираты Миртанского моря".
    Каждый может принять в нём участие и снискать славу и уважение, а в случае занятия призового места ещё и получить награду. Дерзайте
  • Дорогие друзья, год подходит к концу, и пришло время подвести его итоги и наградить достойных

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

Не стесняюсь спросить....

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Да легко:


Элементарную вещь сделать через жопу? Мож сразу Икарус?


Ваш пример диалога встречается в любой Готике чуть менее чем через раз.

instance DIA_511_SHIP(C_Info)
{
npc = KDF_511_Daron;
nr = 800;
condition = dia_511_SHIP_condition;
information = dia_511_SHIP_info;
permanent = 1; //Ставим выполнение диалога постоянным.
description = "Уважаемый Дарон, недалеко от острова на якоре стоит пиратский корабль, думаю они планируют напасть на город, нужна ваша помощь, чтоб защитить жителей.";
};


func int dia_511_SHIP_condition()
{
if((Npc_KnowsInfo(other,DIA_KIL_SHIP)) && (PRIZO25 == 1))
{
return TRUE;
};
};

func void dia_511_SHIP_info()
{
AI_Output(other,self,"DIA_511_SHIP_15_00"); //Уважаемый Дарон, недалеко от острова на якоре стоит пиратский корабль, думаю они планируют напасть на город, нужна ваша помощь, чтоб защитить жителей.
AI_Output(self,other,"DIA_511_SHIP_15_01"); //Для этого потребуется большой запас магической энергии, на покупку магических микстур мне необходимо 200 золотых.
if(Npc_HasItems(hero,ItMi_Gold) >= 200)
{
AI_Output(other,self,"DIA_511_SHIP_15_02"); //Вот деньги.
AI_Output(self,other,"DIA_511_SHIP_15_03"); //Не будем терять времени.
Npc_RemoveInvItems(hero,ItMi_Gold,200);
self.aivar[AIV_PARTYMEMBER] = TRUE;
Npc_ExchangeRoutine(self,"ship");
B_LogEntry(TOPIC_KILL7,"Надо сопровождать Дарона пока он не прочтет заклинание.");
DIA_511_SHIP.permanent = 0; //После выполнения этой ветки, диалог больше появляться не будет.
AI_StopProcessInfos(self);
};
if(Npc_HasItems(hero,ItMi_Gold) < 200)
{
AI_Output(other,self,"DIA_511_SHIP_15_04"); //У меня сейчас нет необходимой суммы денег.
AI_StopProcessInfos(self);
};
};

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

За вариант спасибо.

Т.к. диалог у меня по сути состоит из 3 частей
1 часть. бесконечно выполняется
2 часть. 1 раз
3 часть. бесконечно выполняется

Такого в готике не применялось т.к. такие диалоги не писались. И Vam таких диалогов не мог описывать (Но это так мысли..::))

Я бы это перекинул в скрипт прочтения заклинания, тогда бы точно выполнялось условия что ветка выполнена и диалог более не требуется, ибо гг может вернуться без прочтения Дароном.. а диалога уже не будет. А так по факту события как говорится.. Но это так мысли.. ::)

Дарон остаётся ждать ГГ на Маяке бесконечно (до истечения срока 24 часа) и второй способ прохождения квеста отрезается достаточно выполнить условие 200 монет заплатить Дарону.
 
Последнее редактирование:

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.816
Баллы
995
Такого в готике не применялось т.к. такие диалоги не писались. И Vam таких диалогов не мог описывать (Но это так мысли..::))
В игре есть диалоги и по сложнее, не надо на Вама пургу гнать.. *pointing*

Дарон остаётся ждать ГГ на Маяке бесконечно и второй способ прохождения квеста отрезается достаточно выполнить условие 200 монет заплатить Дарону.
То были лишь мысли, а как ты это реализуешь зависит только от тебя, способов куча, просто надо выбрать правильный..
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Т.к. диалог у меня по сути состоит из 3 частей
1 часть. бесконечно выполняется
2 часть. 1 раз
3 часть. бесконечно выполняется

Такого в готике не применялось т.к. такие диалоги не писались. И Vam таких диалогов не мог описывать (Но это так мысли..::))

Нашел за 5 минут точно такой же пример из Г1:

instance GUR_1202_CorAngar_WANNABETPL (C_INFO)
{
npc = GUR_1202_CorAngar;
condition = GUR_1202_CorAngar_WANNABETPL_Condition;
information = GUR_1202_CorAngar_WANNABETPL_Info;
important = 0;
permanent = 1;
description = "Ich mцchte Templer werden";
};

FUNC int GUR_1202_CorAngar_WANNABETPL_Condition()
{
if (CorKalom_BringMCQBalls == LOG_SUCCESS)
&& (Npc_GetTrueGuild (hero) == GIL_NOV)
{
return TRUE;
};

};
FUNC void GUR_1202_CorAngar_WANNABETPL_Info()
{
AI_Output (other, self,"GUR_1202_CorAngar_WANNABETPL_Info_15_01"); //Ich mцchte Templer werden!

if (hero.level < 10)
{
AI_Output (self, other,"GUR_1202_CorAngar_WANNABETPL_Info_08_02"); //Du bist noch nicht bereit. Wenn du erfahrener geworden bist, werde ich dich aufnehmen.
GUR_1202_CorAngar_WANNABETPL.permanent = 1;
}
else if (hero.level >= 10)
{
AI_Output (self, other,"GUR_1202_CorAngar_WANNABETPL_Info_08_03"); //Die Zeit ist gekommen, da du aufgenommen wirst.
AI_Output (self, other,"GUR_1202_CorAngar_WANNABETPL_Info_08_04"); //Du solltest eins wissen: Templer zu sein, bedeutet nicht nur gut kдmpfen zu kцnnen und das Lager zu beschьtzen. Wir sind die auserwдhlte Wache des Schlдfers. Die Hьter des Geistes.
AI_Output (self, other,"GUR_1202_CorAngar_WANNABETPL_Info_08_05"); //Wir nutzen unsere geistige und unsere kцrperliche Kraft zu gleichen Teilen. Nur ein Mann, dessen Kцrper und Geist sich in Einklang befinden, kann ein aufrechter Templer sein.
AI_Output (self, other,"GUR_1202_CorAngar_WANNABETPL_Info_08_06"); //Es freut mich, dass du es in so kurzer Zeit geschafft hast, so weit zu kommen, dass du nun bereit bist, einer der Unseren zu werden.
AI_Output (self, other,"GUR_1202_CorAngar_WANNABETPL_Info_08_07"); //Und vergiss nicht: ein konzentrierter Geist in einem gestдhlten Kцrper widersteht jeder Bedrohung.
AI_Output (self, other,"GUR_1202_CorAngar_WANNABETPL_Info_08_08"); //Gehe nun zu Gor Na Toth am Ьbungsplatz. Er wird dir deine neue Rьstung geben.
GUR_1202_CorAngar_WANNABETPL.permanent = 0;
Npc_SetTrueGuild(hero, GIL_TPL);
hero.guild = GIL_TPL;


Log_CreateTopic (GE_BecomeTemplar, LOG_NOTE);
B_LogEntry (GE_BecomeTemplar, "Heute hat mich Cor Angar zu einem Templer ernannt. Gor Na Toth soll mir meine neue Rьstung ьberreichen. Er hдlt sich normalerweise am Ьbungsplatz auf.");
Log_CreateTopic (GE_TeacherPSI, LOG_NOTE);
B_LogEntry (GE_TeacherPSI, "Cor Angar unterrichtet STДRKE, GESCHICK und den ZWEIHДNDIGEN Kampf. Diesen aber nur, wenn ich im EINHДNDIGEN Kampf gemeistert bin. Man kann ihn normalerweise auf dem Ьbungsplatz der Templer auf der zweiten Stegebene finden.");
};

};
 
Последнее редактирование:

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Нашел за 5 минут точно такой же пример из Г1:

Состоит из двух частей:
1. Бесконечная
2. 1 раз срабатывает

Теперь прошу Myxomop оформить свой пример в виде урока, как надо строить составные диалоги (простейший вариант). Вами описан был лишь простейший диалог в виде урока.

Но если будет диалог состоять из 4 частей:
1. Бесконечно
2. 1 раз
3. Бесконечно
4. 1 раз

Срабатывает только 1 диалог т.е. 2 или 4 - твой урок можно будет адаптировать.

Но тут нужно знать сколько новых переменных в Constants.d можно добавить. Вами данный факт не указан. MaGoth говорил об ограничениях в использовании новых переменных, но границы не обозначил.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.410
Благодарности
3.241
Баллы
525
GUR_1202_CorAngar_WANNABETPL.permanent = 0;

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

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.816
Баллы
995
Но если будет диалог состоять из 4 частей:
Про ветвление Ифов ничего не слышал ?! *pointing*

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

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Состоит из двух частей:
1. Бесконечная
2. 1 раз срабатывает
Вы считать не умеете? В приведенном примере столько же частей, сколько в вашей функции выше.

Теперь прошу Myxomop оформить свой пример в виде урока, как надо строить составные диалоги (простейший вариант). Вами описан был лишь простейший диалог в виде урока.
Чего там оформлять? Проставить permanent в нужных местах и будет вам счастье.

Но если будет диалог состоять из 4 частей:
1. Бесконечно
2. 1 раз
3. Бесконечно
4. 1 раз
Да хоть десять, в теле функции _Info() условия можно выставить любые.

Но тут нужно знать сколько новых переменных в Constants.d можно добавить. Вами данный факт не указан.
На ваше усмотрение... *facepalm*
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
К сожалению, делать этого нельзя, хотя скриптеры Пираний и допустили такую оплошность. После загрузки сохранения параметр permanent будет считан из инстанции диалога, то есть, вернётся к первоначальному значению. Нужно менять отдельную переменную, и проверять её в условии.

Т.е.

Код:
instance DIA_511_SHIP(C_Info)
{
npc = KDF_511_Daron;
nr = 800;
condition = dia_511_SHIP_condition;
information = dia_511_SHIP_info;
rich1();
description = "Уважаемый Дарон, недалеко от острова на якоре стоит пиратский корабль, думаю они планируют напасть на город, нужна ваша помощь, чтоб защитить жителей.";
};

Код:
func void rich1()
{
if((Npc_HasItems(hero,ItMi_Gold) >= 200) && (cash1 == 0))
{
DIA_511_SHIP.permanent = FALSE;
cash1 = 1;
};
if((Npc_HasItems(hero,ItMi_Gold) < 200) && (cash1 == 0))
{
DIA_511_SHIP.permanent = TRUE;
cash1 = 0;
};
};

Такой вариант имелся в виду?
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.816
Баллы
995

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
тебе уже 2 страницы пишут, удали это дерьмо из тела инстанции диалога.. а он опять.. *facepalm*

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

Значит параметр permanent должен задаваться отдельно от тела instance.

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

Наверное не Вами говорилось об вагоне переменных и об том, что игра может будет работать. Значит число переменных ограниченно или нет?
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
К сожалению, делать этого нельзя, хотя скриптеры Пираний и допустили такую оплошность. После загрузки сохранения параметр permanent будет считан из инстанции диалога, то есть, вернётся к первоначальному значению. Нужно менять отдельную переменную, и проверять её в условии.
Ну почему же нельзя? В Г1 такая конструкция встречается более 70 раз, для таких вариантов построения диалога иначе и не сделаешь, ну а другие условия естественно никто не отменял. При правильном подходе все отлично работает. В вашем моде таких конструкций разве нет совсем и они все не работают?

Такой вариант имелся в виду?
Нет, дополнительные условия можно сунуть вот сюда dia_511_SHIP_condition().

Значит параметр permanent должен задаваться отдельно от тела instance.
Его нельзя задавать отдельно, это часть класса instance диалога.
Ну если хотите снова нестабильной работы игры - можете попробовать.
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Ну почему же нельзя? В Г1 такая конструкция встречается более 70 раз, для таких вариантов построения диалога иначе и не сделаешь, ну а другие условия естественно никто не отменял. При правильном подходе все отлично работает. В вашем моде таких конструкций разве нет совсем и они все не работают?


Нет, дополнительные условия можно сунуть вот сюда dia_511_SHIP_condition().


Его нельзя задавать отдельно, это часть класса instance диалога.
Ну если хотите снова нестабильной работы игры - можете попробовать.

Тогда вопрос: что читается первым?

Код:
instance DIA_511_SHIP(C_Info)
{
   npc = KDF_511_Daron;
   nr = 800;
   condition = dia_511_SHIP_condition;
   information = dia_511_SHIP_info;
   permanent = FALSE;
   description = "Уважаемый Дарон, недалеко от острова на якоре стоит пиратский корабль, думаю они планируют напасть на город, нужна ваша помощь, чтоб защитить жителей.";
};

Код:
func int dia_511_SHIP_condition()
{
   if((Npc_KnowsInfo(other,DIA_KIL_SHIP)) && (Npc_HasItems(hero,ItMi_Gold) >= 200) && (PRIZO25 == 1))
   {
     return TRUE;
   };
};

Судя по коду читается сначала instance т.е. permanent уже получит значение и только после будет срабатывать condition.

Тогда вопрос:
значение DIA_511_SHIP.permanent будет ли сохранено в файл? (ведь оно у меня будет сначала в instance получать значение и после меняться в condition ровно 1 раз если ГГ имеет 200 денег)
У меня средств нет для вывода на экран данных = данные были сохранены или нет.
1. сохранение DIA_511_SHIP.permanent = FALSE после срабатывания condition т.к. значение равно FALSE
2. сохранение DIA_511_SHIP.permanent = TRUE т.к. instance прописано значение TRUE в срабатывание condition уже было и более не повторяется

Если на постоянно добавить в condition эти строки то, если денег у ГГ не будет то значение DIA_511_SHIP.permanent = TRUE будет сохранено в файл 2, в файле 1 DIA_511_SHIP.permanent = FALSE было - ошибка будет, но как она в будущем аукнется

Код:
if((Npc_HasItems(hero,ItMi_Gold) >= 200) && (cash1 == 0))
{
DIA_511_SHIP.permanent = FALSE;
cash1 = 1;
};
if((Npc_HasItems(hero,ItMi_Gold) < 200) && (cash1 == 0))
{
DIA_511_SHIP.permanent = TRUE;
cash1 = 0;

Вот так будет срабатывать или нет?

Надо увидеть секцию отвечающую за сохранение данных в файл, иначе можно теории строить до бесконечности, а толку будет 0. Итог реализация сборных диалогов под сомнением на базе Готики.

Один вариант подмена значения permanent в секции instance до его присвоения (ошибка написания скриптов) - итог ошибка в самом скриптовом языке готики для сборных диалогов.

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

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.816
Баллы
995
Наверное не Вами говорилось об вагоне переменных и об том, что игра может будет работать. Значит число переменных ограниченно или нет?
Переменная - переменной рознь.
Что касается айваров и прочих подобных переменных производных от классов и массивов движка, то они ограничены их размерностью.. у каждого массива свой размер, вот какое значение для него установлено, таким и будет число его ограничения..

Значит число переменных ограниченно или нет?
Для простых переменных число ограничено лишь одним, - количеством памяти на твоем компе..
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.410
Благодарности
3.241
Баллы
525
Ну почему же нельзя? В Г1 такая конструкция встречается более 70 раз, для таких вариантов построения диалога иначе и не сделаешь, ну а другие условия естественно никто не отменял. При правильном подходе все отлично работает. В вашем моде таких конструкций разве нет совсем и они все не работают?

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

В мод-фиксе тоже можно найти такую конструкцию. Но там это уже - рудименты. Пока руки не дошли выпилить их.

Такой вариант имелся в виду?

В инстанции диалога ставишь permanent = TRUE. В инфо-функции диалога изменяешь значение переменной, которую заранее нужно объявить, как глобальную переменную. В кондишн-функции диалога проверяешь, не изменилось ли значение переменной. Если переменная изменила своё первоначальное значение, то функция должна возвращать FALSE (0). Таким образом, условие будет проверяться каждый раз, но диалог перестанет появляться после определённого события. В игре таких примеров полно.
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
В инстанции диалога ставишь permanent = TRUE. В инфо-функции диалога изменяешь значение переменной, которую заранее нужно объявить, как глобальную переменную. В кондишн-функции диалога проверяешь, не изменилось ли значение переменной. Если переменная изменила своё первоначальное значение, то функция должна возвращать FALSE (0). Таким образом, условие будет проверяться каждый раз, но диалог перестанет появляться после определённого события. В игре таких примеров полно.

cash1 = 1; изначально объявим

instance DIA_511_SHIP(C_Info)
{
npc = KDF_511_Daron;
nr = 800;
condition = dia_511_SHIP_condition;
information = dia_511_SHIP_info;
permanent = 1;
description = "Уважаемый Дарон, недалеко от острова на якоре стоит пиратский корабль, думаю они планируют напасть на город, нужна ваша помощь, чтоб защитить жителей.";
};

Код:
func int dia_511_SHIP_condition()
{
rich1();
if((Npc_HasItems(hero,ItMi_Gold) >= 200) && (cashpermanent1 == 0))
{
DIA_511_SHIP.permanent = 0;
cash1 = 0;
cashpermanent1 = 1;
};
if((Npc_HasItems(hero,ItMi_Gold) < 200) && (cashpermanent1 == 0))
{
DIA_511_SHIP.permanent = 1;
};
if((Npc_KnowsInfo(other,DIA_KIL_SHIP)) && (PRIZO25 == 1))
{
return TRUE;
};
};

Код:
func void rich1()
{
if(DIA_511_SHIP.permanent > cash1))
{
DIA_511_SHIP.permanent = cash1;
};
};

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

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Да, встречается. В ряде случаев сами Пираньи поправили ситуацию, дополнив условия диалогов. В остальных случаях такой финт приводит к описанному глюку.
Да действительно, в примере из Г1 что выкладывал выше, имеется дополнительное условие проверки гильдии, которая изменяется в диалоге. (выделил его синим цветом). После изменения гильдии диалог по этому условию больше не появится.

Очень громоздкая структура, чтобы избежать попадания изменяемых данных в файл сохранения.
Ну а зачем городить?
Выбросите rich1()
Достаточно одной переменной. См. пример дополнительного условия из Г1 выше выделенного синим цветом. Вместо гильдии ставите свою глобальную переменную.
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Ну а зачем городить?
Выбросите rich1()
Достаточно одной переменной. См. пример дополнительного условия из Г1 выше выделенного синим цветом. Вместо гильдии ставите свою глобальную переменную.

Число новых глобальных переменных какое может быть?
Для каждого квеста новая глобальная переменная нужна - если твоим способом следовать.
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Число новых глобальных переменных какое может быть?
Для простых переменных число ограничено лишь одним, - количеством памяти на твоем компе..

Для каждого квеста новая глобальная переменная нужна - если твоим способом следовать.
cash1 = 1; изначально объявим
- а это разве не глобальная переменная? Только использовать нужно по уму.
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Для простых переменных число ограничено лишь одним, - количеством памяти на твоем компе..

Про глобальные слова не было сказано.
Значит число глобальных переменных - нужно назвать (Max значение).
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Про глобальные слова не было сказано.
Ну если просто: Глобальная - снаружи функции, локальная - внутри. Любая из переменных может быть простой, не входящий в какой либо класс. Мы об этом говорили в теме пару месяцев назад, когда константы от переменных учились отличать.
 
Сверху Снизу