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

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

Вопросы по скриптингу

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
  • Первое сообщение
  • #1
Прежде чем задавать вопросы, ознакомьтесь с документацией..
1) Читать онлайн
2) Архив с офлайн-версией(chm) во вложении
 

Вложения

  • Vam_tutor.rar
    171,6 KB · Просмотры: 572
Последнее редактирование модератором:

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.113
Благодарности
5.605
Баллы
910
Я тоже проверил: не добавляется диалог без новой игры. Ты точно новую игру не начинал, а то на скрине Ксардас в стартовой точке стоит?
Ну я проверил на давнем сохранении, диалог есть.
1615994135499.png
1615994152265.png
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.080
Благодарности
1.899
Баллы
290

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.080
Благодарности
1.899
Баллы
290
Хз, короче, у меня не добавляется этот диалог без лишних телодвижений. Пусть кто-нибудь третий проверит твой способ...
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
555
Благодарности
142
Баллы
220
STARK, можно с юнионом cохраниться при SaveDATinASCII = 1 в SystemPack.ini, тогда можно будет SAVEDAT.SAV в текстовом редакторе модифицировать.
Сделал так, добавил переменную диалога, но он так и не появился в игре.
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.113
Благодарности
5.605
Баллы
910
Хз, короче, у меня не добавляется этот диалог без лишних телодвижений. Пусть кто-нибудь третий проверит твой способ...
Я это проверяю на выключенных сохранялок в ANSI
[GAME]
SaveGameToANSI = 0
SaveDATinASCII = 0

Так то даже понятия не имею, почему у тебя не робит.
 

Xeдин


Модостроитель
Регистрация
3 Дек 2008
Сообщения
1.442
Благодарности
1.972
Баллы
365
У меня тоже только с новой игрой. Проверял на чистой Г2НВ, сделал старт новой игры, сохранился. Вышел, добавил скрипт в Autorun, парсер последний. Загрузил сохранку, надписи нет. Начал новую игру, надпись появилась..
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.080
Благодарности
1.899
Баллы
290

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.113
Благодарности
5.605
Баллы
910
Пусть Гратт скажет свое слово.
Для Гратта Gratt Если в чужом сохранении появится диалог, значит ок.
Диалог у Ксардаса - Боже, это же ксардас!

Совсем забыл, пересоздание базы диалогов у меня шло от Ninja...
 
Последнее редактирование:

MaGoth

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

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
555
Благодарности
142
Баллы
220
Добавил 2 диалога.
Daedalus:
instance Info_CorKalom_Follow(C_Info)
{
    npc = GUR_1201_CorKalom;
    condition = Info_CorKalom_Follow_Condition;
    information = Info_CorKalom_Follow_Info;
    permanent = 0;
    important = 1;
};

func int Info_CorKalom_Follow_Condition()
{
    if(Npc_KnowsInfo(hero,Info_CorAngar_FindHerb))
    {
        return TRUE;
    };
};

func void Info_CorKalom_Follow_Info()
{
    AI_Output(self,hero,"Info_CorKalom_Follow_10_01");    //Иди за мной.
    AI_StopProcessInfos(self);
    B_ExchangeRoutine(GUR_1201_CorKalom,"Temple");
};
Daedalus:
instance Info_CorKalom_FindHerbs(C_Info)
{
    npc = GUR_1201_CorKalom;
    condition = Info_CorKalom_FindHerbs_Condition;
    information = Info_CorKalom_FindHerbs_Info;
    permanent = 0;
    important = 1;
};

func int Info_CorKalom_FindHerbs_Condition()
{
    if(Npc_KnowsInfo(hero,Info_CorKalom_Follow))
    {
        if(Npc_GetDistToWP(self,"PSI_TEMPLE_STAIRS_4") < 1000)
        {
            return 1;
        };
    };
  
};

func void Info_CorKalom_FindHerbs_Info()
{
    AI_Output(self,hero,"Info_CorKalom_FindHerbs_10_01");    //text
    AI_Output(self,hero,"Info_CorKalom_FindHerbs_10_02");    //text
    AI_Output(self,hero,"Info_CorKalom_FindHerbs_10_03");    //text
    AI_StopProcessInfos(self);
    B_ExchangeRoutine(GUR_1201_CorKalom,"start");
    B_ExchangeRoutine(TPL_1406_Templer,"start");
};
В первом диалоге Кор Галом говорит с нами после реплики Кор Ангара и ведёт в указанную точку. Это работает. Но, так уж вышло, что Кор Галом стоит к нам спиной, и если быть у его спины, диалог не начнется. Вбегаешь в поле его зрения и диалог начинается. В то же время, имеются примеры, когда НПС начинает говорить с тобой, когда подходишь к нему со спины. Например:
Daedalus:
instance Info_Gorn_RUINWAIT(C_Info)
{
    npc = PC_Fighter;
    nr = 2;
    condition = Info_Gorn_RUINWAIT_Condition;
    information = Info_Gorn_RUINWAIT_Info;
    important = 1;
    permanent = 0;
};


