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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!

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

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.636
Баллы
625
Расширитель это не есть исходный код. Мне более ближе когда я вижу как исходный код работает, а не гадай верно ли отработал исходный код и верные данные расширителю передал::)Много "если" не мой выбор*flowers*
значит у тебя нулевые познания в отладке. мне почему-то не нужны сорсы движка, чтобы отслеживать и устранять косяки программы.
 

ElderGamer


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

По дверям если правильно помню, то там актуальное состояние в сейвы не заносилось и при перезагрузке игры, то что было открыто/закрыто, всегда возвращалось в исходное состояние.. Тут скорее всего и спейсер ковырять и двиг и сейвы..
Возможно, тут работает ещё одно соображение. Для неписи тоже не запоминается состояние взаимодействия с объектом. Сохранёнка может быть сделана во время взаимодействия. Если запоминать состояние объекта, то нужно запоминать и состояние непися.

Открывание дверей NPC есть, а вот закрывания нет - исправить бы.
Это не уровень движка. Это уровень скриптов и правильной организации игрового мира. Если ты не в курсе, то неписи открывают двери, повинуясь функциям ИИ, а не движку. Смотри функцию B_MoveMob. Думаю, с помощью добавления фрипоинтов к каждой двери и организации специального состояния, можно решить проблему "забывчивости" неписей. Возможно, проблему можно решить и более просто. ;)
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.636
Баллы
625
Это не уровень движка. Это уровень скриптов и правильной организации игрового мира. Если ты не в курсе, то неписи открывают двери, повинуясь функциям ИИ, а не движку. Смотри функцию B_MoveMob. Думаю, с помощью добавления фрипоинтов к каждой двери и организации специального состояния, можно решить проблему "забывчивости" неписей. Возможно, проблему можно решить и более просто. ;)

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

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

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
Смотрю сейчас видеопрохождение НМ. Там организованы диалоги с двумя и более собеседниками. Без расширителей, как я понимаю. Только субтитры левых собеседников идут красным.
В НМ ничего подобного нет, триалог подразумевает действие ведение диалога с тремя и более НПС сразу.
Если только его на Икарус не перетащили за это время, но такого я не помню.. ::)

Только субтитры левых собеседников идут красным.
Это стандартные фразы Непесей со стороны..

Пример реализации Триалога:
Ein Dialog sagt mehr als tausend Worte. Naja, in diesem Falle sind es nur ungefähr 45, aber ein Beispieldialog ist sicher sinnvoller als die Funktionen einzeln zu erläutern.

Folgendes Gespräch wird über die Trialoge gelöst:
  1. Arto: Tut mir leid Held, aber hier darfst du nicht passieren
  2. Held: Warum nicht?
  3. Horka: Die Stadt wurde verriegelt
  4. Held: Ich habe ein wenig Gold dabei, kommen wir damit ins Geschäft?
  5. Squelto: Nein. Wir sind nicht bestechlich.
  6. Held: Sicher?
  7. Arto: Ich muss dich nun bitten zu gehen
  8. Held: Nun gut...
instance TRIA_Test (C_INFO)
{
npc = PAL_100_Friend;
nr = 10;
condition = TRIA_Test_condition;
information = TRIA_Test_info;
important = FALSE;
permanent = 1;
description = "TRIALOGTEST";
};

func int TRIA_Test_condition()
{
return TRUE;
};

