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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток!
    Стартовал новый литературный конкурс от "Ордена Хранителей" - "Пираты Миртанского моря".
    Каждый может принять в нём участие и снискать славу и уважение, а в случае занятия призового места ещё и получить награду. Дерзайте
  • Дорогие друзья, год подходит к концу, и пришло время подвести его итоги и наградить достойных

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

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

Oxbow

Участник форума
Регистрация
22 Дек 2017
Сообщения
266
Благодарности
33
Баллы
200
Не так. AR_ - это причина атаки. Attack Reason
Это влияет на окончание боя и память о нём.
None - просто подраться.
GuardStopsIntruder - причиной является попытка пройти охрану. И охранники убьют , если победит. Но точно запомнят.
А есть где-то список этих AR? Например, если я хочу, чтобы дрались насмерть.
 

MEG@VOLT

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

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.409
Благодарности
3.239
Баллы
525
вот это должно сработать (код ниже 01)?
Не совсем. Тут следует учесть особенность работы движка при обработке инстанций диалогов. Если просто прописать вызов функции старта атаки для третьего непися в инстанции диалога, то непись будет переведён в состояние атаки сразу же после старта диалога. ГГ будет болтать о чём-то с одним неписем, а другой непись в это время вытащит саблю, может быть, что-то грозное пробурчит и будет терпеливо ждать, пока диалог закончится. Согласись, выглядит хреново.

Начинать атаку после завершения диалога может только собеседник ГГ. Также он может по завершению диалога быть принудительно переведён в иное состояние, и этим следует воспользоваться для реализации описанных тобой ситуаций. Требуется написать особое ZS-состояние для непися собеседника ГГ. ZS-состояние обычно состоит из трёх функций (стартовая, циклическая, завершающая). Но в данном случае, думаю, будет достаточно только стартовой функции. Во всяком случае, в Г1 движок такое проглатывает. Что нужно сделать. По пунктам. В инстанции диалога прописать не старт атаки, а перевод собеседника ГГ в особое состояние. Функцию использовать ту же, что для старта атаки в функции B_Attack - AI_StartState, если не напутал с названием. Написать функцию состояния типа void c названием, начинающимся с "ZS_". Например, func void ZS_Npc1Start Attack(). В этой функции прописать старт атаки для нужных неписей с указанием целей и причин атаки.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
Не совсем. Тут следует учесть особенность работы движка при обработке инстанций диалогов.

вариант из MDK от пираний
Daedalus:
func void DIA_Rumbold_HALLO_ENDAttack ()
{
    AI_StopProcessInfos (self);
    B_Attack (self, other, AR_KILL, 1);

    if (Hlp_IsValidNpc (Rick))
    && (!C_NpcIsDown (Rick))
    {
        B_Attack (Rick, other, AR_KILL, 1);
    };
};

MDK пираньиулучшенная с использованием AI_StartState по схеме ElderGamer
Daedalus:
func void DIA_Rumbold_HALLO_Attack ()
{
    AI_Output (other, self, "DIA_Rumbold_HALLO_Attack_15_00"); //Ich bin euer schlimmster Albtraum.
    AI_Output (self, other, "DIA_Rumbold_HALLO_Attack_10_01"); //Du bist ein toter Mann!

    Info_ClearChoices    (DIA_Rumbold_HALLO);
    Info_AddChoice    (DIA_Rumbold_HALLO, DIALOG_ENDE, DIA_Rumbold_HALLO_ENDAttack );
};
Daedalus:
func void DIA_Rumbold_HALLO_Attack ()
{
    AI_Output (other, self, "DIA_Rumbold_HALLO_Attack_15_00"); //Ich bin euer schlimmster Albtraum.
    AI_Output (self, other, "DIA_Rumbold_HALLO_Attack_10_01"); //Du bist ein toter Mann!

    Info_ClearChoices    (DIA_Rumbold_HALLO);
    AI_StartState    (self, DIA_Rumbold_HALLO_ENDAttack ,1,"");
};
 
Последнее редактирование:

Beowulf

Участник форума
Регистрация
21 Ноя 2010
Сообщения
1.953
Благодарности
1.487
Баллы
465
Scarecrow, посмотрел твои файлы - да, музыка проигрывается единожды. зацикливание через скрипты и спейсер не помогли. После посмотрел это урок - скорее всего при создании сегмента упущен этот момент:
В левой части окна по правой кнопке мыши вызовите свойства вашего сегмента - Properties. Здесь можно изменить его длину - Length, в закладке Loop установите галочку Infinite, т.е. зациклить произведение в бесконечный цикл.
 

