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

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

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

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 sPerm_Attr_KTS_Hero_talent(var int talent, var int percent)
{
    // Значение силы ГГ без учёта бонусов от надетых колец и амулета.
    var int sPerm_STR_KTS;
    sPerm_STR_KTS = ATR_Training[ATR_STRENGTH] + ATR_PermBonus[ATR_STRENGTH];
 
    var int sPerm_DEX_KTS;
    sPerm_DEX_KTS = ATR_Training[ATR_DEXTERITY] + ATR_PermBonus[ATR_DEXTERITY];
 
    // Предполагаемое новое значение навыка превышает 59 (60 и более).
    // Нужна проверка атрибутов на соответствие этому уровню навыка.
    if (talent == NPC_TALENT_1H)
    {
        if (hero.HitChance[NPC_TALENT_1H] + percent >= 60)
        {
            if (sPerm_STR_KTS < 40)
            {
                return ATR_STRENGTH;
            };
         
            if (sPerm_DEX_KTS < 40)
            {
                return ATR_DEXTERITY;
            };
            return TRUE;
        };
 
        // Предполагаемое новое значение навыка превышает 29 (от 30 до 59).
        // Нужна проверка атрибутов на соответствие этому уровню навыка.
        if (hero.HitChance[NPC_TALENT_1H] + percent >= 30)
        {
            if (sPerm_STR_KTS < 20)
            {
                return ATR_STRENGTH;
            };
            if (sPerm_DEX_KTS < 20)
            {
                return ATR_DEXTERITY;
            };
            // Сила и ловкость ГГ превышает 19 (20 и более), обучение возможно -> TRUE.
            return TRUE;
        };
 
        // Предполагаемое новое значение навыка не превышает 29.
        // Проверка атрибутов на соответствие изучаемому уровню навыка не нужна -> TRUE.
        return TRUE;  
    };


    if (talent == NPC_TALENT_2H)
    {
и делать проверку непосредственно по нему что бы выводить сообщения в одном месте
Daedalus:
func int B_TeachFightTalentPercent(var C_Npc slf,var C_Npc oth,var int talent,var int percent,var int teacherMAX)
{
    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;
    };
Странно...
При таком варианте прокачка до "Бойца" идёт корректно, но на пороге в 60% опять возникает казус:
1668793323195.png
Пост автоматически объединён:

тебе показан рабочий пример с 1р. по аналогии делай 2р, лук, арбалет.
Именно так и хочу сделать. Проблема в том, что пример с 1Р не работает, и я не понимаю почему.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
только 1р
Daedalus:
func int sPerm_Attr_KTS_Hero_talent(var int talent, var int percent)
{
    // Значение силы ГГ без учёта бонусов от надетых колец и амулета.
    var int sPerm_STR_KTS; sPerm_STR_KTS = 0;
    var int sPerm_DEX_KTS; sPerm_DEX_KTS = 0;

    sPerm_STR_KTS = ATR_Training[ATR_STRENGTH] + ATR_PermBonus[ATR_STRENGTH];
    sPerm_DEX_KTS = ATR_Training[ATR_DEXTERITY] + ATR_PermBonus[ATR_DEXTERITY];
 
    if (talent == NPC_TALENT_1H)
    {
        // Предполагаемое новое значение навыка превышает 59 (60 и более).
        // Нужна проверка атрибутов на соответствие этому уровню навыка.
        if (hero.HitChance[NPC_TALENT_1H] + percent >= 60)
        {
            if (sPerm_STR_KTS < 40) { return ATR_STRENGTH;  };
            if (sPerm_DEX_KTS < 40) { return ATR_DEXTERITY; };
            //  проверка на ману
            return TRUE;
        }
        // Предполагаемое новое значение навыка от 30 до 59).
        // Нужна проверка атрибутов на соответствие этому уровню навыка.
        else if (hero.HitChance[NPC_TALENT_1H] + percent >= 30)
        {
            if (sPerm_STR_KTS < 20) {   return ATR_STRENGTH;    };
            if (sPerm_DEX_KTS < 20) {   return ATR_DEXTERITY;   };
            // Сила и ловкость ГГ (20 и более), обучение возможно -> TRUE.
            return TRUE;
        }
        else
        {
            // Предполагаемое новое значение навыка не превышает 29.
            // Проверка атрибутов на соответствие изучаемому уровню навыка не нужна -> TRUE.
            return TRUE;      
        };
    };
    return TRUE;      
};
Пост автоматически объединён:

Daedalus:
func int sPerm_Attr_KTS_Hero_talent(var int talent, var int percent)
{
    // Значение силы ГГ без учёта бонусов от надетых колец и амулета.
    var int sPerm_STR_KTS; sPerm_STR_KTS = 0;
    var int sPerm_DEX_KTS; sPerm_DEX_KTS = 0;

    sPerm_STR_KTS = ATR_Training[ATR_STRENGTH] + ATR_PermBonus[ATR_STRENGTH];
    sPerm_DEX_KTS = ATR_Training[ATR_DEXTERITY] + ATR_PermBonus[ATR_DEXTERITY];
 
    if (talent == NPC_TALENT_1H)
    {
        // Предполагаемое новое значение навыка превышает 59 (60 и более).
        // Нужна проверка атрибутов на соответствие этому уровню навыка.
        if (hero.HitChance[NPC_TALENT_1H] + percent >= 60)
        {
            if      (sPerm_STR_KTS < 40) { return ATR_STRENGTH;  }
            else if (sPerm_DEX_KTS < 40) { return ATR_DEXTERITY; }
            //  проверка на ману
            //  проверка на ХП
            else                         { return TRUE;          };
        }
        // Предполагаемое новое значение навыка от 30 до 59).
        // Нужна проверка атрибутов на соответствие этому уровню навыка.
        else if (hero.HitChance[NPC_TALENT_1H] + percent >= 30)
        {
            if      (sPerm_STR_KTS < 20) { return ATR_STRENGTH;  }
            else if (sPerm_DEX_KTS < 20) { return ATR_DEXTERITY; }
            else                         { return TRUE;          };
        }
        else
        {
            // Предполагаемое новое значение навыка не превышает 29.
            // Проверка атрибутов на соответствие изучаемому уровню навыка не нужна -> TRUE.
            return TRUE;      
        };
    };
    return TRUE;      
};
 
Последнее редактирование:

KirTheSeeker

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

MW 7


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

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275

MW 7


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

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
Приветствую всех вновь.
Вопрос по скрипту B_RaiseFightTalent.d:
- Как можно корректно добавить проверки на атрибут и туда?
Daedalus:
func void B_RaiseTalentByPermBonus(var C_Npc npc,var int talent,var int value)
{       

    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;
    };

    var string text;
    value = B_ChangeTalent(npc,talent,value,TS_PermBonus);
    if(value == 0)
    {
        return;
    };
    if(talent == NPC_TALENT_1H)
    {
        text = PRINT_Learn1H;
    }
    else if(talent == NPC_TALENT_2H)
    {
        text = PRINT_Learn2H;
    }
    else if(talent == NPC_TALENT_BOW)
    {
        text = PRINT_LearnBow;
    }
    else if(talent == NPC_TALENT_CROSSBOW)
    {
        text = PRINT_LearnCrossbow;
    };
    text = ConcatStrings(text," + ");
    text = ConcatStrings(text,IntToString(value));
    PrintScreen(text,-1,-1,FONT_Screen,2);
    Snd_Play("LEVELUP");
};

2.png

3.png

Подскажите, пожалуйста, как правильно поменять функции, чтобы проверка работала?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
смотри на то какая функция. и в зависимости от этого используй или просто return или return FALSE
func voidfunc int
return; return FALSE;
Daedalus:
        PrintScreen("Не хватает силы для дальнейшего обучения.",-1,-1,FONT_Screen,2);
        return;
Пост автоматически объединён:

если ты добавишь проверку туда то тебе придётся переписывать в том числе и функции книг на обучение и функции Вульфгара и Сергио. так как бонус даётся один раз и если ты его тут не засчитаешь то он просто условно аннулируется.
Пост автоматически объединён:

смотри https://worldofplayers.ru/threads/13039/page-195#post-1164204 там цветом в спойлере я отметки тебе делал
 

KirTheSeeker

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

Здесь так просто не выйдет, да?
1.png
 

Вложения

  • 1.png
    1.png
    49 KB · Просмотры: 6

MW 7


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

func void B_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;
};

