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

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

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

MaGoth

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

Вложения

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

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.904
Благодарности
538
Баллы
275
Приветствую всех. Вопрос по скриптам неоф. обновления:
- Как корректно прописать в скрипте вызов func int, которая расписана в другом файле?
Если конкретно, есть рабочая функция проверки атрибутов при обучении у тренеров:
Daedalus:
func int sPerm_Attr_KTS_Hero_1H_STR(var int percent)
{
    // Значение силы ГГ без учёта бонусов от надетых колец и амулета.
    var int sPerm_STR_KTS;
    sPerm_STR_KTS = ATR_Training[ATR_STRENGTH] + ATR_PermBonus[ATR_STRENGTH];
    
    // Предполагаемое новое значение навыка превышает 59 (60 и более).
    // Нужна проверка атрибутов на соответствие этому уровню навыка.
    if(hero.HitChance[NPC_TALENT_1H] + percent > 59)
    {
        // Сила ГГ превышает 39 (40 и более), обучение возможно -> TRUE.
        if(sPerm_STR_KTS > 39)
        {
            return TRUE;
        };
        
        // Сила ГГ не превышает 39, обучение невозможно -> FALSE.
        return FALSE;
    };
    
    // Предполагаемое новое значение навыка превышает 29 (от 30 до 59).
    // Нужна проверка атрибутов на соответствие этому уровню навыка.
    if(hero.HitChance[NPC_TALENT_1H] + percent > 29)
    {
        // Сила ГГ превышает 19 (20 и более), обучение возможно -> TRUE.
        if(sPerm_STR_KTS > 19)
        {
            return TRUE;
        };
        
        // Сила ГГ не превышает 19, обучение невозможно -> FALSE.
        return FALSE;
    };
    
    // Предполагаемое новое значение навыка не превышает 29.
    // Проверка атрибутов на соответствие изучаемому уровню навыка не нужна -> TRUE.
    return TRUE;
};

func int sPerm_Attr_KTS_Hero_1H_DEX(var int percent)
{
    var int sPerm_DEX_KTS;
    sPerm_DEX_KTS = ATR_Training[ATR_DEXTERITY] + ATR_PermBonus[ATR_DEXTERITY];
    
    if(hero.HitChance[NPC_TALENT_1H] + percent > 59)
    {
        if(sPerm_DEX_KTS > 39)
        {
            return TRUE;
        };
        
        return FALSE;
    };
    
    if(hero.HitChance[NPC_TALENT_1H] + percent > 29)
    {
        if(sPerm_DEX_KTS > 19)
        {
            return TRUE;
        };
        
        return FALSE;
    };
    
    return TRUE;
};
...