Oxbow

Участник форума
Регистрация
22 Дек 2017
Сообщения
266
Благодарности
33
Баллы
200
Подскажите как работает рутина TA_Repair_Hut
Не могу в Спейсере найти мобов с Repair в названии.
 

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.222
Благодарности
3.449
Баллы
485
Не могу в Спейсере найти мобов с Repair в названии.
REPAIR_PLANK

Учти, что эти объекты невидимы (showVisual:FALSE) и выделить их можно только из списка объектов:
1668520577416.png
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
Подскажите как работает рутина TA_Repair_Hut
нпс "ремонтирует". бывает что не ремонтирует :)

Код:
FUNC int ZS_Repair_Hut_Loop ()
{
    // ------ Hдmmern ------
    if (!C_BodyStateContains(self, BS_MOBINTERACT_INTERRUPT))
    && (Wld_IsMobAvailable(self,"REPAIR"))
    {
        AI_UseMob (self, "REPAIR", 1);
    };
    
    // ------ Random-Ani beim Hдmmern ------
    if (Npc_GetStateTime(self) > 5)
    && (C_BodyStateContains(self, BS_MOBINTERACT_INTERRUPT))
    {
        var int zufall; zufall = Hlp_Random(100); 
    
           if (zufall < 50)
        {
            AI_PlayAniBS (self, "T_REPAIR_RANDOM_1", BS_MOBINTERACT_INTERRUPT);
        };
        
        Npc_SetStateTime (self, 0);
    };
    
    return LOOP_CONTINUE;
};
 

Oxbow

Участник форума
Регистрация
22 Дек 2017
Сообщения
266
Благодарности
33
Баллы
200
Подскажите, есть в игре проверка на избиение?
Я знаю, что есть проверка на убийство/смерть Npc_IsDead(Vino). Ну, а если я хочу, добавить задание избить НПС, но не убивать, как это можно сделать?
 

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.222
Благодарности
3.449
Баллы
485
Подскажите, есть в игре проверка на избиение?
Я знаю, что есть проверка на убийство/смерть Npc_IsDead(Vino). Ну, а если я хочу, добавить задание избить НПС, но не убивать, как это можно сделать?

Daedalus:
if(!Npc_IsDead(Vino))
{
    if(Vino.aivar[AIV_DefeatedByPlayer] == TRUE)
    {
        //Вино жив и избит игроком
    };
};
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
добавлю пять копеек: констант две и они в какой то степени друг друга дублирует, с той лишь разницей что AIV_VictoryXPGiven так же учитывает избиение НПС напарником ГГ, а AIV_DefeatedByPlayer только героем.
Daedalus:
    // ------ XP ------
    if ( Npc_IsPlayer(other) || (other.aivar[AIV_PARTYMEMBER]==TRUE) )
    && (self.aivar[AIV_VictoryXPGiven] == FALSE)
    {
        B_GivePlayerXP (self.level * XP_PER_VICTORY);
        
        self.aivar[AIV_VictoryXPGiven] = TRUE;
    };

Daedalus:
    if (self.guild < GIL_SEPERATOR_HUM)
    && (Npc_IsPlayer(other))                                
    {
        self.aivar[AIV_DefeatedByPlayer] = TRUE; //wird nur hier gesetzt, nie verдndert!
        self.aivar[AIV_LastFightAgainstPlayer] = FIGHT_LOST;
        
        if (self.aivar[AIV_LastPlayerAR] == AR_NONE)
        && (self.aivar[AIV_DuelLost] == FALSE) //also nur EINMAL
        && (self.guild == GIL_SLD)
        {
            Sld_Duelle_gewonnen = Sld_Duelle_gewonnen + 1;
            self.aivar[AIV_DuelLost] = TRUE;
        };
    
        if (self.aivar[AIV_ArenaFight] == AF_RUNNING)
        {
            self.aivar[AIV_ArenaFight] = AF_AFTER;
        };
    };
 

Beowulf