Пост автоматически объединён:

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

KirTheSeeker

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

если ты добавишь проверку туда то тебе придётся переписывать в том числе и функции книг на обучение и функции Вульфгара и Сергио. так как бонус даётся один раз и если ты его тут не засчитаешь то он просто условно аннулируется.
Ну, а можно эти функции сделать цикличными/многоразовыми? Или для корректной работы лучше писать новые?
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
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 );
};
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
func int C_RaiseTalentByPermBonus(var C_Npc npc,var int talent,var int value)
Я не совсем понял что это за функция?
Нужно поменять B_RaiseTalentByPermBonus на C_RaiseTalentByPermBonus в скрипте с книгами?
 

MW 7


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

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
это новая функция int
А, кажется понял. Т.е. B_RaiseTalentByPermBonus.d вообще НЕ трогается, а проверки производятся только над книгами, посредством той новой функции? И если новая функция возвращает TRUE, то система с книгами действует как и ранее?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
Т.е. B_RaiseTalentByPermBonus.d вообще НЕ трогается
да

а проверки производятся только над книгами, посредством той новой функции?
проверки производятся там где ты их пропишешь. я тебе показал пример с одной книгой.

И если новая функция возвращает TRUE, то система с книгами действует как и ранее?
грубо говоря да.
Пост автоматически объединён:

KirTheSeeker, а скрижали ты править не будешь?
 

KirTheSeeker

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

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
будет интересно посмотреть как ты это реализуешь :)
Полагаю, через ту же func void Use_StonePlate(), где прописано отмена взаимодействия, если ГГ не знает языка Зодчих:
Daedalus:
func void Use_StonePlate()
{
    var string concatText;
    if(!C_SCHasStPlSkill())
    {
        B_CannotUse_Addon();
        B_Say(self,self,"$CANTREADTHIS");
        AI_Waitms(self,500);
    }
    else
    {
        if(StoneplateItem == StrStonePlate)
        ...
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
может быть, а может быть в Use_OneHStonePlate1
Пост автоматически объединён:

что то типа
Daedalus:
func void Use_OneHStonePlate1()
{
    StoneplateItem = OneHStonePlate;
    StoneplateLevel = 1;
    //if(!C_SCHasStPlSkill())
    if (C_SCHasStPlSkill == FALSE)
    || (C_RaiseTalentByPermBonus(self,NPC_TALENT_1H,OneH_StPlLevel1) == FALSE)
    {
//        CreateInvItem(hero,ItWr_OneHStonePlate1_Addon);
        Mdl_ApplyOverlayMdsTimed(self,"HUMANS_STONEPLATE.MDS",500);
    };
    Use_StonePlate();
};
 
Сверху Снизу