func int B_TeachFightTalentPercent(var C_Npc slf,var C_Npc oth,var int talent,var int percent,var int teacherMAX)
{
    ...
    {
        concatText = ConcatStrings(PRINT_NoLearnOverPersonalMAX,IntToString(teacherMAX));
        B_PrintPlayerMiddle(oth,concatText);
        B_Say(slf,oth,"$NOLEARNOVERPERSONALMAX");
        return FALSE;
    };
    cost = B_GetTalentTrainCost(oth,talent,percent);
    // Изучается навык владения одноручным оружием.
    if(talent == NPC_TALENT_1H)
    {
        // Значение силы не соответствует изучаемому уровню навыка -> вывод сообщения, выход.
        if(sPerm_Attr_KTS_Hero_1H_STR(percent) == false)
        {
            B_PrintPlayerMiddle(oth,"Не хватает силы для дальнейшего обучения");
            B_Say(slf,oth,"$NOLEARNNOPOINTS");
            return FALSE;
        };
        // Значение ловкости не соответствует изучаемому уровню навыка -> вывод сообщения, выход.
        if(sPerm_Attr_KTS_Hero_1H_DEX(percent) == false)
        {
            B_PrintPlayerMiddle(oth,"Не хватает ловкости для дальнейшего обучения");
            B_Say(slf,oth,"$NOLEARNNOPOINTS");
            return FALSE;
        };
    };
    ...

Я хочу вызвать те же самые функции func int sPerm_Attr_KTS_Hero_1H_STR(var int percent) и func int sPerm_Attr_KTS_Hero_1H_DEX(var int percent), но у же в файле B_RaiseFightTalent.d, однако сталкиваюсь с проблемой:
Daedalus:
func void B_RaiseTalentByPermBonus(var C_Npc npc,var int talent,var int value)
{
    var string text;
    value = B_ChangeTalent(npc,talent,value,TS_PermBonus);
    
    if(talent == NPC_TALENT_1H)
    {
        // Значение силы не соответствует изучаемому уровню навыка -> вывод сообщения, выход.
        if(sPerm_Attr_KTS_Hero_1H_STR(percent) == false)
        {
            B_PrintPlayerMiddle(oth,"Не хватает силы для дальнейшего обучения");
            return;
        };
        // Значение ловкости не соответствует изучаемому уровню навыка -> вывод сообщения, выход.
        if(sPerm_Attr_KTS_Hero_1H_DEX(percent) == false)
        {
            B_PrintPlayerMiddle(oth,"Не хватает ловкости для дальнейшего обучения");
            return;
        };
    };
    
    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");
};

1.png

В чём может быть проблема и как её можно поправить?
Пост автоматически объединён:

Если судить по списку ошибок, то похоже на пункт 11:
- Undefined function: - встретился вызов функция с именем name раньше её декларации.

Если так, то как это правильно решить? Продублировать функцию и в файле B_RaiseFightTalent.d?
 

MEG@VOLT

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

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.261
Благодарности
6.259
Баллы
1.595
А какой вариант наиболее правильный/грамотный?
декларировать B_RaiseFightTalent позже чем B_TeachFightTalentPercent
Часто такое приводит к танцам с бубном, но иногда это решает проблемы.
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.904
Благодарности
538
Баллы
275
декларировать B_RaiseFightTalent позже чем B_TeachFightTalentPercent
Часто такое приводит к танцам с бубном, но иногда это решает проблемы.


Судя по тому, что скрипт B_RaiseFightTalent идёт одним из первых в списке, его перемещение может сломать все прочие, которые идут после него и до B_TeachFightTalentPercent.
Решил всё же переставить скрипты в Gothic.src и... отказался от этой затеи, т.к. ломаются зависимости в куче иных файлов.

Вместо этого продублировал необходимые функции в текущем скрипте, но появляется новая проблема:
Daedalus:
func int sPerm_Attr_KTS_Hero_1H_STR(var int percent)
{
    // Значение силы ГГ без учёта бонусов от надетых колец и амулета.
    var int sPerm_STR_KTS;
    sPerm_STR_KTS = ATR_Training[ATR_STRENGTH] + ATR_PermBonus[ATR_STRENGTH];
   
    // Предполагаемое новое значение навыка превышает 59 (60 и более).
    // Нужна проверка атрибутов на соответствие этому уровню навыка.
    if(hero.HitChance[NPC_TALENT_1H] + percent > 59)
    {
        // Сила ГГ превышает 39 (40 и более), обучение возможно -> TRUE.
        if(sPerm_STR_KTS > 39)
        {
            return TRUE;
        };
       
        // Сила ГГ не превышает 39, обучение невозможно -> FALSE.
        return FALSE;
    };
   
    // Предполагаемое новое значение навыка превышает 29 (от 30 до 59).
    // Нужна проверка атрибутов на соответствие этому уровню навыка.
    if(hero.HitChance[NPC_TALENT_1H] + percent > 29)
    {
        // Сила ГГ превышает 19 (20 и более), обучение возможно -> TRUE.
        if(sPerm_STR_KTS > 19)
        {
            return TRUE;
        };
       
        // Сила ГГ не превышает 19, обучение невозможно -> FALSE.
        return FALSE;
    };
   
    // Предполагаемое новое значение навыка не превышает 29.
    // Проверка атрибутов на соответствие изучаемому уровню навыка не нужна -> TRUE.
    return TRUE;
};

func int sPerm_Attr_KTS_Hero_1H_DEX(var int percent)
{
    var int sPerm_DEX_KTS;
    sPerm_DEX_KTS = ATR_Training[ATR_DEXTERITY] + ATR_PermBonus[ATR_DEXTERITY];
   
    if(hero.HitChance[NPC_TALENT_1H] + percent > 59)
    {
        if(sPerm_DEX_KTS > 39)
        {
            return TRUE;
        };
       
        return FALSE;
    };
   
    if(hero.HitChance[NPC_TALENT_1H] + percent > 29)
    {
        if(sPerm_DEX_KTS > 19)
        {
            return TRUE;
        };
       
        return FALSE;
    };
   
    return TRUE;
};

func void B_PrintPlayerMiddle(var C_Npc npc,var string text)
{
    if(Npc_IsPlayer(npc))
    {
        PrintScreen(text,-1,-1,FONT_Screen,2);
    };
};


func void B_RaiseTalentByPermBonus(var C_Npc npc,var int talent,var int value)
{
    var string text;
    value = B_ChangeTalent(npc,talent,value,TS_PermBonus);
   
    if(talent == NPC_TALENT_1H)
    {
        // Значение силы не соответствует изучаемому уровню навыка -> вывод сообщения, выход.
        if(sPerm_Attr_KTS_Hero_1H_STR(percent) == false)
        {
            B_PrintPlayerMiddle(oth,"Не хватает силы для дальнейшего обучения");
            return false;
        };
        // Значение ловкости не соответствует изучаемому уровню навыка -> вывод сообщения, выход.
        if(sPerm_Attr_KTS_Hero_1H_DEX(percent) == false)
        {
            B_PrintPlayerMiddle(oth,"Не хватает ловкости для дальнейшего обучения");
            return FALSE;
        };
    };  
    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");
};

1.png

Подскажите, пожалуйста, как это можно поправить?
 

Вложения

  • 2.png
    2.png
    104,5 KB · Просмотры: 6
  • 2.png
    2.png
    49,5 KB · Просмотры: 4
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.945
Благодарности
939
Баллы
275
KirTheSeeker, вынеси свои новые проверки типа sPerm_Attr_KTS_Hero_1H_DEX в отдельный файл и ставь этот новый в Gothic.src выше чем файл B_RaiseFightTalent. Оригинальный порядок имеющихся файлов лучше не меняй.
Пост автоматически объединён:

в B_RaiseTalentByPermBonus внимательнее. я тебе цветом отметил ошибку
func void B_RaiseTalentByPermBonus(var C_Npc npc,var int talent,var int value)
{
var string text;
value = B_ChangeTalent(npc,talent,value,TS_PermBonus);


if(talent == NPC_TALENT_1H)
{
// Значение силы не соответствует изучаемому уровню навыка -> вывод сообщения, выход.
if(sPerm_Attr_KTS_Hero_1H_STR(percent) == false)
{
B_PrintPlayerMiddle(oth,"Не хватает силы для дальнейшего обучения");
return;
};
// Значение ловкости не соответствует изучаемому уровню навыка -> вывод сообщения, выход.
if(sPerm_Attr_KTS_Hero_1H_DEX(percent) == false)
{
B_PrintPlayerMiddle(oth,"Не хватает ловкости для дальнейшего обучения");
return;
};

var string text;
value = B_ChangeTalent(npc,talent,value,TS_PermBonus);

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

B_PrintPlayerMiddle в таких функциях используй лучше hero, вместо "slf", "oth" и "npc"
Пост автоматически объединён:

Подскажите, пожалуйста, как это можно поправить?
верни как было: return;
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.904
Благодарности
538
Баллы
275
KirTheSeeker, вынеси свои новые проверки типа sPerm_Attr_KTS_Hero_1H_DEX в отдельный файл и ставь этот новый в Gothic.src выше чем файл B_RaiseFightTalent. Оригинальный порядок имеющихся файлов лучше не меняй.
в B_RaiseTalentByPermBonus внимательнее. я тебе цветом отметил ошибку
B_PrintPlayerMiddle в таких функциях используй лучше hero, вместо "slf", "oth" и "npc"
Однако остаётся проблема:
Daedalus:
func void B_RaiseTalentByPermBonus(var C_Npc npc,var int talent,var int value)
{
    
    if(talent == NPC_TALENT_1H)
    {
        // Значение силы не соответствует изучаемому уровню навыка -> вывод сообщения, выход.
        if(sPerm_Attr_KTS_Hero_1H_STR(value) == false)
        {
            B_PrintPlayerMiddle(npc,"Не хватает силы для дальнейшего обучения");
            return;
        };
        // Значение ловкости не соответствует изучаемому уровню навыка -> вывод сообщения, выход.
        if(sPerm_Attr_KTS_Hero_1H_DEX(value) == false)
        {
            B_PrintPlayerMiddle(npc,"Не хватает ловкости для дальнейшего обучения");
            return;
        };
    };
    
    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");
};

1.png

Эта func void B_PrintPlayerMiddle прописана в IT_Addon_StonePlates.d, который расположен сильно позже всех этих файлов. Что можно придумать с этим, помимо изменения порядка скриптов?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.945
Благодарности
939
Баллы
275
ты можешь вместо неё использовать штатную функцию PrintScreen. в твоём случае это ни на что не влияет так как у тебя речь идёт только про героя

Код:
PrintScreen("Не хватает ловкости для дальнейшего обучения",-1,-1,FONT_Screen,2);
Пост автоматически объединён:

вызов этих надписей кстати логичнее перенести в функции проверки sPerm_Attr_KTS_Hero_1H_STR / dex и делать их перед строчкой return FALSE;
Пост автоматически объединён:

то есть
Код:
        // Сила ГГ не превышает 39, обучение невозможно -> FALSE.
PrintScreen("Не хватает силы для дальнейшего обучения",-1,-1,FONT_Screen,2);
        return FALSE;
и там в самом конце еще раз перед return FALSE;
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.904
Благодарности
538
Баллы
275
Ура, всё скомпилировалось! Благодарю всех.
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.945
Благодарности
939
Баллы
275
суть не в том что оно не компилировалось. суть в том том что оно вместо данных "0" передавало. тебе надо всё это всесторонне протестить что бы убедится в том что проверки работают корректно, что проверяются именно параметры героя, а не нули или процент владения учителя ;-)
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.904
Благодарности
538
Баллы
275
суть не в том что оно не компилировалось. суть в том том что оно вместо данных "0" передавало. тебе надо всё это всесторонне протестить что бы убедится в том что проверки работают корректно, что проверяются именно параметры героя, а не нули или процент владения учителя ;-)
Разумеется. Я и проверяю с началом новой игры, как через помощника, так и через Кавалорна (ради озвучки).
Обучение у тренеров работало в точности так, как необходимо.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.945
Благодарности
939
Баллы
275
лучше через корда и бастера ;-)
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.904
Благодарности
538
Баллы
275
лучше через корда и бастера ;-)
Почему?
Пост автоматически объединён:

и там в самом конце еще раз перед return FALSE;
Вот так?
Daedalus:
func int sPerm_Attr_KTS_Hero_1H_STR(var int percent)
{
    // Значение силы ГГ без учёта бонусов от надетых колец и амулета.
    var int sPerm_STR_KTS;
    sPerm_STR_KTS = ATR_Training[ATR_STRENGTH] + ATR_PermBonus[ATR_STRENGTH];
    
    // Предполагаемое новое значение навыка превышает 59 (60 и более).
    // Нужна проверка атрибутов на соответствие этому уровню навыка.
    if(hero.HitChance[NPC_TALENT_1H] + percent > 59)
    {
        // Сила ГГ превышает 39 (40 и более), обучение возможно -> TRUE.
        if(sPerm_STR_KTS > 39)
        {
            return TRUE;
        };
        
        // Сила ГГ не превышает 39, обучение невозможно -> FALSE.
        PrintScreen("Не хватает силы для дальнейшего обучения",-1,-1,FONT_Screen,2);
        return FALSE;
    };
    
    // Предполагаемое новое значение навыка превышает 29 (от 30 до 59).
    // Нужна проверка атрибутов на соответствие этому уровню навыка.
    if(hero.HitChance[NPC_TALENT_1H] + percent > 29)
    {
        // Сила ГГ превышает 19 (20 и более), обучение возможно -> TRUE.
        if(sPerm_STR_KTS > 19)
        {
            return TRUE;
        };
        
        // Сила ГГ не превышает 19, обучение невозможно -> FALSE.
        PrintScreen("Не хватает силы для дальнейшего обучения",-1,-1,FONT_Screen,2);
        return FALSE;
    };
    
    // Предполагаемое новое значение навыка не превышает 29.
    // Проверка атрибутов на соответствие изучаемому уровню навыка не нужна -> TRUE.
    return TRUE;
};
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.945
Благодарности
939
Баллы
275
да. и так же для проверки на ловкость.

