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

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

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

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
какие у тебя требования на прокачку 1р сила или ловкость? или и сила и ловкость?
Второе.
Пост автоматически объединён:

не понятна логика проверки. какие у тебя требования на прокачку 1р сила или ловкость? или и сила и ловкость? сейчас судя по твоему коду при прокачки 1р до проверка на ловкость скрипт никогда не будет доходить.
При таком коде (с сообщениями в другой функции) всё работает корректно.
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;
};
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)
        {
            PrintScreen("Не хватает силы для дальнейшего обучения.",-1,-1,FONT_Screen,2);
            B_Say(slf,oth,"$NOLEARNNOPOINTS");
            return FALSE;
        };
        // Значение ловкости не соответствует изучаемому уровню навыка -> вывод сообщения, выход.
        if(sPerm_Attr_KTS_Hero_1H_DEX(percent) == false)
        {
            PrintScreen("Не хватает ловкости для дальнейшего обучения.",-1,-1,FONT_Screen,2);
            B_Say(slf,oth,"$NOLEARNNOPOINTS");
            return FALSE;
        };
    };
    ...
1668777943208.png

MW 7 Пожалуй, лучше так и ставить. Во-первых работает. Во-вторых - Какой смысл переносить сообщения в B_Perm_Attr_KTS_FightTalent.d? Там их приходится дублировать перед каждым return false, т.е. в итоге имеем 16 сообщений, вместо 8 в B_TeachFightTalentPercent.
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
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 > 59)
        {
            // Сила ГГ превышает 39 (40 и более), обучение возможно -> TRUE.
            if (sPerm_STR_KTS > 39)
            && (sPerm_DEX_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)
            && (sPerm_DEX_KTS > 19)
            {
                return TRUE;
            };
    
            // Сила ГГ не превышает 19, обучение невозможно -> FALSE.
            return FALSE;
        };
 
        // Предполагаемое новое значение навыка не превышает 29.
        // Проверка атрибутов на соответствие изучаемому уровню навыка не нужна -> TRUE.
        return TRUE;     
    };


    if (talent == NPC_TALENT_2H)
    {
        if(hero.HitChance[NPC_TALENT_2H] + percent > 59)
        {
            if (sPerm_STR_KTS > 59)
            && (sPerm_DEX_KTS > 29)
            {
                return TRUE;
            };
    
            return FALSE;
        };
 
        if(hero.HitChance[NPC_TALENT_2H] + percent > 29)
        {
            if (sPerm_STR_KTS > 29)
            && (sPerm_DEX_KTS > 14)
            {
                return TRUE;
            };
    
            return FALSE;
        };
 
        return TRUE;   
    };   
};
 

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 > 59)
        {
            // Сила ГГ превышает 39 (40 и более), обучение возможно -> TRUE.
            if (sPerm_STR_KTS > 39)
            && (sPerm_DEX_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)
            && (sPerm_DEX_KTS > 19)
            {
                return TRUE;
            };
   
            // Сила ГГ не превышает 19, обучение невозможно -> FALSE.
            return FALSE;
        };
 
        // Предполагаемое новое значение навыка не превышает 29.
        // Проверка атрибутов на соответствие изучаемому уровню навыка не нужна -> TRUE.
        return TRUE;    
    };


    if (talent == NPC_TALENT_2H)
    {
        if(hero.HitChance[NPC_TALENT_2H] + percent > 59)
        {
            if (sPerm_STR_KTS > 59)
            && (sPerm_DEX_KTS > 29)
            {
                return TRUE;
            };
   
            return FALSE;
        };
 
        if(hero.HitChance[NPC_TALENT_2H] + percent > 29)
        {
            if (sPerm_STR_KTS > 29)
            && (sPerm_DEX_KTS > 14)
            {
                return TRUE;
            };
   
            return FALSE;
        };
 
        return TRUE;  
    };  
};
Не понял. Проверить этот код в игре?
Просто тут всё в одной функции, а значит нужно править и B_TeachFightTalentPercent, т.к. там вызываются разные функции, с выводом соответствующих сообщений:
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)
        {
            PrintScreen("Не хватает силы для дальнейшего обучения.",-1,-1,FONT_Screen,2);
            B_Say(slf,oth,"$NOLEARNNOPOINTS");
            return FALSE;
        };
        // Значение ловкости не соответствует изучаемому уровню навыка -> вывод сообщения, выход.
        if(sPerm_Attr_KTS_Hero_1H_DEX(percent) == false)
        {
            PrintScreen("Не хватает ловкости для дальнейшего обучения.",-1,-1,FONT_Screen,2);
            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;
        };
    };
    ...
 

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 = 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 > 59)
        {
            if (sPerm_STR_KTS < 40)
            {
                PrintScreen("Не хватает силы для дальнейшего обучения.",-1,-1,FONT_Screen,2);
                return FALSE;
            };
        
            if (sPerm_DEX_KTS < 40)
            {
                PrintScreen("Не хватает ловкости для дальнейшего обучения.",-1,-1,FONT_Screen,2);
                return FALSE;
            };
            return TRUE;
        };
 
        // Предполагаемое новое значение навыка превышает 29 (от 30 до 59).
        // Нужна проверка атрибутов на соответствие этому уровню навыка.
        if (hero.HitChance[NPC_TALENT_1H] + percent > 29)
        {
            if (sPerm_STR_KTS < 20)
            {
                PrintScreen("Не хватает силы для дальнейшего обучения.",-1,-1,FONT_Screen,2);
                return FALSE;
            };
            if (sPerm_DEX_KTS < 20)
            {
                PrintScreen("Не хватает ловкости для дальнейшего обучения.",-1,-1,FONT_Screen,2);
                return FALSE;
            };
            // Сила и ловкость ГГ превышает 19 (20 и более), обучение возможно -> TRUE.
            return TRUE;
        };
 
        // Предполагаемое новое значение навыка не превышает 29.
        // Проверка атрибутов на соответствие изучаемому уровню навыка не нужна -> TRUE.
        return TRUE; 
    };


    if (talent == NPC_TALENT_2H)
    {
        if(hero.HitChance[NPC_TALENT_2H] + percent > 59)
        {
            if (sPerm_STR_KTS > 59)
            && (sPerm_DEX_KTS > 29)
            {
                return TRUE;
            };
 
            return FALSE;
        };
 
        if(hero.HitChance[NPC_TALENT_2H] + percent > 29)
        {
            if (sPerm_STR_KTS > 29)
            && (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)
{
      if (sPerm_Attr_KTS_Hero_talent(talent,percent) == FALSE)
      {
            return FALSE;
      };
...
Пост автоматически объединён:

@MW 7 Пожалуй, лучше так и ставить. Во-первых работает. Во-вторых - Какой смысл переносить сообщения в B_Perm_Attr_KTS_FightTalent.d? Там их приходится дублировать перед каждым return false, т.е. в итоге имеем 16 сообщений, вместо 8 в B_TeachFightTalentPercent.
в B_TeachFightTalentPercent такую проверку надо делать один раз, отдавая навык talent и процент percent на проверку.
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
тогда попробуй на 1р
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 > 59)
        {
            if (sPerm_STR_KTS < 40)
            {
                PrintScreen("Не хватает силы для дальнейшего обучения.",-1,-1,FONT_Screen,2);
                return FALSE;
            };
       
            if (sPerm_DEX_KTS < 40)
            {
                PrintScreen("Не хватает ловкости для дальнейшего обучения.",-1,-1,FONT_Screen,2);
                return FALSE;
            };
            return TRUE;
        };
 
        // Предполагаемое новое значение навыка превышает 29 (от 30 до 59).
        // Нужна проверка атрибутов на соответствие этому уровню навыка.
        if (hero.HitChance[NPC_TALENT_1H] + percent > 29)
        {
            if (sPerm_STR_KTS < 20)
            {
                PrintScreen("Не хватает силы для дальнейшего обучения.",-1,-1,FONT_Screen,2);
                return FALSE;
            };
            if (sPerm_DEX_KTS < 20)
            {
                PrintScreen("Не хватает ловкости для дальнейшего обучения.",-1,-1,FONT_Screen,2);
                return FALSE;
            };
            // Сила и ловкость ГГ превышает 19 (20 и более), обучение возможно -> TRUE.
            return TRUE;
        };
 
        // Предполагаемое новое значение навыка не превышает 29.
        // Проверка атрибутов на соответствие изучаемому уровню навыка не нужна -> TRUE.
        return TRUE;
    };


    if (talent == NPC_TALENT_2H)
    {
        if(hero.HitChance[NPC_TALENT_2H] + percent > 59)
        {
            if (sPerm_STR_KTS > 59)
            && (sPerm_DEX_KTS > 29)
            {
                return TRUE;
            };
 
            return FALSE;
        };
 
        if(hero.HitChance[NPC_TALENT_2H] + percent > 29)
        {
            if (sPerm_STR_KTS > 29)
            && (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)
{
      if (sPerm_Attr_KTS_Hero_talent(talent,percent) == FALSE)
      {
            return FALSE;
      };
...
Пост автоматически объединён:


в B_TeachFightTalentPercent такую проверку надо делать один раз, отдавая навык talent и процент percent на проверку.
Не работает:
1668781408879.png
Пост автоматически объединён:

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 > 59)
        {
            if (sPerm_STR_KTS < 40)
            {
                PrintScreen("Не хватает силы для дальнейшего обучения.",-1,-1,FONT_Screen,2);
                return FALSE;
            };
          
            if (sPerm_DEX_KTS < 40)
            {
                PrintScreen("Не хватает ловкости для дальнейшего обучения.",-1,-1,FONT_Screen,2);
                return FALSE;
            }; 
            return TRUE;
        };
 
        // Предполагаемое новое значение навыка превышает 29 (от 30 до 59).
        // Нужна проверка атрибутов на соответствие этому уровню навыка.
        if (hero.HitChance[NPC_TALENT_1H] + percent > 29)
        {
            if (sPerm_STR_KTS < 20)
            {
                PrintScreen("Не хватает силы для дальнейшего обучения.",-1,-1,FONT_Screen,2);
                return FALSE;
            };
            if (sPerm_DEX_KTS < 20)
            {
                PrintScreen("Не хватает ловкости для дальнейшего обучения.",-1,-1,FONT_Screen,2);
                return FALSE;
            }; 
            // Сила и ловкость ГГ превышает 19 (20 и более), обучение возможно -> TRUE.
            return TRUE;
        };
 
        // Предполагаемое новое значение навыка не превышает 29.
        // Проверка атрибутов на соответствие изучаемому уровню навыка не нужна -> TRUE.
        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_talent(talent,percent) == FALSE)
        {
            return FALSE;
        };
    };
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
ты должен понять где именно внутри B_TeachFightTalentPercent у тебя будет проходить проверка. в моём примере, проверка идёт в самом начале. ты же поставил где то в середине. перенеси проверку в начало убедись что функция работает корректно, доведи её до ума(сделай вывод сообщений для 2р и добавь луки и арбалеты), потом ещё раз её проверь и потом уже для себя определи где она будет в итоговой версии.
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) == FALSE)
    {
        return FALSE;
    };
