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

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

Lorddemonik

★★★★★
Редактор раздела
Регистрация
17 Дек 2011
Сообщения
993
Благодарности
509
Баллы
335
Я просто в восторге от ваших загадок...
watch
Ты когда текст читаешь, как это делаешь? Сверху вниз или свой способ?=)
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.801
Баллы
995
Ты когда текст читаешь, как это делаешь? Сверху вниз или свой способ?=)
А в чем там проблема ?!

Смотрим на кондишен оригинала:
Код:
FUNC INT DIA_Abuyin_Zukunft_Condition()

{   
    if Npc_KnowsInfo (other, DIA_Abuyin_Weissagung)
    && (DIA_Abuyin_Zukunft_permanent == FALSE)
    && (Kapitel == 1)
    {   
        return TRUE;
    };
};

Если условие верно, то выполняется этот диалог:
Код:
FUNC VOID DIA_Abuyin_Zukunft_Info()
{   
    AI_Output (other, self,"DIA_Abuyin_Zukunft_15_00");//Erzдhl mir von der Zukunft.
    
    if B_GiveInvItems (other,self, ItMI_Gold, 25)
    {
        AI_Output (self, other,"DIA_Abuyin_Zukunft_13_01");//Gut, Suchender des Wissens. Ich werde mich nun in Trance begeben. Bist du bereit?
        Info_ClearChoices (DIA_Abuyin_Zukunft);
        Info_AddChoice (DIA_Abuyin_Zukunft,"Ich bin bereit",DIA_Abuyin_Zukunft_Trance);
    }
    else
    {
        AI_Output (self, other,"DIA_Abuyin_Zukunft_13_02");//Oh Vater der Mьnzen, fьr einen Blick in die Zeit bitte ich dich um eine Gabe von 25 Goldstьcken.
    };
};

Если в нем Гг заплатил Абуину 25 голды, то добавляется этот диалог:
Код:
FUNC VOID DIA_Abuyin_Zukunft_Trance()
{
        AI_PlayAni  (self,"T_MAGRUN_2_HEASHOOT");
        Wld_PlayEffect("SPELLFX_TELEPORT",  self, self, 0, 0, 0, FALSE );
        
        AI_Output (self, other,"DIA_Abuyin_Zukunft_Trance_13_00");//(Trance)... Orks ... sie bewachen einen Zugang ... ein alter Stollen ... das Tal der Minen ...
        AI_Output (self, other,"DIA_Abuyin_Zukunft_Trance_13_01");//(Trance) ... Mдnner mit strahlenden Rьstungen ... ein Magier ... dein Freund ist bei ihnen ... er wartet auf dich ...
        AI_Output (self, other,"DIA_Abuyin_Zukunft_Trance_13_02");//(Trance) ... Feuer! Ein Angriff ... ein mдchtiges Wesen ... die Flammen ... viele ... werden sterben ...
        
        AI_Output (self, other,"DIA_Addon_Abuyin_Zukunft_Trance_13_00");//(Trance) ... was ist das ... ? Eine Stadt ... Ruinen ... Quarhodron in Jharkendar ...
        AI_Output (self, other,"DIA_Addon_Abuyin_Zukunft_Trance_13_01");//(Trance) ... er wird gerufen ... Quarhodron in Jharkendar!
        
        AI_PlayAni  (self,"T_HEASHOOT_2_STAND");
        AI_Output (self, other,"DIA_Abuyin_Zukunft_Trance_13_03");//... Tut mir Leid - die Vision ist vorьber. Ich sehe nichts mehr.
        
        DIA_Abuyin_Zukunft_permanent = TRUE;
        Abuyin_Zukunft = 1;
        Info_ClearChoices (DIA_Abuyin_Zukunft);
        
        B_GivePlayerXP ((XP_Ambient*4));
};

Названия файлов в нем не играют ни какой роли, функции отрабатываются сверху вних и по номерам диалогов, а два этих файла: DIA_Addon_Abuyin_Zukunft_Trance_13_00, были добавлены в аддоне..
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.321
Благодарности
3.166
Баллы
525

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
5.818
Благодарности
5.221
Баллы
910
Не могу понять принцип построения некоторых диалогов.На примере:
Код:
instance DIA_Abuyin_Zukunft(C_Info)
{
    npc = VLK_456_Abuyin;
    nr = 2;
    condition = DIA_Abuyin_Zukunft_Condition;
    information = DIA_Abuyin_Zukunft_Info;
    permanent = TRUE;
    description = "Расскажи мне о будущем (заплатить 25 золотых).";
};


var int DIA_Abuyin_Zukunft_permanent;

func int DIA_Abuyin_Zukunft_Condition()
{
    if(Npc_KnowsInfo(other,DIA_Abuyin_Weissagung) && (DIA_Abuyin_Zukunft_permanent == FALSE) && (Kapitel == 1))
    {
        return TRUE;
    };
};

func void DIA_Abuyin_Zukunft_Info()
{
    AI_Output(other,self,"DIA_Abuyin_Zukunft_15_00");    //Расскажи мне о будущем.
    if(B_GiveInvItems(other,self,ItMi_Gold,25))
    {
        AI_Output(self,other,"DIA_Abuyin_Zukunft_13_01");    //Хорошо, о, Жаждущий Знаний. Я сейчас войду в состояние транса. Ты готов?
        Info_ClearChoices(DIA_Abuyin_Zukunft);
        Info_AddChoice(DIA_Abuyin_Zukunft,"Я готов!",DIA_Abuyin_Zukunft_Trance);
    }
    else
    {
        AI_Output(self,other,"DIA_Abuyin_Zukunft_13_02");    //О, Отец Монет, я прошу у тебя 25 золотых в обмен на взгляд в туманное будущее.
    };
};

