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

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

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

MaGoth

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

Вложения

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

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
надо править функции книг.
Daedalus:
func int C_RaiseTalentByPermBonus(var C_Npc npc,var int talent,var int value)
{
    if (sPerm_Attr_KTS_Hero_talent(talent, value) == ATR_STRENGTH)
    {
        PrintScreen("Не хватает силы для дальнейшего обучения.",-1,-1,FONT_Screen,2);
        return FALSE;
    };
 
    if (sPerm_Attr_KTS_Hero_talent(talent,percent) == ATR_DEXTERITY)
    {
        PrintScreen("Не хватает ловкости для дальнейшего обучения.",-1,-1,FONT_Screen,2);
        return FALSE;
    };

    B_RaiseTalentByPermBonus(npc,talent,value);

    return TRUE;
};


    func void UseEinhandBuch()
    {

        if (Lerne_Einhand == FALSE)
        && (C_RaiseTalentByPermBonus(self,NPC_TALENT_1H,5) == TRUE)
        {
            B_RaiseTalentByPermBonus(self,NPC_TALENT_1H,5);
            Lerne_Einhand = TRUE;
        };
        var int nDocID;

        nDocID =     Doc_Create        ()              ;                           
                    Doc_SetPages    ( nDocID,  2 );                   

                    Doc_SetPage     ( nDocID,  0, "Book_Red_L.tga"  , 0     );
                    Doc_SetPage     ( nDocID,  1, "Book_Red_R.tga" , 0    );

                

                     Doc_SetMargins    ( nDocID,  0,  275, 20, 30, 20, 1           );  //  0 -> margins are in pixels
                    Doc_SetFont     ( nDocID,  0, FONT_BookHeadline                   );     // -1 -> all pages
                     Doc_PrintLine    ( nDocID,  0, ""                    );
                    Doc_PrintLines    ( nDocID,  0, "Die sьdlдndische Verteidigung"    );
                    Doc_SetFont     ( nDocID,  0, FONT_Book                   );     // -1 -> all pages
                    Doc_PrintLine    ( nDocID,  0, ""                    );
                    Doc_PrintLines    ( nDocID,  0, "Der Sьdlдnder kдmpft nun mehr weniger mit der Kraft des Nordmannes, als mit seiner Behendigkeit. Denn im heiЯen Klima seiner Heimat, bevorzugt er leichte Rьstungen welche ihm mehr Beweglichkeit erlauben. Durch diesen Umstand hat der Sьdlдnder einen ihm angepassten Kampstil entwickelt, der sich auf fundamentale Weise von den uns bekannten unterscheidet. "                    );
                
                

                
                    Doc_SetMargins    ( nDocID, -1, 30, 20, 275, 20, 1           );  //  0 -> margins are in pixels (Position des Textes von den Rдnder des TGAs aus, links,oben,rechts,unten)
                    Doc_SetFont     ( nDocID,  1, FONT_BookHeadline                   );     // -1 -> all pages
                    Doc_PrintLine    ( nDocID,  1, ""                    );
                    Doc_SetFont     ( nDocID,  1, FONT_Book                   );     // -1 -> all pages
                    Doc_PrintLine    ( nDocID,  1, ""                    );
                    Doc_PrintLines    ( nDocID,  1, "Das wohl bekannnteste Manцver des Sьdlдnders ist wohl der einarmige Block mit rьckwдrtigen Ausfallschritt. Durch den Ausfallschritt gelingt es ihm, die Kraft des gegnerischen Angriffes zu mildern und so eine hervorragende Ausgangsposition zu erlangen, die zum direkten Gegenangriff genutzt werden kann."    );
                    Doc_PrintLine    ( nDocID,  1, ""                    );
                
                
                    Doc_Show        ( nDocID );
};
Что-то не получается:
Daedalus:
var int Lerne_Einhand;
var int Lerne_Zweihand;