1. у них разные лимиты.
2. у Корда стоит доп условие на обучение.

то есть в таком случае ты так же проверяешь не сломал ли случайно оригинальные проверки
Пост автоматически объединён:

PrintScreen("Не хватает силы для дальнейшего обучения",-1,-1,FONT_Screen,2);
надписи наверное было бы логичнее вынести в отдельные константы, что бы править в одном месте.

Код:
const string  Attr_KTS_Hero_1H_STR_false = "Не хватает силы для дальнейшего обучения";
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.904
Благодарности
538
Баллы
275
надписи наверное было бы логичнее вынести в отдельные константы, что бы править в одном месте.
В Text.d прописать что-то типа
Daedalus:
const string KTS_NEED_STR = "Не хватает силы для дальнейшего обучения";
?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.945
Благодарности
939
Баллы
275
да. что такое то где то там. можешь просто перед самой функцией в начале файла прописать. что бы оригинальные файлы не трогать.
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.904
Благодарности
538
Баллы
275
да. что такое то где то там. можешь просто перед самой функцией в начале файла прописать. что бы оригинальные файлы не трогать.
А в коде функции как прописывать? Типа этого:
Daedalus:
PrintScreen(KTS_NEED_STR,-1,-1,FONT_Screen,2);
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.904
Благодарности
538
Баллы
275
Блин, а теперь сломалось даже то, что работало, т.е. обучение у тренеров.