func void DIA_Abuyin_Zukunft_Trance()
{
    AI_PlayAni(self,"T_MAGRUN_2_HEASHOOT");
    Wld_PlayEffect("SPELLFX_TELEPORT",self,self,0,0,0,FALSE);
    AI_Output(self,other,"DIA_Abuyin_Zukunft_Trance_13_00");    //(в трансе) Орки... они охраняют вход... старый туннель... Долина Рудников...
    AI_Output(self,other,"DIA_Abuyin_Zukunft_Trance_13_01");    //(в трансе) Люди в сверкающих доспехах... маг... твой друг с ними... он ждет тебя...
    AI_Output(self,other,"DIA_Abuyin_Zukunft_Trance_13_02");    //(в трансе) Огонь! Нападение... могучего существа... пламя... многие... погибнут...
    AI_Output(self,other,"DIA_Addon_Abuyin_Zukunft_Trance_13_00");    //(в трансе) ...Что это?.. Город... Руины... Куарходрон из Яркендара...
    AI_Output(self,other,"DIA_Addon_Abuyin_Zukunft_Trance_13_01");    //(в трансе) ...Он был призван... Куарходрон из Яркендара!
    AI_PlayAni(self,"T_HEASHOOT_2_STAND");
    AI_Output(self,other,"DIA_Abuyin_Zukunft_Trance_13_03");    //... Извини - видение кончилось. Больше я ничего не смог увидеть.
    DIA_Abuyin_Zukunft_permanent = TRUE;
    Abuyin_Zukunft = 1;
    Info_ClearChoices(DIA_Abuyin_Zukunft);
    B_GivePlayerXP(XP_Ambient * 4);
};
Как определяется,что будет читаться?
AI_Output(self,other,"DIA_Abuyin_Zukunft_Trance_13_00"); //
или
AI_Output(self,other,"DIA_Addon_Abuyin_Zukunft_Trance_13_00"); //
Ведь условий никаких не стоит.
И как вообще должны подхватиться строчки "DIA_Addon_Abuyin_Zukunft...",
если инстанция диалога: "DIA_Abuyin_Zukunft"?

Уже все разжевали, но напишу еще раз

Код:
instance DIA_Abuyin_Zukunft(C_Info) //Объявили диалог у Абуина с некоторыми (переменными), методами
{
    npc = VLK_456_Abuyin;
    nr = 2;
    condition = DIA_Abuyin_Zukunft_Condition;
    information = DIA_Abuyin_Zukunft_Info;
    permanent = TRUE;
    description = "Расскажи мне о будущем (заплатить 25 золотых).";
};


var int DIA_Abuyin_Zukunft_permanent; //Объявили переменную числового значения

func int DIA_Abuyin_Zukunft_Condition() //Кондищен функция диалога
{
    //Условие, в котором проверяется, чтобы текущая глава была первая, ГГ говорил с Абуином и объявленная ранее переменная равна FALSE
    if(Npc_KnowsInfo(other,DIA_Abuyin_Weissagung) && (DIA_Abuyin_Zukunft_permanent == FALSE) && (Kapitel == 1))
    {
        return TRUE; //Если все верно, то возвращается у функции TRUE, и запуститься диалог
    };
};

func void DIA_Abuyin_Zukunft_Info() //Функция диалога с Абуином
{
    AI_Output(other,self,"DIA_Abuyin_Zukunft_15_00");    //Расскажи мне о будущем. //Здесь работает функция вызова диалога, 
в котором ГГ говорит фразу после комментария, 
а DIA_.... это название файла, в котором содержится озвучка диалога, 
если файла нет, то и самой озвучки нет, диалог при этом пройдет, но с некоторой задержкой.
    if(B_GiveInvItems(other,self,ItMi_Gold,25)) //Здесь ставиться условие, если ГГ заплатит Абуину, то будет проигрываться диалог, который стоит в скобках
    {
        AI_Output(self,other,"DIA_Abuyin_Zukunft_13_01");    //Хорошо, о, Жаждущий Знаний. Я сейчас войду в состояние транса. Ты готов?
        Info_ClearChoices(DIA_Abuyin_Zukunft); //Функция очистки окна выбора диалогов
        Info_AddChoice(DIA_Abuyin_Zukunft,"Я готов!",DIA_Abuyin_Zukunft_Trance); //Добавление в меню диалога ГГ "Я готов!", при выборе которой сработает вызов другой функции диалога
    }
    else //Если ГГ не заплатит 25 золотых, то проиграется следующий диалог
    {
        AI_Output(self,other,"DIA_Abuyin_Zukunft_13_02");    //О, Отец Монет, я прошу у тебя 25 золотых в обмен на взгляд в туманное будущее.
    };
};

