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

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

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

MaGoth

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

Вложения

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

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.131
Благодарности
5.628
Баллы
910
Можешь показать, что находится в очереди у Hero?
В режиме марвина нажимаешь букву G и начинаешь диалог
Может команда не попадает в очередь Hero
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
556
Благодарности
142
Баллы
220
N1kX,
EV_WAITTILLEND
EV_TURNTOVOB
EV_TURNTOVOB
EV_WAITTILLEND

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

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.636
Баллы
625
ElderGamer если не ошибаюсь ты когда-то обращал внимание на то, что функция поворота идет мимо очереди AI?
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
556
Благодарности
142
Баллы
220
Сочетанием
AI_WaitTillEnd(other,self);
AI_TurnToNpc(other,self);
добился того, чтобы команда выполнялась в нужный момент, но команда просто проходит по очереди, ничего не делая.
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.131
Благодарности
5.628
Баллы
910
N1kX,
EV_WAITTILLEND
EV_TURNTOVOB
EV_TURNTOVOB
EV_WAITTILLEND

Похоже, проблема в том, что оба разворота срабатывают сразу же после первой фразы, а не так, как они стоят в очереди.
Попробуй так. В моде, который сейчас перевожу, 1 сцену делал с молитвой героя и другого НПС, тоже были проблемы в очередях.
Daedalus:
AI_Output(self,hero,"Info_CorKalom_FindHerbs_Success_10_02");    //text
  
    B_StartUseMob(self,"LAB");
    AI_TurnToNpc(other,self);
  
    AI_Wait(other,1); //разделить очередь у Hero
  
    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
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
556
Благодарности
142
Баллы
220
Попробуй так. В моде, который сейчас перевожу, 1 сцену делал с молитвой героя и другого НПС, тоже были проблемы в очередях.
Попробовал. Команда AI_TurnToNpc(other,self); упорно не хочет работать.
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.636
Баллы
625
Не торопись, щас мы элдера выслушаем. Он чето находил похожее, будем фиксить в случае его
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.863
Благодарности
6.742
Баллы
1.625
Почему
AI_TurnToNpc(other,self);
?
Кого пытаешься повернуть к кому?
Если ГГ, то вот так надо:
AI_TurnToNpc(hero,self);
Потому что other - это другой, это не обязательно должен быть ГГ.
Если другого нужно повернуть то:
AI_TurnToNpc(NON_100_XARDAS,self);
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.131
Благодарности
5.628
Баллы
910
Попробуй такой вариант, немного не красиво.
И да кстати, в Г1 почему-то в диалогах other это не игрок для функции AI, нужно назначать напрямую hero
Daedalus:
FUNC void  GUR_1201_CorKalom_test_Info()
{
    AI_Output (other, self,"GUR_1201_CorKalom_test_15_00"); //Test.
    AI_WaitTillEnd(self,other);
    
    AI_UseMob         (self,    "LAB",    1);
    AI_Wait(self,10.0);
    AI_UseMob         (self,    "LAB",    -1);
    
    AI_GotoNpc(self,other);
    
    AI_WaitTillEnd(hero,self);
    
    AI_TurnToNpc(hero,self);
    AI_TurnToNpc(self,hero);
    
    AI_Output(self,hero,"GUR_1201_CorKalom_test_10_01");    //text
};
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
556
Благодарности
142
Баллы
220
MEG@VOLT, результат тот же. Как я понял, в стандартном диалоге героя с кем-то other = hero.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.863
Благодарности
6.742
Баллы
1.625
И да кстати, в Г1 почему-то в диалогах other это не игрок для функции AI, нужно назначать напрямую hero
Потому, что other - это не ГГ в обеих частях. Озер может быть хоть кем, смотря как self воспримет ГГ или другого НПЦ.
Во время начала диалога СЕЛФ поворачивается к ГГ, и не отворачивается от него, по этому ОЗЕР тут считается типа ГГ
Если СЕЛФа повернуть к другому НПЦ во время диалога, и продолжать
AI_TurnToNpc(self,NON_100_XARDAS);
AI_Output(self,other,"GUR_1201_CorKalom_test_10_01"); //text
То СЕЛФ будет обращаться уже к Ксардасу, как к ОЗЕРу... И после фразы не будет поворачивать голову к ГГ
По этому правильней во время диалогов писать именно
AI_Output(self,hero,"GUR_1201_CorKalom_test_10_01"); //text
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.863
Благодарности
6.742
Баллы
1.625

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
556
Благодарности
142
Баллы
220
N1kX, MEG@VOLT, попробовал - не работает.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.863
Благодарности
6.742
Баллы
1.625
М... До скриптов завтра доберусь, посмотрю. Если кто раньше не ответит)
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
556
Благодарности
142
Баллы
220
Пока остановился на таком варианте:
Daedalus:
    B_StartUseMob(self,"LAB");
    AI_WaitTillEnd(other,self);
    AI_GotoNpc(other,self);      //Вместо AI_TurnToNpc(hero,self);
    AI_Wait(self,10);
    B_StopUseMob(self,"LAB");
    AI_Wait(self,0.5);
    
    AI_GotoNpc(self,other);
    AI_TurnToNpc(self,other);
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Похоже, проблема в том, что оба разворота срабатывают сразу же после первой фразы, а не так, как они стоят в очереди.
И да, и нет. Оба поворота действительно срабатывают сразу. Дело в том, что по результатам выполнения функции диалога формируется не одна очередь AI-команд, а две очереди (или больше) - одна для идентификатора self, другая для идентификатора other. В случае фраз диалога, движок автоматически создаёт "перемычки" между этими очередями. Пока говорит один, другой ждёт окончания этого процесса. А вот в случае прочих AI-команд, таких "перемычек" может и не быть, обе очереди могут выполняться, независимо друг от друга. Для создания нужных "перемычек" используется функция AI_WaitTillEnd. Впрочем, и она работает не всегда так, как хотелось бы.

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

