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

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

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

MaGoth

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

Вложения

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

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275

Oxbow

Участник форума
Регистрация
22 Дек 2017
Сообщения
265
Благодарности
33
Баллы
200
Подскажите как прописать,чтобы НПС проиграл анимацию чтения в диалоге. Достаточно ли добавить между реплик
Daedalus:
AI_PlayAni(self,"T_HGUARD_2_STAND")
Или лучше как-то по другому?
И ещё, как сделать, чтобы при прочтении письма в дневник добавлялась запись?
И что прописать в кондишонс диалога НПС, чтобы он начинал диалог после прочтения героем письма.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
И что прописать в кондишонс диалога НПС, чтобы он начинал диалог после прочтения героем письма.
в функции чтения письма поставь метку, а в кондишион сделай проверку на это.

Daedalus:
func void UseHalvorMessage ()
{  
        Knows_Halvor = TRUE;
   
        var int nDocID;
       
        nDocID =     Doc_Create        ();
                    Doc_SetPages    (nDocID,  1);
                    Doc_SetPage        (nDocID,  0, "letters.TGA", 0);
                    Doc_SetFont        (nDocID, -1, FONT_Book);
                    Doc_SetMargins    (nDocID, -1, 50, 50, 50, 50, 1);
                    Doc_PrintLine    (nDocID,  0, ""                                                    );
                    Doc_PrintLine    (nDocID,  0, ""                                                    );
                    Doc_PrintLine    (nDocID,  0, ""                                                    );
                    Doc_PrintLine    (nDocID,  0, ""                                                    );
                    Doc_PrintLine    (nDocID,  0, ""                                                    );
                    Doc_PrintLine    (nDocID,  0, " Haltet euren Hintern unten Jungs! "                );
                    Doc_PrintLine    (nDocID,  0, " Die Miliz ist aufmerksam geworden."                );
                    Doc_PrintLine    (nDocID,  0, " Keine Ьberfдlle mehr, bis ich mich wieder melde!");
                    Doc_PrintLine    (nDocID,  0, ""                                                    );
                    Doc_PrintLine    (nDocID,  0, "     Halvor");
                    Doc_Show        (nDocID);
};


func int DIA_Halvor_MESSAGE_Condition ()
{  
    if (Knows_Halvor == TRUE)
    {
        return TRUE;
    };
};

Подскажите как прописать,чтобы НПС проиграл анимацию чтения в диалоге. Или лучше как-то по другому?

Daedalus:
 B_UseFakeScroll ();
Пост автоматически объединён:

И ещё, как сделать, чтобы при прочтении письма в дневник добавлялась запись?
Daedalus:
func void Use_RavensKidnapperMission_Addon ()
{  
     if (Use_RavensKidnapperMission_Addon_OneTime == FALSE)
     && (MIS_Addon_Vatras_WhereAreMissingPeople != 0)
     {
         Log_CreateTopic (TOPIC_Addon_WhoStolePeople, LOG_MISSION);
        Log_SetTopicStatus(TOPIC_Addon_WhoStolePeople, LOG_RUNNING);
        B_LogEntry (TOPIC_Addon_WhoStolePeople,"Jetzt habe ich es schriftlich. Raven, der ehemalige Erzbaron steckt hinter den Entfьhrungen der Bьrger von Khorinis. Raven hat sein Versteck irgendwo hinter den Bergen im Berge im Nordosten von Khorinis. Vatras sollte sich dieses Schrftstьck mal ansehen.");
        Use_RavensKidnapperMission_Addon_OneTime = TRUE;
    };
 

ElderGamer


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

Oxbow

Участник форума
Регистрация
22 Дек 2017
Сообщения
265
Благодарности
33
Баллы
200
Еще один вопросик первые два пункта
Daedalus:
         Log_CreateTopic (TOPIC_Addon_WhoStolePeople, LOG_MISSION);
        Log_SetTopicStatus(TOPIC_Addon_WhoStolePeople, LOG_RUNNING);
надо прописывать при каждой записи в дневник или только при запуске квеста?
Daedalus:
func void Use_RavensKidnapperMission_Addon ()
{
     if (Use_RavensKidnapperMission_Addon_OneTime == FALSE)
     && (MIS_Addon_Vatras_WhereAreMissingPeople != 0)
     {
         Log_CreateTopic (TOPIC_Addon_WhoStolePeople, LOG_MISSION);
        Log_SetTopicStatus(TOPIC_Addon_WhoStolePeople, LOG_RUNNING);
        B_LogEntry (TOPIC_Addon_WhoStolePeople,"Jetzt habe ich es schriftlich. Raven, der ehemalige Erzbaron steckt hinter den Entfьhrungen der Bьrger von Khorinis. Raven hat sein Versteck irgendwo hinter den Bergen im Berge im Nordosten von Khorinis. Vatras sollte sich dieses Schrftstьck mal ansehen.");
        Use_RavensKidnapperMission_Addon_OneTime = TRUE;
    };

Если квесту уже запущен достаточно ли прописать так:
Daedalus:
    if((Knows_Hoakim == FALSE) && (MIS_ChilledRevenge == LOG_Running))
    {
        B_LogEntry(TOPIC_ChilledRevenge,"Теперь у меня есть письменные доказательства того, что некий Хоаким, заплатил Петеру, чтобы он подставил Хартвина.");
        Knows_Hoakim = TRUE;
    };
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
А где объявляется эта переменная? Не могу найти.
Ответ на этот вопрос легко находится с помощью поиска по проекту в Соурсере. Если ты ещё не пользуешься этим инструментом и не знаешь, как он работает, рекомендую узнать и пользоваться. Это очень облегчает процесс работы со скриптами. Очень. :)

надо прописывать при каждой записи в дневник или только при запуске квеста?
Log_CreateTopic. Создаёт топик в дневнике с определённым названием. В простых квестах функция прописывается однократно, в диалоге, в котором квест стартует. Если же квест может стартовать из разных диалогов, например, с разными неписями, то функцию нужно прописывать в каждом таком диалоге.

Log_SetTopicStatus. Переносит отображение записей топика в один из разделов дневника (активные квесты, выполненные квесты и др.). При старте квеста записи помещаются в раздел "Текущие миссии", при завершении - в раздел "Выполненные миссии".

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

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
Приветствую всех.
Подскажите, пожалуйста, есть ли в Г2НВ параметр или т.п. который показывает/отслеживает "сложность запертого замка", а точнее необходимо количество поворотов отмычки, для его открытия?
 

redleha


Модостроитель
Регистрация
26 Фев 2008
Сообщения
735
Благодарности
665
Баллы
245
Приветствую всех.
Подскажите, пожалуйста, есть ли в Г2НВ параметр или т.п. который показывает/отслеживает "сложность запертого замка", а точнее необходимо количество поворотов отмычки, для его открытия?
Стандартными средствами это не реализовано. Только другими инструментами, с помощью которых можно посмотреть свойство воба.
На Икарусе это делалось методом получения ссылки на сундук(к примеру) и чтения его свойства (название не помню), которое содержит строчку LRRLRLRLRL. - Вроде так это в спейсере выглядит.
 

Oxbow

Участник форума
Регистрация
22 Дек 2017
Сообщения
265
Благодарности
33
Баллы
200
Давно хотел спросить как менять распорядок дня у НПС, но наткнулся у Андре на эти строчки:
Daedalus:
    B_StartOtherRoutine(Vino,"BUGSTHERE");
    B_StartOtherRoutine(LobartsBauer1,"BUGSTHERE");
    B_StartOtherRoutine(LobartsBauer2,"BUGSTHERE");

Нашел у НПС строчки ста таким распорядком:
Daedalus:
func void Rtn_BugsThere_952()
{
    TA_Stand_Drinking(8,0,22,0,"NW_FARM1_ENTRANCE_03");
    TA_Sleep(22,0,8,0,"NW_FARM1_INSTABLE_BED");
};
Это то, что надо для смены распорядка? То есть при смене распорядка ID не надо указывать?

А еще поиск по проекту нашел еще и это в файле B_Enter_NewWorld:
Daedalus:
        if((hero.guild == GIL_DJG) || (hero.guild == GIL_PAL))
        {
            Wld_InsertNpc(OrcWarrior_Lobart1,"NW_FARM1_PATH_CITY_SHEEP_04");
            Wld_InsertNpc(OrcWarrior_Lobart2,"NW_FARM1_PATH_CITY_SHEEP_04");
            Wld_InsertNpc(OrcWarrior_Lobart3,"NW_FARM1_PATH_CITY_SHEEP_04");
            Wld_InsertNpc(OrcWarrior_Lobart4,"NW_FARM1_PATH_CITY_SHEEP_01");
            Wld_InsertNpc(OrcWarrior_Lobart5,"NW_FARM1_PATH_CITY_SHEEP_01");
            Wld_InsertNpc(OrcWarrior_Lobart6,"NW_FARM1_PATH_CITY_SHEEP_01");
            B_StartOtherRoutine(Vino,"BugsThere");
            B_StartOtherRoutine(LobartsBauer1,"BugsThere");
            B_StartOtherRoutine(LobartsBauer2,"BugsThere");
Что это и зачем это нужно? И если я хочу поменять рутину для своих НПС мне тоже нужно прописывать код в файл B_Enter_NewWorld (просто там такая каша из IFов, она меня пугает)
 

ElderGamer


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

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

И если я хочу поменять рутину для своих НПС мне тоже нужно прописывать код в файл B_Enter_NewWorld
Это зависит от того, в какой момент требуется поменять распорядки. Смена распорядков может быть привязана к старту главы, к моменту вхождения в локацию, к моменту срабатывания диалога, к моменту прочтения документа... В теории, можно привязать смену распорядков и к другим событиям. Например, к посещению ГГ местности (триггер-скрипт или свидетель) или здания (заскрипованная дверь или свидетель).
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
Это зависит от того, в какой момент требуется поменять распорядки.
А возможно привязать это к наступлению определенного игрового дня? Насколько помню, там идёт просто порядковый отсчёт, к сожалению.
Пост автоматически объединён:

Стандартными средствами это не реализовано.
А возможно ли стандартными средствами/скриптами игры отследить просто кол-во успешных "поворотов отмычки", совершённых ГГ?
Например, чтобы при совершении более шести успешных "поворотов", если у ГГ менее 30 ловкости, то комбинация сбивается, т.е. проигрываются стандартные анимация и звук, когда ГГ совершает "неверный поворот", без поломки отмычки, после чего выводится сообщение: "Вам не хватает ловкости".
 

ElderGamer


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

redleha


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


А возможно ли стандартными средствами/скриптами игры отследить просто кол-во успешных "поворотов отмычки", совершённых ГГ?
Например, чтобы при совершении более шести успешных "поворотов", если у ГГ менее 30 ловкости, то комбинация сбивается, т.е. проигрываются стандартные анимация и звук, когда ГГ совершает "неверный поворот", без поломки отмычки, после чего выводится сообщение: "Вам не хватает ловкости".
Врать не буду, но по-моему, единственное , что было вынесено в скрипты - это среди G-скриптов. Вроде даже G_picklock. Могу ошибаться, поправьте.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
Врать не буду, но по-моему, единственное , что было вынесено в скрипты - это среди G-скриптов. Вроде даже G_picklock. Могу ошибаться, поправьте.
func void PLAYER_MOB_MISSING_LOCKPICK() { };
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
Что-то я не нахожу такого в Gothic Sourcer, среди скриптов неоф. обновления.
1668352100296.png

в любом случае тебе этой функции будет мало для реализации твоей задумки.
 

Вложения

  • 1668351970461.png
    1668351970461.png
    30,9 KB · Просмотры: 5

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
Приветствую всех вновь.
Подскажите, пожалуйста, как корректно прописать в скриптах неоф. обновления требования к ловкости, при обучении взлому?
Такой вариант не сработал:
Daedalus:
func int B_TeachThiefTalent(var C_Npc slf,var C_Npc oth,var int talent)
{
    var int kosten;
    var int sPerm_DEX_KTS;
    kosten = B_GetLearnCostTalent(oth,talent,1);
    sPerm_DEX_KTS = hero.attribute[ATR_DEXTERITY] - ATR_TempBonus[ATR_DEXTERITY];
    
    if((talent != NPC_TALENT_PICKLOCK) && (talent != NPC_TALENT_SNEAK) && (talent != NPC_TALENT_ACROBAT) && (talent != NPC_TALENT_PICKPOCKET))
    {
        Print(PRINT_WrongParameter);
        return FALSE;
    };
    if(oth.lp < kosten)
    {
        PrintScreen(PRINT_NotEnoughLP,-1,-1,FONT_ScreenSmall,2);
        B_Say(slf,oth,"$NOLEARNNOPOINTS");
        return FALSE;
    };
    oth.lp -= kosten;
    if(talent == NPC_TALENT_PICKLOCK)
    {
        if(sPerm_DEX_KTS < 29)
        {
            concatText = "Не хватает ловкости для дальнейшего обучения";
            B_PrintPlayerMiddle(oth,concatText);
            return FALSE;
        };
        Npc_SetTalentSkill(oth,NPC_TALENT_PICKLOCK,1);
        PrintScreen(PRINT_LearnPicklock,-1,-1,FONT_Screen,2);
        return TRUE;
    };
    if(talent == NPC_TALENT_SNEAK)
    {
        Npc_SetTalentSkill(oth,NPC_TALENT_SNEAK,1);
        PrintScreen(PRINT_LearnSneak,-1,-1,FONT_Screen,2);
        return TRUE;
    };
    if(talent == NPC_TALENT_ACROBAT)
    {
        Npc_SetTalentSkill(oth,NPC_TALENT_ACROBAT,1);
        PrintScreen(PRINT_LearnAcrobat,-1,-1,FONT_Screen,2);
        return TRUE;
    };
    if(talent == NPC_TALENT_PICKPOCKET)
    {
        Npc_SetTalentSkill(oth,NPC_TALENT_PICKPOCKET,1);
        PrintScreen(PRINT_LearnPickpocket,-1,-1,FONT_Screen,2);
        Log_CreateTopic(Topic_PickPocket,LOG_NOTE);
        return TRUE;
    };
    return FALSE;
};
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
тебе надо делать эту проверку до того как будет происходить вычитание ЛП. так же сразу лучше там же прописать требования и для воровства, подкрадывания и прочего.


былостало

Daedalus:
oth.lp -= kosten;
    if(talent == NPC_TALENT_PICKLOCK)
    {
        if(sPerm_DEX_KTS < 29)
        {
            concatText = "Не хватает ловкости для дальнейшего обучения";
            B_PrintPlayerMiddle(oth,concatText);
            return FALSE;
        };
        Npc_SetTalentSkill(oth,NPC_TALENT_PICKLOCK,1);
        PrintScreen(PRINT_LearnPicklock,-1,-1,FONT_Screen,2);
        return TRUE;
    };
Daedalus:
    if(talent == NPC_TALENT_PICKLOCK)
    {
        if(sPerm_DEX_KTS < 29)
        {
            concatText = "Не хватает ловкости для дальнейшего обучения";
            B_PrintPlayerMiddle(oth,concatText);
            return FALSE;
        };
    };
    // у героя отнимается ЛП!!!
    oth.lp -= kosten;
    if (talent == NPC_TALENT_PICKLOCK)
    {
        Npc_SetTalentSkill(oth,NPC_TALENT_PICKLOCK,1);
        PrintScreen(PRINT_LearnPicklock,-1,-1,FONT_Screen,2);
        return TRUE;
    };
 
Последнее редактирование:
Сверху Снизу