func int Info_Gorn_RUINWAIT_Condition()
{
    if(FindFocus_Gorn == 1)
    {
        if(Npc_GetDistToWP(self,"OW_PATH_ABYSS_4") < 1000)
        {
            return TRUE;
        };
    };
};

func void Info_Gorn_RUINWAIT_Info()
{
    AI_SetWalkMode(self,NPC_WALK);
    AI_GotoNpc(self,hero);
    AI_Output(self,other,"Info_Gorn_RUINWAIT_09_01");    //Привет! Как видишь, этот мир тесен, и колония не является исключением.
    AI_Output(self,other,"Info_Gorn_RUINWAIT_09_02");    //Все время натыкаешься на своих знакомых.
};
Никаких очевидных отличий я не заметил. Правда, я не знаю, что за параметр nr = 2.

Второй диалог с Кор Галомом должен начаться по его прибытию к точке. Но, вопреки important = 1, диалог не начинается, и чтобы он начался, нужно заговорить с Кор Галомом.
Хочется устранить эти отклонения, чтоб первый диалог начинался и со спины, а второй чтоб начинался по прибытию к точке. Может, кто что подскажет?

Slavemaster, может получится сделать плагин, который будет подгружать к старому сейву новые вейпоинты (а может и другие объекты) из модифицированного зен-файла?
 
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Правда, я не знаю, что за параметр nr = 2.
Этот параметр учитывается при построении очереди опций диалога в окне. Чем меньше номер, тем выше опция.

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

Но обычно у неписей активны такие чувства, как "зрение" и "слух". Это означает, что контролируется не вся зона вокруг непися, а только передняя полусфера. Там, где непись "видит". Можно активировать ещё и "обоняние". В этом случае будет контролироваться вся зона, и спереди, и сзади.

Хочется устранить эти отклонения, чтоб первый диалог начинался и со спины
Лучше всё-таки не "со спины", а "спереди". Можно по ходу диалога с Ангаром принудительно повернуть Галома к ГГ. Мол, услышал интересующую его фразу и обернулся. Ещё надёжнее будет, если перевести Галома в состояние ZS_Guard. Тогда он сам повернётся к ГГ.

B_ExchangeRoutine(GUR_1201_CorKalom,"Temple");
Если в диалоге нужно изменить распорядок владельца диалога (на него указывает идентификатор self), то следует использовать для этого функцию Npc_ExchangeRoutine.
 
Последнее редактирование:

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
555
Благодарности
142
Баллы
220
ElderGamer, спасибо, твои советы решили обе проблемы.
AI_StartState(GUR_1201_CorKalom, ZS_Guard, 1, ""); - так правильно? Ну, оно работает, но мне интересно, для чего используются третий и четвёртый параметры.
После замены во втором диалоге на Npc_ExchangeRoutine, диалог после прибытия на место стал запускаться.
 
Последнее редактирование:

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.113
Благодарности
5.605
Баллы
910
FUNC VOID AI_StartState (VAR C_NPC self, VAR FUNC what, VAR INT stateBehaviour, VAR STRING wpName)
// переводит НПС self в соответствующее состояние, описанное функцией what,
// где stateBehaviour = 0 – переход в новое состояние осуществляется немедленно,
// 1 – переход в новое состояние осуществляется после полного завершения текущего состояния,
// wpName– имя WP точки смены состояния (если "", то состояние изменяется на месте расположения НПС).

То есть, если указывать 1, то NPC завершит выполнять свой распорядок дня и приступит к новому правильно, без каких-либо визуальных багов.
Если поставишь 0, то можно наблюдать баги, например NPC может вместо правильного перехода в стоячее положение после сидения на стуле резко вскочить и побежать.
С WP описания достаточно.

Если что, описание всех внешних оригинальных функции есть либо в external.d, либо в GS IntFuncGothic1/2
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.636
Баллы
625
Пусть Гратт скажет свое слово.
Для Гратта Gratt Если в чужом сохранении появится диалог, значит ок.
Диалог у Ксардаса - Боже, это же ксардас!
Чтобы заинжектить диалог в другое сохранение, надо его стриггерить. Покурю и сделаю чтобы добавленные экстендером диалоги можно было включить где угодно.
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.113
Благодарности
5.605
Баллы
910
Чтобы заинжектить диалог в другое сохранение, надо его стриггерить. Покурю и сделаю чтобы добавленные экстендером диалоги можно было включить где угодно.
Почему тогда у меня робит без этого триггера? Я честно без понятия:confused:
Ну пофиг так-то.
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
555
Благодарности
142
Баллы
220
Есть код, в котором герой должен повернуться к собеседнику. Но почему-то это не работает.
Daedalus:
    AI_Output(self,hero,"Info_CorKalom_FindHerbs_Success_10_02");    //text
    
    B_StartUseMob(self,"LAB");
    AI_TurnToNpc(other,self);       //не работает
    AI_Wait(self,10);
    B_StopUseMob(self,"LAB");
    AI_Wait(self,0.5);
    
    AI_GotoNpc(self,other);
    AI_TurnToNpc(self,other);
    AI_TurnToNpc(other,self);      //не работает
    
    AI_Output(self,hero,"Info_CorKalom_FindHerbs_Success_10_03");    //text
 
Сверху Снизу