Это годный вариант. :)
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
556
Благодарности
142
Баллы
220
Это годный вариант. :)
Но не всегда работает как надо. Например, если начал диалог с Галомом близко к столу, то Герой не побежит к нему командой AI_GotoNpc, и следовательно не повернётся.
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
556
Благодарности
142
Баллы
220
Миссия - оживить Ю'Бериона:)
Код диалога:
Daedalus:
    YBerion = Hlp_GetNpc(GUR_1200_YBerion);
    AI_Wait(self,0.5);
    AI_Output(self,other,"GUR_1202_CorAngar_DEATH_Info_08_10");    //Мастер, вы в порядке?
    
    YBerion.flags = 0;
    Npc_ChangeAttribute(YBerion,ATR_HITPOINTS,YBerion.attribute[ATR_HITPOINTS_MAX]);
        
    AI_WaitTillEnd(YBerion,self);    
    AI_Standup(YBerion);
    B_ExchangeRoutine(GUR_1200_YBerion,"Stand");
    AI_Output(GUR_1200_YBerion,hero,"GUR_1202_CorAngar_DEATH_Info_12_11");    //Да, я в порядке, но я очень устал. Проводи меня в покои.
Добавленный распорядок:
Daedalus:
func void Rtn_Stand_1200()
{
    TA_Stand(0,0,12,0,"PSI_TEMPLE_IN_05");
    TA_Stand(12,0,24,0,"PSI_TEMPLE_IN_05");
};
Есть пара проблем. Ю'Берион встаёт, распорядок применяется. Начинаю с ним диалог, жму выйти из диалогов, и он опять падает как мёртвый. Почему, не пойму.
Еще одна проблема в этой строке:
AI_Output(GUR_1200_YBerion,hero,"GUR_1202_CorAngar_DEATH_Info_12_11"); //Да, я в порядке.
В таком виде диалог не показывается. Как правильно вывести диалог третьего лица в диалоге двух других?
 

MaGoth

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

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.863
Благодарности
6.742
Баллы
1.625
subTitlesPlayer=1
subTitlesAmbient=1
subTitlesNoise=1
 
Сверху Снизу