func void DIA_Abuyin_Zukunft_Trance() //Функция монолога, когда ГГ заплатит 25 золотых
{
    AI_PlayAni(self,"T_MAGRUN_2_HEASHOOT"); //Функция проигрывания анимации Абуина (self)
    Wld_PlayEffect("SPELLFX_TELEPORT",self,self,0,0,0,FALSE); //Функция проигрывания анимации PFX эффекта у Абуина (self)
    //Диалоги проигрываются сверху-вниз, по номерам, которые указаны в файле диалога DIA_..._13_00 в этом случае, он будет проигрываться первым
    AI_Output(self,other,"DIA_Abuyin_Zukunft_Trance_13_00");    //(в трансе) Орки... они охраняют вход... старый туннель... Долина Рудников...
    AI_Output(self,other,"DIA_Abuyin_Zukunft_Trance_13_01");    //(в трансе) Люди в сверкающих доспехах... маг... твой друг с ними... он ждет тебя...
    AI_Output(self,other,"DIA_Abuyin_Zukunft_Trance_13_02");    //(в трансе) Огонь! Нападение... могучего существа... пламя... многие... погибнут...
    AI_Output(self,other,"DIA_Addon_Abuyin_Zukunft_Trance_13_00");    //(в трансе) ...Что это?.. Город... Руины... Куарходрон из Яркендара...
    AI_Output(self,other,"DIA_Addon_Abuyin_Zukunft_Trance_13_01");    //(в трансе) ...Он был призван... Куарходрон из Яркендара!
    AI_PlayAni(self,"T_HEASHOOT_2_STAND");
    AI_Output(self,other,"DIA_Abuyin_Zukunft_Trance_13_03");    //... Извини - видение кончилось. Больше я ничего не смог увидеть.
    DIA_Abuyin_Zukunft_permanent = TRUE; //Операция присваивания
    Abuyin_Zukunft = 1; //Операция присваивания
    Info_ClearChoices(DIA_Abuyin_Zukunft);
    B_GivePlayerXP(XP_Ambient * 4); //Добавление ГГ опыта
};
 
Последнее редактирование:

Vlad_Torop

Участник форума
Регистрация
2 Май 2014
Сообщения
868
Благодарности
498
Баллы
230
Названия файлов в нем не играют ни какой роли, функции отрабатываются сверху вних и по номерам диалогов, а два этих файла: DIA_Addon_Abuyin_Zukunft_Trance_13_00, были добавлены в аддоне..
В этом и было мое недопонимание.
Я подумал,если DIA_Abuyin имеет номер 13_00,и DIA_Addon_Abuyin имеет номер 13_00(в одном и том же диалоге),то происходит какая-то вариативность.
Сейчас поэкспериментировал со своим нпс,все понял.
Всем спасибо.
 

Kreol Nekr

Участник форума
Регистрация
21 Ноя 2014
Сообщения
229
Благодарности
109
Баллы
190
В этом и было мое недопонимание.
Я подумал,если DIA_Abuyin имеет номер 13_00,и DIA_Addon_Abuyin имеет номер 13_00(в одном и том же диалоге),то происходит какая-то вариативность.
Сейчас поэкспериментировал со своим нпс,все понял.
Всем спасибо.
На всякий случай 13 это номер голоса, а 00 это номер строки диалога.
 

Ulthrax

Участник форума
Регистрация
28 Июн 2017
Сообщения
263
Благодарности
76
Баллы
200
Усем трямки в этой теме.

Имею идею добавить ГГ в Готике 2 фичу сбора статистики - кого и сколько ухлопал, чего и сколько нашел/спер/скрафтил и т.п. Ну, с чего начать самое начало, думаю, найду - то поставить, это скормить еще чему-нибудь, получить кучу распакованного файла и радоваться.

Собственно, раз тема для чайников, то, значит, можно задавать дилетантские вопросы? Их таки есть у меня:

1) Куда дальше копать? Имею подозрение, что, раз никаких визуальных штук менять не предполагается, то мне не нужно 3Д-моделирование, конвертирование музыки и возня с анимациями, а потребуется чистый скриптинг. Сталбыть, мне нужен будет мануал по синтаксису скриптового языка Готики и список соглашений об именовании всяких там переменных. Я прав?

2) Как вообще производится с точки зрения скриптования обработка всяких там взаимодействий ГГ с прочим? Ну, например, инвентарь, параметры и возможности героя находятся в скрипте героя, а их текущие значения и флаги берутся из файла сохранения либо изменяются внешними событиями. А вот, например, ГГ сковал меч - где записывается (и записывается ли) этот факт? Или ГГ собрал 200 яблок, 30 съел и 100 пустил на пироги - как/где это записано? Или ГГ вскрыл сундук и нашел 100 монет + 1 эссенцию маны - сами-то монеты и бутылка запишутся в инвентарь, возможно, в параметры героя запишется +1 успешное вскрытие. Но можно ли как-то зафиксировать, что именно столько монет и бутылок герой именно добыл из вскрытого им сундука?

3) Чтобы, например, не перегружать параметры героя и (возможно) избежать необходимости начинать новую игру, есть мысль собирать статистику просто в лог-файл, например, в формате "%дата_время% / %игровые_дата_время% / убил(съел, скрафтил) / %ID_вражины(предмета)% / %количество% / чем убил". Это вообще возможно (позволяет ли игра писать свой файл)? И как к этому вопросу лучше подступиться?

Спасибо заранее!
 

Lorddemonik

★★★★★
Редактор раздела
Регистрация
17 Дек 2011
Сообщения
993
Благодарности
509
Баллы
335
Усем трямки в этой теме.

Имею идею добавить ГГ в Готике 2 фичу сбора статистики - кого и сколько ухлопал, чего и сколько нашел/спер/скрафтил и т.п. Ну, с чего начать самое начало, думаю, найду - то поставить, это скормить еще чему-нибудь, получить кучу распакованного файла и радоваться.