instance ItWr_EinhandBuch(C_Item)
{
    name = "Южное искусство обороны";
    mainflag = ITEM_KAT_DOCS;
    flags = 0;
    value = 5000;
    visual = "ItWr_Book_1H.3ds";
    material = MAT_LEATHER;
    scemeName = "MAP";
    description = name;
    text[2] = "Книга, посвященная искусству";
    text[3] = "сражения одноручным оружием.";
    text[5] = NAME_Value;
    count[5] = value;
    on_state[0] = UseEinhandBuch;
    inv_rotz = 180;
    inv_rotx = 90;
    inv_roty = 180;
};

func int C_RaiseTalentByPermBonus(var C_Npc npc,var int talent,var int value)
{
    if (sPerm_Attr_KTS_Hero_talent(talent, value) == ATR_STRENGTH)
    {
        PrintScreen("Не хватает силы для дальнейшего обучения.",-1,-1,FONT_Screen,2);
        B_Say(self,self,"$CANTREADTHIS");
        return FALSE;
    };
   
    if (sPerm_Attr_KTS_Hero_talent(talent,value) == ATR_DEXTERITY)
    {
        PrintScreen("Не хватает ловкости для дальнейшего обучения.",-1,-1,FONT_Screen,2);
        B_Say(self,self,"$CANTREADTHIS");
        return FALSE;
    };

    B_RaiseTalentByPermBonus(npc,talent,value);

    return TRUE;
};

func void UseEinhandBuch()
{
   
    if (Lerne_Einhand == FALSE)
    && (C_RaiseTalentByPermBonus == TRUE)
    {
        B_RaiseTalentByPermBonus(self,NPC_TALENT_1H,5);
        Lerne_Einhand = TRUE;
    };
   
    var int nDocID;
    nDocID = Doc_Create();
    Doc_SetPages(nDocID,2);
    Doc_SetPage(nDocID,0,"Book_Red_L.tga",0);
    Doc_SetPage(nDocID,1,"Book_Red_R.tga",0);
    Doc_SetMargins(nDocID,0,275,20,30,20,1);
    Doc_SetFont(nDocID,0,FONT_BookHeadline);
    Doc_PrintLines(nDocID,0,"Южное искусство обороны");
    Doc_SetFont(nDocID,0,FONT_Book);
    Doc_PrintLine(nDocID,0,"");
    Doc_PrintLines(nDocID,0,"Южане меньше полагаются на грубую физическую силу, нежели северяне, и отдают предпочтение ловкости. В горячем климате своей родины они предпочитают носить легкие доспехи, позволяющие свободно двигаться. Таким образом, южане разработали стиль боя, фундаментально отличающийся от привычного нам.");
    Doc_SetMargins(nDocID,-1,30,20,275,20,1);
    Doc_SetFont(nDocID,1,FONT_Book);
    Doc_PrintLine(nDocID,1,"");
    Doc_PrintLine(nDocID,1,"");
    Doc_PrintLines(nDocID,1,"Вероятно, самый известный прием, используемый южанами - это блок одноручным оружием и шаг назад. Шаг назад позволяет бойцу ослабить атакующий удар и в то же время занять превосходную стойку, из которой можно провести контратаку.");
    Doc_Show(nDocID);
};

1.png
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
функцию C_RaiseTalentByPermBonus размести в файле под функцией B_RaiseTalentByPermBonus
Пост автоматически объединён:

Daedalus:
if (Lerne_Einhand == FALSE)
&& (C_RaiseTalentByPermBonus(self,NPC_TALENT_1H,5) == TRUE)
{
        // B_RaiseTalentByPermBonus(self,NPC_TALENT_1H,5);
        Lerne_Einhand = TRUE;
 };
 

KirTheSeeker

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

Daedalus:
if (Lerne_Einhand == FALSE)
&& (C_RaiseTalentByPermBonus(self,NPC_TALENT_1H,5) == TRUE)
{
        // B_RaiseTalentByPermBonus(self,NPC_TALENT_1H,5);
        Lerne_Einhand = TRUE;
 };
Хорошо, проверки силы и ловкости работают корректно, но когда атрибуты соответствуют, то прочтение книги накидывает бонус дважды, т.е. 10% навыка, вместо 5%.
 

KirTheSeeker

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

Как бы ещё ГГ заставить это комментировать?
1.png

А ещё лучше, наверное, чтобы при несоответствии атрибутам содержимое книги не показывалось (но анимация проигрывалась). Такое возможно прописать?
 