Не знаю в чём была причина, но работоспособность удалось восстановить, откатив часть изменений:
Daedalus:
func int sPerm_Attr_KTS_Hero_1H_STR(var int percent)
{
    // Значение силы ГГ без учёта бонусов от надетых колец и амулета.
    var int sPerm_STR_KTS;
    sPerm_STR_KTS = ATR_Training[ATR_STRENGTH] + ATR_PermBonus[ATR_STRENGTH];
 
    // Предполагаемое новое значение навыка превышает 59 (60 и более).
    // Нужна проверка атрибутов на соответствие этому уровню навыка.
    if(hero.HitChance[NPC_TALENT_1H] + percent > 59)
    {
        // Сила ГГ превышает 39 (40 и более), обучение возможно -> TRUE.
        if(sPerm_STR_KTS > 39)
        {
            return TRUE;
        };
     
        // Сила ГГ не превышает 39, обучение невозможно -> FALSE.
        return FALSE;
    };
 
    // Предполагаемое новое значение навыка превышает 29 (от 30 до 59).
    // Нужна проверка атрибутов на соответствие этому уровню навыка.
    if(hero.HitChance[NPC_TALENT_1H] + percent > 29)
    {
        // Сила ГГ превышает 19 (20 и более), обучение возможно -> TRUE.
        if(sPerm_STR_KTS > 19)
        {
            return TRUE;
        };
     
        // Сила ГГ не превышает 19, обучение невозможно -> FALSE.
        return FALSE;
    };
 
    // Предполагаемое новое значение навыка не превышает 29.
    // Проверка атрибутов на соответствие изучаемому уровню навыка не нужна -> TRUE.
    return TRUE;
};

func int sPerm_Attr_KTS_Hero_1H_DEX(var int percent)
{
    var int sPerm_DEX_KTS;
    sPerm_DEX_KTS = ATR_Training[ATR_DEXTERITY] + ATR_PermBonus[ATR_DEXTERITY];
 
    if(hero.HitChance[NPC_TALENT_1H] + percent > 59)
    {
        if(sPerm_DEX_KTS > 39)
        {
            return TRUE;
        };
     
        return FALSE;
    };
 
    if(hero.HitChance[NPC_TALENT_1H] + percent > 29)
    {
        if(sPerm_DEX_KTS > 19)
        {
            return TRUE;
        };
     
        return FALSE;
    };
 
    return TRUE;
};

func int sPerm_Attr_KTS_Hero_2H_STR(var int percent)
{
    var int sPerm_STR_KTS;
    sPerm_STR_KTS = ATR_Training[ATR_STRENGTH] + ATR_PermBonus[ATR_STRENGTH];
 
    if(hero.HitChance[NPC_TALENT_2H] + percent > 59)
    {
        if(sPerm_STR_KTS > 59)
        {
            return TRUE;
        };
     
        return FALSE;
    };
 
    if(hero.HitChance[NPC_TALENT_2H] + percent > 29)
    {
        if(sPerm_STR_KTS > 29)
        {
            return TRUE;
        };
     
        return FALSE;
    };
 
    return TRUE;
};