Собственно, раз тема для чайников, то, значит, можно задавать дилетантские вопросы? Их таки есть у меня:

1) Куда дальше копать? Имею подозрение, что, раз никаких визуальных штук менять не предполагается, то мне не нужно 3Д-моделирование, конвертирование музыки и возня с анимациями, а потребуется чистый скриптинг. Сталбыть, мне нужен будет мануал по синтаксису скриптового языка Готики и список соглашений об именовании всяких там переменных. Я прав?

2) Как вообще производится с точки зрения скриптования обработка всяких там взаимодействий ГГ с прочим? Ну, например, инвентарь, параметры и возможности героя находятся в скрипте героя, а их текущие значения и флаги берутся из файла сохранения либо изменяются внешними событиями. А вот, например, ГГ сковал меч - где записывается (и записывается ли) этот факт? Или ГГ собрал 200 яблок, 30 съел и 100 пустил на пироги - как/где это записано? Или ГГ вскрыл сундук и нашел 100 монет + 1 эссенцию маны - сами-то монеты и бутылка запишутся в инвентарь, возможно, в параметры героя запишется +1 успешное вскрытие. Но можно ли как-то зафиксировать, что именно столько монет и бутылок герой именно добыл из вскрытого им сундука?

3) Чтобы, например, не перегружать параметры героя и (возможно) избежать необходимости начинать новую игру, есть мысль собирать статистику просто в лог-файл, например, в формате "%дата_время% / %игровые_дата_время% / убил(съел, скрафтил) / %ID_вражины(предмета)% / %количество% / чем убил". Это вообще возможно (позволяет ли игра писать свой файл)? И как к этому вопросу лучше подступиться?

Спасибо заранее!


2) Обработка происходит в зависимости от того, как ты ее укажешь. Чтобы было понятней объясню на еде:
Съел яблоко, у яблока в скрипте помимо +хп указано запоминать сколько съел, как только это число стало => 25, дает 1 силы и счетчик обнуляется скриптом.
Код:
func void Use_Apple()
{
    Npc_ChangeAttribute(self,ATR_HITPOINTS,HP_Apple); // восстановление хп
    if(Npc_IsPlayer(self))
    {
        Apple_Bonus = Apple_Bonus + 1; // счетчик сколько съел
        if(Apple_Bonus == 7) // если 7 съел
        {
            Print(PRINT_Eat1);// вывод сообщения
        };
        if(Apple_Bonus == 15) // если 15
        {
            Print(PRINT_Eat2);// вывод сообщения
        };
        if(Apple_Bonus == 25)// если 25
        {
            Print(PRINT_Eat3); // вывод сообщения
            B_RaiseAttribute(self,ATR_STRENGTH,1); // повышение силы
            Snd_Play("LevelUp"); // воспроизведение звука
            Apple_Bonus = 0; // обнуление счетчика
        };
    };
};
Ковка по умолчания не записывается, но сделать можно как с яблоком. Предметы из сундука не пишутся, но можно сделать, хотя придется все сундуки перелопатить
3) Игра не умеет в писание и изменение файлов.

З.Ы Однако все некоторые вещи возможны расширителями, но тут все немного сложнее будет...
 

kor.angar

Участник форума
Регистрация
28 Ноя 2017
Сообщения
294
Благодарности
93
Баллы
200
Всем привет!

В игре есть свойство брони. Самый простой пример это бандитская броня, если ГГ в ней его все атакует. Есть броня фракций, доспехи наемников, ментов, магов. Если ГГ не в броне то соответственно члены фракции (гильдии) ругаются не хотят с ГГ говорить. Конец вводной части.


Есть броня из ползунов. Когда герой в ней, кое кто не хочет с ГГ говорит, появляется реплика что мол не подходит тебе это броня или просто ничего не происходит. Честно пару часов перечитывал топики на форуме, но так и не нашел где это прописано в скриптах игры. В файлах игры тоже ковырялся но не нашел.

Потому и пишу здесь.
 

kor.angar

Участник форума
Регистрация
28 Ноя 2017
Сообщения
294
Благодарности
93
Баллы
200
Спасибо!

а вот еще вопрос возник сегодня по обучению Языку Зодчих.
Миксир гад не хочет в Хориносе учить
в спойлере код Миксира
Код:
instance DIA_Addon_Myxir_CITY_EXIT(C_Info)
{
    npc = KDW_140300_Addon_Myxir_CITY;
    nr = 999;
    condition = DIA_Addon_Myxir_CITY_EXIT_Condition;
    information = DIA_Addon_Myxir_CITY_EXIT_Info;
    permanent = TRUE;
    description = Dialog_Ende;
};


func int DIA_Addon_Myxir_CITY_EXIT_Condition()
{
    return TRUE;
};

func void DIA_Addon_Myxir_CITY_EXIT_Info()
{
    AI_StopProcessInfos(self);
};


instance DIA_Addon_Myxir_CITY_HelloCITY(C_Info)
{
    npc = KDW_140300_Addon_Myxir_CITY;
    nr = 5;
    condition = DIA_Addon_Myxir_CITY_HelloCITY_Condition;
    information = DIA_Addon_Myxir_CITY_HelloCITY_Info;
    permanent = TRUE;
    description = "Ты останешься в городе?";
};


func int DIA_Addon_Myxir_CITY_HelloCITY_Condition()
{
    return TRUE;
};


var int DIA_Addon_Myxir_CITY_HelloCITY_OneTime;