Участник форума
Регистрация
21 Ноя 2010
Сообщения
1.953
Благодарности
1.487
Баллы
465
Подскажите, есть в игре проверка на избиение?
Я знаю, что есть проверка на убийство/смерть Npc_IsDead(Vino). Ну, а если я хочу, добавить задание избить НПС, но не убивать, как это можно сделать?
Дополню камрадов: не всякого нпс можно просто избить. Сразу к праотцам уходят следующие категории нпс-людей (достаточно одного из условий)
1) В скриптах нпс есть такая строка
Daedalus:
aivar[AIV_DropDeadAndKill] = TRUE;
2) Нпс принадлежит к гильдии "Бандит"
3) Нпс принадлежит к гильдии "Ищущий"
 

Oxbow

Участник форума
Регистрация
22 Дек 2017
Сообщения
266
Благодарности
33
Баллы
200
Подскажите где можно отредактировать изначальное наполнение инвентаря ГГ.
И можно как-то отредактировать в Сорсере состав катсцен, а то в сборке которую я компилирую на основе декомпилированных скриптов нет первой катсцены (ту, где Ксардас призывает Братка).
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.409
Благодарности
3.239
Баллы
525
Подскажите где можно отредактировать изначальное наполнение инвентаря ГГ.
В инстанции непися ему в инвентарь обычно кладут всё, что нужно. Для торговцев существует иное решение, по понятным причинам.

можно как-то отредактировать в Сорсере состав катсцен
Поиск по проекту. Функция PlayVideo. Если я правильно понял вопрос.
 

Oxbow

Участник форума
Регистрация
22 Дек 2017
Сообщения
266
Благодарности
33
Баллы
200
Поиск по проекту. Функция PlayVideo. Если я правильно понял вопрос.
Daedalus:
func void B_Extro_Avi()
{
    if((Npc_IsDead(PC_Thief_DI) == FALSE) && (Npc_IsDead(PC_Fighter_DI) == FALSE))
    {
        DiegAndGornAreOnboard = TRUE;
    };
    PlayVideo("Extro_Xardas.BIK");
    PlayVideo("Credits_Extro.BIK");
    PlayVideo("Credits2.BIK");
    if(DiegAndGornAreOnboard == TRUE)
    {
        PlayVideo("Extro_AllesWirdGut.BIK");
    };
    ExitSession();
};

Вроде эта так катсцена самая первая? Где лежат эти файлы?

В инстанции непися ему в инвентарь обычно кладут всё, что нужно. Для торговцев существует иное решение, по понятным причинам.

Я имею ввиду, где можно отредактировать тему с тем, что в начале игры у ГГ все виды лута (оружие, доспехи) и 10000 золота, Как это убрать или наоборот добавить новые свои доспехи?
 
Последнее редактирование:

Oxbow

Участник форума
Регистрация
22 Дек 2017
Сообщения
266
Благодарности
33
Баллы
200
это финальное видео.
Нашел правильное, оно было в Startup и почему-то закомменчено.
Пост автоматически объединён:

Подскажите как работает функция Npc_GetNearestWP и почему нельзя сделать вот так:
Daedalus:
func int dia_Peter_Meet_condition()
{
    if((PeterGoMeet == TRUE) && (Npc_GetNearestWP (Peter) == "NW_CITY_HABOUR_11"))
    {
        return TRUE;
    };
};
 
Последнее редактирование:

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.222
Благодарности
3.449
Баллы
485
почему нельзя сделать вот так:
Результатом выполнения функции Npc_GetNearestWP(npc) является строка с названием точки, ближайшей к npc. Для сравнения строк string следует использовать только функцию Hlp_StrCmp(text1,text2):

Daedalus:
func int dia_Peter_Meet_condition()
{
    if((PeterGoMeet == TRUE) && Hlp_StrCmp(Npc_GetNearestWP(Peter),"NW_CITY_HABOUR_11"))
    {
        return TRUE;
    };
};

Оператор == используется только для сравнения целых чисел int.
 

Сахар

Участник форума
Регистрация
5 Янв 2017
Сообщения
62
Благодарности
47
Баллы
180
Каким скриптом редактируется в Г2 количество полученного опыта за NPC людей, если строка "level" в их инстанциях отсутствует?
 

LikerGothic


Модостроитель
Регистрация
11 Фев 2017
Сообщения
1.661
Благодарности
2.486
Баллы
380
Сахар, level есть всегда, оно наследуется из прототипа либо установлено в 0, либо в скриптах далее идет проверка если 0, то подменяется значение в функции получения опыта за драку/убийство, т.е в zs_dead или zs_unconscious
 
Сверху Снизу