Последнее редактирование:

KirTheSeeker

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

Или для диалогов лучше другую функцию прописать?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
вопрос в том как это будет выглядеть с точки зрения ЛОРа? :) так:
привет! я тебе сейчас покажу приём! пошёл вон!
?
Пост автоматически объединён:

ну и строго говоря это ближе к B_TeachFightTalentPercent , хоть это и "бонус", но это тренировка у учителя с его лимитами за 0 ЛП. такая же ситуация была у Горацио в готики 1.
Пост автоматически объединён:

или у тебя вульфгар сможет натренировать героя с 98 до 100 ?:)
 

KirTheSeeker

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

вопрос в том как это будет выглядеть с точки зрения ЛОРа? :)
Думаю, с Вульфгаром стоит блокировать само начало диалога:
Daedalus:
func int DIA_Wulfgar_Bonus_Condition()
{
    if(Npc_IsInState(self,ZS_Talk) && C_WulfgarCanGiveBonus())
    {
        return TRUE;
    };
};
Пост автоматически объединён:

Что-то не до конца понятно где тут лучше выставлять проверку:
Daedalus:
func int C_WulfgarCanGiveBonus()
{
    if(Wld_IsTime(5,0,6,54) && (Npc_GetDistToWP(self,"NW_CITY_HABOUR_KASERN_CENTRE_01") < 600))
    {
        return TRUE;
    };
    return FALSE;
};

instance DIA_Wulfgar_AlsMil(C_Info)
{
    npc = MIL_312_Wulfgar;
    nr = 1;
    condition = DIA_Wulfgar_AlsMil_Condition;
    information = DIA_Wulfgar_AlsMil_Info;
    permanent = FALSE;
    important = TRUE;
};


func int DIA_Wulfgar_AlsMil_Condition()
{
    if(other.guild == GIL_MIL)
    {
        if(Npc_KnowsInfo(other,DIA_Wulfgar_Bonus) || !C_WulfgarCanGiveBonus())
        {
            return TRUE;
        };
    };
};

func void DIA_Wulfgar_AlsMil_Info()
{
    AI_Output(self,other,"DIA_Wulfgar_AlsMil_04_00");    //Значит, лорд Андрэ принял тебя!
    AI_Output(self,other,"DIA_Wulfgar_AlsMil_04_01");    //Я надеюсь, ты будешь регулярно тренироваться здесь.
    AI_Output(self,other,"DIA_Wulfgar_AlsMil_04_02");    //Руга научит тебя пользоваться арбалетом, а Мортис поможет тебе стать сильнее.
    AI_Output(self,other,"DIA_Wulfgar_AlsMil_04_03");    //Но самое важное - это научиться правильно держать свой меч.
    B_Wulfgar_SkillComment();
    if(Mortis_TeachSTR == FALSE)
    {
        Log_CreateTopic(TOPIC_CityTeacher,LOG_NOTE);
        B_LogEntry(TOPIC_CityTeacher,"Ополченец Мортис может помочь мне повысить мою силу.");   
    };
    B_Ruga_Teach_Log();
};


instance DIA_Wulfgar_Bonus(C_Info)
{
    npc = MIL_312_Wulfgar;
    nr = 2;
    condition = DIA_Wulfgar_Bonus_Condition;
    information = DIA_Wulfgar_Bonus_Info;
    permanent = FALSE;
    important = TRUE;
};


func int DIA_Wulfgar_Bonus_Condition()
{
    if(Npc_IsInState(self,ZS_Talk) && C_WulfgarCanGiveBonus())
    {
        return TRUE;
    };
};

func void DIA_Wulfgar_Bonus_Info()
{
    AI_Output(self,other,"DIA_Wulfgar_Bonus_04_00");    //Ранняя пташка? Я обычно один в это время дня. Но раз уж ты здесь, то можно потренироваться.
    AI_Output(self,other,"DIA_Wulfgar_Bonus_04_01");    //Будь внимательным. Ты можешь обмануть некоторых противников, если уклонишься от удара, а затем атакуешь в правильный момент.
    AI_Output(self,other,"DIA_Wulfgar_Bonus_04_02");    //Помни об этом в своем следующем бою!
    B_RaiseTalentByPermBonus(other,NPC_TALENT_1H,2);
};
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
func int DIA_Wulfgar_Bonus_Condition()
{
if(Npc_IsInState(self,ZS_Talk) && C_WulfgarCanGiveBonus())
{
if (sPerm_Attr_KTS_Hero_talent(навык, процент) == true)
{
return TRUE;
};
};
};
Пост автоматически объединён:

Нет, максимум до 60%. Наверное, даже проще выставить до 59%, чтобы не заморачиваться с проверками.
тогда в DIA_Wulfgar_Bonus_Info замени B_RaiseTalentByPermBonus на B_TeachFightTalentPercent
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
func int DIA_Wulfgar_Bonus_Condition()
тогда в DIA_Wulfgar_Bonus_Info замени B_RaiseTalentByPermBonus на B_TeachFightTalentPercent
Daedalus:
func int DIA_Wulfgar_Bonus_Condition()
{
    if(Npc_IsInState(self,ZS_Talk) && C_WulfgarCanGiveBonus())
    {
    if (sPerm_Attr_KTS_Hero_talent(NPC_TALENT_1H,2) == true)
        {
            return TRUE;
        };
    };
};

func void DIA_Wulfgar_Bonus_Info()
{
    AI_Output(self,other,"DIA_Wulfgar_Bonus_04_00");    //Ранняя пташка? Я обычно один в это время дня. Но раз уж ты здесь, то можно потренироваться.
    AI_Output(self,other,"DIA_Wulfgar_Bonus_04_01");    //Будь внимательным. Ты можешь обмануть некоторых противников, если уклонишься от удара, а затем атакуешь в правильный момент.
    AI_Output(self,other,"DIA_Wulfgar_Bonus_04_02");    //Помни об этом в своем следующем бою!
    B_TeachFightTalentPercent(other,NPC_TALENT_1H,2,59);
};

1.png

Я понимаю, что нужно корректно прописать данные в скобках для B_TeachFightTalentPercent, но не понимаю что нужно прописывать в качестве var C_Npc slf и var C_Npc oth ?
Пост автоматически объединён:

Daedalus:
B_TeachFightTalentPercent(self,other,NPC_TALENT_1H,2,59);
?
 

Вложения

  • 1.png
    1.png
    62 KB · Просмотры: 4

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
B_TeachFightTalentPercent(self,other,NPC_TALENT_1H,2,TeachLimit_1H_Wulfgar);
Пост автоматически объединён:

а тут наверное всё таки так
Daedalus:
func void Use_OneHStonePlate1()
{
    StoneplateItem = OneHStonePlate;
    StoneplateLevel = 1;
    //if(!C_SCHasStPlSkill())
    if (C_SCHasStPlSkill == FALSE)
    || (sPerm_Attr_KTS_Hero_talent(NPC_TALENT_1H, OneH_StPlLevel1) == FALSE)
    //|| (C_RaiseTalentByPermBonus(self,NPC_TALENT_1H,OneH_StPlLevel1) == FALSE)
    {
//        CreateInvItem(hero,ItWr_OneHStonePlate1_Addon);
        Mdl_ApplyOverlayMdsTimed(self,"HUMANS_STONEPLATE.MDS",500);
    };
    Use_StonePlate();
};
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
B_TeachFightTalentPercent(self,other,NPC_TALENT_1H,2,TeachLimit_1H_Wulfgar);
Отлично. Тут всё работает корректно. И тренерство у Вульфгара тоже. Благодарю!

Сейчас проверим Сержио...
А с Сержио подобный вариант работает не совсем корректно, т.к. проверка проходит, сообщение появляется, но диалог с советом проигрывается, и соответственно исчезает, НЕ дав бонуса. Видимо проверку нужно куда-то переместить:

Daedalus:
func int DIA_Sergio_Isgaroth_Condition()
{
    if(Npc_KnowsInfo(hero,PC_PrayShrine_Paladine) && (Npc_GetDistToWP(self,"NW_MONASTERY_CHAPELL_02") <= 1500))
    {
        if(Kapitel == 1)
        {
            return TRUE;
        };
        if(GuildlessMode == TRUE)
        {
            return TRUE;
        };
        if (sPerm_Attr_KTS_Hero_talent(NPC_TALENT_1H,2) == true)
        {
            return TRUE;
        };
    };
};

func void DIA_Sergio_Isgaroth_Info()
{
    AI_Output(self,other,"DIA_Sergio_Isgaroth_04_00");    //Ты молился за моих товарищей. Я благодарен тебе за это. Скажи мне, что я могу сделать для тебя.
    Info_ClearChoices(DIA_Sergio_Isgaroth);
    Info_AddChoice(DIA_Sergio_Isgaroth,"Как насчет небольшого пожертвования?",DIA_Sergio_Isgaroth_Spende);
    Info_AddChoice(DIA_Sergio_Isgaroth,"Ты не мог бы поделиться своим боевым опытом?",DIA_Sergio_Isgaroth_XP);
};

func void DIA_Sergio_Isgaroth_Spende()
{
    AI_Output(other,self,"DIA_Sergio_Isgaroth_Spende_15_00");    //Как насчет небольшого пожертвования?
    AI_Output(self,other,"DIA_Sergio_Isgaroth_Spende_04_01");    //Пусть это золото сослужит тебе добрую службу.
    B_GiveInvItems(self,other,ItMi_Gold,100);
    Info_ClearChoices(DIA_Sergio_Isgaroth);
};

func void DIA_Sergio_Isgaroth_XP()
{
    AI_Output(other,self,"DIA_Sergio_Isgaroth_XP_15_00");    //Ты не мог бы поделиться своим боевым опытом?
    AI_Output(self,other,"DIA_Sergio_Isgaroth_XP_04_01");    //Когда ты сражаешься, постарайся, чтобы никто не мог атаковать тебя сзади.
    B_TeachFightTalentPercent(self,other,NPC_TALENT_2H,2,70);
    Info_ClearChoices(DIA_Sergio_Isgaroth);
};
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
Daedalus:
func int DIA_Sergio_Isgaroth_Condition()
{
    if(Npc_KnowsInfo(hero,PC_PrayShrine_Paladine) && (Npc_GetDistToWP(self,"NW_MONASTERY_CHAPELL_02") <= 1500))
    {
        if (sPerm_Attr_KTS_Hero_talent(NPC_TALENT_1H,2) == true)
        {
            if(Kapitel == 1)
            {
                return TRUE;
            };
            if(GuildlessMode == TRUE)
            {
                return TRUE;
            };
        };
    };
};
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
а тут наверное всё таки так
Daedalus:
func void Use_OneHStonePlate1()
{
    StoneplateItem = OneHStonePlate;
    StoneplateLevel = 1;
    //if(!C_SCHasStPlSkill())
    if (C_SCHasStPlSkill == FALSE)
    || (sPerm_Attr_KTS_Hero_talent(NPC_TALENT_1H, OneH_StPlLevel1) == FALSE)
    //|| (C_RaiseTalentByPermBonus(self,NPC_TALENT_1H,OneH_StPlLevel1) == FALSE)
    {
//        CreateInvItem(hero,ItWr_OneHStonePlate1_Addon);
        Mdl_ApplyOverlayMdsTimed(self,"HUMANS_STONEPLATE.MDS",500);
    };
    Use_StonePlate();
};
Не совсем так:
1.png
Пост автоматически объединён:

Daedalus:
func int DIA_Sergio_Isgaroth_Condition()
{
    if(Npc_KnowsInfo(hero,PC_PrayShrine_Paladine) && (Npc_GetDistToWP(self,"NW_MONASTERY_CHAPELL_02") <= 1500))
    {
        if (sPerm_Attr_KTS_Hero_talent(NPC_TALENT_1H,2) == true)
        {
            if(Kapitel == 1)
            {
                return TRUE;
            };
            if(GuildlessMode == TRUE)
            {
                return TRUE;
            };
        };
    };
};
Да, так проверка выполняется корректно, но Сержио просто не обращается к ГГ, если у того не хватает атрибутов. С Вульфгаром это выглядит нормально, но здесь, думаю, логичнее всего её расположить в том диалоге, где ГГ просит Сержио поделиться боевым опытом:
Daedalus:
func void DIA_Sergio_Isgaroth_XP()
{
    AI_Output(other,self,"DIA_Sergio_Isgaroth_XP_15_00");    //Ты не мог бы поделиться своим боевым опытом?
    if (sPerm_Attr_KTS_Hero_talent(NPC_TALENT_1H,2) == true)
    {
        return TRUE;
    };
    AI_Output(self,other,"DIA_Sergio_Isgaroth_XP_04_01");    //Когда ты сражаешься, постарайся, чтобы никто не мог атаковать тебя сзади.
    B_TeachFightTalentPercent(self,other,NPC_TALENT_2H,2,70);
    Info_ClearChoices(DIA_Sergio_Isgaroth);
};

Подскажите, пожалуйста, как правильно впихнуть проверку между данными репликами?
1.png
 

Вложения

  • 1.png
    1.png
    49,3 KB · Просмотры: 1
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
Daedalus:
func void Use_OneHStonePlate1()
{
    StoneplateItem = OneHStonePlate;
    StoneplateLevel = 1;
    //if(!C_SCHasStPlSkill())
    if (C_SCHasStPlSkill() == FALSE)
    || (sPerm_Attr_KTS_Hero_talent(NPC_TALENT_1H, OneH_StPlLevel1) == FALSE)
    //|| (C_RaiseTalentByPermBonus(self,NPC_TALENT_1H,OneH_StPlLevel1) == FALSE)
    {
//        CreateInvItem(hero,ItWr_OneHStonePlate1_Addon);
        Mdl_ApplyOverlayMdsTimed(self,"HUMANS_STONEPLATE.MDS",500);
    };
    Use_StonePlate();
};
Пост автоматически объединён:

Подскажите, пожалуйста, как правильно впихнуть проверку между данными репликами?
наверное просто так
Daedalus:
func void DIA_Sergio_Isgaroth_XP()
{
    AI_Output(other,self,"DIA_Sergio_Isgaroth_XP_15_00");    //Ты не мог бы поделиться своим боевым опытом?
    AI_Output(self,other,"DIA_Sergio_Isgaroth_XP_04_01");    //Когда ты сражаешься, постарайся, чтобы никто не мог атаковать тебя сзади.
    if (B_TeachFightTalentPercent(self,other,NPC_TALENT_2H,2,70) == false)
    {
        // если герой не прошёл проверку можно дать просто опыт
    };
    Info_ClearChoices(DIA_Sergio_Isgaroth);
};
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
наверное просто так
Daedalus:
func void DIA_Sergio_Isgaroth_XP()
{
    AI_Output(other,self,"DIA_Sergio_Isgaroth_XP_15_00");    //Ты не мог бы поделиться своим боевым опытом?
    AI_Output(self,other,"DIA_Sergio_Isgaroth_XP_04_01");    //Когда ты сражаешься, постарайся, чтобы никто не мог атаковать тебя сзади.
    if (B_TeachFightTalentPercent(self,other,NPC_TALENT_2H,2,70) == false)
    {
        // если герой не прошёл проверку можно дать просто опыт
    };
    Info_ClearChoices(DIA_Sergio_Isgaroth);
};
А как можно сделать данный диалог повторяющимся, чтобы ГГ мог повторить свой запрос позже? Мне кажется, тут лучше всего смотрелось бы разделение реплик, типа ГГ делает запрос на "Поделись боевым опытом", далее 2 варианта ответа:
- Если проверка на атрибуты пройдена = Сержио даёт совет и бонус к 2Р.
- Если проверка НЕ пройдена, то стандартная фраза про "тебе не хватает опыта".
Наверное, тогда и условие о первой главе стоит убрать.
Пост автоматически объединён:

Daedalus:
func void Use_OneHStonePlate1()
{
    StoneplateItem = OneHStonePlate;
    StoneplateLevel = 1;
    //if(!C_SCHasStPlSkill())
    if (C_SCHasStPlSkill() == FALSE)
    || (sPerm_Attr_KTS_Hero_talent(NPC_TALENT_1H, OneH_StPlLevel1) == FALSE)
    //|| (C_RaiseTalentByPermBonus(self,NPC_TALENT_1H,OneH_StPlLevel1) == FALSE)
    {
//        CreateInvItem(hero,ItWr_OneHStonePlate1_Addon);
        Mdl_ApplyOverlayMdsTimed(self,"HUMANS_STONEPLATE.MDS",500);
    };
    Use_StonePlate();
};
Нет, такой вариант не сработал - табличка просто активируется ари навыке 1Р = 29% и STR/DEX = 5/5.
 
Последнее редактирование:

MW 7


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

Daedalus:
///////////////////////////////////////////////////////////////////////
//  Info Bonus2h - этот блок поставить в начало файла
///////////////////////////////////////////////////////////////////////
var int Sergio_Bonus2h_permanent;
/*************************************/
instance DIA_Sergio_Bonus2h(C_INFO)
{
    npc          =  PAL_299_Sergio;
    nr           =  2;
    condition    =  DIA_Sergio_Bonus2h_Condition;
    information  =  DIA_Sergio_Bonus2h_Info;
    permanent    =  TRUE;
    description  =  "Ты не мог бы поделиться своим боевым опытом?";
};

func int DIA_Sergio_Bonus2h_Condition ()
{
    return Sergio_Bonus2h_permanent;
};

func void DIA_Sergio_Bonus2h_Info ()
{
    AI_Output(hero,self,"DIA_Sergio_Isgaroth_XP_15_00");    //Ты не мог бы поделиться своим боевым опытом?
    if (B_TeachFightTalentPercent(self,hero,NPC_TALENT_2H,2,70) == true)
    {
        AI_Output(self,hero,"DIA_Sergio_Isgaroth_XP_04_01");    //Когда ты сражаешься, постарайся, чтобы никто не мог атаковать тебя сзади.
        Sergio_Bonus2h_permanent= false;
    };
};

Daedalus:
// а это заменить

FUNC VOID DIA_Sergio_Isgaroth_XP()
{
/*
    AI_Output (other, self, "DIA_Sergio_Isgaroth_XP_15_00"); //Lass mich an deiner Erfahrung im Kampf teilhaben.
    AI_Output (self, other, "DIA_Sergio_Isgaroth_XP_04_01"); //Wenn du kдmpfst, dann sichere dich so ab, dass dich niemand von hinten angreifen kann.
 
    other.HitChance[NPC_TALENT_2H] = (other.HitChance[NPC_TALENT_2H] + 2);
    PrintScreen (PRINT_Learn2H, -1, -1, FONT_ScreenSmall, 2);
    */
    Sergio_Bonus2h_permanent = true;
    Info_ClearChoices (DIA_Sergio_Isgaroth);
    DIA_Sergio_Bonus2h_Info();
};
Пост автоматически объединён:

Нет, такой вариант не сработал - табличка просто активируется ари навыке 1Р = 29% и STR/DEX = 5/5.
попробуй

Daedalus:
 || (sPerm_Attr_KTS_Hero_talent(NPC_TALENT_1H, OneH_StPlLevel1) != TRUE)
Пост автоматически объединён:

Нет, такой вариант не сработал - табличка просто активируется ари навыке 1Р = 29% и STR/DEX = 5/5.
скинь файл с функцией sPerm_Attr_KTS_Hero_talent
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
в конце файла B_Perm_Attr_KTS_FightTalent.d добавь

Daedalus:
func int C_KTS_Hero_Atr_Talent(var int talent, var int percent)
{
    if (sPerm_Attr_KTS_Hero_talent(talent,percent) == ATR_STRENGTH)
    {
        PrintScreen("Не хватает силы для дальнейшего обучения.",-1,-1,FONT_Screen,2);
        return FALSE;
    };
    if (sPerm_Attr_KTS_Hero_talent(talent,percent) == ATR_DEXTERITY)
    {
        PrintScreen("Не хватает ловкости для дальнейшего обучения.",-1,-1,FONT_Screen,2);
        return FALSE;
    };
    return TRUE;      
 };
 
Последнее редактирование:
Сверху Снизу