func void DIA_Addon_Myxir_CITY_HelloCITY_Info()
{
    AI_Output(other,self,"DIA_Addon_Myxir_CITY_HelloCITY_15_00");    //Ты останешься в городе?
    AI_Output(self,other,"DIA_Addon_Myxir_CITY_HelloCITY_12_01");    //Кто-то из нас должен оставаться здесь, когда Ватраса в городе нет.
    VatrasAbloeseIstDa = TRUE;
    if((RavenIsDead == TRUE) && (DIA_Addon_Myxir_CITY_HelloCITY_OneTime == FALSE))
    {
        AI_Output(self,other,"DIA_Addon_Myxir_CITY_HelloCITY_12_02");    //Я хотел тебе сказать еще одну вещь.
        AI_Output(self,other,"DIA_Addon_Myxir_CITY_HelloCITY_12_03");    //В Яркендаре ты совершил поистине героический подвиг.
        AI_Output(other,self,"DIA_Addon_Myxir_CITY_HelloCITY_15_04");    //К сожалению, у меня еще есть незавершенные дела в Хоринисе.
        AI_Output(self,other,"DIA_Addon_Myxir_CITY_HelloCITY_12_05");    //Это так, но я уверен, что ты справишься с ними, Хранитель.
        AI_Output(other,self,"DIA_Addon_Myxir_CITY_HelloCITY_15_06");    //Увидим.
        DIA_Addon_Myxir_CITY_HelloCITY_OneTime = TRUE;
        B_GivePlayerXP(XP_Ambient);
    };
};


instance DIA_Addon_Myxir_CITY_Teach(C_Info)
{
    npc = KDW_140300_Addon_Myxir_CITY;
    nr = 90;
    condition = DIA_Addon_Myxir_CITY_Teach_Condition;
    information = DIA_Addon_Myxir_CITY_Teach_Info;
    permanent = TRUE;
    description = "Научи меня этому языку.";
};


var int DIA_Addon_Myxir_CITY_Teach_NoPerm;
var int DIA_Addon_Myxir_CITY_Teach_OneTime;

func int DIA_Addon_Myxir_CITY_Teach_Condition()
{
    if((Myxir_Addon_TeachPlayer == TRUE) && (DIA_Addon_Myxir_CITY_Teach_NoPerm == FALSE) && (DIA_Addon_Myxir_Teach_NoPerm == FALSE) && (DIA_Addon_Myxir_ADW_Teach_NoPerm == FALSE))
    {
        return TRUE;
    };
};

func void DIA_Addon_Myxir_CITY_Teach_Info()
{
    B_DIA_Addon_Myxir_TeachRequest();
    if(DIA_Addon_Myxir_CITY_Teach_OneTime == FALSE)
    {
        Log_CreateTopic(TOPIC_Addon_KDWTeacher,LOG_NOTE);
        B_LogEntry(TOPIC_Addon_KDWTeacher,LogText_Addon_MyxirTeach);
        DIA_Addon_Myxir_CITY_Teach_OneTime = TRUE;
    };
    if((PLAYER_TALENT_FOREIGNLANGUAGE[LANGUAGE_1] == FALSE) || (PLAYER_TALENT_FOREIGNLANGUAGE[LANGUAGE_2] == FALSE) || (PLAYER_TALENT_FOREIGNLANGUAGE[LANGUAGE_3] == FALSE))
    {
        Info_ClearChoices(DIA_Addon_Myxir_CITY_Teach);
        Info_AddChoice(DIA_Addon_Myxir_CITY_Teach,Dialog_Back,DIA_Addon_Myxir_CITY_Teach_BACK);
    };
    if(PLAYER_TALENT_FOREIGNLANGUAGE[LANGUAGE_1] == FALSE)
    {
        B_DIA_Addon_Myxir_TeachL1();
        Info_AddChoice(DIA_Addon_Myxir_CITY_Teach,B_BuildLearnString(NAME_ADDON_LEARNLANGUAGE_1,B_GetLearnCostTalent(other,NPC_TALENT_FOREIGNLANGUAGE,LANGUAGE_1)),DIA_Addon_Myxir_CITY_Teach_LANGUAGE_1);
    }
    else if((PLAYER_TALENT_FOREIGNLANGUAGE[LANGUAGE_2] == FALSE) && (PLAYER_TALENT_FOREIGNLANGUAGE[LANGUAGE_1] == TRUE))
    {
        B_DIA_Addon_Myxir_TeachL2();
        Info_AddChoice(DIA_Addon_Myxir_CITY_Teach,B_BuildLearnString(NAME_ADDON_LEARNLANGUAGE_2,B_GetLearnCostTalent(other,NPC_TALENT_FOREIGNLANGUAGE,LANGUAGE_2)),DIA_Addon_Myxir_CITY_Teach_LANGUAGE_2);
    }
    else if((PLAYER_TALENT_FOREIGNLANGUAGE[LANGUAGE_3] == FALSE) && (PLAYER_TALENT_FOREIGNLANGUAGE[LANGUAGE_1] == TRUE) && (PLAYER_TALENT_FOREIGNLANGUAGE[LANGUAGE_2] == TRUE))
    {
        B_DIA_Addon_Myxir_TeachL3();
        Info_AddChoice(DIA_Addon_Myxir_CITY_Teach,B_BuildLearnString(NAME_ADDON_LEARNLANGUAGE_3,B_GetLearnCostTalent(other,NPC_TALENT_FOREIGNLANGUAGE,LANGUAGE_3)),DIA_Addon_Myxir_CITY_Teach_LANGUAGE_3);
    }
    else
    {
        B_DIA_Addon_Myxir_TeachNoMore();
        DIA_Addon_Myxir_CITY_Teach_NoPerm = TRUE;
    };
};