func int sPerm_Attr_KTS_Hero_2H_DEX(var int percent)
{
    var int sPerm_DEX_KTS;
    sPerm_DEX_KTS = ATR_Training[ATR_DEXTERITY] + ATR_PermBonus[ATR_DEXTERITY];
 
    if(hero.HitChance[NPC_TALENT_2H] + percent > 59)
    {
        if(sPerm_DEX_KTS > 29)
        {
            return TRUE;
        };
     
        return FALSE;
    };
 
    if(hero.HitChance[NPC_TALENT_2H] + percent > 29)
    {
        if(sPerm_DEX_KTS > 14)
        {
            return TRUE;
        };
     
        return FALSE;
    };
 
    return TRUE;
};

func int sPerm_Attr_KTS_Hero_BOW_DEX(var int percent)
{
    var int sPerm_DEX_KTS;
    sPerm_DEX_KTS = ATR_Training[ATR_DEXTERITY] + ATR_PermBonus[ATR_DEXTERITY];
 
    if(hero.HitChance[NPC_TALENT_BOW] + percent > 59)
    {
        if(sPerm_DEX_KTS > 59)
        {
            return TRUE;
        };
     
        return FALSE;
    };
 
    if(hero.HitChance[NPC_TALENT_BOW] + percent > 29)
    {
        if(sPerm_DEX_KTS > 29)
        {
            return TRUE;
        };
     
        return FALSE;
    };
 
    return TRUE;
};

func int sPerm_Attr_KTS_Hero_BOW_STR(var int percent)
{
    var int sPerm_STR_KTS;
    sPerm_STR_KTS = ATR_Training[ATR_STRENGTH] + ATR_PermBonus[ATR_STRENGTH];
 
    if(hero.HitChance[NPC_TALENT_BOW] + percent > 59)
    {
        if(sPerm_STR_KTS > 29)
        {
            return TRUE;
        };
     
        return FALSE;
    };
 
    if(hero.HitChance[NPC_TALENT_BOW] + percent > 29)
    {
        if(sPerm_STR_KTS > 14)
        {
            return TRUE;
        };
     
        return FALSE;
    };
 
    return TRUE;
};

func int sPerm_Attr_KTS_Hero_CROSSBOW_STR(var int percent)
{
    var int sPerm_STR_KTS;
    sPerm_STR_KTS = ATR_Training[ATR_STRENGTH] + ATR_PermBonus[ATR_STRENGTH];
 
    if(hero.HitChance[NPC_TALENT_CROSSBOW] + percent > 59)
    {
        if(sPerm_STR_KTS > 29)
        {
            return TRUE;
        };
     
        return FALSE;
    };
 
    if(hero.HitChance[NPC_TALENT_CROSSBOW] + percent > 29)
    {
        if(sPerm_STR_KTS > 14)
        {
            return TRUE;
        };
     
        return FALSE;
    };
 
    return TRUE;
};

func int sPerm_Attr_KTS_Hero_CROSSBOW_DEX(var int percent)
{
    var int sPerm_DEX_KTS;
    sPerm_DEX_KTS = ATR_Training[ATR_DEXTERITY] + ATR_PermBonus[ATR_DEXTERITY];
 
    if(hero.HitChance[NPC_TALENT_CROSSBOW] + percent > 59)
    {
        if(sPerm_DEX_KTS > 29)
        {
            return TRUE;
        };
     
        return FALSE;
    };
 
    if(hero.HitChance[NPC_TALENT_CROSSBOW] + percent > 29)
    {
        if(sPerm_DEX_KTS > 14)
        {
            return TRUE;
        };
     
        return FALSE;
    };
 
    return TRUE;
};