func void TRIA_Test_info()
{
var c_npc Arto; Arto = Hlp_GetNpc(PAL_100_Friend); // Ihm gehört der Dialog
var c_npc Horka; Horka = Hlp_GetNpc(PAL_101_Horka);
var c_npc Squelto; Squelto = Hlp_GetNpc(PAL_102_Squelto);

TRIA_Invite(Horka); // Lade Horka in diesen Dialog ein
TRIA_Invite(Squelto); // Lade Squelto in diesen Dialog ein
TRIA_Start(); // Starte das Gespräch
// Der Held und Arto müssen/dürfen nicht eingeladen werden. Sie sind sowieso im Dialog.

// Held redet nun mit Arto (self = Arto, other = Hero)
TRIA_Next(Arto);

DIAG_Reset();

AI_Output (self, other, "TRIA_TEST_00"); //Tut mir leid Held, aber hier darfst du nicht passieren

// Held redet nun mit Horka (self = Horka, other = Hero)
TRIA_Next(Horka);

AI_Output (other, self, "TRIA_TEST_01"); //Warum nicht?

AI_GotoNpc(self, other);
AI_TurnToNpc(other, self);

AI_Output (self, other, "TRIA_TEST_02"); //Die Stadt wurde verriegelt

// Held soll sich während des nächsten Satzes verschwörerisch umsehen
DIAG("Nervous", 1, 2);

AI_Output (other, self, "TRIA_TEST_03"); //Ich habe ein wenig Gold dabei, kommen wir damit ins Geschäft?

// Held soll sich jetzt wieder normal bewegen
DIAG_Reset();

// Starte Kamerafahrt
TRIA_Cam("CAMERASTART");

// Held redet nun mit Squelto (self = Squelto, other = Hero)
TRIA_Next(Squelto);

AI_TurnToNpc(other, self);

DIAG("No", 0, 1);
AI_Output (self, other, "TRIA_TEST_04"); //Nein. Wir sind nicht bestechlich.

// Held redet nun wieder mit Arto (self = Arto, other = Hero)
TRIA_Next(Arto);

// Held soll sich jetzt fragend Artikulieren
DIAG("NotSure", 0, 1);

AI_Output (other, self, "TRIA_TEST_05"); //Sicher?

AI_TurnToNpc(other, self);

// Kamerafahrt Ende
TRIA_Cam("");

// Arto soll zornig reagieren
DIAG("Angry", 0, 4);

AI_Output (self, other, "TRIA_TEST_06"); //Ich muss dich nun bitten zu gehen

// Held soll sich jetzt wieder normal bewegen
DIAG_Reset();

AI_Output (other, self, "TRIA_TEST_07"); //Nun gut...

TRIA_Finish(); // und Ende
};

Подробнее тут:
http://lego.worldofplayers.de/?
 
Последнее редактирование:

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
А вот Триалог интересно было бы увидеть рабочий пример, мне пришлось мучаться с одним диалогом - реализовывать через обычный диалог.

Народ Миненталя. Например, разговор Гуго с Гуннаром и Айнаром.
 

MaGoth

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

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Пример реализации Триалога:
Ein Dialog sagt mehr als tausend Worte. Naja, in diesem Falle sind es nur ungefähr 45, aber ein Beispieldialog ist sicher sinnvoller als die Funktionen einzeln zu erläutern.

Folgendes Gespräch wird über die Trialoge gelöst:
  1. Arto: Tut mir leid Held, aber hier darfst du nicht passieren
  2. Held: Warum nicht?
  3. Horka: Die Stadt wurde verriegelt
  4. Held: Ich habe ein wenig Gold dabei, kommen wir damit ins Geschäft?
  5. Squelto: Nein. Wir sind nicht bestechlich.
  6. Held: Sicher?
  7. Arto: Ich muss dich nun bitten zu gehen
  8. Held: Nun gut...
instance TRIA_Test (C_INFO)
{
npc = PAL_100_Friend;
nr = 10;
condition = TRIA_Test_condition;
information = TRIA_Test_info;
important = FALSE;
permanent = 1;
description = "TRIALOGTEST";
};

func int TRIA_Test_condition()
{
return TRUE;
};