func void DIA_Addon_Myxir_CITY_Teach_LANGUAGE_X()
{
    B_DIA_Addon_Myxir_Teach_LANGUAGE_X();
};

func void DIA_Addon_Myxir_CITY_Teach_BACK()
{
    Info_ClearChoices(DIA_Addon_Myxir_CITY_Teach);
};

func void DIA_Addon_Myxir_CITY_Teach_LANGUAGE_1()
{
    if(B_TeachPlayerTalentForeignLanguage(self,other,LANGUAGE_1))
    {
        DIA_Addon_Myxir_CITY_Teach_LANGUAGE_X();
    };
    Info_ClearChoices(DIA_Addon_Myxir_CITY_Teach);
};

func void DIA_Addon_Myxir_CITY_Teach_LANGUAGE_2()
{
    if(B_TeachPlayerTalentForeignLanguage(self,other,LANGUAGE_2))
    {
        DIA_Addon_Myxir_CITY_Teach_LANGUAGE_X();
    };
    Info_ClearChoices(DIA_Addon_Myxir_CITY_Teach);
};

func void DIA_Addon_Myxir_CITY_Teach_LANGUAGE_3()
{
    if(B_TeachPlayerTalentForeignLanguage(self,other,LANGUAGE_3))
    {
        DIA_Addon_Myxir_CITY_Teach_LANGUAGE_X();
    };
    Info_ClearChoices(DIA_Addon_Myxir_CITY_Teach);
};

Вообщем смотрю я код и понять не могу почему Миксир не хочет учить :)
 
Последнее редактирование модератором:

WoOliN