...
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
ты должен понять где именно внутри B_TeachFightTalentPercent у тебя будет проходить проверка. в моём примере, проверка идёт в самом начале. ты же поставил где то в середине. перенеси проверку в начало убедись что функция работает корректно,
Я поставил проверку ПОСЛЕ проверок, относящихся к тренеру:
Daedalus:
func int B_TeachFightTalentPercent(var C_Npc slf,var C_Npc oth,var int talent,var int percent,var int teacherMAX)
{
    var string concatText;
    var int cost;
    var int limitReason;
    limitReason = B_GetTeachLimitReason(oth,talent,percent,teacherMax);
    if(limitReason == TLR_AlreadyMax)
    {
        B_PrintPlayerMiddle(oth,PRINT_NoLearnOverMAX);
        B_Say(slf,oth,"$NOLEARNYOUREBETTER");
        return FALSE;
    }
    else if(limitReason == TLR_WillBeOverMax)
    {
        B_PrintPlayerMiddle(oth,PRINT_NoLearnOverMAX);
        B_Say(slf,oth,"$NOLEARNYOUREBETTER");
        return FALSE;
    }
    else if(limitReason == TLR_AlreadySame)
    {
        concatText = ConcatStrings(PRINT_NoLearnOverPersonalMAX,IntToString(teacherMAX));
        B_PrintPlayerMiddle(oth,concatText);
        B_Say(slf,oth,"$NOLEARNYOUREBETTER");
        return FALSE;
    }
    else if(limitReason == TLR_AlreadyBetter)
    {
        concatText = ConcatStrings(PRINT_NoLearnOverPersonalMAX,IntToString(teacherMAX));
        B_PrintPlayerMiddle(oth,concatText);
        B_Say(slf,oth,"$YOULEARNEDSOMETHING");
        return FALSE;
    }
    else if(limitReason == TLR_WillBeBetter)
    {
        concatText = ConcatStrings(PRINT_NoLearnOverPersonalMAX,IntToString(teacherMAX));
        B_PrintPlayerMiddle(oth,concatText);
        B_Say(slf,oth,"$NOLEARNOVERPERSONALMAX");
        return FALSE;
    };
    cost = B_GetTalentTrainCost(oth,talent,percent);
    ...
Это выглядит логичным, и я даже не знаю выше чего можно попробовать расположить cost = B_GetTalentTrainCost(oth,talent,percent), чтобы не сломать всё остальное.

Попробовал переставить проверку в самое начало:
Daedalus:
func int B_TeachFightTalentPercent(var C_Npc slf,var C_Npc oth,var int talent,var int percent,var int teacherMAX)
{
    // Изучается навык владения одноручным оружием.
    if(talent == NPC_TALENT_1H)
    {
        if (sPerm_Attr_KTS_Hero_talent(talent,percent) == FALSE)
        {
            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)
    {
        B_PrintPlayerMiddle(oth,PRINT_NotEnoughLP);
        B_Say(slf,oth,"$NOLEARNNOPOINTS");
        return FALSE;
    };
    if(PremiumTeachersEnabled == TRUE)
    {
        if(!B_GiveInvItems(oth,slf,ItMi_Gold,cost * PremiumTeachersPrice))
        {
            B_PrintPlayerMiddle(oth,Print_NotEnoughGold);
            DIA_Common_WeWillGetToThatLater();
            return FALSE;
        };
    };
   
    var string concatText;
    var int cost;
    var int limitReason;
    limitReason = B_GetTeachLimitReason(oth,talent,percent,teacherMax);
    if(limitReason == TLR_AlreadyMax)
    {
        B_PrintPlayerMiddle(oth,PRINT_NoLearnOverMAX);
        B_Say(slf,oth,"$NOLEARNYOUREBETTER");
        return FALSE;
    }
...

Результат остаётся таким же, как на скрине в данном сообщении.
Я не понимаю как поправить этот код, чтобы он работал.
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
еще раз: проверка проходит один раз по новой функции. старые больше не нужны.
1668788556548.png
 

KirTheSeeker

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

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
надписи накладываются. поменяй высоту. например
PrintScreen("бла бла ",-1,22,FONT_Screen,2);
Пост автоматически объединён:

попробуй вот так прописать условие. с вероятность 98% поможет.
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) != TRUE)
    {
        return FALSE;
    };
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
надписи накладывайся. поменяй высоту. например
PrintScreen("бла бла ",-1,22,FONT_Screen,2);
Такого просто НЕ должно быть, поскольку они взаимоисключающие.

попробуй вот так прописать условие
Сейчас...
Пост автоматически объединён:

1.png
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
Такого просто НЕ должно быть, поскольку они взаимоисключающие.
раз этого не должно быть давайте будем гадать что же там за надписи такие. вообще именно через гадание мир познаётся. зачем знать, если можно угадать :)