func void TRIA_Test_info()
{
var c_npc Arto; Arto = Hlp_GetNpc(PAL_100_Friend); // Ihm gehört der Dialog
var c_npc Horka; Horka = Hlp_GetNpc(PAL_101_Horka);
var c_npc Squelto; Squelto = Hlp_GetNpc(PAL_102_Squelto);

TRIA_Invite(Horka); // Lade Horka in diesen Dialog ein
TRIA_Invite(Squelto); // Lade Squelto in diesen Dialog ein
TRIA_Start(); // Starte das Gespräch
// Der Held und Arto müssen/dürfen nicht eingeladen werden. Sie sind sowieso im Dialog.

// Held redet nun mit Arto (self = Arto, other = Hero)
TRIA_Next(Arto);

DIAG_Reset();

AI_Output (self, other, "TRIA_TEST_00"); //Tut mir leid Held, aber hier darfst du nicht passieren

// Held redet nun mit Horka (self = Horka, other = Hero)
TRIA_Next(Horka);

AI_Output (other, self, "TRIA_TEST_01"); //Warum nicht?

AI_GotoNpc(self, other);
AI_TurnToNpc(other, self);

AI_Output (self, other, "TRIA_TEST_02"); //Die Stadt wurde verriegelt

// Held soll sich während des nächsten Satzes verschwörerisch umsehen
DIAG("Nervous", 1, 2);

AI_Output (other, self, "TRIA_TEST_03"); //Ich habe ein wenig Gold dabei, kommen wir damit ins Geschäft?

// Held soll sich jetzt wieder normal bewegen
DIAG_Reset();

// Starte Kamerafahrt
TRIA_Cam("CAMERASTART");

// Held redet nun mit Squelto (self = Squelto, other = Hero)
TRIA_Next(Squelto);

AI_TurnToNpc(other, self);

DIAG("No", 0, 1);
AI_Output (self, other, "TRIA_TEST_04"); //Nein. Wir sind nicht bestechlich.

// Held redet nun wieder mit Arto (self = Arto, other = Hero)
TRIA_Next(Arto);

// Held soll sich jetzt fragend Artikulieren
DIAG("NotSure", 0, 1);

AI_Output (other, self, "TRIA_TEST_05"); //Sicher?

AI_TurnToNpc(other, self);

// Kamerafahrt Ende
TRIA_Cam("");

// Arto soll zornig reagieren
DIAG("Angry", 0, 4);

AI_Output (self, other, "TRIA_TEST_06"); //Ich muss dich nun bitten zu gehen

// Held soll sich jetzt wieder normal bewegen
DIAG_Reset();

AI_Output (other, self, "TRIA_TEST_07"); //Nun gut...

TRIA_Finish(); // und Ende
};

Подробнее тут:
http://lego.worldofplayers.de/?

Блин, а мною думалось сделали 3 и более переменных для запоминания разговорных NPC. А тут переключение через стандартные разговоры 2 NPC:( (костыли)
 

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
В НМ ничего подобного нет, триалог подразумевает действие ведение диалога с тремя и более НПС сразу.
Если только его на Икарус не перетащили за это время, но такого я не помню.. ::)

Есть. Безо всяких икарусов и прочего.

Например, разговор Гуго с Гуннаром и Айнаром. Или разговор Гуго и Ури (Ури), когда его поймали по пути в болотный лагерь.
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
Есть. Безо всяких икарусов и прочего.
Откуда есть-то ? В триалоге и камера и все Непеси и прочее работает сразу в одном диалоге не выходя из него, это все есть ?!
Не верю! © Станиславский.. :D