Участник форума
Регистрация
13 Окт 2012
Сообщения
347
Благодарности
196
Баллы
210
func int DIA_Addon_Myxir_CITY_Teach_Condition()
{
if((Myxir_Addon_TeachPlayer == TRUE) ...

Это условие должно быть выполнено, а выполняется оно единственный раз - это при встрече с Миксиром на раскопках магов воды (когда портал ещё закрыт). То есть - если при той встрече ГГ не спросил Миксира об обучении языкам, то в городе он уже никак не сможет изучить языки.
Убери условие и проверь без него.

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

Aven Felon

Любопытная Варвара
Регистрация
15 Июл 2016
Сообщения
2.536
Благодарности
2.699
Баллы
530
Отшельник разве не учит!?
Или он только третьему учил:oops:
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.558
Благодарности
4.140
Баллы
915
Отшельник учит любому из языков, но только однократно. А условие, которое может блокировать обучение у вернувшегося в город Миксира, было убрано ещё в скриптпатче Efectivo.
 
Последнее редактирование:

kor.angar

Участник форума
Регистрация
28 Ноя 2017
Сообщения
294
Благодарности
93
Баллы
200
Пользуясь случаем хочу поблагодарить всех за исчерпывающие ответы на предыдущие вопросы :-D

Читаю значит я топик Создание NPC и вставка его в игру, вношу правки в персонажи и все у меня получается:-D
Придаю NPC индивидуальности строго по инструкции
Код:
...
fight_tactic = FAI_HUMAN_MASTER ;
...
HitChance [NPC_TALENT_1H] = 90; //Владение Одноручником
HitChance [NPC_TALENT_2H] = 60; //Владение Двуручником
HitChance [NPC_TALENT_BOW] = 60; //Умение обращаться с Луком
HitChance [NPC_TALENT_CROSSBOW] = 30; //Умение обращаться с Арбалетом
...

Запускаю игру, NPC стоит довольный как слон. Но талант при этом несмотря на высокий процент имеет значение "Боец", а мне надо "Мастер".

Вопрос: как прописать значение(обучен, боец, мастер) для соответствующего(1H,2H,BOW,CROSSBOW) таланта у NPC

к примеру
1h=мастер
2h=боец
BOW=боец
CROSSBOW=обучен


Вообщем я разобрался. так сделать нельзя. ибо все это определяется общей строчкой fight_tactic = FAI_HUMAN_MASTER ;
то есть, если чувак мастер, то он мастер прям во всем сразу :-D

В готике 1 была такая фишка, как именное оружие и отдельно нпс реагировали достаточно агрессивно на то что ГГ ходил с их оружием. Сначала была фраза что то типа «у тебя мое оружие, похоже стоит переломать тебе пальцы».

Собственно вопрос заключается в следующим, как это можно реализовать во второй Готике?

К примеру у Диего идет проверка:
какое оружие у ГГ, если оружие ГГ = ItMw_diego, то Диего что-то говорит и атакует ГГ.
 
Последнее редактирование модератором:

WoOliN

Участник форума
Регистрация
13 Окт 2012
Сообщения
347
Благодарности
196
Баллы
210
Для описания оружия есть параметры принадлежности (owner и ownerGuild), но как они работают и работают ли сами по себе - мне неизвестно.

Легче всего сделать обычный диалог, в котором НПЦ сам обратиться к ГГ, если у того есть определённая инстанция оружия в инвентаре.
Поищи диалоги с параметром important = TRUE; - это как раз диалоги, в которых НПЦ сам обращается к ГГ.
В условия нужно будет вставить наличие у ГГ определённого предмета (предмет лучше всего сделать единичным в мире - так он и будет типа как персональным).
А уже из самого диалога можно вызывать атаку.
Если сильно поизвращаться, то может получится вызвать реакцию НПЦ на большом расстоянии и его перемещение к ГГ, для начала самого диалога.
 

kor.angar

Участник форума
Регистрация
28 Ноя 2017
Сообщения
294
Благодарности
93
Баллы
200
В условия нужно будет вставить наличие у ГГ определённого предмета (предмет лучше всего сделать единичным в мире - так он и будет типа как персональным).
это я сразу понял и сделал

Поищи диалоги с параметром important = TRUE; - это как раз диалоги, в которых НПЦ сам обращается к ГГ.
диалогов в игре таких много, но вот обращение при условие это не часто. штраф к примеру. вообщем банально содрать не с чего :-D

вот код Декстера с important = TRUE;
Код:
instance DIA_Dexter_Kill(C_Info)
{
    npc = BDT_1060_Dexter;
    nr = 2;
    condition = DIA_Dexter_Kill_Condition;
    information = DIA_Dexter_Kill_Info;
    permanent = FALSE;
    important = TRUE;
};


func int DIA_Dexter_Kill_Condition()
{
    if(Npc_IsInState(self,ZS_Talk) && ((Dexter_NoMoreSmallTalk == TRUE) || (Knows_Dexter == FALSE)))
    {
        return TRUE;
    };
};

func void DIA_Dexter_Kill_Info()
{
    if(Knows_Dexter == TRUE)
    {
        AI_Output(self,other,"DIA_Addon_Dexter_Add_09_02");    //(нападает) Считай, что сам напросился...
    }
    else
    {
        AI_Output(self,other,"DIA_Dexter_Kill_09_01");    //О, лучше ты здесь не появлялся. Ты не тот человек не в том месте.
    };
    MIS_Steckbriefe = LOG_OBSOLETE;
    B_CheckLog();
    B_Greg_ComesToDexter();
    Info_ClearChoices(DIA_Dexter_Kill);
    Info_AddChoice(DIA_Dexter_Kill,Dialog_Ende,DIA_Dexter_Kill_ENDE);
};

что то это слишком сложно для меня. надо какой то простой вариант.

может сделать сделать что то типа как с кольцом аквамарина?

instance DIA_Addon_Orlan_Ranger(C_Info)
{
npc = BAU_970_Orlan;
nr = 2;
condition = DIA_Addon_Orlan_Ranger_Condition;
information = DIA_Addon_Orlan_Ranger_Info;
description = "Это мне только кажется или ты уставился на мое кольцо?";
};


func int DIA_Addon_Orlan_Ranger_Condition()
{
if(Npc_KnowsInfo(other,DIA_Orlan_WERBISTDU) && (SCIsWearingRangerRing == TRUE))
{
return TRUE;
};
};

func void DIA_Addon_Orlan_Ranger_Info()
{
AI_Output(other,self,"DIA_Addon_Orlan_Ranger_15_00"); //Мне это только кажется или ты уставился на мое кольцо?
AI_Output(self,other,"DIA_Addon_Orlan_Ranger_05_01"); //Я и не знаю, что я об этом должен думать.
Orlan_KnowsSCAsRanger = TRUE;
Info_ClearChoices(DIA_Addon_Orlan_Ranger);
Info_AddChoice(DIA_Addon_Orlan_Ranger,"Мужик! Да я принадлежу к 'Кольцу воды'!",DIA_Addon_Orlan_Ranger_Idiot);
Info_AddChoice(DIA_Addon_Orlan_Ranger,"Это аквамарин. Уже видел такой?",DIA_Addon_Orlan_Ranger_Aqua);
};
 
Последнее редактирование:

Lorddemonik

★★★★★
Редактор раздела
Регистрация
17 Дек 2011
Сообщения
993
Благодарности
509
Баллы
335
Пользуясь случаем хочу поблагодарить всех за исчерпывающие ответы на предыдущие вопросы :-D

Читаю значит я топик Создание NPC и вставка его в игру, вношу правки в персонажи и все у меня получается:-D
Придаю NPC индивидуальности строго по инструкции
Код:
...
fight_tactic = FAI_HUMAN_MASTER ;
...
HitChance [NPC_TALENT_1H] = 90; //Владение Одноручником
HitChance [NPC_TALENT_2H] = 60; //Владение Двуручником
HitChance [NPC_TALENT_BOW] = 60; //Умение обращаться с Луком
HitChance [NPC_TALENT_CROSSBOW] = 30; //Умение обращаться с Арбалетом
...

Запускаю игру, NPC стоит довольный как слон. Но талант при этом несмотря на высокий процент имеет значение "Боец", а мне надо "Мастер".

Вопрос: как прописать значение(обучен, боец, мастер) для соответствующего(1H,2H,BOW,CROSSBOW) таланта у NPC

к примеру
1h=мастер
2h=боец
BOW=боец
CROSSBOW=обучен


Вообщем я разобрался. так сделать нельзя. ибо все это определяется общей строчкой fight_tactic = FAI_HUMAN_MASTER ;
то есть, если чувак мастер, то он мастер прям во всем сразу :-D


Нет, эта строчка лишь сделана для простоты, она суммирует все навыки.
Удали ее и введи
B_AddFightSkill(self,NPC_TALENT_1H,60);
B_AddFightSkill(self,NPC_TALENT_2H,30);
B_AddFightSkill(self,NPC_TALENT_BOW,10);
B_AddFightSkill(self,NPC_TALENT_CROSSBOW,10);
Думаю поймешь что за что отвечает.

Насчет нападение из-за оружия... Могу предложить только нападение, в том случае, если оружие или предмет есть в инвентаре.
instance DIA_Xardas_Hello(C_Info)
{
npc = NONE_100_Xardas;
nr = 1;
condition = DIA_Xardas_Hello_Condition;
information = DIA_Xardas_Hello_Info;
permanent = TRUE;
important = TRUE;
};


func int DIA_Xardas_Hello_Condition()
{
If(Npc_hasItems(hero,ItMw_1H_Mace_L_03) >= 1)
{
return TRUE;
};

};

func void DIA_Xardas_Hello_Info()
{
AI_Output(self,other,"DIA_Addon_Xardas_Hello_14_00"); // У тебя мое оружие, отдавай
B_GiveInvItems(other,self,ItMw_1H_Mace_L_03,1); // Забирает палку во время разговора, сделано, чтобы после диалога, не напал повторно ввиду того, что оружие не экипированно...
AI_StopProcessInfos(self);
B_Attack(self,other,AR_NONE,1);
};
З.ы Отбирает предмет из диалога и кидается. Отбирает, чтобы не повторял диалог

З.ы.ы можно сделать отбор оружия после поражения в бою, но тогда придется тонну написать, какой персонаж какое оружие при обыске/победе над гг, должен забрать
 
Последнее редактирование:

kor.angar

Участник форума
Регистрация
28 Ноя 2017
Сообщения
294
Благодарности
93
Баллы
200
2 lorddemonik1
Ой спасибо! Стало гораздо понятнее. На Диего проверил работает :)

instance DIA_DiegoNW_ItMw(C_Info)
{
npc = PC_Thief_NW;
nr = 1 ; //важность,т.е в где будет стоять строка в начале в конце в середине.
condition = DIA_DiegoNW_ItMw_Condition;
information = DIA_DiegoNW_ItMw_Info;
permanent = TRUE;
important = TRUE; //если false то диалог начинаете вы,если TRUE нпс начинает разговор с вами!
};

func int DIA_DiegoNW_ItMw_Condition()
{
If(Npc_hasItems(hero,ItMw_diego) >= 1)
{
return TRUE;
};

};

func void DIA_DiegoNW_ItMw_Info()
{
AI_Output(self,other,"DIA_Addon_Xardas_Hello_14_00"); // У тебя мое оружие, отдавай
B_GiveInvItems(other,self,ItMw_diego,1); // Забирает палку во время разговора, сделано, чтобы после диалога, не напал повторно ввиду того, что оружие не экипированно...
AI_StopProcessInfos(self);
B_Attack(self,other,AR_NONE,1);
};

Но хочется всё таки что была проверка на то, что оружие у ГГ экипировано. иначе как то странно получается :)
 