я запустил игру для отчистки совести. у меня всё работает. значит остаётся sPerm_Attr_KTS_Hero_talent просто дописать и причесать.
 

Вложения

  • sPerm_Attr_KTS_Hero_talent.zip
    1 KB · Просмотры: 3

KirTheSeeker

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

я запустил игру для отчистки совести. у меня всё работает. значит остаётся sPerm_Attr_KTS_Hero_talent просто дописать и причесать.
2.png
 

MW 7


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

KirTheSeeker

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


Полагаю, проблема может быть в этом.
 

MW 7


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

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

KirTheSeeker

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

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
Нет, показать рабочий пример, а по аналогии я уже справлюсь.
тебе показан рабочий пример с 1р. по аналогии делай 2р, лук, арбалет. в самом конце перед закрытием функции поставь return 666;
Пост автоматически объединён:

вот конкретно блок для 1р внутри sPerm_Attr_KTS_Hero_talent
Daedalus:
    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;
        };
        // Предполагаемое новое значение навыка от 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;   };
            // Сила и ловкость ГГ (20 и более), обучение возможно -> TRUE.
            return TRUE;
        };
        // Предполагаемое новое значение навыка не превышает 29.
        // Проверка атрибутов на соответствие изучаемому уровню навыка не нужна -> TRUE.
        return TRUE;   
    };
сделай по аналогии такой же для 2р, лука и арбалета.
 
Последнее редактирование:
Сверху Снизу