Блин, а мною думалось сделали 3 и более переменных для запоминания разговорных NPC. А тут переключение через стандартные разговоры 2 NPC:( (костыли)
Естественно использование переменных было бы удобнее в разы, но одними переменными тут не обойтись..
Надо и Непсей прописывать и камеру и прочее...
 
Последнее редактирование:

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
Откуда есть-то ? В триалоге и камера и все Непеси и прочее работает сразу в одном диалоге не выходя из него, это все есть ?!
Не верю! © Станиславский.. :D

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

Все работает. Не веришь, пройди Народ Миненталя.
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
Все работает. Не веришь, пройди Народ Миненталя.
Не, проходить ничего не собираюсь, а скрипты гляну..


Зы, Уже глянул, вижу простыни, впрочем все понятно. В реализации оно немного другое..

А вот Триалог интересно было бы увидеть рабочий пример, мне пришлось мучаться с одним диалогом - реализовывать через обычный диалог.
Рабочий пример из НМ, от триалога он отличается сильно, в том числе и исполнением..:
instance DIA_5033_hugo(C_Info)
{
npc = NPC_5033_gunnar;
nr = 1;
important = 1;
condition = DIA_5033_hugo_Condition;
information = DIA_5033_hugo_Info;
permanent = 0;
description = "Это и есть Гуго?";
};


func int DIA_5033_hugo_Condition()
{

if ( Npc_KnowsInfo(other, DIA_hugo_ag1)
&& Npc_GetDistToNpc(self, NPC_5017_hugo) < 1000
) {
return 1;
};
return 0;
};

func void DIA_5033_hugo_Info()
{
var c_npc ainar;
var c_npc hugo;
ainar = Hlp_GetNpc(NPC_5032_ainar);
hugo = Hlp_GetNpc(NPC_5017_hugo);

AI_SetWalkMode(hugo,NPC_WALK);
AI_GotoNpc(hugo, self);
AI_SetWalkMode(other,NPC_WALK);
AI_GotoNpc(other, self);
AI_TurnToNPC(hugo, self);
AI_TurnToNPC(other, self);
AI_Output(hugo,other,"DIA_5033_hugo_0"); //Кто тут Гуго искал?
AI_GotoNpc(hugo,self);
AI_TurnToNPC(hugo,self);
AI_SetWalkMode(other,NPC_WALK);
// AI_GotoNpc(other,hugo);
// AI_GotoNpc(other,ainar);
AI_SetWalkMode(self,NPC_WALK);
AI_WaitTillEnd(self,hugo);
AI_GotoNpc(self, hugo);
AI_TurnToNPC(self, hugo);
AI_WaitTillEnd(ainar,hugo);
AI_SetWalkMode(ainar,NPC_WALK);
AI_GotoNpc(ainar, hugo);
AI_Output(self,other,"DIA_5033_hugo_1"); //Это что, и есть тот самый Гуго?
AI_WaitTillEnd(hugo,self);
AI_TurnToNPC(hugo,self);
AI_Output(other,self,"DIA_5033_hugo_2"); //Он самый. Я с другим Гуго не знаком.
AI_WaitTillEnd(ainar, other);
AI_SetWalkMode(ainar,NPC_WALK);
AI_GotoNpc(ainar, hugo);
AI_TurnToNPC(ainar, hugo);
AI_Output(ainar,other,"DIA_5033_hugo_2_1"); //Ну и Гуго...
AI_WaitTillEnd( self,ainar);
AI_Output(self,other,"DIA_5033_hugo_3"); //Ну раз нет другого, будем разбираться с этим.
AI_WaitTillEnd(hugo,self);
AI_TurnToNPC(hugo,self);
AI_Output(hugo,other,"DIA_5033_hugo_3_1"); //Так-так...
AI_TurnToNPC(self, hugo);
AI_Output(self,other,"DIA_5033_hugo_4"); //Как ты думаешь, Айнар? Будем с этим разбираться?
AI_TurnToNPC(self, hugo);
AI_WaitTillEnd(ainar, self);
AI_SetWalkMode(ainar,NPC_WALK);
AI_GotoNpc(ainar, hugo);
AI_TurnToNPC(ainar, hugo);
AI_Output(ainar,other,"DIA_5033_hugo_5"); //Да это мозгляк какой-то. А про того Гуго такое рассказывали...
AI_WaitTillEnd( self,ainar);
AI_Output(self,other,"DIA_5033_hugo_6"); //Может, нам отпустить его? Может, это не тот?
AI_WaitTillEnd(hugo,self);
AI_TurnToNPC(hugo,ainar);
AI_Output(hugo,other,"DIA_5033_hugo_6_1"); //Даже так?..
AI_WaitTillEnd(ainar, hugo);
AI_Output(ainar,other,"DIA_5033_hugo_7"); //Нет, Гуннар, нельзя нам его отпускать. А вдруг это тот, что нам нужен?
AI_WaitTillEnd( self,ainar);
AI_Output(self,other,"DIA_5033_hugo_8"); //Да быть того не может. Я таких как он пачками через колено ломал. Просто голову ему долой без разговоров, и пойдем искать настоящего Гуго.
AI_WaitTillEnd(ainar, self);
AI_Output(ainar,other,"DIA_5033_hugo_9"); //Может, ты и прав, Гуннар...
AI_WaitTillEnd(hugo,ainar);
AI_TurnToNPC(hugo,self);
AI_StopProcessInfos(self);
};
 
Последнее редактирование:

Schottler

Участник форума
Регистрация
26 Окт 2015
Сообщения
16
Благодарности
0
Баллы
155
Накопилось несколько вопросов по поводу интерактивных объектов. Но так как пользуюсь Блендером, а абсолютное большинство уроков/туторов/статей делаются под Макс, то расхождений просто уйма. Так вот хотелось бы спросить, кто-нибудь пользуется Блендером?
 

Phantom95

Участник форума
Регистрация
31 Июл 2014
Сообщения
2.227
Благодарности
1.910
Баллы
370
Вопрос к знатокам модостроительства, которые умеют вносить правки в движок и совершенствовать его работу - Есть ли в движке, хоть какая-нибудь информация о параметрах moveable и takeable у обьектов класса oCMob ? Почему эти параметры не работают нормально, и что послужило причиной, предпосылкой для их отключения? Аналогичный вопрос и по параметрам hp и VisualDestroed, ведь они тоже не работают. Очень надеюсь услышать нормальный обоснованный ответ, поскольку сам задал вопрос подобающим образом.
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Вот ещё вопрос: могу заставить орка сделать это:
Имею точку 1 и точку 2. На точку 1 указано добавить орка. После я могу принудительно заставить орка перейти на точку 2?

Точки 1 и 2 это Waypoint.
Орки как и звери используют для передвижения Freepoint.
 

redleha


Модостроитель
Регистрация
26 Фев 2008
Сообщения
735
Благодарности
665
Баллы
245
Вот ещё вопрос: могу заставить орка сделать это:
Имею точку 1 и точку 2. На точку 1 указано добавить орка. После я могу принудительно заставить орка перейти на точку 2?

Точки 1 и 2 это Waypoint.
Орки как и звери используют для передвижения Freepoint.
Есть куча команд, и AI_GotoWP и AI_GoToFP, и составить свое расписание подобно людям, а не шаблонное монстровое.
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Вот ещё вопрос:
Нельзя в готике дибильный генератор случайных числе заменить (у него в основе выпадают числа 0,1,2,3) на другой?
Мне желательно было бы вписать:
Создаём 10 массивов размером 10х10 (заполняем случайными числами все массивы),
Далее выбираем случайным числом массив,
Далее выбираем случайным числом столбец и строчку в массиве.

Чтобы хоть такой примитив дискретной математики реализовать.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Далее выбираем случайным числом столбец и строчку в массиве.
А кто тебе мешает сделать это на уровне скриптов с использованием стандартного рандомизера?

А вообще, для получения более приемлемого результата используй остаток от деления совместно с функцией рандомизера:
Код:
Hlp_Random(100)%10 - случайное число от 0 до 9
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
А кто тебе мешает сделать это на уровне скриптов с использованием стандартного рандомизера?

А вообще, для получения более приемлемого результата используй остаток от деления совместно с функцией рандомизера:
Код:
Hlp_Random(100)%10 - случайное число от 0 до 9

Т.к. орки и звери в основе используют Freepoint (только для возврата используют ближайшую точку Waypoint) - то надобность в создании проверки (в барьер попал орк/зверь/NPC/ГГ отпадает). (Т.к. не реализовать проверку координат орка/зверя за стеной в Минентале, чтобы её хоть как-то реализовать нужно на каждый микрон барьера посадить waypoint (технически такое не сделать))
Но нужно реализовать имитацию, что барьер есть.
Т.е. в любое время от 0 до 23 должна происходить атака орком барьера.
Для атаки выбираем время от 0 до 23 и место атаки от 0 до 20 (примерное число мест где может быть атака)

И тут частое выпадение числе 0,1,2,3 - будет выглядеть странно. Почему атаки идут только ночью и в определённых местах, а в других местах раз в месяц. (Генератор случайных числе в готике убитый)

Мною ещё бы добавилось, чтобы был случайный орк/зверь для атаки барьера - но снова первые числа готика будет использовать часто.

P.S. Сейчас посмотрелось видео Prealfa ELEX - сразу заметно: использованы Waypoint, Freepoint и точь в точь Готика 4. Пираньи далеко не ушли от Готики 1.
 
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
И тут частое выпадение числе 0,1,2,3 - будет выглядеть странно. Почему атаки идут только ночью и в определённых местах, а в других местах раз в месяц. (Генератор случайных числе в готике убитый)
ОМГ! Ты тут с завидной периодичностью сетуешь, что тебе ТО не объяснили, ЭТО не расписали в туториалах. А между тем, получив ответ на вопрос, ты даже не пытаешься вникнуть в его смысл. *facepalm*
 
Сверху Снизу