Daedalus:
func int B_TeachFightTalentPercent(var C_Npc slf,var C_Npc oth,var int talent,var int percent,var int teacherMAX)
{
    ...
    cost = B_GetTalentTrainCost(oth,talent,percent);
    // Изучается навык владения одноручным оружием.
    if(talent == NPC_TALENT_1H)
    {
        // Значение силы не соответствует изучаемому уровню навыка -> вывод сообщения, выход.
        if(sPerm_Attr_KTS_Hero_1H_STR(percent) == false)
        {
            B_PrintPlayerMiddle(oth,"Не хватает силы для дальнейшего обучения");
            B_Say(slf,oth,"$NOLEARNNOPOINTS");
            return FALSE;
        };
        // Значение ловкости не соответствует изучаемому уровню навыка -> вывод сообщения, выход.
        if(sPerm_Attr_KTS_Hero_1H_DEX(percent) == false)
        {
            B_PrintPlayerMiddle(oth,"Не хватает ловкости для дальнейшего обучения");
            B_Say(slf,oth,"$NOLEARNNOPOINTS");
            return FALSE;
        };
    };
    if(talent == NPC_TALENT_2H)
    {
        if(sPerm_Attr_KTS_Hero_2H_STR(percent) == false)
        {
            B_PrintPlayerMiddle(oth,"Не хватает силы для дальнейшего обучения");
            B_Say(slf,oth,"$NOLEARNNOPOINTS");
            return FALSE;
        };
        if(sPerm_Attr_KTS_Hero_2H_DEX(percent) == false)
        {
            B_PrintPlayerMiddle(oth,"Не хватает ловкости для дальнейшего обучения");
            B_Say(slf,oth,"$NOLEARNNOPOINTS");
            return FALSE;
        };
    };
    if(talent == NPC_TALENT_BOW)
    {
        if(sPerm_Attr_KTS_Hero_BOW_DEX(percent) == false)
        {
            B_PrintPlayerMiddle(oth,"Не хватает ловкости для дальнейшего обучения");
            B_Say(slf,oth,"$NOLEARNNOPOINTS");
            return FALSE;
        };
        if(sPerm_Attr_KTS_Hero_BOW_STR(percent) == false)
        {
            B_PrintPlayerMiddle(oth,"Не хватает силы для дальнейшего обучения");
            B_Say(slf,oth,"$NOLEARNNOPOINTS");
            return FALSE;
        };
    };
    if(talent == NPC_TALENT_CROSSBOW)
    {
        if(sPerm_Attr_KTS_Hero_CROSSBOW_STR(percent) == false)
        {
            B_PrintPlayerMiddle(oth,"Не хватает силы для дальнейшего обучения");
            B_Say(slf,oth,"$NOLEARNNOPOINTS");
            return FALSE;
        };
        if(sPerm_Attr_KTS_Hero_CROSSBOW_DEX(percent) == false)
        {
            B_PrintPlayerMiddle(oth,"Не хватает ловкости для дальнейшего обучения");
            B_Say(slf,oth,"$NOLEARNNOPOINTS");
            return FALSE;
        };
    };
    if(oth.lp < cost)
    ...


Итак, опытным путём удалось установить, что проблема возникает при введении const string:

Daedalus:
const string PRINT_KTS_NeedForTalent_STR = "Не хватает силы для дальнейшего обучения.";
const string PRINT_KTS_NeedForTalent_DEX = "Не хватает ловкости для дальнейшего обучения.";

func int sPerm_Attr_KTS_Hero_1H_STR(var int percent)
{
    // Значение силы ГГ без учёта бонусов от надетых колец и амулета.
    var int sPerm_STR_KTS;
    sPerm_STR_KTS = ATR_Training[ATR_STRENGTH] + ATR_PermBonus[ATR_STRENGTH];
  
    // Предполагаемое новое значение навыка превышает 59 (60 и более).
    // Нужна проверка атрибутов на соответствие этому уровню навыка.
    if(hero.HitChance[NPC_TALENT_1H] + percent > 59)
    {
        // Сила ГГ превышает 39 (40 и более), обучение возможно -> TRUE.
        if(sPerm_STR_KTS > 39)
        {
            return TRUE;
        };
      
        // Сила ГГ не превышает 39, обучение невозможно -> FALSE.
        PrintScreen(PRINT_KTS_NeedForTalent_STR,-1,-1,FONT_Screen,2);
        return FALSE;
    };
  
    // Предполагаемое новое значение навыка превышает 29 (от 30 до 59).
    // Нужна проверка атрибутов на соответствие этому уровню навыка.
    if(hero.HitChance[NPC_TALENT_1H] + percent > 29)
    {
        // Сила ГГ превышает 19 (20 и более), обучение возможно -> TRUE.
        if(sPerm_STR_KTS > 19)
        {
            return TRUE;
        };
      
        // Сила ГГ не превышает 19, обучение невозможно -> FALSE.
        PrintScreen(PRINT_KTS_NeedForTalent_STR,-1,-1,FONT_Screen,2);
        return FALSE;
    };
  
    // Предполагаемое новое значение навыка не превышает 29.
    // Проверка атрибутов на соответствие изучаемому уровню навыка не нужна -> TRUE.
    return TRUE;
};

func int sPerm_Attr_KTS_Hero_1H_DEX(var int percent)
{
    var int sPerm_DEX_KTS;
    sPerm_DEX_KTS = ATR_Training[ATR_DEXTERITY] + ATR_PermBonus[ATR_DEXTERITY];
  
    if(hero.HitChance[NPC_TALENT_1H] + percent > 59)
    {
        if(sPerm_DEX_KTS > 39)
        {
            return TRUE;
        };
      
        PrintScreen(PRINT_KTS_NeedForTalent_DEX,-1,-1,FONT_Screen,2);
        return FALSE;
    };
  
    if(hero.HitChance[NPC_TALENT_1H] + percent > 29)
    {
        if(sPerm_DEX_KTS > 19)
        {
            return TRUE;
        };
      
        PrintScreen(PRINT_KTS_NeedForTalent_DEX,-1,-1,FONT_Screen,2);
        return FALSE;
    };
  
    return TRUE;
};

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

Daedalus:
func int sPerm_Attr_KTS_Hero_1H_STR(var int percent)
{
    // Значение силы ГГ без учёта бонусов от надетых колец и амулета.
    var int sPerm_STR_KTS;
    sPerm_STR_KTS = ATR_Training[ATR_STRENGTH] + ATR_PermBonus[ATR_STRENGTH];
  
    // Предполагаемое новое значение навыка превышает 59 (60 и более).
    // Нужна проверка атрибутов на соответствие этому уровню навыка.
    if(hero.HitChance[NPC_TALENT_1H] + percent > 59)
    {
        // Сила ГГ превышает 39 (40 и более), обучение возможно -> TRUE.
        if(sPerm_STR_KTS > 39)
        {
            return TRUE;
        };
      
        // Сила ГГ не превышает 39, обучение невозможно -> FALSE.
        PrintScreen("Не хватает силы для дальнейшего обучения.",-1,-1,FONT_Screen,2);
        return FALSE;
    };
  
    // Предполагаемое новое значение навыка превышает 29 (от 30 до 59).
    // Нужна проверка атрибутов на соответствие этому уровню навыка.
    if(hero.HitChance[NPC_TALENT_1H] + percent > 29)
    {
        // Сила ГГ превышает 19 (20 и более), обучение возможно -> TRUE.
        if(sPerm_STR_KTS > 19)
        {
            return TRUE;
        };
      
        // Сила ГГ не превышает 19, обучение невозможно -> FALSE.
        PrintScreen("Не хватает силы для дальнейшего обучения.",-1,-1,FONT_Screen,2);
        return FALSE;
    };
  
    // Предполагаемое новое значение навыка не превышает 29.
    // Проверка атрибутов на соответствие изучаемому уровню навыка не нужна -> TRUE.
    return TRUE;
};

func int sPerm_Attr_KTS_Hero_1H_DEX(var int percent)
{
    var int sPerm_DEX_KTS;
    sPerm_DEX_KTS = ATR_Training[ATR_DEXTERITY] + ATR_PermBonus[ATR_DEXTERITY];
  
    if(hero.HitChance[NPC_TALENT_1H] + percent > 59)
    {
        if(sPerm_DEX_KTS > 39)
        {
            return TRUE;
        };
      
        PrintScreen("Не хватает ловкости для дальнейшего обучения",-1,-1,FONT_Screen,2);
        return FALSE;
    };
  
    if(hero.HitChance[NPC_TALENT_1H] + percent > 29)
    {
        if(sPerm_DEX_KTS > 19)
        {
            return TRUE;
        };
      
        PrintScreen("Не хватает ловкости для дальнейшего обучения",-1,-1,FONT_Screen,2);
        return FALSE;
    };
  
    return TRUE;
};

Что может быть не так с теми стрингами?
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.945
Благодарности
939
Баллы
275
не понятна логика проверки. какие у тебя требования на прокачку 1р сила или ловкость? или и сила и ловкость? сейчас судя по твоему коду при прокачки 1р до проверка на ловкость скрипт никогда не будет доходить.
 
Сверху Снизу