Последнее редактирование:

Lorddemonik

★★★★★
Редактор раздела
Регистрация
17 Дек 2011
Сообщения
993
Благодарности
509
Баллы
335
2 lorddemonik1
Ой спасибо! Стало гораздо понятнее. На Диего проверил работает :)

instance DIA_DiegoNW_ItMw(C_Info)
{
npc = PC_Thief_NW;
nr = 1 ; //важность,т.е в где будет стоять строка в начале в конце в середине.
condition = DIA_DiegoNW_ItMw_Condition;
information = DIA_DiegoNW_ItMw_Info;
permanent = TRUE;
important = TRUE; //если false то диалог начинаете вы,если TRUE нпс начинает разговор с вами!
};

func int DIA_DiegoNW_ItMw_Condition()
{
If(Npc_hasItems(hero,ItMw_diego) >= 1)
{
return TRUE;
};

};

func void DIA_DiegoNW_ItMw_Info()
{
AI_Output(self,other,"DIA_Addon_Xardas_Hello_14_00"); // У тебя мое оружие, отдавай
B_GiveInvItems(other,self,ItMw_diego,1); // Забирает палку во время разговора, сделано, чтобы после диалога, не напал повторно ввиду того, что оружие не экипированно...
AI_StopProcessInfos(self);
B_Attack(self,other,AR_NONE,1);
};

Но хочется всё таки что была проверка на то, что оружие у ГГ экипировано. иначе как то странно получается :)

Да знаю я, я сундук, не могу вспомнить как проверка делается на экипировку, не объявляя кучу переменных, как с кольцом кольца
Попробуй это:
instance DIA_Xardas_Hello(C_Info)
{
npc = NONE_100_Xardas;
nr = 1;
condition = DIA_Xardas_Hello_Condition;
information = DIA_Xardas_Hello_Info;
permanent = FALSE;
important = TRUE;
};


func int DIA_Xardas_Hello_Condition()

{
var C_Item EquipWeap;
EquipWeap = Npc_GetEquippedMeleeWeapon(hero);
if (Hlp_IsItem(EquipWeap,ItMw_1H_Mace_L_03) == TRUE)
{
return TRUE;
};

};

func void DIA_Xardas_Hello_Info()
{
AI_Output(self,other,"DIA_Addon_Xardas_Hello_14_00"); // У тебя мое оружие, отдавай
AI_StopProcessInfos(self);
B_Attack(self,other,AR_NONE,1);
};

Upd: YAY Я проверил, все работает, Ксардас кинулся когда я одел дубину. Осталось только приделать забор оружия после поражения гг и все.(Хотя может тебе это не надо)
 
Последнее редактирование:
Сверху Снизу